free(client->argv);
if (client->name)
free(client->name);
+ while (client->nr_ini_file)
+ free(client->ini_file[--client->nr_ini_file]);
+ if (client->ini_file)
+ free(client->ini_file);
free(client);
}
return NULL;
}
+void fio_client_add_ini_file(void *cookie, const char *ini_file)
+{
+ struct fio_client *client = cookie;
+ size_t new_size;
+
+ dprint(FD_NET, "client <%s>: add ini %s\n", client->hostname, ini_file);
+
+ new_size = (client->nr_ini_file + 1) * sizeof(char *);
+ client->ini_file = realloc(client->ini_file, new_size);
+ client->ini_file[client->nr_ini_file] = strdup(ini_file);
+ client->nr_ini_file++;
+}
+
int fio_client_add(struct client_ops *ops, const char *hostname, void **cookie)
{
struct fio_client *existing = *cookie;
flist_for_each_safe(entry, tmp, &client_list) {
client = flist_entry(entry, struct fio_client, list);
- if (fio_client_send_ini(client, filename))
+ if (client->nr_ini_file) {
+ int i;
+
+ for (i = 0; i < client->nr_ini_file; i++) {
+ const char *ini = client->ini_file[i];
+
+ if (fio_client_send_ini(client, ini)) {
+ remove_client(client);
+ break;
+ }
+ }
+ } else if (!filename || fio_client_send_ini(client, filename))
remove_client(client);
}
struct client_ops *ops;
void *client_data;
+
+ char **ini_file;
+ unsigned int nr_ini_file;
};
struct cmd_iolog_pdu;
extern int fio_client_add(struct client_ops *, const char *, void **);
extern struct fio_client *fio_client_add_explicit(struct client_ops *, const char *, int, int);
extern void fio_client_add_cmd_option(void *, const char *);
+extern void fio_client_add_ini_file(void *, const char *);
extern int fio_client_terminate(struct fio_client *);
extern void fio_clients_terminate(void);
extern struct fio_client *fio_get_client(struct fio_client *);
exit_val = 1;
break;
}
+ /*
+ * If the next argument exists and isn't an option,
+ * assume it's a job file for this client only.
+ */
+ while (optind < argc) {
+ if (!strncmp(argv[optind], "--", 2) ||
+ !strncmp(argv[optind], "-", 1))
+ break;
+
+ fio_client_add_ini_file(cur_client, argv[optind]);
+ optind++;
+ }
break;
default:
do_exit++;
free(ini_file[i]);
}
}
+ } else if (nr_clients) {
+ if (fill_def_thread())
+ return 1;
+ if (fio_clients_send_ini(NULL))
+ return 1;
}
free(ini_file);