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 int retval = StringDataRead(AFSREG_CLT_SW_VERSION_KEY,
62 AFSREG_CLT_SW_VERSION_DIR_VALUE,
65 retval = StringDataRead(AFSREG_CLT_TOOLS_SW_VERSION_KEY,
66 AFSREG_CLT_SW_VERSION_DIR_VALUE,
72 * afssw_GetClientCellServDBDir() -- Get directory in which AFS client CellServDB
73 * file is installed. Sets *bufPP to point to allocated buffer containing string.
75 * RETURN CODES: 0 success, -1 failed (errno set)
78 afssw_GetClientCellServDBDir(char **bufPP) /* [out] data buffer */
80 return StringDataRead(AFSREG_CLT_OPENAFS_KEY,
81 AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE,
87 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
88 * configured. Sets *bufPP to point to allocated buffer containing string.
90 * RETURN CODES: 0 success, -1 failed (errno set)
93 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
95 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
96 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
102 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
105 * RETURN CODES: 0 success, -1 failed (errno set)
108 afssw_SetClientCellName(const char *cellName)
110 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
111 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
117 * afssw_GetServerVersion() -- Get version number of installed server.
119 * RETURN CODES: 0 success, -1 failed (errno set)
122 afssw_GetServerVersion(unsigned *major, /* major version number */
123 unsigned *minor, /* minor version number */
124 unsigned *patch) /* patch level */
126 DWORD dwMajor, dwMinor, dwPatch;
128 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
129 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
132 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
133 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
136 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
137 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
152 * afssw_GetClientVersion() -- Get version number of installed client.
154 * RETURN CODES: 0 success, -1 failed (errno set)
157 afssw_GetClientVersion(unsigned *major, /* major version number */
158 unsigned *minor, /* minor version number */
159 unsigned *patch) /* patch level */
161 DWORD dwMajor, dwMinor, dwPatch;
163 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
164 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
167 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
168 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
171 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
172 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
188 /* ----------------------- local functions ------------------------- */
191 * StringDataRead() -- read registry data of type REG_SZ and return in
194 * RETURN CODES: 0 success, -1 failed (errno set)
197 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
207 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
209 if (status == ERROR_SUCCESS) {
211 char *dataBuf = NULL;
213 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
215 if (status == ERROR_SUCCESS) {
216 if (dataType == REG_SZ) {
219 /* invalid data type */
221 status = ERROR_INVALID_DATA;
224 (void)RegCloseKey(key);
228 errno = nterr_nt2unix(status, EIO);
236 * StringDataWrite() -- write registry data of type REG_SZ.
238 * RETURN CODES: 0 success, -1 failed (errno set)
241 StringDataWrite(const char *keyName, const char *valueName, const char *data)
251 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
252 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
254 if (status == ERROR_SUCCESS) {
255 status = RegSetValueEx(key,
257 0, REG_SZ, data, (DWORD)strlen(data) + 1);
259 (void)RegCloseKey(key);
263 errno = nterr_nt2unix(status, EIO);
271 * DwordDataRead() -- read registry data of type REG_DWORD.
273 * RETURN CODES: 0 success, -1 failed (errno set)
276 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
281 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
283 if (status == ERROR_SUCCESS) {
286 DWORD dataSize = sizeof(DWORD);
288 status = RegQueryValueEx(key, valueName,
289 NULL, &dataType, (void *)&dataBuf, &dataSize);
291 if (status == ERROR_SUCCESS) {
292 if (dataType == REG_DWORD) {
295 /* invalid data type */
296 status = ERROR_INVALID_DATA;
299 (void)RegCloseKey(key);
303 errno = nterr_nt2unix(status, EIO);