Pick up the stuff I did for tcpdump to figure out the right strings to

use to format 64-bit integers.

Fix the RSVP dissector to use that rather than hardcoding "%ll" in.

Remove the "only if G_HAVE_GINT64 is defined" bit from the discussion of
64-bit integers - we're too dependent on having them to support
compilers that don't have a 64-bit integral data type.  Do, however,
note that neither "long" nor "long long" are acceptable, and also note
that you shouldn't assume "%ll" does the trick for printing them.

svn path=/trunk/; revision=11182
This commit is contained in:
Guy Harris 2004-06-19 00:07:23 +00:00
parent 641a9fbf47
commit 7002776572
6 changed files with 170 additions and 18 deletions

View File

@ -2,7 +2,7 @@ dnl Macros that test for specific features.
dnl This file is part of the Autoconf packaging for Ethereal. dnl This file is part of the Autoconf packaging for Ethereal.
dnl Copyright (C) 1998-2000 by Gerald Combs. dnl Copyright (C) 1998-2000 by Gerald Combs.
dnl dnl
dnl $Id: acinclude.m4,v 1.76 2004/05/18 11:11:37 jmayer Exp $ dnl $Id: acinclude.m4,v 1.77 2004/06/19 00:07:22 guy Exp $
dnl dnl
dnl This program is free software; you can redistribute it and/or modify dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by dnl it under the terms of the GNU General Public License as published by
@ -92,6 +92,48 @@ if test $ac_cv_ethereal_struct_sa_len = yes; then
fi fi
]) ])
dnl
dnl Check whether a given format can be used to print 64-bit integers
dnl
AC_DEFUN(AC_ETHEREAL_CHECK_64BIT_FORMAT,
[
AC_MSG_CHECKING([whether %$1x can be used to format 64-bit integers])
AC_RUN_IFELSE(
[
AC_LANG_SOURCE(
[[
# ifdef HAVE_INTTYPES_H
#include <inttypes.h>
# endif
#include <stdio.h>
#include <sys/types.h>
main()
{
u_int64_t t = 1;
char strbuf[16+1];
sprintf(strbuf, "%016$1x", t << 32);
if (strcmp(strbuf, "0000000100000000") == 0)
exit(0);
else
exit(1);
}
]])
],
[
AC_DEFINE(PRId64, "$1d", [Format for printing 64-bit signed decimal numbers])
AC_DEFINE(PRIo64, "$1o", [Format for printing 64-bit unsigned octal numbers])
AC_DEFINE(PRIx64, "$1x", [Format for printing 64-bit unsigned hexadecimal numbers])
AC_DEFINE(PRIu64, "$1u", [Format for printing 64-bit unsigned decimal numbers])
AC_MSG_RESULT(yes)
],
[
AC_MSG_RESULT(no)
$2
])
])
# #
# AC_ETHEREAL_IPV6_STACK # AC_ETHEREAL_IPV6_STACK
# #

View File

@ -1,4 +1,4 @@
/* $Id: config.h.win32,v 1.45 2004/05/09 10:03:36 guy Exp $ */ /* $Id: config.h.win32,v 1.46 2004/06/19 00:07:22 guy Exp $ */
/* config.h.win32 Generated manually. :-) */ /* config.h.win32 Generated manually. :-) */
/* config.h. Generated automatically by configure. */ /* config.h. Generated automatically by configure. */
/* config.h.in. Generated automatically from configure.in by autoheader. */ /* config.h.in. Generated automatically from configure.in by autoheader. */
@ -118,6 +118,45 @@
/* Define if you have the <unistd.h> header file. */ /* Define if you have the <unistd.h> header file. */
/* #define HAVE_UNISTD_H 1 */ /* #define HAVE_UNISTD_H 1 */
/* Define if <inttypes.h> defines PRI[doxu]64 macros */
/* #define INTTYPES_H_DEFINES_FORMATS */
/* Format for printing 64-bit signed decimal numbers */
#ifndef PRId64
#ifdef _MSC_EXTENSIONS
#define PRId64 "i64d"
#else /* _MSC_EXTENSIONS */
#define PRId64 "lld"
#endif /* _MSC_EXTENSIONS */
#endif /* PRId64 */
/* Format for printing 64-bit unsigned octal numbers */
#ifndef PRIo64
#ifdef _MSC_EXTENSIONS
#define PRIo64 "i64o"
#else /* _MSC_EXTENSIONS */
#define PRIo64 "llo"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIo64 */
/* Format for printing 64-bit unsigned decimal numbers */
#ifndef PRIu64
#ifdef _MSC_EXTENSIONS
#define PRIu64 "i64u"
#else /* _MSC_EXTENSIONS */
#define PRIu64 "llu"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIu64 */
/* Format for printing 64-bit unsigned hexadecimal numbers */
#ifndef PRIx64
#ifdef _MSC_EXTENSIONS
#define PRIx64 "i64x"
#else /* _MSC_EXTENSIONS */
#define PRIx64 "llx"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIx64 */
/* Define if you have the z library (-lz). */ /* Define if you have the z library (-lz). */
@HAVE_LIBZ@ @HAVE_LIBZ@

View File

@ -1,4 +1,4 @@
# $Id: configure.in,v 1.266 2004/06/17 14:37:43 jmayer Exp $ # $Id: configure.in,v 1.267 2004/06/19 00:07:22 guy Exp $
# #
AC_INIT(etypes.h) AC_INIT(etypes.h)
@ -230,6 +230,64 @@ if test "$HAVE_GNU_SED" = no ; then
esac esac
fi fi
#
# We can't just check for <inttypes.h> - some systems have one that
# doesn't define all the PRI[doxu]64 macros.
#
AC_CHECK_HEADERS(inttypes.h,
[
#
# OK, we have inttypes.h, but does it define those macros?
#
AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]])
AC_COMPILE_IFELSE(
[
AC_LANG_SOURCE(
[[
#include <inttypes.h>
#include <stdio.h>
#include <sys/types.h>
main()
{
printf("%" PRId64 "\n", (u_int64_t)1);
printf("%" PRIo64 "\n", (u_int64_t)1);
printf("%" PRIx64 "\n", (u_int64_t)1);
printf("%" PRIu64 "\n", (u_int64_t)1);
}
]])
],
[
AC_MSG_RESULT(yes)
ac_ethereal_inttypes_h_defines_formats=yes
],
[
AC_MSG_RESULT(no)
ac_ethereal_inttypes_h_defines_formats=no
])
],
[
#
# We don't have inttypes.h, so it obviously can't define those
# macros.
#
ac_ethereal_inttypes_h_defines_formats=no
])
if test "$ac_ethereal_inttypes_h_defines_formats" = yes; then
AC_DEFINE(INTTYPES_H_DEFINES_FORMATS,,[Define if <inttypes.h> defines PRI[doxu]64 macros])
else
AC_ETHEREAL_CHECK_64BIT_FORMAT(ll,
[
AC_ETHEREAL_CHECK_64BIT_FORMAT(L,
[
AC_ETHEREAL_CHECK_64BIT_FORMAT(q,
[
AC_MSG_ERROR([neither %llx nor %Lx nor %qx worked on a 64-bit integer])
])
])
])
fi
# Enable/disable tethereal # Enable/disable tethereal
AC_ARG_ENABLE(ethereal, AC_ARG_ENABLE(ethereal,

View File

@ -1,4 +1,4 @@
$Id: README.developer,v 1.95 2004/05/24 02:25:20 guy Exp $ $Id: README.developer,v 1.96 2004/06/19 00:07:23 guy Exp $
This file is a HOWTO for Ethereal developers. It describes how to start coding This file is a HOWTO for Ethereal developers. It describes how to start coding
a Ethereal protocol dissector and the use some of the important functions and a Ethereal protocol dissector and the use some of the important functions and
@ -38,14 +38,6 @@ functions declared in header files; if it doesn't work, don't declare
the function in a header file, even if this requires that you not make the function in a header file, even if this requires that you not make
it inline on any platform. it inline on any platform.
Don't use "long long"; use "gint64" or "guint64", and only do so if
G_HAVE_GINT64 is defined. Make sure your code works even if
G_HAVE_GINT64 isn't defined, even if that means treating 64-bit integral
data types as opaque arrays of bytes on platforms where it's not
defined. Also, don't assume you can use "%lld", "%llu", "%llx", or
"%llo" to print 64-bit integral data types - not all platforms support
"%ll" for printing them.
Don't use "uchar", "u_char", "ushort", "u_short", "uint", "u_int", Don't use "uchar", "u_char", "ushort", "u_short", "uint", "u_int",
"ulong", or "u_long"; they aren't defined on all platforms. If you want "ulong", or "u_long"; they aren't defined on all platforms. If you want
an 8-bit unsigned quantity, use "guint8"; if you want an 8-bit character an 8-bit unsigned quantity, use "guint8"; if you want an 8-bit character
@ -61,6 +53,19 @@ Don't use "long" to mean "signed 32-bit integer", and don't use
long on many platforms. Use "gint32" for signed 32-bit integers and use long on many platforms. Use "gint32" for signed 32-bit integers and use
"guint32" for unsigned 32-bit integers. "guint32" for unsigned 32-bit integers.
Don't use "long" to mean "signed 64-bit integer" and don't use "unsigned
long" to mean "unsigned 64-bit integer"; "long"s are 32 bits long on
other many platforms. Also don't use "long long" or "unsigned long
long", as not all platforms support them; use "gint64" or "guint64",
which will be defined as the appropriate types for 64-bit signed and
unsigned integers. Also, don't assume you can use "%lld", "%llu",
"%llx", or "%llo" to print 64-bit integral data types - not all
platforms support "%ll" for printing them. Instead, use PRId64, PRIu64,
PRIx64, and PRIo64, for example
proto_tree_add_text(tree, tvb, offset, 8,
"Sequence Number: %" PRIu64, sequence_number);
Don't use a label without a statement following it. For example, Don't use a label without a statement following it. For example,
something such as something such as
@ -363,12 +368,12 @@ code inside
is needed only if you are using the "snprintf()" function. is needed only if you are using the "snprintf()" function.
The "$Id: README.developer,v 1.95 2004/05/24 02:25:20 guy Exp $" The "$Id: README.developer,v 1.96 2004/06/19 00:07:23 guy Exp $"
in the comment will be updated by CVS when the file is in the comment will be updated by CVS when the file is
checked in; it will allow the RCS "ident" command to report which checked in; it will allow the RCS "ident" command to report which
version of the file is currently checked out. version of the file is currently checked out.
When creating a new file, it is fine to just write "$Id: README.developer,v 1.95 2004/05/24 02:25:20 guy Exp $" as RCS will When creating a new file, it is fine to just write "$Id: README.developer,v 1.96 2004/06/19 00:07:23 guy Exp $" as RCS will
automatically fill in the identifier at the time the file will be added to the automatically fill in the identifier at the time the file will be added to the
CVS repository (checked in). CVS repository (checked in).
@ -377,7 +382,7 @@ CVS repository (checked in).
* Routines for PROTONAME dissection * Routines for PROTONAME dissection
* Copyright 2000, YOUR_NAME <YOUR_EMAIL_ADDRESS> * Copyright 2000, YOUR_NAME <YOUR_EMAIL_ADDRESS>
* *
* $Id: README.developer,v 1.95 2004/05/24 02:25:20 guy Exp $ * $Id: README.developer,v 1.96 2004/06/19 00:07:23 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>

View File

@ -1,7 +1,7 @@
/* packet.h /* packet.h
* Definitions for packet disassembly structures and routines * Definitions for packet disassembly structures and routines
* *
* $Id: packet.h,v 1.73 2004/06/08 05:42:57 ulfl Exp $ * $Id: packet.h,v 1.74 2004/06/19 00:07:23 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>
@ -25,6 +25,14 @@
#ifndef __PACKET_H__ #ifndef __PACKET_H__
#define __PACKET_H__ #define __PACKET_H__
/*
* If <inttypes.h> defines formats to be used to print 64-bit integers,
* include it.
*/
#ifdef INTTYPES_H_DEFINES_FORMATS
#include <inttypes.h>
#endif
#include "wiretap/wtap.h" #include "wiretap/wtap.h"
#include "proto.h" #include "proto.h"
#include "tvbuff.h" #include "tvbuff.h"

View File

@ -3,7 +3,7 @@
* *
* (c) Copyright Ashok Narayanan <ashokn@cisco.com> * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
* *
* $Id: packet-rsvp.c,v 1.89 2004/05/19 17:45:04 ashokn Exp $ * $Id: packet-rsvp.c,v 1.90 2004/06/19 00:07:22 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>
@ -2574,7 +2574,7 @@ dissect_rsvp_integrity (proto_tree *ti, tvbuff_t *tvb,
sequence_number <<= 32; sequence_number <<= 32;
sequence_number = tvb_get_ntohl(tvb, offset2+12); sequence_number = tvb_get_ntohl(tvb, offset2+12);
proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 8, proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 8,
"Sequence Number: %llu", sequence_number); "Sequence Number: %" PRIu64, sequence_number);
proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, obj_length - 20, proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, obj_length - 20,
"Hash: %s", tvb_bytes_to_str(tvb, offset2+16, obj_length - 20)); "Hash: %s", tvb_bytes_to_str(tvb, offset2+16, obj_length - 20));
} }