clean up zero-byte logfile on immediate exit
Otherwise, a zero-byte log file stays behind after every call to `i3 --get-socketpath`. Also, replace "return" calls with more explicit "exit" calls. Before: $ ls -ld /tmp/i3* | wc -l; \ repeat 10 i3 --get-socketpath >/dev/null; \ ls -ld /tmp/i3* | wc -l 1 11 Now: $ ls -ld /tmp/i3* | wc -l; \ repeat 10 i3 --get-socketpath >/dev/null; \ ls -ld /tmp/i3* | wc -l 1 1 Signed-off-by: Julius Plenz <julius@plenz.com>
This commit is contained in:
parent
da924aae6f
commit
70ec3867fe
|
@ -67,4 +67,11 @@ void errorlog(char *fmt, ...)
|
||||||
void verboselog(char *fmt, ...)
|
void verboselog(char *fmt, ...)
|
||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute__ ((format (printf, 1, 2)));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the unused log files. Useful if i3 exits immediately, eg.
|
||||||
|
* because --get-socketpath was called. We don't care for syscall
|
||||||
|
* failures. This function is invoked automatically when exiting.
|
||||||
|
*/
|
||||||
|
void purge_zerobyte_logfile(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
28
src/log.c
28
src/log.c
|
@ -131,6 +131,7 @@ void init_logging(void) {
|
||||||
loglastwrap = logbuffer + logbuffer_size;
|
loglastwrap = logbuffer + logbuffer_size;
|
||||||
store_log_markers();
|
store_log_markers();
|
||||||
}
|
}
|
||||||
|
atexit(purge_zerobyte_logfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -268,3 +269,30 @@ void debuglog(char *fmt, ...) {
|
||||||
vlog(debug_logging, fmt, args);
|
vlog(debug_logging, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deletes the unused log files. Useful if i3 exits immediately, eg.
|
||||||
|
* because --get-socketpath was called. We don't care for syscall
|
||||||
|
* failures. This function is invoked automatically when exiting.
|
||||||
|
*/
|
||||||
|
void purge_zerobyte_logfile(void) {
|
||||||
|
struct stat st;
|
||||||
|
char *slash;
|
||||||
|
|
||||||
|
if (!errorfilename)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* don't delete the log file if it contains something */
|
||||||
|
if ((stat(errorfilename, &st)) == -1 || st.st_size > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (unlink(errorfilename) == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((slash = strrchr(errorfilename, '/')) != NULL) {
|
||||||
|
*slash = '\0';
|
||||||
|
/* possibly fails with ENOTEMPTY if there are files (or
|
||||||
|
* sockets) left. */
|
||||||
|
rmdir(errorfilename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -343,10 +343,10 @@ int main(int argc, char *argv[]) {
|
||||||
char *socket_path = root_atom_contents("I3_SOCKET_PATH");
|
char *socket_path = root_atom_contents("I3_SOCKET_PATH");
|
||||||
if (socket_path) {
|
if (socket_path) {
|
||||||
printf("%s\n", socket_path);
|
printf("%s\n", socket_path);
|
||||||
return 0;
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
exit(EXIT_FAILURE);
|
||||||
} else if (strcmp(long_options[option_index].name, "shmlog-size") == 0 ||
|
} else if (strcmp(long_options[option_index].name, "shmlog-size") == 0 ||
|
||||||
strcmp(long_options[option_index].name, "shmlog_size") == 0) {
|
strcmp(long_options[option_index].name, "shmlog_size") == 0) {
|
||||||
shmlog_size = atoi(optarg);
|
shmlog_size = atoi(optarg);
|
||||||
|
|
Loading…
Reference in New Issue