diff options
Diffstat (limited to 'swaylock')
-rw-r--r-- | swaylock/main.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/swaylock/main.c b/swaylock/main.c index 1d522184..4c6b44c6 100644 --- a/swaylock/main.c +++ b/swaylock/main.c | |||
@@ -23,12 +23,34 @@ | |||
23 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" | 23 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" |
24 | 24 | ||
25 | static void daemonize() { | 25 | static void daemonize() { |
26 | int fds[2]; | ||
27 | if (pipe(fds) != 0) { | ||
28 | wlr_log(L_ERROR, "Failed to pipe"); | ||
29 | exit(1); | ||
30 | } | ||
26 | if (fork() == 0) { | 31 | if (fork() == 0) { |
32 | close(fds[0]); | ||
27 | int devnull = open("/dev/null", O_RDWR); | 33 | int devnull = open("/dev/null", O_RDWR); |
28 | dup2(STDOUT_FILENO, devnull); | 34 | dup2(STDOUT_FILENO, devnull); |
29 | dup2(STDERR_FILENO, devnull); | 35 | dup2(STDERR_FILENO, devnull); |
30 | chdir("/"); | 36 | uint8_t success = 0; |
37 | if (chdir("/") != 0) { | ||
38 | write(fds[1], &success, 1); | ||
39 | exit(1); | ||
40 | } | ||
41 | success = 1; | ||
42 | if (write(fds[1], &success, 1) != 1) { | ||
43 | exit(1); | ||
44 | } | ||
45 | close(fds[1]); | ||
31 | } else { | 46 | } else { |
47 | close(fds[1]); | ||
48 | uint8_t success; | ||
49 | if (read(fds[0], &success, 1) != 1 || !success) { | ||
50 | wlr_log(L_ERROR, "Failed to daemonize"); | ||
51 | exit(1); | ||
52 | } | ||
53 | close(fds[0]); | ||
32 | exit(0); | 54 | exit(0); |
33 | } | 55 | } |
34 | } | 56 | } |