X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=parse.c;h=6141c91e8d31c4e9d0822fb769f606e1bcd84b00;hb=005f702b8aad1352ced5295aebafc94b048ac02b;hp=92501338d456fde659af69beb8066ce239f39a8a;hpb=d7213923067aa49922962a469a691c3ec951064d;p=fio.git diff --git a/parse.c b/parse.c index 92501338..6141c91e 100644 --- a/parse.c +++ b/parse.c @@ -49,7 +49,7 @@ static void posval_sort(struct fio_option *o, struct value_pair *vpmap) static void show_option_range(struct fio_option *o, int (*logger)(const char *format, ...)) { - if (o->type == FIO_OPT_FLOAT_LIST){ + if (o->type == FIO_OPT_FLOAT_LIST) { if (o->minfp == DBL_MIN && o->maxfp == DBL_MAX) return; @@ -57,7 +57,7 @@ static void show_option_range(struct fio_option *o, if (o->maxfp != DBL_MAX) logger(", max=%f", o->maxfp); logger("\n"); - } else { + } else if (!o->posval[0].ival) { if (!o->minval && !o->maxval) return; @@ -139,6 +139,19 @@ static unsigned long get_mult_time(char c) } } +static int is_separator(char c) +{ + switch (c) { + case ':': + case '-': + case ',': + case '/': + return 1; + default: + return 0; + } +} + static unsigned long long __get_mult_bytes(const char *p, void *data, int *percent) { @@ -152,8 +165,13 @@ static unsigned long long __get_mult_bytes(const char *p, void *data, c = strdup(p); - for (i = 0; i < strlen(c); i++) + for (i = 0; i < strlen(c); i++) { c[i] = tolower(c[i]); + if (is_separator(c[i])) { + c[i] = '\0'; + break; + } + } if (!strncmp("pib", c, 3)) { pow = 5; @@ -267,7 +285,7 @@ int check_str_bytes(const char *p, long long *val, void *data) return str_to_decimal(p, val, 1, data); } -static int check_str_time(const char *p, long long *val) +int check_str_time(const char *p, long long *val) { return str_to_decimal(p, val, 0, NULL); } @@ -362,7 +380,7 @@ static int str_match_len(const struct value_pair *vp, const char *str) static int __handle_option(struct fio_option *o, const char *ptr, void *data, int first, int more, int curr) { - int il, *ilp; + int il=0, *ilp; fio_fp64_t *flp; long long ull, *ullp; long ul1, ul2; @@ -433,6 +451,8 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, else ret = check_str_bytes(tmp, &ull, data); + dprint(FD_PARSE, " ret=%d, out=%llu\n", ret, ull); + if (ret) break; @@ -446,6 +466,25 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, " (%u min)\n", ull, o->minval); return 1; } + if (o->posval[0].ival) { + posval_sort(o, posval); + + ret = 1; + for (i = 0; i < PARSE_MAX_VP; i++) { + vp = &posval[i]; + if (!vp->ival || vp->ival[0] == '\0') + continue; + if (vp->oval == ull) { + ret = 0; + break; + } + } + if (ret) { + log_err("fio: value %llu not allowed:\n", ull); + show_option_values(o); + return 1; + } + } if (fn) ret = fn(data, &ull); @@ -508,9 +547,11 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, ** Initialize precision to 0 and zero out list ** in case specified list is shorter than default */ - ul2 = 0; - ilp = td_var(data, o->off2); - *ilp = ul2; + if (o->off2) { + ul2 = 0; + ilp = td_var(data, o->off2); + *ilp = ul2; + } flp = td_var(data, o->off1); for(i = 0; i < o->maxlen; i++) @@ -539,6 +580,8 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, flp = td_var(data, o->off1); flp[curr].u.f = uf; + dprint(FD_PARSE, " out=%f\n", uf); + /* ** Calculate precision for output by counting ** number of digits after period. Find first @@ -551,9 +594,11 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, while (*++cp2 != '\0' && *cp2 >= '0' && *cp2 <= '9') len++; - ilp = td_var(data, o->off2); - if (len > *ilp) - *ilp = len; + if (o->off2) { + ilp = td_var(data, o->off2); + if (len > *ilp) + *ilp = len; + } } break; @@ -708,6 +753,8 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, else il = 1; + dprint(FD_PARSE, " ret=%d, out=%d\n", ret, il); + if (ret) break; @@ -745,6 +792,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, } case FIO_OPT_DEPRECATED: log_info("Option %s is deprecated\n", o->name); + ret = 1; break; default: log_err("Bad option type %u\n", o->type); @@ -900,7 +948,8 @@ int parse_cmd_option(const char *opt, const char *val, } int parse_option(char *opt, const char *input, - struct fio_option *options, struct fio_option **o, void *data) + struct fio_option *options, struct fio_option **o, void *data, + int dump_cmdline) { char *post; @@ -921,11 +970,25 @@ int parse_option(char *opt, const char *input, return 1; } - if (!handle_option(*o, post, data)) - return 0; + if (handle_option(*o, post, data)) { + log_err("fio: failed parsing %s\n", input); + return 1; + } - log_err("fio: failed parsing %s\n", input); - return 1; + if (dump_cmdline) { + const char *delim; + + if (!strcmp("description", (*o)->name)) + delim = "\""; + else + delim = ""; + + log_info("--%s%s", (*o)->name, post ? "" : " "); + if (post) + log_info("=%s%s%s ", delim, post, delim); + } + + return 0; } /* @@ -1043,6 +1106,8 @@ int show_cmd_help(struct fio_option *options, const char *name) continue; if (!exec_profile && o->prof_name) continue; + if (exec_profile && !(o->prof_name && !strcmp(exec_profile, o->prof_name))) + continue; if (name) { if (!strcmp(name, o->name) || @@ -1131,6 +1196,11 @@ void option_init(struct fio_option *o) } if (!o->cb && (!o->off1 && !o->roff1)) log_err("Option %s: neither cb nor offset given\n", o->name); + if (!o->category) { + log_info("Option %s: no category defined. Setting to misc\n", o->name); + o->category = FIO_OPT_C_GENERAL; + o->group = FIO_OPT_G_INVALID; + } if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE || o->type == FIO_OPT_STR_MULTI) return; @@ -1138,10 +1208,6 @@ void option_init(struct fio_option *o) (o->roff1 || o->roff2 || o->roff3 || o->roff4))) { log_err("Option %s: both cb and offset given\n", o->name); } - if (!o->category) { - log_info("Options %s: no category defined. Setting to misc\n", o->name); - o->category = FIO_OPT_C_GENERAL; - } } /*