mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
Add function get_null_fd(), to reduce code redundancy.
This commit is contained in:
@@ -106,7 +106,7 @@ main(int argc, char *argv[])
|
|||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
/* Make sure that the ezio3 terminfo entry is available. */
|
/* Make sure that the ezio3 terminfo entry is available. */
|
||||||
dummy_fd = open("/dev/null", O_RDWR);
|
dummy_fd = get_null_fd();
|
||||||
if (dummy_fd >= 0) {
|
if (dummy_fd >= 0) {
|
||||||
if (setupterm("ezio3", dummy_fd, &retval) == ERR) {
|
if (setupterm("ezio3", dummy_fd, &retval) == ERR) {
|
||||||
if (retval == 0) {
|
if (retval == 0) {
|
||||||
@@ -118,9 +118,6 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
del_curterm(cur_term);
|
del_curterm(cur_term);
|
||||||
close(dummy_fd);
|
|
||||||
} else {
|
|
||||||
ovs_error(errno, "failed to open /dev/null");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lock serial port. */
|
/* Lock serial port. */
|
||||||
|
@@ -187,6 +187,8 @@ process_start(char **argv,
|
|||||||
unblock_sigchld(&oldsigs);
|
unblock_sigchld(&oldsigs);
|
||||||
for (fd = 0; fd < fd_max; fd++) {
|
for (fd = 0; fd < fd_max; fd++) {
|
||||||
if (is_member(fd, null_fds, n_null_fds)) {
|
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);
|
int nullfd = open("/dev/null", O_RDWR);
|
||||||
dup2(nullfd, fd);
|
dup2(nullfd, fd);
|
||||||
close(nullfd);
|
close(nullfd);
|
||||||
|
@@ -299,6 +299,24 @@ guess_netmask(uint32_t ip)
|
|||||||
: htonl(0)); /* ??? */
|
: htonl(0)); /* ??? */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns a readable and writable fd for /dev/null, if successful, otherwise
|
||||||
|
* a negative errno value. The caller must not close the returned fd (because
|
||||||
|
* the same fd will be handed out to subsequent callers). */
|
||||||
|
int
|
||||||
|
get_null_fd(void)
|
||||||
|
{
|
||||||
|
static int null_fd = -1;
|
||||||
|
if (null_fd < 0) {
|
||||||
|
null_fd = open("/dev/null", O_RDWR);
|
||||||
|
if (null_fd < 0) {
|
||||||
|
int error = errno;
|
||||||
|
VLOG_ERR("could not open /dev/null: %s", strerror(error));
|
||||||
|
return -error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null_fd;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
read_fully(int fd, void *p_, size_t size, size_t *bytes_read)
|
read_fully(int fd, void *p_, size_t size, size_t *bytes_read)
|
||||||
{
|
{
|
||||||
|
@@ -32,6 +32,7 @@ int make_unix_socket(int style, bool nonblock, bool passcred,
|
|||||||
const char *bind_path, const char *connect_path);
|
const char *bind_path, const char *connect_path);
|
||||||
int get_unix_name_len(socklen_t sun_len);
|
int get_unix_name_len(socklen_t sun_len);
|
||||||
uint32_t guess_netmask(uint32_t ip);
|
uint32_t guess_netmask(uint32_t ip);
|
||||||
|
int get_null_fd(void);
|
||||||
|
|
||||||
int read_fully(int fd, void *, size_t, size_t *bytes_read);
|
int read_fully(int fd, void *, size_t, size_t *bytes_read);
|
||||||
int write_fully(int fd, const void *, size_t, size_t *bytes_written);
|
int write_fully(int fd, const void *, size_t, size_t *bytes_written);
|
||||||
|
@@ -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];
|
static int signal_fds[2] = {-1, -1};
|
||||||
|
|
||||||
/* File descriptor for /dev/null. */
|
|
||||||
static int null_fd = -1;
|
|
||||||
|
|
||||||
static void send_child_status(struct rconn *, uint32_t xid, uint32_t status,
|
static void send_child_status(struct rconn *, uint32_t xid, uint32_t status,
|
||||||
const void *data, size_t size);
|
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
|
* subprocesses at once? Would also want to catch fatal signals and
|
||||||
* kill them at the same time though. */
|
* kill them at the same time though. */
|
||||||
fatal_signal_fork();
|
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();
|
max_fds = get_max_fds();
|
||||||
for (i = 3; i < max_fds; i++) {
|
for (i = 3; i < max_fds; i++) {
|
||||||
close(i);
|
close(i);
|
||||||
@@ -448,7 +445,13 @@ executer_create(const char *command_acl, const char *command_dir,
|
|||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
||||||
*executerp = NULL;
|
*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. */
|
/* Create pipe for notifying us that SIGCHLD was invoked. */
|
||||||
if (pipe(signal_fds)) {
|
if (pipe(signal_fds)) {
|
||||||
VLOG_ERR("pipe failed: %s", strerror(errno));
|
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[0]);
|
||||||
set_nonblocking(signal_fds[1]);
|
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. */
|
||||||
|
Reference in New Issue
Block a user