1 /* Copyright (C) 1998 Transarc Corporation - All rights reserved.
14 #include <afs/errmap_nt.h>
20 StringDataRead(const char *keyName, const char *valueName, char **bufPP);
23 StringDataWrite(const char *keyName, const char *valueName, const char *data);
26 DwordDataRead(const char *keyName, const char *valueName, DWORD *data);
30 /* Functions for accessing AFS software configuration information. */
33 * afssw_GetServerInstallDir() -- Get directory in which AFS server software is
34 * installed. Sets *bufPP to point to allocated buffer containing string.
36 * RETURN CODES: 0 success, -1 failed (errno set)
39 afssw_GetServerInstallDir(char **bufPP) /* [out] data buffer */
41 return StringDataRead(AFSREG_SVR_SW_VERSION_KEY,
42 AFSREG_SVR_SW_VERSION_DIR_VALUE,
48 * afssw_GetClientInstallDir() -- Get directory in which AFS client software is
49 * installed. Sets *bufPP to point to allocated buffer containing string.
51 * RETURN CODES: 0 success, -1 failed (errno set)
54 afssw_GetClientInstallDir(char **bufPP) /* [out] data buffer */
56 return StringDataRead(AFSREG_CLT_SW_VERSION_KEY,
57 AFSREG_CLT_SW_VERSION_DIR_VALUE,
63 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
64 * configured. Sets *bufPP to point to allocated buffer containing string.
66 * RETURN CODES: 0 success, -1 failed (errno set)
69 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
71 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
72 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
78 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
81 * RETURN CODES: 0 success, -1 failed (errno set)
84 afssw_SetClientCellName(const char *cellName)
86 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
87 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
93 * afssw_GetServerVersion() -- Get version number of installed server.
95 * RETURN CODES: 0 success, -1 failed (errno set)
98 afssw_GetServerVersion(unsigned *major, /* major version number */
99 unsigned *minor, /* minor version number */
100 unsigned *patch) /* patch level */
102 DWORD dwMajor, dwMinor, dwPatch;
104 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
105 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
108 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
109 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
112 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
113 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
128 * afssw_GetClientVersion() -- Get version number of installed client.
130 * RETURN CODES: 0 success, -1 failed (errno set)
133 afssw_GetClientVersion(unsigned *major, /* major version number */
134 unsigned *minor, /* minor version number */
135 unsigned *patch) /* patch level */
137 DWORD dwMajor, dwMinor, dwPatch;
139 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
140 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
143 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
144 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
147 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
148 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
164 /* ----------------------- local functions ------------------------- */
167 * StringDataRead() -- read registry data of type REG_SZ and return in
170 * RETURN CODES: 0 success, -1 failed (errno set)
173 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
183 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
185 if (status == ERROR_SUCCESS) {
187 char *dataBuf = NULL;
189 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
191 if (status == ERROR_SUCCESS) {
192 if (dataType == REG_SZ) {
195 /* invalid data type */
197 status = ERROR_INVALID_DATA;
200 (void)RegCloseKey(key);
204 errno = nterr_nt2unix(status, EIO);
212 * StringDataWrite() -- write registry data of type REG_SZ.
214 * RETURN CODES: 0 success, -1 failed (errno set)
217 StringDataWrite(const char *keyName, const char *valueName, const char *data)
227 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
228 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
230 if (status == ERROR_SUCCESS) {
231 status = RegSetValueEx(key,
233 0, REG_SZ, data, strlen(data) + 1);
235 (void)RegCloseKey(key);
239 errno = nterr_nt2unix(status, EIO);
247 * DwordDataRead() -- read registry data of type REG_DWORD.
249 * RETURN CODES: 0 success, -1 failed (errno set)
252 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
257 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
259 if (status == ERROR_SUCCESS) {
262 DWORD dataSize = sizeof(DWORD);
264 status = RegQueryValueEx(key, valueName,
265 NULL, &dataType, (void *)&dataBuf, &dataSize);
267 if (status == ERROR_SUCCESS) {
268 if (dataType == REG_DWORD) {
271 /* invalid data type */
272 status = ERROR_INVALID_DATA;
275 (void)RegCloseKey(key);
279 errno = nterr_nt2unix(status, EIO);