Skip to content

Commit

Permalink
mxqd: Inline init_child_process into exec_reaper
Browse files Browse the repository at this point in the history
  • Loading branch information
donald committed Apr 20, 2022
1 parent c51e280 commit 7bff727
Showing 1 changed file with 124 additions and 146 deletions.
270 changes: 124 additions & 146 deletions mxqd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand Down

0 comments on commit 7bff727

Please sign in to comment.