⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smpd_user_data.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
#else    int result;    smpd_enter_fn(FCNAME);    result = smpd_set_smpd_data(key, value);    smpd_exit_fn(FCNAME);    return result;#endif}#undef FCNAME#define FCNAME "smpd_set_smpd_data"int smpd_set_smpd_data(const char *key, const char *value){#ifdef HAVE_WINDOWS_H    HKEY tkey;    DWORD len, result;    char err_msg[512];    smpd_enter_fn(FCNAME);    if (key == NULL || value == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, SMPD_REGISTRY_KEY,	0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &tkey, NULL);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to open the HKEY_LOCAL_MACHINE\\" SMPD_REGISTRY_KEY " registry key, error %d\n", result);	smpd_err_printf("%s\n", err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    len = (DWORD)(strlen(value)+1);    result = RegSetValueEx(tkey, key, 0, REG_SZ, (const BYTE *)value, len);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to write the smpd registry value '%s:%s', error %d\n", key, value, result);	smpd_err_printf("%s\n", err_msg);	RegCloseKey(tkey);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = RegCloseKey(tkey);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to close the HKEY_LOCAL_MACHINE\\" SMPD_REGISTRY_KEY " registry key, error %d: ", result);	smpd_err_printf("%s\n", err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;#else    int result;    smpd_data_t *list = NULL, *node;    int found = 0;    FILE *fout;    char *str;    int maxlen;    char buffer[1024];    char name_str[SMPD_MAX_NAME_LENGTH];    char value_str[SMPD_MAX_VALUE_LENGTH];    smpd_enter_fn(FCNAME);    smpd_dbg_printf("setting smpd data: %s=%s\n", key, value);    list = smpd_parse_smpd_file();    fout = smpd_open_smpd_file(SMPD_TRUE);    if (fout == NULL)    {	smpd_err_printf("Unable to open the .smpd file\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    while (list)    {	node = list;	list = list->next;	if (strcmp(key, node->name) == 0)	{	    strcpy(node->value, value);	    found = 1;	}	if (fout)	{	    str = buffer;	    maxlen = 1024;	    if (MPIU_Str_add_string_arg(&str, &maxlen, node->name, node->value) == MPIU_STR_SUCCESS)	    {		buffer[strlen(buffer)-1] = '\0'; /* remove the trailing space */		smpd_dbg_printf("writing '%s' to .smpd file\n", buffer);		fprintf(fout, "%s\n", buffer);	    }	}	MPIU_Free(node);    }    if (!found && fout)    {	str = buffer;	maxlen = 1024;	if (MPIU_Str_add_string_arg(&str, &maxlen, key, value) == MPIU_STR_SUCCESS)	{	    buffer[strlen(buffer)-1] = '\0'; /* remove the trailing space */	    smpd_dbg_printf("writing '%s' to .smpd file\n", buffer);	    fprintf(fout, "%s\n", buffer);	}	fclose(fout);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    if (fout != NULL)    {	fclose(fout);	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    smpd_exit_fn(FCNAME);    return SMPD_FAIL;#endif}#undef FCNAME#define FCNAME "smpd_get_user_data_default"int smpd_get_user_data_default(const char *key, char *value, int value_len){    smpd_enter_fn(FCNAME);    /* FIXME: function not implemented */    SMPD_UNREFERENCED_ARG(key);    SMPD_UNREFERENCED_ARG(value);    SMPD_UNREFERENCED_ARG(value_len);    smpd_exit_fn(FCNAME);    return SMPD_FAIL;}#undef FCNAME#define FCNAME "smpd_get_user_data"int smpd_get_user_data(const char *key, char *value, int value_len){#ifdef HAVE_WINDOWS_H    HKEY tkey;    DWORD len, result;    char err_msg[512];    smpd_enter_fn(FCNAME);    result = RegOpenKeyEx(HKEY_CURRENT_USER, SMPD_REGISTRY_KEY, 0, KEY_READ, &tkey);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to open the HKEY_CURRENT_USER\\" SMPD_REGISTRY_KEY " registry key, error %d\n", result);	smpd_dbg_printf("%s\n", err_msg);	result = smpd_get_user_data_default(key, value, value_len);	smpd_exit_fn(FCNAME);	return result;    }    len = value_len;    result = RegQueryValueEx(tkey, key, 0, NULL, (unsigned char *)value, &len);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to read the smpd registry key '%s', error %d\n", key, result);	smpd_dbg_printf("%s\n", err_msg);	RegCloseKey(tkey);	result = smpd_get_user_data_default(key, value, value_len);	smpd_exit_fn(FCNAME);	return result;    }    result = RegCloseKey(tkey);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to close the HKEY_CURRENT_USER\\" SMPD_REGISTRY_KEY " registry key, error %d: ", result);	smpd_err_printf("%s\n", err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;#else    int result;    smpd_enter_fn(FCNAME);    result = smpd_get_smpd_data(key, value, value_len);    if (result != SMPD_SUCCESS)    {	result = smpd_get_user_data_default(key, value, value_len);    }    smpd_exit_fn(FCNAME);    return result;#endif}#undef FCNAME#define FCNAME "smpd_get_smpd_data_default"int smpd_get_smpd_data_default(const char *key, char *value, int value_len){    smpd_enter_fn(FCNAME);#ifdef HAVE_WINDOWS_H    /* A default passphrase is only available for Windows */    if (strcmp(key, "phrase") == 0)    {	strncpy(value, SMPD_DEFAULT_PASSPHRASE, value_len);	value[value_len-1] = '\0';	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }#endif    if (strcmp(key, "log") == 0)    {	strncpy(value, "no", value_len);	value[value_len-1] = '\0';    }    else if (strcmp(key, "prepend_rank") == 0)    {	strncpy(value, "yes", value_len);	value[value_len-1] = '\0';    }    else if (strcmp(key, "trace") == 0)    {	strncpy(value, "yes", value_len);	value[value_len-1] = '\0';    }    else if (strcmp(key, "noprompt") == 0)    {	strncpy(value, "no", value_len);	value[value_len-1] = '\0';    }    /*    else if (strcmp(key, "hosts") == 0)    {	if (smpd_get_hostname(value, value_len) != 0)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}    }    */    else    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_get_smpd_data_from_environment"static SMPD_BOOL smpd_get_smpd_data_from_environment(const char *key, char *value, int value_len){    char *env_option, *env;    size_t length;    smpd_enter_fn(FCNAME);    /* Check to see if the option has been set in the environment */    length = strlen(key) + strlen(SMPD_ENV_OPTION_PREFIX) + 1;    env_option = (char*)MPIU_Malloc(length * sizeof(char));    if (env_option != NULL)    {	strcpy(env_option, SMPD_ENV_OPTION_PREFIX);	env = &env_option[strlen(SMPD_ENV_OPTION_PREFIX)];	while (*key != '\0')	{	    *env = (char)(toupper(*key));	    key++;	    env++;	}	*env = '\0';	env = getenv(env_option);	MPIU_Free(env_option);	if (env != NULL)	{	    if ((int)strlen(env) < value_len)	    {		strcpy(value, env);		smpd_exit_fn(FCNAME);		return SMPD_TRUE;	    }	}    }    smpd_exit_fn(FCNAME);    return SMPD_FALSE;}#undef FCNAME#define FCNAME "smpd_get_smpd_data"int smpd_get_smpd_data(const char *key, char *value, int value_len){#ifdef HAVE_WINDOWS_H    HKEY tkey;    DWORD len, result;    char err_msg[512];    smpd_enter_fn(FCNAME);    if (smpd_get_smpd_data_from_environment(key, value, value_len) == SMPD_TRUE)    {	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SMPD_REGISTRY_KEY, 0, KEY_READ, &tkey);    if (result != ERROR_SUCCESS)    {	if (smpd_get_smpd_data_default(key, value, value_len) != SMPD_SUCCESS)	{	    smpd_dbg_printf("Unable to get the data for the key '%s'\n", key);	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    len = value_len;    result = RegQueryValueEx(tkey, key, 0, NULL, (unsigned char *)value, &len);    if (result != ERROR_SUCCESS)    {	RegCloseKey(tkey);	if (smpd_get_smpd_data_default(key, value, value_len) != SMPD_SUCCESS)	{	    smpd_dbg_printf("Unable to get the data for the key '%s'\n", key);	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    result = RegCloseKey(tkey);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to close the HKEY_LOCAL_MACHINE\\" SMPD_REGISTRY_KEY " registry key, error %d: ", result);	smpd_err_printf("%s\n", err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;#else    int result;    smpd_data_t *list = NULL, *node;    int num_bytes;    smpd_enter_fn(FCNAME);    smpd_dbg_printf("getting smpd data: %s\n", key);    if (smpd_get_smpd_data_from_environment(key, value, value_len) == SMPD_TRUE)    {	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    list = smpd_parse_smpd_file();    if (list)    {	int found = 0;	while (list)	{	    node = list;	    list = list->next;	    if (strcmp(key, node->name) == 0)	    {		strcpy(value, node->value);		smpd_dbg_printf("smpd data: %s=%s\n", key, value);		found = 1;	    }	    MPIU_Free(node);	}	if (found)	{	    smpd_exit_fn(FCNAME);	    return SMPD_SUCCESS;	}    }    result = smpd_get_smpd_data_default(key, value, value_len);    if (result == SMPD_SUCCESS)    {	smpd_dbg_printf("smpd data: %s=%s\n", key, value);    }    else    {	smpd_dbg_printf("smpd data: failed to get %s\n", key);    }    smpd_exit_fn(FCNAME);    return result;#endif}#undef FCNAME#define FCNAME "smpd_get_all_smpd_data"int smpd_get_all_smpd_data(smpd_data_t **data){#ifdef HAVE_WINDOWS_H    HKEY tkey;    DWORD result;    LONG enum_result;    char name[SMPD_MAX_NAME_LENGTH], value[SMPD_MAX_VALUE_LENGTH];    DWORD name_length, value_length, index;    smpd_data_t *list, *item;    char err_msg[512];    smpd_enter_fn(FCNAME);    if (data == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SMPD_REGISTRY_KEY, 0, KEY_READ, &tkey);    if (result != ERROR_SUCCESS)    {	/* No key therefore no settings */	/* No access to the key, therefore no soup for you */	*data = NULL;	smpd_exit_fn(FCNAME);	return SMPD_SUCCESS;    }    list = NULL;    index = 0;    name_length = SMPD_MAX_NAME_LENGTH;    value_length = SMPD_MAX_VALUE_LENGTH;    enum_result = RegEnumValue(tkey, index, name, &name_length, NULL, NULL, (LPBYTE)value, &value_length);    while (enum_result == ERROR_SUCCESS)    {	item = (smpd_data_t*)malloc(sizeof(smpd_data_t));	if (item == NULL)	{	    *data = NULL;	    result = RegCloseKey(tkey);	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}	memcpy(item->name, name, SMPD_MAX_NAME_LENGTH);	memcpy(item->value, value, SMPD_MAX_VALUE_LENGTH);	item->next = list;	list = item;	index++;	name_length = SMPD_MAX_NAME_LENGTH;	value_length = SMPD_MAX_VALUE_LENGTH;	enum_result = RegEnumValue(tkey, index, name, &name_length, NULL, NULL, (LPBYTE)value, &value_length);    }    result = RegCloseKey(tkey);    if (result != ERROR_SUCCESS)    {	smpd_translate_win_error(result, err_msg, 512, "Unable to close the HKEY_LOCAL_MACHINE\\" SMPD_REGISTRY_KEY " registry key, error %d: ", result);	smpd_err_printf("%s\n", err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    *data = list;    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;#else    smpd_enter_fn(FCNAME);    if (data == NULL)    {	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }    *data = NULL;    smpd_exit_fn(FCNAME);    return SMPD_FAIL;#endif}#undef FCNAME#define FCNAME "smpd_lock_smpd_data"int smpd_lock_smpd_data(void){    smpd_enter_fn(FCNAME);#ifdef HAVE_WINDOWS_H    if (smpd_process.hSMPDDataMutex == NULL)    {	smpd_process.hSMPDDataMutex = CreateMutex(NULL, FALSE, SMPD_DATA_MUTEX_NAME);	if (smpd_process.hSMPDDataMutex == NULL)	{	    smpd_exit_fn(FCNAME);	    return SMPD_FAIL;	}    }    if (WaitForSingleObject(smpd_process.hSMPDDataMutex, SMPD_SHORT_TIMEOUT*1000) != WAIT_OBJECT_0)    {	smpd_err_printf("lock_smpd_data failed\n");	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }#else    /* No lock implemented for Unix systems */#endif    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_unlock_smpd_data"int smpd_unlock_smpd_data(void){    smpd_enter_fn(FCNAME);#ifdef HAVE_WINDOWS_H    if (!ReleaseMutex(smpd_process.hSMPDDataMutex))    {	int result;	char err_msg[512];	result = GetLastError();	smpd_translate_win_error(result, err_msg, 512, "Unable to release the SMPD data mutex, error %d: ", result);	smpd_err_printf("%s\n", err_msg);	return SMPD_FAIL;    }#else    /* No lock implemented for Unix systems */#endif    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -