X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=1a686e4cceb89a5ee8446d10a4472556d3445764;hp=8aaf7992754f1de3e42211a1e3b9c1ef05eddb06;hb=222757cc7a5b2bd5165f67aad8074825e73dc8e4;hpb=184b4098cccb8392eb8ecdd23cdc6597b540df36 diff --git a/parse.c b/parse.c index 8aaf7992..1a686e4c 100644 --- a/parse.c +++ b/parse.c @@ -180,6 +180,7 @@ static unsigned long long __get_mult_bytes(const char *p, void *data, pow = 1; else if (!strcmp("%", c)) { *percent = 1; + free(c); return ret; } @@ -219,7 +220,7 @@ static unsigned long long get_mult_bytes(const char *str, int len, void *data, /* * Convert string into a floating number. Return 1 for success and 0 otherwise. */ -int str_to_float(const char *str, double *val) +static int str_to_float(const char *str, double *val) { return (1 == sscanf(str, "%lf", val)); } @@ -413,23 +414,29 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, case FIO_OPT_INT: case FIO_OPT_STR_VAL: { fio_opt_str_val_fn *fn = o->cb; + char tmp[128], *p; + + strncpy(tmp, ptr, sizeof(tmp) - 1); + p = strchr(tmp, ','); + if (p) + *p = '\0'; if (is_time) - ret = check_str_time(ptr, &ull); + ret = check_str_time(tmp, &ull); else - ret = check_str_bytes(ptr, &ull, data); + ret = check_str_bytes(tmp, &ull, data); if (ret) break; if (o->maxval && ull > o->maxval) { - log_err("max value out of range: %lld" - " (%d max)\n", ull, o->maxval); + log_err("max value out of range: %llu" + " (%u max)\n", ull, o->maxval); return 1; } if (o->minval && ull < o->minval) { - log_err("min value out of range: %lld" - " (%d min)\n", ull, o->minval); + log_err("min value out of range: %llu" + " (%u min)\n", ull, o->minval); return 1; } @@ -443,12 +450,32 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, else val_store(ilp, ull, o->off1, 0, data); } - if (!more) { + if (curr == 1) { if (o->roff2) *(unsigned int *) o->roff2 = ull; else if (o->off2) val_store(ilp, ull, o->off2, 0, data); } + if (curr == 2) { + if (o->roff3) + *(unsigned int *) o->roff3 = ull; + else if (o->off3) + val_store(ilp, ull, o->off3, 0, data); + } + if (!more) { + if (curr < 1) { + if (o->roff2) + *(unsigned int *) o->roff2 = ull; + else if (o->off2) + val_store(ilp, ull, o->off2, 0, data); + } + if (curr < 2) { + if (o->roff3) + *(unsigned int *) o->roff3 = ull; + else if (o->off3) + val_store(ilp, ull, o->off3, 0, data); + } + } } else { if (first) { if (o->roff1) @@ -597,12 +624,43 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, else val_store(ilp, ul2, o->off2, 0, data); } - if (o->roff3 && o->roff4) { - *(unsigned int *) o->roff3 = ul1; - *(unsigned int *) o->roff4 = ul2; - } else if (o->off3 && o->off4) { - val_store(ilp, ul1, o->off3, 0, data); - val_store(ilp, ul2, o->off4, 0, data); + if (curr == 1) { + if (o->roff3 && o->roff4) { + *(unsigned int *) o->roff3 = ul1; + *(unsigned int *) o->roff4 = ul2; + } else if (o->off3 && o->off4) { + val_store(ilp, ul1, o->off3, 0, data); + val_store(ilp, ul2, o->off4, 0, data); + } + } + if (curr == 2) { + if (o->roff5 && o->roff6) { + *(unsigned int *) o->roff5 = ul1; + *(unsigned int *) o->roff6 = ul2; + } else if (o->off5 && o->off6) { + val_store(ilp, ul1, o->off5, 0, data); + val_store(ilp, ul2, o->off6, 0, data); + } + } + if (!more) { + if (curr < 1) { + if (o->roff3 && o->roff4) { + *(unsigned int *) o->roff3 = ul1; + *(unsigned int *) o->roff4 = ul2; + } else if (o->off3 && o->off4) { + val_store(ilp, ul1, o->off3, 0, data); + val_store(ilp, ul2, o->off4, 0, data); + } + } + if (curr < 2) { + if (o->roff5 && o->roff6) { + *(unsigned int *) o->roff5 = ul1; + *(unsigned int *) o->roff6 = ul2; + } else if (o->off5 && o->off6) { + val_store(ilp, ul1, o->off5, 0, data); + val_store(ilp, ul2, o->off6, 0, data); + } + } } } @@ -706,7 +764,7 @@ static int handle_option(struct fio_option *o, const char *__ptr, void *data) ptr2 = strchr(ptr, ','); if (ptr2 && *(ptr2 + 1) == '\0') *ptr2 = '\0'; - if (o->type != FIO_OPT_STR_MULTI) { + if (o->type != FIO_OPT_STR_MULTI && o->type != FIO_OPT_RANGE) { if (!ptr2) ptr2 = strchr(ptr, ':'); if (!ptr2) @@ -1029,6 +1087,10 @@ void option_init(struct fio_option *o) o->minval = 0; o->maxval = 1; } + if (o->type == FIO_OPT_INT) { + if (!o->maxval) + o->maxval = UINT_MAX; + } if (o->type == FIO_OPT_FLOAT_LIST) { o->minfp = NAN; o->maxfp = NAN;