[ovs-dev] [PATCH 2/2] ovs-appctl: Support the daemon name as a target

Justin Pettit jpettit at nicira.com
Thu Sep 17 00:33:35 UTC 2009

It can be inconvenient to be required to type the entire path of the
Unix daemon socket as a target.  This commit allows the name of the
daemon to be used instead, when a pidfile for the daemon exists in the
default location.
 utilities/ovs-appctl.8.in |   19 +++++++++++++++----
 utilities/ovs-appctl.c    |   24 +++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/utilities/ovs-appctl.8.in b/utilities/ovs-appctl.8.in
index 88fb295..a763bc3 100644
--- a/utilities/ovs-appctl.8.in
+++ b/utilities/ovs-appctl.8.in
@@ -16,6 +16,7 @@ ovs\-appctl \- utility for configuring running Open vSwitch daemons
 The available \fItarget\fR options are:
 [\fB-t\fR \fIsocket\fR | \fB--target=\fIsocket\fR]
+[\fB-d\fR \fIdaemon\fR | \fB--daemon=\fIdaemon\fR]
 .sp 1
 The available \fIaction\fR options are:
@@ -29,7 +30,6 @@ The available \fIaction\fR options are:
 The \fBovs\-appctl\fR program connects to one or more running
 Open vSwitch daemons (such as \fBovs\-vswitchd\fR(8)), as specified by the
 user, and sends them commands to query or modify their behavior.
-Its primary purpose is currently to adjust daemons' logging levels.
 \fBovs\-appctl\fR applies one or more actions to each of one or more
 target processes.  Targets may be specified using:
@@ -37,14 +37,25 @@ target processes.  Targets may be specified using:
 .IP "\fB-t \fIsocket\fR"
 .IQ "\fB--target=\fIsocket\fR"
 The specified \fIsocket\fR must be the name of a Unix domain socket
-for a \fBovs\-appctl\fR-controllable process.  If \fIsocket\fR does not
+for an \fBovs\-appctl\fR-controllable process.  If \fIsocket\fR does not
 begin with \fB/\fR, it is treated as relative to \fB at RUNDIR@\fR.
 Each Open vSwitch daemon by default creates a socket named
-\fB at RUNDIR@/\fIprogram\fB.\fIpid\fB.ctl\fR, where \fIprogram\fR is
-the program's name (such as \fBovs\-vswitchd\fR) and \fIpid\fR is the
+\fB at RUNDIR@/\fIdaemon\fB.\fIpid\fB.ctl\fR, where \fIdaemon\fR is
+the daemon's name (such as \fBovs\-vswitchd\fR) and \fIpid\fR is the
 daemon's PID.
+.IP "\fB-d \fIdaemon\fR"
+.IQ "\fB--daemon=\fIdaemon\fR"
+The specified \fIdaemon\fR is the name of a running
+\fBovs\-appctl\fR-controllable process.  A pidfile for the daemon must 
+exist in \fB at RUNDIR@/\fIdaemon\fB.pid\fR, which is the default behavior 
+when starting a daemon with an unadourned \fB--pidfile\fR option.  
+\fBovs\-appctl\fR will use the value from the pidfile to control the 
+daemon with the Unix domain socket in
+\fB at RUNDIR@/\fIdaemon\fB.\fIpid\fB.ctl\fR, where \fIdaemon\fR is the
+given argument and \fIpid\fR is the value from the pidfile.
 The available actions are:
diff --git a/utilities/ovs-appctl.c b/utilities/ovs-appctl.c
index 9349662..0533b92 100644
--- a/utilities/ovs-appctl.c
+++ b/utilities/ovs-appctl.c
@@ -26,6 +26,8 @@
 #include "command-line.h"
 #include "compiler.h"
+#include "daemon.h"
+#include "dirs.h"
 #include "timeval.h"
 #include "unixctl.h"
 #include "util.h"
@@ -36,6 +38,7 @@ usage(char *prog_name, int exit_code)
     printf("Usage: %s [TARGET] [ACTION...]\n"
            "  -t, --target=TARGET  Path to Unix domain socket\n"
+           "  -d, --daemon=DAEMON  Name of daemon\n"
            "  -l, --list         List current settings\n"
            "  -s, --set=MODULE[:FACILITY[:LEVEL]]\n"
@@ -122,6 +125,7 @@ int main(int argc, char *argv[])
     static const struct option long_options[] = {
         /* Target options must come first. */
         {"target", required_argument, NULL, 't'},
+        {"daemon", required_argument, NULL, 'd'},
         {"help", no_argument, NULL, 'h'},
         {"version", no_argument, NULL, 'V'},
@@ -152,7 +156,7 @@ int main(int argc, char *argv[])
         if (option == -1) {
-        if (!strchr("thV", option) && n_clients == 0) {
+        if (!strchr("tdhV", option) && n_clients == 0) {
             ovs_fatal(0, "no targets specified (use --help for help)");
         } else {
@@ -162,6 +166,24 @@ int main(int argc, char *argv[])
             add_target(&clients, &n_clients, optarg, &ok);
+        case 'd': {
+            char *pidfile = NULL;
+            pid_t pid;
+            pidfile = xasprintf("%s/%s.pid", ovs_rundir, optarg);
+            pid = read_pidfile(pidfile);
+            if (pid >= 0) {
+                char *sock_name = xasprintf("%s/%s.%ld.ctl", ovs_rundir,
+                                            optarg, (long int) pid);
+                add_target(&clients, &n_clients, sock_name, &ok);
+                free(sock_name);
+            } else {
+                ovs_fatal(0, "could not read %s", pidfile);
+            }
+            free(pidfile);
+            break;
+        }
         case 'l':
             for (i = 0; i < n_clients; i++) {
                 struct unixctl_client *client = clients[i];

More information about the dev mailing list