Lines Matching defs:bsdtar

54 #include "bsdtar.h"
102 static void only_mode(struct bsdtar *, const char *opt,
104 static void set_mode(struct bsdtar *, char opt);
137 struct bsdtar *bsdtar, bsdtar_storage;
151 bsdtar = &bsdtar_storage;
152 memset(bsdtar, 0, sizeof(*bsdtar));
153 bsdtar->fd = -1; /* Mark as "unused" */
154 bsdtar->gid = -1;
155 bsdtar->uid = -1;
156 bsdtar->flags = 0;
185 lafe_setprogname(*argv, "bsdtar");
192 bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd');
197 bsdtar->user_uid = geteuid();
200 bsdtar->filename = getenv("TAPE");
202 if (bsdtar->filename == NULL) {
209 bsdtar->filename = _PATH_DEFTAPE;
213 if (bsdtar->filename == NULL) {
214 bsdtar->filename = _PATH_STDIO;
218 bsdtar->bytes_per_block = DEFAULT_BYTES_PER_BLOCK;
220 bsdtar->bytes_in_last_block = -1;
223 bsdtar->extract_flags = ARCHIVE_EXTRACT_TIME;
226 bsdtar->extract_flags |= SECURITY;
231 if (bsdtar->user_uid == 0) {
233 bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER;
235 bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM;
236 bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
237 bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
238 bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
239 bsdtar->extract_flags |= ARCHIVE_EXTRACT_MAC_METADATA;
247 bsdtar->readdisk_flags |= ARCHIVE_READDISK_MAC_COPYFILE;
250 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;
257 bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL;
260 bsdtar->matching = archive_match_new();
261 if (bsdtar->matching == NULL)
263 bsdtar->cset = cset_new();
264 if (bsdtar->cset == NULL)
267 bsdtar->argv = argv;
268 bsdtar->argc = argc;
276 while ((opt = bsdtar_getopt(bsdtar)) != -1) {
279 bsdtar->flags |= OPTFLAG_AUTO_COMPRESS;
282 bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
283 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_ACL;
284 bsdtar->flags |= OPTFLAG_ACLS;
291 l = strtol(bsdtar->argument, &tptr, 10);
293 *(bsdtar->argument) == '\0' || tptr == NULL ||
298 bsdtar->bytes_per_block = 512 * (int)l;
300 bsdtar->bytes_in_last_block = bsdtar->bytes_per_block;
311 if (strlen(bsdtar->argument) == 0)
315 set_chdir(bsdtar, bsdtar->argument);
318 set_mode(bsdtar, opt);
321 bsdtar->flags |= OPTFLAG_WARN_LINKS;
324 bsdtar->flags |= OPTFLAG_CHROOT;
327 bsdtar->extract_flags |=
332 bsdtar->matching, bsdtar->argument) != ARCHIVE_OK)
334 "Couldn't exclude %s\n", bsdtar->argument);
339 bsdtar->matching,
346 bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
347 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_FFLAGS;
348 bsdtar->flags |= OPTFLAG_FFLAGS;
351 cset_set_format(bsdtar->cset, bsdtar->argument);
354 bsdtar->filename = bsdtar->argument;
358 l = strtol(bsdtar->argument, &tptr, 10);
359 if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' ||
363 bsdtar->gid = (int)l;
366 bsdtar->gname = bsdtar->argument;
371 uptr = strchr(bsdtar->argument, ':');
383 bsdtar->gid = (int)l;
385 bsdtar->gname = bsdtar->argument;
387 l = strtol(bsdtar->argument, &tptr, 10);
388 if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' ||
390 bsdtar->gname = bsdtar->argument;
392 bsdtar->gid = (int)l;
393 bsdtar->gname = "";
406 bsdtar->symlink_mode = 'H';
409 bsdtar->symlink_mode = 'L';
417 bsdtar->extract_flags |=
421 bsdtar->flags |= OPTFLAG_IGNORE_ZEROS;
434 bsdtar->names_from_file = bsdtar->argument;
442 if (archive_match_include_pattern(bsdtar->matching,
443 bsdtar->argument) != ARCHIVE_OK)
446 bsdtar->argument);
465 bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE;
468 bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
471 bsdtar->symlink_mode = 'L';
475 bsdtar->flags |= OPTFLAG_WARN_LINKS;
498 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME;
501 bsdtar->readdisk_flags |= ARCHIVE_READDISK_MAC_COPYFILE;
502 bsdtar->extract_flags |= ARCHIVE_EXTRACT_MAC_METADATA;
503 bsdtar->flags |= OPTFLAG_MAC_METADATA;
506 bsdtar->flags |= OPTFLAG_NO_SUBDIRS;
515 if (archive_match_include_date(bsdtar->matching,
517 bsdtar->argument) != ARCHIVE_OK)
519 archive_error_string(bsdtar->matching));
522 if (archive_match_include_file_time(bsdtar->matching,
524 bsdtar->argument) != ARCHIVE_OK)
526 archive_error_string(bsdtar->matching));
529 if (archive_match_include_date(bsdtar->matching,
531 bsdtar->argument) != ARCHIVE_OK)
533 archive_error_string(bsdtar->matching));
536 if (archive_match_include_file_time(bsdtar->matching,
538 bsdtar->argument) != ARCHIVE_OK)
540 archive_error_string(bsdtar->matching));
543 bsdtar->readdisk_flags |= ARCHIVE_READDISK_HONOR_NODUMP;
547 bsdtar->extract_flags |=
551 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL;
552 bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL;
553 bsdtar->flags |= OPTFLAG_NO_ACLS;
556 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;
557 bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_FFLAGS;
558 bsdtar->flags |= OPTFLAG_NO_FFLAGS;
561 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;
562 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA;
563 bsdtar->flags |= OPTFLAG_NO_MAC_METADATA;
566 bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_SPARSE;
567 bsdtar->flags |= OPTFLAG_NO_READ_SPARSE;
570 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_SAFE_WRITES;
573 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
576 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_PERM;
577 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL;
578 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR;
579 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;
580 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA;
583 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR;
584 bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_XATTR;
585 bsdtar->flags |= OPTFLAG_NO_XATTRS;
588 bsdtar->flags |= OPTFLAG_NULL;
591 bsdtar->uname = "";
592 bsdtar->gname = "";
593 bsdtar->flags |= OPTFLAG_NUMERIC_OWNER;
596 bsdtar->flags |= OPTFLAG_STDOUT;
599 bsdtar->flags |= OPTFLAG_O;
608 if (archive_match_include_date(bsdtar->matching,
610 bsdtar->argument) != ARCHIVE_OK)
612 archive_error_string(bsdtar->matching));
615 if (archive_match_include_file_time(bsdtar->matching,
617 bsdtar->argument) != ARCHIVE_OK)
619 archive_error_string(bsdtar->matching));
622 if (archive_match_include_date(bsdtar->matching,
624 bsdtar->argument) != ARCHIVE_OK)
626 archive_error_string(bsdtar->matching));
629 if (archive_match_include_file_time(bsdtar->matching,
631 bsdtar->argument) != ARCHIVE_OK)
633 archive_error_string(bsdtar->matching));
636 bsdtar->readdisk_flags |=
640 if (bsdtar->option_options != NULL) {
643 bsdtar->option_options);
645 bsdtar->option_options = bsdtar->argument;
650 uptr = strchr(bsdtar->argument, ':');
662 bsdtar->uid = (int)l;
664 bsdtar->uname = bsdtar->argument;
666 l = strtol(bsdtar->argument, &tptr, 10);
667 if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' ||
669 bsdtar->uname = bsdtar->argument;
671 bsdtar->uid = (int)l;
672 bsdtar->uname = "";
688 bsdtar->extract_flags &= ~SECURITY;
689 bsdtar->flags |= OPTFLAG_ABSOLUTE_PATHS;
692 bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM;
693 bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
694 bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
695 bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
696 bsdtar->extract_flags |= ARCHIVE_EXTRACT_MAC_METADATA;
699 bsdtar->passphrase = bsdtar->argument;
702 cset_set_format(bsdtar->cset, "pax");
705 bsdtar->flags |= OPTFLAG_FAST_READ;
708 set_mode(bsdtar, opt);
711 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_SPARSE;
712 bsdtar->flags |= OPTFLAG_READ_SPARSE;
715 bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE;
719 add_substitution(bsdtar, bsdtar->argument);
722 "-s is not supported by this version of bsdtar");
727 bsdtar->extract_flags |= ARCHIVE_EXTRACT_SAFE_WRITES;
730 bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER;
734 l = strtol(bsdtar->argument, &tptr, 10);
735 if (l < 0 || l > 100000L || *(bsdtar->argument) == '\0' ||
740 bsdtar->strip_components = (int)l;
743 bsdtar->names_from_file = bsdtar->argument;
746 set_mode(bsdtar, opt);
747 bsdtar->verbose++;
750 bsdtar->flags |= OPTFLAG_TOTALS;
753 bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK;
754 bsdtar->flags |= OPTFLAG_UNLINK_FIRST;
757 set_mode(bsdtar, opt);
761 l = strtol(bsdtar->argument, &tptr, 10);
762 if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' ||
766 bsdtar->uid = (int)l;
769 bsdtar->uname = bsdtar->argument;
780 bsdtar->verbose++;
794 bsdtar->flags |= OPTFLAG_INTERACTIVE;
798 bsdtar->matching, bsdtar->argument, 0)
801 archive_error_string(bsdtar->matching));
804 set_mode(bsdtar, opt);
807 bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
808 bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_XATTR;
809 bsdtar->flags |= OPTFLAG_XATTRS;
836 compress_program = bsdtar->argument;
848 if ((bsdtar->mode == '\0') && possible_help_request) {
853 if (bsdtar->mode == '\0')
858 if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS) {
859 only_mode(bsdtar, "-a", "cx");
860 if (bsdtar->mode == 'x') {
861 bsdtar->flags &= ~OPTFLAG_AUTO_COMPRESS;
866 if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS)
867 only_mode(bsdtar, "--one-file-system", "cru");
868 if (bsdtar->flags & OPTFLAG_FAST_READ)
869 only_mode(bsdtar, "--fast-read", "xt");
870 if (bsdtar->extract_flags & ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED)
871 only_mode(bsdtar, "--hfsCompression", "x");
872 if (bsdtar->extract_flags & ARCHIVE_EXTRACT_NO_HFS_COMPRESSION)
873 only_mode(bsdtar, "--nopreserveHFSCompression", "x");
874 if (bsdtar->readdisk_flags & ARCHIVE_READDISK_HONOR_NODUMP)
875 only_mode(bsdtar, "--nodump", "cru");
876 if (bsdtar->flags & OPTFLAG_ACLS)
877 only_mode(bsdtar, "--acls", "crux");
878 if (bsdtar->flags & OPTFLAG_NO_ACLS)
879 only_mode(bsdtar, "--no-acls", "crux");
880 if (bsdtar->flags & OPTFLAG_XATTRS)
881 only_mode(bsdtar, "--xattrs", "crux");
882 if (bsdtar->flags & OPTFLAG_NO_XATTRS)
883 only_mode(bsdtar, "--no-xattrs", "crux");
884 if (bsdtar->flags & OPTFLAG_FFLAGS)
885 only_mode(bsdtar, "--fflags", "crux");
886 if (bsdtar->flags & OPTFLAG_NO_FFLAGS)
887 only_mode(bsdtar, "--no-fflags", "crux");
888 if (bsdtar->flags & OPTFLAG_MAC_METADATA)
889 only_mode(bsdtar, "--mac-metadata", "crux");
890 if (bsdtar->flags & OPTFLAG_NO_MAC_METADATA)
891 only_mode(bsdtar, "--no-mac-metadata", "crux");
892 if (bsdtar->flags & OPTFLAG_O) {
893 switch (bsdtar->mode) {
900 cset_set_format(bsdtar->cset, "ustar");
901 /* TODO: bsdtar->create_format = "v7"; */
905 bsdtar->flags |= OPTFLAG_NO_OWNER;
906 bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
909 only_mode(bsdtar, "-o", "xc");
913 if (bsdtar->flags & OPTFLAG_STDOUT)
914 only_mode(bsdtar, "-O", "xt");
915 if (bsdtar->flags & OPTFLAG_UNLINK_FIRST)
916 only_mode(bsdtar, "-U", "x");
917 if (bsdtar->flags & OPTFLAG_WARN_LINKS)
918 only_mode(bsdtar, "--check-links", "cr");
920 if ((bsdtar->flags & OPTFLAG_AUTO_COMPRESS) &&
921 cset_auto_compress(bsdtar->cset, bsdtar->filename)) {
928 only_mode(bsdtar, "--use-compress-program", "cxt");
929 cset_add_filter_program(bsdtar->cset, compress_program);
945 only_mode(bsdtar, buff, "cxt");
946 cset_add_filter(bsdtar->cset, compression_name);
951 only_mode(bsdtar, buff, "cxt");
952 cset_add_filter(bsdtar->cset, compression2_name);
954 if (cset_get_format(bsdtar->cset) != NULL)
955 only_mode(bsdtar, "--format", "cru");
956 if (bsdtar->symlink_mode != '\0') {
958 buff[1] = bsdtar->symlink_mode;
959 only_mode(bsdtar, buff, "cru");
969 archive_match_set_inclusion_recursion(bsdtar->matching,
970 !(bsdtar->flags & OPTFLAG_NO_SUBDIRS));
973 if (strcmp(bsdtar->filename, "-") == 0)
974 bsdtar->filename = NULL;
976 switch(bsdtar->mode) {
978 tar_mode_c(bsdtar);
981 tar_mode_r(bsdtar);
984 tar_mode_t(bsdtar);
987 tar_mode_u(bsdtar);
990 tar_mode_x(bsdtar);
994 archive_match_free(bsdtar->matching);
996 cleanup_substitution(bsdtar);
998 cset_free(bsdtar->cset);
999 passphrase_free(bsdtar->ppbuff);
1001 if (bsdtar->return_value != 0)
1004 return (bsdtar->return_value);
1008 set_mode(struct bsdtar *bsdtar, char opt)
1010 if (bsdtar->mode != '\0' && bsdtar->mode != opt)
1012 "Can't specify both -%c and -%c", opt, bsdtar->mode);
1013 bsdtar->mode = opt;
1020 only_mode(struct bsdtar *bsdtar, const char *opt, const char *valid_modes)
1022 if (strchr(valid_modes, bsdtar->mode) == NULL)
1025 opt, bsdtar->mode);
1047 printf("bsdtar %s - %s \n",
1079 * Note that the word 'bsdtar' will always appear in the first line
1083 * of bsdtar can use the following template:
1085 * if (tar --help 2>&1 | grep bsdtar >/dev/null 2>&1 ) then \
1086 * echo bsdtar; else echo not bsdtar; fi
1098 p = (strcmp(prog,"bsdtar") != 0) ? "(bsdtar)" : "";