server: initial support for command line passing
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/server.c b/server.c
index a8b8258..d9aff01 100644
--- a/server.c
+++ b/server.c
@@ -280,7 +280,33 @@
char *buf = (char *) cmd->payload;
int ret;
- parse_jobs_ini(buf, 1, 0);
+ if (parse_jobs_ini(buf, 1, 0))
+ return -1;
+
+ fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0);
+
+ ret = exec_run();
+ send_quit_command();
+ reset_fio_state();
+ return ret;
+}
+
+static int handle_jobline_cmd(struct fio_net_cmd *cmd)
+{
+ struct cmd_line_pdu *pdu = (struct cmd_line_pdu *) cmd->payload;
+ char *argv[FIO_NET_CMD_JOBLINE_ARGV];
+ int ret, i;
+
+ pdu->argc = le16_to_cpu(pdu->argc);
+
+ for (i = 0; i < pdu->argc; i++)
+ argv[i] = (char *) pdu->argv[i];
+
+ if (parse_cmd_line(pdu->argc, argv))
+ return -1;
+
+ fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0);
+
ret = exec_run();
send_quit_command();
reset_fio_state();
@@ -293,9 +319,9 @@
memset(&probe, 0, sizeof(probe));
gethostname((char *) probe.hostname, sizeof(probe.hostname));
- probe.fio_major = 1;
- probe.fio_minor = 58;
- probe.fio_patch = 0;
+ probe.fio_major = FIO_MAJOR;
+ probe.fio_minor = FIO_MINOR;
+ probe.fio_patch = FIO_PATCH;
return fio_net_send_cmd(server_fd, FIO_NET_CMD_PROBE, &probe, sizeof(probe));
}
@@ -316,6 +342,9 @@
case FIO_NET_CMD_JOB:
ret = handle_job_cmd(cmd);
break;
+ case FIO_NET_CMD_JOBLINE:
+ ret = handle_jobline_cmd(cmd);
+ break;
case FIO_NET_CMD_PROBE:
ret = handle_probe_cmd(cmd);
break;
@@ -412,58 +441,6 @@
return exitval;
}
-static int fio_server(void)
-{
- struct sockaddr_in saddr_in;
- struct sockaddr addr;
- unsigned int len;
- int sk, opt, ret;
-
- dprint(FD_NET, "starting server\n");
-
- sk = socket(AF_INET, SOCK_STREAM, 0);
- if (sk < 0) {
- log_err("fio: socket: %s\n", strerror(errno));
- return -1;
- }
-
- opt = 1;
- if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
- log_err("fio: setsockopt: %s\n", strerror(errno));
- return -1;
- }
-#ifdef SO_REUSEPORT
- if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
- log_err("fio: setsockopt: %s\n", strerror(errno));
- return -1;
- }
-#endif
-
- saddr_in.sin_family = AF_INET;
- saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
- saddr_in.sin_port = htons(fio_net_port);
-
- if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
- log_err("fio: bind: %s\n", strerror(errno));
- return -1;
- }
-
- if (listen(sk, 1) < 0) {
- log_err("fio: listen: %s\n", strerror(errno));
- return -1;
- }
-
- len = sizeof(addr);
- if (getsockname(sk, &addr, &len) < 0) {
- log_err("fio: getsockname: %s\n", strerror(errno));
- return -1;
- }
-
- ret = accept_loop(sk);
- close(sk);
- return ret;
-}
-
int fio_server_text_output(const char *buf, unsigned int len)
{
if (server_fd != -1)
@@ -632,6 +609,58 @@
return fio_server_text_output(buffer, len);
}
+static int fio_server(void)
+{
+ struct sockaddr_in saddr_in;
+ struct sockaddr addr;
+ unsigned int len;
+ int sk, opt, ret;
+
+ dprint(FD_NET, "starting server\n");
+
+ sk = socket(AF_INET, SOCK_STREAM, 0);
+ if (sk < 0) {
+ log_err("fio: socket: %s\n", strerror(errno));
+ return -1;
+ }
+
+ opt = 1;
+ if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
+ log_err("fio: setsockopt: %s\n", strerror(errno));
+ return -1;
+ }
+#ifdef SO_REUSEPORT
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
+ log_err("fio: setsockopt: %s\n", strerror(errno));
+ return -1;
+ }
+#endif
+
+ saddr_in.sin_family = AF_INET;
+ saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
+ saddr_in.sin_port = htons(fio_net_port);
+
+ if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
+ log_err("fio: bind: %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (listen(sk, 1) < 0) {
+ log_err("fio: listen: %s\n", strerror(errno));
+ return -1;
+ }
+
+ len = sizeof(addr);
+ if (getsockname(sk, &addr, &len) < 0) {
+ log_err("fio: getsockname: %s\n", strerror(errno));
+ return -1;
+ }
+
+ ret = accept_loop(sk);
+ close(sk);
+ return ret;
+}
+
int fio_start_server(int daemonize)
{
pid_t pid;