On Wed, Dec 18, 2002 at 09:45:41AM -0500, Andrew Brown wrote:
> >(BTW, as per another recent discussioin, that means multi-line output
> >even if "-v" isn't specified....)
>
> we're already pretty much in that boat if the dissector calls
> default_print(), right?
Yes, which argues that it should do so only if "-x" was specified or
"-v" was specified.
> if (1) default_print_packet() were allowed to ignore its arguments so
> that it could behave "properly" as per the given flags, (2) it set a
> flag once called, that we could clear somewhere else, (3) a shim layer
> was added in between pcap and the xxx_if_print() routines, then (4)
> you could remove all xflag processing from all the xxx_if_print()
> routines.
If by "xflag processing" you mean checking "xflag", that could be done
*now*, without *any* of that stuff, by removing it and adding the "if
(xflag)" test to "default_print_packet()".
However, if you centralize the *calls* to "default_print_packet()" in
the shim layer, it won't know how long the link-layer header is, so they
won't know how to skip it.
To handle that, one could have the "xxx_if_print()" routines return the
link-layer header length. Once one's done that, however, one doesn't
need any global variables - the shim routine would look something like
void
print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
{
void (*if_print)(const struct pcap_pkthdr *h, const
u_char *p) = user;
u_int hdrlen;
hdrlen = (*user)(h, p);
if (xflag)
default_print(p, h->caplen, hdrlen);
}
("main()" would set "pcap_userdata()" to the results of
"lookup_printer()", and set "printer" to "print_packet").
Of course, once we've done *that*, we should probably then do
void
print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
{
void (*if_print)(const struct pcap_pkthdr *h, const
u_char *p) = user;
u_int hdrlen;
++infodelay;
ts_print(&h->ts);
hdrlen = (*user)(h, p);
if (xflag)
default_print_packet(p, h->caplen, hdrlen);
putchar('\n');
--infodelay;
if (infoprint)
info(0);
}
and remove all that stuff from the if_print routines, centralizing that
in "print_packet()" as well.
-
This is the TCPDUMP workers list. It is archived at
http://www.tcpdump.org/lists/workers/index.html
To unsubscribe use mailto:[EMAIL PROTECTED]?body=unsubscribe