diff options
Diffstat (limited to 'sway/commands/exec_always.c')
-rw-r--r-- | sway/commands/exec_always.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index 39e48a44..fce337d5 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c | |||
@@ -26,7 +26,7 @@ struct cmd_results *cmd_exec_validate(int argc, char **argv) { | |||
26 | 26 | ||
27 | struct cmd_results *cmd_exec_process(int argc, char **argv) { | 27 | struct cmd_results *cmd_exec_process(int argc, char **argv) { |
28 | struct cmd_results *error = NULL; | 28 | struct cmd_results *error = NULL; |
29 | char *tmp = NULL; | 29 | char *cmd = NULL; |
30 | if (strcmp(argv[0], "--no-startup-id") == 0) { | 30 | if (strcmp(argv[0], "--no-startup-id") == 0) { |
31 | sway_log(SWAY_INFO, "exec switch '--no-startup-id' not supported, ignored."); | 31 | sway_log(SWAY_INFO, "exec switch '--no-startup-id' not supported, ignored."); |
32 | --argc; ++argv; | 32 | --argc; ++argv; |
@@ -36,17 +36,12 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { | |||
36 | } | 36 | } |
37 | 37 | ||
38 | if (argc == 1 && (argv[0][0] == '\'' || argv[0][0] == '"')) { | 38 | if (argc == 1 && (argv[0][0] == '\'' || argv[0][0] == '"')) { |
39 | tmp = strdup(argv[0]); | 39 | cmd = strdup(argv[0]); |
40 | strip_quotes(tmp); | 40 | strip_quotes(cmd); |
41 | } else { | 41 | } else { |
42 | tmp = join_args(argv, argc); | 42 | cmd = join_args(argv, argc); |
43 | } | 43 | } |
44 | 44 | ||
45 | // Put argument into cmd array | ||
46 | char cmd[4096]; | ||
47 | strncpy(cmd, tmp, sizeof(cmd) - 1); | ||
48 | cmd[sizeof(cmd) - 1] = 0; | ||
49 | free(tmp); | ||
50 | sway_log(SWAY_DEBUG, "Executing %s", cmd); | 45 | sway_log(SWAY_DEBUG, "Executing %s", cmd); |
51 | 46 | ||
52 | int fd[2]; | 47 | int fd[2]; |
@@ -62,11 +57,13 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { | |||
62 | sigset_t set; | 57 | sigset_t set; |
63 | sigemptyset(&set); | 58 | sigemptyset(&set); |
64 | sigprocmask(SIG_SETMASK, &set, NULL); | 59 | sigprocmask(SIG_SETMASK, &set, NULL); |
60 | signal(SIGPIPE, SIG_DFL); | ||
65 | close(fd[0]); | 61 | close(fd[0]); |
66 | if ((child = fork()) == 0) { | 62 | if ((child = fork()) == 0) { |
67 | close(fd[1]); | 63 | close(fd[1]); |
68 | execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); | 64 | execlp("sh", "sh", "-c", cmd, (void *)NULL); |
69 | _exit(0); | 65 | sway_log_errno(SWAY_ERROR, "execlp failed"); |
66 | _exit(1); | ||
70 | } | 67 | } |
71 | ssize_t s = 0; | 68 | ssize_t s = 0; |
72 | while ((size_t)s < sizeof(pid_t)) { | 69 | while ((size_t)s < sizeof(pid_t)) { |
@@ -75,10 +72,12 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { | |||
75 | close(fd[1]); | 72 | close(fd[1]); |
76 | _exit(0); // Close child process | 73 | _exit(0); // Close child process |
77 | } else if (pid < 0) { | 74 | } else if (pid < 0) { |
75 | free(cmd); | ||
78 | close(fd[0]); | 76 | close(fd[0]); |
79 | close(fd[1]); | 77 | close(fd[1]); |
80 | return cmd_results_new(CMD_FAILURE, "fork() failed"); | 78 | return cmd_results_new(CMD_FAILURE, "fork() failed"); |
81 | } | 79 | } |
80 | free(cmd); | ||
82 | close(fd[1]); // close write | 81 | close(fd[1]); // close write |
83 | ssize_t s = 0; | 82 | ssize_t s = 0; |
84 | while ((size_t)s < sizeof(pid_t)) { | 83 | while ((size_t)s < sizeof(pid_t)) { |