+ /* 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
+ * 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();
+
+ error = ovsdb_file_open(file_name, false, &db);