#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,
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;
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
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);
unixctl_command_register("exit", ovsdb_server_exit, &exiting);
if (do_chdir) {
- chdir("/");
+ ignore(chdir("/"));
}
exiting = false;