Commit Graph

2615 Commits

Author SHA1 Message Date
Guy Harris d939763545 Reference clock identifiers a DATUM TymServe 2100 NTP network timeserver
can return, from Phil Techau.

svn path=/trunk/; revision=2652
2000-11-17 05:25:59 +00:00
Guy Harris ee1b884ee9 Tvbuffify the STP dissector, have it register itself and have the LLC
dissector call it through a handle, and make it static.

Give "dissect_data()" an "offset" argument, so dissectors can use it to
dissect part of the packet without having to cook up a new tvbuff.

Go back to using "dissect_data()" to dissect the data in an IPP request.

svn path=/trunk/; revision=2651
2000-11-16 07:35:43 +00:00
Guy Harris f19c2e2def "get_CDR_short()", from Frank Singleton.
Fix a comment.

svn path=/trunk/; revision=2650
2000-11-15 20:10:22 +00:00
Guy Harris 2fa39ce7d3 Move the table of bit-swapped byte values to "epan/bitswap.c", and
declare it, and define a "BIT_SWAP" macro that uses it, in
"epan/bitswap.h".

Use that macro to bit-swap bytes in the IEEE 802.11 dissector, rather
than the macro that was used (said macro used GCCisms and didn't compile
on Windows).

Make an "init_plugin()" routine to enable a plugin and call its init
routine, and call it from "check_plugin_status()" and
"plugins_enable_cb()", rather than having very similar code in two
places; "patable" is now part of libethereal, and, at least on Windows,
attempts to refer to it from "libui" failed.  Make "patable" static to
"epan/plugins.c".  (This may still not work, as now "libui" is calling a
routine in "libethereal"; if that fails, perhaps it's time to get rid of
the "enable/disable plugins" stuff completely, as new-style plugins, at
least, register themselves as protocols and should be controllable from
the "Edit->Protocols" window just as built-in dissectors are.)

svn path=/trunk/; revision=2649
2000-11-15 09:37:53 +00:00
Guy Harris b606de7ea3 Tvbuffify the IPP dissector, and have it register itself rather than
being a global function.

The HTTP dissector should set "pinfo->current_proto" to HTTP even if we
consider the packet to be IPP, so that if we run past the end of a
tvbuff while dissecting HTTP stuff it's reported as a problem with HTTP,
not IPP.

svn path=/trunk/; revision=2648
2000-11-15 08:27:14 +00:00
Guy Harris 77ad89b12d Add a mechanism by which a dissector can be registered by name, another
dissector can get a "handle" for that dissector by name and then call
that dissector through the handle.

This allows dissectors that can't be called through a port table or a
heuristic table to be called from other dissectors without directly
referring to the dissector function - dynamically-loaded modules, under
Windows, cannot directly call functions in the main program, and
non-plugin dissectors are in the main program and thus cannot be called
from plugin dissectors unless either

	1) a pointer to the dissector is put in the Big Transfer Vector

or

	2) some other mechanism for getting a pointer to the dissector
	   is provided.

This mechanism could also support registering old-style dissectors and
calling them from new-style dissectors without the new-style dissector
having to do the argument translation itself (I didn't add support for
registering old-style dissectors because I'd prefer to have people
tvbuffify their code if they have to register a dissector...).

It could also, in the future, perhaps support

	disabling of protocols;

	setting "pinfo->current_proto";

inside "call_dissector()" - and inside "{old_}dissector_try_port()" and
"{old_"dissector_try_heuristic()" - allowing a pile of stuff that
currently has to be done in every dissector be done by common code.
(I have some ideas about how to do this, by

	having "proto_register_protocol()" take an abbreviation - of the
	sort that would be put in, for example, "pinfo->current_proto" -
	as an argument;

	having the calls to register dissectors take an index returned
	by "proto_register_protocol()" as an argument.

The abbreviation could be used elsewhere as well, e.g. in the "Decoding"
tab of the "Edit->Protocols" dialog box, and in a GUI for constructing
protocol filters.  Watch this space.)

Make "dissect_sdp()" the first client of this mechanism; it's now static
to "packet-sdp.c", and all dissectors that call it - including the MGCP
plugin - now call it through a dissector handle fetched by
"find_dissector()".  (Next step - see if Ethereal can now compile on
Windows as a result of this.)

svn path=/trunk/; revision=2647
2000-11-15 07:07:52 +00:00
Guy Harris 7c3fcbac34 IEEE 802.11 support, from Johan Jorgensen of Axis Communications AB.
Add in stuff for a bunch of libpcap formats either in libpcap 0.5.2 or
in the current CVS version; we don't implement all of them in
Ethereal/Wiretap (those are "#if 0"ed out), but we do implement the IEEE
802.11 stuff (which isn't yet in libpcap or tcpdump, but the CVS version
of libpcap *does* reserve 105 as the encapsulation type number for
802.11).

svn path=/trunk/; revision=2646
2000-11-15 05:42:35 +00:00
Gilbert Ramirez 1247a90960 Add a ; to the empty default case in a switch statement. ANSI C says
you need some statement there, and a semicolon serves as a statement.
Put a comment in there too, emphasizing the fact that the default case
was meant to be empty.

svn path=/trunk/; revision=2645
2000-11-14 19:13:40 +00:00
Gilbert Ramirez 482287641c Guy's synopsis of the core routines of Ethereal, minus the protocol tree
stuff which I need to explain.

svn path=/trunk/; revision=2644
2000-11-14 18:05:27 +00:00
Guy Harris e8bebbd727 "plugin_api.c" needs to include <glib.h>, to define G_HAVE_GINT64 on
platforms that have "gint64".

Fix plugin-table lines for "dissector_delete()", "dissect_data()",
"prefs_register_module()", and "prefs_register_uint_preference()".

The MGCP dissector uses routines from GLib, so when building it as a DLL
for Windows, it has to be linked with "glib-XXX.lib".

svn path=/trunk/; revision=2643
2000-11-14 10:38:15 +00:00
Gilbert Ramirez 29a2973984 Add tvb_set_child_real_data_tvbuff(), which allows you to tell the
tvbuff routines that a particular TVBUFF_REAL_DATA tvbuff is a "child"
of another tvbuff. This link is utilized during a tvb_free_chain(), so that
the child is freed when no longer necessary.

svn path=/trunk/; revision=2642
2000-11-14 04:33:34 +00:00
Gilbert Ramirez 167562929b Check for existence of COL_INFO before adding "Short xxx packet" to
COL_INFO.

svn path=/trunk/; revision=2641
2000-11-14 03:51:41 +00:00
Olivier Abad 245f7d30ab Support for the BASE100 and GSC100BT subsystems by Jeff Foster.
svn path=/trunk/; revision=2640
2000-11-13 23:02:24 +00:00
Olivier Abad 87205b018f Improve the detection of the encapsulation used in a radcom file.
svn path=/trunk/; revision=2639
2000-11-13 23:00:55 +00:00
Guy Harris b830fb6a5f Add "dissector_delete()", "proto_item_get_len()",
"proto_item_set_len()", "proto_item_set_text()", and the preference
routines expected to be used by dissectors to the table of function
pointers handed to dissectors on platforms where dynamically-loaded
modules can't access symbols from the main program.

svn path=/trunk/; revision=2638
2000-11-13 10:13:26 +00:00
Guy Harris 3503bd353b As the SDP dissector now appends to, rather than overwriting, the
Protocol and Info columns, there's no longer any need for the SIP
dissector to make the columns non-writable - SDP won't trash what SIP
put there.

svn path=/trunk/; revision=2637
2000-11-13 09:04:27 +00:00
Guy Harris 9985115b8b Use "tvb_offset_exists()" rather than "tvb_length_remaining()" to check
whether there's any data left in the tvbuff starting at a specified
offset.

svn path=/trunk/; revision=2636
2000-11-13 08:58:17 +00:00
Guy Harris ead1cadaf3 Add the tvbuff routines expected to be used by dissectors to the table
of function pointers handed to dissectors on platforms where
dynamically-loaded modules can't access symbols from the main program.

svn path=/trunk/; revision=2635
2000-11-13 08:00:12 +00:00
Guy Harris 99c98f9e74 Move "bytes_to_str()" to "strutil.c" from "packet.c" - it's just a
string formatter, like "format_text()", and, as "tvbuff.c" now calls it
(*vide infra*), we don't want to have to make "tvbuff.c" drag "packet.h"
in just to declare "bytes_to_str()".  It's now declared in "strutil.h",
so include it in modules that use "bytes_to_str()" and weren't already
including it.

Add a "tvb_bytes_to_str()" wrapper that calls "tvb_get_ptr()" to get a
pointer to a chunk of N bytes at a given offset in a tvbuff and then
hands that chunk to "bytes_to_str()".  Convert the code that was doing
that to use "tvb_bytes_to_str()" instead (which caught what I suspect is
a bug in the Q.2931 dissector, where it was handing an offset of 0 to
"tvb_get_ptr()" - a cut-and-pasteo, I think).

Tvbuffify the ARP dissector.

svn path=/trunk/; revision=2634
2000-11-13 07:19:37 +00:00
Guy Harris 796997a538 If either of the "tvb_new_subset()" calls throws an exception, it means
we don't have so much data in the frame that there's a trailer, so we
should set "trailer_tvb" to NULL.

Put in a comment explaining what the exception catching is all about.

svn path=/trunk/; revision=2633
2000-11-13 05:28:00 +00:00
Guy Harris ee5b7e05ff If either of the "tvb_new_subset()" calls throws an exception, it means
we don't have so much data in the frame that there's a trailer, so we
should set "trailer_tvb" to NULL.

Put in a comment explaining what the exception catching is all about.

svn path=/trunk/; revision=2632
2000-11-13 05:22:58 +00:00
Guy Harris f9546764f0 "It's pronounced 'volatile pointer to tvbuff_t' but it's spelled
'tvbuff_t *volatile'."  Makes "Throat-Warbler Mangrove" vs.
"Luxury-Yacht" sound almost normal....

Type-qualified pointers to non-type-qualified objects are a barrel of
fun in C.  The way you declare a volatile pointer named "bar" to a
*non-volatile* "foo" is

	foo *volatile bar;

as opposed to a non-volatile pointer "bar" to a volatile "foo", which is

	volatile foo *bar;

GCC's complaint about variables being clobbered by longjmp refers to the
fact that "longjmp()" isn't guaranteed to restore variables stored in
registers to the values they had at the time of the "longjmp()" (if
"setjmp()" stuffs the current register values in the "jmp_buf", and
"longjmp()" just reloads them rather than walking the stack to restore
all register values pushed onto the stack, the values at the time of the
"setjmp()" will be restored, clobbering any updates done after the
"setjmp()"); the workaround provided in ANSI C is to declare the
variables in question "volatile", which will keep them out of registers
(or any other place that "setjmp()"/"longjmp()" can't handle).

svn path=/trunk/; revision=2631
2000-11-13 05:11:16 +00:00
Guy Harris 5dd5670f42 Tvbuffify the AppleTalk dissectors.
Dissect RTMP requests, as well as RTMP data packets.

Call it "Routing Table Maintenance Protocol", not just "Routing Table".

Print unsigned quantities with "%u", not "%d".

Correctly handle extended vs. non-extended networks in RTMP data
packets, as per *Inside AppleTalk(R), Second Edition*.

svn path=/trunk/; revision=2630
2000-11-13 04:50:07 +00:00
Guy Harris 98c064911a If the packet inside the VLAN packet isn't an Ethernet packet - i.e., if
the type/length field has a value 1500 or less, and thus is a length
field rather than an Ethernet type field - give the next dissector only
that many bytes, and put an entry in the VLAN protocol tree for the
padding.

svn path=/trunk/; revision=2629
2000-11-13 04:44:14 +00:00
Guy Harris 9e4caf9d56 Tvbuffify the AppleTalk ARP dissector.
svn path=/trunk/; revision=2628
2000-11-13 04:26:53 +00:00
Guy Harris 0aa24f2b8d Tvbuffify the AppleTalk dissectors.
Dissect RTMP requests, as well as RTMP data packets.

Call it "Routing Table Maintenance Protocol", not just "Routing Table".

Print unsigned quantities with "%u", not "%d".

Correctly handle extended vs. non-extended networks in RTMP data
packets, as per *Inside AppleTalk(R), Second Edition*.

svn path=/trunk/; revision=2627
2000-11-13 04:26:14 +00:00
Gerald Combs a6c88aa196 - Fix the hex pane offsets for hf_netb_local_ses_no,
hf_netb_remote_ses_no, and hf_netb_data2.

- Change hf_netb_local_ses_no and hf_netb_remote_ses_no from FT_UINT16 to
  FT_UINT8.

- Add hf_netb_data2 to hf_netb.

svn path=/trunk/; revision=2626
2000-11-13 03:52:16 +00:00
Guy Harris 565f455166 Don't overwrite the "Info" column in the SDP dissector, either - append
to it, so as not to stomp on what the protocol that's using SDP put
there.

svn path=/trunk/; revision=2625
2000-11-13 01:43:02 +00:00
Guy Harris 5018d8fecb As RFC 2327 says, "SDP is purely a format for session description - it
does not incorporate a transport protocol, and is intended to use
different transport protocols as appropriate including the Session
Announcement Protocol [4], Session Initiation Protocol [11], Real- Time
Streaming Protocol [12], electronic mail using the MIME extensions, and
the Hypertext Transport Protocol."

As such, it shouldn't set the protocol column to SDP, as that means
the protocol column won't indicate what the transport protocol was;
instead, it should append "/SDP" to the protocol column - RTSP was,
after calling "dissect_sdp()", setting the protocol column to
"RTSP/SDP", and this change means that all protocols using SDP will have
the protocol column set in that fashion, and that the RTSP dissector
doesn't have to explicitly set the protocol column to cause that to
happen.

svn path=/trunk/; revision=2624
2000-11-12 21:23:53 +00:00
Guy Harris e8c75b74bf Add a Makefile.nmake for the MGCP plugin, and update
"plugins/Makefile.nmake" to build that plugin.

Add to the table of routines callable from plugins
"old_dissector_add()", "old_dissect_data()", and
"proto_is_protocol_enabled()", so that the Gryphon dissector can build
on Windows.

Move the includes of "plugins/plugin_api.h" and "moduleinfo.h" before
all the other includes, except for "config.h", in "plugin-mgcp.c", to
match what the Gryphon dissector does; "plugins_api.h" must be included
before any of the routines whose names it #defines in order for the
plugin to build on Windows.  (It still doesn't build on Windows, as
still more routines need to be added to the table of routines callable
from plugins, but tomorrow is another day.  Making libethereal a DLL may
obviate the need for that table, *if* all the routines called from a
plugin are in libethereal, as I think routines in a DLL, even a
run-time-loaded DLL, can call routines from another DLL as long as those
routines are exported from the other DLL.)

svn path=/trunk/; revision=2623
2000-11-12 21:20:50 +00:00
Guy Harris 5694059e97 Add a Makefile.nmake for the MGCP plugin, and update
"plugins/Makefile.nmake" to build that plugin.

Add to the table of routines callable from plugins
"old_dissector_add()", "old_dissect_data()", and
"proto_is_protocol_enabled()", so that the Gryphon dissector can build
on Windows.

Move the includes of "plugins/plugin_api.h" and "moduleinfo.h" before
all the other includes, except for "config.h", in "plugin-mgcp.c", to
match what the Gryphon dissector does; "plugins_api.h" must be included
before any of the routines whose names it #defines in order for the
plugin to build on Windows.  (It still doesn't build on Windows, as
still more routines need to be added to the table of routines callable
from plugins, but tomorrow is another day.  Making libethereal a DLL may
obviate the need for that table, *if* all the routines called from a
plugin are in libethereal, as I think routines in a DLL, even a
run-time-loaded DLL, can call routines from another DLL as long as those
routines are exported from the other DLL.)

svn path=/trunk/; revision=2622
2000-11-12 11:08:46 +00:00
Guy Harris 40e9328384 "pinfo->current_proto" is typically set to an acronym or short name for
the protocol, not the filter name for the protocol, so it should be
"AIM", not "aim".

svn path=/trunk/; revision=2621
2000-11-12 09:29:38 +00:00
Guy Harris 00beb21eca "wtap_loop()" no longer has problems with packet offsets of 0, so we
don't need to work around that.

The offset, for a given packet, at which "ascend_seek()" should start
searching for that packet's header must be computed separately from the
offset, for that packet, at which "ascend_seek()" should start searching
for the *next* packet - if the file is a "wdd" capture, and the packet
has a "Date:" header and a WD_DIALOUT_DISP header, the search for that
packet should start at the beginning of the "Date:" header, but the
search for the next packet should start after the WD_DIALOUT_DISP
header, as if we start it after the "Date:" header, the search will stop
at the packet's own WD_DIALOUT_DISP header, as a packet could have a
WD_DIALOUT_DISP header but no "Date:" header.

svn path=/trunk/; revision=2620
2000-11-12 08:45:28 +00:00
Guy Harris 5e2df6d895 If the packet isn't an Ethernet packet, add the length field.
svn path=/trunk/; revision=2619
2000-11-12 05:58:34 +00:00
Guy Harris 861ef4f9ab Tvbuffify the 802.1Q VLAN dissector.
svn path=/trunk/; revision=2618
2000-11-12 05:43:26 +00:00
Guy Harris 3d7d4a297d Not all packets in a "wdd" dump necessarily have a "Cause an attempt to
place call to" header (I presume this can happen if there was a call in
progress when the packet was sent or received); don't require the

	Date: 01/12/1990.  Time: 12:22:33
	Cause an attempt to place call to 14082750382

to be present in every packet.

(Only the date on the first packet is used, and only if it's present in
the first packet; if the first packet doesn't have a date, we can't
easily go back and fix up the previous packets, *especially* in programs
such as Tethereal and editcap which make only one pass through the
capture.

We set the called number to a null string if that's the case; we could
assume, in the sequential pass, that it's the phone number from the last
call, and remember that for use when doing random access.)

svn path=/trunk/; revision=2617
2000-11-12 04:57:39 +00:00
Guy Harris bedae04c2e Add only one "proto_smtp" item to the protocol tree for SMTP; add text
subitems with "proto_tree_add_text()".

svn path=/trunk/; revision=2616
2000-11-12 03:13:44 +00:00
Guy Harris 04406508bf Don't set the "Protocol" column to "GIOP" until we've decided that the
packet is a GIOP packet.

If it has a GIOP header but doesn't have a version number we handle,
accept it as a GIOP packet; if we don't do that, we should simply return
FALSE *without* changing any of the columns or putting anything into the
protocol tree.

svn path=/trunk/; revision=2615
2000-11-12 03:11:24 +00:00
Guy Harris 8562f7181c Tvbuffify the SMTP dissector.
Don't assume that we start out getting commands from the client - the
capture may have started in the middle of a transaction, and we may be
getting a message body from the client instead.  Only treat stuff as
commands if it consists of four alphabetic characters followed either by
an end-of-line or a space.

Commands in SMTP are case-insensitive; when looking for "DATA", do a
case-insensitive comparison.

If the packet contains the message body, just put "Message Body" in the
summary, don't put any of the message body itself in there.  If it's a
command, put "Command:" in the summary before the first line of the
command.

When putting the message body into the protocol tree, give each line its
own entry, rather than putting the entire body in as one entry.

Don't put an entry into the protocol tree for a command parameter if
there is no command parameter.

svn path=/trunk/; revision=2614
2000-11-12 02:29:20 +00:00
Guy Harris f8934eb9e7 Make "tvb_find_line_end()" and "tvb_find_line_end_unquoted()" treat CR
by itself as a line ending, as well as treating CR LF and LF as line
endings.

Tweak the Telnet dissector to treat LF and CR NUL as line endings, but
not to treat CR by itself as a line ending (that's not exactly what the
NVT specification in the Telnet RFC specifies, but the resulting output
may be a bit more readable that way).

svn path=/trunk/; revision=2613
2000-11-12 00:59:09 +00:00
Guy Harris 9226b24e60 Updates from Heikki Vatiainen.
svn path=/trunk/; revision=2612
2000-11-11 19:57:09 +00:00
Guy Harris b9d2dd7151 Make the string-to-compare-with arguments to "tvb_strneql()" and
"tvb_strncaseeql()" "const guint8 *", so that you can pass them pointers
to "const".

svn path=/trunk/; revision=2611
2000-11-11 19:55:48 +00:00
Guy Harris 00e5867b10 Get rid of the definitions of LITTLE_ENDIAN and BIG_ENDIAN in
"epan/pint.h" - they caused GCC to whine about them being redefined when
I compiled on FreeBSD 3.4.

Get rid of the stuff in "packet-ipv6.h" that defines various bit vectors
differently depending on the byte order of the machine; instead, define
them so that they work with items in host byte order.  This lets us use
a number of them rather than using hardwired hex values.

Put "frag.ip6f_offlg" in host byte order before using it; this means
that IP6F_MORE_FRAG can still be used even though it now works only on
items in host byte order.

svn path=/trunk/; revision=2610
2000-11-11 10:23:43 +00:00
Guy Harris 6647ded001 Don't have separate versions of "ddp_hops()" and "ddp_len()" on
big-endian and little-endian platforms; just put "ddp.hops_len" in host
byte order and have one version.  (This removes one usage of BIG_ENDIAN
and LITTLE_ENDIAN from Ethereal - our redefining of them causes warnings
on FreeBSD 3.4, so I'd like not to export them to all the dissectors if
possible - and also fixes "ddp_hops()" to work correctly on
little-endian machines, as the little-endian version wasn't
byte-swapping its argument.)

svn path=/trunk/; revision=2609
2000-11-11 09:18:15 +00:00
Guy Harris eaf695bfee Simplify the state machine:
you're either reading commands, or you're reading message data;

	if you're reading commands, and you see a DATA command, you
	start reading data;

	if you're reading data, and you see an EOM, you start reading
	commands.

Also, *always* fill in the per-frame data you allocate for a frame, and
*always* attach it to the packet.

The old state machine assumed it was done with the SMTP conversation
once it saw an EOM, and the dissector wouldn't fill in the per-frame
data it'd allocated and attach it to the packet if it thought it was
done with the SMTP conversation.  This meant that:

	1) the per-frame data allocated for frames following the EOM
	   (e.g., a QUIT command) would contain random junk for data
	   such as the packet type;

	2) that per-frame data would be re-allocated every time the
	   frame was looked at, as it wouldn't be attached to the frame,
	   so you might well get *different* random junk each time the
	   frame was looked at.

This caused Tethereal and Ethereal to sometimes fail to recognize
commands following the EOM - but it wouldn't *always* fail to do so,
sometimes it'd work and sometimes it wouldn't.

Fix a comment; conversations are *not* removed during filter operations,
and the visited flag is *not* cleared during a filter operation - that's
only true on a *redissection* operation.  In any case, given that frames
can, after the initial sequential scan through the capture, be visited
in any order, and visited repeatedly, it's irrelevant whether
conversations are removed or not - we have to associate with each frame
information telling us how to process it.

svn path=/trunk/; revision=2608
2000-11-11 07:48:30 +00:00
Guy Harris 6e527b707f Fix the test for the first 10 bytes of a NetBIOS name being all zeroes.
svn path=/trunk/; revision=2607
2000-11-11 06:47:07 +00:00
Guy Harris 62b3490af4 We have to set "x25.flags" in the Wiretap pseudo-header if the capture
is WTAP_ENCAP_LAPB *or* WTAP_ENCAP_V120, and we have to set "p2p.sent"
in the capture file for *all* WTAP_ENCAP_LAPD captures; fix the
i4btrace and Sniffer capture file readers to do so.

(XXX - should we eliminate "x25.flags", and use "p2p.sent" instead?  The
directions for X.25 are DTE->DCE and DCE->DTE, not "sent" and
"received", but I suspect that "sent" and "received" should be thought
of from the point of view of the DTE, so DTE->DCE is "sent" and DCE->DTE
is "received"; the directions for ISDN are user->network and
network->user, but I suspect that "sent" and "received" should be
thought of from the standpoint of the user equipment, so user->network
is "sent" and network->user is "received".)

svn path=/trunk/; revision=2606
2000-11-11 06:36:09 +00:00
Guy Harris 81566ec823 In "wdd" captures:
fix the interpretation of the date and time reported in capture
	files;

	use that date and time only to set the start date and time of
	the capture, not to generate the time stamp for every packet.

Make the "struct tm" used for that local to the code to handle that
production in the grammar, rather than global.

For all captures, we *can* now fstat a compressed file (and have been
able to do so for a while, in fact), so revert to doing so and using the
ctime of the capture file if we can't get a date and time from the
file's contents.

svn path=/trunk/; revision=2605
2000-11-11 03:15:07 +00:00
Guy Harris 6ba1bf3f83 Add some comments, and fix one comment.
Remove what appear to be a pair of dangling "else"s.

Before calling "mktime()" on a "struct tm", you have to set "tm_isdst",
so it knows what to do about daylight savings time; set it to -1, so it
picks the appropriate time (except, presumably, for those times that
don't exist, when the clock is moved forward, where there is no
appropriate time, and those times that exist twice, when the clock is
moved backward, where there are *two* times and you can't tell which is
appropriate).

svn path=/trunk/; revision=2604
2000-11-11 01:44:05 +00:00
Gilbert Ramirez 49865d0bef Set pinfo->current_proto
svn path=/trunk/; revision=2603
2000-11-10 21:29:27 +00:00