X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fcommand-line.c;h=7800c0b6ee6fe8da2e21682cee2cafad2fe29ad7;hb=01cdb3a111ca9613c8dd5a33aaf752d8ad746f87;hp=17344c36aaf9efbf8dc8c592fbf1ba8278fd3a93;hpb=c69ee87c10818267f991236201150b1fa51ae519;p=sliver-openvswitch.git diff --git a/lib/command-line.c b/lib/command-line.c index 17344c36a..7800c0b6e 100644 --- a/lib/command-line.c +++ b/lib/command-line.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,11 @@ #include #include #include +#include "ovs-thread.h" #include "util.h" +#include "vlog.h" + +VLOG_DEFINE_THIS_MODULE(command_line); /* Given the GNU-style long options in 'options', returns a string that may be * passed to getopt() with the corresponding short options. The caller is @@ -29,7 +33,7 @@ long_options_to_short_options(const struct option options[]) { char short_options[UCHAR_MAX * 3 + 1]; char *p = short_options; - + for (; options->name; options++) { const struct option *o = options; if (o->flag == NULL && o->val > 0 && o->val <= UCHAR_MAX) { @@ -43,7 +47,7 @@ long_options_to_short_options(const struct option options[]) } } *p = '\0'; - + return xstrdup(short_options); } @@ -66,30 +70,30 @@ run_command(int argc, char *argv[], const struct command commands[]) if (!strcmp(p->name, argv[0])) { int n_arg = argc - 1; if (n_arg < p->min_args) { - ovs_fatal(0, "'%s' command requires at least %d arguments", - p->name, p->min_args); + VLOG_FATAL( "'%s' command requires at least %d arguments", + p->name, p->min_args); } else if (n_arg > p->max_args) { - ovs_fatal(0, "'%s' command takes at most %d arguments", - p->name, p->max_args); + VLOG_FATAL("'%s' command takes at most %d arguments", + p->name, p->max_args); } else { p->handler(argc, argv); if (ferror(stdout)) { - ovs_fatal(0, "write to stdout failed"); + VLOG_FATAL("write to stdout failed"); } if (ferror(stderr)) { - ovs_fatal(0, "write to stderr failed"); + VLOG_FATAL("write to stderr failed"); } return; } } } - ovs_fatal(0, "unknown command '%s'; use --help for help", argv[0]); + VLOG_FATAL("unknown command '%s'; use --help for help", argv[0]); } /* Process title. */ -#ifdef __linux__ +#ifdef LINUX_DATAPATH static char *argv_start; /* Start of command-line arguments in memory. */ static size_t argv_size; /* Number of bytes of command-line arguments. */ static char *saved_proctitle; /* Saved command-line arguments. */ @@ -107,6 +111,7 @@ proctitle_init(int argc, char **argv) { int i; + assert_single_threaded(); if (!argc || !argv[0]) { /* This situation should never occur, but... */ return; @@ -137,8 +142,8 @@ proctitle_init(int argc, char **argv) } } -/* Changes the name of the process, as shown by "ps", to 'format', which is - * formatted as if by printf(). */ +/* Changes the name of the process, as shown by "ps", to the program name + * followed by 'format', which is formatted as if by printf(). */ void proctitle_set(const char *format, ...) { @@ -154,7 +159,10 @@ proctitle_set(const char *format, ...) } va_start(args, format); - n = vsnprintf(argv_start, argv_size, format, args); + n = snprintf(argv_start, argv_size, "%s: ", program_name); + if (n < argv_size) { + n += vsnprintf(argv_start + n, argv_size - n, format, args); + } if (n >= argv_size) { /* The name is too long, so add an ellipsis at the end. */ strcpy(&argv_start[argv_size - 4], "..."); @@ -176,7 +184,7 @@ proctitle_restore(void) saved_proctitle = NULL; } } -#else /* !__linux__ */ +#else /* !LINUX_DATAPATH*/ /* Stubs that don't do anything on non-Linux systems. */ void @@ -184,13 +192,16 @@ proctitle_init(int argc OVS_UNUSED, char **argv OVS_UNUSED) { } +#if !(defined(__FreeBSD__) || defined(__NetBSD__)) +/* On these platforms we #define this to setproctitle. */ void proctitle_set(const char *format OVS_UNUSED, ...) { } +#endif void proctitle_restore(void) { } -#endif /* !__linux__ */ +#endif /* !LINUX_DATAPATH */