X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=e8b628cee7be114d2579aa5a1d2fe75515653127;hp=5b8e10f9f2e936ef55817c2d44b291e7c868e9f4;hb=b7f487cf80a8299a656df9c2214ff73e72956d71;hpb=a03fb65f4e5d657ee3bb68309cfa70ae2d5bc44b diff --git a/parse.c b/parse.c index 5b8e10f9..e8b628ce 100644 --- a/parse.c +++ b/parse.c @@ -18,8 +18,7 @@ #include "minmax.h" #include "lib/ieee754.h" -static struct fio_option *fio_options; -extern unsigned int fio_get_kb_base(void *); +static struct fio_option *__fio_options; static int vp_cmp(const void *p1, const void *p2) { @@ -50,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; @@ -58,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; @@ -174,32 +173,32 @@ static unsigned long long __get_mult_bytes(const char *p, void *data, } } - if (!strcmp("pib", c)) { + if (!strncmp("pib", c, 3)) { pow = 5; mult = 1000; - } else if (!strcmp("tib", c)) { + } else if (!strncmp("tib", c, 3)) { pow = 4; mult = 1000; - } else if (!strcmp("gib", c)) { + } else if (!strncmp("gib", c, 3)) { pow = 3; mult = 1000; - } else if (!strcmp("mib", c)) { + } else if (!strncmp("mib", c, 3)) { pow = 2; mult = 1000; - } else if (!strcmp("kib", c)) { + } else if (!strncmp("kib", c, 3)) { pow = 1; mult = 1000; - } else if (!strcmp("p", c) || !strcmp("pb", c)) + } else if (!strncmp("p", c, 1) || !strncmp("pb", c, 2)) pow = 5; - else if (!strcmp("t", c) || !strcmp("tb", c)) + else if (!strncmp("t", c, 1) || !strncmp("tb", c, 2)) pow = 4; - else if (!strcmp("g", c) || !strcmp("gb", c)) + else if (!strncmp("g", c, 1) || !strncmp("gb", c, 2)) pow = 3; - else if (!strcmp("m", c) || !strcmp("mb", c)) + else if (!strncmp("m", c, 1) || !strncmp("mb", c, 2)) pow = 2; - else if (!strcmp("k", c) || !strcmp("kb", c)) + else if (!strncmp("k", c, 1) || !strncmp("kb", c, 2)) pow = 1; - else if (!strcmp("%", c)) { + else if (!strncmp("%", c, 1)) { *percent = 1; free(c); return ret; @@ -281,7 +280,7 @@ int str_to_decimal(const char *str, long long *val, int kilo, void *data) return 0; } -static int check_str_bytes(const char *p, long long *val, void *data) +int check_str_bytes(const char *p, long long *val, void *data) { return str_to_decimal(p, val, 1, data); } @@ -465,6 +464,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); @@ -877,14 +895,14 @@ static int opt_cmp(const void *p1, const void *p2) if (*(char **)p1) { s = strdup(*((char **) p1)); - o = get_option(s, fio_options, &foo); + o = get_option(s, __fio_options, &foo); if (o) prio1 = o->prio; free(s); } if (*(char **)p2) { s = strdup(*((char **) p2)); - o = get_option(s, fio_options, &foo); + o = get_option(s, __fio_options, &foo); if (o) prio2 = o->prio; free(s); @@ -895,9 +913,9 @@ static int opt_cmp(const void *p1, const void *p2) void sort_options(char **opts, struct fio_option *options, int num_opts) { - fio_options = options; + __fio_options = options; qsort(opts, num_opts, sizeof(char *), opt_cmp); - fio_options = NULL; + __fio_options = NULL; } int parse_cmd_option(const char *opt, const char *val, @@ -940,9 +958,8 @@ int parse_option(char *opt, const char *input, return 1; } - if (!handle_option(*o, post, data)) { + if (!handle_option(*o, post, data)) return 0; - } log_err("fio: failed parsing %s\n", input); return 1; @@ -1151,6 +1168,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; @@ -1170,8 +1192,11 @@ void options_init(struct fio_option *options) dprint(FD_PARSE, "init options\n"); - for (o = &options[0]; o->name; o++) + for (o = &options[0]; o->name; o++) { option_init(o); + if (o->inverse) + o->inv_opt = find_option(options, o->inverse); + } } void options_free(struct fio_option *options, void *data)