Function added that parses EAP method strings ([eap-]type[-vendor])
authorTobias Brunner <tobias@strongswan.org>
Thu, 23 Aug 2012 08:00:11 +0000 (10:00 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 31 Aug 2012 09:40:28 +0000 (11:40 +0200)
src/libstrongswan/eap/eap.c
src/libstrongswan/eap/eap.h

index 05e8da2..2cc4883 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2012 Tobias Brunner
  * Copyright (C) 2006 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
  * for more details.
  */
 
+#include <stdlib.h>
+#include <errno.h>
+
 #include "eap.h"
 
+#include <debug.h>
+
 ENUM(eap_code_names, EAP_REQUEST, EAP_FAILURE,
        "EAP_REQUEST",
        "EAP_RESPONSE",
@@ -120,3 +126,56 @@ eap_type_t eap_type_from_string(char *name)
        }
        return 0;
 }
+
+/*
+ * See header
+ */
+eap_vendor_type_t *eap_vendor_type_from_string(char *str)
+{
+       enumerator_t *enumerator;
+       eap_vendor_type_t *result = NULL;
+       eap_type_t type = 0;
+       u_int32_t vendor = 0;
+       char *part, *end;
+
+       /* parse EAP method string of the form: [eap-]type[-vendor] */
+       enumerator = enumerator_create_token(str, "-", " ");
+       while (enumerator->enumerate(enumerator, &part))
+       {
+               if (!type)
+               {
+                       if (streq(part, "eap"))
+                       {       /* skip 'eap' at the beginning */
+                               continue;
+                       }
+                       type = eap_type_from_string(part);
+                       if (!type)
+                       {
+                               type = strtoul(part, &end, 0);
+                               if (*end != '\0' || errno)
+                               {
+                                       DBG1(DBG_LIB, "unknown or invalid EAP method: %s", part);
+                                       break;
+                               }
+                       }
+                       continue;
+               }
+               vendor = strtoul(part, &end, 0);
+               if (*end != '\0' || errno)
+               {
+                       DBG1(DBG_LIB, "invalid EAP vendor: %s", part);
+                       type = 0;
+               }
+               break;
+       }
+       enumerator->destroy(enumerator);
+
+       if (type)
+       {
+               INIT(result,
+                       .type = type,
+                       .vendor = vendor,
+               );
+       }
+       return result;
+}
index 936ae11..d824783 100644 (file)
@@ -1,6 +1,8 @@
 /*
+ * Copyright (C) 2012 Tobias Brunner
  * Copyright (C) 2010 Martin Willi
  * Copyright (C) 2010 revosec AG
+ * Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -23,6 +25,7 @@
 
 typedef enum eap_code_t eap_code_t;
 typedef enum eap_type_t eap_type_t;
+typedef struct eap_vendor_type_t eap_vendor_type_t;
 
 #include <library.h>
 
@@ -83,6 +86,22 @@ extern enum_name_t *eap_type_names;
 extern enum_name_t *eap_type_short_names;
 
 /**
+ * Struct that stores EAP type and vendor ID
+ */
+struct eap_vendor_type_t {
+
+       /**
+        * EAP type
+        */
+       eap_type_t type;
+
+       /**
+        * Vendor Id
+        */
+       u_int32_t vendor;
+};
+
+/**
  * EAP packet format
  */
 typedef struct __attribute__((packed)) {
@@ -101,4 +120,12 @@ typedef struct __attribute__((packed)) {
  */
 eap_type_t eap_type_from_string(char *name);
 
+/**
+ * Parse a string of the form [eap-]type[-vendor].
+ *
+ * @param str          EAP method string
+ * @return                     parsed type (gets allocated), NULL if unknown or failed
+ */
+eap_vendor_type_t *eap_vendor_type_from_string(char *str);
+
 #endif /** EAP_H_ @}*/