/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "timeval.h"
#include "unixctl.h"
#include "util.h"
+#include "vlog.h"
static void usage(void);
static const char *parse_command_line(int argc, char *argv[]);
}
if (cmd_error) {
+ jsonrpc_close(client);
fputs(cmd_error, stderr);
ovs_error(0, "%s: server returned an error", target);
exit(2);
} else if (cmd_result) {
fputs(cmd_result, stdout);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
jsonrpc_close(client);
Targets:\n\
-t, --target=TARGET pidfile or socket to contact\n\
Common commands:\n\
- help List commands supported by the target\n\
+ list-commands List commands supported by the target\n\
version Print version of the target\n\
vlog/list List current logging levels\n\
vlog/set [SPEC]\n\
'off', 'emer', 'err', 'warn', 'info', or 'dbg' ('dbg', bydefault)\n\
vlog/reopen Make the program reopen its log file\n\
Other options:\n\
+ --timeout=SECS wait at most SECS seconds for a response\n\
-h, --help Print this helpful information\n\
-V, --version Display ovs-appctl version information\n",
program_name, program_name);
static const char *
parse_command_line(int argc, char *argv[])
{
+ enum {
+ OPT_START = UCHAR_MAX + 1,
+ VLOG_OPTION_ENUMS
+ };
static const struct option long_options[] = {
{"target", required_argument, NULL, 't'},
{"execute", no_argument, NULL, 'e'},
{"help", no_argument, NULL, 'h'},
+ {"option", no_argument, NULL, 'o'},
{"version", no_argument, NULL, 'V'},
+ {"timeout", required_argument, NULL, 'T'},
+ VLOG_LONG_OPTIONS,
{NULL, 0, NULL, 0},
};
+ char *short_options_ = long_options_to_short_options(long_options);
+ char *short_options = xasprintf("+%s", short_options_);
const char *target;
int e_options;
for (;;) {
int option;
- option = getopt_long(argc, argv, "+t:hVe", long_options, NULL);
+ option = getopt_long(argc, argv, short_options, long_options, NULL);
if (option == -1) {
break;
}
usage();
break;
+ case 'o':
+ print_options(long_options);
+ exit(EXIT_SUCCESS);
+
+ case 'T':
+ time_alarm(atoi(optarg));
+ break;
+
case 'V':
ovs_print_version(0, 0);
exit(EXIT_SUCCESS);
+ VLOG_OPTION_HANDLERS
+
case '?':
exit(EXIT_FAILURE);
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
+ free(short_options_);
+ free(short_options);
if (optind >= argc) {
ovs_fatal(0, "at least one non-option argument is required "
char *socket_name;
int error;
+#ifndef _WIN32
if (target[0] != '/') {
char *pidfile_name;
pid_t pid;
free(pidfile_name);
socket_name = xasprintf("%s/%s.%ld.ctl",
ovs_rundir(), target, (long int) pid);
+#else
+ /* On windows, if the 'target' contains ':', we make an assumption that
+ * it is an absolute path. */
+ if (!strchr(target, ':')) {
+ socket_name = xasprintf("%s/%s.ctl", ovs_rundir(), target);
+#endif
} else {
socket_name = xstrdup(target);
}