/* * AddToProviderOrder() -- add entry to network provider order */ BOOL AddToProviderOrder(char *pszWhatToAdd) { HKEY hKey; DWORD dwType; LONG result; int nLen; char *pszValue = 0; char *pszNewValue; BOOL bAlreadyAdded = FALSE; /* Open the key, creating it if necessary (but should always be there). */ result = RegOpenKeyAlt(AFSREG_NULL_KEY, NETWORK_PROVIDER_ORDER_KEY, KEY_SET_VALUE | KEY_ALL_ACCESS, TRUE, &hKey, 0); if (result != ERROR_SUCCESS) return FALSE; /* Get the old value */ result = RegQueryValueAlt(hKey, PROVIDER_ORDER_VALUE_NAME, &dwType, &pszValue, &nLen); if (result != ERROR_SUCCESS) { nLen = 0; } pszNewValue = malloc(nLen + strlen(pszWhatToAdd) + 1);/* Add 1 for comma */ *pszNewValue = 0; /* Add the new value */ if (result == ERROR_SUCCESS) { if (strstr(pszValue, pszWhatToAdd) != 0) bAlreadyAdded = TRUE; else { if (pszValue && *pszValue) { strcpy(pszNewValue, pszValue); strcat(pszNewValue, ","); } strcat(pszNewValue, pszWhatToAdd); } } else if (result == ERROR_FILE_NOT_FOUND) strcpy(pszNewValue, pszWhatToAdd); /* Set the new value in the registry */ if (((result == ERROR_SUCCESS) || (result == ERROR_FILE_NOT_FOUND)) && !bAlreadyAdded) result = RegSetValueEx(hKey, PROVIDER_ORDER_VALUE_NAME, 0, REG_SZ, pszNewValue, strlen(pszNewValue) + 1); free(pszNewValue); free(pszValue); RegCloseKey(hKey); return (result == ERROR_SUCCESS); }
/* * RemoveFromProviderOrder() -- remove entry from network provider order */ BOOL RemoveFromProviderOrder(char *pszWhatToDel) { HKEY hKey; DWORD dwType; LONG result; int nLen; char *pszValue = 0; char *pszNewValue; BOOL bAlreadyRemoved = FALSE; /* Open the key, creating if necessary (but should always be there). */ result = RegOpenKeyAlt(AFSREG_NULL_KEY, NETWORK_PROVIDER_ORDER_KEY, KEY_SET_VALUE | KEY_ALL_ACCESS, TRUE, &hKey, 0); if (result != ERROR_SUCCESS) return FALSE; /* Get the old value */ result = RegQueryValueAlt(hKey, PROVIDER_ORDER_VALUE_NAME, &dwType, &pszValue, &nLen); if (result == ERROR_SUCCESS) { pszNewValue = malloc(nLen); /* bigger than we need, but that's ok */ *pszNewValue = 0; if (strstr(pszValue, pszWhatToDel) == 0) bAlreadyRemoved = TRUE; else { char *pszCur; pszCur = strtok(pszValue, ","); while (pszCur) { if (strcmp(pszCur, pszWhatToDel) != 0) { if (*pszNewValue) strcat(pszNewValue, ","); strcat(pszNewValue, pszCur); } pszCur = strtok(0, ","); } } /* Set the new value in the registry */ if (!bAlreadyRemoved) result = RegSetValueEx(hKey, PROVIDER_ORDER_VALUE_NAME, 0, REG_SZ, pszNewValue, strlen(pszNewValue) + 1); free(pszNewValue); free(pszValue); } RegCloseKey(hKey); return (result == ERROR_SUCCESS); }
BOOL InNetworkProviderOrder(char *pszNetworkProvider, BOOL *pbIn) { HKEY hKey; LONG bResult; DWORD dwType; char *pszProviderOrder = 0; DWORD dwSize; bResult = FALSE; // Assume failure if (RegOpenKeyAlt(AFSREG_NULL_KEY, NETWORK_PROVIDER_ORDER_KEY, KEY_READ, FALSE, &hKey, 0) == ERROR_SUCCESS) { if (RegQueryValueAlt(hKey, PROVIDER_ORDER_VALUE_NAME, &dwType, &pszProviderOrder, &dwSize) == ERROR_SUCCESS) { *pbIn = strstr(pszProviderOrder, pszNetworkProvider) != 0; bResult = TRUE; free(pszProviderOrder); } RegCloseKey(hKey); } return bResult; }
/* GetInterfaceList * * Get interface list; list is represented as a multistring. * Returns number of elements in interface list or -1 on error. */ static int GetInterfaceList(HKEY skey, char **list) { HKEY key; long status; char *str = NULL; int size; DWORD valType; if (RegOpenKeyAlt(skey, AFSREG_IPSRV_IFACELIST_SUBKEY, KEY_READ, 0, &key, NULL)) return -1; status = RegQueryValueAlt(key, AFSREG_IPSRV_IFACELIST_BIND_VALUE, &valType, &str, NULL); (void) RegCloseKey(key); if (status || (valType != REG_MULTI_SZ)) return -1; /* Count strings in multistring. */ size = 0; if (*str != '\0') { int i; for (i = 1; ; i++) { if (str[i] == '\0') { /* hit end of string */ size++; i++; if (str[i] == '\0') { /* hit end of multistring */ break; } } } } *list = str; return size; }
static int GetIP(HKEY skey, char *ifname, int *addr, int *mask) { HKEY key; char *s; long status; int len; char *ipStr = NULL; char *snMask = NULL; DWORD valType; DWORD dwDHCP; DWORD dwLease; DWORD dwSize; len = (int) strlen(ifname) + 1 + sizeof(AFSREG_IPSRV_ADAPTER_PARAM_SUBKEY); s = malloc(len); if (!s) return -1; sprintf(s, "%s\\%s", ifname, AFSREG_IPSRV_ADAPTER_PARAM_SUBKEY); status = RegOpenKeyAlt(skey, s, KEY_READ, 0, &key, NULL); free(s); if (status) return -1; dwSize = sizeof(DWORD); status = RegQueryValueEx(key, "EnableDHCP", NULL, &valType, (LPBYTE) &dwDHCP, &dwSize); if (status || (valType != REG_DWORD)) dwDHCP = 0; if (dwDHCP == 0) { status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_ADDR_VALUE, &valType, &ipStr, NULL); if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { if (ipStr) free(ipStr); (void) RegCloseKey(key); return -1; } status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_MASK_VALUE, &valType, &snMask, NULL); if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { if (snMask) free(snMask); snMask = NULL; } } else { /* adapter configured via DHCP; address/mask in alternate values */ dwSize = sizeof(DWORD); status = RegQueryValueEx(key, "Lease", NULL, &valType, (LPBYTE)&dwLease, &dwSize); if (status || (valType != REG_DWORD) || dwLease == 0) { (void) RegCloseKey(key); return -1; } status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_DHCPADDR_VALUE, &valType, &ipStr, NULL); if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { if (ipStr) free(ipStr); (void) RegCloseKey(key); return -1; } status = RegQueryValueAlt(key, AFSREG_IPSRV_ADAPTER_PARAM_DHCPMASK_VALUE, &valType, &snMask, NULL); if (status || (valType != REG_SZ && valType != REG_MULTI_SZ)) { if (snMask) free(snMask); snMask = NULL; } } /* convert ip and subnet. */ *addr = (int)inet_addr(ipStr); *addr = ntohl(*addr); free(ipStr); if (snMask) { *mask = (int)inet_addr(snMask); *mask = ntohl(*mask); free(snMask); } else { *mask = 0; } (void) RegCloseKey(key); return 0; }