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 Copyright (C) 1998-2000 by Gerald Combs.
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 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
@ -92,6 +92,48 @@ if test $ac_cv_ethereal_struct_sa_len = yes; then
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
#

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. Generated automatically by configure. */
/* config.h.in. Generated automatically from configure.in by autoheader. */
@ -118,6 +118,45 @@
/* Define if you have the <unistd.h> header file. */
/* #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). */
@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)
@ -230,6 +230,64 @@ if test "$HAVE_GNU_SED" = no ; then
esac
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
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
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
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",
"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
@ -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
"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,
something such as
@ -363,12 +368,12 @@ code inside
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
checked in; it will allow the RCS "ident" command to report which
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
CVS repository (checked in).
@ -377,7 +382,7 @@ CVS repository (checked in).
* Routines for PROTONAME dissection
* 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
* By Gerald Combs <gerald@ethereal.com>

View File

@ -1,7 +1,7 @@
/* packet.h
* 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
* By Gerald Combs <gerald@ethereal.com>
@ -25,6 +25,14 @@
#ifndef __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 "proto.h"
#include "tvbuff.h"

View File

@ -3,7 +3,7 @@
*
* (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
* By Gerald Combs <gerald@ethereal.com>
@ -2574,7 +2574,7 @@ dissect_rsvp_integrity (proto_tree *ti, tvbuff_t *tvb,
sequence_number <<= 32;
sequence_number = tvb_get_ntohl(tvb, offset2+12);
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,
"Hash: %s", tvb_bytes_to_str(tvb, offset2+16, obj_length - 20));
}