new FT_GUID handling - big/little endian supported
authorkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 10 Mar 2006 11:58:22 +0000 (11:58 +0000)
committerkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 10 Mar 2006 11:58:22 +0000 (11:58 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@17566 f5534014-38df-0310-8fa8-9805f1628bb7

14 files changed:
epan/ftypes/Makefile.am
epan/ftypes/Makefile.nmake
epan/ftypes/ftype-bytes.c
epan/ftypes/ftype-guid.c [new file with mode: 0644]
epan/ftypes/ftypes-int.h
epan/ftypes/ftypes.c
epan/ftypes/ftypes.h
epan/guid-utils.h [new file with mode: 0644]
epan/proto.c
epan/proto.h
epan/to_str.c
epan/to_str.h
epan/tvbuff.c
epan/tvbuff.h

index ba94e1c03586d95a3b8708b2e8b2677eec7f7e7f..580970cbb50df652a131d397487c95dae23a520a 100644 (file)
@@ -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  \
index 9408c4fba680eb8edee3ead1d46f87c6cd6fb2a2..8bcbeba2d86178557d3d5444b3e21424503e5da8 100644 (file)
@@ -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        \
index 38072e519bab6a133b087ee0289fec19344106c0..6de261635979a8657619b2e72c50ed26ed964f09 100644 (file)
@@ -39,7 +39,6 @@
 
 #define ETHER_LEN      6
 #define IPv6_LEN       16
-#define GUID_LEN       16
 
 static void
 bytes_fvalue_new(fvalue_t *fv)
@@ -76,18 +75,6 @@ bytes_repr_len(fvalue_t *fv, ftrepr_t rtype _U_)
        return fv->value.bytes->len * 3 - 1;
 }
 
-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_)
 {
@@ -147,13 +134,6 @@ ipv6_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied)
        common_fvalue_set(fv, value, IPv6_LEN);
 }
 
-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)
 {
@@ -278,69 +258,6 @@ ipv6_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf)
        ip6_to_str_buf((struct e_in6_addr *)fv->value.bytes->data, 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)
 {
@@ -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 (file)
index 0000000..6f229ae
--- /dev/null
@@ -0,0 +1,167 @@
+/*\r
+ * $Id$\r
+ *\r
+ * Ethereal - Network traffic analyzer\r
+ * By Gerald Combs <gerald@ethereal.com>\r
+ * Copyright 2001 Gerald Combs\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+ */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include <string.h>\r
+\r
+#include <ftypes-int.h>\r
+#include <epan/guid-utils.h>\r
+\r
+#define GUID_LEN       16\r
+\r
+static void\r
+set_guid(fvalue_t *fv, e_guid_t *value)\r
+{\r
+       fv->value.guid = *value;\r
+}\r
+\r
+static gpointer\r
+value_get(fvalue_t *fv)\r
+{\r
+       return &(fv->value.guid);\r
+}\r
+\r
+static gboolean\r
+get_guid(char *s, e_guid_t *guid)\r
+{\r
+       size_t i, n;\r
+       char *p, digits[9];\r
+       static const char fmt[] = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";\r
+\r
+       n = strlen(s);\r
+       if (n != strlen(fmt))\r
+               return FALSE;\r
+       for (i=0; i<n; i++) {\r
+               if (fmt[i] == 'X') {\r
+                       if (!isxdigit((guchar)s[i]))\r
+                               return FALSE;\r
+               } else {\r
+                       if (s[i] != fmt[i])\r
+                               return FALSE;\r
+               }\r
+       }\r
+       \r
+       p = s;\r
+       strncpy(digits, p, 8); \r
+    digits[8] = '\0';\r
+       guid->data1 = strtoul(digits, NULL, 16);\r
+    p += 9;\r
+       strncpy(digits, p, 4); \r
+    digits[4] = '\0';\r
+       guid->data2 = (guint16)strtoul(digits, NULL, 16);\r
+    p += 5;\r
+       strncpy(digits, p, 4); \r
+    digits[4] = '\0';\r
+       guid->data3 = (guint16)strtoul(digits, NULL, 16);\r
+    p += 5;\r
+       for (i=0; i < sizeof(guid->data4); i++) {\r
+               if (*p == '-') p++;\r
+               digits[0] = *(p++);\r
+               digits[1] = *(p++);\r
+               digits[2] = '\0';\r
+               guid->data4[i] = (guint8)strtoul(digits, NULL, 16);\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+static gboolean\r
+guid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc)\r
+{\r
+        e_guid_t guid;\r
+\r
+       if (!get_guid(s, &guid)) {\r
+               logfunc("\"%s\" is not a valid GUID.", s);\r
+               return FALSE;\r
+       }\r
+\r
+       set_guid(fv, &guid);\r
+       return TRUE;\r
+}\r
+\r
+static int\r
+guid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_)\r
+{\r
+       return GUID_STR_LEN;\r
+}\r
+\r
+static void\r
+guid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf)\r
+{\r
+       guid_to_str_buf(&fv->value.guid, buf, GUID_STR_LEN);\r
+}\r
+\r
+static gboolean\r
+cmp_eq(fvalue_t *a, fvalue_t *b)\r
+{\r
+       return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) == 0;\r
+}\r
+\r
+static gboolean\r
+cmp_ne(fvalue_t *a, fvalue_t *b)\r
+{\r
+       return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) != 0;\r
+}\r
+\r
+void\r
+ftype_register_guid(void)\r
+{\r
+\r
+       static ftype_t guid_type = {\r
+               "GUID",                 /* name */\r
+               "Globally Unique Identifier",                   /* pretty_name */\r
+               GUID_LEN,                       /* wire_size */\r
+               NULL,                           /* new_value */\r
+               NULL,                           /* free_value */\r
+               guid_from_unparsed,     /* val_from_unparsed */\r
+               NULL,                           /* val_from_string */\r
+               guid_to_repr,           /* val_to_string_repr */\r
+               guid_repr_len,          /* len_string_repr */\r
+\r
+               set_guid,                       /* set_value */\r
+               NULL,                           /* set_value_integer */\r
+               NULL,                           /* set_value_integer64 */\r
+               NULL,                           /* set_value_floating */\r
+\r
+               value_get,                      /* get_value */\r
+               NULL,                           /* get_value_integer */\r
+               NULL,                           /* get_value_integer64 */\r
+               NULL,                           /* get_value_floating */\r
+\r
+               cmp_eq,\r
+               cmp_ne,\r
+               NULL,\r
+               NULL,\r
+               NULL,\r
+               NULL,\r
+               NULL,\r
+               NULL,\r
+               NULL,                           /* cmp_matches */\r
+\r
+               NULL,\r
+               NULL,\r
+       };\r
+\r
+       ftype_register(FT_GUID, &guid_type);\r
+}\r
index c6928b535eec5a6e82e95cdc336d82d91c4bba9a..133300369cd43f633b1a219bc7555427d122020f 100644 (file)
@@ -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);
index c12c4fe8d2aef5d60fe253cd73e8c463247e9767..e40dfc4f0603c15e19f3fbf73b3efb1ebd42dee9 100644 (file)
@@ -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();
index 5fbf163dc9b7e7c05657f884526a28ca70beeee6..6a30a4b7b5a54aec082d22aeb0fd272759792aa9 100644 (file)
@@ -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
diff --git a/epan/guid-utils.h b/epan/guid-utils.h
new file mode 100644 (file)
index 0000000..8526981
--- /dev/null
@@ -0,0 +1,38 @@
+/* guid-utils.h\r
+ * Definitions for GUID handling\r
+ *\r
+ * $Id$\r
+ *\r
+ * Ethereal - Network traffic analyzer\r
+ * By Gerald Combs <gerald@ethereal.com>\r
+ *\r
+ * Copyright 1998 Gerald Combs\r
+ *\r
+ * MobileIPv6 support added by Tomislav Borosa <tomislav.borosa@siemens.hr>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+ */\r
+\r
+#ifndef __GUID_UTILS_H__\r
+#define __GUID_UTILS_H__\r
+\r
+typedef struct _e_guid_t {\r
+    guint32 data1;\r
+    guint16 data2;\r
+    guint16 data3;\r
+    guint8  data4[8];\r
+} e_guid_t;\r
+\r
+#endif /* __GUID_UTILS_H__ */\r
index f3411740b59e893b41fbcc813d684decdc87b370..9cb904c8ef64bf4296ddf44609165f297b3139dc 100644 (file)
@@ -151,9 +151,9 @@ proto_tree_set_ipv6(field_info *fi, const guint8* value_ptr);
 static void
 proto_tree_set_ipv6_tvb(field_info *fi, tvbuff_t *tvb, gint start);
 static void
-proto_tree_set_guid(field_info *fi, const guint8* value_ptr);
+proto_tree_set_guid(field_info *fi, const e_guid_t *value_ptr);
 static void
-proto_tree_set_guid_tvb(field_info *fi, tvbuff_t *tvb, gint start);
+proto_tree_set_guid_tvb(field_info *fi, tvbuff_t *tvb, gint start, gboolean little_endian);
 static void
 proto_tree_set_oid(field_info *fi, const guint8* value_ptr, gint length);
 static void
@@ -902,7 +902,7 @@ proto_tree_new_item(field_info *new_fi, proto_tree *tree, int hfindex,
 
                case FT_GUID:
                        DISSECTOR_ASSERT(length == 16);
-                       proto_tree_set_guid_tvb(new_fi, tvb, start);
+                       proto_tree_set_guid_tvb(new_fi, tvb, start, little_endian);
                        break;
 
                case FT_OID:
@@ -1637,7 +1637,7 @@ proto_tree_set_ipv6_tvb(field_info *fi, tvbuff_t *tvb, gint start)
 /* Add a FT_GUID to a proto_tree */
 proto_item *
 proto_tree_add_guid(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint length,
-               const guint8* value_ptr)
+               const e_guid_t *value_ptr)
 {
        proto_item              *pi;
        field_info              *new_fi;
@@ -1659,7 +1659,7 @@ proto_tree_add_guid(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gi
 
 proto_item *
 proto_tree_add_guid_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint length,
-               const guint8* value_ptr)
+               const e_guid_t *value_ptr)
 {
        proto_item              *pi;
 
@@ -1674,7 +1674,7 @@ proto_tree_add_guid_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint st
 
 proto_item *
 proto_tree_add_guid_format_value(proto_tree *tree, int hfindex, tvbuff_t *tvb,
-               gint start, gint length, const guint8* value_ptr,
+               gint start, gint length, const e_guid_t *value_ptr,
                const char *format, ...)
 {
        proto_item              *pi;
@@ -1693,7 +1693,7 @@ proto_tree_add_guid_format_value(proto_tree *tree, int hfindex, tvbuff_t *tvb,
 
 proto_item *
 proto_tree_add_guid_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint length,
-               const guint8* value_ptr, const char *format, ...)
+               const e_guid_t *value_ptr, const char *format, ...)
 {
        proto_item              *pi;
        va_list                 ap;
@@ -1711,16 +1711,19 @@ proto_tree_add_guid_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint st
 
 /* Set the FT_GUID value */
 static void
-proto_tree_set_guid(field_info *fi, const guint8* value_ptr)
+proto_tree_set_guid(field_info *fi, const e_guid_t *value_ptr)
 {
        DISSECTOR_ASSERT(value_ptr != NULL);
        fvalue_set(&fi->value, (gpointer) value_ptr, FALSE);
 }
 
 static void
-proto_tree_set_guid_tvb(field_info *fi, tvbuff_t *tvb, gint start)
+proto_tree_set_guid_tvb(field_info *fi, tvbuff_t *tvb, gint start, gboolean little_endian)
 {
-       proto_tree_set_guid(fi, tvb_get_ptr(tvb, start, 16));
+       e_guid_t guid;
+       
+       tvb_get_guid(tvb, start, &guid, little_endian);
+       proto_tree_set_guid(fi, &guid);
 }
 
 /* Add a FT_OID to a proto_tree */
@@ -3669,6 +3672,7 @@ proto_item_fill_label(field_info *fi, gchar *label_str)
        guint8                          *bytes;
        guint32                         integer;
        ipv4_addr                       *ipv4;
+       e_guid_t                        *guid;
        guint32                         n_addr; /* network-order IPv4 address */
        const gchar                     *name;
        int                                     ret;    /*tmp return value */
@@ -3827,10 +3831,10 @@ proto_item_fill_label(field_info *fi, gchar *label_str)
                        break;
 
                case FT_GUID:
-                       bytes = fvalue_get(&fi->value);
+                       guid = fvalue_get(&fi->value);
                        ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
                                "%s: %s", hfinfo->name,
-                                guid_to_str(bytes));
+                                guid_to_str(guid));
                        if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH))
                                label_str[ITEM_LABEL_LENGTH - 1] = '\0';
                        break;
index 27c9e1bf4de19cd262cc4edb3f0821a81afc9cb4..9ef5801315c768b546ac988035140b9e0f82ba7f 100644 (file)
@@ -817,13 +817,13 @@ proto_tree_add_ether_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint s
  @return the newly created item */
 extern proto_item *
 proto_tree_add_guid(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
-       gint length, const guint8* value_ptr);
+       gint length, const e_guid_t *value_ptr);
 
 /** Add a hidden FT_GUID to a proto_tree.
  @deprecated use proto_tree_add_guid() and a subsequent call to PROTO_ITEM_SET_HIDDEN() instead */
 extern proto_item *
 proto_tree_add_guid_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
-       gint length, const guint8* value_ptr);
+       gint length, const e_guid_t *value_ptr);
 
 /** Add a formatted FT_GUID to a proto_tree, with the format generating
     the string for the value and with the field name being included
@@ -839,7 +839,7 @@ proto_tree_add_guid_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint st
  @return the newly created item */
 extern proto_item *
 proto_tree_add_guid_format_value(proto_tree *tree, int hfindex, tvbuff_t *tvb,
-       gint start, gint length, const guint8* value_ptr, const char *format,
+       gint start, gint length, const e_guid_t *value_ptr, const char *format,
        ...) GNUC_FORMAT_CHECK(printf,7,8);
 
 /** Add a formatted FT_GUID to a proto_tree, with the format generating
@@ -855,7 +855,7 @@ proto_tree_add_guid_format_value(proto_tree *tree, int hfindex, tvbuff_t *tvb,
  @return the newly created item */
 extern proto_item *
 proto_tree_add_guid_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
-       gint length, const guint8* value_ptr, const char *format, ...) GNUC_FORMAT_CHECK(printf,7,8);
+       gint length, const e_guid_t *value_ptr, const char *format, ...) GNUC_FORMAT_CHECK(printf,7,8);
 
 /** Add a FT_OID to a proto_tree.
  @param tree the tree to append this item to
@@ -870,7 +870,7 @@ proto_tree_add_oid(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
        gint length, const guint8* value_ptr);
 
 /** Add a hidden FT_OID to a proto_tree.
- @deprecated use proto_tree_add_guid() and a subsequent call to PROTO_ITEM_SET_HIDDEN() instead */
+ @deprecated use proto_tree_add_oid() and a subsequent call to PROTO_ITEM_SET_HIDDEN() instead */
 extern proto_item *
 proto_tree_add_oid_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
        gint length, const guint8* value_ptr);
index 715e3e1d31d9cbe92a04afb0e299c603484a2319..6fffca81da8a443bdd754d4dfc35628b43e90a26 100644 (file)
@@ -873,19 +873,17 @@ gchar* oid_to_str_buf(const guint8 *oid, gint oid_len, gchar *buf, int buf_len)
   return buf;
 }
 
-gchar* guid_to_str(const guint8 *guid) {
+gchar* guid_to_str(const e_guid_t *guid) {
   gchar *buf;
 
   buf=ep_alloc(GUID_STR_LEN);
   return guid_to_str_buf(guid, buf, GUID_STR_LEN);
 }
 
-gchar* guid_to_str_buf(const guint8 *guid, gchar *buf, int buf_len) {
-  g_snprintf(buf, buf_len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-          guid[0], guid[1], guid[2], guid[3],
-          guid[4], guid[5],
-          guid[6], guid[7],
-          guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15]);
+gchar* guid_to_str_buf(const e_guid_t *guid, gchar *buf, int buf_len) {
+  g_snprintf(buf, buf_len, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+          guid->data1, guid->data2, guid->data3,
+          guid->data4[0], guid->data4[1], guid->data4[2], guid->data4[3], guid->data4[4], guid->data4[5], guid->data4[6], guid->data4[7]);
   return buf;
 }
 
index 3b741a4ecb5f59ec99aecac6e35c625be457a6d6..4bbe5e9447a1e4bf162f08ed1e93f4920cbf417f 100644 (file)
@@ -76,8 +76,8 @@ extern gchar* rel_time_to_str(nstime_t*);
 extern gchar*  rel_time_to_secs_str(nstime_t*);
 extern gchar*  oid_to_str(const guint8*, gint);
 extern gchar*  oid_to_str_buf(const guint8*, gint, gchar*, int);
-extern gchar*  guid_to_str(const guint8*);
-extern gchar*  guid_to_str_buf(const guint8*, gchar*, int);
+extern gchar*  guid_to_str(const e_guid_t*);
+extern gchar*  guid_to_str_buf(const e_guid_t*, gchar*, int);
 
 void tipc_addr_to_str_buf( const guint8 *data, gchar *buf, int buf_len);
 
index a31584845cc7e0d618d2f05fd839b6bca5844345..fd7d0404edd77a5a7f3791e182153f9df4e34375 100644 (file)
@@ -1411,6 +1411,41 @@ tvb_get_ipv6(tvbuff_t *tvb, gint offset, struct e_in6_addr *addr)
        memcpy(addr, ptr, sizeof *addr);
 }
 
+/* Fetch a GUID. */
+void
+tvb_get_ntohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid)
+{
+       const guint8* ptr;
+
+       ensure_contiguous(tvb, offset, sizeof(*guid));
+       guid->data1 = tvb_get_ntohl(tvb, offset);
+       guid->data2 = tvb_get_ntohs(tvb, offset + 4);
+       guid->data3 = tvb_get_ntohs(tvb, offset + 6);
+       tvb_memcpy(tvb, guid->data4, offset + 8, sizeof guid->data4);
+}
+
+void
+tvb_get_letohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid)
+{
+       const guint8* ptr;
+
+       ensure_contiguous(tvb, offset, sizeof(*guid));
+       guid->data1 = tvb_get_letohl(tvb, offset);
+       guid->data2 = tvb_get_letohs(tvb, offset + 4);
+       guid->data3 = tvb_get_letohs(tvb, offset + 6);
+       tvb_memcpy(tvb, guid->data4, offset + 8, sizeof guid->data4);
+}
+
+void
+tvb_get_guid(tvbuff_t *tvb, gint offset, e_guid_t *guid, gboolean little_endian)
+{
+       if (little_endian) {
+               tvb_get_letohguid(tvb, offset, guid);
+       } else {
+               tvb_get_ntohguid(tvb, offset, guid);
+       }
+}
+
 /* Find first occurence of needle in tvbuff, starting at offset. Searches
  * at most maxlength number of bytes; if maxlength is -1, searches to
  * end of tvbuff.
index efe9ef6d4a4458d9492ddab2d238ccc75424db59..144af286664e38d88e7bc35a62c4a0f353b9e0de 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <glib.h>
 #include <epan/ipv6-utils.h>
+#include <epan/guid-utils.h>
 #include "exceptions.h"
 
 /** @file
@@ -330,6 +331,12 @@ extern guint32 tvb_get_ipv4(tvbuff_t*, gint offset);
 /* Fetch an IPv6 address. */
 extern void tvb_get_ipv6(tvbuff_t*, gint offset, struct e_in6_addr *addr);
 
+/* Fetch a GUID. */
+extern void tvb_get_ntohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid);
+extern void tvb_get_letohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid);
+extern void tvb_get_guid(tvbuff_t *tvb, gint offset, e_guid_t *guid, gboolean little_endian);
+
+
 /** Returns target for convenience. Does not suffer from possible
  * expense of tvb_get_ptr(), since this routine is smart enough
  * to copy data in chunks if the request range actually exists in