Fio 1.22-rc2
[fio.git] / init.c
diff --git a/init.c b/init.c
index 420a1bc2f87d16c9fc93c48a74939141f1908f61..a544996ea433170e6378658fe43ad08950d1e861 100644 (file)
--- a/init.c
+++ b/init.c
@@ -19,7 +19,7 @@
 #include "smalloc.h"
 #include "filehash.h"
 
-static char fio_version_string[] = "fio 1.21-rc5";
+static char fio_version_string[] = "fio 1.22-rc2";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -614,6 +614,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        int first_sect = 1;
        int skip_fgets = 0;
        int inside_skip = 0;
+       char **opts;
+       int i, alloc_opts, num_opts;
 
        if (!strcmp(file, "-"))
                f = stdin;
@@ -633,6 +635,10 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        name = malloc(280);
        memset(name, 0, 280);
 
+       alloc_opts = 8;
+       opts = malloc(sizeof(char *) * alloc_opts);
+       num_opts = 0;
+
        stonewall = stonewall_flag;
        do {
                /*
@@ -691,6 +697,9 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
                        stonewall = 0;
                }
 
+               num_opts = 0;
+               memset(opts, 0, alloc_opts * sizeof(char *));
+
                while ((p = fgets(string, 4096, f)) != NULL) {
                        if (is_empty_or_comment(p))
                                continue;
@@ -708,29 +717,42 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
 
                        strip_blank_end(p);
 
-                       /*
-                        * Don't break here, continue parsing options so we
-                        * dump all the bad ones. Makes trial/error fixups
-                        * easier on the user.
-                        */
-                       ret |= fio_option_parse(td, p);
-                       if (!ret && dump_cmdline)
-                               log_info("--%s ", p);
+                       if (num_opts == alloc_opts) {
+                               alloc_opts <<= 1;
+                               opts = realloc(opts,
+                                               alloc_opts * sizeof(char *));
+                       }
+
+                       opts[num_opts] = strdup(p);
+                       num_opts++;
                }
 
-               if (!ret)
+               ret = fio_options_parse(td, opts, num_opts);
+               if (!ret) {
+                       if (dump_cmdline)
+                               for (i = 0; i < num_opts; i++)
+                                       log_info("--%s ", opts[i]);
+
                        ret = add_job(td, name, 0);
-               else {
+               else {
                        log_err("fio: job %s dropped\n", name);
                        put_job(td);
                }
+
+               for (i = 0; i < num_opts; i++)
+                       free(opts[i]);
+               num_opts = 0;
        } while (!ret);
 
        if (dump_cmdline)
                log_info("\n");
 
+       for (i = 0; i < num_opts; i++)
+               free(opts[i]);
+
        free(string);
        free(name);
+       free(opts);
        if (f != stdin)
                fclose(f);
        return ret;