client: support per-client job files

Currently the fio network client sends all job files to all clients.
This isn't very flexible.

Add support for specifying a specific job file for each client. Example:

$ fio --client hostname1 jobfile1 --client hostname2 jobfile2

would before add jobfile1 and jobfile2 as job files for both clients.
With this change, only jobfile1 is sent to hostname1, and only
jobfile2 is sent to hostname2.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index 7c99109..50c1704 100644
--- a/client.c
+++ b/client.c
@@ -58,6 +58,9 @@
 
 	uint16_t argc;
 	char **argv;
+
+	char **ini_file;
+	unsigned int nr_ini_file;
 };
 
 static struct timeval eta_tv;
@@ -151,6 +154,10 @@
 		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);
 	nr_clients--;
@@ -193,6 +200,19 @@
 	}
 }
 
+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(const char *hostname, void **cookie)
 {
 	struct fio_client *existing = *cookie;
@@ -521,7 +541,18 @@
 	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);
 
 		client->sent_job = 1;