/****** uti/stdlib/sge_setenv() *********************************************** * NAME * sge_setenv() -- Change or add an environment variable * * SYNOPSIS * int sge_setenv(const char *name, const char *value) * * FUNCTION * Change or add an environment variable * * INPUTS * const char *name - variable name * const char *value - new value * * RESULT * int - error state * 1 - success * 0 - error * * SEE ALSO * uti/stdlib/sge_putenv() * uti/stdlib/sge_getenv() * uti/stdio/addenv() * * NOTES * MT-NOTE: sge_setenv() is MT safe *******************************************************************************/ int sge_setenv(const char *name, const char *value) { int ret = 0; if (name != NULL && value != NULL) { dstring variable = DSTRING_INIT; sge_dstring_sprintf(&variable, "%s=%s", name, value); ret = sge_putenv(sge_dstring_get_string(&variable)); sge_dstring_free(&variable); } return ret; }
/****** Interactive/qrsh/setEnvironment() *************************************** * * NAME * setEnvironment() -- set environment from file * * SYNOPSIS * static char *setEnvironment(const char *jobdir, char **wrapper); * * FUNCTION * Reads environment variables and their values from file <envFileName> * and sets them in the actual process environment. * The file format conforms to the sge environment file format: * Each line contains a tuple: * <name>=<value> * Special handling for variable PWD: tries to change to named * directory. * Special handling for variable QRSH_COMMAND: is the command to be executed * by qrsh_starter. The value of this variable will be returned as command, * or NULL, if an error occurs. * Special handling for variable QRSH_WRAPPER: this is a wrapper to be called * instead of a shell to execute the command. * If this variable is contained in the environment, it will be returned in * the parameter wrapper. Memory will be allocated to hold the variable, it * is in the responsibility of the caller to free this memory. * Special handling for variable DISPLAY: if it is already set, do not * overwrite it. Usually it is not set, but if ssh is used as transport * mechanism for qrsh, the ssh -X option can be used to enable * X11 forwarding. * * INPUTS * jobdir - the jobs spool directory * wrapper - buffer to take the path and name of a wrapper script * * RESULT * command, if all actions could be performed * NULL, if an error occured; possible errors are: * - the environment file cannot be opened * - a PWD entry is found, but changing to the named directory fails * - necessary memory cannot be allocated * - the variable QRSH_COMMAND is not found * **************************************************************************** */ static char *setEnvironment(const char *jobdir, char **wrapper) { char envFileName[SGE_PATH_MAX]; FILE *envFile = NULL; char *line = NULL; char *command = NULL; SGE_STRUCT_STAT statbuf; int size; bool set_display = true; *wrapper = NULL; /* don't set DISPLAY, if it is already set (e.g. by ssh) */ if (getenv("DISPLAY") != NULL) { set_display = false; } snprintf(envFileName, SGE_PATH_MAX, "%s/environment", jobdir); /* check if environment file exists and * retrieve file size. We will take file size as maximum possible line length */ if (SGE_STAT(envFileName, &statbuf) != 0) { qrsh_error(MSG_QRSH_STARTER_CANNOTOPENFILE_SS, envFileName, strerror(errno)); return NULL; } size = statbuf.st_size; line = (char *)malloc(size + 1); if (line == NULL) { qrsh_error(MSG_QRSH_STARTER_MALLOCFAILED_S, strerror(errno)); return NULL; } /* open sge environment file */ if ((envFile = fopen(envFileName, "r")) == NULL) { qrsh_error(MSG_QRSH_STARTER_CANNOTOPENFILE_SS, envFileName, strerror(errno)); sge_free(&line); return NULL; } /* set all environment variables, change to directory named by PWD */ while (fgets(line, size, envFile) != NULL) { /* clean trailing garbage (\n, \r, EOF ...) */ char *c = &line[strlen(line)]; while (iscntrl(*(--c))) { *c = 0; } /* skip setting of display variable */ if (strncmp(line, "DISPLAY=", 8) == 0 && !set_display) { continue; } if (strncmp(line, "QRSH_COMMAND=", 13) == 0) { if ((command = (char *)malloc(strlen(line) - 13 + 1)) == NULL) { qrsh_error(MSG_QRSH_STARTER_MALLOCFAILED_S, strerror(errno)); sge_free(&line); FCLOSE(envFile); return NULL; } strcpy(command, line + 13); } else if (strncmp(line, "QRSH_WRAPPER=", 13) == 0) { if (*(line + 13) == 0) { fprintf(stderr, "%s\n", MSG_QRSH_STARTER_EMPTY_WRAPPER); } else { if ((*wrapper = (char *)malloc(strlen(line) - 13 + 1)) == NULL) { qrsh_error(MSG_QRSH_STARTER_MALLOCFAILED_S, strerror(errno)); sge_free(&line); FCLOSE(envFile); return NULL; } strcpy(*wrapper, line + 13); } } else { const char *new_line = sge_replace_substring(line, "\\n", "\n"); int put_ret; /* set variable */ if (new_line != NULL) { put_ret = sge_putenv(new_line); sge_free(&new_line); } else { put_ret = sge_putenv(line); } if (put_ret == 0) { sge_free(&line); FCLOSE(envFile); return NULL; } } } sge_free(&line); FCLOSE(envFile); /* * Use starter_method if it is supplied * and not overridden by QRSH_WRAPPER */ if (*wrapper == NULL) { char *starter_method = get_conf_val("starter_method"); if (starter_method != NULL && strcasecmp(starter_method, "none") != 0) { char buffer[128]; *wrapper = starter_method; snprintf(buffer, 128, "%s=%s", "SGE_STARTER_SHELL_PATH", ""); sge_putenv(buffer); snprintf(buffer, 128, "%s=%s", "SGE_STARTER_SHELL_START_MODE", "unix_behavior"); sge_putenv(buffer); snprintf(buffer, 128, "%s=%s", "SGE_STARTER_USE_LOGIN_SHELL", "false"); sge_putenv(buffer); } } return command; FCLOSE_ERROR: qrsh_error(MSG_FILE_ERRORCLOSEINGXY_SS, envFileName, strerror(errno)); return NULL; }