diff options
Diffstat (limited to 'epan/ftypes')
-rw-r--r-- | epan/ftypes/Makefile.am | 1 | ||||
-rw-r--r-- | epan/ftypes/Makefile.nmake | 1 | ||||
-rw-r--r-- | epan/ftypes/ftype-bytes.c | 119 | ||||
-rw-r--r-- | epan/ftypes/ftype-guid.c | 167 | ||||
-rw-r--r-- | epan/ftypes/ftypes-int.h | 1 | ||||
-rw-r--r-- | epan/ftypes/ftypes.c | 1 | ||||
-rw-r--r-- | epan/ftypes/ftypes.h | 2 |
7 files changed, 173 insertions, 119 deletions
diff --git a/epan/ftypes/Makefile.am b/epan/ftypes/Makefile.am index ba94e1c035..580970cbb5 100644 --- a/epan/ftypes/Makefile.am +++ b/epan/ftypes/Makefile.am @@ -41,6 +41,7 @@ libftypes_la_SOURCES = \ ftype-double.c \ ftype-integer.c \ ftype-ipv4.c \ + ftype-guid.c \ ftype-none.c \ ftype-pcre.c \ ftype-string.c \ diff --git a/epan/ftypes/Makefile.nmake b/epan/ftypes/Makefile.nmake index 9408c4fba6..8bcbeba2d8 100644 --- a/epan/ftypes/Makefile.nmake +++ b/epan/ftypes/Makefile.nmake @@ -22,6 +22,7 @@ OBJECTS = \ ftype-double.obj \ ftype-integer.obj \ ftype-ipv4.obj \ + ftype-guid.obj \ ftype-none.obj \ ftype-pcre.obj \ ftype-string.obj \ diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c index 38072e519b..6de2616359 100644 --- a/epan/ftypes/ftype-bytes.c +++ b/epan/ftypes/ftype-bytes.c @@ -39,7 +39,6 @@ #define ETHER_LEN 6 #define IPv6_LEN 16 -#define GUID_LEN 16 static void bytes_fvalue_new(fvalue_t *fv) @@ -77,18 +76,6 @@ bytes_repr_len(fvalue_t *fv, ftrepr_t rtype _U_) } static int -guid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_) -{ - return GUID_STR_LEN; -} - -static void -guid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) -{ - guid_to_str_buf(fv->value.bytes->data, buf, GUID_STR_LEN); -} - -static int oid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_) { /* more exact computation will come later */ @@ -148,13 +135,6 @@ ipv6_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied) } static void -guid_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied) -{ - g_assert(!already_copied); - common_fvalue_set(fv, value, GUID_LEN); -} - -static void oid_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied) { g_assert(already_copied); @@ -279,69 +259,6 @@ ipv6_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) } static gboolean -get_guid(char *s, guint8 *buf) -{ - size_t i, n; - char *p, two_digits[3]; - static const char fmt[] = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; - - n = strlen(s); - if (n != strlen(fmt)) - return FALSE; - for (i=0; i<n; i++) { - if (fmt[i] == 'X') { - if (!isxdigit((guchar)s[i])) - return FALSE; - } else { - if (s[i] != fmt[i]) - return FALSE; - } - } - for (p=s,i=0; i<GUID_LEN; i++) { - if (*p == '-') p++; - two_digits[0] = *(p++); - two_digits[1] = *(p++); - two_digits[2] = '\0'; - buf[i] = (guint8)strtoul(two_digits, NULL, 16); - } - return TRUE; -} - -static gboolean -guid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) -{ - guint8 buffer[GUID_LEN]; - - /* - * Don't log a message if this fails; we'll try looking it - * up as an GUID if it does, and if that fails, - * we'll log a message. - */ - if (bytes_from_unparsed(fv, s, TRUE, NULL)) { - if (fv->value.bytes->len > GUID_LEN) { - logfunc("\"%s\" contains too many bytes to be a valid Globally Unique Identifier.", - s); - return FALSE; - } - else if (fv->value.bytes->len < GUID_LEN && !allow_partial_value) { - logfunc("\"%s\" contains too few bytes to be a valid Globally Unique Identifier.", - s); - return FALSE; - } - - return TRUE; - } - - if (!get_guid(s, buffer)) { - logfunc("\"%s\" is not a valid GUID.", s); - return FALSE; - } - - guid_fvalue_set(fv, buffer, FALSE); - return TRUE; -} - -static gboolean oid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc) { GByteArray *bytes; @@ -702,41 +619,6 @@ ftype_register_bytes(void) slice, }; - static ftype_t guid_type = { - "GUID", /* name */ - "Globally Unique Identifier", /* pretty_name */ - GUID_LEN, /* wire_size */ - bytes_fvalue_new, /* new_value */ - bytes_fvalue_free, /* free_value */ - guid_from_unparsed, /* val_from_unparsed */ - NULL, /* val_from_string */ - guid_to_repr, /* val_to_string_repr */ - guid_repr_len, /* len_string_repr */ - - guid_fvalue_set, /* set_value */ - NULL, /* set_value_integer */ - NULL, /* set_value_integer64 */ - NULL, /* set_value_floating */ - - value_get, /* get_value */ - NULL, /* get_value_integer */ - NULL, /* get_value_integer64 */ - NULL, /* get_value_floating */ - - cmp_eq, - cmp_ne, - cmp_gt, - cmp_ge, - cmp_lt, - cmp_le, - cmp_bytes_bitwise_and, - cmp_contains, - NULL, /* cmp_matches */ - - len, - slice, - }; - static ftype_t oid_type = { "OID", /* name */ "OBJECT IDENTIFIER", /* pretty_name */ @@ -776,6 +658,5 @@ ftype_register_bytes(void) ftype_register(FT_UINT_BYTES, &uint_bytes_type); ftype_register(FT_ETHER, ðer_type); ftype_register(FT_IPv6, &ipv6_type); - ftype_register(FT_GUID, &guid_type); ftype_register(FT_OID, &oid_type); } diff --git a/epan/ftypes/ftype-guid.c b/epan/ftypes/ftype-guid.c new file mode 100644 index 0000000000..6f229ae81e --- /dev/null +++ b/epan/ftypes/ftype-guid.c @@ -0,0 +1,167 @@ +/*
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 2001 Gerald Combs
+ *
+ * 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 Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <ftypes-int.h>
+#include <epan/guid-utils.h>
+
+#define GUID_LEN 16
+
+static void
+set_guid(fvalue_t *fv, e_guid_t *value)
+{
+ fv->value.guid = *value;
+}
+
+static gpointer
+value_get(fvalue_t *fv)
+{
+ return &(fv->value.guid);
+}
+
+static gboolean
+get_guid(char *s, e_guid_t *guid)
+{
+ size_t i, n;
+ char *p, digits[9];
+ static const char fmt[] = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
+
+ n = strlen(s);
+ if (n != strlen(fmt))
+ return FALSE;
+ for (i=0; i<n; i++) {
+ if (fmt[i] == 'X') {
+ if (!isxdigit((guchar)s[i]))
+ return FALSE;
+ } else {
+ if (s[i] != fmt[i])
+ return FALSE;
+ }
+ }
+
+ p = s;
+ strncpy(digits, p, 8);
+ digits[8] = '\0';
+ guid->data1 = strtoul(digits, NULL, 16);
+ p += 9;
+ strncpy(digits, p, 4);
+ digits[4] = '\0';
+ guid->data2 = (guint16)strtoul(digits, NULL, 16);
+ p += 5;
+ strncpy(digits, p, 4);
+ digits[4] = '\0';
+ guid->data3 = (guint16)strtoul(digits, NULL, 16);
+ p += 5;
+ for (i=0; i < sizeof(guid->data4); i++) {
+ if (*p == '-') p++;
+ digits[0] = *(p++);
+ digits[1] = *(p++);
+ digits[2] = '\0';
+ guid->data4[i] = (guint8)strtoul(digits, NULL, 16);
+ }
+ return TRUE;
+}
+
+static gboolean
+guid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc)
+{
+ e_guid_t guid;
+
+ if (!get_guid(s, &guid)) {
+ logfunc("\"%s\" is not a valid GUID.", s);
+ return FALSE;
+ }
+
+ set_guid(fv, &guid);
+ return TRUE;
+}
+
+static int
+guid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_)
+{
+ return GUID_STR_LEN;
+}
+
+static void
+guid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf)
+{
+ guid_to_str_buf(&fv->value.guid, buf, GUID_STR_LEN);
+}
+
+static gboolean
+cmp_eq(fvalue_t *a, fvalue_t *b)
+{
+ return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) == 0;
+}
+
+static gboolean
+cmp_ne(fvalue_t *a, fvalue_t *b)
+{
+ return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) != 0;
+}
+
+void
+ftype_register_guid(void)
+{
+
+ static ftype_t guid_type = {
+ "GUID", /* name */
+ "Globally Unique Identifier", /* pretty_name */
+ GUID_LEN, /* wire_size */
+ NULL, /* new_value */
+ NULL, /* free_value */
+ guid_from_unparsed, /* val_from_unparsed */
+ NULL, /* val_from_string */
+ guid_to_repr, /* val_to_string_repr */
+ guid_repr_len, /* len_string_repr */
+
+ set_guid, /* set_value */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_integer64 */
+ NULL, /* set_value_floating */
+
+ value_get, /* get_value */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_integer64 */
+ NULL, /* get_value_floating */
+
+ cmp_eq,
+ cmp_ne,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* cmp_matches */
+
+ NULL,
+ NULL,
+ };
+
+ ftype_register(FT_GUID, &guid_type);
+}
diff --git a/epan/ftypes/ftypes-int.h b/epan/ftypes/ftypes-int.h index c6928b535e..133300369c 100644 --- a/epan/ftypes/ftypes-int.h +++ b/epan/ftypes/ftypes-int.h @@ -51,6 +51,7 @@ void ftype_register_bytes(void); void ftype_register_double(void); void ftype_register_integers(void); void ftype_register_ipv4(void); +void ftype_register_guid(void); void ftype_register_none(void); void ftype_register_string(void); void ftype_register_time(void); diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index c12c4fe8d2..e40dfc4f06 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -44,6 +44,7 @@ ftypes_initialize(void) ftype_register_double(); ftype_register_integers(); ftype_register_ipv4(); + ftype_register_guid(); ftype_register_none(); ftype_register_string(); ftype_register_time(); diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 5fbf163dc9..6a30a4b7b5 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -138,6 +138,7 @@ ftype_can_matches(enum ftenum ftype); /* ---------------- FVALUE ----------------- */ #include <epan/ipv4.h> +#include <epan/guid-utils.h> #include <epan/tvbuff.h> #include <epan/nstime.h> @@ -156,6 +157,7 @@ typedef struct _fvalue_t { GByteArray *bytes; GString *gstring; ipv4_addr ipv4; + e_guid_t guid; nstime_t time; tvbuff_t *tvb; #ifdef HAVE_LIBPCRE |