]> git.sur5r.net Git - i3/i3/commitdiff
cleanup temporary directory when restarting and not using XDG_RUNTIME_DIR
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 11 Jun 2014 07:17:43 +0000 (09:17 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 11 Jun 2014 07:17:43 +0000 (09:17 +0200)
fixes #1253

src/commands.c
src/main.c
testcases/lib/i3test.pm
testcases/t/229-cleanup-tmpdir.t

index 81358274b1ebf6f3979e2c5bbca97570115d3b14..d6c6fc412ee112286a0ccc172b4854d577fee660 100644 (file)
@@ -1682,6 +1682,14 @@ void cmd_reload(I3_CMD) {
  */
 void cmd_restart(I3_CMD) {
     LOG("restarting i3\n");
+    ipc_shutdown();
+    /* We need to call this manually since atexit handlers don’t get called
+     * when exec()ing */
+    purge_zerobyte_logfile();
+    /* The unlink call is intentionally after the purge_zerobyte_logfile() so
+     * that the latter does not remove the directory yet. We need to store the
+     * restart layout state in there. */
+    unlink(config.ipc_socket_path);
     i3_restart(false);
 
     // XXX: default reply for now, make this a better reply
index 4081c234430e1651df97ee58521a2a616b5dd21d..9a3063889d5958374e6ac5618a51a8a341120bf0 100644 (file)
@@ -18,6 +18,7 @@
 #include <sys/resource.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <libgen.h>
 #include "all.h"
 #include "shmlog.h"
 
@@ -670,8 +671,13 @@ int main(int argc, char *argv[]) {
     if (layout_path) {
         LOG("Trying to restore the layout from %s...", layout_path);
         needs_tree_init = !tree_restore(layout_path, greply);
-        if (delete_layout_path)
+        if (delete_layout_path) {
             unlink(layout_path);
+            const char *dir = dirname(layout_path);
+            /* possibly fails with ENOTEMPTY if there are files (or
+             * sockets) left. */
+            rmdir(dir);
+        }
         free(layout_path);
     }
     if (needs_tree_init)
index 5dd96acd8b6efae338890b1075b110a879e31430..a6b982bafd8e18b0b281ccc58ab104236950a1a5 100644 (file)
@@ -783,7 +783,7 @@ To avoid caching:
 =cut
 sub get_socket_path {
     my ($cache) = @_;
-    $cache ||= 1;
+    $cache //= 1;
 
     if ($cache && defined($_cached_socket_path)) {
         return $_cached_socket_path;
index 6448da00cff13209d57b7e75faef480fd0dcc8a4..eff39b08d3bbaab3de96884b29be0f9ef2e4aba3 100644 (file)
@@ -50,4 +50,54 @@ if (-d $tmpdir) {
     diag('contents = ' . Dumper(<$tmpdir/*>));
 }
 
+$pid = launch_with_config($config, dont_add_socket_path => 1, dont_create_temp_dir => 1);
+$socketpath = get_socket_path(0);
+$tmpdir = dirname($socketpath);
+
+ok(-d $tmpdir, "tmpdir $tmpdir exists");
+
+# Clear the error logfile. The testsuite runs in an environment where RandR is
+# not supported, so there always is a message about xinerama in the error
+# logfile.
+@errorlogfiles = <$tmpdir/errorlog.*>;
+for my $fn (@errorlogfiles) {
+    open(my $fh, '>', $fn);
+    close($fh);
+}
+
+diag('socket path before restarting is ' . $socketpath);
+
+cmd 'restart';
+
+# The socket path will be different, and we use that for checking whether i3 has restarted yet.
+while (get_socket_path(0) eq $socketpath) {
+    sleep 0.1;
+}
+
+my $new_tmpdir = dirname(get_socket_path());
+
+does_i3_live;
+
+# Clear the error logfile. The testsuite runs in an environment where RandR is
+# not supported, so there always is a message about xinerama in the error
+# logfile.
+@errorlogfiles = <$new_tmpdir/errorlog.*>;
+for my $fn (@errorlogfiles) {
+    open(my $fh, '>', $fn);
+    close($fh);
+}
+
+exit_gracefully($pid);
+
+ok(! -d $tmpdir, "old tmpdir $tmpdir was cleaned up");
+if (-d $tmpdir) {
+    diag('contents = ' . Dumper(<$tmpdir/*>));
+}
+
+ok(! -d $new_tmpdir, "new tmpdir $new_tmpdir was cleaned up");
+if (-d $new_tmpdir) {
+    diag('contents = ' . Dumper(<$new_tmpdir/*>));
+}
+
+
 done_testing;