Merge branch 'windows'
[moonshot.git] / moonshot / mech_eap / display_status.c
index 89d8628..6eac550 100644 (file)
@@ -43,7 +43,7 @@ struct gss_eap_status_info {
 };
 
 void
-gssEapDestroyStatusInfo(struct gss_eap_status_infop)
+gssEapDestroyStatusInfo(struct gss_eap_status_info *p)
 {
     struct gss_eap_status_info *next;
 
@@ -65,10 +65,10 @@ static void
 saveStatusInfoNoCopy(OM_uint32 minor, char *message)
 {
     struct gss_eap_status_info **next = NULL, *p=NULL;
+    struct gss_eap_thread_local_data *tld = gssEapGetThreadLocalData();
 
-    struct gss_eap_thread_local_data* tld = gssEapGetThreadLocalData();
     if (tld != NULL) {
-        for (p = tld->status_info; p != NULL; p = p->next) {
+        for (p = tld->statusInfo; p != NULL; p = p->next) {
             if (p->code == minor) {
                 /* Set message in-place */
                 if (p->message != NULL)
@@ -78,9 +78,9 @@ saveStatusInfoNoCopy(OM_uint32 minor, char *message)
             }
             next = &p->next;
         }
-
         p = GSSEAP_CALLOC(1, sizeof(*p));
     }
+
     if (p == NULL) {
         if (message != NULL)
             GSSEAP_FREE(message);
@@ -93,18 +93,17 @@ saveStatusInfoNoCopy(OM_uint32 minor, char *message)
     if (next != NULL)
         *next = p;
     else
-        tld->status_info = p;
+        tld->statusInfo = p;
 }
 
 static const char *
 getStatusInfo(OM_uint32 minor)
 {
     struct gss_eap_status_info *p;
-    struct gss_eap_thread_local_data *tld=gssEapGetThreadLocalData();
+    struct gss_eap_thread_local_data *tld = gssEapGetThreadLocalData();
+
     if (tld != NULL) {
-        for (p = tld->status_info;
-             p != NULL;
-             p = p->next) {
+        for (p = tld->statusInfo; p != NULL; p = p->next) {
             if (p->code == minor)
                 return p->message;
         }
@@ -115,6 +114,22 @@ getStatusInfo(OM_uint32 minor)
 void
 gssEapSaveStatusInfo(OM_uint32 minor, const char *format, ...)
 {
+#ifdef WIN32
+    OM_uint32 tmpMajor, tmpMinor;
+    char buf[BUFSIZ];
+    gss_buffer_desc s = GSS_C_EMPTY_BUFFER;
+    va_list ap;
+
+    if (format != NULL) {
+        va_start(ap, format);
+        snprintf(buf, sizeof(buf), format, ap);
+        va_end(ap);
+    }
+
+    tmpMajor = makeStringBuffer(&tmpMinor, buf, &s);
+    if (!GSS_ERROR(tmpMajor))
+        saveStatusInfoNoCopy(minor, (char *)s.value);
+#else
     char *s = NULL;
     int n;
     va_list ap;
@@ -122,19 +137,19 @@ gssEapSaveStatusInfo(OM_uint32 minor, const char *format, ...)
     if (format != NULL) {
         va_start(ap, format);
         n = vasprintf(&s, format, ap);
+        if (n == -1)
+            s = NULL;
         va_end(ap);
     }
 
     saveStatusInfoNoCopy(minor, s);
+#endif /* WIN32 */
 }
 
-OM_uint32 KRB5_CALLCONV
-gss_display_status(OM_uint32 *minor,
-                   OM_uint32 status_value,
-                   int status_type,
-                   gss_OID mech_type,
-                   OM_uint32 *message_context,
-                   gss_buffer_t status_string)
+OM_uint32
+gssEapDisplayStatus(OM_uint32 *minor,
+                    OM_uint32 status_value,
+                    gss_buffer_t status_string)
 {
     OM_uint32 major;
     krb5_context krbContext = NULL;
@@ -143,18 +158,6 @@ gss_display_status(OM_uint32 *minor,
     status_string->length = 0;
     status_string->value = NULL;
 
-    if (!gssEapIsMechanismOid(mech_type)) {
-        *minor = GSSEAP_WRONG_MECH;
-        return GSS_S_BAD_MECH;
-    }
-
-    if (status_type != GSS_C_MECH_CODE ||
-        *message_context != 0) {
-        /* we rely on the mechglue for GSS_C_GSS_CODE */
-        *minor = 0;
-        return GSS_S_BAD_STATUS;
-    }
-
     errMsg = getStatusInfo(status_value);
     if (errMsg == NULL) {
         GSSEAP_KRB_INIT(&krbContext);
@@ -175,3 +178,26 @@ gss_display_status(OM_uint32 *minor,
 
     return major;
 }
+
+OM_uint32 GSSAPI_CALLCONV
+gss_display_status(OM_uint32 *minor,
+                   OM_uint32 status_value,
+                   int status_type,
+                   gss_OID mech_type,
+                   OM_uint32 *message_context,
+                   gss_buffer_t status_string)
+{
+    if (!gssEapIsMechanismOid(mech_type)) {
+        *minor = GSSEAP_WRONG_MECH;
+        return GSS_S_BAD_MECH;
+    }
+
+    if (status_type != GSS_C_MECH_CODE ||
+        *message_context != 0) {
+        /* we rely on the mechglue for GSS_C_GSS_CODE */
+        *minor = 0;
+        return GSS_S_BAD_STATUS;
+    }
+
+    return gssEapDisplayStatus(minor, status_value, status_string);
+}