From c6f1ce6d3e188c330531d298d0385922ca1eee39 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 14 Nov 2003 19:59:32 +0000
Subject: [PATCH] Add logic to propogate a batch script's argc & argv. Save and
 restore batch script's argc & argv across slurmctld restarts.

---
 src/slurmctld/job_mgr.c       | 21 ++++++++++++++++++++-
 src/slurmctld/job_scheduler.c | 21 +++++++++++++++++++--
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 7d2ecf37013..84abb7347b4 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -187,11 +187,15 @@ struct job_record *create_job_record(int *error_code)
  */
 void delete_job_details(struct job_record *job_entry)
 {
+	int i;
+
 	if (job_entry->details == NULL)
 		return;
 
 	_delete_job_desc_files(job_entry->job_id);
 	xassert (job_entry->details->magic == DETAILS_MAGIC);
+	for (i=0; i<job_entry->details->argc; i++)
+		xfree(job_entry->details->argv[i]);
 	xfree(job_entry->details->argv);
 	xfree(job_entry->details->req_nodes);
 	xfree(job_entry->details->exc_nodes);
@@ -594,6 +598,8 @@ void _dump_job_details(struct job_details *detail_ptr, Buf buffer)
 	packstr(detail_ptr->in,        buffer);
 	packstr(detail_ptr->out,       buffer);
 	packstr(detail_ptr->work_dir,  buffer);
+
+	packstr_array(detail_ptr->argv, detail_ptr->argc, buffer);
 }
 
 /* _load_job_details - Unpack a job details information from buffer */
@@ -601,11 +607,13 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 {
 	char *req_nodes = NULL, *exc_nodes = NULL, *features = NULL;
 	char *err = NULL, *in = NULL, *out = NULL, *work_dir = NULL;
+	char **argv = (char **) NULL;
 	bitstr_t *req_node_bitmap = NULL, *exc_node_bitmap = NULL;
 	uint32_t num_procs, min_nodes, max_nodes, min_procs;
-	uint16_t shared, contiguous, name_len;
+	uint16_t argc = 0, shared, contiguous, name_len;
 	uint32_t min_memory, min_tmp_disk, total_procs;
 	time_t submit_time;
+	int i;
 
 	/* unpack the job's details from the buffer */
 	safe_unpack32(&num_procs, buffer);
@@ -630,6 +638,8 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 	safe_unpackstr_xmalloc(&out, &name_len, buffer);
 	safe_unpackstr_xmalloc(&work_dir, &name_len, buffer);
 
+	safe_unpackstr_array(&argv, &argc, buffer);
+
 	/* validity test as possible */
 	if ((shared > 1) || (contiguous > 1)) {
 		error("Invalid data for job %u: shared=%u contiguous=%u",
@@ -647,6 +657,7 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 		goto unpack_error;
 	}
 
+
 	/* free any left-over detail data */
 	xfree(job_ptr->details->req_nodes);
 	FREE_NULL_BITMAP(job_ptr->details->req_node_bitmap);
@@ -657,6 +668,9 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 	xfree(job_ptr->details->in);
 	xfree(job_ptr->details->out);
 	xfree(job_ptr->details->work_dir);
+	for (i=0; i<job_ptr->details->argc; i++)
+		xfree(job_ptr->details->argv[i]);
+	xfree(job_ptr->details->argv);
 
 	/* now put the details into the job record */
 	job_ptr->details->num_procs = num_procs;
@@ -678,6 +692,8 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 	job_ptr->details->in = in;
 	job_ptr->details->out = out;
 	job_ptr->details->work_dir = work_dir;
+	job_ptr->details->argc = argc;
+	job_ptr->details->argv = argv;
 
 	return SLURM_SUCCESS;
 
@@ -691,6 +707,9 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer)
 	xfree(in);
 	xfree(out);
 	xfree(work_dir);
+/*	for (i=0; i<argc; i++) 
+		xfree(argv[i]);  Don't trust this on unpack error */
+	xfree(argv);
 	return SLURM_FAILURE;
 }
 
diff --git a/src/slurmctld/job_scheduler.c b/src/slurmctld/job_scheduler.c
index 48ba563a0a9..70cdf28cec3 100644
--- a/src/slurmctld/job_scheduler.c
+++ b/src/slurmctld/job_scheduler.c
@@ -54,6 +54,7 @@ static int  _build_job_queue(struct job_queue **job_queue);
 static void _launch_job(struct job_record *job_ptr);
 static void _sort_job_queue(struct job_queue *job_queue,
 			    int job_queue_size);
+static char **_xduparray(uint16_t size, char ** array);
 
 /* 
  * _build_job_queue - build (non-priority ordered) list of pending jobs
@@ -264,8 +265,9 @@ static void _launch_job(struct job_record *job_ptr)
 	launch_msg_ptr->in = xstrdup(job_ptr->details->in);
 	launch_msg_ptr->out = xstrdup(job_ptr->details->out);
 	launch_msg_ptr->work_dir = xstrdup(job_ptr->details->work_dir);
-	launch_msg_ptr->argc = 0;	/* FIXME */
-	launch_msg_ptr->argv = NULL;	/* FIXME */
+	launch_msg_ptr->argc = job_ptr->details->argc;
+	launch_msg_ptr->argv = _xduparray(job_ptr->details->argc,
+					job_ptr->details->argv);
 	launch_msg_ptr->script = get_job_script(job_ptr);
 	launch_msg_ptr->environment =
 	    get_job_env(job_ptr, &launch_msg_ptr->envc);
@@ -299,3 +301,18 @@ static void _launch_job(struct job_record *job_ptr)
 		sleep(1);	/* sleep and try again */
 	}
 }
+
+static char **
+_xduparray(uint16_t size, char ** array)
+{
+	int i;
+	char ** result;
+
+	if (size == 0)
+		return (char **)NULL;
+
+	result = (char **) xmalloc(sizeof(char *) * size);
+	for (i=0; i<size; i++)
+		result[i] = xstrdup(array[i]);
+	return result;
+}
-- 
GitLab