Hi,
The attached patch uses Windows registry to allow a installation dir
based and system wide pkcs11rc file.
Rgds.
Martin
diff -u -8 -r cvs\muscleapps\PKCS11/src/p11x_prefs.c
muscleapps\PKCS11/src/p11x_prefs.c
--- cvs\muscleapps\PKCS11/src/p11x_prefs.c 2003-10-04 16:28:02.000000000
+0800
+++ muscleapps\PKCS11/src/p11x_prefs.c 2005-07-20 09:32:16.453125000 +0800
@@ -16,16 +16,55 @@
#ifndef HAVE_STRTOKR
#undef strtok_r
#define strtok_r(x,y,z) strtok(x,y)
#endif
#ifdef WIN32
#define strcasecmp stricmp
+
+#define HKLM HKEY_LOCAL_MACHINE
+#define MSC_ROOT_KEY "Software\\M.U.S.C.L.E.\\MUSCLE For Window 2000"
+#define MSC_DEFAULT_DIR "C:\\Program Files\\Muscle"
+#define MSC_RC_FILE "pkcs11rc"
+#endif
+
+#ifdef WIN32
+/*----------------------------------------
+ Read registry value
+*/
+
+CK_RV
+RegRead
+(
+ HKEY hKey,
+ CHAR *SubKey,
+ CHAR *ValName,
+ DWORD *ValType,
+ BYTE *Buf,
+ DWORD *BufLen
+)
+{
+ CK_RV rv = CKR_FUNCTION_FAILED;
+ LONG lRet;
+ HKEY hSubKey=0;
+
+ lRet=RegOpenKeyExA (hKey,SubKey,0,KEY_QUERY_VALUE,&hSubKey);
+ if (lRet != ERROR_SUCCESS) return rv;
+
+ lRet=RegQueryValueExA (hSubKey, ValName, 0, ValType, Buf, BufLen);
+ if (hSubKey) RegCloseKey (hSubKey);
+
+ if (lRet != ERROR_SUCCESS) return rv;
+
+ rv = CKR_OK;
+
+ return rv;
+}
#endif
/******************************************************************************
** Function: util_ParsePreference
**
** Parse a preference item from a line of text. The text should be null
** terminated and buf_size keeps overruns from happening.
**
@@ -321,16 +361,22 @@
** Function: util_ReadPreferences
**
** Gets preferences, if available. On UNIX, looks for .pkcs11rc
** in the $HOME directory, or root directory if $HOME is not
** defined. Having a preferences file is optional and it is assumed
** that most of the time users will not have one unless debug/logging
** or other special settings are required.
**
+** On Windows, looks for pkcs11rc in the following sequence:
+** 1. directory containing containing application. Allow per application
+** rc file. If not found, then:
+** 2. path specified in registry key MSC_ROOT_KEY, if not defined, then:
+** 3. default Muscle setup directory
+**
** Parameters:
** none
**
** Returns:
** none
*******************************************************************************/
#ifndef WIN32
CK_RV util_ReadPreferences()
@@ -350,62 +396,59 @@
while (fgets(buf, sizeof(buf), fp))
util_ParsePreference(buf, sizeof(buf));
fclose(fp);
}
return rv;
}
-#else
-
-/* 0 == success, 1 == failure */
-static CK_RV
-tryReadPrefs(const char*dir)
-{
- FILE *fp;
- char buf[1024];
- char *path = NULL;
- const char *rcfilename = "pkcs11rc";
- CK_RV rv = CKR_FUNCTION_FAILED;
-
- path = (char*) malloc(strlen(dir) + strlen(rcfilename) + 1);
- if( path != NULL ) {
- sprintf(path, "%s%s", dir, rcfilename);
- fp = fopen(path, "rb");
- if (fp) {
- while (fgets(buf, sizeof(buf), fp)) {
- util_ParsePreference(buf, sizeof(buf));
- }
- fclose(fp);
- rv = CKR_OK;
- }
- }
-
- if(path) {
- free(path);
- }
- return rv;
-}
-
+#else /* WIN32 */
CK_RV util_ReadPreferences()
{
- CK_RV rv = CKR_FUNCTION_FAILED;
- const char *hardcodedDir = "C:\\Program Files\\Muscle\\";
- char *relDir = NULL;
-
- relDir = getDLLDirectory();
- if( relDir != NULL ) {
- rv = tryReadPrefs(relDir);
- }
- if( rv != CKR_OK ) {
- rv = tryReadPrefs(hardcodedDir);
- }
-
- if( relDir ) {
- free(relDir);
+ CK_RV rv = CKR_OK;
+ FILE *fp=NULL;
+ char rcpathdef[]= MSC_DEFAULT_DIR ;
+ char rcfn[] = MSC_RC_FILE;
+
+ char rcfilepath[MAX_PATH];
+
+ unsigned long buflen=MAX_PATH;
+ unsigned long ValType;
+
+ char buf[1024];
+ char *relDir = getDLLDirectory();
+
+ do {
+ if (relDir)
+ {
+ strcpy (rcfilepath, relDir);
+ free (relDir);
+ strcat (rcfilepath, rcfn);
+ if (fp = fopen(rcfilepath, "rb")) break;
+ }
+
+ if ( CKR_OK != RegRead (HKLM, MSC_ROOT_KEY, NULL, &ValType,
(BYTE *) rcfilepath, &buflen) || buflen == 0 || strlen(rcfilepath) == 0)
+ {
+ /* use default setup dir */
+ strcpy (rcfilepath,rcpathdef);
+ }
+
+ if (rcfilepath[strlen(rcfilepath)-1] != '\\') strcat
(rcfilepath,"\\");
+ strcat (rcfilepath, rcfn);
+
+ fp = fopen(rcfilepath, "rb");
+
+ } while (0);
+
+ if (fp)
+ {
+ while (fgets(buf, sizeof(buf), fp))
+ util_ParsePreference(buf, sizeof(buf));
+
+ fclose(fp);
}
- return rv;
-
- }
+ return rv;
+
+}
#endif
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle