version 1.36, 2015/06/17 16:44:49 |
version 1.37, 2015/10/28 09:51:55 |
|
|
void (*callbackfn)(struct job *), void (*freefn)(void *), void *data) |
void (*callbackfn)(struct job *), void (*freefn)(void *), void *data) |
{ |
{ |
struct job *job; |
struct job *job; |
struct environ env; |
struct environ *env; |
pid_t pid; |
pid_t pid; |
int nullfd, out[2]; |
int nullfd, out[2]; |
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, out) != 0) |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, out) != 0) |
return (NULL); |
return (NULL); |
|
|
environ_init(&env); |
env = environ_create(); |
environ_copy(&global_environ, &env); |
environ_copy(global_environ, env); |
if (s != NULL) |
if (s != NULL) |
environ_copy(&s->environ, &env); |
environ_copy(s->environ, env); |
server_fill_environ(s, &env); |
server_fill_environ(s, env); |
|
|
switch (pid = fork()) { |
switch (pid = fork()) { |
case -1: |
case -1: |
environ_free(&env); |
environ_free(env); |
close(out[0]); |
close(out[0]); |
close(out[1]); |
close(out[1]); |
return (NULL); |
return (NULL); |
|
|
if (cwd != -1 && fchdir(cwd) != 0) |
if (cwd != -1 && fchdir(cwd) != 0) |
chdir("/"); |
chdir("/"); |
|
|
environ_push(&env); |
environ_push(env); |
environ_free(&env); |
environ_free(env); |
|
|
if (dup2(out[1], STDIN_FILENO) == -1) |
if (dup2(out[1], STDIN_FILENO) == -1) |
fatal("dup2 failed"); |
fatal("dup2 failed"); |
|
|
} |
} |
|
|
/* parent */ |
/* parent */ |
environ_free(&env); |
environ_free(env); |
close(out[1]); |
close(out[1]); |
|
|
job = xmalloc(sizeof *job); |
job = xmalloc(sizeof *job); |