[BusyBox] tar and getopt (again)
Matt Kraai
kraai at alumni.carnegiemellon.edu
Mon Jan 22 06:19:27 UTC 2001
Howdy,
The attached patch makes tar use getopt. It does so by using a
cheap trick I learned from reading GNU tar. That is, if the first
parameter is missing a leading -, add it. Hehe. The patch is
large since most of the option parsing was reindented. It saves
16 bytes. OK to commit?
Matt
-------------- next part --------------
Index: tar.c
===================================================================
RCS file: /var/cvs/busybox/tar.c,v
retrieving revision 1.89
diff -u -r1.89 tar.c
--- tar.c 2001/01/22 05:25:19 1.89
+++ tar.c 2001/01/22 06:13:20
@@ -182,6 +182,10 @@
}
#endif
+static struct option long_opts[] = {
+ { "exclude", 1, NULL, 'e' },
+};
+
extern int tar_main(int argc, char **argv)
{
char** excludeList=NULL;
@@ -202,91 +206,86 @@
int verboseFlag = FALSE;
int tostdoutFlag = FALSE;
int status = FALSE;
- int firstOpt = TRUE;
- int stopIt;
+ int opt;
if (argc <= 1)
usage(tar_usage);
+
+ if (argv[0][0] != '-') {
+ char *s = xmalloc(strlen(argv[0]) + 2);
+ s[0] = '-';
+ strcpy(s+1, argv[1]);
+ argv[1] = s;
+ }
- while (*(++argv) && (**argv == '-' || firstOpt == TRUE)) {
- firstOpt=FALSE;
- stopIt=FALSE;
- while (stopIt==FALSE && **argv) {
- switch (*((*argv)++)) {
- case 'c':
- if (extractFlag == TRUE || listFlag == TRUE)
- goto flagError;
- createFlag = TRUE;
- break;
- case 'x':
- if (listFlag == TRUE || createFlag == TRUE)
- goto flagError;
- extractFlag = TRUE;
- break;
- case 't':
- if (extractFlag == TRUE || createFlag == TRUE)
- goto flagError;
- listFlag = TRUE;
- break;
+ while ((opt = getopt_long(argc, argv, "cf:OtvxX:z", long_opts, NULL)) > 0) {
+ switch (opt) {
+ case 'c':
+ if (extractFlag == TRUE || listFlag == TRUE)
+ goto flagError;
+ createFlag = TRUE;
+ break;
+ case 'x':
+ if (listFlag == TRUE || createFlag == TRUE)
+ goto flagError;
+ extractFlag = TRUE;
+ break;
+ case 't':
+ if (extractFlag == TRUE || createFlag == TRUE)
+ goto flagError;
+ listFlag = TRUE;
+ break;
#ifdef BB_FEATURE_TAR_GZIP
- case 'z':
- unzipFlag = TRUE;
- break;
-#endif
- case 'v':
- verboseFlag = TRUE;
- break;
- case 'O':
- tostdoutFlag = TRUE;
- break;
- case 'f':
- if (*tarName != '-')
- error_msg_and_die( "Only one 'f' option allowed\n");
- tarName = *(++argv);
- if (tarName == NULL)
- error_msg_and_die( "Option requires an argument: No file specified\n");
- stopIt=TRUE;
- break;
+ case 'z':
+ unzipFlag = TRUE;
+ break;
+#endif
+ case 'v':
+ verboseFlag = TRUE;
+ break;
+ case 'O':
+ tostdoutFlag = TRUE;
+ break;
+ case 'f':
+ if (*tarName != '-')
+ error_msg_and_die( "Only one 'f' option allowed\n");
+ tarName = optarg;
+ if (tarName == NULL)
+ error_msg_and_die( "Option requires an argument: No file specified\n");
+ break;
#if defined BB_FEATURE_TAR_EXCLUDE
- case 'e':
- if (strcmp(*argv, "xclude")==0) {
- excludeList=xrealloc( excludeList,
- sizeof(char *) * (excludeListSize+2));
- excludeList[excludeListSize] = *(++argv);
- if (excludeList[excludeListSize] == NULL)
- error_msg_and_die( "Option requires an argument: No file specified\n");
- /* Tack a NULL onto the end of the list */
- excludeList[++excludeListSize] = NULL;
- stopIt=TRUE;
- break;
- }
- case 'X':
- if (*excludeFileName != '-')
- error_msg_and_die("Only one 'X' option allowed\n");
- excludeFileName = *(++argv);
- if (excludeFileName == NULL)
- error_msg_and_die("Option requires an argument: No file specified\n");
- fileList = fopen (excludeFileName, "r");
- if (! fileList)
- error_msg_and_die("Exclude file: file not found\n");
- while (fgets(file, sizeof(file), fileList) != NULL) {
- excludeList = xrealloc(excludeList,
- sizeof(char *) * (excludeListSize+2));
- if (file[strlen(file)-1] == '\n')
- file[strlen(file)-1] = '\0';
- excludeList[excludeListSize] = xstrdup(file);
- /* Tack a NULL onto the end of the list */
- excludeList[++excludeListSize] = NULL;
- }
- fclose(fileList);
- stopIt=TRUE;
- break;
-#endif
- case '-':
- break;
- default:
- usage(tar_usage);
- }
+ case 'e':
+ excludeList=xrealloc( excludeList,
+ sizeof(char *) * (excludeListSize+2));
+ excludeList[excludeListSize] = optarg;
+ if (excludeList[excludeListSize] == NULL)
+ error_msg_and_die( "Option requires an argument: No file specified\n");
+ /* Tack a NULL onto the end of the list */
+ excludeList[++excludeListSize] = NULL;
+ break;
+ case 'X':
+ if (*excludeFileName != '-')
+ error_msg_and_die("Only one 'X' option allowed\n");
+ excludeFileName = optarg;
+ if (excludeFileName == NULL)
+ error_msg_and_die("Option requires an argument: No file specified\n");
+ fileList = fopen (excludeFileName, "r");
+ if (! fileList)
+ error_msg_and_die("Exclude file: file not found\n");
+ while (fgets(file, sizeof(file), fileList) != NULL) {
+ excludeList = xrealloc(excludeList,
+ sizeof(char *) * (excludeListSize+2));
+ if (file[strlen(file)-1] == '\n')
+ file[strlen(file)-1] = '\0';
+ excludeList[excludeListSize] = xstrdup(file);
+ /* Tack a NULL onto the end of the list */
+ excludeList[++excludeListSize] = NULL;
+ }
+ fclose(fileList);
+ break;
+#endif
+ default:
+ usage(tar_usage);
}
}
@@ -302,13 +301,13 @@
if (unzipFlag==TRUE)
error_msg_and_die("Creation of compressed not internally support by tar, pipe to busybox gunzip\n");
#endif
- status = writeTarFile(tarName, verboseFlag, argv, excludeList);
+ status = writeTarFile(tarName, verboseFlag, argv + optind, excludeList);
#endif
}
if (listFlag == TRUE || extractFlag == TRUE) {
int tarFd;
- if (*argv)
- extractList = argv;
+ if (argv[optind])
+ extractList = argv + optind;
/* Open the tar file for reading. */
if (!strcmp(tarName, "-"))
tarFd = fileno(stdin);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
Url : http://lists.busybox.net/pipermail/busybox/attachments/20010121/0ea921db/attachment.pgp
More information about the busybox
mailing list