diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-06-26 09:07:59 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-06-26 09:07:59 +0000 |
commit | 27cb6846d7951a6d5a9616aa845a58ff21d6f41e (patch) | |
tree | 0f115de36ddc87683348c698a3421654f588a3ff | |
parent | a3bb3e6e0b80c5c905e8088b44be9b850c876b88 (diff) | |
download | busybox-w32-27cb6846d7951a6d5a9616aa845a58ff21d6f41e.tar.gz busybox-w32-27cb6846d7951a6d5a9616aa845a58ff21d6f41e.tar.bz2 busybox-w32-27cb6846d7951a6d5a9616aa845a58ff21d6f41e.zip |
last_patch91 from vodz to convert tar to use bb_getopt_ulflags
-rw-r--r-- | archival/tar.c | 116 |
1 files changed, 56 insertions, 60 deletions
diff --git a/archival/tar.c b/archival/tar.c index 29244d4bf..06851e854 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -584,22 +584,42 @@ static inline int writeTarFile(const char *tarName, const int verboseFlag, | |||
584 | #endif /* tar_create */ | 584 | #endif /* tar_create */ |
585 | 585 | ||
586 | #ifdef CONFIG_FEATURE_TAR_EXCLUDE | 586 | #ifdef CONFIG_FEATURE_TAR_EXCLUDE |
587 | static llist_t *append_file_list_to_list(const char *filename, llist_t *list) | 587 | static llist_t *append_file_list_to_list(llist_t *list) |
588 | { | 588 | { |
589 | FILE *src_stream = bb_xfopen(filename, "r"); | 589 | FILE *src_stream; |
590 | llist_t *cur = list; | ||
591 | llist_t *tmp; | ||
590 | char *line; | 592 | char *line; |
593 | llist_t *newlist = NULL; | ||
594 | |||
595 | while(cur) { | ||
596 | src_stream = bb_xfopen(cur->data, "r"); | ||
597 | tmp = cur; | ||
598 | cur = cur->link; | ||
599 | free(tmp); | ||
591 | while((line = bb_get_chomped_line_from_file(src_stream)) != NULL) { | 600 | while((line = bb_get_chomped_line_from_file(src_stream)) != NULL) { |
592 | list = llist_add_to(list, line); | 601 | newlist = llist_add_to(newlist, line); |
593 | } | 602 | } |
594 | fclose(src_stream); | 603 | fclose(src_stream); |
595 | 604 | } | |
596 | return (list); | 605 | return newlist; |
597 | } | 606 | } |
598 | #endif | 607 | #endif |
599 | 608 | ||
609 | |||
610 | static const char tar_options[]="ctxjT:X:C:f:Opvz"; | ||
600 | #define CTX_CREATE 1 | 611 | #define CTX_CREATE 1 |
601 | #define CTX_TEST 2 | 612 | #define CTX_TEST 2 |
602 | #define CTX_EXTRACT 4 | 613 | #define CTX_EXTRACT 4 |
614 | #define TAR_OPT_BZIP2 8 | ||
615 | #define TAR_OPT_INCLUDE 16 | ||
616 | #define TAR_OPT_EXCLUDE 32 | ||
617 | #define TAR_OPT_BASEDIR 64 | ||
618 | #define TAR_OPT_ARNAME 128 | ||
619 | #define TAR_OPT_2STDOUT 256 | ||
620 | #define TAR_OPT_P 512 | ||
621 | #define TAR_OPT_VERBOSE 1024 | ||
622 | #define TAR_OPT_GZIP 2048 | ||
603 | 623 | ||
604 | int tar_main(int argc, char **argv) | 624 | int tar_main(int argc, char **argv) |
605 | { | 625 | { |
@@ -616,9 +636,9 @@ int tar_main(int argc, char **argv) | |||
616 | 636 | ||
617 | /* Prepend '-' to the first argument if required */ | 637 | /* Prepend '-' to the first argument if required */ |
618 | if (argv[1][0] != '-') { | 638 | if (argv[1][0] != '-') { |
619 | char *tmp = xmalloc(strlen(argv[1]) + 2); | 639 | char *tmp; |
620 | tmp[0] = '-'; | 640 | |
621 | strcpy(tmp + 1, argv[1]); | 641 | bb_xasprintf(&tmp, "-%s", argv[1]); |
622 | argv[1] = tmp; | 642 | argv[1] = tmp; |
623 | } | 643 | } |
624 | 644 | ||
@@ -626,80 +646,56 @@ int tar_main(int argc, char **argv) | |||
626 | tar_handle = init_handle(); | 646 | tar_handle = init_handle(); |
627 | tar_handle->flags = ARCHIVE_CREATE_LEADING_DIRS | ARCHIVE_PRESERVE_DATE; | 647 | tar_handle->flags = ARCHIVE_CREATE_LEADING_DIRS | ARCHIVE_PRESERVE_DATE; |
628 | 648 | ||
629 | while ((opt = getopt(argc, argv, "cjtxT:X:C:f:Opvz")) != -1) { | 649 | bb_opt_complementaly = "c~tx:t~cx:x~ct:X*"; |
630 | switch (opt) { | 650 | opt = bb_getopt_ulflags(argc, argv, tar_options, |
631 | /* One and only one of these is required */ | 651 | NULL, /* T: arg is ignored by default |
632 | #ifdef CONFIG_FEATURE_TAR_CREATE | 652 | a list is an include list */ |
633 | case 'c': | 653 | &(tar_handle->reject), |
634 | ctx_flag |= CTX_CREATE; | 654 | &base_dir, /* Change to dir <optarg> */ |
635 | break; | 655 | &tar_filename); /* archive filename */ |
636 | #endif | 656 | /* Check one and only one context option was given */ |
637 | case 't': | 657 | if(opt & 0x80000000UL) |
638 | ctx_flag |= CTX_TEST; | 658 | bb_show_usage(); |
659 | ctx_flag = opt & (CTX_CREATE | CTX_TEST | CTX_EXTRACT); | ||
660 | if(ctx_flag & CTX_TEST) { | ||
639 | if ((tar_handle->action_header == header_list) || | 661 | if ((tar_handle->action_header == header_list) || |
640 | (tar_handle->action_header == header_verbose_list)) { | 662 | (tar_handle->action_header == header_verbose_list)) { |
641 | tar_handle->action_header = header_verbose_list; | 663 | tar_handle->action_header = header_verbose_list; |
642 | } else { | 664 | } else { |
643 | tar_handle->action_header = header_list; | 665 | tar_handle->action_header = header_list; |
644 | } | 666 | } |
645 | break; | 667 | } |
646 | case 'x': | 668 | if(ctx_flag & CTX_EXTRACT) { |
647 | ctx_flag |= CTX_EXTRACT; | 669 | if (tar_handle->action_data != data_extract_to_stdout) |
648 | if (tar_handle->action_data != data_extract_to_stdout) { | ||
649 | tar_handle->action_data = data_extract_all; | 670 | tar_handle->action_data = data_extract_all; |
650 | } | 671 | } |
651 | break; | 672 | if(opt & TAR_OPT_2STDOUT) { |
652 | 673 | /* To stdout */ | |
653 | /* These are optional */ | ||
654 | /* Exclude or Include files listed in <filename> */ | ||
655 | #ifdef CONFIG_FEATURE_TAR_EXCLUDE | ||
656 | case 'X': | ||
657 | tar_handle->reject = | ||
658 | append_file_list_to_list(optarg, tar_handle->reject); | ||
659 | break; | ||
660 | #endif | ||
661 | case 'T': | ||
662 | /* by default a list is an include list */ | ||
663 | break; | ||
664 | case 'C': /* Change to dir <optarg> */ | ||
665 | base_dir = optarg; | ||
666 | break; | ||
667 | case 'f': /* archive filename */ | ||
668 | tar_filename = optarg; | ||
669 | break; | ||
670 | case 'O': /* To stdout */ | ||
671 | tar_handle->action_data = data_extract_to_stdout; | 674 | tar_handle->action_data = data_extract_to_stdout; |
672 | break; | 675 | } |
673 | case 'p': | 676 | if(opt & TAR_OPT_VERBOSE) { |
674 | break; | ||
675 | case 'v': | ||
676 | if ((tar_handle->action_header == header_list) || | 677 | if ((tar_handle->action_header == header_list) || |
677 | (tar_handle->action_header == header_verbose_list)) { | 678 | (tar_handle->action_header == header_verbose_list)) { |
678 | tar_handle->action_header = header_verbose_list; | 679 | tar_handle->action_header = header_verbose_list; |
679 | } else { | 680 | } else { |
680 | tar_handle->action_header = header_list; | 681 | tar_handle->action_header = header_list; |
681 | } | 682 | } |
682 | break; | 683 | } |
683 | #ifdef CONFIG_FEATURE_TAR_GZIP | 684 | #ifdef CONFIG_FEATURE_TAR_GZIP |
684 | case 'z': | 685 | if(opt & TAR_OPT_GZIP) { |
685 | get_header_ptr = get_header_tar_gz; | 686 | get_header_ptr = get_header_tar_gz; |
686 | break; | 687 | } |
687 | #endif | 688 | #endif |
688 | #ifdef CONFIG_FEATURE_TAR_BZIP2 | 689 | #ifdef CONFIG_FEATURE_TAR_BZIP2 |
689 | case 'j': | 690 | if(opt & TAR_OPT_GZIP) { |
690 | get_header_ptr = get_header_tar_bz2; | 691 | get_header_ptr = get_header_tar_bz2; |
691 | break; | ||
692 | #endif | ||
693 | default: | ||
694 | bb_show_usage(); | ||
695 | } | ||
696 | } | 692 | } |
697 | 693 | #endif | |
698 | /* Check one and only one context option was given */ | 694 | #ifdef CONFIG_FEATURE_TAR_EXCLUDE |
699 | if ((ctx_flag != CTX_CREATE) && (ctx_flag != CTX_TEST) && (ctx_flag != CTX_EXTRACT)) { | 695 | if(opt & TAR_OPT_EXCLUDE) { |
700 | bb_show_usage(); | 696 | tar_handle->reject = append_file_list_to_list(tar_handle->reject); |
701 | } | 697 | } |
702 | 698 | #endif | |
703 | /* Check if we are reading from stdin */ | 699 | /* Check if we are reading from stdin */ |
704 | if ((argv[optind]) && (*argv[optind] == '-')) { | 700 | if ((argv[optind]) && (*argv[optind] == '-')) { |
705 | /* Default is to read from stdin, so just skip to next arg */ | 701 | /* Default is to read from stdin, so just skip to next arg */ |