Ensure that job name is set before being used
[fio.git] / init.c
diff --git a/init.c b/init.c
index 7630978cc3ca805839dbbf280f8681b83925295d..6b29aa702407a69799f54ff15a60011a105be5d8 100644 (file)
--- a/init.c
+++ b/init.c
@@ -238,15 +238,19 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
 
 void free_threads_shm(void)
 {
-       struct shmid_ds sbuf;
-
        if (threads) {
                void *tp = threads;
+#ifndef CONFIG_NO_SHM
+               struct shmid_ds sbuf;
 
                threads = NULL;
                shmdt(tp);
                shmctl(shm_id, IPC_RMID, &sbuf);
                shm_id = -1;
+#else
+               threads = NULL;
+               free(tp);
+#endif
        }
 }
 
@@ -287,6 +291,7 @@ static int setup_thread_area(void)
                size += file_hash_size;
                size += sizeof(unsigned int);
 
+#ifndef CONFIG_NO_SHM
                shm_id = shmget(0, size, IPC_CREAT | 0600);
                if (shm_id != -1)
                        break;
@@ -294,10 +299,16 @@ static int setup_thread_area(void)
                        perror("shmget");
                        break;
                }
+#else
+               threads = malloc(size);
+               if (threads)
+                       break;
+#endif
 
                max_jobs >>= 1;
        } while (max_jobs);
 
+#ifndef CONFIG_NO_SHM
        if (shm_id == -1)
                return 1;
 
@@ -306,6 +317,7 @@ static int setup_thread_area(void)
                perror("shmat");
                return 1;
        }
+#endif
 
        memset(threads, 0, max_jobs * sizeof(struct thread_data));
        hash = (void *) threads + max_jobs * sizeof(struct thread_data);
@@ -330,7 +342,7 @@ static void set_cmd_options(struct thread_data *td)
  * Return a free job structure.
  */
 static struct thread_data *get_new_job(int global, struct thread_data *parent,
-                                      int preserve_eo)
+                                      int preserve_eo, const char *jobname)
 {
        struct thread_data *td;
 
@@ -364,6 +376,9 @@ static struct thread_data *get_new_job(int global, struct thread_data *parent,
 
        td->thread_number = thread_number;
 
+       if (jobname)
+               td->o.name = strdup(jobname);
+
        if (!parent->o.group_reporting)
                stat_number++;
 
@@ -386,6 +401,9 @@ static void put_job(struct thread_data *td)
        if (td->io_ops)
                free_ioengine(td);
 
+       if (td->o.name)
+               free(td->o.name);
+
        memset(&threads[td->thread_number - 1], 0, sizeof(*td));
        thread_number--;
 }
@@ -937,7 +955,7 @@ static struct fpre_keyword {
        { .keyword = NULL, },
        };
 
-static char *make_filename(char *buf, struct thread_options *o,
+static char *make_filename(char *buf, size_t buf_size,struct thread_options *o,
                           const char *jobname, int jobnum, int filenum)
 {
        struct fpre_keyword *f;
@@ -952,7 +970,9 @@ static char *make_filename(char *buf, struct thread_options *o,
        for (f = &fpre_keywords[0]; f->keyword; f++)
                f->strlen = strlen(f->keyword);
 
-       strcpy(buf, o->filename_format);
+       buf[buf_size - 1] = '\0';
+       strncpy(buf, o->filename_format, buf_size - 1);
+
        memset(copy, 0, sizeof(copy));
        for (f = &fpre_keywords[0]; f->keyword; f++) {
                do {
@@ -1012,7 +1032,7 @@ static char *make_filename(char *buf, struct thread_options *o,
                        if (post_start)
                                strncpy(dst, buf + post_start, dst_left);
 
-                       strcpy(buf, copy);
+                       strncpy(buf, copy, buf_size - 1);
                } while (1);
        }
 
@@ -1072,7 +1092,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        add_file(td, jobname, job_add_num, 0);
                else {
                        for (i = 0; i < o->nr_files; i++)
-                               add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num, 0);
+                               add_file(td, make_filename(fname, sizeof(fname), o, jobname, job_add_num, i), job_add_num, 0);
                }
        }
 
@@ -1188,7 +1208,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
         */
        numjobs = o->numjobs;
        while (--numjobs) {
-               struct thread_data *td_new = get_new_job(0, td, 1);
+               struct thread_data *td_new = get_new_job(0, td, 1, jobname);
 
                if (!td_new)
                        goto err;
@@ -1246,11 +1266,11 @@ void add_job_opts(const char **o, int client_type)
                        sprintf(jobname, "%s", o[i] + 5);
                }
                if (in_global && !td_parent)
-                       td_parent = get_new_job(1, &def_thread, 0);
+                       td_parent = get_new_job(1, &def_thread, 0, jobname);
                else if (!in_global && !td) {
                        if (!td_parent)
                                td_parent = &def_thread;
-                       td = get_new_job(0, td_parent, 0);
+                       td = get_new_job(0, td_parent, 0, jobname);
                }
                if (in_global)
                        fio_options_parse(td_parent, (char **) &o[i], 1, 0);
@@ -1385,7 +1405,7 @@ int parse_jobs_ini(char *file, int is_buf, int stonewall_flag, int type)
                        first_sect = 0;
                }
 
-               td = get_new_job(global, &def_thread, 0);
+               td = get_new_job(global, &def_thread, 0, name);
                if (!td) {
                        ret = 1;
                        break;
@@ -1737,7 +1757,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        write_bw_log = 1;
                        break;
                case 'o':
-                       if (f_out)
+                       if (f_out && f_out != stdout)
                                fclose(f_out);
 
                        f_out = fopen(optarg, "w+");
@@ -1881,9 +1901,15 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                if (is_section && skip_this_section(val))
                                        continue;
 
-                               td = get_new_job(global, &def_thread, 1);
-                               if (!td || ioengine_load(td))
-                                       goto out_free;
+                               td = get_new_job(global, &def_thread, 1, NULL);
+                               if (!td || ioengine_load(td)) {
+                                       if (td) {
+                                               put_job(td);
+                                               td = NULL;
+                                       }
+                                       do_exit++;
+                                       break;
+                               }
                                fio_options_set_ioengine_opts(l_opts, td);
                        }
 
@@ -1904,8 +1930,14 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
 
                        if (!ret && !strcmp(opt, "ioengine")) {
                                free_ioengine(td);
-                               if (ioengine_load(td))
-                                       goto out_free;
+                               if (ioengine_load(td)) {
+                                       if (td) {
+                                               put_job(td);
+                                               td = NULL;
+                                       }
+                                       do_exit++;
+                                       break;
+                               }
                                fio_options_set_ioengine_opts(l_opts, td);
                        }
                        break;
@@ -1918,7 +1950,6 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                break;
 
                        ret = fio_cmd_ioengine_option_parse(td, opt, val);
-                       did_arg = 1;
                        break;
                }
                case 'w':
@@ -1934,6 +1965,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        break;
                case 'S':
                        did_arg = 1;
+#ifndef CONFIG_NO_SHM
                        if (nr_clients) {
                                log_err("fio: can't be both client and server\n");
                                do_exit++;
@@ -1944,6 +1976,11 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                fio_server_set_arg(optarg);
                        is_backend = 1;
                        backend = 1;
+#else
+                       log_err("fio: client/server requires SHM support\n");
+                       do_exit++;
+                       exit_val = 1;
+#endif
                        break;
                case 'D':
                        if (pid_file)