X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=init.c;h=c56a3c0bb50a095588f0d09696f8e5d8e02a1005;hp=84cb2d261251062a50cf4a1a6c875e4cd87edb97;hb=10927316a4bd0e2ceba98e62c062e352c0e312fe;hpb=e592a06b36999bbb30675a4a58d4ff16ed65e555 diff --git a/init.c b/init.c index 84cb2d26..c56a3c0b 100644 --- a/init.c +++ b/init.c @@ -17,7 +17,7 @@ #include "fio.h" #include "parse.h" -static char fio_version_string[] = "fio 1.17.1"; +static char fio_version_string[] = "fio 1.17.2"; #define FIO_RANDSEED (0xb1899bedUL) @@ -565,13 +565,17 @@ static int parse_jobs_ini(char *file, int stonewall_flag) unsigned int global; struct thread_data *td; char *string, *name; - fpos_t off; FILE *f; char *p; int ret = 0, stonewall; int first_sect = 1; + int skip_fgets = 0; + + if (!strcmp(file, "-")) + f = stdin; + else + f = fopen(file, "r"); - f = fopen(file, "r"); if (!f) { perror("fopen job file"); return 1; @@ -587,10 +591,17 @@ static int parse_jobs_ini(char *file, int stonewall_flag) stonewall = stonewall_flag; do { - p = fgets(string, 4095, f); - if (!p) - break; + /* + * if skip_fgets is set, we already have loaded a line we + * haven't handled. + */ + if (!skip_fgets) { + p = fgets(string, 4095, f); + if (!p) + break; + } + skip_fgets = 0; strip_blank_front(&p); strip_blank_end(p); @@ -627,20 +638,23 @@ static int parse_jobs_ini(char *file, int stonewall_flag) stonewall = 0; } - fgetpos(f, &off); while ((p = fgets(string, 4096, f)) != NULL) { if (is_empty_or_comment(p)) continue; strip_blank_front(&p); - if (p[0] == '[') + /* + * new section, break out and make sure we don't + * fgets() a new line at the top. + */ + if (p[0] == '[') { + skip_fgets = 1; break; + } strip_blank_end(p); - fgetpos(f, &off); - /* * Don't break here, continue parsing options so we * dump all the bad ones. Makes trial/error fixups @@ -651,10 +665,9 @@ static int parse_jobs_ini(char *file, int stonewall_flag) log_info("--%s ", p); } - if (!ret) { - fsetpos(f, &off); + if (!ret) ret = add_job(td, name, 0); - } else { + else { log_err("fio: job %s dropped\n", name); put_job(td); } @@ -665,7 +678,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag) free(string); free(name); - fclose(f); + if (f != stdin) + fclose(f); return ret; } @@ -732,6 +746,7 @@ static int setup_thread_area(void) return 1; } + memset(threads, 0, max_jobs * sizeof(struct thread_data)); atexit(free_shm); return 0; }