From: Andre Noll Date: Sun, 31 Dec 2017 20:56:35 +0000 (+0100) Subject: daemon: Fix log reload for relative paths. X-Git-Tag: v0.6.2~35 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=bde44cf34bd9b334892af6ef4731ecb74b1ab544;p=paraslash.git daemon: Fix log reload for relative paths. If the argument to --logfile is a relative path, it is interpreted as relative to the current working directory. In daemon mode, the current working directory is changed to / during startup. Hence, when para_server re-opens the log file after it received SIGHUP, the logfile path will now be interpreted as relative to the the root of the file system. Fix this by remembering the original current working directory. Opening "." as recommended in getcwd(3) is not an option here since the whole point of changing the cwd to / is to prevent the daemon from keeping the cwd busy. --- diff --git a/daemon.c b/daemon.c index 49d2e100..ddfe680c 100644 --- a/daemon.c +++ b/daemon.c @@ -30,6 +30,7 @@ struct daemon { char *hostname; /** Used for colored log messages. */ char log_colors[NUM_LOGLEVELS][COLOR_MAXLEN]; + char *old_cwd; }; static struct daemon the_daemon, *me = &the_daemon; @@ -117,7 +118,12 @@ void daemon_set_logfile(const char *logfile_name) { free(me->logfile_name); me->logfile_name = NULL; - if (logfile_name) + if (!logfile_name) + return; + if (me->old_cwd && logfile_name[0] != '/') + me->logfile_name = make_message("%s/%s", me->old_cwd, + logfile_name); + else me->logfile_name = para_strdup(logfile_name); } @@ -197,6 +203,7 @@ int daemonize(bool parent_waits) /* become session leader */ if (setsid() < 0) goto err; + me->old_cwd = getcwd(NULL, 0); if (chdir("/") < 0) goto err; null = open("/dev/null", O_RDWR);