Skip to content

Commit

Permalink
ivshmem-server: Fix and clean up command line help
Browse files Browse the repository at this point in the history
Burying error messages in ~20 lines of usage help is bad form.  Print
a single line pointing to -h instead.

Print -h help to stdout rather than stderr.  Fix default of -p.  Clean
up the help text a bit.

Signed-off-by: Markus Armbruster <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
Markus Armbruster committed Mar 18, 2016
1 parent 3be5cc2 commit e3ad729
Showing 1 changed file with 42 additions and 44 deletions.
86 changes: 42 additions & 44 deletions contrib/ivshmem-server/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,31 +33,32 @@ typedef struct IvshmemServerArgs {
unsigned n_vectors;
} IvshmemServerArgs;

/* show ivshmem_server_usage and exit with given error code */
static void
ivshmem_server_usage(const char *name, int code)
ivshmem_server_usage(const char *progname)
{
fprintf(stderr, "%s [opts]\n", name);
fprintf(stderr, " -h: show this help\n");
fprintf(stderr, " -v: verbose mode\n");
fprintf(stderr, " -F: foreground mode (default is to daemonize)\n");
fprintf(stderr, " -p <pid_file>: path to the PID file (used in daemon\n"
" mode only).\n"
" Default=%s\n", IVSHMEM_SERVER_DEFAULT_SHM_PATH);
fprintf(stderr, " -S <unix_socket_path>: path to the unix socket\n"
" to listen to.\n"
" Default=%s\n", IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH);
fprintf(stderr, " -m <shm_path>: path to the shared memory.\n"
" The path corresponds to a POSIX shm name or a\n"
" hugetlbfs mount point.\n"
" default=%s\n", IVSHMEM_SERVER_DEFAULT_SHM_PATH);
fprintf(stderr, " -l <size>: size of shared memory in bytes. The suffix\n"
" K, M and G can be used (ex: 1K means 1024).\n"
" default=%u\n", IVSHMEM_SERVER_DEFAULT_SHM_SIZE);
fprintf(stderr, " -n <n_vects>: number of vectors.\n"
" default=%u\n", IVSHMEM_SERVER_DEFAULT_N_VECTORS);

exit(code);
printf("Usage: %s [OPTION]...\n"
" -h: show this help\n"
" -v: verbose mode\n"
" -F: foreground mode (default is to daemonize)\n"
" -p <pid-file>: path to the PID file (used in daemon mode only)\n"
" default " IVSHMEM_SERVER_DEFAULT_PID_FILE "\n"
" -S <unix-socket-path>: path to the unix socket to listen to\n"
" default " IVSHMEM_SERVER_DEFAULT_UNIX_SOCK_PATH "\n"
" -m <shm-path>: POSIX shared memory object name or a hugetlbfs mount point\n"
" default " IVSHMEM_SERVER_DEFAULT_SHM_PATH "\n"
" -l <size>: size of shared memory in bytes\n"
" suffixes K, M and G can be used, e.g. 1K means 1024\n"
" default %u\n"
" -n <nvectors>: number of vectors\n"
" default %u\n",
progname, IVSHMEM_SERVER_DEFAULT_SHM_SIZE,
IVSHMEM_SERVER_DEFAULT_N_VECTORS);
}

static void
ivshmem_server_help(const char *progname)
{
fprintf(stderr, "Try '%s -h' for more information.\n", progname);
}

/* parse the program arguments, exit on error */
Expand All @@ -68,20 +69,12 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int argc, char *argv[])
unsigned long long v;
Error *err = NULL;

while ((c = getopt(argc, argv,
"h" /* help */
"v" /* verbose */
"F" /* foreground */
"p:" /* pid_file */
"S:" /* unix_socket_path */
"m:" /* shm_path */
"l:" /* shm_size */
"n:" /* n_vectors */
)) != -1) {
while ((c = getopt(argc, argv, "hvFp:S:m:l:n:")) != -1) {

switch (c) {
case 'h': /* help */
ivshmem_server_usage(argv[0], 0);
ivshmem_server_usage(argv[0]);
exit(0);
break;

case 'v': /* verbose */
Expand All @@ -92,49 +85,54 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int argc, char *argv[])
args->foreground = 1;
break;

case 'p': /* pid_file */
case 'p': /* pid file */
args->pid_file = optarg;
break;

case 'S': /* unix_socket_path */
case 'S': /* unix socket path */
args->unix_socket_path = optarg;
break;

case 'm': /* shm_path */
case 'm': /* shm path */
args->shm_path = optarg;
break;

case 'l': /* shm_size */
case 'l': /* shm size */
parse_option_size("shm_size", optarg, &args->shm_size, &err);
if (err) {
error_report_err(err);
ivshmem_server_usage(argv[0], 1);
ivshmem_server_help(argv[0]);
exit(1);
}
break;

case 'n': /* n_vectors */
case 'n': /* number of vectors */
if (parse_uint_full(optarg, &v, 0) < 0) {
fprintf(stderr, "cannot parse n_vectors\n");
ivshmem_server_usage(argv[0], 1);
ivshmem_server_help(argv[0]);
exit(1);
}
args->n_vectors = v;
break;

default:
ivshmem_server_usage(argv[0], 1);
ivshmem_server_usage(argv[0]);
exit(1);
break;
}
}

if (args->n_vectors > IVSHMEM_SERVER_MAX_VECTORS) {
fprintf(stderr, "too many requested vectors (max is %d)\n",
IVSHMEM_SERVER_MAX_VECTORS);
ivshmem_server_usage(argv[0], 1);
ivshmem_server_help(argv[0]);
exit(1);
}

if (args->verbose == 1 && args->foreground == 0) {
fprintf(stderr, "cannot use verbose in daemon mode\n");
ivshmem_server_usage(argv[0], 1);
ivshmem_server_help(argv[0]);
exit(1);
}
}

Expand Down

0 comments on commit e3ad729

Please sign in to comment.