2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afs/param.h>
19 #include <afs/errmap_nt.h>
25 StringDataRead(const char *keyName, const char *valueName, char **bufPP);
28 StringDataWrite(const char *keyName, const char *valueName, const char *data);
31 DwordDataRead(const char *keyName, const char *valueName, DWORD *data);
35 /* Functions for accessing AFS software configuration information. */
38 * afssw_GetServerInstallDir() -- Get directory in which AFS server software is
39 * installed. Sets *bufPP to point to allocated buffer containing string.
41 * RETURN CODES: 0 success, -1 failed (errno set)
44 afssw_GetServerInstallDir(char **bufPP) /* [out] data buffer */
46 return StringDataRead(AFSREG_SVR_SW_VERSION_KEY,
47 AFSREG_SVR_SW_VERSION_DIR_VALUE,
53 * afssw_GetClientInstallDir() -- Get directory in which AFS client software is
54 * installed. Sets *bufPP to point to allocated buffer containing string.
56 * RETURN CODES: 0 success, -1 failed (errno set)
59 afssw_GetClientInstallDir(char **bufPP) /* [out] data buffer */
61 return StringDataRead(AFSREG_CLT_SW_VERSION_KEY,
62 AFSREG_CLT_SW_VERSION_DIR_VALUE,
68 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
69 * configured. Sets *bufPP to point to allocated buffer containing string.
71 * RETURN CODES: 0 success, -1 failed (errno set)
74 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
76 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
77 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
83 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
86 * RETURN CODES: 0 success, -1 failed (errno set)
89 afssw_SetClientCellName(const char *cellName)
91 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
92 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
98 * afssw_GetServerVersion() -- Get version number of installed server.
100 * RETURN CODES: 0 success, -1 failed (errno set)
103 afssw_GetServerVersion(unsigned *major, /* major version number */
104 unsigned *minor, /* minor version number */
105 unsigned *patch) /* patch level */
107 DWORD dwMajor, dwMinor, dwPatch;
109 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
110 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
113 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
114 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
117 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
118 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
133 * afssw_GetClientVersion() -- Get version number of installed client.
135 * RETURN CODES: 0 success, -1 failed (errno set)
138 afssw_GetClientVersion(unsigned *major, /* major version number */
139 unsigned *minor, /* minor version number */
140 unsigned *patch) /* patch level */
142 DWORD dwMajor, dwMinor, dwPatch;
144 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
145 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
148 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
149 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
152 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
153 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
169 /* ----------------------- local functions ------------------------- */
172 * StringDataRead() -- read registry data of type REG_SZ and return in
175 * RETURN CODES: 0 success, -1 failed (errno set)
178 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
188 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
190 if (status == ERROR_SUCCESS) {
192 char *dataBuf = NULL;
194 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
196 if (status == ERROR_SUCCESS) {
197 if (dataType == REG_SZ) {
200 /* invalid data type */
202 status = ERROR_INVALID_DATA;
205 (void)RegCloseKey(key);
209 errno = nterr_nt2unix(status, EIO);
217 * StringDataWrite() -- write registry data of type REG_SZ.
219 * RETURN CODES: 0 success, -1 failed (errno set)
222 StringDataWrite(const char *keyName, const char *valueName, const char *data)
232 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
233 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
235 if (status == ERROR_SUCCESS) {
236 status = RegSetValueEx(key,
238 0, REG_SZ, data, strlen(data) + 1);
240 (void)RegCloseKey(key);
244 errno = nterr_nt2unix(status, EIO);
252 * DwordDataRead() -- read registry data of type REG_DWORD.
254 * RETURN CODES: 0 success, -1 failed (errno set)
257 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
262 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
264 if (status == ERROR_SUCCESS) {
267 DWORD dataSize = sizeof(DWORD);
269 status = RegQueryValueEx(key, valueName,
270 NULL, &dataType, (void *)&dataBuf, &dataSize);
272 if (status == ERROR_SUCCESS) {
273 if (dataType == REG_DWORD) {
276 /* invalid data type */
277 status = ERROR_INVALID_DATA;
280 (void)RegCloseKey(key);
284 errno = nterr_nt2unix(status, EIO);