Fix bug with numjobs > 1, directory and filename given
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index a0242c2713af32b9faad8aca7e3fcfefb9a6d704..57865b112e7a9118a9a4e6fc3dd0a60a0d66a9a8 100644 (file)
--- a/parse.c
+++ b/parse.c
 
 #include "parse.h"
 
+static int vp_cmp(const void *p1, const void *p2)
+{
+       const struct value_pair *vp1 = p1;
+       const struct value_pair *vp2 = p2;
+
+       return strlen(vp2->ival) - strlen(vp1->ival);
+}
+
+static void posval_sort(struct fio_option *o, struct value_pair *vpmap)
+{
+       const struct value_pair *vp;
+       int entries;
+
+       memset(vpmap, 0, PARSE_MAX_VP * sizeof(struct value_pair));
+
+       for (entries = 0; entries < PARSE_MAX_VP; entries++) {
+               vp = &o->posval[entries];
+               if (!vp->ival || vp->ival[0] == '\0')
+                       break;
+
+               memcpy(&vpmap[entries], vp, sizeof(*vp));
+       }
+
+       qsort(vpmap, entries, sizeof(struct value_pair), vp_cmp);
+}
+
 static void show_option_range(struct fio_option *o)
 {
        if (!o->minval && !o->maxval)
@@ -195,10 +221,13 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
        case FIO_OPT_STR: {
                fio_opt_str_fn *fn = o->cb;
                const struct value_pair *vp;
+               struct value_pair posval[PARSE_MAX_VP];
                int i;
 
+               posval_sort(o, posval);
+
                for (i = 0; i < PARSE_MAX_VP; i++) {
-                       vp = &o->posval[i];
+                       vp = &posval[i];
                        if (!vp->ival || vp->ival[0] == '\0')
                                break;
                        ret = 1;
@@ -502,6 +531,9 @@ static void show_option_help(struct fio_option *o)
                "no argument (opt)",
        };
 
+       if (o->alias)
+               printf("%20s: %s\n", "alias", o->alias);
+
        printf("%20s: %s\n", "type", typehelp[o->type]);
        printf("%20s: %s\n", "default", o->def ? o->def : "no default");
        show_option_range(o);
@@ -593,6 +625,8 @@ void options_init(struct fio_option *options)
                        o->minval = 0;
                        o->maxval = 1;
                }
+               if (o->type == FIO_OPT_STR_SET && o->def)
+                       fprintf(stderr, "Option %s: string set option with default will always be true\n", o->name);
                if (!o->cb && !o->off1)
                        fprintf(stderr, "Option %s: neither cb nor offset given\n", o->name);
                if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE)