2 * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
25 #include "command-line.h"
28 #include "dynamic-string.h"
33 static void usage(void);
34 static const char *parse_command_line(int argc, char *argv[]);
35 static struct unixctl_client *connect_to_target(const char *target);
38 main(int argc, char *argv[])
40 struct unixctl_client *client;
47 set_program_name(argv[0]);
49 /* Parse command line and connect to target. */
50 target = parse_command_line(argc, argv);
51 client = connect_to_target(target);
53 /* Compose request. */
55 for (i = optind; i < argc; i++) {
57 ds_put_char(&request, ' ');
59 ds_put_cstr(&request, argv[i]);
62 /* Transact request and process reply. */
63 error = unixctl_client_transact(client, ds_cstr(&request), &code, &reply);
65 ovs_fatal(error, "%s: transaction error", target);
67 if (code / 100 != 2) {
69 ovs_error(0, "%s: server returned reply code %03d", target, code);
74 unixctl_client_destroy(client);
85 %s, for querying and controlling Open vSwitch daemon\n\
86 usage: %s [TARGET] COMMAND [ARG...]\n\
88 -t, --target=TARGET pidfile or socket to contact\n\
90 help List commands supported by the target\n\
91 vlog/list List current logging levels\n\
92 vlog/set MODULE[:FACILITY[:LEVEL]]\n\
93 Set MODULE and FACILITY log level to LEVEL\n\
94 MODULE may be any valid module name or 'ANY'\n\
95 FACILITY may be 'syslog', 'console', 'file', or 'ANY' (default)\n\
96 LEVEL may be 'off', 'emer', 'err', 'warn', 'info', or 'dbg' (default)\n\
97 vlog/reopen Make the program reopen its log file\n\
99 -h, --help Print this helpful information\n\
100 -V, --version Display version information\n",
101 program_name, program_name);
106 parse_command_line(int argc, char *argv[])
108 static const struct option long_options[] = {
109 {"target", required_argument, NULL, 't'},
110 {"execute", no_argument, NULL, 'e'},
111 {"help", no_argument, NULL, 'h'},
112 {"version", no_argument, NULL, 'V'},
123 option = getopt_long(argc, argv, "+t:hVe", long_options, NULL);
130 ovs_fatal(0, "-t or --target may be specified only once");
136 /* We ignore -e for compatibility. Older versions specified the
137 * command as the argument to -e. Since the current version takes
138 * the command as non-option arguments and we say that -e has no
139 * arguments, this just works in the common case. */
141 ovs_fatal(0, "-e or --execute may be speciifed only once");
150 OVS_PRINT_VERSION(0, 0);
161 if (optind >= argc) {
162 ovs_fatal(0, "at least one non-option argument is required "
163 "(use --help for help)");
166 return target ? target : "ovs-vswitchd";
169 static struct unixctl_client *
170 connect_to_target(const char *target)
172 struct unixctl_client *client;
176 if (target[0] != '/') {
180 pidfile_name = xasprintf("%s/%s.pid", ovs_rundir(), target);
181 pid = read_pidfile(pidfile_name);
183 ovs_fatal(-pid, "cannot read pidfile \"%s\"", pidfile_name);
186 socket_name = xasprintf("%s/%s.%ld.ctl",
187 ovs_rundir(), target, (long int) pid);
189 socket_name = xstrdup(target);
192 error = unixctl_client_create(socket_name, &client);
194 ovs_fatal(error, "cannot connect to \"%s\"", socket_name);