From: Jens Axboe Date: Wed, 5 Oct 2011 18:31:30 +0000 (+0200) Subject: client: ensure that cmd line arguments are always run X-Git-Tag: fio-1.99.1~6 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7 client: ensure that cmd line arguments are always run Even if they don't create a job, like --version etc. Signed-off-by: Jens Axboe --- diff --git a/client.c b/client.c index bcbc1c06..c8e4a4dc 100644 --- a/client.c +++ b/client.c @@ -482,13 +482,15 @@ static void handle_probe(struct fio_net_cmd *cmd) static int handle_client(struct fio_client *client, int one) { struct fio_net_cmd *cmd; - int done = 0; + int done = 0, did_cmd = 0; dprint(FD_NET, "client: handle %s\n", client->hostname); while ((cmd = fio_net_recv_cmd(client->fd, 1)) != NULL) { - dprint(FD_NET, "%s: got cmd op %d\n", client->hostname, - cmd->opcode); + did_cmd++; + + dprint(FD_NET, "client: got cmd op %d from %s\n", + cmd->opcode, client->hostname); switch (cmd->opcode) { case FIO_NET_CMD_QUIT: @@ -542,7 +544,7 @@ static int handle_client(struct fio_client *client, int one) break; } - return 0; + return did_cmd; } int fio_handle_clients(void) diff --git a/init.c b/init.c index eba6dc2c..c4d6a1ee 100644 --- a/init.c +++ b/init.c @@ -1229,6 +1229,23 @@ static void fio_options_fill_optstring(void) ostr[c] = '\0'; } +static int client_flag_set(char c) +{ + int i; + + i = 0; + while (l_opts[i].name) { + int val = l_opts[i].val; + + if (c == (val & 0xff)) + return (val & FIO_CLIENT_FLAG); + + i++; + } + + return 0; +} + int parse_cmd_client(char *client, char *opt) { return fio_client_add_cmd_option(client, opt); @@ -1243,9 +1260,14 @@ int parse_cmd_line(int argc, char *argv[]) char *cur_client = NULL; int backend = 0; - while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) { + /* + * Reset optind handling, since we may call this multiple times + * for the backend. + */ + optind = 1; - if (c & FIO_CLIENT_FLAG) { + while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) { + if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) { if (parse_cmd_client(cur_client, argv[optind - 1])) { exit_val = 1; do_exit++; @@ -1279,10 +1301,15 @@ int parse_cmd_line(int argc, char *argv[]) terse_output = 1; break; case 'h': - usage(argv[0]); - exit(0); + if (!cur_client) + usage(argv[0]); + do_exit++; + break; case 'c': - exit(fio_show_option_help(optarg)); + if (!cur_client) + fio_show_option_help(optarg); + do_exit++; + break; case 's': dump_cmdline = 1; break; @@ -1290,8 +1317,10 @@ int parse_cmd_line(int argc, char *argv[]) read_only = 1; break; case 'v': - log_info("%s\n", fio_version_string); - exit(0); + if (!cur_client) + log_info("%s\n", fio_version_string); + do_exit++; + break; case 'V': terse_version = atoi(optarg); if (terse_version != 2) { @@ -1403,8 +1432,10 @@ int parse_cmd_line(int argc, char *argv[]) break; } - if (do_exit) - exit(exit_val); + if (do_exit) { + if (exit_val && !(is_backend || nr_clients)) + exit(exit_val); + } if (nr_clients && fio_clients_connect()) { do_exit++;