aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/file_wrappers.c
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2014-10-16 13:58:58 +0200
committerStig Bjørlykke <stig@bjorlykke.org>2014-11-19 08:41:34 +0000
commit39b0c2def0bc94b47055650351c830822aabcadc (patch)
tree4a601bb306fc3dc5cf2d795d63c4b86fdd4412c4 /wiretap/file_wrappers.c
parentcfa0e5fd53870f297dbec2f0a9aef896ba11f7c5 (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.c17
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;