Wireshark mailing list archives

Re: wtap_dump_file_seek() and _tell()


From: Guy Harris <guy () alum mit edu>
Date: Sun, 3 Mar 2013 11:48:15 -0800


On Mar 3, 2013, at 11:10 AM, Ed Beroset <beroset () mindspring com> wrote:

According to svn, version 36318 (March 2011) added, among other things, the following lines to the wiretap/wtap-int.h 
file:

extern gint64 wtap_dump_file_seek(wtap_dumper *wdh, gint64 offset, int whence, int *err);
extern gint64 wtap_dump_file_tell(wtap_dumper *wdh);

However, unlike most of the corresponding functions which are implemented in wiretap/file_access.c these two have no 
implementations.

Gerald?  Planned but never implemented?

In 18 places within the code involving seven files (5view.c, k12,c, lanalyzer.c, netmon.c, netscaler.c, netxray.c, 
visual.c) either an ftell or fseek is used which does an implicit conversion from WFILE_T to struct FILE * which is 
an incompatibility with C++.  I could have added casts to each location, but it seems that the neater way to do this 
would be to actually implement these function.  I understand that seek() and tell() won't work every time (e.g. pipes 
or stdin),

"pipes or terminals" - if stdout (as this is for dumping, it'd be stdout rather than stdin) were a file, *seek() and 
*tell() would work, and if stdout were a pipe (a terminal would be silly, unless you *like* reading random binary byte 
streams as they come out on your terminal or terminal emulator or the file format being written is a text file format) 
certain file formats simply can't be written (unless we do the dumping in a two-pass process or otherwise compute 
certain information that appears earlier in the file beforehand).

More importantly, you *also* wouldn't be able to write them out if they're gzipped, and we *do* support writing out 
gzipped files.

but these places in the code are doing it anyway.  How should we best resolve this? Should I implement the functions?

Might as well.  They'd belong with the others in file_access.c, and should fail if wdh->compressed is set.  (We already 
have wtap_dump_can_compress(), which checks whether writing the file format requires a seek, so no Wireshark code 
should be trying to write out a compressed file in any of those formats.)

We should probably define a new WTAP_ERR_CANT_SEEK_COMPRESSED value and return it as the error value if a seek is 
attempted on a compressed stream.

file_tell() should probably also have an "int *err" argument, as ftell() can fail.

For now, you can probably just cast the "offset" arguments to int, as the SEEK_SET seeks are to a location in the 
beginning of the file, and the SEEK_CUR seeks have short offsets.  We'd bury fseeko()/whatever the Windows equivalent 
is/etc. stuff in those routines if we ever need to fully support 64-bit offsets.
___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <wireshark-dev () wireshark org>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
             mailto:wireshark-dev-request () wireshark org?subject=unsubscribe


Current thread: