From: Dave Chinner <dchinner@xxxxxxxxxx> getbool() can be replaced with getnum_checked with appropriate min/max values set for the boolean variables. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Jan Ťulák <jtulak@xxxxxxxxxx> --- mkfs/xfs_mkfs.c | 147 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 41 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d3d1e11..3803779 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -53,6 +53,7 @@ static long long cvtnum(unsigned int blocksize, unsigned int sectorsize, const char *s); #define MAX_SUBOPTS 16 +#define SUBOPT_NEEDS_VAL (-1LL) struct opt_params { const char name; const char *subopts[MAX_SUBOPTS]; @@ -60,6 +61,7 @@ struct opt_params { int index; long long minval; long long maxval; + long long defaultval; } subopt_params[MAX_SUBOPTS]; }; @@ -76,10 +78,12 @@ const struct opt_params bopts = { { .index = B_LOG, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = B_SIZE, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -121,38 +125,55 @@ const struct opt_params dopts = { }, .subopt_params = { { .index = D_AGCOUNT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = D_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_RTINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_PROJINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -181,20 +202,31 @@ const struct opt_params iopts = { }, .subopt_params = { { .index = I_ALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = I_LOG, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -230,32 +262,50 @@ const struct opt_params lopts = { }, .subopt_params = { { .index = L_AGNUM, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, { .index = L_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, + .minval = 0, + .maxval = 1, + .defaultval = 1, }, }, }; @@ -277,14 +327,20 @@ const struct opt_params nopts = { { .index = N_LOG, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, .minval = 1 << XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, + .minval = 0, + .maxval = 1, + .defaultval = 0, }, }, }; @@ -308,16 +364,22 @@ const struct opt_params ropts = { }, .subopt_params = { { .index = R_EXTSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NAME, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -339,18 +401,22 @@ const struct opt_params sopts = { { .index = S_LOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, .minval = XFS_MIN_SECTORSIZE, .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, }, }, }; @@ -366,6 +432,9 @@ const struct opt_params mopts = { }, .subopt_params = { { .index = M_CRC, + .minval = 0, + .maxval = 1, + .defaultval = 0, }, }, }; @@ -1205,22 +1274,6 @@ getnum( return i; } -static bool -getbool( - const char *str, - const char *illegal_str, - bool default_val) -{ - long long c; - - if (!str || *str == '\0') - return default_val; - c = getnum(str, 0, 0, false); - if (c < 0 || c > 1) - illegal(str, illegal_str); - return c ? true : false; -} - static __attribute__((noreturn)) void illegal_option( const char *value, @@ -1235,18 +1288,28 @@ illegal_option( static int getnum_checked( - const char *str, + const char *str, const struct opt_params *opts, - int index) + int index) { - long long c; + const struct subopt_param *sp = &opts->subopt_params[index]; + long long c; - if (!str || *str == '\0') + if (sp->index != index) { + fprintf(stderr, + ("Developer screwed up option parsing (%d/%d)! Please report!\n"), + sp->index, index); reqval(opts->name, (char **)opts->subopts, index); + } + + if (!str || *str == '\0') { + if (sp->defaultval == SUBOPT_NEEDS_VAL) + reqval(opts->name, (char **)opts->subopts, index); + return sp->defaultval; + } c = getnum(str, 0, 0, false); - if (c < opts->subopt_params[index].minval || - c > opts->subopt_params[index].maxval) + if (c < sp->minval || c > sp->maxval) illegal_option(str, opts, index); return c; } @@ -1470,8 +1533,8 @@ main( dasize = 1; break; case D_FILE: - xi.disfile = getbool(value, "d file", - true); + xi.disfile = getnum_checked(value, + &dopts, D_FILE); if (xi.disfile && !Nflag) xi.dcreat = 1; break; @@ -1613,8 +1676,8 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: - sb_feat.inode_align = getbool( - value, "i align", true); + sb_feat.inode_align = getnum_checked( + value, &iopts, I_ALIGN); break; case I_LOG: if (ilflag) @@ -1684,8 +1747,9 @@ main( sb_feat.attr_version = c; break; case I_PROJID32BIT: - sb_feat.projid16bit = !getbool(value, - "i projid32bit", false); + sb_feat.projid16bit = + !getnum_checked(value, &iopts, + I_PROJID32BIT); break; case I_SPINODES: if (!value || *value == '\0') @@ -1723,8 +1787,8 @@ main( if (loginternal) conflict('l', subopts, L_INTERNAL, L_FILE); - xi.lisfile = getbool(value, "l file", - true); + xi.lisfile = getnum_checked(value, + &lopts, L_FILE); if (xi.lisfile) xi.lcreat = 1; break; @@ -1737,8 +1801,8 @@ main( if (liflag) respec('l', subopts, L_INTERNAL); - loginternal = getbool(value, - "l internal", true); + loginternal = getnum_checked(value, + &lopts, L_INTERNAL); liflag = 1; break; case L_SU: @@ -1825,9 +1889,9 @@ main( lssflag = 1; break; case L_LAZYSBCNTR: - sb_feat.lazy_sb_counters = getbool( - value, "l lazy-count", - true); + sb_feat.lazy_sb_counters = + getnum_checked(value, &lopts, + L_LAZYSBCNTR); break; default: unknown('l', value); @@ -1848,8 +1912,9 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case M_CRC: - sb_feat.crcs_enabled = getbool( - value, "m crc", false); + sb_feat.crcs_enabled = + getnum_checked(value, &mopts, + M_CRC); if (sb_feat.crcs_enabled && nftype) { fprintf(stderr, _("cannot specify both -m crc=1 and -n ftype\n")); @@ -1932,8 +1997,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); _("cannot specify both -m crc=1 and -n ftype\n")); usage(); } - sb_feat.dirftype = getbool(value, - "n ftype", false); + sb_feat.dirftype = getnum_checked(value, + &nopts, N_FTYPE); nftype = 1; break; default: @@ -1971,8 +2036,8 @@ _("cannot specify both -m crc=1 and -n ftype\n")); rtextsize = value; break; case R_FILE: - xi.risfile = getbool(value, - "r file", true); + xi.risfile = getnum_checked(value, + &ropts, R_FILE); if (xi.risfile) xi.rcreat = 1; break; -- 2.1.0 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs