/* frame_tvbuff.c
* Implements a tvbuff for frame
*
- * $Id$
- *
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include "config.h"
+#include <config.h>
#include <glib.h>
if (cfile.wth != frame_tvb->wth)
return FALSE;
- if (!wtap_seek_read(frame_tvb->wth, frame_tvb->file_off, phdr, buf, frame_tvb->tvb.length + frame_tvb->offset, &err, &err_info)) {
+ /* XXX, what if phdr->caplen isn't equal to
+ * frame_tvb->tvb.length + frame_tvb->offset?
+ */
+ if (!wtap_seek_read(frame_tvb->wth, frame_tvb->file_off, phdr, buf, &err, &err_info)) {
+ /* XXX - report error! */
switch (err) {
- case WTAP_ERR_UNSUPPORTED_ENCAP:
case WTAP_ERR_BAD_FILE:
g_free(err_info);
break;
{
struct wtap_pkthdr phdr; /* Packet header */
+ wtap_phdr_init(&phdr);
+
if (frame_tvb->buf == NULL) {
frame_tvb->buf = (struct Buffer *) g_malloc(sizeof(struct Buffer));
/* XXX, register frame_tvb to some list which frees from time to time not used buffers :] */
- buffer_init(frame_tvb->buf, frame_tvb->tvb.length + frame_tvb->offset);
+ ws_buffer_init(frame_tvb->buf, frame_tvb->tvb.length + frame_tvb->offset);
if (!frame_read(frame_tvb, &phdr, frame_tvb->buf))
{ /* TODO: THROW(???); */ }
}
- frame_tvb->tvb.real_data = buffer_start_ptr(frame_tvb->buf) + frame_tvb->offset;
+ frame_tvb->tvb.real_data = ws_buffer_start_ptr(frame_tvb->buf) + frame_tvb->offset;
+
+ wtap_phdr_cleanup(&phdr);
}
static void
struct tvb_frame *frame_tvb = (struct tvb_frame *) tvb;
if (frame_tvb->buf) {
- buffer_free(frame_tvb->buf);
+ ws_buffer_free(frame_tvb->buf);
g_free(frame_tvb->buf);
}
}
static gint
-frame_pbrk_guint8(tvbuff_t *tvb, guint abs_offset, guint limit, const guint8 *needles, guchar *found_needle)
+frame_pbrk_guint8(tvbuff_t *tvb, guint abs_offset, guint limit, const ws_mempbrk_pattern* pattern, guchar *found_needle)
{
struct tvb_frame *frame_tvb = (struct tvb_frame *) tvb;
frame_cache(frame_tvb);
- return tvb_pbrk_guint8(tvb, abs_offset, limit, needles, found_needle);
-}
-
-static gsize
-frame_sizeof(void)
-{
- return sizeof(struct tvb_frame);
+ return tvb_ws_mempbrk_pattern_guint8(tvb, abs_offset, limit, pattern, found_needle);
}
static guint
static tvbuff_t *frame_clone(tvbuff_t *tvb, guint abs_offset, guint abs_length);
static const struct tvb_ops tvb_frame_ops = {
- frame_sizeof, /* size */
+ sizeof(struct tvb_frame), /* size */
+
frame_free, /* free */
frame_offset, /* offset */
frame_get_ptr, /* get_ptr */
*/
tvb->real_data = buf;
- if (fd) {
- tvb->length = fd->cap_len;
- tvb->reported_length = fd->pkt_len > G_MAXINT ? G_MAXINT : fd->pkt_len;
- } else {
- tvb->length = 0;
- tvb->reported_length = 0;
- }
-
+ tvb->length = fd->cap_len;
+ tvb->reported_length = fd->pkt_len > G_MAXINT ? G_MAXINT : fd->pkt_len;
tvb->initialized = TRUE;
/*
frame_tvb = (struct tvb_frame *) tvb;
- /* XXX, how to handle fd->file_off == -1 (edited packet) ?? */
- /* don't care, reassemble code was doing whole copy of data, so it'll work the same */
-
/* XXX, wtap_can_seek() */
- if (fd && cfile.wth && cfile.wth->random_fh) {
+ if (cfile.wth && cfile.wth->random_fh
+#ifdef WANT_PACKET_EDITOR
+ && fd->file_off != -1 /* generic clone for modified packets */
+#endif
+ ) {
frame_tvb->wth = cfile.wth;
frame_tvb->file_off = fd->file_off;
frame_tvb->offset = 0;
tvbuff_t *
frame_tvbuff_new_buffer(const frame_data *fd, Buffer *buf)
{
- return frame_tvbuff_new(fd, buffer_start_ptr(buf));
+ return frame_tvbuff_new(fd, ws_buffer_start_ptr(buf));
}
static tvbuff_t *
return cloned_tvb;
}
+
+
+/* based on tvb_new_real_data() */
+tvbuff_t *
+file_tvbuff_new(const frame_data *fd, const guint8 *buf)
+{
+ struct tvb_frame *frame_tvb;
+ tvbuff_t *tvb;
+
+ tvb = tvb_new(&tvb_frame_ops);
+
+ /*
+ * XXX - currently, the length arguments in
+ * tvbuff structure are signed, but the captured
+ * and reported length values are unsigned; this means
+ * that length values > 2^31 - 1 will appear as
+ * negative lengths
+ *
+ * Captured length values that large will already
+ * have been filtered out by the Wiretap modules
+ * (the file will be reported as corrupted), to
+ * avoid trying to allocate large chunks of data.
+ *
+ * Reported length values will not have been
+ * filtered out, and should not be filtered out,
+ * as those lengths are not necessarily invalid.
+ *
+ * For now, we clip the reported length at G_MAXINT
+ *
+ * (XXX, is this still a problem?) There was an exception when we call
+ * tvb_new_real_data() now there's no one
+ */
+
+ tvb->real_data = buf;
+ tvb->length = fd->cap_len;
+ tvb->reported_length = fd->pkt_len > G_MAXINT ? G_MAXINT : fd->pkt_len;
+ tvb->initialized = TRUE;
+
+ /*
+ * This is the top-level real tvbuff for this data source,
+ * so its data source tvbuff is itself.
+ */
+ tvb->ds_tvb = tvb;
+
+ frame_tvb = (struct tvb_frame *) tvb;
+
+ /* XXX, wtap_can_seek() */
+ if (cfile.wth && cfile.wth->random_fh
+#ifdef WANT_PACKET_EDITOR
+ && fd->file_off != -1 /* generic clone for modified packets */
+#endif
+ ) {
+ frame_tvb->wth = cfile.wth;
+ frame_tvb->file_off = fd->file_off;
+ frame_tvb->offset = 0;
+ } else
+ frame_tvb->wth = NULL;
+
+ frame_tvb->buf = NULL;
+
+ return tvb;
+}
+
+tvbuff_t *
+file_tvbuff_new_buffer(const frame_data *fd, Buffer *buf)
+{
+ return frame_tvbuff_new(fd, ws_buffer_start_ptr(buf));
+}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */