a6feab666b4a0577a7aac5fd14f0654c453726b7
[metze/wireshark/wip.git] / wiretap / wtap-int.h
1 /* wtap-int.h
2  *
3  * $Id$
4  *
5  * Wiretap Library
6  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  */
22
23 #ifndef __WTAP_INT_H__
24 #define __WTAP_INT_H__
25
26 #ifdef HAVE_SYS_TIME_H
27 #include <sys/time.h>
28 #endif
29
30 #include <glib.h>
31 #include <stdio.h>
32 #include <time.h>
33
34 #ifdef HAVE_WINSOCK2_H
35 #include <winsock2.h>
36 #endif
37
38 #include <wsutil/file_util.h>
39
40 #include "wtap.h"
41
42 int wtap_fstat(wtap *wth, ws_statb64 *statb, int *err);
43
44 typedef gboolean (*subtype_read_func)(struct wtap*, int*, char**, gint64*);
45 typedef gboolean (*subtype_seek_read_func)(struct wtap*, gint64, union wtap_pseudo_header*,
46                                            guint8*, int, int *, char **);
47 /**
48  * Struct holding data of the currently read file.
49  */
50 struct wtap {
51     FILE_T                      fh;
52     FILE_T                      random_fh;              /**< Secondary FILE_T for random access */
53     int                         file_type;
54     guint                       snapshot_length;
55     struct Buffer               *frame_buffer;
56     struct wtap_pkthdr          phdr;
57     struct wtapng_section_s     shb_hdr;
58     guint                       number_of_interfaces;   /**< The number of interfaces a capture was made on, number of IDB:s in a pcapng file or equivalent(?)*/
59     GArray                      *interface_data;        /**< An array holding the interface data from pcapng IDB:s or equivalent(?)*/
60     union wtap_pseudo_header    pseudo_header;
61
62     gint64                      data_offset;
63
64     void                        *priv;
65
66     subtype_read_func           subtype_read;
67     subtype_seek_read_func      subtype_seek_read;
68     void                        (*subtype_sequential_close)(struct wtap*);
69     void                        (*subtype_close)(struct wtap*);
70     int                         file_encap;    /* per-file, for those
71                                                 * file formats that have
72                                                 * per-file encapsulation
73                                                 * types
74                                                 */
75     int                         tsprecision;   /* timestamp precision of the lower 32bits
76                                                 * e.g. WTAP_FILE_TSPREC_USEC
77                                                 */
78     wtap_new_ipv4_callback_t    add_new_ipv4;
79     wtap_new_ipv6_callback_t    add_new_ipv6;
80     GPtrArray                   *fast_seek;
81 };
82
83 struct wtap_dumper;
84
85 /*
86  * This could either be a FILE * or a gzFile.
87  */
88 typedef void *WFILE_T;
89
90 typedef gboolean (*subtype_write_func)(struct wtap_dumper*,
91                                        const struct wtap_pkthdr*,
92                                        const union wtap_pseudo_header*,
93                                        const guint8*, int*);
94 typedef gboolean (*subtype_close_func)(struct wtap_dumper*, int*);
95
96 struct wtap_dumper {
97     WFILE_T                 fh;
98     int                     file_type;
99     int                     snaplen;
100     int                     encap;
101     gboolean                compressed;
102     gint64                  bytes_dumped;
103
104     void                    *priv;
105
106     subtype_write_func      subtype_write;
107     subtype_close_func      subtype_close;
108
109     int                     tsprecision;    /**< timestamp precision of the lower 32bits
110                                              * e.g. WTAP_FILE_TSPREC_USEC
111                                              */
112     struct addrinfo         *addrinfo_list;
113     struct wtapng_section_s *shb_hdr;
114     guint                   number_of_interfaces;   /**< The number of interfaces a capture was made on, number of IDB:s in a pcapng file or equivalent(?)*/
115     GArray                  *interface_data;        /**< An array holding the interface data from pcapng IDB:s or equivalent(?) NULL if not present.*/
116 };
117
118 extern gboolean wtap_dump_file_write(wtap_dumper *wdh, const void *buf,
119     size_t bufsize, int *err);
120 extern gint64 wtap_dump_file_seek(wtap_dumper *wdh, gint64 offset, int whence, int *err);
121 extern gint64 wtap_dump_file_tell(wtap_dumper *wdh);
122
123
124 extern gint wtap_num_file_types;
125
126 /* Macros to byte-swap 64-bit, 32-bit and 16-bit quantities. */
127 #define BSWAP64(x) \
128     ((((x)&G_GINT64_CONSTANT(0xFF00000000000000U))>>56) |    \
129          (((x)&G_GINT64_CONSTANT(0x00FF000000000000U))>>40) |    \
130      (((x)&G_GINT64_CONSTANT(0x0000FF0000000000U))>>24) |    \
131      (((x)&G_GINT64_CONSTANT(0x000000FF00000000U))>>8) |    \
132      (((x)&G_GINT64_CONSTANT(0x00000000FF000000U))<<8) |    \
133      (((x)&G_GINT64_CONSTANT(0x0000000000FF0000U))<<24) |    \
134      (((x)&G_GINT64_CONSTANT(0x000000000000FF00U))<<40) |    \
135      (((x)&G_GINT64_CONSTANT(0x00000000000000FFU))<<56))
136 #define    BSWAP32(x) \
137     ((((x)&0xFF000000)>>24) | \
138      (((x)&0x00FF0000)>>8) | \
139      (((x)&0x0000FF00)<<8) | \
140      (((x)&0x000000FF)<<24))
141 #define    BSWAP16(x) \
142      ((((x)&0xFF00)>>8) | \
143       (((x)&0x00FF)<<8))
144
145 /* Macros to byte-swap possibly-unaligned 64-bit, 32-bit and 16-bit quantities;
146  * they take a pointer to the quantity, and byte-swap it in place.
147  */
148 #define PBSWAP64(p) \
149     {            \
150         guint8 tmp;        \
151         tmp = (p)[7];      \
152         (p)[7] = (p)[0];   \
153         (p)[0] = tmp;      \
154         tmp = (p)[6];      \
155         (p)[6] = (p)[1];   \
156         (p)[1] = tmp;      \
157         tmp = (p)[5];      \
158         (p)[5] = (p)[2];   \
159         (p)[2] = tmp;      \
160         tmp = (p)[4];      \
161         (p)[4] = (p)[3];   \
162         (p)[3] = tmp;      \
163     }
164 #define PBSWAP32(p) \
165     {            \
166         guint8 tmp;         \
167         tmp = (p)[3];       \
168         (p)[3] = (p)[0];    \
169         (p)[0] = tmp;       \
170         tmp = (p)[2];       \
171         (p)[2] = (p)[1];    \
172         (p)[1] = tmp;       \
173     }
174 #define PBSWAP16(p) \
175     {            \
176         guint8 tmp;        \
177         tmp = (p)[1];      \
178         (p)[1] = (p)[0];   \
179         (p)[0] = tmp;      \
180     }
181
182 /* Turn host-byte-order values into little-endian values. */
183 #define htoles(s) GUINT16_TO_LE(s)
184 #define htolel(l) GUINT32_TO_LE(l)
185 #define htolell(ll) GUINT64_TO_LE(ll)
186
187 /* Pointer versions of ntohs and ntohl.  Given a pointer to a member of a
188  * byte array, returns the value of the two or four bytes at the pointer.
189  * The pletoh[sl] versions return the little-endian representation.
190  * We also provide pntohll and pletohll, which extract 64-bit integral
191  * quantities.
192  *
193  * These will work regardless of the byte alignment of the pointer.
194  */
195
196 #ifndef pntohs
197 #define pntohs(p)  ((guint16)                       \
198                     ((guint16)*((const guint8 *)(p)+0)<<8|  \
199                      (guint16)*((const guint8 *)(p)+1)<<0))
200 #endif
201
202 #ifndef pntoh24
203 #define pntoh24(p)  ((guint32)*((const guint8 *)(p)+0)<<16| \
204                      (guint32)*((const guint8 *)(p)+1)<<8|  \
205                      (guint32)*((const guint8 *)(p)+2)<<0)
206 #endif
207
208 #ifndef pntohl
209 #define pntohl(p)  ((guint32)*((const guint8 *)(p)+0)<<24|  \
210                     (guint32)*((const guint8 *)(p)+1)<<16|  \
211                     (guint32)*((const guint8 *)(p)+2)<<8|   \
212                     (guint32)*((const guint8 *)(p)+3)<<0)
213 #endif
214
215 #ifndef pntohll
216 #define pntohll(p)  ((guint64)*((const guint8 *)(p)+0)<<56|  \
217                      (guint64)*((const guint8 *)(p)+1)<<48|  \
218                      (guint64)*((const guint8 *)(p)+2)<<40|  \
219                      (guint64)*((const guint8 *)(p)+3)<<32|  \
220                      (guint64)*((const guint8 *)(p)+4)<<24|  \
221                      (guint64)*((const guint8 *)(p)+5)<<16|  \
222                      (guint64)*((const guint8 *)(p)+6)<<8|   \
223                      (guint64)*((const guint8 *)(p)+7)<<0)
224 #endif
225
226
227 #ifndef pletohs
228 #define pletohs(p) ((guint16)                       \
229                     ((guint16)*((const guint8 *)(p)+1)<<8|  \
230                      (guint16)*((const guint8 *)(p)+0)<<0))
231 #endif
232
233 #ifndef pletoh24
234 #define pletoh24(p) ((guint32)*((const guint8 *)(p)+2)<<16|  \
235                      (guint32)*((const guint8 *)(p)+1)<<8|  \
236                      (guint32)*((const guint8 *)(p)+0)<<0)
237 #endif
238
239
240 #ifndef pletohl
241 #define pletohl(p) ((guint32)*((const guint8 *)(p)+3)<<24|  \
242                     (guint32)*((const guint8 *)(p)+2)<<16|  \
243                     (guint32)*((const guint8 *)(p)+1)<<8|   \
244                     (guint32)*((const guint8 *)(p)+0)<<0)
245 #endif
246
247
248 #ifndef pletohll
249 #define pletohll(p) ((guint64)*((const guint8 *)(p)+7)<<56|  \
250                      (guint64)*((const guint8 *)(p)+6)<<48|  \
251                      (guint64)*((const guint8 *)(p)+5)<<40|  \
252                      (guint64)*((const guint8 *)(p)+4)<<32|  \
253                      (guint64)*((const guint8 *)(p)+3)<<24|  \
254                      (guint64)*((const guint8 *)(p)+2)<<16|  \
255                      (guint64)*((const guint8 *)(p)+1)<<8|   \
256                      (guint64)*((const guint8 *)(p)+0)<<0)
257 #endif
258
259 /* Pointer routines to put items out in a particular byte order.
260  * These will work regardless of the byte alignment of the pointer.
261  */
262
263 #ifndef phtons
264 #define phtons(p, v) \
265     {                 \
266         (p)[0] = (guint8)((v) >> 8);    \
267         (p)[1] = (guint8)((v) >> 0);    \
268     }
269 #endif
270
271 #ifndef phton24
272 #define phton24(p, v) \
273     {                 \
274         (p)[0] = (guint8)((v) >> 16);    \
275         (p)[1] = (guint8)((v) >> 8);     \
276         (p)[2] = (guint8)((v) >> 0);     \
277     }
278 #endif
279
280 #ifndef phtonl
281 #define phtonl(p, v) \
282     {                 \
283         (p)[0] = (guint8)((v) >> 24);    \
284         (p)[1] = (guint8)((v) >> 16);    \
285         (p)[2] = (guint8)((v) >> 8);     \
286         (p)[3] = (guint8)((v) >> 0);     \
287     }
288 #endif
289
290 #ifndef phtonll
291 #define phtonll(p, v) \
292     {                 \
293         (p)[0] = (guint8)((v) >> 56);    \
294         (p)[1] = (guint8)((v) >> 48);    \
295         (p)[2] = (guint8)((v) >> 40);    \
296         (p)[3] = (guint8)((v) >> 32);    \
297         (p)[4] = (guint8)((v) >> 24);    \
298         (p)[5] = (guint8)((v) >> 16);    \
299         (p)[6] = (guint8)((v) >> 8);     \
300         (p)[7] = (guint8)((v) >> 0);     \
301     }
302 #endif
303
304 #ifndef phtoles
305 #define phtoles(p, v) \
306     {                 \
307         (p)[0] = (guint8)((v) >> 0);    \
308         (p)[1] = (guint8)((v) >> 8);    \
309     }
310 #endif
311
312 #ifndef phtolel
313 #define phtolel(p, v) \
314     {                 \
315         (p)[0] = (guint8)((v) >> 0);     \
316         (p)[1] = (guint8)((v) >> 8);     \
317         (p)[2] = (guint8)((v) >> 16);    \
318         (p)[3] = (guint8)((v) >> 24);    \
319     }
320 #endif
321
322 #ifndef phtolell
323 #define phtolell(p, v) \
324     {                 \
325         (p)[0] = (guint8)((v) >> 0);     \
326         (p)[1] = (guint8)((v) >> 8);     \
327         (p)[2] = (guint8)((v) >> 16);    \
328         (p)[3] = (guint8)((v) >> 24);    \
329         (p)[4] = (guint8)((v) >> 32);    \
330         (p)[5] = (guint8)((v) >> 40);    \
331         (p)[6] = (guint8)((v) >> 48);    \
332         (p)[7] = (guint8)((v) >> 56);    \
333     }
334 #endif
335
336 #define wtap_file_read_unknown_bytes(target, num_bytes, fh, err, err_info) \
337     G_STMT_START \
338     { \
339         int _bytes_read; \
340         _bytes_read = file_read((target), (num_bytes), (fh)); \
341         if (_bytes_read != (int) (num_bytes)) { \
342             *(err) = file_error((fh), (err_info)); \
343             return FALSE; \
344         } \
345     } \
346     G_STMT_END
347
348 #define wtap_file_read_expected_bytes(target, num_bytes, fh, err, err_info) \
349     G_STMT_START \
350     { \
351         int _bytes_read; \
352         _bytes_read = file_read((target), (num_bytes), (fh)); \
353         if (_bytes_read != (int) (num_bytes)) { \
354             *(err) = file_error((fh), (err_info)); \
355             if (*(err) == 0 && _bytes_read > 0) { \
356                 *(err) = WTAP_ERR_SHORT_READ; \
357             } \
358             return FALSE; \
359         } \
360     } \
361     G_STMT_END
362
363 /* glib doesn't have g_ptr_array_len of all things!*/
364 #ifndef g_ptr_array_len
365 #define g_ptr_array_len(a)      ((a)->len)
366 #endif
367
368 /*** get GSList of all compressed file extensions ***/
369 GSList *wtap_get_compressed_file_extensions(void);
370
371 #endif /* __WTAP_INT_H__ */
372
373 /*
374  * Editor modelines
375  *
376  * Local Variables:
377  * c-basic-offset: 8
378  * tab-width: 8
379  * indent-tabs-mode: t
380  * End:
381  *
382  * ex: set shiftwidth=8 tabstop=8 noexpandtab:
383  * :indentSize=8:tabSize=8:noTabs=false:
384  */