cleanup temporary directory when restarting and not using XDG_RUNTIME_DIR
fixes #1253
This commit is contained in:
parent
6fe44d8584
commit
94574db6f6
|
@ -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 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);
|
i3_restart(false);
|
||||||
|
|
||||||
// XXX: default reply for now, make this a better reply
|
// XXX: default reply for now, make this a better reply
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue