X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=d8527b50d8877b8644529d4764bc374522a070bc;hp=13a27cc89ceef37634893945ebc3abad3d737dfc;hb=f5b6bb85364fcb8b2ac8d922ca65afd9dfabc9bb;hpb=9f988e2ebb3bff7087cc9681a54bd7f0d0e42140 diff --git a/parse.c b/parse.c index 13a27cc8..d8527b50 100644 --- a/parse.c +++ b/parse.c @@ -56,20 +56,19 @@ static void show_option_range(struct fio_option *o, FILE *out) static void show_option_values(struct fio_option *o) { - int i = 0; + int i; - do { + for (i = 0; i < PARSE_MAX_VP; i++) { const struct value_pair *vp = &o->posval[i]; if (!vp->ival) - break; + continue; printf("%20s: %-10s", i == 0 ? "valid values" : "", vp->ival); if (vp->help) printf(" %s", vp->help); printf("\n"); - i++; - } while (i < PARSE_MAX_VP); + } if (i) printf("\n"); @@ -78,6 +77,7 @@ static void show_option_values(struct fio_option *o) static void show_option_help(struct fio_option *o, FILE *out) { const char *typehelp[] = { + "invalid", "string (opt=bla)", "string with possible k/m/g postfix (opt=4k)", "string with time postfix (opt=10s)", @@ -86,6 +86,7 @@ static void show_option_help(struct fio_option *o, FILE *out) "integer value (opt=100)", "boolean value (opt=1)", "no argument (opt)", + "deprecated", }; if (o->alias) @@ -93,6 +94,8 @@ static void show_option_help(struct fio_option *o, FILE *out) fprintf(out, "%20s: %s\n", "type", typehelp[o->type]); fprintf(out, "%20s: %s\n", "default", o->def ? o->def : "no default"); + if (o->prof_name) + fprintf(out, "%20s: only for profile '%s'\n", "valid", o->prof_name); show_option_range(o, stdout); show_option_values(o); } @@ -254,40 +257,6 @@ static int check_int(const char *p, int *val) return 1; } -static inline int o_match(struct fio_option *o, const char *opt) -{ - if (!strcmp(o->name, opt)) - return 1; - else if (o->alias && !strcmp(o->alias, opt)) - return 1; - - return 0; -} - -static struct fio_option *find_option(struct fio_option *options, - struct flist_head *eops, const char *opt) -{ - struct flist_head *n; - struct fio_option *o; - - for (o = &options[0]; o->name; o++) - if (o_match(o, opt)) - return o; - - if (!eops) - return NULL; - - flist_for_each(n, eops) { - struct ext_option *eopt; - - eopt = flist_entry(n, struct ext_option, list); - if (o_match(&eopt->o, opt)) - return &eopt->o; - } - - return NULL; -} - #define val_store(ptr, val, off, data) \ do { \ ptr = td_var((data), (off)); \ @@ -323,13 +292,17 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, for (i = 0; i < PARSE_MAX_VP; i++) { vp = &posval[i]; if (!vp->ival || vp->ival[0] == '\0') - break; + continue; ret = 1; if (!strncmp(vp->ival, ptr, strlen(vp->ival))) { ret = 0; - if (!o->off1) - break; - val_store(ilp, vp->oval, o->off1, data); + if (o->roff1) + *(unsigned int *) o->roff1 = vp->oval; + else { + if (!o->off1) + break; + val_store(ilp, vp->oval, o->off1, data); + } break; } } @@ -369,15 +342,31 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, ret = fn(data, &ull); else { if (o->type == FIO_OPT_INT) { - if (first) - val_store(ilp, ull, o->off1, data); - if (!more && o->off2) - val_store(ilp, ull, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned long long *) o->roff1 = ull; + else + val_store(ilp, ull, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned long long *) o->roff2 = ull; + else if (o->off2) + val_store(ilp, ull, o->off2, data); + } } else { - if (first) - val_store(ullp, ull, o->off1, data); - if (!more && o->off2) - val_store(ullp, ull, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned long long *) o->roff1 = ull; + else + val_store(ullp, ull, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned long long *) o->roff2 = ull; + else if (o->off2) + val_store(ullp, ull, o->off2, data); + } } } break; @@ -385,7 +374,11 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, case FIO_OPT_STR_STORE: { fio_opt_str_fn *fn = o->cb; - cp = td_var(data, o->off1); + if (o->roff1) + cp = (char **) o->roff1; + else + cp = td_var(data, o->off1); + *cp = strdup(ptr); if (fn) { ret = fn(data, ptr); @@ -427,10 +420,19 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, } if (first) { - val_store(ilp, ul1, o->off1, data); - val_store(ilp, ul2, o->off2, data); + if (o->roff1) + *(unsigned long *) o->roff1 = ul1; + else + val_store(ilp, ul1, o->off1, data); + if (o->roff2) + *(unsigned long *) o->roff2 = ul2; + else + val_store(ilp, ul2, o->off2, data); } - if (o->off3 && o->off4) { + if (o->roff3 && o->roff4) { + *(unsigned long *) o->roff3 = ul1; + *(unsigned long *) o->roff4 = ul2; + } else if (o->off3 && o->off4) { val_store(ilp, ul1, o->off3, data); val_store(ilp, ul2, o->off4, data); } @@ -462,10 +464,18 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (fn) ret = fn(data, &il); else { - if (first) - val_store(ilp, il, o->off1, data); - if (!more && o->off2) - val_store(ilp, il, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned int *)o->roff1 = il; + else + val_store(ilp, il, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned int *) o->roff2 = il; + else if (o->off2) + val_store(ilp, il, o->off2, data); + } } break; } @@ -475,10 +485,18 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (fn) ret = fn(data); else { - if (first) - val_store(ilp, 1, o->off1, data); - if (!more && o->off2) - val_store(ilp, 1, o->off2, data); + if (first) { + if (o->roff1) + *(unsigned int *) o->roff1 = 1; + else + val_store(ilp, 1, o->off1, data); + } + if (!more) { + if (o->roff2) + *(unsigned int *) o->roff2 = 1; + else if (o->off2) + val_store(ilp, 1, o->off2, data); + } } break; } @@ -555,8 +573,7 @@ static int handle_option(struct fio_option *o, const char *__ptr, void *data) } static struct fio_option *get_option(const char *opt, - struct fio_option *options, - struct flist_head *eops, char **post) + struct fio_option *options, char **post) { struct fio_option *o; char *ret; @@ -568,9 +585,9 @@ static struct fio_option *get_option(const char *opt, ret = (char *) opt; (*post)++; strip_blank_end(ret); - o = find_option(options, eops, ret); + o = find_option(options, ret); } else { - o = find_option(options, eops, opt); + o = find_option(options, opt); *post = NULL; } @@ -586,8 +603,8 @@ static int opt_cmp(const void *p1, const void *p2) s1 = strdup(*((char **) p1)); s2 = strdup(*((char **) p2)); - o1 = get_option(s1, fio_options, NULL, &foo); - o2 = get_option(s2, fio_options, NULL, &foo); + o1 = get_option(s1, fio_options, &foo); + o2 = get_option(s2, fio_options, &foo); prio1 = prio2 = 0; if (o1) @@ -608,12 +625,11 @@ void sort_options(char **opts, struct fio_option *options, int num_opts) } int parse_cmd_option(const char *opt, const char *val, - struct fio_option *options, struct flist_head *eops, - void *data) + struct fio_option *options, void *data) { struct fio_option *o; - o = find_option(options, eops, opt); + o = find_option(options, opt); if (!o) { fprintf(stderr, "Bad option <%s>\n", opt); return 1; @@ -680,8 +696,7 @@ static char *option_dup_subs(const char *opt) return strdup(out); } -int parse_option(const char *opt, struct fio_option *options, - struct flist_head *ext_opt_list, void *data) +int parse_option(const char *opt, struct fio_option *options, void *data) { struct fio_option *o; char *post, *tmp; @@ -690,7 +705,7 @@ int parse_option(const char *opt, struct fio_option *options, if (!tmp) return 1; - o = get_option(tmp, options, ext_opt_list, &post); + o = get_option(tmp, options, &post); if (!o) { fprintf(stderr, "Bad option <%s>\n", tmp); free(tmp); @@ -820,6 +835,8 @@ int show_cmd_help(struct fio_option *options, const char *name) if (o->type == FIO_OPT_DEPRECATED) continue; + if (!exec_profile && o->prof_name) + continue; if (name) { if (!strcmp(name, o->name) || @@ -839,7 +856,7 @@ int show_cmd_help(struct fio_option *options, const char *name) if (show_all || match) { found = 1; if (match) - printf("%24s: %s\n", o->name, o->help); + printf("%20s: %s\n", o->name, o->help); if (show_all) { if (!o->parent) print_option(o); @@ -893,13 +910,14 @@ void option_init(struct fio_option *o) fprintf(stderr, "Option %s: string set option with" " default will always be true\n", o->name); } - if (!o->cb && !o->off1) { + if (!o->cb && (!o->off1 && !o->roff1)) { fprintf(stderr, "Option %s: neither cb nor offset given\n", o->name); } if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE) return; - if (o->cb && (o->off1 || o->off2 || o->off3 || o->off4)) { + if (o->cb && ((o->off1 || o->off2 || o->off3 || o->off4) || + (o->roff1 || o->roff2 || o->roff3 || o->roff4))) { fprintf(stderr, "Option %s: both cb and offset given\n", o->name); }