Build fixes for non-Windows
[mech_eap.orig] / mech_eap / util_cred.c
index b481118..40a8c11 100644 (file)
 
 #include "gssapiP_eap.h"
 
-#include <pwd.h>
+#if defined(WIN32)
+/*This didn't work for me(Alexey) when Visual Studio 2005 Express is used: */
+#include <Shlobj.h>
+/*This didn't work for me(Kevin) when Visual Studio 2010 Express is used: */
+/*#include <ShFolder.h>*/
+
+#if !defined(snprintf)
+#define snprintf  _snprintf
+#endif
 
-const gss_OID_desc gssEapPasswordCredType =
-    { 7, "\x2a\x85\x70\x2b\x0d\x81\x48" };
+#else
+#include <pwd.h>
+#endif
+#include <stdio.h> /* for BUFSIZ */
 
 OM_uint32
 gssEapAllocCred(OM_uint32 *minor, gss_cred_id_t *pCred)
@@ -119,9 +129,12 @@ readDefaultIdentityAndCreds(OM_uint32 *minor,
 {
     OM_uint32 major, tmpMinor;
     FILE *fp = NULL;
-    char pwbuf[BUFSIZ], buf[BUFSIZ];
+    char buf[BUFSIZ];
     char *ccacheName;
+#if !defined(WIN32)
+    char pwbuf[BUFSIZ];
     struct passwd *pw = NULL, pwd;
+#endif
 
     defaultIdentity->length = 0;
     defaultIdentity->value = NULL;
@@ -131,6 +144,7 @@ readDefaultIdentityAndCreds(OM_uint32 *minor,
 
     ccacheName = getenv("GSSEAP_IDENTITY");
     if (ccacheName == NULL) {
+#if !defined(WIN32)
         if (getpwuid_r(getuid(), &pwd, pwbuf, sizeof(pwbuf), &pw) != 0 ||
             pw == NULL || pw->pw_dir == NULL) {
             major = GSS_S_CRED_UNAVAIL;
@@ -140,6 +154,23 @@ readDefaultIdentityAndCreds(OM_uint32 *minor,
 
         snprintf(buf, sizeof(buf), "%s/.gss_eap_id", pw->pw_dir);
         ccacheName = buf;
+#else
+       TCHAR szPath[MAX_PATH];
+
+       if(!SUCCEEDED(SHGetFolderPath(NULL,
+                                     CSIDL_APPDATA, /* |CSIDL_FLAG_CREATE */
+                                     NULL, /* User access token */
+                                     0,    /* == SHGFP_TYPE_CURRENT from ShlObj.h */
+                                     szPath))) {
+            major = GSS_S_CRED_UNAVAIL;
+////Needs to be correctly converted from the GetLastError();
+            *minor = errno;
+            goto cleanup;
+       }
+
+        snprintf(buf, sizeof(buf), "%s/.gss_eap_id", szPath);
+        ccacheName = buf;
+#endif
     }
 
     fp = fopen(ccacheName, "r");
@@ -200,8 +231,7 @@ cleanup:
 OM_uint32
 gssEapAcquireCred(OM_uint32 *minor,
                   const gss_name_t desiredName,
-                  gss_const_OID credType,
-                  const void *credData,
+                  const gss_buffer_t password,
                   OM_uint32 timeReq GSSEAP_UNUSED,
                   const gss_OID_set desiredMechs,
                   int credUsage,
@@ -215,21 +245,10 @@ gssEapAcquireCred(OM_uint32 *minor,
     gss_name_t defaultIdentityName = GSS_C_NO_NAME;
     gss_buffer_desc defaultCreds = GSS_C_EMPTY_BUFFER;
     gss_OID nameMech = GSS_C_NO_OID;
-    gss_buffer_t password = GSS_C_NO_BUFFER;
 
     /* XXX TODO validate with changed set_cred_option API */
     *pCred = GSS_C_NO_CREDENTIAL;
 
-    if (credType != GSS_C_NO_OID) {
-        if (oidEqual(credType, &gssEapPasswordCredType)) {
-            password = (gss_buffer_t)credData;
-        } else {
-            major = GSS_S_CRED_UNAVAIL;
-            *minor = GSSEAP_BAD_CRED_TYPE;
-            goto cleanup;
-        }
-    }
-
     major = gssEapAllocCred(minor, &cred);
     if (GSS_ERROR(major))
         goto cleanup;