Improve logging
Add "e" (O_CLOEXEC) to all fopen() calls. Remove system() call and replace it by fopen() and friends. This also fixes bug 368933 X-Gentoo-Bug: 368933 X-Gentoo-Bug-URL: https://bugs.gentoo.org/368933
This commit is contained in:
		| @@ -57,10 +57,8 @@ | |||||||
| #include "rc.h" | #include "rc.h" | ||||||
| #include "rc-misc.h" | #include "rc-misc.h" | ||||||
|  |  | ||||||
| #define LOGFILE RC_SVCDIR "/rc.log" | #define TMPLOG RC_SVCDIR "/rc.log" | ||||||
| #define PERMLOG "/var/log/rc.log" | #define DEFAULTLOG "/var/log/rc.log" | ||||||
| #define MOVELOG	"cat " LOGFILE " 2>/dev/null >>" PERMLOG " && "		      \ |  | ||||||
| 	"rm -f " LOGFILE |  | ||||||
|  |  | ||||||
| static int signal_pipe[2] = { -1, -1 }; | static int signal_pipe[2] = { -1, -1 }; | ||||||
| static int fd_stdout = -1; | static int fd_stdout = -1; | ||||||
| @@ -149,12 +147,15 @@ rc_logger_open(const char *level) | |||||||
| 	int slave_tty; | 	int slave_tty; | ||||||
| 	struct termios tt; | 	struct termios tt; | ||||||
| 	struct winsize ws; | 	struct winsize ws; | ||||||
| 	char *buffer; | 	char buffer[BUFSIZ]; | ||||||
| 	struct pollfd fd[2]; | 	struct pollfd fd[2]; | ||||||
| 	int s = 0; | 	int s = 0; | ||||||
| 	size_t bytes; | 	size_t bytes; | ||||||
| 	int i; | 	int i; | ||||||
| 	FILE *log = NULL; | 	FILE *log = NULL; | ||||||
|  | 	FILE *plog = NULL; | ||||||
|  | 	const char *logfile; | ||||||
|  | 	int log_error = 0; | ||||||
|  |  | ||||||
| 	if (!rc_conf_yesno("rc_logger")) | 	if (!rc_conf_yesno("rc_logger")) | ||||||
| 		return; | 		return; | ||||||
| @@ -192,7 +193,7 @@ rc_logger_open(const char *level) | |||||||
| 		signal_pipe[1] = -1; | 		signal_pipe[1] = -1; | ||||||
|  |  | ||||||
| 		runlevel = level; | 		runlevel = level; | ||||||
| 		if ((log = fopen(LOGFILE, "a"))) | 		if ((log = fopen(TMPLOG, "ae"))) | ||||||
| 			write_time(log, "started"); | 			write_time(log, "started"); | ||||||
| 		else { | 		else { | ||||||
| 			free(logbuf); | 			free(logbuf); | ||||||
| @@ -201,7 +202,6 @@ rc_logger_open(const char *level) | |||||||
| 			logbuf_len = 0; | 			logbuf_len = 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		buffer = xmalloc(sizeof (char) * BUFSIZ); |  | ||||||
| 		fd[0].fd = signal_pipe[0]; | 		fd[0].fd = signal_pipe[0]; | ||||||
| 		fd[0].events = fd[1].events = POLLIN; | 		fd[0].events = fd[1].events = POLLIN; | ||||||
| 		fd[0].revents = fd[1].revents = 0; | 		fd[0].revents = fd[1].revents = 0; | ||||||
| @@ -242,9 +242,8 @@ rc_logger_open(const char *level) | |||||||
| 			if (fd[0].revents & (POLLIN | POLLHUP)) | 			if (fd[0].revents & (POLLIN | POLLHUP)) | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
| 		free(buffer); |  | ||||||
| 		if (logbuf) { | 		if (logbuf) { | ||||||
| 			if ((log = fopen(LOGFILE, "a"))) { | 			if ((log = fopen(TMPLOG, "ae"))) { | ||||||
| 				write_time(log, "started"); | 				write_time(log, "started"); | ||||||
| 				write_log(fileno(log), logbuf, logbuf_len); | 				write_log(fileno(log), logbuf, logbuf_len); | ||||||
| 			} | 			} | ||||||
| @@ -255,10 +254,39 @@ rc_logger_open(const char *level) | |||||||
| 			fclose(log); | 			fclose(log); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* Try and cat our new logfile to a more permament location | 		/* Append the temporary log to the real log */ | ||||||
| 		   and then punt it */ | 		logfile = rc_conf_value("rc_logger_path"); | ||||||
| 		if (system(MOVELOG) == -1) | 		if (logfile == NULL) | ||||||
| 			eerror("system: %s: %s", MOVELOG, strerror(errno)); | 			logfile = DEFAULTLOG; | ||||||
|  |  | ||||||
|  | 		if ((plog = fopen(logfile, "ae"))) { | ||||||
|  | 			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; | ||||||
|  | 						eerror("Error: write(%s) failed: %s", logfile, strerror(errno)); | ||||||
|  | 						break; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				log_error = 1; | ||||||
|  | 				eerror("Error: fopen(%s) failed: %s", TMPLOG, strerror(errno)); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			fclose(log); | ||||||
|  | 			fclose(plog); | ||||||
|  | 		} else { | ||||||
|  | 			log_error = 1; | ||||||
|  | 			eerror("Error: fopen(%s) failed: %s", logfile, strerror(errno)); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* Try to keep the temporary log in case of errors */ | ||||||
|  | 		if (!log_error) { | ||||||
|  | 			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); | 		exit(0); | ||||||
| 		/* NOTREACHED */ | 		/* NOTREACHED */ | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user