/* This function formats the environment strings of the form, * foo1=bar1 foo2=bar2 foo3=bar3 * TO * "foo1=bar1" "foo2=bar2" "foo3=bar3" * and returns the length of the formatted string * Note: The formatted string contains a space in the front */ static int FmtEnvVarsForSSH(char *bEnv, char *fmtEnv, int fmtEnvLen) { char name[SMPD_MAX_ENV_LENGTH], equals[3], value[SMPD_MAX_ENV_LENGTH]; int curLen = 0, totLen = 0; smpd_enter_fn(FCNAME); if(fmtEnv && bEnv){ for (;;) { name[0] = '\0'; equals[0] = '\0'; value[0] = '\0'; if(fmtEnvLen <= 0) break; if (MPIU_Str_get_string(&bEnv, name, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS) break; if (name[0] == '\0') break; if (MPIU_Str_get_string(&bEnv, equals, 3) != MPIU_STR_SUCCESS) break; if (equals[0] == '\0') break; if (MPIU_Str_get_string(&bEnv, value, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS) break; MPIU_Snprintf(fmtEnv, fmtEnvLen, " \"%s=%s\"", name, value); curLen = strlen(fmtEnv); totLen += curLen; fmtEnv += curLen; fmtEnvLen -= curLen; } } smpd_exit_fn(FCNAME); return totLen; }
int smpd_hpc_js_task_setenv(ISchedulerTask *ptask, char *proc_encoded_env) { char name[SMPD_MAX_ENV_LENGTH], equals[3], value[SMPD_MAX_ENV_LENGTH]; wchar_t namew[SMPD_MAX_ENV_LENGTH], valuew[SMPD_MAX_ENV_LENGTH]; HRESULT hr; smpd_enter_fn(FCNAME); if((ptask == NULL) || (proc_encoded_env == NULL)){ smpd_err_printf("Invalid ptr to task or proc environment\n"); smpd_exit_fn(FCNAME); return SMPD_FAIL; } for (;;){ name[0] = '\0'; equals[0] = '\0'; value[0] = '\0'; if (MPIU_Str_get_string(&proc_encoded_env, name, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS) break; if (name[0] == '\0') break; if (MPIU_Str_get_string(&proc_encoded_env, equals, 3) != MPIU_STR_SUCCESS) break; if (equals[0] == '\0') break; if (MPIU_Str_get_string(&proc_encoded_env, value, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS) break; smpd_dbg_printf("setting environment variable: <%s> = <%s>\n", name, value); mbstowcs(namew, name, SMPD_MAX_ENV_LENGTH); mbstowcs(valuew, value, SMPD_MAX_ENV_LENGTH); hr = ptask->SetHpcEnvironmentVariable(_bstr_t(namew), _bstr_t(valuew)); } smpd_exit_fn(FCNAME); return SMPD_SUCCESS; }
static smpd_data_t * smpd_parse_smpd_file() { FILE *fin; char *buffer; int len; smpd_data_t *list = NULL, *node; char *iter; char name[SMPD_MAX_NAME_LENGTH]; char equal_str[SMPD_MAX_NAME_LENGTH]; char data[SMPD_MAX_VALUE_LENGTH]; int num_chars; int result; smpd_enter_fn(FCNAME); fin = smpd_open_smpd_file(SMPD_FALSE); if (fin != NULL) { result = fseek(fin, 0, SEEK_END); if (result != 0) { smpd_err_printf("Unable to seek to the end of the .smpd file.\n"); smpd_exit_fn(FCNAME); return NULL; } len = ftell(fin); if (len == -1) { smpd_err_printf("Unable to determine the length of the .smpd file, ftell returned -1 and errno = %d.\n", errno); smpd_exit_fn(FCNAME); return NULL; } result = fseek(fin, 0, SEEK_SET); if (result != 0) { smpd_err_printf("Unable to seek to the beginning of the .smpd file.\n"); smpd_exit_fn(FCNAME); return NULL; } if (len > 0) { buffer = (char*)MPIU_Malloc(len+1); if (buffer == NULL) { smpd_err_printf("Unable to allocate a buffer of length %d, malloc failed.\n", len+1); smpd_exit_fn(FCNAME); return NULL; } iter = buffer; if ((len = (int)fread(buffer, 1, len, fin)) > 0) { buffer[len] = '\0'; str_replace(buffer, "\r\n", SMPD_SEPAR_CHAR); while (iter) { result = MPIU_Str_get_string(&iter, name, SMPD_MAX_NAME_LENGTH); if (result != MPIU_STR_SUCCESS) { smpd_exit_fn(FCNAME); return NULL; } equal_str[0] = '\0'; result = MPIU_Str_get_string(&iter, equal_str, SMPD_MAX_NAME_LENGTH); while (iter && equal_str[0] != SMPD_DELIM_CHAR) { strcpy(name, equal_str); result = MPIU_Str_get_string(&iter, equal_str, SMPD_MAX_NAME_LENGTH); if (result != MPIU_STR_SUCCESS) { smpd_exit_fn(FCNAME); return NULL; } } data[0] = '\0'; result = MPIU_Str_get_string(&iter, data, SMPD_MAX_VALUE_LENGTH); /*smpd_dbg_printf("parsed <%s> <%s> <%s>\n", name, equal_str, data);*/ if (result == MPIU_STR_SUCCESS) { node = (smpd_data_t*)MPIU_Malloc(sizeof(smpd_data_t)); if (node == NULL) { smpd_err_printf("Unable to allocate a smpd_data_t node, malloc failed.\n"); smpd_exit_fn(FCNAME); return list; /* Should we return NULL or the current number of parsed options? */ } strcpy(node->name, name); strcpy(node->value, data); node->next = list; list = node; } } } else { printf("Unable to read the contents of %s.\n", smpd_process.smpd_filename); } MPIU_Free(buffer); } fclose(fin); } smpd_exit_fn(FCNAME); return list; }