X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fexecuter.c;h=e72371a8d770416cf754879baed203df3349304d;hb=67a4917b07031b387beafaedce413b4207214059;hp=87b76526c38422e946e05746b66802edf3f08a47;hpb=8cd4882fd5c3080816a070ad582ef06842f7c482;p=openvswitch diff --git a/ofproto/executer.c b/ofproto/executer.c index 87b76526..e72371a8 100644 --- a/ofproto/executer.c +++ b/ofproto/executer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -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); @@ -435,7 +432,7 @@ executer_rconn_closing(struct executer *e, struct rconn *rconn) } static void -sigchld_handler(int signr UNUSED) +sigchld_handler(int signr OVS_UNUSED) { write(signal_fds[1], "", 1); } @@ -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. */ @@ -515,5 +508,7 @@ executer_set_acl(struct executer *e, const char *acl, const char *dir) free(e->command_acl); e->command_acl = xstrdup(acl); free(e->command_dir); - e->command_dir = xstrdup(dir); + e->command_dir = (dir + ? xstrdup(dir) + : xasprintf("%s/commands", ovs_pkgdatadir)); }