projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bridge: Always wait for MAC learning table and ports.
[openvswitch]
/
lib
/
process.c
diff --git
a/lib/process.c
b/lib/process.c
index a5f83b46ed6da26505c19f117373698b96aba9c5..8263437c136ce2c86d94937ae96cd6a006f24791 100644
(file)
--- a/
lib/process.c
+++ b/
lib/process.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010
, 2011
Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@
-36,6
+36,11
@@
VLOG_DEFINE_THIS_MODULE(process);
VLOG_DEFINE_THIS_MODULE(process);
+COVERAGE_DEFINE(process_run);
+COVERAGE_DEFINE(process_run_capture);
+COVERAGE_DEFINE(process_sigchld);
+COVERAGE_DEFINE(process_start);
+
struct process {
struct list node;
char *name;
struct process {
struct list node;
char *name;
@@
-190,6
+195,7
@@
process_start(char **argv,
struct process **pp)
{
sigset_t oldsigs;
struct process **pp)
{
sigset_t oldsigs;
+ int nullfd;
pid_t pid;
int error;
pid_t pid;
int error;
@@
-200,6
+206,15
@@
process_start(char **argv,
return error;
}
return error;
}
+ if (n_null_fds) {
+ nullfd = get_null_fd();
+ if (nullfd < 0) {
+ return -nullfd;
+ }
+ } else {
+ nullfd = -1;
+ }
+
block_sigchld(&oldsigs);
pid = fork();
if (pid < 0) {
block_sigchld(&oldsigs);
pid = fork();
if (pid < 0) {
@@
-220,15
+235,17
@@
process_start(char **argv,
unblock_sigchld(&oldsigs);
for (fd = 0; fd < fd_max; fd++) {
if (is_member(fd, null_fds, n_null_fds)) {
unblock_sigchld(&oldsigs);
for (fd = 0; fd < fd_max; fd++) {
if (is_member(fd, null_fds, n_null_fds)) {
- /* We can't use get_null_fd() here because we might have
- * already closed its fd. */
- int nullfd = open("/dev/null", O_RDWR);
dup2(nullfd, fd);
dup2(nullfd, fd);
- close(nullfd);
-
} else if (fd >= 3
&& !is_member(fd, keep_fds, n_keep_fds)) {
+ } else if (fd >= 3 && fd != nullfd
+
&& !is_member(fd, keep_fds, n_keep_fds)) {
close(fd);
}
}
close(fd);
}
}
+ if (nullfd >= 0
+ && !is_member(nullfd, keep_fds, n_keep_fds)
+ && !is_member(nullfd, null_fds, n_null_fds)) {
+ close(nullfd);
+ }
execvp(argv[0], argv);
fprintf(stderr, "execvp(\"%s\") failed: %s\n",
argv[0], strerror(errno));
execvp(argv[0], argv);
fprintf(stderr, "execvp(\"%s\") failed: %s\n",
argv[0], strerror(errno));