|  | /*****************************************************************************\ | 
|  | *  spank.h -- plugin stack handling | 
|  | ***************************************************************************** | 
|  | *  Copyright (C) 2005 The Regents of the University of California. | 
|  | *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | 
|  | *  CODE-OCEC-09-009. All rights reserved. | 
|  | * | 
|  | *  This file is part of Slurm, a resource management program. | 
|  | *  For details, see <https://slurm.schedmd.com/>. | 
|  | *  Please also read the included file: DISCLAIMER. | 
|  | * | 
|  | *  Slurm is free software; you can redistribute it and/or modify it under | 
|  | *  the terms of the GNU General Public License as published by the Free | 
|  | *  Software Foundation; either version 2 of the License, or (at your option) | 
|  | *  any later version. | 
|  | * | 
|  | *  In addition, as a special exception, the copyright holders give permission | 
|  | *  to link the code of portions of this program with the OpenSSL library under | 
|  | *  certain conditions as described in each individual source file, and | 
|  | *  distribute linked combinations including the two. You must obey the GNU | 
|  | *  General Public License in all respects for all of the code used other than | 
|  | *  OpenSSL. If you modify file(s) with this exception, you may extend this | 
|  | *  exception to your version of the file(s), but you are not obligated to do | 
|  | *  so. If you do not wish to do so, delete this exception statement from your | 
|  | *  version.  If you delete this exception statement from all source files in | 
|  | *  the program, then also delete it here. | 
|  | * | 
|  | *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY | 
|  | *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 
|  | *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | 
|  | *  details. | 
|  | * | 
|  | *  You should have received a copy of the GNU General Public License along | 
|  | *  with Slurm; if not, write to the Free Software Foundation, Inc., | 
|  | *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA. | 
|  | \*****************************************************************************/ | 
|  |  | 
|  | #ifndef _COMMON_SPANK_H | 
|  | #define _COMMON_SPANK_H | 
|  |  | 
|  | #include <config.h> | 
|  |  | 
|  | #define _GNU_SOURCE | 
|  |  | 
|  | #include <getopt.h> | 
|  |  | 
|  | #include "src/slurmd/slurmstepd/slurmstepd_job.h" | 
|  |  | 
|  | #define SPANK_OPTION_ENV_PREFIX "_SLURM_SPANK_OPTION_" | 
|  |  | 
|  | /* | 
|  | *  SPANK plugin hook types | 
|  | */ | 
|  | typedef enum { | 
|  | SPANK_INIT = 0, | 
|  | SPANK_JOB_PROLOG = 2, | 
|  | SPANK_INIT_POST_OPT, | 
|  | SPANK_LOCAL_USER_INIT, | 
|  | SPANK_STEP_USER_INIT, | 
|  | SPANK_STEP_TASK_INIT_PRIV, | 
|  | SPANK_STEP_USER_TASK_INIT, | 
|  | SPANK_STEP_TASK_POST_FORK, | 
|  | SPANK_STEP_TASK_EXIT, | 
|  | SPANK_JOB_EPILOG, | 
|  | SPANK_SLURMD_EXIT, | 
|  | SPANK_EXIT, | 
|  | } step_fn_t; | 
|  |  | 
|  | struct spank_launcher_job_info { | 
|  | uid_t       uid; | 
|  | gid_t       gid; | 
|  | uint32_t    jobid; | 
|  | uint32_t    stepid; | 
|  | slurm_step_layout_t *step_layout; | 
|  | int         argc; | 
|  | char      **argv; | 
|  | }; | 
|  |  | 
|  | int spank_init(stepd_step_rec_t *step); | 
|  |  | 
|  | int spank_slurmd_init (void); | 
|  |  | 
|  | int spank_job_prolog(uint32_t jobid, uid_t uid, gid_t gid); | 
|  |  | 
|  | int spank_init_allocator (void); | 
|  |  | 
|  | int spank_init_post_opt (void); | 
|  |  | 
|  | int spank_user(stepd_step_rec_t *step); | 
|  |  | 
|  | int spank_local_user (struct spank_launcher_job_info *job); | 
|  |  | 
|  | int spank_task_privileged(stepd_step_rec_t *step, int taskid); | 
|  |  | 
|  | int spank_user_task(stepd_step_rec_t *step, int taskid); | 
|  |  | 
|  | int spank_task_post_fork(stepd_step_rec_t *step, int taskid); | 
|  |  | 
|  | int spank_task_exit(stepd_step_rec_t *step, int taskid); | 
|  |  | 
|  | int spank_job_epilog(uint32_t jobid, uid_t uid, gid_t gid); | 
|  |  | 
|  | int spank_slurmd_exit (void); | 
|  |  | 
|  | int spank_fini(stepd_step_rec_t *step); | 
|  |  | 
|  | /* | 
|  | * Return true if a loaded spank plugin has a prolog function defined. | 
|  | */ | 
|  | extern bool spank_has_prolog(void); | 
|  |  | 
|  | /* | 
|  | * Return true if a loaded spank plugin has an epilog function defined. | 
|  | */ | 
|  | extern bool spank_has_epilog(void); | 
|  |  | 
|  | /* | 
|  | * Return true if a loaded spank plugin has a user_init function defined. | 
|  | */ | 
|  | extern bool spank_has_user_init(void); | 
|  |  | 
|  | /* | 
|  | * Return true if a loaded spank plugin has a task_post_fork function defined. | 
|  | */ | 
|  | extern bool spank_has_task_post_fork(void); | 
|  |  | 
|  | /* | 
|  | * Return true if a loaded spank plugin has a task_exit function defined. | 
|  | */ | 
|  | extern bool spank_has_task_exit(void); | 
|  |  | 
|  | /* | 
|  | *  Option processing | 
|  | */ | 
|  |  | 
|  | /* | 
|  | *  Create a struct option table (suitable for passing to getopt_long()) | 
|  | *   from SPANK plugin provided options, optionally prepending an existing | 
|  | *   table of options `orig_options'  Result must be freed by | 
|  | *   spank_option_table_destroy(). | 
|  | * | 
|  | *  If any options in orig_options conflict with internal spank options, | 
|  | *   a warning will be printed and the spank option will be disabled. | 
|  | * | 
|  | */ | 
|  | struct option *spank_option_table_create (const struct option *orig_options); | 
|  |  | 
|  | /* | 
|  | *  Free memory associated with an option table created by | 
|  | *   spank_p[tion_table_create. | 
|  | */ | 
|  | void spank_option_table_destroy (struct option *opt_table); | 
|  |  | 
|  | /* | 
|  | *  Process all spank options in the environment calling the options callback if | 
|  | *  found. The option should handle being called twice -- environment variable | 
|  | *  and by command line. | 
|  | * | 
|  | *  Returns <0 if any option's callback fails. Zero otherwise. | 
|  | */ | 
|  | extern int spank_process_env_options(void); | 
|  |  | 
|  | /* | 
|  | *  Process a single spank option which was tagged by `optval' in the | 
|  | *   spank option table. If the option takes and argument (i.e. has_arg = 1) | 
|  | *   then optarg must be non-NULL. | 
|  | * | 
|  | *  Returns < 0 if no option is found which matches `optval', or if | 
|  | *   the option belongs to a *required* plugin, and the plugin's callback | 
|  | *   for that option fails. | 
|  | */ | 
|  | int spank_process_option (int optval, const char *optarg); | 
|  |  | 
|  | /* | 
|  | *  Generate --help style output on stream `fp' for all internal spank | 
|  | *   options which were not previously disabled (e.g. due to conflicts | 
|  | *   with existing options or other plugins). `width' defines the column | 
|  | *   after which the usage text may be displayed, and `left_pad' is the | 
|  | *   amount of space to pad on the left before printing the --option. | 
|  | */ | 
|  | void spank_print_options(FILE *fp, int left_pad, int width); | 
|  |  | 
|  | /*  Set all registered remote options (i.e. those passed to | 
|  | *   spank_process_option) in the job options `options'. | 
|  | */ | 
|  | void spank_set_remote_options(list_t *options); | 
|  |  | 
|  | /*  Clear any spank remote options encoded in environment. | 
|  | */ | 
|  | void spank_clear_remote_options_env(char **env); | 
|  |  | 
|  | /* | 
|  | * spank_get_plugin_names | 
|  | * Get names of all spank plugins | 
|  | * | 
|  | * Parameters: | 
|  | *   names IN/OUT: pointer to char ** (should be NULL when called) | 
|  | *                 output of function is allocated memory for the | 
|  | *                 array of string pointers, and allocated memory | 
|  | *                 for the strings.  Array will be NULL terminated. | 
|  | *                 Caller should manage the memory. | 
|  | * Returns: | 
|  | *   number of allocated strings (excluding NULL terminator) | 
|  | */ | 
|  | size_t spank_get_plugin_names(char ***names); | 
|  |  | 
|  | /* | 
|  | * spank_get_plugin_option_names | 
|  | * Get names of all spank plugins | 
|  | * | 
|  | * Parameters: | 
|  | * IN plugin_name	- Name of spank plugin being considered | 
|  | *			  (e.g., from spank_get_plugin_names) | 
|  | * IN/OUT opts		- Pointer to char ** (should be NULL when called) | 
|  | *			  output of function is allocated memory for the array | 
|  | *			  of string pointers, and allocated memory for the | 
|  | *			  strings. Array will be NULL terminated. Caller | 
|  | *			  should manage the memory. | 
|  | * Returns: | 
|  | *			- Number of allocated strings (excluding NULL | 
|  | *			  terminator) | 
|  | */ | 
|  | size_t spank_get_plugin_option_names(const char *plugin_name, char ***opts); | 
|  |  | 
|  | /* | 
|  | * Get option value by common option name | 
|  | */ | 
|  | extern char *spank_option_get(char *optname); | 
|  |  | 
|  | /* | 
|  | * Get plugin name by common option name | 
|  | */ | 
|  | extern char *spank_option_plugin(char *optname); | 
|  |  | 
|  | /* | 
|  | * Is option set? Discover by common option name | 
|  | */ | 
|  | extern bool spank_option_isset(char *optname); | 
|  |  | 
|  | /* | 
|  | * Function for iterating through all the common option data structure | 
|  | * and returning (via parameter arguments) the name and value of each | 
|  | * set slurm option. | 
|  | * | 
|  | * OUT plugin	- pointer to string to store the plugin name | 
|  | * OUT name	- pointer to string to store the option name | 
|  | * OUT value	- pointer to string to store the value | 
|  | * IN/OUT state	- internal state, should point to NULL for the first call | 
|  | * RETURNS	- true if plugin/name/value set; false if no more options | 
|  | */ | 
|  | extern bool spank_option_get_next_set(char **plugin, char **name, | 
|  | char **value, void **state); | 
|  | #endif /* !_COMMON_SPANK_H */ |