diff --git a/mx_util.c b/mx_util.c index 387ee79..2137b5c 100644 --- a/mx_util.c +++ b/mx_util.c @@ -403,3 +403,42 @@ int mx_dup2_close_both(int oldfd, int newfd) return newfd; } + +int mx_setenv_forever(const char *name, const char *value) +{ + assert(name); + assert(*name); + + int res; + + do { + res = setenv(name, value, 1); + if (!res) + return 0; + assert(errno != EINVAL); + } while (errno == ENOMEM); + + assert(errno == ENOMEM); + return -errno; +} + +int mx_setenvf_forever(const char *name, char *fmt, ...) +{ + assert(name); + assert(*name); + assert(fmt); + + va_list ap; + char *value = NULL; + int res; + + va_start(ap, fmt); + mx_vasprintf_forever(&value, fmt, ap); + va_end(ap); + + res = mx_setenv_forever(name, value); + + free(value); + + return res; +} diff --git a/mx_util.h b/mx_util.h index 0e431fa..3c0b656 100644 --- a/mx_util.h +++ b/mx_util.h @@ -32,4 +32,7 @@ char *mx_dirname_forever(char *path); int mx_dup2_close_new(int oldfd, int newfd); int mx_dup2_close_both(int oldfd, int newfd); +int mx_setenv_forever(const char *name, const char *value); +int mx_setenvf_forever(const char *name, char *fmt, ...) __attribute__ ((format(printf, 2, 3))); + #endif diff --git a/mxqd.c b/mxqd.c index 86de579..19eeee9 100644 --- a/mxqd.c +++ b/mxqd.c @@ -545,26 +545,20 @@ static int init_child_process(struct mxq_group_list *group, struct mxq_job *j) assert(res == 0); - res += mxq_setenv("USER", g->user_name); - res += mxq_setenv("USERNAME", g->user_name); - res += mxq_setenv("LOGNAME", g->user_name); - res += mxq_setenv("PATH", MXQ_INITIAL_PATH); - res += mxq_setenv("PWD", j->job_workdir); - res += mxq_setenv("HOME", passwd->pw_dir); - res += mxq_setenv("HOSTNAME", mxq_hostname()); - res += mxq_setenvf("JOB_ID", "%d", j->job_id); - res += mxq_setenvf("MXQ_JOBID", "%d", j->job_id); - res += mxq_setenvf("MXQ_THREADS", "%d", g->job_threads); - res += mxq_setenvf("MXQ_SLOTS", "%d", group->slots_per_job); - res += mxq_setenvf("MXQ_MEMORY", "%d", g->job_memory); - res += mxq_setenvf("MXQ_TIME", "%d", g->job_time); - res += mxq_setenvf("MXQ_HOSTID", "%s::%s", s->hostname, s->server_id); - - if (res < 14) { - MXQ_LOG_ERROR("job=%s(%d):%lu:%lu setenv(): failed. %m\n", - g->user_name, g->user_uid, g->group_id, j->job_id); - return 0; - } + mx_setenv_forever("USER", g->user_name); + mx_setenv_forever("USERNAME", g->user_name); + mx_setenv_forever("LOGNAME", g->user_name); + mx_setenv_forever("PATH", MXQ_INITIAL_PATH); + mx_setenv_forever("PWD", j->job_workdir); + mx_setenv_forever("HOME", passwd->pw_dir); + mx_setenv_forever("HOSTNAME", mxq_hostname()); + mx_setenvf_forever("JOB_ID", "%lu", j->job_id); + mx_setenvf_forever("MXQ_JOBID", "%lu", j->job_id); + mx_setenvf_forever("MXQ_THREADS", "%d", g->job_threads); + mx_setenvf_forever("MXQ_SLOTS", "%lu", group->slots_per_job); + mx_setenvf_forever("MXQ_MEMORY", "%lu", g->job_memory); + mx_setenvf_forever("MXQ_TIME", "%d", g->job_time); + mx_setenvf_forever("MXQ_HOSTID", "%s::%s", s->hostname, s->server_id); fh = open("/proc/self/loginuid", O_WRONLY|O_TRUNC); if (fh == -1) {