projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
CA-37154: vswitch: Use MAC address of tagged PIF for VLAN fake-bridge
[openvswitch]
/
ofproto
/
executer.c
diff --git
a/ofproto/executer.c
b/ofproto/executer.c
index 87b76526c38422e946e05746b66802edf3f08a47..b78b0df09714bcf7f8026f490887d62d13c2f3b4 100644
(file)
--- a/
ofproto/executer.c
+++ b/
ofproto/executer.c
@@
-71,10
+71,7
@@
struct executer {
};
/* File descriptors for waking up when a child dies. */
};
/* 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);
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();
* 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(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);
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;
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));
/* 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]);
}
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. */
}
/* 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);
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));
}
}