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