]> git.sur5r.net Git - i3/i3/commitdiff
clean up zero-byte logfile on immediate exit
authorJulius Plenz <julius@plenz.com>
Fri, 10 Aug 2012 23:50:37 +0000 (01:50 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 11 Aug 2012 00:23:03 +0000 (02:23 +0200)
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>
include/log.h
src/log.c
src/main.c

index 0ad0fb37bc6b9bb61760716c73a2024e91bbac7f..a8209cca58e3a2afff487a848c07e31b3368a312 100644 (file)
@@ -67,4 +67,11 @@ void errorlog(char *fmt, ...)
 void verboselog(char *fmt, ...)
     __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
index f7932926b84af6df0fa161f652bf8b4a0b4f99b6..944edb3f4c5db63c2d6e2d3a5bf0076c1d6a9e23 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -131,6 +131,7 @@ void init_logging(void) {
         loglastwrap = logbuffer + logbuffer_size;
         store_log_markers();
     }
+    atexit(purge_zerobyte_logfile);
 }
 
 /*
@@ -268,3 +269,30 @@ void debuglog(char *fmt, ...) {
     vlog(debug_logging, fmt, 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);
+    }
+}
index e75e7fbfe7b4d8988b47955944e8daf49bca7365..d6a7f617b801c93e43c043afdd5641174cb35fee 100644 (file)
@@ -343,10 +343,10 @@ int main(int argc, char *argv[]) {
                     char *socket_path = root_atom_contents("I3_SOCKET_PATH");
                     if (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 ||
                            strcmp(long_options[option_index].name, "shmlog_size") == 0) {
                     shmlog_size = atoi(optarg);