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 version Print version of the target\n\
92 vlog/list List current logging levels\n\
93 vlog/set MODULE[:FACILITY[:LEVEL]]\n\
94 Set MODULE and FACILITY log level to LEVEL\n\
95 MODULE may be any valid module name or 'ANY'\n\
96 FACILITY may be 'syslog', 'console', 'file', or 'ANY' (default)\n\
97 LEVEL may be 'off', 'emer', 'err', 'warn', 'info', or 'dbg' (default)\n\
98 vlog/reopen Make the program reopen its log file\n\
100 -h, --help Print this helpful information\n\
101 -V, --version Display ovs-appctl version information\n",
102 program_name, program_name);
107 parse_command_line(int argc, char *argv[])
109 static const struct option long_options[] = {
110 {"target", required_argument, NULL, 't'},
111 {"execute", no_argument, NULL, 'e'},
112 {"help", no_argument, NULL, 'h'},
113 {"version", no_argument, NULL, 'V'},
124 option = getopt_long(argc, argv, "+t:hVe", long_options, NULL);
131 ovs_fatal(0, "-t or --target may be specified only once");
137 /* We ignore -e for compatibility. Older versions specified the
138 * command as the argument to -e. Since the current version takes
139 * the command as non-option arguments and we say that -e has no
140 * arguments, this just works in the common case. */
142 ovs_fatal(0, "-e or --execute may be speciifed only once");
151 ovs_print_version(0, 0);
162 if (optind >= argc) {
163 ovs_fatal(0, "at least one non-option argument is required "
164 "(use --help for help)");
167 return target ? target : "ovs-vswitchd";
170 static struct unixctl_client *
171 connect_to_target(const char *target)
173 struct unixctl_client *client;
177 if (target[0] != '/') {
181 pidfile_name = xasprintf("%s/%s.pid", ovs_rundir(), target);
182 pid = read_pidfile(pidfile_name);
184 ovs_fatal(-pid, "cannot read pidfile \"%s\"", pidfile_name);
187 socket_name = xasprintf("%s/%s.%ld.ctl",
188 ovs_rundir(), target, (long int) pid);
190 socket_name = xstrdup(target);
193 error = unixctl_client_create(socket_name, &client);
195 ovs_fatal(error, "cannot connect to \"%s\"", socket_name);