📄 smpd_user_data.c
字号:
#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 + -