aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/exec_always.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/exec_always.c')
-rw-r--r--sway/commands/exec_always.c21
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
27struct cmd_results *cmd_exec_process(int argc, char **argv) { 27struct 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)) {