From d3d302b0eda05376e14b5aa3224251f35691361c Mon Sep 17 00:00:00 2001
From: Felip Moll <felip.moll@schedmd.com>
Date: Fri, 12 Jan 2018 13:22:35 +0100
Subject: [PATCH] Check for current cwd in multi-prog when building file path
 Add cwd argument for when using --chdir

Bug 4621
---
 src/plugins/launch/slurm/launch_slurm.c |  3 ++-
 src/srun/libsrun/multi_prog.c           | 16 +++++++++++-----
 src/srun/libsrun/multi_prog.h           |  3 ++-
 3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/plugins/launch/slurm/launch_slurm.c b/src/plugins/launch/slurm/launch_slurm.c
index 88e2ac68796..a1eb7c6e056 100644
--- a/src/plugins/launch/slurm/launch_slurm.c
+++ b/src/plugins/launch/slurm/launch_slurm.c
@@ -844,7 +844,8 @@ extern int launch_p_step_launch(srun_job_t *job, slurm_step_io_fds_t *cio_fds,
 		 */
 		if (srun_opt->multi_prog) {
 			mpir_set_multi_name(job->ntasks,
-					    launch_params.argv[0]);
+					    launch_params.argv[0],
+					    launch_params.cwd);
 		} else {
 			mpir_set_executable_names(launch_params.argv[0],
 						  job->pack_task_offset,
diff --git a/src/srun/libsrun/multi_prog.c b/src/srun/libsrun/multi_prog.c
index 04bf6edcc01..c8d3710cef8 100644
--- a/src/srun/libsrun/multi_prog.c
+++ b/src/srun/libsrun/multi_prog.c
@@ -67,7 +67,7 @@
 /* Given a program name, translate it to a fully qualified pathname
  * as needed based upon the PATH environment variable */
 static char *
-_build_path(char* fname)
+_build_path(const char * cwd, char* fname)
 {
 	int i;
 	char *path_env = NULL, *dir = NULL, *ptrptr = NULL;
@@ -89,6 +89,12 @@ _build_path(char* fname)
 	if ((file_name[0] == '/') || (file_name[0] == '.'))
 		return file_name;
 
+	/* search for the file using cwd*/
+	snprintf(file_path, sizeof(file_path), "%s/%s", cwd, file_name);
+	if ((stat(file_path, &buf) == 0)
+	    && (! S_ISDIR(buf.st_mode)))
+		return file_path;
+
 	/* search for the file using PATH environment variable */
 	dir = getenv("PATH");
 	if (!dir) {
@@ -135,12 +141,12 @@ _set_range(int low_num, int high_num, char *exec_name, bool ignore_duplicates)
 }
 
 static void
-_set_exec_names(char *ranks, char *exec_name, int ntasks)
+_set_exec_names(char *ranks, const char *cwd, char *exec_name, int ntasks)
 {
 	char *ptrptr = NULL, *exec_path = NULL;
 	int low_num, high_num, num, i;
 
-	exec_path = _build_path(exec_name);
+	exec_path = _build_path(cwd, exec_name);
 	if ((ranks[0] == '*') && (ranks[1] == '\0')) {
 		low_num = 0;
 		high_num = ntasks - 1;
@@ -180,7 +186,7 @@ _set_exec_names(char *ranks, char *exec_name, int ntasks)
 }
 
 extern int
-mpir_set_multi_name(int ntasks, const char *config_fname)
+mpir_set_multi_name(int ntasks, const char *config_fname, const char * cwd)
 {
 	FILE *config_fd;
 	char line[BUF_SIZE];
@@ -245,7 +251,7 @@ mpir_set_multi_name(int ntasks, const char *config_fname)
 			fclose(config_fd);
 			return -1;
 		}
-		_set_exec_names(ranks, exec_name, ntasks);
+		_set_exec_names(ranks, cwd, exec_name, ntasks);
 	}
 	fclose(config_fd);
 	return 0;
diff --git a/src/srun/libsrun/multi_prog.h b/src/srun/libsrun/multi_prog.h
index 4d3a68d2be6..83b5b0c4bd2 100644
--- a/src/srun/libsrun/multi_prog.h
+++ b/src/srun/libsrun/multi_prog.h
@@ -51,7 +51,8 @@ extern void mpir_init(int num_tasks);
 extern void mpir_set_executable_names(const char *executable_name,
 				      uint32_t task_offset,
 				      uint32_t task_count);
-extern int  mpir_set_multi_name(int ntasks, const char *config_fname);
+extern int  mpir_set_multi_name(int ntasks, const char *config_fname,
+				const char * cwd);
 
 /*
  * Verify that we have a valid executable program specified for each task
-- 
GitLab