From 003aa8f7333d5ad9506bae7166f968dc16a2efc8 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Wed, 19 Oct 2005 17:09:03 +0000 Subject: [PATCH] svn merge -r5640:5645 https://eris.llnl.gov/svn/slurm/branches/slurm-0-6-branch --- NEWS | 1 + src/slurmd/ulimits.c | 20 ++++++++++++++++++++ src/srun/srun.c | 20 +++++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6ec26b48d8b..de372323034 100644 --- a/NEWS +++ b/NEWS @@ -33,6 +33,7 @@ documents those changes that are of interest to users and admins. * Changes in SLURM 0.6.7 ======================== -- Make proctrack/linuxproc thread safe, could cause slurmd seg fault. + -- Propagate umask from srun to spawned tasks. * Changes in SLURM 0.6.6 ======================== diff --git a/src/slurmd/ulimits.c b/src/slurmd/ulimits.c index 32071633b57..1192174843f 100644 --- a/src/slurmd/ulimits.c +++ b/src/slurmd/ulimits.c @@ -30,6 +30,8 @@ #endif #include <sys/resource.h> +#include <sys/stat.h> +#include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <string.h> @@ -50,6 +52,7 @@ static int _get_env_val(char **env, const char *name, unsigned long *valp, bool *u_req_propagate); static int _set_limit(char **env, slurm_rlimits_info_t *rli); +static int _set_umask(char **env); /* * Set user resource limits using the values of the environment variables @@ -67,6 +70,7 @@ int set_user_limits(slurmd_job_t *job) for (rli = get_slurm_rlimits_info(); rli->name; rli++) _set_limit( job->env, rli ); + _set_umask(job->env); return SLURM_SUCCESS; } @@ -82,6 +86,22 @@ static char * rlim_to_string (unsigned long rlim, char *buf, size_t n) return (buf); } +/* Set umask using value of env var SLURM_UMASK */ +static int +_set_umask(char **env) +{ + mode_t mask; + char *val; + + if (!(val = getenvp(env, "SLURM_UMASK"))) { + error("Couldn't find SLURM_UMASK in environment"); + return SLURM_ERROR; + } + + mask = atoi(val); + umask(mask); +} + /* * Set rlimit using value of env vars such as SLURM_RLIMIT_CORE if * the slurm config file has PropagateResourceLimits=YES or the user diff --git a/src/srun/srun.c b/src/srun/srun.c index 02ec3ed5d00..cf70753bbe2 100644 --- a/src/srun/srun.c +++ b/src/srun/srun.c @@ -103,6 +103,7 @@ static int _is_file_text (char *, char**); static int _run_batch_job (void); static int _run_job_script(srun_job_t *job, env_t *env); static int _set_rlimit_env(void); +static int _set_umask_env(void); static char *_task_count_string(srun_job_t *job); static void _switch_standalone(srun_job_t *job); static int _become_user (void); @@ -148,8 +149,10 @@ int srun(int ac, char **av) log_alter(logopt, 0, NULL); } - if (!opt.allocate) + if (!opt.allocate) { (void) _set_rlimit_env(); + (void) _set_umask_env(); + } /* Set up slurmctld message handler */ slurmctld_msg_init(); @@ -702,6 +705,21 @@ _build_script (char *fname, int file_type) return buffer; } +/* Set SLURM_UMASK environment variable with current state */ +static int _set_umask_env(void) +{ + mode_t mask = (int)umask(0); + umask(mask); + + if (setenvf(NULL, "SLURM_UMASK", "%d", (int)mask) < 0) { + error ("unable to set SLURM_UMASK in environment"); + return SLURM_FAILURE; + } + debug ("propagating UMASK=0%d%d%d", + ((mask>>6)&07), ((mask>>3)&07), mask&07); + return SLURM_SUCCESS; +} + /* Set SLURM_RLIMIT_* environment variables with current resource * limit values, reset RLIMIT_NOFILE to maximum possible value */ static int _set_rlimit_env(void) -- GitLab