cleanup temporary directory when restarting and not using XDG_RUNTIME_DIR

fixes #1253
This commit is contained in:
Michael Stapelberg 2014-06-11 09:17:43 +02:00
parent 6fe44d8584
commit 94574db6f6
4 changed files with 66 additions and 2 deletions

View File

@ -1682,6 +1682,14 @@ void cmd_reload(I3_CMD) {
*/ */
void cmd_restart(I3_CMD) { void cmd_restart(I3_CMD) {
LOG("restarting i3\n"); LOG("restarting i3\n");
ipc_shutdown();
/* We need to call this manually since atexit handlers dont 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); i3_restart(false);
// XXX: default reply for now, make this a better reply // XXX: default reply for now, make this a better reply

View File

@ -18,6 +18,7 @@
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <libgen.h>
#include "all.h" #include "all.h"
#include "shmlog.h" #include "shmlog.h"
@ -670,8 +671,13 @@ int main(int argc, char *argv[]) {
if (layout_path) { if (layout_path) {
LOG("Trying to restore the layout from %s...", layout_path); LOG("Trying to restore the layout from %s...", layout_path);
needs_tree_init = !tree_restore(layout_path, greply); needs_tree_init = !tree_restore(layout_path, greply);
if (delete_layout_path) if (delete_layout_path) {
unlink(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); free(layout_path);
} }
if (needs_tree_init) if (needs_tree_init)

View File

@ -783,7 +783,7 @@ To avoid caching:
=cut =cut
sub get_socket_path { sub get_socket_path {
my ($cache) = @_; my ($cache) = @_;
$cache ||= 1; $cache //= 1;
if ($cache && defined($_cached_socket_path)) { if ($cache && defined($_cached_socket_path)) {
return $_cached_socket_path; return $_cached_socket_path;

View File

@ -50,4 +50,54 @@ if (-d $tmpdir) {
diag('contents = ' . Dumper(<$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; done_testing;