The following changes since commit f011531e61ae750cdf82074e0dea1379b07fa239: Update libaio/posixaio/splice for sync updates (2010-03-09 21:47:15 +0100) are available in the git repository at: git://git.kernel.dk/fio.git master Jens Axboe (2): Fix parser bug capping multi value options at 2 Fix broken FIO_OPT_STR option parse.c | 79 +++++++++++++++++++++++++++++++++++---------------------------- 1 files changed, 44 insertions(+), 35 deletions(-) --- Diff of recent changes: diff --git a/parse.c b/parse.c index a5aa9f4..fb5d457 100644 --- a/parse.c +++ b/parse.c @@ -289,7 +289,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, fio_opt_str_fn *fn = o->cb; const struct value_pair *vp; struct value_pair posval[PARSE_MAX_VP]; - int i; + int i, all_skipped = 1; posval_sort(o, posval); @@ -298,6 +298,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, vp = &posval[i]; if (!vp->ival || vp->ival[0] == '\0') continue; + all_skipped = 0; if (!strncmp(vp->ival, ptr, strlen(vp->ival))) { ret = 0; if (o->roff1) { @@ -314,7 +315,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, } } - if (ret) + if (ret && !all_skipped) show_option_values(o); else if (fn) ret = fn(data, ptr); @@ -532,51 +533,59 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, static int handle_option(struct fio_option *o, const char *__ptr, void *data) { - char *ptr, *ptr2 = NULL; - int r1, r2; + char *o_ptr, *ptr, *ptr2; + int ret, done; dprint(FD_PARSE, "handle_option=%s, ptr=%s\n", o->name, __ptr); - ptr = NULL; + o_ptr = ptr = NULL; if (__ptr) - ptr = strdup(__ptr); + o_ptr = ptr = strdup(__ptr); /* - * See if we have a second set of parameters, hidden after a comma. - * Do this before parsing the first round, to check if we should + * See if we have another set of parameters, hidden after a comma. + * Do this before parsing this round, to check if we should * copy set 1 options to set 2. */ - if (ptr && - (o->type != FIO_OPT_STR_STORE) && - (o->type != FIO_OPT_STR)) { - ptr2 = strchr(ptr, ','); - if (ptr2 && *(ptr2 + 1) == '\0') - *ptr2 = '\0'; - if (!ptr2) - ptr2 = strchr(ptr, ':'); - if (!ptr2) - ptr2 = strchr(ptr, '-'); - } + done = 0; + ret = 1; + do { + int __ret; + + ptr2 = NULL; + if (ptr && + (o->type != FIO_OPT_STR_STORE) && + (o->type != FIO_OPT_STR)) { + ptr2 = strchr(ptr, ','); + if (ptr2 && *(ptr2 + 1) == '\0') + *ptr2 = '\0'; + if (o->type != FIO_OPT_STR_MULTI) { + if (!ptr2) + ptr2 = strchr(ptr, ':'); + if (!ptr2) + ptr2 = strchr(ptr, '-'); + } + } - /* - * Don't return early if parsing the first option fails - if - * we are doing multiple arguments, we can allow the first one - * being empty. - */ - r1 = __handle_option(o, ptr, data, 1, !!ptr2); + /* + * Don't return early if parsing the first option fails - if + * we are doing multiple arguments, we can allow the first one + * being empty. + */ + __ret = __handle_option(o, ptr, data, !done, !!ptr2); + if (ret) + ret = __ret; - if (!ptr2) { - if (ptr) - free(ptr); - return r1; - } + if (!ptr2) + break; - ptr2++; - r2 = __handle_option(o, ptr2, data, 0, 0); + ptr = ptr2 + 1; + done++; + } while (1); - if (ptr) - free(ptr); - return r1 && r2; + if (o_ptr) + free(o_ptr); + return ret; } static struct fio_option *get_option(const char *opt, -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html