X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fexecuter.c;h=cdbe5bd969848d4b9198c7b1cb9d447cbd8a9f2c;hb=1c617a495fdc6bb91e29bf00df4c837f63d63199;hp=87b76526c38422e946e05746b66802edf3f08a47;hpb=8cd4882fd5c3080816a070ad582ef06842f7c482;p=openvswitch diff --git a/ofproto/executer.c b/ofproto/executer.c index 87b76526..cdbe5bd9 100644 --- a/ofproto/executer.c +++ b/ofproto/executer.c @@ -71,10 +71,7 @@ struct executer { }; /* File descriptors for waking up when a child dies. */ -static int signal_fds[2]; - -/* File descriptor for /dev/null. */ -static int null_fd = -1; +static int signal_fds[2] = {-1, -1}; static void send_child_status(struct rconn *, uint32_t xid, uint32_t status, const void *data, size_t size); @@ -205,9 +202,9 @@ executer_handle_request(struct executer *e, struct rconn *rconn, * subprocesses at once? Would also want to catch fatal signals and * kill them at the same time though. */ fatal_signal_fork(); - dup2(null_fd, 0); + dup2(get_null_fd(), 0); dup2(output_fds[1], 1); - dup2(null_fd, 2); + dup2(get_null_fd(), 2); max_fds = get_max_fds(); for (i = 3; i < max_fds; i++) { close(i); @@ -448,7 +445,13 @@ executer_create(const char *command_acl, const char *command_dir, struct sigaction sa; *executerp = NULL; - if (null_fd == -1) { + if (signal_fds[0] == -1) { + /* Make sure we can get a fd for /dev/null. */ + int null_fd = get_null_fd(); + if (null_fd < 0) { + return -null_fd; + } + /* Create pipe for notifying us that SIGCHLD was invoked. */ if (pipe(signal_fds)) { VLOG_ERR("pipe failed: %s", strerror(errno)); @@ -456,16 +459,6 @@ executer_create(const char *command_acl, const char *command_dir, } set_nonblocking(signal_fds[0]); set_nonblocking(signal_fds[1]); - - /* Open /dev/null. */ - null_fd = open("/dev/null", O_RDWR); - if (null_fd < 0) { - int error = errno; - VLOG_ERR("could not open /dev/null: %s", strerror(error)); - close(signal_fds[0]); - close(signal_fds[1]); - return error; - } } /* Set up signal handler. */ @@ -478,7 +471,7 @@ executer_create(const char *command_acl, const char *command_dir, return errno; } - e = xcalloc(1, sizeof *e); + e = xzalloc(sizeof *e); e->command_acl = xstrdup(command_acl); e->command_dir = (command_dir ? xstrdup(command_dir)