From 3947aedd86e27ceb9eb8927bd026e189be0dd026 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 11 Jul 2008 18:49:50 +0000
Subject: [PATCH] Add SPANK items available to get: SLURM_VERSION,
 SLURM_VERSION_MAJOR,     SLURM_VERISON_MINOR and SLURM_VERSION_MICRO.

---
 NEWS                   |  2 ++
 slurm/spank.h          | 14 +++++++---
 src/common/plugstack.c | 58 ++++++++++++++++++++++++++++++++++--------
 3 files changed, 60 insertions(+), 14 deletions(-)

diff --git a/NEWS b/NEWS
index 436573097b6..34d3acbe14a 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,8 @@ documents those changes that are of interest to users and admins.
     a job's memory memory at the same time that processors are allocated based
     upon the --mem or --mem-per-cpu option rather than when job steps are
     initiated.
+ -- Add SPANK items available to get: SLURM_VERSION, SLURM_VERSION_MAJOR,
+    SLURM_VERISON_MINOR and SLURM_VERSION_MICRO.
 
 * Changes in SLURM 1.3.5
 ========================
diff --git a/slurm/spank.h b/slurm/spank.h
index 27f2a7f9cb8..ff377059d0f 100644
--- a/slurm/spank.h
+++ b/slurm/spank.h
@@ -1,7 +1,8 @@
 /*****************************************************************************\
  *  spank.h - Stackable Plug-in Architecture for Node job Kontrol
  *****************************************************************************
- *  Copyright (C) 2002-2006 The Regents of the University of California.
+ *  Copyright (C) 2002-2007 The Regents of the University of California.
+ *  Copyright (C) 2008 Lawrence Livermore National Security.
  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
  *  LLNL-CODE-402394.
  *  
@@ -127,7 +128,11 @@ enum spank_item {
     S_JOB_PID_TO_LOCAL_ID,   /* local task id from pid (pid_t, uint32_t *)    */
     S_JOB_LOCAL_TO_GLOBAL_ID,/* local id to global id  (uint32_t, uint32_t *) */
     S_JOB_GLOBAL_TO_LOCAL_ID,/* global id to local id  (uint32_t, uint32_t *) */
-    S_JOB_SUPPLEMENTARY_GIDS /* Array of suppl. gids (gid_t **, int *)        */
+    S_JOB_SUPPLEMENTARY_GIDS,/* Array of suppl. gids (gid_t **, int *)        */
+    S_SLURM_VERSION,         /* Current slurm version (char **)               */
+    S_SLURM_VERSION_MAJOR,   /* Current slurm version major release (char **) */
+    S_SLURM_VERSION_MINOR,   /* Current slurm version minor release (char **) */
+    S_SLURM_VERSION_MICRO    /* Current slurm version micro release (char **) */
 };
 
 typedef enum spank_item spank_item_t;
@@ -216,8 +221,9 @@ int spank_remote (spank_t spank);
 /*  Get the value for the current job or task item specified, 
  *   storing the result in the subsequent pointer argument(s).
  *   Refer to the spank_item_t comments for argument types.
- *   For S_JOB_ARGV and S_JOB_ENV items the result returned to
- *   the caller should not be freed or modified.
+ *   For S_JOB_ARGV, S_JOB_ENV, and S_SLURM_VERSION* items 
+ *   the result returned to the caller should not be freed or
+ *   modified.
  *   
  *  Returns ESPANK_SUCCESS on success, ESPANK_NOTASK if an S_TASK*
  *   item is requested from outside a task context, ESPANK_BAD_ARG
diff --git a/src/common/plugstack.c b/src/common/plugstack.c
index 09e9899df2f..93c1bd905bd 100644
--- a/src/common/plugstack.c
+++ b/src/common/plugstack.c
@@ -1110,7 +1110,7 @@ global_to_local_id (slurmd_job_t *job, uint32_t gid, uint32_t *p2uint32)
 /*
  *  Return 1 if spank_item_t is valid for S_TYPE_LOCAL
  */
-static int valid_in_local_context (spank_item_t item)
+static int _valid_in_local_context (spank_item_t item)
 {
 	int rc = 0;
 	switch (item) {
@@ -1130,6 +1130,24 @@ static int valid_in_local_context (spank_item_t item)
 	return (rc);
 }
 
+/*
+ *  Return 1 if spank_item_t is just getting version (valid anywhere)
+ */
+static int _version_check (spank_item_t item)
+{
+	int rc = 0;
+	switch (item) {
+	case S_SLURM_VERSION:
+	case S_SLURM_VERSION_MAJOR:
+	case S_SLURM_VERSION_MINOR:
+	case S_SLURM_VERSION_MICRO:
+		rc = 1;
+		break;
+	default:
+		rc = 0;
+	}
+	return (rc);
+}
 
 /*
  *  Global functions for SPANK plugins
@@ -1172,6 +1190,7 @@ spank_err_t spank_get_item(spank_t spank, spank_item_t item, ...)
 	pid_t *p2pid;
 	pid_t  pid;
 	char ***p2argv;
+	char **p2vers;
 	slurmd_task_info_t *task;
 	slurmd_job_t  *slurmd_job = NULL;
 	struct spank_launcher_job_info *launcher_job = NULL;
@@ -1181,17 +1200,20 @@ spank_err_t spank_get_item(spank_t spank, spank_item_t item, ...)
 	if ((spank == NULL) || (spank->magic != SPANK_MAGIC))
 		return (ESPANK_BAD_ARG);
 
-	if ( (spank->type != S_TYPE_REMOTE) 
-	  && (!valid_in_local_context(item)))
-		return (ESPANK_NOT_REMOTE);
+	if (!_version_check(item)) {
+		/* Need job pointer to process other items */
+		if ( (spank->type != S_TYPE_REMOTE) 
+		  && (!_valid_in_local_context(item)))
+			return (ESPANK_NOT_REMOTE);
 
-	if (spank->job == NULL)
-		return (ESPANK_BAD_ARG);
+		if (spank->job == NULL)
+			return (ESPANK_BAD_ARG);
 
-	if (spank->type == S_TYPE_LOCAL)
-		launcher_job = spank->job;
-	else
-		slurmd_job = spank->job;
+		if (spank->type == S_TYPE_LOCAL)
+			launcher_job = spank->job;
+		else
+			slurmd_job = spank->job;
+	}
 
 	va_start(vargs, item);
 	switch (item) {
@@ -1343,6 +1365,22 @@ spank_err_t spank_get_item(spank_t spank, spank_item_t item, ...)
 		p2uint32 = va_arg(vargs, uint32_t *);
 		rc = global_to_local_id (slurmd_job, uint32, p2uint32);
 		break;
+	case S_SLURM_VERSION:
+		p2vers = va_arg(vargs, char  **);
+		*p2vers = SLURM_VERSION;
+		break;
+	case S_SLURM_VERSION_MAJOR:
+		p2vers = va_arg(vargs, char  **);
+		*p2vers = SLURM_MAJOR;
+		break;
+	case S_SLURM_VERSION_MINOR:
+		p2vers = va_arg(vargs, char  **);
+		*p2vers = SLURM_MINOR;
+		break;
+	case S_SLURM_VERSION_MICRO:
+		p2vers = va_arg(vargs, char  **);
+		*p2vers = SLURM_MICRO;
+		break;
 	default:
 		rc = ESPANK_BAD_ARG;
 		break;
-- 
GitLab