X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=daemon.c;h=ddfe680cebc63dc1c7af89fde333c665873765eb;hp=e47639bc42864cc4881d5992bb567e902f4752ac;hb=7f08e8b0eb9570f1eb787dbb4e10d56585b36bbf;hpb=d31995b3074bb19aa4da66ce5c4774ca9ed101a1;ds=sidebyside diff --git a/daemon.c b/daemon.c index e47639bc..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); @@ -234,15 +241,18 @@ void daemon_close_log(void) */ void daemon_open_log_or_die(void) { - daemon_close_log(); + FILE *new_log; + if (!me->logfile_name) return; - me->logfile = fopen(me->logfile_name, "a"); - if (!me->logfile) { + new_log = fopen(me->logfile_name, "a"); + if (!new_log) { PARA_EMERG_LOG("can not open %s: %s\n", me->logfile_name, strerror(errno)); exit(EXIT_FAILURE); } + daemon_close_log(); + me->logfile = new_log; /* equivalent to setlinebuf(), but portable */ setvbuf(me->logfile, NULL, _IOLBF, 0); }