Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
spawn: implement spawn_and_give_stdout()
  • Loading branch information
perexg committed Nov 16, 2014
1 parent b2290d3 commit 003c4a2
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
74 changes: 71 additions & 3 deletions src/spawn.c
Expand Up @@ -233,9 +233,6 @@ spawn_enq(const char *name, int pid)
return s;
}




/**
* Execute the given program and return its output in a malloc()ed buffer
*
Expand Down Expand Up @@ -310,6 +307,77 @@ spawn_and_store_stdout(const char *prog, char *argv[], char **outp)
return file_readall(fd[0], outp);
}

/**
* Execute the given program and return its standard output as file-descriptor (pipe).
*/

int
spawn_and_give_stdout(const char *prog, char *argv[], int *rd, int redir_stderr)
{
pid_t p;
int fd[2], f;
char bin[256];
const char *local_argv[2] = { NULL, NULL };

if (*prog != '/' && *prog != '.') {
if (!find_exec(prog, bin, sizeof(bin))) return -1;
prog = bin;
}

if(!argv) argv = (void *)local_argv;
if (!argv[0]) argv[0] = (char*)prog;

pthread_mutex_lock(&fork_lock);

if(pipe(fd) == -1) {
pthread_mutex_unlock(&fork_lock);
return -1;
}

p = fork();

if(p == -1) {
pthread_mutex_unlock(&fork_lock);
tvherror("spawn", "Unable to fork() for \"%s\" -- %s",
prog, strerror(errno));
return -1;
}

if(p == 0) {
close(0);
close(2);
close(fd[0]);
dup2(fd[1], 1);
close(fd[1]);

f = open("/dev/null", O_RDWR);
if(f == -1) {
spawn_error("pid %d cannot open /dev/null for redirect %s -- %s",
getpid(), prog, strerror(errno));
exit(1);
}

dup2(f, 0);
dup2(redir_stderr ? spawn_pipe_error.wr : f, 2);
close(f);

spawn_info("Executing \"%s\"\n", prog);

execve(prog, argv, environ);
spawn_error("pid %d cannot execute %s -- %s\n",
getpid(), prog, strerror(errno));
exit(1);
}

pthread_mutex_unlock(&fork_lock);

spawn_enq(prog, p);

close(fd[1]);

*rd = fd[0];
return 0;
}

/**
* Execute the given program with arguments
Expand Down
2 changes: 2 additions & 0 deletions src/spawn.h
Expand Up @@ -27,6 +27,8 @@ int find_exec ( const char *name, char *out, size_t len );

int spawn_and_store_stdout(const char *prog, char *argv[], char **outp);

int spawn_and_give_stdout(const char *prog, char *argv[], int *rd, int redir_stderr);

int spawnv(const char *prog, char *argv[]);

int spawn_reap(char *stxt, size_t stxtlen);
Expand Down

0 comments on commit 003c4a2

Please sign in to comment.