static int _env_array_update(char ***array_ptr, const char *name, const char *value, bool over_write) { char **ep = NULL; char *str = NULL; if (array_ptr == NULL) return 0; if (*array_ptr == NULL) *array_ptr = env_array_create(); ep = _find_name_in_env(*array_ptr, name); if (*ep != NULL) { if (!over_write) return 0; xfree (*ep); } else { ep = _extend_env(array_ptr); } xstrfmtcat(str, "%s=%s", name, value); *ep = str; return 1; }
/* execute archive script */ extern int archive_run_script(slurmdb_archive_cond_t *arch_cond, char *cluster_name, time_t last_submit) { char * args[] = {arch_cond->archive_script, NULL}; struct stat st; char **env = NULL; time_t curr_end; if (stat(arch_cond->archive_script, &st) < 0) { error("archive_run_script: failed to stat %s: %m", arch_cond->archive_script); return SLURM_ERROR; } if (!(st.st_mode & S_IFREG)) { errno = EACCES; error("archive_run_script: %s isn't a regular file", arch_cond->archive_script); return SLURM_ERROR; } if (access(arch_cond->archive_script, X_OK) < 0) { errno = EACCES; error("archive_run_script: %s is not executable", arch_cond->archive_script); return SLURM_ERROR; } env = env_array_create(); env_array_append_fmt(&env, "SLURM_ARCHIVE_CLUSTER", "%s", cluster_name); if (arch_cond->purge_event != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_event))) { error("Parsing purge events failed"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_EVENTS", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_event)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_EVENT", "%ld", (long)curr_end); } if (arch_cond->purge_job != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_job))) { error("Parsing purge job failed"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_JOBS", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_job)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_JOB", "%ld", (long)curr_end); } if (arch_cond->purge_resv != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_job))) { error("Parsing purge job failed"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_RESV", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_job)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_RESV", "%ld", (long)curr_end); } if (arch_cond->purge_step != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_step))) { error("Parsing purge step"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_STEPS", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_step)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_STEP", "%ld", (long)curr_end); } if (arch_cond->purge_suspend != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_suspend))) { error("Parsing purge suspend"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_SUSPEND", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_suspend)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_SUSPEND", "%ld", (long)curr_end); } if (arch_cond->purge_txn != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_txn))) { error("Parsing purge txn"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_TXN", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_txn)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_TXN", "%ld", (long)curr_end); } if (arch_cond->purge_usage != NO_VAL) { if (!(curr_end = archive_setup_end_time( last_submit, arch_cond->purge_usage))) { error("Parsing purge usage"); return SLURM_ERROR; } env_array_append_fmt(&env, "SLURM_ARCHIVE_USAGE", "%u", SLURMDB_PURGE_ARCHIVE_SET( arch_cond->purge_usage)); env_array_append_fmt(&env, "SLURM_ARCHIVE_LAST_USAGE", "%ld", (long)curr_end); } #ifdef _PATH_STDPATH env_array_append (&env, "PATH", _PATH_STDPATH); #else env_array_append (&env, "PATH", "/bin:/usr/bin"); #endif execve(arch_cond->archive_script, args, env); env_array_free(env); return SLURM_SUCCESS; }