diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2014-10-16 13:58:58 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2014-11-19 08:41:34 +0000 |
commit | 39b0c2def0bc94b47055650351c830822aabcadc (patch) | |
tree | 4a601bb306fc3dc5cf2d795d63c4b86fdd4412c4 /wiretap/file_wrappers.c | |
parent | cfa0e5fd53870f297dbec2f0a9aef896ba11f7c5 (diff) |
Wiretap: Added file_seek SEEK_END support.
This is needed for Lua File:seek("end").
Change-Id: I28fb23f2f29ca8083c77bf065db8816e039ae5a1
Reviewed-on: https://code.wireshark.org/review/4722
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
Tested-by: Michal Labedzki <michal.labedzki@tieto.com>
Petri-Dish: Michal Labedzki <michal.labedzki@tieto.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'wiretap/file_wrappers.c')
-rw-r--r-- | wiretap/file_wrappers.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c index 78285bde02..babe4fa23a 100644 --- a/wiretap/file_wrappers.c +++ b/wiretap/file_wrappers.c @@ -924,8 +924,7 @@ file_seek(FILE_T file, gint64 offset, int whence, int *err) struct fast_seek_point *here; guint n; - /* can only seek from start or relative to current position */ - if (whence != SEEK_SET && whence != SEEK_CUR) { + if (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END) { g_assert_not_reached(); /* *err = EINVAL; @@ -933,8 +932,18 @@ file_seek(FILE_T file, gint64 offset, int whence, int *err) */ } - /* normalize offset to a SEEK_CUR specification */ - if (whence == SEEK_SET) + /* Normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_END) { + /* Try skip until end-of-file */ + if (gz_skip(file, G_MAXINT64) == -1) { + *err = file->err; + return -1; + } + if (offset == 0) { + /* We are done */ + return file->pos; + } + } else if (whence == SEEK_SET) offset -= file->pos; else if (file->seek_pending) offset += file->skip; |