version 1.37, 2015/10/28 09:51:55 |
version 1.38, 2015/10/31 08:13:58 |
|
|
|
|
/* Start a job running, if it isn't already. */ |
/* Start a job running, if it isn't already. */ |
struct job * |
struct job * |
job_run(const char *cmd, struct session *s, int cwd, |
job_run(const char *cmd, struct session *s, const char *cwd, |
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]; |
|
const char *home; |
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, out) != 0) |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, out) != 0) |
return (NULL); |
return (NULL); |
|
|
case 0: /* child */ |
case 0: /* child */ |
clear_signals(1); |
clear_signals(1); |
|
|
if (cwd != -1 && fchdir(cwd) != 0) |
if (cwd == NULL || chdir(cwd) != 0) { |
chdir("/"); |
if ((home = find_home()) == NULL || chdir(home) != 0) |
|
chdir("/"); |
|
} |
|
|
environ_push(env); |
environ_push(env); |
environ_free(env); |
environ_free(env); |