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,
67 * afssw_GetClientCellServDBDir() -- Get directory in which AFS client CellServDB
68 * file is installed. Sets *bufPP to point to allocated buffer containing string.
70 * RETURN CODES: 0 success, -1 failed (errno set)
73 afssw_GetClientCellServDBDir(char **bufPP) /* [out] data buffer */
75 return StringDataRead(AFSREG_CLT_OPENAFS_KEY,
76 AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE,
82 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
83 * configured. Sets *bufPP to point to allocated buffer containing string.
85 * RETURN CODES: 0 success, -1 failed (errno set)
88 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
90 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
91 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
97 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
100 * RETURN CODES: 0 success, -1 failed (errno set)
103 afssw_SetClientCellName(const char *cellName)
105 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
106 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
112 * afssw_GetServerVersion() -- Get version number of installed server.
114 * RETURN CODES: 0 success, -1 failed (errno set)
117 afssw_GetServerVersion(unsigned *major, /* major version number */
118 unsigned *minor, /* minor version number */
119 unsigned *patch) /* patch level */
121 DWORD dwMajor, dwMinor, dwPatch;
123 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
124 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
127 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
128 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
131 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
132 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
147 * afssw_GetClientVersion() -- Get version number of installed client.
149 * RETURN CODES: 0 success, -1 failed (errno set)
152 afssw_GetClientVersion(unsigned *major, /* major version number */
153 unsigned *minor, /* minor version number */
154 unsigned *patch) /* patch level */
156 DWORD dwMajor, dwMinor, dwPatch;
158 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
159 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
162 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
163 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
166 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
167 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
183 /* ----------------------- local functions ------------------------- */
186 * StringDataRead() -- read registry data of type REG_SZ and return in
189 * RETURN CODES: 0 success, -1 failed (errno set)
192 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
202 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
204 if (status == ERROR_SUCCESS) {
206 char *dataBuf = NULL;
208 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
210 if (status == ERROR_SUCCESS) {
211 if (dataType == REG_SZ) {
214 /* invalid data type */
216 status = ERROR_INVALID_DATA;
219 (void)RegCloseKey(key);
223 errno = nterr_nt2unix(status, EIO);
231 * StringDataWrite() -- write registry data of type REG_SZ.
233 * RETURN CODES: 0 success, -1 failed (errno set)
236 StringDataWrite(const char *keyName, const char *valueName, const char *data)
246 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
247 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
249 if (status == ERROR_SUCCESS) {
250 status = RegSetValueEx(key,
252 0, REG_SZ, data, strlen(data) + 1);
254 (void)RegCloseKey(key);
258 errno = nterr_nt2unix(status, EIO);
266 * DwordDataRead() -- read registry data of type REG_DWORD.
268 * RETURN CODES: 0 success, -1 failed (errno set)
271 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
276 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
278 if (status == ERROR_SUCCESS) {
281 DWORD dataSize = sizeof(DWORD);
283 status = RegQueryValueEx(key, valueName,
284 NULL, &dataType, (void *)&dataBuf, &dataSize);
286 if (status == ERROR_SUCCESS) {
287 if (dataType == REG_DWORD) {
290 /* invalid data type */
291 status = ERROR_INVALID_DATA;
294 (void)RegCloseKey(key);
298 errno = nterr_nt2unix(status, EIO);