diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/openrc/rc-logger.c | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/src/openrc/rc-logger.c b/src/openrc/rc-logger.c index 974147f9..ae1a9666 100644 --- a/src/openrc/rc-logger.c +++ b/src/openrc/rc-logger.c @@ -46,8 +46,9 @@ #include "misc.h" #include "helpers.h" -#define TMPLOG RC_SVCDIR "/rc.log" -#define DEFAULTLOG "/var/log/rc.log" +#define LOGFILE "/rc.log" +#define TMPLOG RC_SVCDIR LOGFILE +#define DEFAULTLOG "/var/log/" LOGFILE static int signal_pipe[2] = { -1, -1 }; static int fd_stdout = -1; @@ -147,6 +148,12 @@ rc_logger_open(const char *level) FILE *plog = NULL; const char *logfile; int log_error = 0; + char *tmplog = TMPLOG; + char *defaultlog = DEFAULTLOG; +#ifdef RC_USER_SERVICES + char *user_svcdir; + char *user_datadir; +#endif if (!rc_conf_yesno("rc_logger")) return; @@ -173,6 +180,18 @@ rc_logger_open(const char *level) if ((s = fcntl(slave_tty, F_GETFD, 0)) == 0) fcntl(slave_tty, F_SETFD, s | FD_CLOEXEC); +#ifdef RC_USER_SERVICES + if (rc_is_user()) { + user_svcdir = rc_user_svcdir(); + xasprintf(&tmplog, "%s/%s", user_svcdir, LOGFILE); + free(user_svcdir); + + user_datadir = rc_user_datadir(); + xasprintf(&defaultlog, "%s/%s", user_datadir, LOGFILE); + free(user_datadir); + } +#endif + rc_logger_pid = fork(); switch (rc_logger_pid) { case -1: @@ -184,7 +203,7 @@ rc_logger_open(const char *level) signal_pipe[1] = -1; runlevel = level; - if ((log = fopen(TMPLOG, "ae"))) + if ((log = fopen(tmplog, "ae"))) write_time(log, "started"); else { free(logbuf); @@ -234,7 +253,7 @@ rc_logger_open(const char *level) break; } if (logbuf) { - if ((log = fopen(TMPLOG, "ae"))) { + if ((log = fopen(tmplog, "ae"))) { write_time(log, "started"); write_log(fileno(log), logbuf, logbuf_len); } @@ -248,14 +267,14 @@ rc_logger_open(const char *level) /* Append the temporary log to the real log */ logfile = rc_conf_value("rc_log_path"); if (logfile == NULL) - logfile = DEFAULTLOG; - if (!strcmp(logfile, TMPLOG)) { + logfile = defaultlog; + if (!strcmp(logfile, tmplog)) { eerror("Cowardly refusing to concatenate a logfile into itself."); - eerrorx("Please change rc_log_path to something other than %s to get rid of this message", TMPLOG); + eerrorx("Please change rc_log_path to something other than %s to get rid of this message", tmplog); } if ((plog = fopen(logfile, "ae"))) { - if ((log = fopen(TMPLOG, "re"))) { + if ((log = fopen(tmplog, "re"))) { while ((bytes = fread(buffer, sizeof(*buffer), BUFSIZ, log)) > 0) { if (fwrite(buffer, sizeof(*buffer), bytes, plog) < bytes) { log_error = 1; @@ -266,7 +285,7 @@ rc_logger_open(const char *level) fclose(log); } else { log_error = 1; - eerror("Error: fopen(%s) failed: %s", TMPLOG, strerror(errno)); + eerror("Error: fopen(%s) failed: %s", tmplog, strerror(errno)); } fclose(plog); @@ -284,10 +303,10 @@ rc_logger_open(const char *level) /* Try to keep the temporary log in case of errors */ if (!log_error) { if (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0))) - if (unlink(TMPLOG) == -1) - eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno)); - } else if (exists(TMPLOG)) - eerrorx("Warning: temporary logfile left behind: %s", TMPLOG); + if (unlink(tmplog) == -1) + eerror("Error: unlink(%s) failed: %s", tmplog, strerror(errno)); + } else if (exists(tmplog)) + eerrorx("Warning: temporary logfile left behind: %s", tmplog); exit(0); /* NOTREACHED */ @@ -311,4 +330,12 @@ rc_logger_open(const char *level) signal_pipe[0] = -1; break; } + +#ifdef RC_USER_SERVICES + if (rc_is_user()) { + free(tmplog); + free(defaultlog); + } +#endif + } |