On Mar 3, 2013, at 11:10 AM, Ed Beroset <[email protected]> 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 <[email protected]>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
             mailto:[email protected]?subject=unsubscribe

Reply via email to