projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
datapath: Check for backported dev_get_by_index_rcu().
[openvswitch]
/
lib
/
process.c
diff --git
a/lib/process.c
b/lib/process.c
index 12168f7e21289cd07fc65db66f89078d65d3e9cf..8263437c136ce2c86d94937ae96cd6a006f24791 100644
(file)
--- a/
lib/process.c
+++ b/
lib/process.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (c) 2008, 2009 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.
@@
-32,10
+32,15
@@
#include "poll-loop.h"
#include "socket-util.h"
#include "util.h"
#include "poll-loop.h"
#include "socket-util.h"
#include "util.h"
-
-#define THIS_MODULE VLM_process
#include "vlog.h"
#include "vlog.h"
+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;
@@
-55,7
+60,7
@@
static struct list all_processes = LIST_INITIALIZER(&all_processes);
static bool sigchld_is_blocked(void);
static void block_sigchld(sigset_t *);
static void unblock_sigchld(const sigset_t *);
static bool sigchld_is_blocked(void);
static void block_sigchld(sigset_t *);
static void unblock_sigchld(const sigset_t *);
-static void sigchld_handler(int signr UNUSED);
+static void sigchld_handler(int signr
OVS_
UNUSED);
static bool is_member(int x, const int *array, size_t);
/* Initializes the process subsystem (if it is not already initialized). Calls
static bool is_member(int x, const int *array, size_t);
/* Initializes the process subsystem (if it is not already initialized). Calls
@@
-103,7
+108,7
@@
process_escape_args(char **argv)
if (argp != argv) {
ds_put_char(&ds, ' ');
}
if (argp != argv) {
ds_put_char(&ds, ' ');
}
- if (arg[strcspn(arg, " \t\r\n\v\\")]) {
+ if (arg[strcspn(arg, " \t\r\n\v\\
\'\"
")]) {
ds_put_char(&ds, '"');
for (p = arg; *p; p++) {
if (*p == '\\' || *p == '\"') {
ds_put_char(&ds, '"');
for (p = arg; *p; p++) {
if (*p == '\\' || *p == '\"') {
@@
-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,18
+206,24
@@
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);
block_sigchld(&oldsigs);
- fatal_signal_block();
pid = fork();
if (pid < 0) {
pid = fork();
if (pid < 0) {
- fatal_signal_unblock();
unblock_sigchld(&oldsigs);
VLOG_WARN("fork failed: %s", strerror(errno));
return errno;
} else if (pid) {
/* Running in parent process. */
*pp = process_register(argv[0], pid);
unblock_sigchld(&oldsigs);
VLOG_WARN("fork failed: %s", strerror(errno));
return errno;
} else if (pid) {
/* Running in parent process. */
*pp = process_register(argv[0], pid);
- fatal_signal_unblock();
unblock_sigchld(&oldsigs);
return 0;
} else {
unblock_sigchld(&oldsigs);
return 0;
} else {
@@
-220,19
+232,20
@@
process_start(char **argv,
int fd;
fatal_signal_fork();
int fd;
fatal_signal_fork();
- fatal_signal_unblock();
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));
@@
-419,15
+432,13
@@
stream_open(struct stream *s)
static void
stream_read(struct stream *s)
{
static void
stream_read(struct stream *s)
{
- int error = 0;
-
if (s->fds[0] < 0) {
return;
}
if (s->fds[0] < 0) {
return;
}
- error = 0;
for (;;) {
char buffer[512];
for (;;) {
char buffer[512];
+ int error;
size_t n;
error = read_fully(s->fds[0], buffer, sizeof buffer, &n);
size_t n;
error = read_fully(s->fds[0], buffer, sizeof buffer, &n);
@@
-521,12
+532,10
@@
process_run_capture(char **argv, char **stdout_log, char **stderr_log,
}
block_sigchld(&oldsigs);
}
block_sigchld(&oldsigs);
- fatal_signal_block();
pid = fork();
if (pid < 0) {
pid = fork();
if (pid < 0) {
-
int
error = errno;
+ error = errno;
- fatal_signal_unblock();
unblock_sigchld(&oldsigs);
VLOG_WARN("fork failed: %s", strerror(error));
unblock_sigchld(&oldsigs);
VLOG_WARN("fork failed: %s", strerror(error));
@@
-539,7
+548,6
@@
process_run_capture(char **argv, char **stdout_log, char **stderr_log,
struct process *p;
p = process_register(argv[0], pid);
struct process *p;
p = process_register(argv[0], pid);
- fatal_signal_unblock();
unblock_sigchld(&oldsigs);
close(s_stdout.fds[1]);
unblock_sigchld(&oldsigs);
close(s_stdout.fds[1]);
@@
-575,7
+583,6
@@
process_run_capture(char **argv, char **stdout_log, char **stderr_log,
int i;
fatal_signal_fork();
int i;
fatal_signal_fork();
- fatal_signal_unblock();
unblock_sigchld(&oldsigs);
dup2(get_null_fd(), 0);
unblock_sigchld(&oldsigs);
dup2(get_null_fd(), 0);
@@
-595,12
+602,12
@@
process_run_capture(char **argv, char **stdout_log, char **stderr_log,
}
\f
static void
}
\f
static void
-sigchld_handler(int signr UNUSED)
+sigchld_handler(int signr
OVS_
UNUSED)
{
struct process *p;
COVERAGE_INC(process_sigchld);
{
struct process *p;
COVERAGE_INC(process_sigchld);
- LIST_FOR_EACH (p,
struct process,
node, &all_processes) {
+ LIST_FOR_EACH (p, node, &all_processes) {
if (!p->exited) {
int retval, status;
do {
if (!p->exited) {
int retval, status;
do {