*/
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
#include <sys/resource.h>
#include <sys/mman.h>
#include <sys/stat.h>
+#include <libgen.h>
#include "all.h"
#include "shmlog.h"
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)
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;