From fd49ed47e36546f08a247edd3515619556aa07b5 Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Thu, 10 Aug 2017 16:10:18 -0600
Subject: [PATCH] Enable different executable and args for pack-job

Modify srun logic so each pack job component can have a different
  executable program and arguments.
---
 src/srun/libsrun/opt.c      |  2 +-
 src/srun/libsrun/srun_job.c | 19 ++++++++++---------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/srun/libsrun/opt.c b/src/srun/libsrun/opt.c
index 03f5f65df22..79bab260ea7 100644
--- a/src/srun/libsrun/opt.c
+++ b/src/srun/libsrun/opt.c
@@ -2381,7 +2381,7 @@ static void _opt_args(int argc, char **argv, int pack_offset)
 	opt.argc = 0;
 	if (optind < argc) {
 		rest = argv + optind;
-		while (rest[opt.argc] != NULL)
+		while ((rest[opt.argc] != NULL) && strcmp(rest[opt.argc], ":"))
 			opt.argc++;
 	}
 
diff --git a/src/srun/libsrun/srun_job.c b/src/srun/libsrun/srun_job.c
index 734dea56c2b..5d2394c3d20 100644
--- a/src/srun/libsrun/srun_job.c
+++ b/src/srun/libsrun/srun_job.c
@@ -503,7 +503,7 @@ static void _pack_grp_test(List opt_list)
  */
 static void _match_job_name(List opt_list)
 {
-	int cnt, i;
+	int cnt;
 	ListIterator iter;
 	opt_t *opt_local;
 
@@ -518,13 +518,6 @@ static void _match_job_name(List opt_list)
 	while ((opt_local = (opt_t *) list_next(iter))) {
 		if (!opt_local->job_name)
 			opt_local->job_name = xstrdup(opt.job_name);
-		if ((opt.argc != 0) && (opt_local->argc != opt.argc)) {
-			opt_local->argc = opt.argc;
-			xfree(opt_local->argv);
-			opt_local->argv = xmalloc(sizeof(char *) * opt.argc);
-			for (i = 0; i < opt.argc; i++)
-				opt_local->argv[i] = xstrdup(opt.argv[i]);
-		}
 	}
 	list_iterator_destroy(iter);
 }
@@ -540,7 +533,7 @@ extern void init_srun(int argc, char **argv,
 		      bool handle_signals)
 {
 	bool pack_fini = false;
-	int pack_argc, pack_inx, pack_argc_off;
+	int i, pack_argc, pack_inx, pack_argc_off;
 	char **pack_argv;
 
 	/*
@@ -577,6 +570,14 @@ extern void init_srun(int argc, char **argv,
 			error("srun parameter parsing");
 			exit(1);
 		}
+		if ((pack_argc_off >= 0) && (pack_argc_off < pack_argc)) {
+			for (i = pack_argc_off; i < pack_argc; i++) {
+				if (!xstrcmp(pack_argv[i], ":")) {
+					pack_argc_off = i;
+					break;
+				}
+			}
+		}
 		if ((pack_argc_off >= 0) && (pack_argc_off < pack_argc) &&
 		    !xstrcmp(pack_argv[pack_argc_off], ":")) {
 			/*
-- 
GitLab