logging: use duplicate stderr, instead of re-opening

The special filename "-" is supposed to log to stderr. Instead of
trying to explictly open "/dev/stderr" again (which may not be possible
as permissions might have changed by then), dup the stderr and use
the copy.

It is not a good idea to use @stderr global variable directly, as
ctx->log.logfile is fclose()d in glfs_fini() (was fixed in
http://review.gluster.org/6452)

Change-Id: Ia6c538fe363905588dcf4fc4783804073956a586
BUG: 1088589
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/7607
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Anand Avati 2014-04-29 13:54:53 -07:00 committed by Vijay Bellur
parent 630d46d714
commit 15ea78fffd

View File

@ -737,7 +737,29 @@ gf_log_init (void *data, const char *file, const char *ident)
}
if (strcmp (file, "-") == 0) {
file = "/dev/stderr";
int dupfd = -1;
ctx->log.filename = gf_strdup ("/dev/stderr");
if (!ctx->log.filename) {
fprintf (stderr, "ERROR: strdup failed\n");
return -1;
}
dupfd = dup (fileno (stderr));
if (dupfd == -1) {
fprintf (stderr, "ERROR: could not dup %d (%s)\n",
fileno (stderr), strerror (errno));
return -1;
}
ctx->log.logfile = fdopen (dupfd, "a");
if (!ctx->log.logfile) {
fprintf (stderr, "ERROR: could not fdopen on %d (%s)\n",
dupfd, strerror (errno));
return -1;
}
goto out;
}
ctx->log.filename = gf_strdup (file);
@ -761,7 +783,7 @@ gf_log_init (void *data, const char *file, const char *ident)
file, strerror (errno));
return -1;
}
out:
ctx->log.gf_log_logfile = ctx->log.logfile;
return 0;