diff options
author | Stefan Metzmacher <metze@samba.org> | 2010-01-07 13:29:09 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2010-01-12 12:20:15 +0100 |
commit | 1eb8015ee0fd0ab31f76f69c8ee0943897bc1bad (patch) | |
tree | 0c9826402c81f251f3c74ffb59ef090d00b7a4bd /ctdb | |
parent | 1b0f9c3db7f545ecb0a9a9977cdda935a814dc37 (diff) | |
download | samba-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.c | 48 |
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; } |