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

Reply via email to