Add a new WTAP_ERR_DECOMPRESS error, and use that for errors discovered
[obnox/wireshark/wip.git] / wiretap / wtap-int.h
index 757703c298a2a4f69a84f7b0a873d7012386d4ad..9691ce8efff7147aeb30f6f70cf6e2c5e07aa0ea 100644 (file)
 
 #ifdef HAVE_LIBZ
 #include <zlib.h>
-#define FILE_T gzFile
-#else /* No zLib */
-#define FILE_T FILE *
 #endif /* HAVE_LIBZ */
 
-#include "wtap.h"
+typedef struct wtap_reader *FILE_T;
 
-/* Information for a compressed Sniffer data stream. */
-typedef struct {
-       unsigned char *buf;     /* buffer into which we uncompress data */
-       size_t  nbytes;         /* number of bytes of data in that buffer */
-       int     nextout;        /* offset in that buffer of stream's current position */
-       gint64  comp_offset;    /* current offset in compressed data stream */
-       gint64  uncomp_offset;  /* current offset in uncompressed data stream */
-} ngsniffer_comp_stream_t;
-
-typedef struct {
-  char *sdate;            /* Packet start date        */       
-  gboolean tcp_formatted; /* TCP/IP data formated Y/N */
-  int format;             /* Trace format type        */
-} iseries_t;
-
-typedef struct {
-       guint   maj_vers;
-       guint   min_vers;
-       guint32 timeunit;
-       time_t  start;
-       guint   network;                /* network type */
-       ngsniffer_comp_stream_t seq;    /* sequential access */
-       ngsniffer_comp_stream_t rand;   /* random access */
-       GList   *first_blob;            /* list element for first blob */
-       GList   *last_blob;             /* list element for last blob */
-       GList   *current_blob;          /* list element for current blob */
-} ngsniffer_t;
-
-typedef struct {
-       gboolean byte_swapped;
-} i4btrace_t;
-
-typedef struct {
-       gboolean is_hpux_11;
-} nettl_t;
-
-typedef struct {
-       time_t  start;
-} lanalyzer_t;
-
-typedef enum {
-       NOT_SWAPPED,
-       SWAPPED,
-       MAYBE_SWAPPED
-} swapped_type_t;
-
-typedef struct {
-       gboolean byte_swapped;
-       swapped_type_t lengths_swapped;
-       guint16 version_major;
-       guint16 version_minor;
-} libpcap_t;
-
-typedef struct {
-       gboolean byte_swapped;
-       guint16 version_major;
-       guint16 version_minor;
-    guint8  if_fcslen;
-} pcapng_t;
-
-typedef struct {
-       time_t  start_secs;
-       guint32 start_usecs;
-       guint8  version_major;
-       guint32 *frame_table;
-       guint32 frame_table_size;
-       guint   current_frame;
-} netmon_t;
-
-typedef struct {
-       time_t          start_time;
-       double          ticks_per_sec;
-       double          start_timestamp;
-       gboolean        wrapped;
-       guint32         nframes;
-       gint64          start_offset;
-       gint64          end_offset;
-       int             version_major;
-       gboolean        fcs_valid;      /* if packets have valid FCS at the end */
-       guint           isdn_type;      /* 1 = E1 PRI, 2 = T1 PRI, 3 = BRI */
-} netxray_t;
-
-typedef struct {
-       time_t inittime;
-       int adjusted;
-       gint64 next_packet_seek_start;
-} ascend_t;
-
-typedef struct {
-       gboolean byteswapped;
-} csids_t;
-
-typedef struct {
-       struct timeval reference_time;
-} etherpeek_t;
-
-typedef struct {
-       gboolean        has_fcs;
-} airopeek9_t;
-
-typedef struct _k12_t k12_t;
-
-typedef struct {
-       time_t  start_secs;
-       guint32 start_usecs;
-} catapult_dct2000_t;
-
-typedef struct {
-       struct wtap_nstime now;
-       time_t t0;
-} mpeg_t;
+#include "wtap.h"
 
 typedef gboolean (*subtype_read_func)(struct wtap*, int*, char**, gint64*);
 typedef gboolean (*subtype_seek_read_func)(struct wtap*, gint64, union wtap_pseudo_header*,
@@ -171,25 +58,7 @@ struct wtap {
 
        gint64                  data_offset;
 
-       union {
-               libpcap_t               *pcap;
-               lanalyzer_t             *lanalyzer;
-               ngsniffer_t             *ngsniffer;
-               iseries_t               *iseries;
-               i4btrace_t              *i4btrace;
-               nettl_t                 *nettl;
-               netmon_t                *netmon;
-               netxray_t               *netxray;
-               ascend_t                *ascend;
-               csids_t                 *csids;
-               etherpeek_t             *etherpeek;
-               airopeek9_t             *airopeek9;
-               k12_t                   *k12;
-               catapult_dct2000_t      *catapult_dct2000;
-               mpeg_t                  *mpeg;
-               void                    *generic;
-               pcapng_t                *pcapng;
-       } capture;
+       void                    *priv;
 
        subtype_read_func       subtype_read;
        subtype_seek_read_func  subtype_seek_read;
@@ -201,83 +70,46 @@ struct wtap {
                                                   types */
        int                     tsprecision;    /* timestamp precision of the lower 32bits
                                                 * e.g. WTAP_FILE_TSPREC_USEC */
+       wtap_new_ipv4_callback_t add_new_ipv4;
+       wtap_new_ipv6_callback_t add_new_ipv6;
+       GPtrArray *fast_seek;
 };
 
 struct wtap_dumper;
 
+/*
+ * This could either be a FILE * or a gzFile.
+ */
+typedef void *WFILE_T;
+
 typedef gboolean (*subtype_write_func)(struct wtap_dumper*,
                const struct wtap_pkthdr*, const union wtap_pseudo_header*,
                const guchar*, int*);
 typedef gboolean (*subtype_close_func)(struct wtap_dumper*, int*);
 
-typedef struct {
-       gboolean first_frame;
-       time_t start;
-} ngsniffer_dump_t;
-
-typedef struct {
-       gboolean first_frame;
-       struct wtap_nstime start;
-       guint32 nframes;
-} netxray_dump_t;
-
-typedef struct {
-       gboolean got_first_record_time;
-       struct wtap_nstime first_record_time;
-       guint32 frame_table_offset;
-       guint32 *frame_table;
-       guint   frame_table_index;
-       guint   frame_table_size;
-} netmon_dump_t;
-
-typedef struct {
-       guint32 nframes;
-} _5views_dump_t;
-
-typedef struct {
-       guint64 packet_count;
-       guint8  network_type;
-} niobserver_dump_t;
-
-typedef struct {
-       guint32 file_len;
-       guint32 num_of_records;
-       guint32 file_offset;
-} k12_dump_t;
-
-typedef struct {
-    gboolean           first_packet_written;
-    struct wtap_nstime start_time;
-} dct2000_dump_t;
-
 struct wtap_dumper {
-       FILE*                   fh;
+       WFILE_T                 fh;
        int                     file_type;
        int                     snaplen;
        int                     encap;
-       gboolean        compressed;
-       gint64          bytes_dumped;
-
-       union {
-               void                    *opaque;
-               ngsniffer_dump_t        *ngsniffer;
-               netmon_dump_t           *netmon;
-               netxray_dump_t          *netxray;
-               _5views_dump_t          *_5views;
-               niobserver_dump_t       *niobserver;
-               k12_dump_t              *k12;
-               dct2000_dump_t          *dct2000;
-       } dump;
+       gboolean                compressed;
+       gint64                  bytes_dumped;
+
+       void                    *priv;
 
        subtype_write_func      subtype_write;
        subtype_close_func      subtype_close;
 
        int                     tsprecision;    /* timestamp precision of the lower 32bits
                                                         * e.g. WTAP_FILE_TSPREC_USEC */
+       struct addrinfo *addrinfo_list;
 };
 
-extern size_t wtap_dump_file_write(wtap_dumper *wdh, const void *buf, unsigned bufsize);
-extern int wtap_dump_file_ferror(wtap_dumper *wdh);
+extern gboolean wtap_dump_file_write(wtap_dumper *wdh, const void *buf,
+    size_t bufsize, int *err);
+extern gint64 wtap_dump_file_seek(wtap_dumper *wdh, gint64 offset, int whence, int *err);
+extern gint64 wtap_dump_file_tell(wtap_dumper *wdh);
+
 
 extern gint wtap_num_file_types;
 
@@ -300,9 +132,25 @@ extern gint wtap_num_file_types;
         ((((x)&0xFF00)>>8) | \
          (((x)&0x00FF)<<8))
 
-/* Macros to byte-swap possibly-unaligned 32-bit and 16-bit quantities;
+/* Macros to byte-swap possibly-unaligned 64-bit, 32-bit and 16-bit quantities;
  * they take a pointer to the quantity, and byte-swap it in place.
  */
+#define PBSWAP64(p) \
+       {                       \
+       guint8 tmp;             \
+       tmp = (p)[7];           \
+       (p)[7] = (p)[0];        \
+       (p)[0] = tmp;           \
+       tmp = (p)[6];           \
+       (p)[6] = (p)[1];        \
+       (p)[1] = tmp;           \
+       tmp = (p)[5];           \
+       (p)[5] = (p)[2];        \
+       (p)[2] = tmp;           \
+       tmp = (p)[4];           \
+       (p)[4] = (p)[3];        \
+       (p)[3] = tmp;           \
+       }
 #define PBSWAP32(p) \
        {                       \
        guint8 tmp;             \
@@ -410,6 +258,15 @@ extern gint wtap_num_file_types;
        }
 #endif
 
+#ifndef phton24
+#define phton24(p, v) \
+       {                               \
+       (p)[0] = (guint8)((v) >> 16);   \
+       (p)[1] = (guint8)((v) >> 8);    \
+       (p)[2] = (guint8)((v) >> 0);    \
+       }
+#endif
+
 #ifndef phtonl
 #define phtonl(p, v) \
        {                               \
@@ -448,25 +305,25 @@ extern gint wtap_num_file_types;
        }
 #endif
 
-#define wtap_file_read_unknown_bytes(target, num_bytes, fh, err) \
+#define wtap_file_read_unknown_bytes(target, num_bytes, fh, err, err_info) \
        G_STMT_START \
        { \
                int _bytes_read; \
-               _bytes_read = file_read((target), 1, (num_bytes), (fh)); \
+               _bytes_read = file_read((target), (num_bytes), (fh)); \
                if (_bytes_read != (int) (num_bytes)) { \
-                       *(err) = file_error((fh)); \
+                       *(err) = file_error((fh), (err_info)); \
                        return FALSE; \
                } \
        } \
        G_STMT_END
 
-#define wtap_file_read_expected_bytes(target, num_bytes, fh, err) \
+#define wtap_file_read_expected_bytes(target, num_bytes, fh, err, err_info) \
        G_STMT_START \
        { \
                int _bytes_read; \
-               _bytes_read = file_read((target), 1, (num_bytes), (fh)); \
+               _bytes_read = file_read((target), (num_bytes), (fh)); \
                if (_bytes_read != (int) (num_bytes)) { \
-                       *(err) = file_error((fh)); \
+                       *(err) = file_error((fh), (err_info)); \
                        if (*(err) == 0 && _bytes_read > 0) { \
                                *(err) = WTAP_ERR_SHORT_READ; \
                        } \
@@ -481,3 +338,16 @@ extern gint wtap_num_file_types;
 #endif
 
 #endif /* __WTAP_INT_H__ */
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set shiftwidth=8 tabstop=8 noexpandtab
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */