/ libpkg / private / pkg.h
pkg.h
  1  /*-
  2   * Copyright (c) 2011-2026 Baptiste Daroussin <bapt@FreeBSD.org>
  3   * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
  4   * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
  5   * Copyright (c) 2013-2017 Vsevolod Stakhov <vsevolod@FreeBSD.org>
  6   *
  7   * SPDX-License-Identifier: BSD-2-Clause
  8   */
  9  
 10  #ifndef _PKG_PRIVATE_H
 11  #define _PKG_PRIVATE_H
 12  
 13  #include "bsd_compat.h"
 14  
 15  #include <sys/param.h>
 16  #include <sys/types.h>
 17  
 18  #include <archive.h>
 19  #include <sqlite3.h>
 20  #include <stdbool.h>
 21  #include <utlist.h>
 22  #include <ucl.h>
 23  
 24  #include "xmalloc.h"
 25  #include "private/pkg_abi.h"
 26  #include "private/utils.h"
 27  #include "private/fetch.h"
 28  #include "pkghash.h"
 29  
 30  #define PKG_NUM_SCRIPTS 9
 31  #define PKG_NUM_LUA_SCRIPTS 5
 32  
 33  #define PKG_HASH_SEP '~'
 34  #define PKG_HASH_SEPSTR "~"
 35  
 36  #define PKG_HASH_DIR "Hashed"
 37  
 38  /*
 39   * Some compatibility checks
 40   */
 41  #ifndef MAXLOGNAME
 42  # ifdef LOGIN_NAME_MAX
 43  # define MAXLOGNAME LOGIN_NAME_MAX
 44  # else
 45  # define MAXLOGNAME 64
 46  # endif
 47  #endif
 48  
 49  #ifndef roundup2
 50  #define	roundup2(x, y)	(((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */
 51  #endif
 52  
 53  #if defined(__APPLE__)
 54  #define st_mtim st_mtimespec
 55  #define st_atim st_atimespec
 56  #define st_ctim st_ctimespec
 57  #endif
 58  
 59  #if ARCHIVE_VERSION_NUMBER < 3000002
 60  #define archive_write_add_filter_xz(a) archive_write_set_compression_xz(a)
 61  #define archive_write_add_filter_bzip2(a) archive_write_set_compression_bzip2(a)
 62  #define archive_write_add_filter_gzip(a) archive_write_set_compression_gzip(a)
 63  #define archive_write_add_filter_none(a) archive_write_set_compression_none(a)
 64  #define archive_read_support_filter_all(a) archive_read_support_compression_all(a)
 65  #define archive_read_support_filter_none(a) archive_read_support_compression_none(a)
 66  #define archive_read_free archive_read_finish
 67  #define archive_write_free archive_write_finish
 68  #define archive_entry_perm archive_entry_mode
 69  
 70  #ifndef UF_NOUNLINK
 71  #define UF_NOUNLINK 0
 72  #endif
 73  
 74  #ifndef SF_NOUNLINK
 75  #define SF_NOUNLINK 0
 76  #endif
 77  
 78  #endif
 79  
 80  #define EXTRACT_ARCHIVE_FLAGS  (ARCHIVE_EXTRACT_OWNER |ARCHIVE_EXTRACT_PERM | \
 81  		ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_ACL | \
 82  		ARCHIVE_EXTRACT_FFLAGS|ARCHIVE_EXTRACT_XATTR)
 83  
 84  
 85  #define LL_FREE2(head, free_func, next) do {   \
 86  	__typeof(head) l1, l2;                 \
 87  	LL_FOREACH_SAFE2(head, l1, l2, next) {       \
 88  		LL_DELETE2(head, l1, next);          \
 89  		free_func(l1);                \
 90  	}                                     \
 91  	head = NULL;                          \
 92  } while (0)
 93  #define LL_FREE(head, free_func) LL_FREE2(head, free_func, next)
 94  
 95  #define DL_FREE2(head, free_func, prev, next) do {   \
 96  	__typeof(head) l1, l2;                 \
 97  	DL_FOREACH_SAFE2(head, l1, l2, next) {       \
 98  		DL_DELETE2(head, l1, prev, next);          \
 99  		free_func(l1);                \
100  	}                                     \
101  	head = NULL;                          \
102  } while (0)
103  #define DL_FREE(head, free_func) DL_FREE2(head, free_func, prev, next)
104  
105  typedef vec_t(struct pkg_kv *) kvlist_t;
106  
107  typedef enum {
108  	IPALL = 0,
109  	IPV4,
110  	IPV6,
111  } ip_version_t;
112  
113  struct pkg_kvlist {
114  	kvlist_t *list;
115  };
116  
117  struct pkg_stringlist {
118  	charv_t *list;
119  };
120  
121  struct pkg_kvlist_iterator {
122  	kvlist_t *list;
123  	size_t pos;
124  };
125  
126  struct pkg_stringlist_iterator {
127  	charv_t *list;
128  	size_t pos;
129  };
130  
131  struct pkg_ctx {
132  	int eventpipe;
133  	int64_t debug_level;
134  	uint64_t debug_flags;
135  	bool developer_mode;
136  	const char *pkg_rootdir;
137  	const char *metalog;
138  	const char *dbdir;
139  	const char *cachedir;
140  	const char *compression_format;
141  	int compression_level;
142  	int compression_threads;
143  	int rootfd;
144  	int cachedirfd;
145  	int devnullfd;
146  	int dbdirfd;
147  	int pkg_dbdirfd;
148  	int pkg_reposdirfd;
149  	bool backup_libraries;
150  	const char *backup_library_path;
151  	bool triggers;
152  	pkghash *touched_dir_hash;
153  	bool defer_triggers;
154  	bool repo_accept_legacy_pkg;
155  	ip_version_t ip;
156  	struct pkg_abi abi;
157  	bool ischrooted;
158  	bool no_version_for_deps;
159  	bool track_linux_compat_shlibs;
160  	bool case_sensitive;
161  };
162  
163  extern struct pkg_ctx ctx;
164  
165  struct pkg_repo_content {
166  	time_t mtime;
167  	int manifest_fd;
168  	size_t manifest_len;
169  	int data_fd;
170  };
171  
172  struct pkgsign_ctx;
173  
174  struct pkg_repo_it;
175  struct pkg_repo;
176  struct url;
177  struct fetcher;
178  struct pkg_message;
179  typedef vec_t(struct pkg_message *) messages_t;
180  
181  struct pkg {
182  	bool		 direct;
183  	bool		 locked;
184  	bool		 automatic;
185  	bool		 vital;
186  	bool		 list_sorted;
187  	int64_t		 id;
188  	xstring		*scripts[PKG_NUM_SCRIPTS];
189  	charv_t	 lua_scripts[PKG_NUM_LUA_SCRIPTS];
190  	char			*name;
191  	char			*origin;
192  	char			*version;
193  	char			*old_version;
194  	char			*maintainer;
195  	char			*www;
196  	char			*altabi;
197  	char			*abi;
198  	char			*uid;
199  	char			*digest;
200  	char			*old_digest;
201  	messages_t		 message;
202  	char			*prefix;
203  	char			*oprefix;
204  	char			*comment;
205  	char			*desc;
206  	char			*sum;
207  	char			*repopath;
208  	char			*reponame;
209  	char			*repourl;
210  	char			*reason;
211  	char			*dep_formula;
212  	lic_t			 licenselogic;
213  	int64_t			 pkgsize;
214  	int64_t			 flatsize;
215  	int64_t			 old_flatsize;
216  	int64_t			 timestamp;
217  	pkghash			*depshash;
218  	struct pkg_dep		*depends;
219  	pkghash			*rdepshash;
220  	struct pkg_dep		*rdepends;
221  	charv_t		 categories;
222  	charv_t		 licenses;
223  	pkghash			*filehash;
224  	struct pkg_file		*files;
225  	pkghash			*dirhash;
226  	struct pkg_dir		*dirs;
227  	pkghash			*optionshash;
228  	struct pkg_option	*options;
229  	charv_t		 users;
230  	charv_t		 groups;
231  	charv_t		 shlibs_required;
232  	charv_t		 shlibs_required_ignore;
233  	charv_t		 shlibs_provided;
234  	charv_t		 shlibs_provided_ignore;
235  	pkghash			*conflictshash;
236  	struct pkg_conflict	*conflicts;
237  	charv_t		 provides;
238  	charv_t		 requires;
239  	pkghash			*config_files_hash;
240  	struct pkg_config_file	*config_files;
241  	kvlist_t		 annotations;
242  	unsigned			flags;
243  	int		rootfd;
244  	char		*rootpath;
245  	charv_t	dir_to_del;
246  	pkg_t		 type;
247  	struct pkg_repo		*repo;
248  };
249  typedef vec_t(struct pkg *) pkgs_t;
250  
251  DEFINE_VEC_INSERT_SORTED_PROTO(pkgs_t, pkgs, struct pkg *);
252  struct pkg **pkgs_search(pkgs_t *, char *);
253  void pkgs_sort(pkgs_t *);
254  bool append_pkg_if_newer(pkgs_t *pkgs, struct pkg *p);
255  
256  typedef enum {
257  	SCRIPT_UNKNOWN = 0,
258  	SCRIPT_SHELL,
259  	SCRIPT_LUA,
260  } script_type_t;
261  
262  typedef enum {
263  	TRIGGER_PHASE_PRE_INSTALL,
264  	TRIGGER_PHASE_POST_INSTALL,
265  	TRIGGER_PHASE_PRE_DEINSTALL,
266  	TRIGGER_PHASE_POST_DEINSTALL,
267  } trigger_phase_t;
268  
269  struct trigger {
270  	char *name;
271  	ucl_object_t *path;
272  	ucl_object_t *path_glob;
273  	ucl_object_t *path_regexp;
274  	struct {
275  		char *script;
276  		int type;
277  		bool sandbox;
278  	} script;
279  	struct {
280  		char *script;
281  		int type;
282  		bool sandbox;
283  	} cleanup;
284  	pkghash *matched;
285  };
286  typedef vec_t(struct trigger *) trigger_t;
287  
288  struct triggers {
289  	ucl_object_t *schema;
290  	int dfd;
291  	trigger_t *cleanup;
292  	trigger_t *post_transaction;
293  };
294  
295  struct pkg_create {
296  	bool overwrite;
297  	bool expand_manifest;
298  	int compression_level;
299  	int compression_threads;
300  	pkg_formats format;
301  	time_t timestamp;
302  	const char *rootdir;
303  	const char *outdir;
304  };
305  
306  struct pkg_repo_create {
307  	bool filelist;
308  	bool hash;
309  	bool hash_symlink;
310  	const char *outdir;
311  	int ofd;
312  	const char *metafile;
313  	struct pkg_repo_meta *meta;
314  	ucl_object_t *groups;
315  	ucl_object_t *expired_packages;
316  	struct {
317  		char **argv;
318  		int argc;
319  		pkg_password_cb *cb;
320  	} sign;
321  };
322  
323  struct pkg_dep {
324  	char		*origin;
325  	char		*name;
326  	char		*version;
327  	char		*uid;
328  	bool		 locked;
329  	struct pkg_dep		*alt_next, *alt_prev; /* Chain of alternatives */
330  	struct pkg_dep	*next, *prev;
331  };
332  
333  typedef enum {
334  	PKG_FILE_NONE = 0,
335  	PKG_FILE_EXIST,
336  	PKG_FILE_SAVE,
337  } file_previous_t;
338  
339  typedef enum {
340  	PKG_MESSAGE_ALWAYS = 0,
341  	PKG_MESSAGE_INSTALL,
342  	PKG_MESSAGE_REMOVE,
343  	PKG_MESSAGE_UPGRADE,
344  } pkg_message_t;
345  
346  struct pkg_message {
347  	char			*str;
348  	char			*minimum_version;
349  	char			*maximum_version;
350  	pkg_message_t		 type;
351  };
352  
353  enum pkg_conflict_type {
354  	PKG_CONFLICT_ALL = 0,
355  	PKG_CONFLICT_REMOTE_LOCAL,
356  	PKG_CONFLICT_REMOTE_REMOTE,
357  	PKG_CONFLICT_LOCAL_LOCAL
358  };
359  
360  struct pkg_conflict {
361  	char *uid;
362  	char *digest;
363  	enum pkg_conflict_type type;
364  	struct pkg_conflict *next, *prev;
365  };
366  
367  typedef enum {
368  	MERGE_NOTNEEDED = 0,
369  	MERGE_FAILED,
370  	MERGE_SUCCESS,
371  	MERGE_NOT_LOCAL,
372  } merge_status;
373  
374  struct pkg_config_file {
375  	char *path;
376  	char *content;
377  	char *newcontent;
378  	merge_status status;
379  	struct pkg_config_file *next, *prev;
380  };
381  
382  struct pkg_file {
383  	char		*path;
384  	int64_t		 size;
385  	char		*sum;
386  	char		*uname;
387  	char		*gname;
388  	mode_t		 perm;
389  	uid_t		 uid;
390  	gid_t		 gid;
391  	char		*temppath;
392  	u_long		 fflags;
393  	char		*symlink_target;
394  	struct pkg_config_file *config;
395  	struct timespec	 time[2];
396  	struct pkg_file	*next, *prev;
397  	file_previous_t	 previous;
398  };
399  
400  struct pkg_dir {
401  	char		*path;
402  	char		*uname;
403  	char		*gname;
404  	mode_t		 perm;
405  	u_long		 fflags;
406  	uid_t		 uid;
407  	gid_t		 gid;
408  	bool		 noattrs;
409  	struct timespec	 time[2];
410  	struct pkg_dir	*next, *prev;
411  };
412  
413  struct pkg_option {
414  	char	*key;
415  	char	*value;
416  	char	*default_value;
417  	char	*description;
418  	struct pkg_option *next, *prev;
419  };
420  
421  struct http_mirror;
422  
423  struct pkg_repo_meta_key {
424  	char *pubkey;
425  	char *pubkey_type; /* TODO: should be enumeration */
426  	char *name;
427  };
428  
429  typedef enum pkg_checksum_type_e {
430  	PKG_HASH_TYPE_SHA256_BASE32 = 0,
431  	PKG_HASH_TYPE_SHA256_HEX,
432  	PKG_HASH_TYPE_BLAKE2_BASE32,
433  	PKG_HASH_TYPE_SHA256_RAW,
434  	PKG_HASH_TYPE_BLAKE2_RAW,
435  	PKG_HASH_TYPE_BLAKE2S_BASE32,
436  	PKG_HASH_TYPE_BLAKE2S_RAW,
437  	PKG_HASH_TYPE_UNKNOWN
438  } pkg_checksum_type_t;
439  
440  static const char repo_meta_file[] = "meta";
441  
442  struct pkg_repo_meta {
443  
444  	char *maintainer;
445  	char *source;
446  
447  	pkg_formats packing_format;
448  	pkg_checksum_type_t digest_format;
449  
450  	char *digests;
451  	char *digests_archive;
452  	char *data;
453  	char *data_archive;
454  	char *manifests;
455  	char *manifests_archive;
456  	char *filesite;
457  	char *filesite_archive;
458  	char *conflicts;
459  	char *conflicts_archive;
460  	char *fulldb;
461  	char *fulldb_archive;
462  
463  	char *source_identifier;
464  	int64_t revision;
465  
466  	pkghash *keys;
467  
468  	time_t eol;
469  
470  	int version;
471  	char *repopath;
472  	bool hash;
473  	bool hash_symlink;
474  };
475  
476  struct pkg_repo_it_ops {
477  	int (*next)(struct pkg_repo_it *it, struct pkg **pkg_p, unsigned flags);
478  	void (*free)(struct pkg_repo_it *it);
479  	void (*reset)(struct pkg_repo_it *it);
480  };
481  
482  struct pkg_repo_it {
483  	struct pkg_repo *repo;
484  	const struct pkg_repo_it_ops *ops;
485  	int flags;
486  	void *data;
487  };
488  
489  struct pkg_repo_ops {
490  	const char *type;
491  	/* Accessing repo */
492  	int (*init)(struct pkg_repo *);
493  	int (*access)(struct pkg_repo *, unsigned);
494  	int (*open)(struct pkg_repo *, unsigned);
495  	int (*create)(struct pkg_repo *);
496  	int (*close)(struct pkg_repo *, bool);
497  
498  	/* Updating repo */
499  	int (*update)(struct pkg_repo *, bool);
500  
501  	/* Query repo */
502  	struct pkg_repo_it * (*query)(struct pkg_repo *,
503  					const char*, const char *, match_t);
504  	struct pkg_repo_it * (*groupquery)(struct pkg_repo *,
505  					const char*, match_t);
506  	struct pkg_repo_it * (*shlib_required)(struct pkg_repo *,
507  					const char *);
508  	struct pkg_repo_it * (*shlib_provided)(struct pkg_repo *,
509  					const char *);
510  	struct pkg_repo_it * (*required)(struct pkg_repo *,
511  					const char *);
512  	struct pkg_repo_it * (*provided)(struct pkg_repo *,
513  					const char *);
514  	struct pkg_repo_it * (*search)(struct pkg_repo *, const char *, match_t,
515  					pkgdb_field field, pkgdb_field sort);
516  	struct pkg_repo_it * (*groupsearch)(struct pkg_repo *, const char *,
517  	    match_t, pkgdb_field field);
518  
519  	int64_t (*stat)(struct pkg_repo *, pkg_stats_t type);
520  
521  	int (*ensure_loaded)(struct pkg_repo *repo, struct pkg *pkg, unsigned flags);
522  
523  	/* Fetch package from repo */
524  	int (*get_cached_name)(struct pkg_repo *, struct pkg *,
525  					char *dest, size_t destlen);
526  	int (*fetch_pkg)(struct pkg_repo *, struct pkg *);
527  	int (*mirror_pkg)(struct pkg_repo *repo, struct pkg *pkg,
528  		const char *destdir, bool symlink);
529  };
530  
531  struct pkg_key {
532  	struct pkgsign_ctx	*ctx;
533  };
534  
535  struct pkg_repo {
536  	const struct pkg_repo_ops *ops;
537  
538  	char *name;
539  	const struct fetcher *fetcher;
540  	char *url;
541  	char *pubkey;
542  	mirror_t mirror_type;
543  	union {
544  		struct dns_srvinfo *srv;
545  		struct http_mirror *http;
546  	};
547  	signature_t signature_type;
548  	char *fingerprints;
549  	char *ssh_args;
550  	FILE *fh;
551  	void *fetch_priv;
552  	bool silent;
553  
554  	pkghash *trusted_fp;
555  	pkghash *revoked_fp;
556  
557  	struct {
558  		int in;
559  		int out;
560  		pid_t pid;
561  	} sshio;
562  
563  	struct pkg_repo_meta *meta;
564  
565  	bool enable;
566  
567  	unsigned int priority;
568  
569  	ip_version_t ip;
570  	kvlist_t env;
571  	int dfd;
572  	char *dbpath;
573  
574  	/* Opaque repository data */
575  	void *priv;
576  	struct pkg_repo *next, *prev;
577  };
578  
579  typedef vec_t(struct action *) actions_t;
580  struct keyword {
581  	char *keyword;
582  	actions_t actions;
583  };
584  
585  struct plist {
586  	char last_file[MAXPATHLEN];
587  	const char *stage;
588  	int stagefd;
589  	bool in_include;
590  	int plistdirfd;
591  	char prefix[MAXPATHLEN];
592  	xstring *pre_install_buf;
593  	xstring *post_install_buf;
594  	xstring *pre_deinstall_buf;
595  	xstring *post_deinstall_buf;
596  	struct pkg *pkg;
597  	char *uname;
598  	char *gname;
599  	const char *slash;
600  	int64_t flatsize;
601  	hardlinks_t hardlinks;
602  	mode_t perm;
603  	pkghash *keywords;
604  	kvlist_t variables;
605  };
606  
607  struct file_attr {
608  	char *owner;
609  	char *group;
610  	mode_t mode;
611  	u_long fflags;
612  };
613  
614  struct action {
615  	int (*perform)(struct plist *, char *, struct file_attr *);
616  };
617  
618  /* sql helpers */
619  
620  typedef struct _sql_prstmt {
621  	sqlite3_stmt	*stmt;
622  	const char	*sql;
623  } sql_prstmt;
624  
625  #define STMT(x) (sql_prepared_statements[(x)].stmt)
626  #define SQL(x)  (sql_prepared_statements[(x)].sql)
627  
628  typedef enum {
629      ARG_TEXT,
630      ARG_INT64,
631  } arg_type_t;
632  
633  typedef struct {
634      arg_type_t type;
635      union {
636          const char *text;
637          int64_t     i64;
638      } v;
639  } sql_arg_t;
640  
641  static inline sql_arg_t make_text_arg(const char *s) {
642      sql_arg_t a = { .type = ARG_TEXT, .v.text = s };
643      return (a);
644  }
645  static inline sql_arg_t make_int64_arg(int64_t i) {
646      sql_arg_t a = { .type = ARG_INT64, .v.i64 = i };
647      return (a);
648  }
649  
650  #if defined(__APPLE__) || defined(__MACH__)
651    #define IF_HAVE__DARWIN_TIME_T() __darwin_time_t: (sql_arg_t(*)(int64_t))(make_int64_arg),
652  #else
653    #define IF_HAVE__DARWIN_TIME_T()
654  #endif
655  
656  #define SQL_ARG(x) _Generic((x), \
657          IF_HAVE__DARWIN_TIME_T() \
658          const char *: make_text_arg, \
659          char *:       make_text_arg, \
660          int64_t:      make_int64_arg, \
661          u_long:       (sql_arg_t(*)(int64_t))make_int64_arg, \
662          int:          (sql_arg_t(*)(int64_t))make_int64_arg, \
663          bool:         (sql_arg_t(*)(int64_t))make_int64_arg, \
664          u_int:        (sql_arg_t(*)(int64_t))make_int64_arg, \
665          u_short:      (sql_arg_t(*)(int64_t))make_int64_arg \
666      )(x)
667  
668  /**
669   * rc script actions
670   */
671  typedef enum {
672  	PKG_RC_START = 0,
673  	PKG_RC_STOP
674  } pkg_rc_attr;
675  
676  /**
677   * Remove and unregister the package.
678   * @param pkg An installed package to delete
679   * @param rpkg A package which will replace pkg, or NULL
680   * @param db An opened pkgdb
681   * @return An error code.
682   */
683  int pkg_delete(struct pkg *pkg, struct pkg *rpkg, struct pkgdb *db, int flags,
684      struct triggers *);
685  #define PKG_DELETE_UPGRADE	(1 << 1)	/* delete as a split upgrade */
686  #define PKG_DELETE_NOSCRIPT	(1 << 2)	/* don't run delete scripts */
687  #define PKG_DELETE_NOEXEC	(1 << 3)	/* don't run delete scripts which execute things*/
688  #define PKG_DELETE_KEEPFILES	(1 << 4)	/* don't delete files */
689  
690  int pkg_fetch_file_to_fd(struct pkg_repo *repo, int dest, struct fetch_item *,
691      bool silent);
692  int pkg_repo_open(struct pkg_repo *repo);
693  int pkg_repo_fetch_package(struct pkg *pkg);
694  int pkg_repo_mirror_package(struct pkg *pkg, const char *destdir, bool symlink);
695  int pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, struct pkg_repo_content *);
696  int pkg_repo_meta_dump_fd(struct pkg_repo_meta *target, const int fd);
697  int pkg_repo_fetch_meta(struct pkg_repo *repo, time_t *t);
698  int pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, struct pkg_repo_content *);
699  int pkg_repo_fetch_data_fd(struct pkg_repo *repo, struct pkg_repo_content *);
700  
701  struct pkg_repo_meta *pkg_repo_meta_default(void);
702  int pkg_repo_meta_load(const int fd, struct pkg_repo_meta **target);
703  void pkg_repo_meta_free(struct pkg_repo_meta *meta);
704  ucl_object_t * pkg_repo_meta_to_ucl(struct pkg_repo_meta *meta);
705  bool pkg_repo_meta_is_special_file(const char *file, struct pkg_repo_meta *meta);
706  bool pkg_repo_meta_is_old_file(const char *file, struct pkg_repo_meta *meta);
707  
708  typedef enum {
709  	HASH_UNKNOWN,
710  	HASH_SHA256,
711  	HASH_BLAKE2
712  } hash_t;
713  
714  struct fingerprint {
715  	hash_t type;
716  	char hash[BUFSIZ];
717  };
718  int pkg_repo_load_fingerprints(struct pkg_repo *repo);
719  
720  
721  int pkg_start_stop_rc_scripts(struct pkg *, pkg_rc_attr attr);
722  
723  int pkg_script_run(struct pkg *, pkg_script type, bool upgrade, bool noexec);
724  int pkg_lua_script_run(struct pkg *, pkg_lua_script type, bool upgrade);
725  ucl_object_t *pkg_lua_script_to_ucl(charv_t *);
726  int pkg_script_run_child(int pid, int *pstat, int inputfd, const char* script_name);
727  
728  int pkg_open2(struct pkg **p, struct archive **a, struct archive_entry **ae,
729  	      const char *path, int flags, int fd);
730  
731  int pkg_validate(struct pkg *pkg, struct pkgdb *db);
732  
733  void pkg_list_free(struct pkg *, pkg_list);
734  
735  struct pkg_kv *pkg_kv_new(const char *key, const char *val);
736  void pkg_kv_free(struct pkg_kv *);
737  struct pkg_kv *pkg_kv_search(kvlist_t *, char *);
738  void pkg_kv_sort(kvlist_t *);
739  DEFINE_VEC_INSERT_SORTED_PROTO(kvlist_t, pkg_kv, struct pkg_kv *);
740  
741  void pkg_dep_free(struct pkg_dep *);
742  void pkg_file_free(struct pkg_file *);
743  void pkg_dir_free(struct pkg_dir *);
744  void pkg_option_free(struct pkg_option *);
745  void pkg_conflict_free(struct pkg_conflict *);
746  void pkg_config_file_free(struct pkg_config_file *);
747  
748  struct iovec;
749  struct packing;
750  
751  int packing_init(struct packing **pack, const char *path, pkg_formats format, int clevel, int threads, time_t timestamp, bool overwrite);
752  int packing_append_file_attr(struct packing *pack, const char *filepath,
753       const char *newpath, const char *uname, const char *gname, mode_t perm,
754       u_long fflags);
755  int packing_append_iovec(struct packing *pack, const char *buffer,
756  			  struct iovec *iov, int niov);
757  int packing_append_buffer(struct packing *pack, const char *buffer,
758  			  const char *path, int size);
759  void packing_get_filename(struct packing *pack, const char *filename);
760  void packing_finish(struct packing *pack);
761  pkg_formats packing_format_from_string(const char *str);
762  const char* packing_format_to_string(pkg_formats format);
763  bool packing_is_valid_format(const char *str);
764  
765  int pkg_delete_files(struct pkgdb *db, struct pkg *pkg, struct pkg *rpkg,
766      int flags, struct triggers *t);
767  int pkg_delete_dirs(struct pkgdb *db, struct pkg *pkg, struct pkg *p);
768  
769  /* pkgdb commands */
770  int sql_exec(sqlite3 *, const char *, ...);
771  int get_pragma(sqlite3 *, const char *sql, int64_t *res, bool silence);
772  
773  int pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int forced, const char *);
774  int pkgdb_update_shlibs_required(struct pkg *pkg, int64_t package_id, sqlite3 *s);
775  int pkgdb_update_shlibs_required_ignore(struct pkg *pkg, int64_t package_id, sqlite3 *s);
776  int pkgdb_update_shlibs_provided(struct pkg *pkg, int64_t package_id, sqlite3 *s);
777  int pkgdb_update_shlibs_provided_ignore(struct pkg *pkg, int64_t package_id, sqlite3 *s);
778  int pkgdb_update_provides(struct pkg *pkg, int64_t package_id, sqlite3 *s);
779  int pkgdb_update_requires(struct pkg *pkg, int64_t package_id, sqlite3 *s);
780  int pkgdb_insert_annotations(struct pkg *pkg, int64_t package_id, sqlite3 *s);
781  int pkgdb_register_finale(struct pkgdb *db, int retcode, const char *);
782  int pkgdb_set_pkg_digest(struct pkgdb *db, struct pkg *pkg);
783  int pkgdb_is_dir_used(struct pkgdb *db, struct pkg *p, const char *dir, int64_t *res);
784  int pkgdb_file_set_cksum(struct pkgdb *db, struct pkg_file *file, const char *sha256);
785  
786  int pkg_emit_filelist(struct pkg *, FILE *);
787  
788  bool ucl_object_emit_buf(const ucl_object_t *obj, enum ucl_emitter emit_type,
789      xstring **buf);
790  bool ucl_object_emit_fd(const ucl_object_t *obj, enum ucl_emitter emit_type,
791      int fd);
792  bool ucl_object_emit_file(const ucl_object_t *obj, enum ucl_emitter emit_type,
793      FILE *);
794  
795  pkg_object* pkg_emit_object(struct pkg *pkg, short flags);
796  
797  int pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,
798      pkg_checksum_type_t type, bool inc_scripts, bool inc_version, bool inc_files);
799  
800  /*
801   * Calculates checksum for any data.
802   * Caller must free resulting hash after usage
803   */
804  unsigned char * pkg_checksum_data(const unsigned char *in, size_t inlen,
805      pkg_checksum_type_t type);
806  unsigned char *pkg_checksum_fd(int fd, pkg_checksum_type_t type);
807  unsigned char *pkg_checksum_file(const char *path, pkg_checksum_type_t type);
808  unsigned char *pkg_checksum_fileat(int fd, const char *path,
809      pkg_checksum_type_t type);
810  unsigned char *pkg_checksum_symlink(const char *path,
811      pkg_checksum_type_t type);
812  unsigned char *pkg_checksum_symlinkat(int fd, const char *path,
813      pkg_checksum_type_t type);
814  int pkg_checksum_validate_file(const char *path, const  char *sum);
815  int pkg_checksum_validate_fileat(int fd, const char *path, const  char *sum);
816  
817  bool pkg_checksum_is_valid(const char *cksum, size_t clen);
818  pkg_checksum_type_t pkg_checksum_get_type(const char *cksum, size_t clen);
819  pkg_checksum_type_t pkg_checksum_file_get_type(const char *cksum, size_t clen);
820  pkg_checksum_type_t pkg_checksum_type_from_string(const char *name);
821  const char* pkg_checksum_type_to_string(pkg_checksum_type_t type);
822  size_t pkg_checksum_type_size(pkg_checksum_type_t type);
823  int pkg_checksum_calculate(struct pkg *pkg, struct pkgdb *db, bool inc_scripts,
824      bool inc_version, bool inc_files);
825  char *pkg_checksum_generate_file(const char *path, pkg_checksum_type_t type);
826  char *pkg_checksum_generate_fileat(int fd, const char *path,
827      pkg_checksum_type_t type);
828  
829  int pkg_add_group(struct pkg *pkg);
830  int pkg_add_upgrade(struct pkgdb *db, const char *path, unsigned flags,
831      const char *location, struct pkg *rp, struct pkg *lp, struct triggers *);
832  int pkg_add_from_remote(struct pkgdb *db, const char *path, unsigned flags,
833      const char *location, struct pkg *rp, struct triggers *);
834  void pkg_delete_dir(struct pkg *pkg, struct pkg_dir *dir);
835  void pkg_delete_file(struct pkg *pkg, struct pkg_file *file);
836  int pkg_open_root_fd(struct pkg *pkg);
837  void pkg_add_dir_to_del(struct pkg *pkg, const char *file, const char *dir);
838  struct plist *plist_new(struct pkg *p, const char *stage);
839  int plist_parse_line(struct plist *p, char *line);
840  char *extract_keywords(char *line, char **keyword, struct file_attr **attr);
841  struct file_attr *parse_keyword_args(char *args, char *keyword);
842  void plist_free(struct plist *);
843  int pkg_appendscript(struct pkg *pkg, const char *cmd, pkg_script type);
844  void free_file_attr(struct file_attr *a);
845  
846  int pkg_add_lua_script(struct pkg *pkg, const char *data, pkg_lua_script type);
847  int pkg_addscript(struct pkg *pkg, const char *data, pkg_script type);
848  int pkg_addfile(struct pkg *pkg, const char *path, const char *sha256,
849      bool check_duplicates);
850  int pkg_addfile_attr(struct pkg *pkg, const char *path, const char *sha256,
851      const char *uname, const char *gname, mode_t perm, u_long fflags,
852      time_t mtime, const char *symlink_target, bool check_duplicates);
853  
854  int pkg_adddir(struct pkg *pkg, const char *path, bool check_duplicates);
855  int pkg_adddir_attr(struct pkg *pkg, const char *path, const char *uname,
856      const char *gname, mode_t perm, u_long fflags, bool check_duplicates);
857  
858  int pkg_addstring(charv_t *s, const char *value, const char *title);
859  int pkg_kv_add(kvlist_t *kv, const char *key, const char *value, const char *title);
860  const char *pkg_kv_get(const kvlist_t *kv, const char *key);
861  int pkg_adduser(struct pkg *pkg, const char *name);
862  int pkg_addgroup(struct pkg *pkg, const char *group);
863  
864  enum pkg_shlib_flags {
865  	PKG_SHLIB_FLAGS_NONE = 0,
866  	PKG_SHLIB_FLAGS_COMPAT_32 = 1 << 0,
867  	PKG_SHLIB_FLAGS_COMPAT_LINUX = 1 << 1,
868  	PKG_SHLIB_FLAGS_COMPAT_LINUX_32 = (1 << 0) | (1 << 1),
869  };
870  /* Determine shlib flags by comparing the shlib abi with ctx.abi */
871  enum pkg_shlib_flags pkg_shlib_flags_from_abi(const struct pkg_abi *shlib_abi);
872  /*
873   * Given an unadorned shlib name (e.g. libfoo.so.1.0.0) return a newly allocated
874   * string with the given flags appended (e.g. libfoo.so.1.0.0:Linux:32).
875   */
876  char *pkg_shlib_name_with_flags(const char *name, enum pkg_shlib_flags flags);
877  int pkg_addshlib_required(struct pkg *pkg, const char *name, enum pkg_shlib_flags);
878  int pkg_addshlib_required_ignore(struct pkg *pkg, const char *name);
879  int pkg_addshlib_provided(struct pkg *pkg, const char *name, enum pkg_shlib_flags);
880  int pkg_addshlib_provided_ignore(struct pkg *pkg, const char *name);
881  
882  int pkg_addconflict(struct pkg *pkg, const char *name);
883  int pkg_addprovide(struct pkg *pkg, const char *name);
884  int pkg_addrequire(struct pkg *pkg, const char *name);
885  int pkg_addconfig_file(struct pkg *pkg, const char *name, const char *buf);
886  
887  int pkg_addoption(struct pkg *pkg, const char *name, const char *value);
888  int pkg_addoption_default(struct pkg *pkg, const char *key, const char *default_value);
889  int pkg_addoption_description(struct pkg *pkg, const char *key, const char *description);
890  
891  int pkg_arch_to_legacy(const char *arch, char *dest, size_t sz);
892  bool pkg_is_config_file(struct pkg *p, const char *path, const struct pkg_file **file, struct pkg_config_file **cfile);
893  int pkg_message_from_ucl(struct pkg *pkg, const ucl_object_t *obj);
894  int pkg_message_from_str(struct pkg *pkg, const char *str, size_t len);
895  ucl_object_t* pkg_message_to_ucl(const struct pkg *pkg);
896  int pkg_lua_script_from_ucl(struct pkg *pkg, const ucl_object_t *obj, pkg_lua_script);
897  char* pkg_message_to_str(struct pkg *pkg);
898  
899  int metalog_open(const char *metalog);
900  int metalog_add(int type, const char *path, const char *uname,
901      const char *gname, int mode, unsigned long fflags, const char *link);
902  void metalog_close(void);
903  enum pkg_metalog_type {
904  	PKG_METALOG_FILE = 0,
905  	PKG_METALOG_DIR,
906  	PKG_METALOG_LINK,
907  };
908  
909  int pkg_set_from_fileat(int fd, struct pkg *pkg, pkg_attr attr, const char *file, bool trimcr);
910  void pkg_rollback_cb(void *);
911  void pkg_rollback_pkg(struct pkg *);
912  int pkg_add_fromdir(struct pkg *, const char *, struct pkgdb *db);
913  struct pkg_dep* pkg_adddep_chain(struct pkg_dep *chain,
914  		struct pkg *pkg, const char *name, const char *origin, const
915  		char *version, bool locked);
916  void pkg_maybe_backup_library(struct pkgdb *db, struct pkg *pkg,
917      const char *path);
918  int suggest_arch(struct pkg *, bool);
919  int set_attrsat(int fd, const char *path, mode_t perm, uid_t uid, gid_t gid, const struct timespec *ats, const struct timespec *mts);
920  
921  /* Filesystem extended attribute support */
922  int pkg_archive_extattrs(int, struct archive_entry *);
923  
924  trigger_t *triggers_load(bool cleanup_only);
925  int triggers_execute(struct triggers *t);
926  void trigger_is_it_a_cleanup(struct triggers *t, const char *path);
927  void trigger_free(struct trigger *);
928  void append_touched_dir(const char *path);
929  void append_touched_file(const char *path);
930  int triggers_execute_perpackage(struct triggers *t, struct pkg *pkg, trigger_phase_t phase, bool upgrade);
931  
932  int pkg_parse_manifest_ucl(struct pkg *pkg, ucl_object_t *o);
933  int pkg_get_reposdirfd(void);
934  char * expand_plist_variables(const char *in, kvlist_t *vars);
935  
936  int scan_system_shlibs(charv_t *system_shlibs, const char *rootdir);
937  void pkg_lists_sort(struct pkg *p);
938  void pkg_cleanup_shlibs_required(struct pkg *pkg, charv_t *internal_provided);
939  
940  #endif