aboutsummaryrefslogtreecommitdiffstats
path: root/epan/ftypes
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2006-03-10 11:58:22 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2006-03-10 11:58:22 +0000
commit923855bb20845f55472dfe8e62b7b43660f2f63b (patch)
tree79879c08850761a73e66166eea9838551d75b3e7 /epan/ftypes
parent281e4a7ebb92c705d0d757e472fd6285eaf2636f (diff)
new FT_GUID handling - big/little endian supported
svn path=/trunk/; revision=17566
Diffstat (limited to 'epan/ftypes')
-rw-r--r--epan/ftypes/Makefile.am1
-rw-r--r--epan/ftypes/Makefile.nmake1
-rw-r--r--epan/ftypes/ftype-bytes.c119
-rw-r--r--epan/ftypes/ftype-guid.c167
-rw-r--r--epan/ftypes/ftypes-int.h1
-rw-r--r--epan/ftypes/ftypes.c1
-rw-r--r--epan/ftypes/ftypes.h2
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, &ether_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