Module Name: src Committed By: christos Date: Tue Jan 29 15:52:26 UTC 2013
Modified Files: src/usr.sbin/makefs: cd9660.c cd9660.h chfs.c ffs.c makefs.c makefs.h v7fs.c Log Message: make everything use the generic options parser. To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/usr.sbin/makefs/cd9660.c cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/makefs/cd9660.h cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/makefs/chfs.c \ src/usr.sbin/makefs/v7fs.c cvs rdiff -u -r1.56 -r1.57 src/usr.sbin/makefs/ffs.c cvs rdiff -u -r1.43 -r1.44 src/usr.sbin/makefs/makefs.c cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/makefs/makefs.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/makefs/cd9660.c diff -u src/usr.sbin/makefs/cd9660.c:1.40 src/usr.sbin/makefs/cd9660.c:1.41 --- src/usr.sbin/makefs/cd9660.c:1.40 Mon Jan 28 20:05:57 2013 +++ src/usr.sbin/makefs/cd9660.c Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660.c,v 1.40 2013/01/29 01:05:57 christos Exp $ */ +/* $NetBSD: cd9660.c,v 1.41 2013/01/29 15:52:25 christos Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -103,7 +103,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: cd9660.c,v 1.40 2013/01/29 01:05:57 christos Exp $"); +__RCSID("$NetBSD: cd9660.c,v 1.41 2013/01/29 15:52:25 christos Exp $"); #endif /* !__lint */ #include <string.h> @@ -264,36 +264,65 @@ cd9660_prep_opts(fsinfo_t *fsopts) iso9660_disk *diskStructure = ecalloc(1, sizeof(*diskStructure)); const option_t cd9660_options[] = { + { 'h', "help", &diskStructure->displayHelp, + OPT_INT32, 0, 1, "Show help message" }, { 'l', "isolevel", &diskStructure->isoLevel, OPT_INT32, 1, 3, "ISO Level" }, + { 'S', "follow-symlinks", &diskStructure->follow_sym_links, + OPT_INT32, 0, 1, "Resolve symlinks in pathnames" }, { 'v', "verbose", &diskStructure->verbose_level, OPT_INT32, 0, 2, "Turns on verbose output" }, - { 'L', "Label", diskStructure->primaryDescriptor.volume_id, - OPT_STRARRAY, 1, - sizeof(diskStructure->primaryDescriptor.volume_id), - "Disk Label" }, { 'R', "rockridge", &diskStructure->rock_ridge_enabled, OPT_INT32, 0, 1, "Enable Rock-Ridge extensions" }, - { 'A', "archimedes", &diskStructure->archimedes_enabled, - OPT_INT32, 0, 1, "Enable Archimedes structure" }, - { '\0', "chrp-boot", &diskStructure->chrp_boot, + { 'C', "chrp-boot", &diskStructure->chrp_boot, OPT_INT32, 0, 1, "Enable CHRP boot" }, { 'K', "keep-bad-images", &diskStructure->keep_bad_images, OPT_INT32, 0, 1, "Keep bad images" }, - { '\0', "allow-deep-trees", &diskStructure->allow_deep_trees, + { 'D', "allow-deep-trees", &diskStructure->allow_deep_trees, OPT_INT32, 0, 1, "Allow trees more than 8 levels" }, - { '\0', "allow-max-name", &diskStructure->allow_max_name, + { 'a', "allow-max-name", &diskStructure->allow_max_name, OPT_INT32, 0, 1, "Allow 37 char filenames (unimplemented)" }, - { '\0', "allow-illegal-chars", + { 'i', "allow-illegal-chars", &diskStructure->allow_illegal_chars, OPT_INT32, 0, 1, "Allow illegal characters in filenames" }, - { '\0', "allow-lowercase", &diskStructure->allow_lowercase, - OPT_INT32, 0, 1, "Allow lowercase characters in filenames" }, - { '\0', "allow-multidot", &diskStructure->allow_multidot, + { 'D', "allow-multidot", &diskStructure->allow_multidot, OPT_INT32, 0, 1, "Allow multiple periods in filenames" }, - { '\0', "omit-trailing-period", + { 'o', "omit-trailing-period", &diskStructure->omit_trailing_period, OPT_INT32, 0, 1, "Omit trailing periods in filenames" }, + { '\0', "allow-lowercase", &diskStructure->allow_lowercase, + OPT_INT32, 0, 1, "Allow lowercase characters in filenames" }, + { '\0', "archimedes", &diskStructure->archimedes_enabled, + OPT_INT32, 0, 1, "Enable Archimedes structure" }, + { '\0', "no-trailing-padding", + &diskStructure->include_padding_areas, + OPT_INT32, 0, 1, "Include padding areas" }, + + + { 'A', "applicationid", NULL, OPT_STRBUF, 0, 0, + "Application Identifier" }, + { 'P', "publisher", NULL, OPT_STRBUF, 0, 0, + "Publisher Identifier" }, + { 'p', "preparer", NULL, OPT_STRBUF, 0, 0, + "Preparer Identifier" }, + { 'L', "label", NULL, OPT_STRBUF, 0, 0, + "Disk Label" }, + { 'V', "volumeid", NULL, OPT_STRBUF, 0, 0, + "Volume Set Identifier" }, + { 'B', "bootimage", NULL, OPT_STRBUF, 0, 0, + "Boot image parameter" }, + { 'G', "generic-bootimage", NULL, OPT_STRBUF, 0, 0, + "Generic boot image parameter" }, + { '\0', "bootimagedir", NULL, OPT_STRBUF, 0, 0, + "Boot image directory" }, + { '\0', "no-emul-boot", NULL, OPT_STRBUF, 0, 0, + "No boot emulation" }, + { '\0', "no-boot", NULL, OPT_STRBUF, 0, 0, + "No boot support" }, + { '\0', "hard-disk-boot", NULL, OPT_STRBUF, 0, 0, + "Boot from hard disk" }, + { '\0', "boot-load-segment", NULL, OPT_STRBUF, 0, 0, + "Boot load segment" }, { .name = NULL } }; @@ -344,101 +373,105 @@ cd9660_arguments_set_string(const char * int cd9660_parse_opts(const char *option, fsinfo_t *fsopts) { - char *var, *val; - int rv; + int rv, i; iso9660_disk *diskStructure = fsopts->fs_specific; - - if (cd9660_defaults_set == 0) - cd9660_set_defaults(diskStructure); + option_t *cd9660_options = fsopts->fs_options; + char buf[1024]; + const char *name, *desc; assert(option != NULL); if (debug & DEBUG_FS_PARSE_OPTS) printf("cd9660_parse_opts: got `%s'\n", option); - var = estrdup(option); - rv = 1; + i = set_option(cd9660_options, option, buf, sizeof(buf)); + if (i == -1) + return 0; - val = strchr(var, '='); - if (val != NULL) - *val++ = '\0'; - - /* First handle options with no parameters */ - if (strcmp(var, "h") == 0) { - diskStructure->displayHelp = 1; - rv = 1; - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "S", "follow-symlinks")) { - /* this is not handled yet */ - diskStructure->follow_sym_links = 1; - rv = 1; - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "L", "label")) { - rv = cd9660_arguments_set_string(val, "Disk Label", 32, 'd', - diskStructure->primaryDescriptor.volume_id); - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "A", "applicationid")) { - rv = cd9660_arguments_set_string(val, "Application Identifier", 128, 'a', - diskStructure->primaryDescriptor.application_id); - } else if(CD9660_IS_COMMAND_ARG_DUAL(var, "P", "publisher")) { - rv = cd9660_arguments_set_string(val, "Publisher Identifier", - 128, 'a', diskStructure->primaryDescriptor.publisher_id); - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "p", "preparer")) { - rv = cd9660_arguments_set_string(val, "Preparer Identifier", - 128, 'a', diskStructure->primaryDescriptor.preparer_id); - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "V", "volumeid")) { - rv = cd9660_arguments_set_string(val, "Volume Set Identifier", - 128, 'a', diskStructure->primaryDescriptor.volume_set_id); + if (cd9660_options[i].name == NULL) + abort(); + + + name = cd9660_options[i].name; + desc = cd9660_options[i].desc; + switch (cd9660_options[i].letter) { + case 'h': + case 'S': + rv = 0; /* this is not handled yet */ + break; + case 'L': + rv = cd9660_arguments_set_string(buf, desc, 32, 'd', + diskStructure->primaryDescriptor.volume_id); + break; + case 'A': + rv = cd9660_arguments_set_string(buf, desc, 128, 'a', + diskStructure->primaryDescriptor.application_id); + break; + case 'P': + rv = cd9660_arguments_set_string(buf, desc, 128, 'a', + diskStructure->primaryDescriptor.publisher_id); + break; + case 'p': + rv = cd9660_arguments_set_string(buf, desc, 128, 'a', + diskStructure->primaryDescriptor.preparer_id); + break; + case 'V': + rv = cd9660_arguments_set_string(buf, desc, 128, 'a', + diskStructure->primaryDescriptor.volume_set_id); + break; /* Boot options */ - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "B", "bootimage")) { - if (val == NULL) - warnx("error: The Boot Image parameter requires a valid boot information string"); - else - rv = cd9660_add_boot_disk(diskStructure, val); - } else if (CD9660_IS_COMMAND_ARG(var, "bootimagedir")) { - /* - * XXXfvdl this is unused. - */ - if (val == NULL) - errx(1, "error: The Boot Image Directory parameter" - " requires a directory name\n"); - else { - diskStructure->boot_image_directory = - emalloc(strlen(val) + 1); - /* BIG TODO: Add the max length function here */ - cd9660_arguments_set_string(val, "Boot Image Directory", - 12 , 'd', diskStructure->boot_image_directory); - } - } else if (CD9660_IS_COMMAND_ARG_DUAL(var, "G", "generic-bootimage")) { - if (val == NULL) - warnx("error: The Boot Image parameter requires a valid boot information string"); - else - rv = cd9660_add_generic_bootimage(diskStructure, val); - } else if (CD9660_IS_COMMAND_ARG(var, "no-trailing-padding")) - diskStructure->include_padding_areas = 0; - /* RRIP */ - else if (CD9660_IS_COMMAND_ARG(var, "no-emul-boot") || - CD9660_IS_COMMAND_ARG(var, "no-boot") || - CD9660_IS_COMMAND_ARG(var, "hard-disk-boot")) { - cd9660_eltorito_add_boot_option(diskStructure, var, 0); - - /* End of flag variables */ - } else if (CD9660_IS_COMMAND_ARG(var, "boot-load-segment")) { - if (val == NULL) { - warnx("Option `%s' doesn't contain a value", var); + case 'B': + if (buf[0] == '\0') { + warnx("The Boot Image parameter requires a valid boot" + " information string"); rv = 0; - } else { - cd9660_eltorito_add_boot_option(diskStructure, var, - val); - } - } else { - if (val == NULL) { - warnx("Option `%s' doesn't contain a value", var); + } else + rv = cd9660_add_boot_disk(diskStructure, buf); + break; + case 'G': + if (buf[0] == '\0') { + warnx("The Generic Boot Image parameter requires a" + " valid boot information string"); rv = 0; } else - rv = set_option_var(fsopts->fs_options, var, val) != -1; + rv = cd9660_add_generic_bootimage(diskStructure, buf); + break; + default: + if (strcmp(name, "bootimagedir") == 0) { + /* + * XXXfvdl this is unused. + */ + if (buf[0] == '\0') { + warnx("The Boot Image Directory parameter" + " requires a directory name\n"); + rv = 0; + } else { + diskStructure->boot_image_directory = + emalloc(strlen(buf) + 1); + /* BIG TODO: Add the max length function here */ + rv = cd9660_arguments_set_string(buf, desc, 12, + 'd', diskStructure->boot_image_directory); + } + } else if (strcmp(name, "no-emul-boot") == 0 || + strcmp(name, "no-boot") == 0 || + strcmp(name, "hard-disk-boot") == 0) { + /* RRIP */ + cd9660_eltorito_add_boot_option(diskStructure, name, 0); + rv = 1; + } else if (strcmp(name, "boot-load-segment") == 0) { + if (buf[0] == '\0') { + warnx("Option `%s' doesn't contain a value", + name); + rv = 0; + } else { + cd9660_eltorito_add_boot_option(diskStructure, + name, buf); + rv = 1; + } + } else + rv = 1; } - - if (var) - free(var); - return (rv); + return rv; } /* Index: src/usr.sbin/makefs/cd9660.h diff -u src/usr.sbin/makefs/cd9660.h:1.19 src/usr.sbin/makefs/cd9660.h:1.20 --- src/usr.sbin/makefs/cd9660.h:1.19 Mon Jan 28 16:03:27 2013 +++ src/usr.sbin/makefs/cd9660.h Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660.h,v 1.19 2013/01/28 21:03:27 christos Exp $ */ +/* $NetBSD: cd9660.h,v 1.20 2013/01/29 15:52:25 christos Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -121,12 +121,6 @@ typedef struct { #define CD9660_MEM_ALLOC_ERROR(_F) \ err(EXIT_FAILURE, "%s, %s l. %d", _F, __FILE__, __LINE__) -#define CD9660_IS_COMMAND_ARG_DUAL(var,short,long)\ - (strcmp((var),(short)) == 0) || (strcmp((var),(long))==0) - -#define CD9660_IS_COMMAND_ARG(var,arg)\ - (strcmp((var),(arg)) == 0) - #define CD9660_TYPE_FILE 0x01 #define CD9660_TYPE_DIR 0x02 #define CD9660_TYPE_DOT 0x04 Index: src/usr.sbin/makefs/chfs.c diff -u src/usr.sbin/makefs/chfs.c:1.7 src/usr.sbin/makefs/chfs.c:1.8 --- src/usr.sbin/makefs/chfs.c:1.7 Mon Jan 28 16:03:27 2013 +++ src/usr.sbin/makefs/chfs.c Tue Jan 29 10:52:25 2013 @@ -91,7 +91,7 @@ chfs_parse_opts(const char *option, fsin assert(option != NULL); assert(fsopts != NULL); - return set_option(fsopts->fs_options, option) != -1; + return set_option(fsopts->fs_options, option, NULL, 0) != -1; } void Index: src/usr.sbin/makefs/v7fs.c diff -u src/usr.sbin/makefs/v7fs.c:1.7 src/usr.sbin/makefs/v7fs.c:1.8 --- src/usr.sbin/makefs/v7fs.c:1.7 Mon Jan 28 16:03:27 2013 +++ src/usr.sbin/makefs/v7fs.c Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs.c,v 1.7 2013/01/28 21:03:27 christos Exp $ */ +/* $NetBSD: v7fs.c,v 1.8 2013/01/29 15:52:25 christos Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: v7fs.c,v 1.7 2013/01/28 21:03:27 christos Exp $"); +__RCSID("$NetBSD: v7fs.c,v 1.8 2013/01/29 15:52:25 christos Exp $"); #endif /* !__lint */ #include <stdio.h> @@ -85,7 +85,7 @@ int v7fs_parse_opts(const char *option, fsinfo_t *fsopts) { - return set_option_var(fsopts->fs_options, option, "1") != -1; + return set_option_var(fsopts->fs_options, option, "1", NULL, 0) != -1; } void Index: src/usr.sbin/makefs/ffs.c diff -u src/usr.sbin/makefs/ffs.c:1.56 src/usr.sbin/makefs/ffs.c:1.57 --- src/usr.sbin/makefs/ffs.c:1.56 Mon Jan 28 16:03:27 2013 +++ src/usr.sbin/makefs/ffs.c Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs.c,v 1.56 2013/01/28 21:03:27 christos Exp $ */ +/* $NetBSD: ffs.c,v 1.57 2013/01/29 15:52:25 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -71,7 +71,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: ffs.c,v 1.56 2013/01/28 21:03:27 christos Exp $"); +__RCSID("$NetBSD: ffs.c,v 1.57 2013/01/29 15:52:25 christos Exp $"); #endif /* !__lint */ #include <sys/param.h> @@ -152,8 +152,6 @@ static void *ffs_build_dinode2(struct u int sectorsize; /* XXX: for buf.c::getblk() */ -static char optimization[24]; /* XXX: allocate */ - /* publically visible functions */ void ffs_prep_opts(fsinfo_t *fsopts) @@ -181,8 +179,8 @@ ffs_prep_opts(fsinfo_t *fsopts) 1, INT_MAX, "max # of blocks per group" }, { 'v', "version", &ffs_opts->version, OPT_INT32, 1, 2, "UFS version" }, - { 'o', "optimization", optimization, OPT_STRARRAY, - 1, sizeof(optimization), "Optimization (time|space)" }, + { 'o', "optimization", NULL, OPT_STRBUF, + 0, 0, "Optimization (time|space)" }, { 'l', "label", ffs_opts->label, OPT_STRARRAY, 1, sizeof(ffs_opts->label), "UFS label" }, { .name = NULL } @@ -216,6 +214,7 @@ ffs_parse_opts(const char *option, fsinf { ffs_opt_t *ffs_opts = fsopts->fs_specific; option_t *ffs_options = fsopts->fs_options; + char buf[1024]; int rv; @@ -226,22 +225,26 @@ ffs_parse_opts(const char *option, fsinf if (debug & DEBUG_FS_PARSE_OPTS) printf("ffs_parse_opts: got `%s'\n", option); - rv = set_option(ffs_options, option); + rv = set_option(ffs_options, option, buf, sizeof(buf)); if (rv == -1) return 0; if (ffs_options[rv].name == NULL) abort(); - if (strcmp(ffs_options[rv].name, "optimization") == 0) { - if (strcmp(optimization, "time") == 0) { + switch (ffs_options[rv].letter) { + case 'o': + if (strcmp(buf, "time") == 0) { ffs_opts->optimization = FS_OPTTIME; - } else if (strcmp(optimization, "space") == 0) { + } else if (strcmp(buf, "space") == 0) { ffs_opts->optimization = FS_OPTSPACE; } else { - warnx("Invalid optimization `%s'", optimization); + warnx("Invalid optimization `%s'", buf); return 0; } + break; + default: + break; } return 1; } Index: src/usr.sbin/makefs/makefs.c diff -u src/usr.sbin/makefs/makefs.c:1.43 src/usr.sbin/makefs/makefs.c:1.44 --- src/usr.sbin/makefs/makefs.c:1.43 Tue Jan 29 09:09:48 2013 +++ src/usr.sbin/makefs/makefs.c Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: makefs.c,v 1.43 2013/01/29 14:09:48 christos Exp $ */ +/* $NetBSD: makefs.c,v 1.44 2013/01/29 15:52:25 christos Exp $ */ /* * Copyright (c) 2001-2003 Wasabi Systems, Inc. @@ -41,7 +41,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: makefs.c,v 1.43 2013/01/29 14:09:48 christos Exp $"); +__RCSID("$NetBSD: makefs.c,v 1.44 2013/01/29 15:52:25 christos Exp $"); #endif /* !__lint */ #include <assert.h> @@ -302,7 +302,7 @@ main(int argc, char *argv[]) } int -set_option(const option_t *options, const char *option) +set_option(const option_t *options, const char *option, char *buf, size_t len) { char *var, *val; int retval; @@ -315,13 +315,14 @@ set_option(const option_t *options, cons *val++ = '\0'; break; } - retval = set_option_var(options, var, val); + retval = set_option_var(options, var, val, buf, len); free(var); return retval; } int -set_option_var(const option_t *options, const char *var, const char *val) +set_option_var(const option_t *options, const char *var, const char *val, + char *buf, size_t len) { char *s; size_t i; @@ -354,7 +355,11 @@ set_option_var(const option_t *options, err(1, NULL); *(char **)options[i].value = s; break; - + case OPT_STRBUF: + if (buf == NULL) + abort(); + strlcpy(buf, val, len); + break; case OPT_INT64: NUM(64); case OPT_INT32: Index: src/usr.sbin/makefs/makefs.h diff -u src/usr.sbin/makefs/makefs.h:1.30 src/usr.sbin/makefs/makefs.h:1.31 --- src/usr.sbin/makefs/makefs.h:1.30 Mon Jan 28 16:03:27 2013 +++ src/usr.sbin/makefs/makefs.h Tue Jan 29 10:52:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: makefs.h,v 1.30 2013/01/28 21:03:27 christos Exp $ */ +/* $NetBSD: makefs.h,v 1.31 2013/01/29 15:52:25 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -118,6 +118,7 @@ typedef struct _fsnode { typedef enum { OPT_STRARRAY, OPT_STRPTR, + OPT_STRBUF, OPT_BOOL, OPT_INT8, OPT_INT16, @@ -173,8 +174,9 @@ typedef struct { void apply_specfile(const char *, const char *, fsnode *, int); void dump_fsnodes(fsnode *); const char * inode_type(mode_t); -int set_option(const option_t *, const char *); -int set_option_var(const option_t *, const char *, const char *); +int set_option(const option_t *, const char *, char *, size_t); +int set_option_var(const option_t *, const char *, const char *, + char *, size_t); fsnode * walk_dir(const char *, const char *, fsnode *, fsnode *); void free_fsnodes(fsnode *); option_t * copy_opts(const option_t *);