4646#include "misc.h"
4747#include "helpers.h"
4848
49- #define TMPLOG RC_SVCDIR "/rc.log"
50- #define DEFAULTLOG "/var/log/rc.log"
49+ #define LOGFILE "/rc.log"
50+ #define TMPLOG RC_SVCDIR LOGFILE
51+ #define DEFAULTLOG "/var/log/" LOGFILE
5152
5253static int signal_pipe [2 ] = { -1 , -1 };
5354static int fd_stdout = -1 ;
@@ -147,6 +148,12 @@ rc_logger_open(const char *level)
147148 FILE * plog = NULL ;
148149 const char * logfile ;
149150 int log_error = 0 ;
151+ char * tmplog = TMPLOG ;
152+ char * defaultlog = DEFAULTLOG ;
153+ #ifdef RC_USER_SERVICES
154+ char * user_svcdir ;
155+ char * user_datadir ;
156+ #endif
150157
151158 if (!rc_conf_yesno ("rc_logger" ))
152159 return ;
@@ -173,6 +180,18 @@ rc_logger_open(const char *level)
173180 if ((s = fcntl (slave_tty , F_GETFD , 0 )) == 0 )
174181 fcntl (slave_tty , F_SETFD , s | FD_CLOEXEC );
175182
183+ #ifdef RC_USER_SERVICES
184+ if (rc_is_user ()) {
185+ user_svcdir = rc_user_svcdir ();
186+ xasprintf (& tmplog , "%s/%s" , user_svcdir , LOGFILE );
187+ free (user_svcdir );
188+
189+ user_datadir = rc_user_datadir ();
190+ xasprintf (& defaultlog , "%s/%s" , user_datadir , LOGFILE );
191+ free (user_datadir );
192+ }
193+ #endif
194+
176195 rc_logger_pid = fork ();
177196 switch (rc_logger_pid ) {
178197 case -1 :
@@ -184,7 +203,7 @@ rc_logger_open(const char *level)
184203 signal_pipe [1 ] = -1 ;
185204
186205 runlevel = level ;
187- if ((log = fopen (TMPLOG , "ae" )))
206+ if ((log = fopen (tmplog , "ae" )))
188207 write_time (log , "started" );
189208 else {
190209 free (logbuf );
@@ -234,7 +253,7 @@ rc_logger_open(const char *level)
234253 break ;
235254 }
236255 if (logbuf ) {
237- if ((log = fopen (TMPLOG , "ae" ))) {
256+ if ((log = fopen (tmplog , "ae" ))) {
238257 write_time (log , "started" );
239258 write_log (fileno (log ), logbuf , logbuf_len );
240259 }
@@ -248,14 +267,14 @@ rc_logger_open(const char *level)
248267 /* Append the temporary log to the real log */
249268 logfile = rc_conf_value ("rc_log_path" );
250269 if (logfile == NULL )
251- logfile = DEFAULTLOG ;
252- if (!strcmp (logfile , TMPLOG )) {
270+ logfile = defaultlog ;
271+ if (!strcmp (logfile , tmplog )) {
253272 eerror ("Cowardly refusing to concatenate a logfile into itself." );
254- eerrorx ("Please change rc_log_path to something other than %s to get rid of this message" , TMPLOG );
273+ eerrorx ("Please change rc_log_path to something other than %s to get rid of this message" , tmplog );
255274 }
256275
257276 if ((plog = fopen (logfile , "ae" ))) {
258- if ((log = fopen (TMPLOG , "re" ))) {
277+ if ((log = fopen (tmplog , "re" ))) {
259278 while ((bytes = fread (buffer , sizeof (* buffer ), BUFSIZ , log )) > 0 ) {
260279 if (fwrite (buffer , sizeof (* buffer ), bytes , plog ) < bytes ) {
261280 log_error = 1 ;
@@ -266,7 +285,7 @@ rc_logger_open(const char *level)
266285 fclose (log );
267286 } else {
268287 log_error = 1 ;
269- eerror ("Error: fopen(%s) failed: %s" , TMPLOG , strerror (errno ));
288+ eerror ("Error: fopen(%s) failed: %s" , tmplog , strerror (errno ));
270289 }
271290
272291 fclose (plog );
@@ -284,10 +303,10 @@ rc_logger_open(const char *level)
284303 /* Try to keep the temporary log in case of errors */
285304 if (!log_error ) {
286305 if (errno != EROFS && ((strcmp (level , RC_LEVEL_SHUTDOWN ) != 0 ) && (strcmp (level , RC_LEVEL_SYSINIT ) != 0 )))
287- if (unlink (TMPLOG ) == -1 )
288- eerror ("Error: unlink(%s) failed: %s" , TMPLOG , strerror (errno ));
289- } else if (exists (TMPLOG ))
290- eerrorx ("Warning: temporary logfile left behind: %s" , TMPLOG );
306+ if (unlink (tmplog ) == -1 )
307+ eerror ("Error: unlink(%s) failed: %s" , tmplog , strerror (errno ));
308+ } else if (exists (tmplog ))
309+ eerrorx ("Warning: temporary logfile left behind: %s" , tmplog );
291310
292311 exit (0 );
293312 /* NOTREACHED */
@@ -311,4 +330,12 @@ rc_logger_open(const char *level)
311330 signal_pipe [0 ] = -1 ;
312331 break ;
313332 }
333+
334+ #ifdef RC_USER_SERVICES
335+ if (rc_is_user ()) {
336+ free (tmplog );
337+ free (defaultlog );
338+ }
339+ #endif
340+
314341}
0 commit comments