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