Rename exists_and_not_file() to exists_and_not_regfile()
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index 0ef00b81cda60ffb6209a0c3b305b370aeee8810..086f7864b8b6eb16ee0aa6527e86a32079833bfd 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -15,6 +15,7 @@
 #include "parse.h"
 #include "debug.h"
 #include "options.h"
+#include "optgroup.h"
 #include "minmax.h"
 #include "lib/ieee754.h"
 #include "lib/pow2.h"
@@ -108,6 +109,7 @@ static void show_option_help(struct fio_option *o, int is_err)
                "list of floating point values separated by ':' (opt=5.9:7.8)",
                "no argument (opt)",
                "deprecated",
+               "unsupported",
        };
        size_t (*logger)(const char *format, ...);
 
@@ -905,6 +907,25 @@ static int handle_option(struct fio_option *o, const char *__ptr, void *data)
        return ret;
 }
 
+struct fio_option *find_option(struct fio_option *options, const char *opt)
+{
+       struct fio_option *o;
+
+       for (o = &options[0]; o->name; o++) {
+               if (!o_match(o, opt))
+                       continue;
+               if (o->type == FIO_OPT_UNSUPPORTED) {
+                       log_err("Option <%s>: %s\n", o->name, o->help);
+                       continue;
+               }
+
+               return o;
+       }
+
+       return NULL;
+}
+
+
 static struct fio_option *get_option(char *opt,
                                     struct fio_option *options, char **post)
 {
@@ -960,8 +981,27 @@ void sort_options(char **opts, struct fio_option *options, int num_opts)
        __fio_options = NULL;
 }
 
+static void add_to_dump_list(struct fio_option *o, struct flist_head *dump_list,
+                            const char *post)
+{
+       struct print_option *p;
+
+       if (!dump_list)
+               return;
+
+       p = malloc(sizeof(*p));
+       p->name = strdup(o->name);
+       if (post)
+               p->value = strdup(post);
+       else
+               p->value = NULL;
+
+       flist_add_tail(&p->list, dump_list);
+}
+
 int parse_cmd_option(const char *opt, const char *val,
-                    struct fio_option *options, void *data)
+                    struct fio_option *options, void *data,
+                    struct flist_head *dump_list)
 {
        struct fio_option *o;
 
@@ -971,11 +1011,13 @@ int parse_cmd_option(const char *opt, const char *val,
                return 1;
        }
 
-       if (!handle_option(o, val, data))
-               return 0;
+       if (handle_option(o, val, data)) {
+               log_err("fio: failed parsing %s=%s\n", opt, val);
+               return 1;
+       }
 
-       log_err("fio: failed parsing %s=%s\n", opt, val);
-       return 1;
+       add_to_dump_list(o, dump_list, val);
+       return 0;
 }
 
 int parse_option(char *opt, const char *input,
@@ -1006,18 +1048,7 @@ int parse_option(char *opt, const char *input,
                return 1;
        }
 
-       if (dump_list) {
-               struct print_option *p = malloc(sizeof(*p));
-
-               p->name = strdup((*o)->name);
-               if (post)
-                       p->value = strdup(post);
-               else
-                       p->value = NULL;
-
-               flist_add_tail(&p->list, dump_list);
-       }
-
+       add_to_dump_list(*o, dump_list, post);
        return 0;
 }
 
@@ -1221,8 +1252,10 @@ void fill_default_options(void *data, struct fio_option *options)
 
 void option_init(struct fio_option *o)
 {
-       if (o->type == FIO_OPT_DEPRECATED)
+       if (o->type == FIO_OPT_DEPRECATED || o->type == FIO_OPT_UNSUPPORTED)
                return;
+       if (o->name && !o->lname)
+               log_err("Option %s: missing long option name\n", o->name);
        if (o->type == FIO_OPT_BOOL) {
                o->minval = 0;
                o->maxval = 1;