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>
24 #include <afs/errmap_nt.h>
30 StringDataRead(const char *keyName, const char *valueName, char **bufPP);
33 StringDataWrite(const char *keyName, const char *valueName, const char *data);
36 DwordDataRead(const char *keyName, const char *valueName, DWORD *data);
40 /* Functions for accessing AFS software configuration information. */
43 * afssw_GetServerInstallDir() -- Get directory in which AFS server software is
44 * installed. Sets *bufPP to point to allocated buffer containing string.
46 * RETURN CODES: 0 success, -1 failed (errno set)
49 afssw_GetServerInstallDir(char **bufPP) /* [out] data buffer */
51 return StringDataRead(AFSREG_SVR_SW_VERSION_KEY,
52 AFSREG_SVR_SW_VERSION_DIR_VALUE,
58 * afssw_GetClientInstallDir() -- Get directory in which AFS client software is
59 * installed. Sets *bufPP to point to allocated buffer containing string.
61 * RETURN CODES: 0 success, -1 failed (errno set)
64 afssw_GetClientInstallDir(char **bufPP) /* [out] data buffer */
66 int retval = StringDataRead(AFSREG_CLT_SW_VERSION_KEY,
67 AFSREG_CLT_SW_VERSION_DIR_VALUE,
70 retval = StringDataRead(AFSREG_CLT_TOOLS_SW_VERSION_KEY,
71 AFSREG_CLT_SW_VERSION_DIR_VALUE,
77 * afssw_GetClientCellServDBDir() -- Get directory in which AFS client CellServDB
78 * file is installed. Sets *bufPP to point to allocated buffer containing string.
80 * RETURN CODES: 0 success, -1 failed (errno set)
83 afssw_GetClientCellServDBDir(char **bufPP) /* [out] data buffer */
90 cbPath = GetEnvironmentVariable("AFSCONF", NULL, 0);
93 path = malloc(cbPath);
95 GetEnvironmentVariable("AFSCONF", path, cbPath);
96 tlen = (int)strlen(path);
97 if (path[tlen-1] != '\\') {
98 strncat(path, "\\", cbPath);
99 path[cbPath-1] = '\0';
106 if (!StringDataRead(AFSREG_CLT_OPENAFS_KEY,
107 AFSREG_CLT_OPENAFS_CELLSERVDB_DIR_VALUE,
109 tlen = (int)strlen(path);
110 if (path[tlen-1] != '\\') {
111 char * newPath = malloc(tlen+2);
113 _snprintf(newPath,tlen+2,"%s\\",path);
123 * Try to find the All Users\Application Data\OpenAFS\Client directory.
124 * If it exists and it contains a CellServDB file, return that.
125 * Otherwise, return the Install Directory for backward compatibility.
126 * SHGetFolderPath requires wdir to be of length MAX_PATH which is 260.
128 if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL,
129 SHGFP_TYPE_CURRENT, wdir)))
132 tlen = (int)strlen(wdir);
133 if (wdir[tlen-1] != '\\') {
134 strncat(wdir, "\\", sizeof(wdir));
135 wdir[sizeof(wdir)-1] = '\0';
138 strncat(wdir, "OpenAFS\\Client\\CellServDB", sizeof(wdir));
139 wdir[sizeof(wdir)-1] = '\0';
141 fh = CreateFile(wdir, GENERIC_READ, FILE_SHARE_READ, NULL,
142 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
143 if (fh != INVALID_HANDLE_VALUE) {
145 tlen += (int)strlen("OpenAFS\\Client\\");
147 *bufPP = strdup(wdir);
152 return afssw_GetClientInstallDir(bufPP);
157 * afssw_GetClientCellName() -- Get name of cell in which AFS client is
158 * configured. Sets *bufPP to point to allocated buffer containing string.
160 * RETURN CODES: 0 success, -1 failed (errno set)
163 afssw_GetClientCellName(char **bufPP) /* [out] data buffer */
165 return StringDataRead(AFSREG_CLT_SVC_PARAM_KEY,
166 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
172 * afssw_SetClientCellName() -- Set name of cell in which AFS client is
175 * RETURN CODES: 0 success, -1 failed (errno set)
178 afssw_SetClientCellName(const char *cellName)
180 return StringDataWrite(AFSREG_CLT_SVC_PARAM_KEY,
181 AFSREG_CLT_SVC_PARAM_CELL_VALUE,
187 * afssw_GetServerVersion() -- Get version number of installed server.
189 * RETURN CODES: 0 success, -1 failed (errno set)
192 afssw_GetServerVersion(unsigned *major, /* major version number */
193 unsigned *minor, /* minor version number */
194 unsigned *patch) /* patch level */
196 DWORD dwMajor, dwMinor, dwPatch;
198 if (DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
199 AFSREG_SVR_SW_VERSION_MAJOR_VALUE,
202 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
203 AFSREG_SVR_SW_VERSION_MINOR_VALUE,
206 DwordDataRead(AFSREG_SVR_SW_VERSION_KEY,
207 AFSREG_SVR_SW_VERSION_PATCH_VALUE,
222 * afssw_GetClientVersion() -- Get version number of installed client.
224 * RETURN CODES: 0 success, -1 failed (errno set)
227 afssw_GetClientVersion(unsigned *major, /* major version number */
228 unsigned *minor, /* minor version number */
229 unsigned *patch) /* patch level */
231 DWORD dwMajor, dwMinor, dwPatch;
233 if (DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
234 AFSREG_CLT_SW_VERSION_MAJOR_VALUE,
237 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
238 AFSREG_CLT_SW_VERSION_MINOR_VALUE,
241 DwordDataRead(AFSREG_CLT_SW_VERSION_KEY,
242 AFSREG_CLT_SW_VERSION_PATCH_VALUE,
258 /* ----------------------- local functions ------------------------- */
261 * StringDataRead() -- read registry data of type REG_SZ and return in
264 * RETURN CODES: 0 success, -1 failed (errno set)
267 StringDataRead(const char *keyName, const char *valueName, char **bufPP)
277 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
279 if (status == ERROR_SUCCESS) {
281 char *dataBuf = NULL;
283 status = RegQueryValueAlt(key, valueName, &dataType, &dataBuf, NULL);
285 if (status == ERROR_SUCCESS) {
286 if (dataType == REG_SZ) {
289 /* invalid data type */
291 status = ERROR_INVALID_DATA;
294 (void)RegCloseKey(key);
298 errno = nterr_nt2unix(status, EIO);
306 * StringDataWrite() -- write registry data of type REG_SZ.
308 * RETURN CODES: 0 success, -1 failed (errno set)
311 StringDataWrite(const char *keyName, const char *valueName, const char *data)
321 status = RegOpenKeyAlt(AFSREG_NULL_KEY,
322 keyName, KEY_WRITE, 1 /* create */, &key, NULL);
324 if (status == ERROR_SUCCESS) {
325 status = RegSetValueEx(key,
327 0, REG_SZ, data, (DWORD)strlen(data) + 1);
329 (void)RegCloseKey(key);
333 errno = nterr_nt2unix(status, EIO);
341 * DwordDataRead() -- read registry data of type REG_DWORD.
343 * RETURN CODES: 0 success, -1 failed (errno set)
346 DwordDataRead(const char *keyName, const char *valueName, DWORD *data)
351 status = RegOpenKeyAlt(AFSREG_NULL_KEY, keyName, KEY_READ, 0, &key, NULL);
353 if (status == ERROR_SUCCESS) {
356 DWORD dataSize = sizeof(DWORD);
358 status = RegQueryValueEx(key, valueName,
359 NULL, &dataType, (void *)&dataBuf, &dataSize);
361 if (status == ERROR_SUCCESS) {
362 if (dataType == REG_DWORD) {
365 /* invalid data type */
366 status = ERROR_INVALID_DATA;
369 (void)RegCloseKey(key);
373 errno = nterr_nt2unix(status, EIO);