debian: Move openvswitch-dbg to "debug" section.
[openvswitch] / ovsdb / ovsdb-server.c
index f63081369183245a169e93bd27837249e6a1a43d..3bd5bc50c723aff295d607ab4862f5778fad658a 100644 (file)
@@ -44,8 +44,6 @@
 #include "vlog.h"
 #define THIS_MODULE VLM_ovsdb_server
 
-static const struct jsonrpc_server_cbs ovsdb_jsonrpc_cbs;
-
 static unixctl_cb_func ovsdb_server_exit;
 
 static void parse_options(int argc, char *argv[], char **file_namep,
@@ -60,6 +58,7 @@ main(int argc, char *argv[])
     struct unixctl_server *unixctl;
     struct ovsdb_jsonrpc_server *jsonrpc;
     struct svec active, passive;
+    struct pstream **listeners;
     struct ovsdb_error *error;
     struct ovsdb *db;
     const char *name;
@@ -78,6 +77,18 @@ main(int argc, char *argv[])
 
     parse_options(argc, argv, &file_name, &active, &passive, &unixctl_path);
 
+    /* Open all the passive sockets before detaching, to avoid race with
+     * processes that start up later. */
+    listeners = xmalloc(passive.n * sizeof *listeners);
+    for (i = 0; i < passive.n; i++) {
+        int error;
+
+        error = pstream_open(passive.names[i], &listeners[i]);
+        if (error) {
+            ovs_fatal(error, "failed to listen on \"%s\"", passive.names[i]);
+        }
+    }
+
     if (get_detach() && is_chdir_enabled()) {
         /* We need to skip chdir("/") in daemonize() and do it later, because
          * we need to open the database and possible set up up Unix domain
@@ -101,11 +112,8 @@ main(int argc, char *argv[])
     SVEC_FOR_EACH (i, name, &active) {
         ovsdb_jsonrpc_server_connect(jsonrpc, name);
     }
-    SVEC_FOR_EACH (i, name, &passive) {
-        retval = ovsdb_jsonrpc_server_listen(jsonrpc, name);
-        if (retval) {
-            ovs_fatal(retval, "failed to listen on %s", name);
-        }
+    for (i = 0; i < passive.n; i++) {
+        ovsdb_jsonrpc_server_listen(jsonrpc, listeners[i]);
     }
     svec_destroy(&active);
     svec_destroy(&passive);
@@ -118,7 +126,7 @@ main(int argc, char *argv[])
     unixctl_command_register("exit", ovsdb_server_exit, &exiting);
 
     if (do_chdir) {
-        chdir("/");
+        ignore(chdir("/"));
     }
 
     exiting = false;
@@ -217,9 +225,11 @@ parse_options(int argc, char *argv[], char **file_namep,
     argc -= optind;
     argv += optind;
 
-    if (argc != 1) {
+    if (argc > 1) {
         ovs_fatal(0, "database file is only non-option argument; "
                 "use --help for usage");
+    } else if (argc < 1) {
+        ovs_fatal(0, "missing database file argument; use --help for usage");
     }
 
     *file_namep = argv[0];