forked from openvswitch/ovs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
daemon: Close standard file descriptors after detach for windows.
In the unit tests, we check for some logs stored in stderr. In case of windows, unit tests fail because the child writes additional information into stderr because it does not have it closed. This commit closes standard file descriptors for windows too. Because the functions related to closing file descriptors is common for both windows and unix, add it to the common daemonization file daemon.c Signed-off-by: Gurucharan Shetty <[email protected]> Acked-by: Ben Pfaff <[email protected]>
- Loading branch information
Showing
5 changed files
with
94 additions
and
66 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* Copyright (c) 2014 Nicira, Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
#include <config.h> | ||
#include "daemon.h" | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <unistd.h> | ||
#include "vlog.h" | ||
|
||
VLOG_DEFINE_THIS_MODULE(daemon); | ||
|
||
/* For each of the standard file descriptors, whether to replace it by | ||
* /dev/null (if false) or keep it for the daemon to use (if true). */ | ||
static bool save_fds[3]; | ||
|
||
/* A daemon doesn't normally have any use for the file descriptors for stdin, | ||
* stdout, and stderr after it detaches. To keep these file descriptors from | ||
* e.g. holding an SSH session open, by default detaching replaces each of | ||
* these file descriptors by /dev/null. But a few daemons expect the user to | ||
* redirect stdout or stderr to a file, in which case it is desirable to keep | ||
* these file descriptors. This function, therefore, disables replacing 'fd' | ||
* by /dev/null when the daemon detaches. */ | ||
void | ||
daemon_save_fd(int fd) | ||
{ | ||
ovs_assert(fd == STDIN_FILENO || | ||
fd == STDOUT_FILENO || | ||
fd == STDERR_FILENO); | ||
save_fds[fd] = true; | ||
} | ||
|
||
/* 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). */ | ||
static int | ||
get_null_fd(void) | ||
{ | ||
static int null_fd; | ||
#ifndef _WIN32 | ||
char *device = "/dev/null"; | ||
#else | ||
char *device = "nul"; | ||
#endif | ||
|
||
if (!null_fd) { | ||
null_fd = open(device, O_RDWR); | ||
if (null_fd < 0) { | ||
int error = errno; | ||
VLOG_ERR("could not open %s: %s", device, ovs_strerror(error)); | ||
null_fd = -error; | ||
} | ||
} | ||
|
||
return null_fd; | ||
} | ||
|
||
/* Close standard file descriptors (except any that the client has requested we | ||
* leave open by calling daemon_save_fd()). If we're started from e.g. an SSH | ||
* session, then this keeps us from holding that session open artificially. */ | ||
void | ||
close_standard_fds(void) | ||
{ | ||
int null_fd = get_null_fd(); | ||
if (null_fd >= 0) { | ||
int fd; | ||
|
||
for (fd = 0; fd < 3; fd++) { | ||
if (!save_fds[fd]) { | ||
dup2(null_fd, fd); | ||
} | ||
} | ||
} | ||
|
||
/* Disable logging to stderr to avoid wasting CPU time. */ | ||
vlog_set_levels(NULL, VLF_CONSOLE, VLL_OFF); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters