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 <afsconfig.h>
11 #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 */
85 cbPath = GetEnvironmentVariable("AFSCONF", NULL, 0);
88 path = malloc(cbPath);
90 GetEnvironmentVariable("AFSCONF", path, cbPath);
91 tlen = (int)strlen(path);
92 if (path[tlen-1] != '\\') {
93 strncat(path, "\\", cbPath);
94 path[cbPath-1] = '\0';
101 if (!StringDataRead(AFSREG_CLT_OPENAFS_KEY,
102 AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE,
104 tlen = (int)strlen(path);
105 if (path[tlen-1] != '\\') {
106 char * newPath = malloc(tlen+2);
108 _snprintf(newPath,tlen+2,"%s\\",path);
118 * Try to find the All Users\Application Data\OpenAFS\Client directory.
119 * If it exists and it contains a CellServDB file, return that.
120 * Otherwise, return the Install Directory for backward compatibility.
121 * SHGetFolderPath requires wdir to be of length MAX_PATH which is 260.
123 if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL,
124 SHGFP_TYPE_CURRENT, wdir)))
127 tlen = (int)strlen(wdir);
128 if (wdir[tlen-1] != '\\') {
129 strncat(wdir, "\\", sizeof(wdir));
130 wdir[sizeof(wdir)-1] = '\0';
133 strncat(wdir, "OpenAFS\\Client\\CellServDB", sizeof(wdir));
134 wdir[sizeof(wdir)-1] = '\0';
136 fh = CreateFile(wdir, GENERIC_READ, FILE_SHARE_READ, NULL,
137 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
138 if (fh != INVALID_HANDLE_VALUE) {
140 tlen += (int)strlen("OpenAFS\\Client\\");
142 *bufPP = strdup(wdir);
147 return afssw_GetClientInstallDir(bufPP);
152 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
153 * configured. Sets *bufPP to point to allocated buffer containing string.
155 * RETURN CODES: 0 success, -1 failed (errno set)
158 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
160 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
161 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
167 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
170 * RETURN CODES: 0 success, -1 failed (errno set)
173 afssw_SetClientCellName(const char *cellName)
175 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
176 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
182 * afssw_GetServerVersion() -- Get version number of installed server.
184 * RETURN CODES: 0 success, -1 failed (errno set)
187 afssw_GetServerVersion(unsigned *major, /* major version number */
188 unsigned *minor, /* minor version number */
189 unsigned *patch) /* patch level */
191 DWORD dwMajor, dwMinor, dwPatch;
193 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
194 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
197 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
198 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
201 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
202 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
217 * afssw_GetClientVersion() -- Get version number of installed client.
219 * RETURN CODES: 0 success, -1 failed (errno set)
222 afssw_GetClientVersion(unsigned *major, /* major version number */
223 unsigned *minor, /* minor version number */
224 unsigned *patch) /* patch level */
226 DWORD dwMajor, dwMinor, dwPatch;
228 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
229 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
232 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
233 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
236 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
237 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
253 /* ----------------------- local functions ------------------------- */
256 * StringDataRead() -- read registry data of type REG_SZ and return in
259 * RETURN CODES: 0 success, -1 failed (errno set)
262 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
272 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
274 if (status == ERROR_SUCCESS) {
276 char *dataBuf = NULL;
278 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
280 if (status == ERROR_SUCCESS) {
281 if (dataType == REG_SZ) {
284 /* invalid data type */
286 status = ERROR_INVALID_DATA;
289 (void)RegCloseKey(key);
293 errno = nterr_nt2unix(status, EIO);
301 * StringDataWrite() -- write registry data of type REG_SZ.
303 * RETURN CODES: 0 success, -1 failed (errno set)
306 StringDataWrite(const char *keyName, const char *valueName, const char *data)
316 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
317 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
319 if (status == ERROR_SUCCESS) {
320 status = RegSetValueEx(key,
322 0, REG_SZ, data, (DWORD)strlen(data) + 1);
324 (void)RegCloseKey(key);
328 errno = nterr_nt2unix(status, EIO);
336 * DwordDataRead() -- read registry data of type REG_DWORD.
338 * RETURN CODES: 0 success, -1 failed (errno set)
341 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
346 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
348 if (status == ERROR_SUCCESS) {
351 DWORD dataSize = sizeof(DWORD);
353 status = RegQueryValueEx(key, valueName,
354 NULL, &dataType, (void *)&dataBuf, &dataSize);
356 if (status == ERROR_SUCCESS) {
357 if (dataType == REG_DWORD) {
360 /* invalid data type */
361 status = ERROR_INVALID_DATA;
364 (void)RegCloseKey(key);
368 errno = nterr_nt2unix(status, EIO);