summaryrefslogtreecommitdiffstats
path: root/ctdb
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2010-01-07 13:29:09 +0100
committerStefan Metzmacher <metze@samba.org>2010-01-12 12:20:15 +0100
commit1eb8015ee0fd0ab31f76f69c8ee0943897bc1bad (patch)
tree0c9826402c81f251f3c74ffb59ef090d00b7a4bd /ctdb
parent1b0f9c3db7f545ecb0a9a9977cdda935a814dc37 (diff)
downloadsamba-1eb8015ee0fd0ab31f76f69c8ee0943897bc1bad.tar.gz
samba-1eb8015ee0fd0ab31f76f69c8ee0943897bc1bad.tar.xz
samba-1eb8015ee0fd0ab31f76f69c8ee0943897bc1bad.zip
server: call event_add_fd at the end of ctdb_set_child_logging()
metze (This used to be ctdb commit 608e0765130aa9bca0aa77db5a888c413867a3fd)
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/server/ctdb_logging.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/ctdb/server/ctdb_logging.c b/ctdb/server/ctdb_logging.c
index 9d09aa2470..56dcfa2857 100644
--- a/ctdb/server/ctdb_logging.c
+++ b/ctdb/server/ctdb_logging.c
@@ -486,9 +486,9 @@ free_log:
int ctdb_set_child_logging(struct ctdb_context *ctdb)
{
int p[2];
- int ret;
+ int old_stdout, old_stderr;
- if (ctdb->log->fd == 1) {
+ if (ctdb->log->fd == STDOUT_FILENO) {
/* not needed for stdout logging */
return 0;
}
@@ -499,31 +499,39 @@ int ctdb_set_child_logging(struct ctdb_context *ctdb)
return -1;
}
+ /* We'll fail if stderr/stdout not already open; it's simpler. */
+ old_stdout = dup(STDOUT_FILENO);
+ old_stderr = dup(STDERR_FILENO);
+ if (dup2(p[1], STDOUT_FILENO) < 0 || dup2(p[1], STDERR_FILENO) < 0) {
+ int saved_errno = errno;
+ dup2(old_stdout, STDOUT_FILENO);
+ dup2(old_stderr, STDERR_FILENO);
+ close(old_stdout);
+ close(old_stderr);
+ close(p[0]);
+ close(p[1]);
+ errno = saved_errno;
+
+ printf(__location__ " dup2 failed: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ close(p[1]);
+ close(old_stdout);
+ close(old_stderr);
+
+ /* Is this correct for STDOUT and STDERR ? */
+ set_close_on_exec(STDOUT_FILENO);
+ set_close_on_exec(STDERR_FILENO);
+ set_close_on_exec(p[0]);
+
event_add_fd(ctdb->ev, ctdb->log, p[0],
EVENT_FD_READ | EVENT_FD_AUTOCLOSE,
ctdb_log_handler, ctdb->log);
- set_close_on_exec(p[0]);
ctdb->log->pfd = p[0];
DEBUG(DEBUG_NOTICE, (__location__ " Created PIPE FD:%d for logging\n", p[0]));
- close(1);
- close(2);
- if (p[1] != 1) {
- ret = dup2(p[1], 1);
- if (ret == -1) {
- printf("dup2 failed: %s\n", strerror(errno));
- return -1;
- }
- close(p[1]);
- }
- /* also catch stderr of subcommands to the log */
- ret = dup2(1, 2);
- if (ret == -1) {
- printf("dup2 failed: %s\n", strerror(errno));
- return -1;
- }
-
return 0;
}