diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-11-16 19:40:44 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-11-16 19:40:44 -0500 |
commit | 01202568f9da643716b47deb15db8416d1c3bdc7 (patch) | |
tree | 65f530960cfe43401e9aae5525bb7d252fc39d98 | |
parent | 6850174049b9b8ffc00aac7051d82b3489bcc948 (diff) |
Track pid of child process from exec
This will allow us to eventually open that process on the current view.
Requires support from @Cloudef.
-rw-r--r-- | sway/commands.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sway/commands.c b/sway/commands.c index dfb3c12d..3181b434 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -214,22 +214,37 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) { free(tmp); sway_log(L_DEBUG, "Executing %s", cmd); + int fd[2]; + pipe(fd); + pid_t pid; + pid_t *child = malloc(sizeof(pid_t)); // malloc'd so that Linux can avoid copying the process space // Fork process if ((pid = fork()) == 0) { // Fork child process again setsid(); - if (fork() == 0) { + if ((*child = fork()) == 0) { execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); /* Not reached */ } - // Close child process - _exit(0); + close(fd[0]); + write(fd[1], child, sizeof(pid_t)); + close(fd[1]); + _exit(0); // Close child process } else if (pid < 0) { return cmd_results_new(CMD_FAILURE, "exec_always", "Command failed (sway could not fork)."); } + close(fd[1]); // close write + read(fd[0], child, sizeof(pid_t)); + close(fd[0]); // cleanup child process wait(0); + if (*child > 0) { + sway_log(L_DEBUG, "Child process created with pid %d", *child); + // TODO: keep track of this pid and open the corresponding view on the current workspace + // blocked pending feature in wlc + } + free(child); return cmd_results_new(CMD_SUCCESS, NULL, NULL); } |