|
|
|
@ -78,6 +78,23 @@ int ncfdplane_destroy(ncfdplane* n){
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static pid_t
|
|
|
|
|
launch_pipe_process(int* pipe){
|
|
|
|
|
int pipes[2];
|
|
|
|
|
if(pipe2(pipes, O_CLOEXEC)){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
pid_t p = fork();
|
|
|
|
|
if(p == 0){
|
|
|
|
|
if(dup2(pipes[1], STDOUT_FILENO) < 0 || dup2(pipes[1], STDERR_FILENO) < 0){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
*pipe = pipes[0];
|
|
|
|
|
}
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ncsubproc* ncsubproc_createv(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
const char* bin, char* const arg[],
|
|
|
|
|
ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn){
|
|
|
|
@ -86,9 +103,10 @@ ncsubproc* ncsubproc_createv(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
}
|
|
|
|
|
int fd = -1;
|
|
|
|
|
ncsubproc* ret = malloc(sizeof(*ret));
|
|
|
|
|
if(ret){
|
|
|
|
|
// FIXME create ncfdplane with pipe
|
|
|
|
|
ret->pid = fork();
|
|
|
|
|
if(ret == NULL){
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
ret->pid = launch_pipe_process(&fd);
|
|
|
|
|
if(ret->pid == 0){
|
|
|
|
|
execv(bin, arg);
|
|
|
|
|
fprintf(stderr, "Error execv()ing %s\n", bin);
|
|
|
|
@ -102,7 +120,6 @@ ncsubproc* ncsubproc_createv(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
free(ret);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -117,13 +134,7 @@ ncsubproc* ncsubproc_createvp(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
if(ret == NULL){
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
int fds[2];
|
|
|
|
|
if(pipe2(fds, O_CLOEXEC)){
|
|
|
|
|
free(ret);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
// FIXME move pipe to stdio fds
|
|
|
|
|
ret->pid = fork();
|
|
|
|
|
ret->pid = launch_pipe_process(&fd);
|
|
|
|
|
if(ret->pid == 0){
|
|
|
|
|
execvp(bin, arg);
|
|
|
|
|
fprintf(stderr, "Error execv()ing %s\n", bin);
|
|
|
|
@ -140,23 +151,6 @@ ncsubproc* ncsubproc_createvp(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static pid_t
|
|
|
|
|
launch_pipe_process(int* pipe){
|
|
|
|
|
int pipes[2];
|
|
|
|
|
if(pipe2(pipes, O_CLOEXEC)){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
pid_t p = fork();
|
|
|
|
|
if(p == 0){
|
|
|
|
|
if(dup2(pipes[1], STDOUT_FILENO) < 0 || dup2(pipes[1], STDERR_FILENO) < 0){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
*pipe = pipes[0];
|
|
|
|
|
}
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ncsubproc* ncsubproc_createvpe(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
const char* bin, char* const arg[], char* const env[],
|
|
|
|
|
ncfdplane_callback cbfxn, ncfdplane_done_cb donecbfxn){
|
|
|
|
@ -165,7 +159,9 @@ ncsubproc* ncsubproc_createvpe(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
}
|
|
|
|
|
int fd = -1;
|
|
|
|
|
ncsubproc* ret = malloc(sizeof(*ret));
|
|
|
|
|
if(ret){
|
|
|
|
|
if(ret == NULL){
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
ret->pid = launch_pipe_process(&fd);
|
|
|
|
|
if(ret->pid == 0){
|
|
|
|
|
execvpe(bin, arg, env);
|
|
|
|
@ -180,7 +176,6 @@ ncsubproc* ncsubproc_createvpe(ncplane* n, const ncsubproc_options* opts,
|
|
|
|
|
free(ret);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|