aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-06-26 09:07:59 +0000
committerEric Andersen <andersen@codepoet.org>2003-06-26 09:07:59 +0000
commit27cb6846d7951a6d5a9616aa845a58ff21d6f41e (patch)
tree0f115de36ddc87683348c698a3421654f588a3ff
parenta3bb3e6e0b80c5c905e8088b44be9b850c876b88 (diff)
downloadbusybox-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.c116
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
587static llist_t *append_file_list_to_list(const char *filename, llist_t *list) 587static 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
610static 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
604int tar_main(int argc, char **argv) 624int 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 */