forked from osmocom/wireshark
Lua: Make FileHandler seek_read() optional
When FileHandler seek_read() is not implemented use a default implementation which does the same as the provided example to file_seek() and then call the FileHandler read().
This commit is contained in:
parent
c6b046abd7
commit
41f4855443
|
@ -15,6 +15,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "wslua_file_common.h"
|
#include "wslua_file_common.h"
|
||||||
|
#include <wiretap/file_wrappers.h>
|
||||||
|
|
||||||
/* WSLUA_CONTINUE_MODULE File */
|
/* WSLUA_CONTINUE_MODULE File */
|
||||||
|
|
||||||
|
@ -133,9 +134,8 @@ static gboolean
|
||||||
wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
||||||
int *err, gchar **err_info, gint64 *offset);
|
int *err, gchar **err_info, gint64 *offset);
|
||||||
static gboolean
|
static gboolean
|
||||||
wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
|
wslua_filehandler_seek_read(wtap *wth, gint64 seek_off, wtap_rec *rec, Buffer *buf,
|
||||||
wtap_rec *rec, Buffer *buf,
|
int *err, gchar **err_info);
|
||||||
int *err, gchar **err_info);
|
|
||||||
static void
|
static void
|
||||||
wslua_filehandler_close(wtap *wth);
|
wslua_filehandler_close(wtap *wth);
|
||||||
static void
|
static void
|
||||||
|
@ -193,13 +193,8 @@ wslua_filehandler_open(wtap *wth, int *err, gchar **err_info)
|
||||||
return WTAP_OPEN_NOT_MINE;
|
return WTAP_OPEN_NOT_MINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fh->seek_read_ref != LUA_NOREF) {
|
/* when not having a seek_read routine a default will be used */
|
||||||
wth->subtype_seek_read = wslua_filehandler_seek_read;
|
wth->subtype_seek_read = wslua_filehandler_seek_read;
|
||||||
}
|
|
||||||
else {
|
|
||||||
ws_warning("Lua file format module lacks a seek-read routine");
|
|
||||||
return WTAP_OPEN_NOT_MINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* it's ok to not have a close routine */
|
/* it's ok to not have a close routine */
|
||||||
if (fh->read_close_ref != LUA_NOREF)
|
if (fh->read_close_ref != LUA_NOREF)
|
||||||
|
@ -238,15 +233,9 @@ wslua_filehandler_open(wtap *wth, int *err, gchar **err_info)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The classic wtap read routine. This returns TRUE if it found the next packet,
|
|
||||||
* else FALSE.
|
|
||||||
* If it finds a frame/packet, it should set the pseudo-header info (ie, let Lua set it).
|
|
||||||
* Also Lua needs to set data_offset to the beginning of the line we're returning.
|
|
||||||
* This will be the seek_off parameter when this frame is re-read.
|
|
||||||
*/
|
|
||||||
static gboolean
|
static gboolean
|
||||||
wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
wslua_filehandler_read_packet(wtap *wth, FILE_T wth_fh, wtap_rec *rec, Buffer *buf,
|
||||||
int *err, gchar **err_info, gint64 *offset)
|
int *err, gchar **err_info, gint64 *offset)
|
||||||
{
|
{
|
||||||
FileHandler fh = (FileHandler)(wth->wslua_data);
|
FileHandler fh = (FileHandler)(wth->wslua_data);
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
@ -265,7 +254,7 @@ wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
||||||
wtap_block_unref(rec->block);
|
wtap_block_unref(rec->block);
|
||||||
rec->block = NULL;
|
rec->block = NULL;
|
||||||
|
|
||||||
fp = push_File(L, wth->fh);
|
fp = push_File(L, wth_fh);
|
||||||
fc = push_CaptureInfo(L, wth, FALSE);
|
fc = push_CaptureInfo(L, wth, FALSE);
|
||||||
fi = push_FrameInfo(L, rec, buf);
|
fi = push_FrameInfo(L, rec, buf);
|
||||||
|
|
||||||
|
@ -298,13 +287,22 @@ wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
||||||
return (retval == 1);
|
return (retval == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Classic wtap seek_read function, called by wtap core. This must return TRUE on
|
/* The classic wtap read routine. This returns TRUE if it found the next packet,
|
||||||
* success, FALSE on error.
|
* else FALSE.
|
||||||
|
* If it finds a frame/packet, it should set the pseudo-header info (ie, let Lua set it).
|
||||||
|
* Also Lua needs to set data_offset to the beginning of the line we're returning.
|
||||||
|
* This will be the seek_off parameter when this frame is re-read.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
|
wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
|
||||||
wtap_rec *rec, Buffer *buf,
|
int *err, gchar **err_info, gint64 *offset)
|
||||||
int *err, gchar **err_info)
|
{
|
||||||
|
return wslua_filehandler_read_packet(wth, wth->fh, rec, buf, err, err_info, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
wslua_filehandler_seek_read_packet(wtap *wth, gint64 seek_off, wtap_rec *rec, Buffer *buf,
|
||||||
|
int *err, gchar **err_info)
|
||||||
{
|
{
|
||||||
FileHandler fh = (FileHandler)(wth->wslua_data);
|
FileHandler fh = (FileHandler)(wth->wslua_data);
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
@ -313,11 +311,6 @@ wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
|
||||||
CaptureInfo *fc = NULL;
|
CaptureInfo *fc = NULL;
|
||||||
FrameInfo *fi = NULL;
|
FrameInfo *fi = NULL;
|
||||||
|
|
||||||
if (fh->removed) {
|
|
||||||
/* Return success when removed during reloading Lua plugins */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT_FILEHANDLER_ROUTINE(seek_read,FALSE,err,err_info);
|
INIT_FILEHANDLER_ROUTINE(seek_read,FALSE,err,err_info);
|
||||||
|
|
||||||
/* Reset errno */
|
/* Reset errno */
|
||||||
|
@ -358,6 +351,43 @@ wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
|
||||||
return (retval == 1);
|
return (retval == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Default FileHandler:seek_read() implementation.
|
||||||
|
* Do a standard file_seek() and then call FileHandler:read().
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
wslua_filehandler_seek_read_default(wtap *wth, gint64 seek_off, wtap_rec *rec, Buffer *buf,
|
||||||
|
int *err, gchar **err_info)
|
||||||
|
{
|
||||||
|
gint64 offset = file_seek(wth->random_fh, seek_off, SEEK_SET, err);
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wslua_filehandler_read_packet(wth, wth->random_fh, rec, buf, err, err_info, &offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Classic wtap seek_read function, called by wtap core. This must return TRUE on
|
||||||
|
* success, FALSE on error.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
wslua_filehandler_seek_read(wtap *wth, gint64 seek_off, wtap_rec *rec, Buffer *buf,
|
||||||
|
int *err, gchar **err_info)
|
||||||
|
{
|
||||||
|
FileHandler fh = (FileHandler)(wth->wslua_data);
|
||||||
|
|
||||||
|
if (fh->removed) {
|
||||||
|
/* Return success when removed during reloading Lua plugins */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fh->seek_read_ref != LUA_NOREF) {
|
||||||
|
return wslua_filehandler_seek_read_packet(wth, seek_off, rec, buf, err, err_info);
|
||||||
|
} else {
|
||||||
|
return wslua_filehandler_seek_read_default(wth, seek_off, rec, buf, err, err_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Classic wtap close function, called by wtap core.
|
/* Classic wtap close function, called by wtap core.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
|
@ -748,8 +778,7 @@ static gboolean verify_filehandler_complete(FileHandler fh) {
|
||||||
(!fh->is_reader ||
|
(!fh->is_reader ||
|
||||||
(fh->is_reader &&
|
(fh->is_reader &&
|
||||||
fh->read_open_ref != LUA_NOREF &&
|
fh->read_open_ref != LUA_NOREF &&
|
||||||
fh->read_ref != LUA_NOREF &&
|
fh->read_ref != LUA_NOREF)) &&
|
||||||
fh->seek_read_ref != LUA_NOREF)) &&
|
|
||||||
(!fh->is_writer ||
|
(!fh->is_writer ||
|
||||||
(fh->is_writer &&
|
(fh->is_writer &&
|
||||||
fh->can_write_encap_ref != LUA_NOREF &&
|
fh->can_write_encap_ref != LUA_NOREF &&
|
||||||
|
@ -932,6 +961,8 @@ WSLUA_ATTRIBUTE_FUNC_SETTER(FileHandler,read);
|
||||||
return fh_read(file, capture, frame)
|
return fh_read(file, capture, frame)
|
||||||
end
|
end
|
||||||
----
|
----
|
||||||
|
|
||||||
|
Since 3.6.0, it's possible to omit the `FileHandler:seek_read()` function to get a default seek_read implementation.
|
||||||
*/
|
*/
|
||||||
WSLUA_ATTRIBUTE_FUNC_SETTER(FileHandler,seek_read);
|
WSLUA_ATTRIBUTE_FUNC_SETTER(FileHandler,seek_read);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue