#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 ovsdb *db;
const char *name;
char *file_name;
- bool do_chdir;
bool exiting;
int retval;
size_t i;
parse_options(argc, argv, &file_name, &active, &passive, &unixctl_path);
- 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
- * sockets in the current working directory after we daemonize. We
- * can't open the database before we daemonize because file locks
- * aren't inherited by child processes. */
- do_chdir = true;
- set_no_chdir();
- } else {
- do_chdir = false;
- }
die_if_already_running();
- daemonize();
+ daemonize_start();
error = ovsdb_file_open(file_name, false, &db);
if (error) {
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++) {
+ struct pstream *pstream;
+ int error;
+
+ error = pstream_open(passive.names[i], &pstream);
+ if (error) {
+ ovs_fatal(error, "failed to listen on \"%s\"", passive.names[i]);
}
+ ovsdb_jsonrpc_server_listen(jsonrpc, pstream);
}
svec_destroy(&active);
svec_destroy(&passive);
ovs_fatal(retval, "could not listen for control connections");
}
- unixctl_command_register("exit", ovsdb_server_exit, &exiting);
+ daemonize_complete();
- if (do_chdir) {
- chdir("/");
- }
+ unixctl_command_register("exit", ovsdb_server_exit, &exiting);
exiting = false;
while (!exiting) {
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];