diff --git a/mxqd.c b/mxqd.c index c8b73b3a..0294b74b 100644 --- a/mxqd.c +++ b/mxqd.c @@ -818,22 +818,135 @@ static int server_init(struct mxq_server *server, int argc, char *argv[]) return 0; } -static int init_child_process(struct mxq_group_list *glist, struct mxq_job *job) +static int mxq_redirect_open(char *fname) { - struct mxq_server *server; - struct mxq_group *group; - struct passwd *passwd; + int fh; int res; + + int flags = O_WRONLY|O_CREAT|O_NOFOLLOW|O_TRUNC; + mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; + + + if (!fname) { + fname = "/dev/null"; + } else if (!mx_streq(fname, "/dev/null")) { + res = unlink(fname); + if (res == -1 && errno != ENOENT) { + mx_log_err("%s: unlink() failed: %m", fname); + return -2; + } + flags |= O_EXCL; + } + + fh = open(fname, flags, mode); + if (fh == -1) { + mx_log_err("open() failed: %m"); + } + + return fh; + +} + +static int mxq_redirect(char *fname, int fd) +{ int fh; - struct rlimit rlim; + int res; - assert(job); - assert(glist); - assert(glist->user); - assert(glist->user->server); + fh = mxq_redirect_open(fname); + if (fh < 0) + return -1; - server = glist->user->server; - group = &glist->group; + res = mx_dup2_close_both(fh, fd); + if (res < 0) + return -2; + + return 0; +} + +static int mxq_redirect_output(char *stdout_fname, char *stderr_fname) +{ + int res; + + res = mxq_redirect(stderr_fname, STDERR_FILENO); + if (res < 0) { + return -1; + } + + if (stdout_fname == stderr_fname) { + res = mx_dup2_close_new(STDERR_FILENO, STDOUT_FILENO); + if( res < 0) { + return -2; + } + return 0; + } + + res = mxq_redirect(stdout_fname, STDOUT_FILENO); + if (res < 0) { + return -3; + } + + return 0; +} + +static int mxq_redirect_input(char *stdin_fname) +{ + int fh; + int res; + + fh = open(stdin_fname, O_RDONLY|O_NOFOLLOW); + if (fh == -1) { + mx_log_err("open() failed: %m"); + return -1; + } + + res = mx_dup2_close_both(fh, STDIN_FILENO); + if (res < 0) { + return -2; + } + + return 1; +} + +static const char REAPER_PNAME[] = "mxqd reaper"; + +static int is_reaper(pid_t pid) { + char comm[16]; + if (mx_proc_get_comm(pid, comm) == NULL) + return 0; + if (strcmp(comm, REAPER_PNAME) == 0) + return 1; + else + return 0; +} + +static int exec_reaper(struct mxq_server *server,struct mxq_group_list *glist, struct mxq_job *job) { + int res; + + struct mxq_group *group; + + group = &glist->group; + + res = prctl(PR_SET_NAME, REAPER_PNAME, NULL, NULL, NULL); + if (res < 0) { + mx_log_err("reaper_process set name: %m"); + return res; + } + + res = setsid(); + if (res < 0) { + mx_log_err("reaper_process setsid: %m"); + return res; + } + + res = prctl(PR_SET_CHILD_SUBREAPER, 1); + if (res < 0) { + mx_log_err("set subreaper: %m"); + return res; + } + + struct passwd *passwd; + int fh; + struct rlimit rlim; sigprocmask(SIG_UNBLOCK,&all_signals,NULL); signal(SIGPIPE,SIG_DFL); @@ -1004,141 +1117,6 @@ static int init_child_process(struct mxq_group_list *glist, struct mxq_job *job) res=sched_setaffinity(0,sizeof(job->host_cpu_set),&job->host_cpu_set); if (res<0) mx_log_warning("sched_setaffinity: $m"); - return 0; -} - -/**********************************************************************/ - -static int mxq_redirect_open(char *fname) -{ - int fh; - int res; - - int flags = O_WRONLY|O_CREAT|O_NOFOLLOW|O_TRUNC; - mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; - - - if (!fname) { - fname = "/dev/null"; - } else if (!mx_streq(fname, "/dev/null")) { - res = unlink(fname); - if (res == -1 && errno != ENOENT) { - mx_log_err("%s: unlink() failed: %m", fname); - return -2; - } - flags |= O_EXCL; - } - - fh = open(fname, flags, mode); - if (fh == -1) { - mx_log_err("open() failed: %m"); - } - - return fh; - -} - -static int mxq_redirect(char *fname, int fd) -{ - int fh; - int res; - - fh = mxq_redirect_open(fname); - if (fh < 0) - return -1; - - res = mx_dup2_close_both(fh, fd); - if (res < 0) - return -2; - - return 0; -} - -static int mxq_redirect_output(char *stdout_fname, char *stderr_fname) -{ - int res; - - res = mxq_redirect(stderr_fname, STDERR_FILENO); - if (res < 0) { - return -1; - } - - if (stdout_fname == stderr_fname) { - res = mx_dup2_close_new(STDERR_FILENO, STDOUT_FILENO); - if( res < 0) { - return -2; - } - return 0; - } - - res = mxq_redirect(stdout_fname, STDOUT_FILENO); - if (res < 0) { - return -3; - } - - return 0; -} - -static int mxq_redirect_input(char *stdin_fname) -{ - int fh; - int res; - - fh = open(stdin_fname, O_RDONLY|O_NOFOLLOW); - if (fh == -1) { - mx_log_err("open() failed: %m"); - return -1; - } - - res = mx_dup2_close_both(fh, STDIN_FILENO); - if (res < 0) { - return -2; - } - - return 1; -} - -static const char REAPER_PNAME[] = "mxqd reaper"; - -static int is_reaper(pid_t pid) { - char comm[16]; - if (mx_proc_get_comm(pid, comm) == NULL) - return 0; - if (strcmp(comm, REAPER_PNAME) == 0) - return 1; - else - return 0; -} - -static int exec_reaper(struct mxq_server *server,struct mxq_group_list *glist, struct mxq_job *job) { - int res; - - struct mxq_group *group; - - group = &glist->group; - - res = prctl(PR_SET_NAME, REAPER_PNAME, NULL, NULL, NULL); - if (res < 0) { - mx_log_err("reaper_process set name: %m"); - return res; - } - - res = setsid(); - if (res < 0) { - mx_log_err("reaper_process setsid: %m"); - return res; - } - - res = prctl(PR_SET_CHILD_SUBREAPER, 1); - if (res < 0) { - mx_log_err("set subreaper: %m"); - return res; - } - - res = init_child_process(glist, job); - if (res == -1) - return(-1); - mxq_job_set_tmpfilenames(group, job); res = mxq_redirect_input("/dev/null");