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