file_read() can return -1; don't just blindly add it to a previous
[obnox/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 #ifdef HAVE_LIBZ
39 #include <zlib.h>
40 #endif /* HAVE_LIBZ */
41
42 #include <wsutil/file_util.h>
43
44 typedef struct wtap_reader *FILE_T;
45
46 #include "wtap.h"
47
48 int wtap_fstat(wtap *wth, ws_statb64 *statb, int *err);
49
50 typedef gboolean (*subtype_read_func)(struct wtap*, int*, char**, gint64*);
51 typedef gboolean (*subtype_seek_read_func)(struct wtap*, gint64, union wtap_pseudo_header*,
52                                         guint8*, int, int *, char **);
53 struct wtap {
54         FILE_T                  fh;
55         FILE_T                  random_fh;    /* Secondary FILE_T for random access */
56         int                     file_type;
57         int                     snapshot_length;
58         struct Buffer           *frame_buffer;
59         struct wtap_pkthdr      phdr;
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         int                     tsprecision;    /* timestamp precision of the lower 32bits
75                                                  * e.g. WTAP_FILE_TSPREC_USEC */
76         wtap_new_ipv4_callback_t add_new_ipv4;
77         wtap_new_ipv6_callback_t add_new_ipv6;
78         GPtrArray *fast_seek;
79 };
80
81 struct wtap_dumper;
82
83 /*
84  * This could either be a FILE * or a gzFile.
85  */
86 typedef void *WFILE_T;
87
88 typedef gboolean (*subtype_write_func)(struct wtap_dumper*,
89                 const struct wtap_pkthdr*, const union wtap_pseudo_header*,
90                 const guchar*, int*);
91 typedef gboolean (*subtype_close_func)(struct wtap_dumper*, int*);
92
93 struct wtap_dumper {
94         WFILE_T                 fh;
95         int                     file_type;
96         int                     snaplen;
97         int                     encap;
98         gboolean                compressed;
99         gint64                  bytes_dumped;
100
101         void                    *priv;
102
103         subtype_write_func      subtype_write;
104         subtype_close_func      subtype_close;
105
106         int                     tsprecision;    /* timestamp precision of the lower 32bits
107                                                          * e.g. WTAP_FILE_TSPREC_USEC */
108         struct addrinfo *addrinfo_list;
109 };
110
111 extern gboolean wtap_dump_file_write(wtap_dumper *wdh, const void *buf,
112     size_t bufsize, int *err);
113 extern gint64 wtap_dump_file_seek(wtap_dumper *wdh, gint64 offset, int whence, int *err);
114 extern gint64 wtap_dump_file_tell(wtap_dumper *wdh);
115
116
117 extern gint wtap_num_file_types;
118
119 /* Macros to byte-swap 64-bit, 32-bit and 16-bit quantities. */
120 #define BSWAP64(x) \
121         ((((x)&G_GINT64_CONSTANT(0xFF00000000000000U))>>56) |   \
122          (((x)&G_GINT64_CONSTANT(0x00FF000000000000U))>>40) |   \
123          (((x)&G_GINT64_CONSTANT(0x0000FF0000000000U))>>24) |   \
124          (((x)&G_GINT64_CONSTANT(0x000000FF00000000U))>>8) |    \
125          (((x)&G_GINT64_CONSTANT(0x00000000FF000000U))<<8) |    \
126          (((x)&G_GINT64_CONSTANT(0x0000000000FF0000U))<<24) |   \
127          (((x)&G_GINT64_CONSTANT(0x000000000000FF00U))<<40) |   \
128          (((x)&G_GINT64_CONSTANT(0x00000000000000FFU))<<56))
129 #define BSWAP32(x) \
130         ((((x)&0xFF000000)>>24) | \
131          (((x)&0x00FF0000)>>8) | \
132          (((x)&0x0000FF00)<<8) | \
133          (((x)&0x000000FF)<<24))
134 #define BSWAP16(x) \
135          ((((x)&0xFF00)>>8) | \
136           (((x)&0x00FF)<<8))
137
138 /* Macros to byte-swap possibly-unaligned 64-bit, 32-bit and 16-bit quantities;
139  * they take a pointer to the quantity, and byte-swap it in place.
140  */
141 #define PBSWAP64(p) \
142         {                       \
143         guint8 tmp;             \
144         tmp = (p)[7];           \
145         (p)[7] = (p)[0];        \
146         (p)[0] = tmp;           \
147         tmp = (p)[6];           \
148         (p)[6] = (p)[1];        \
149         (p)[1] = tmp;           \
150         tmp = (p)[5];           \
151         (p)[5] = (p)[2];        \
152         (p)[2] = tmp;           \
153         tmp = (p)[4];           \
154         (p)[4] = (p)[3];        \
155         (p)[3] = tmp;           \
156         }
157 #define PBSWAP32(p) \
158         {                       \
159         guint8 tmp;             \
160         tmp = (p)[3];           \
161         (p)[3] = (p)[0];        \
162         (p)[0] = tmp;           \
163         tmp = (p)[2];           \
164         (p)[2] = (p)[1];        \
165         (p)[1] = tmp;           \
166         }
167 #define PBSWAP16(p) \
168         {                       \
169         guint8 tmp;             \
170         tmp = (p)[1];           \
171         (p)[1] = (p)[0];        \
172         (p)[0] = tmp;           \
173         }
174
175 /* Turn host-byte-order values into little-endian values. */
176 #define htoles(s) GUINT16_TO_LE(s)
177 #define htolel(l) GUINT32_TO_LE(l)
178 #define htolell(ll) GUINT64_TO_LE(ll)
179
180 /* Pointer versions of ntohs and ntohl.  Given a pointer to a member of a
181  * byte array, returns the value of the two or four bytes at the pointer.
182  * The pletoh[sl] versions return the little-endian representation.
183  * We also provide pntohll and pletohll, which extract 64-bit integral
184  * quantities.
185  *
186  * These will work regardless of the byte alignment of the pointer.
187  */
188
189 #ifndef pntohs
190 #define pntohs(p)  ((guint16)                       \
191                     ((guint16)*((const guint8 *)(p)+0)<<8|  \
192                      (guint16)*((const guint8 *)(p)+1)<<0))
193 #endif
194
195 #ifndef pntoh24
196 #define pntoh24(p)  ((guint32)*((const guint8 *)(p)+0)<<16| \
197                      (guint32)*((const guint8 *)(p)+1)<<8|  \
198                      (guint32)*((const guint8 *)(p)+2)<<0)
199 #endif
200
201 #ifndef pntohl
202 #define pntohl(p)  ((guint32)*((const guint8 *)(p)+0)<<24|  \
203                     (guint32)*((const guint8 *)(p)+1)<<16|  \
204                     (guint32)*((const guint8 *)(p)+2)<<8|   \
205                     (guint32)*((const guint8 *)(p)+3)<<0)
206 #endif
207
208 #ifndef pntohll
209 #define pntohll(p)  ((guint64)*((const guint8 *)(p)+0)<<56|  \
210                      (guint64)*((const guint8 *)(p)+1)<<48|  \
211                      (guint64)*((const guint8 *)(p)+2)<<40|  \
212                      (guint64)*((const guint8 *)(p)+3)<<32|  \
213                      (guint64)*((const guint8 *)(p)+4)<<24|  \
214                      (guint64)*((const guint8 *)(p)+5)<<16|  \
215                      (guint64)*((const guint8 *)(p)+6)<<8|   \
216                      (guint64)*((const guint8 *)(p)+7)<<0)
217 #endif
218
219
220 #ifndef pletohs
221 #define pletohs(p) ((guint16)                       \
222                     ((guint16)*((const guint8 *)(p)+1)<<8|  \
223                      (guint16)*((const guint8 *)(p)+0)<<0))
224 #endif
225
226 #ifndef pletoh24
227 #define pletoh24(p) ((guint32)*((const guint8 *)(p)+2)<<16|  \
228                      (guint32)*((const guint8 *)(p)+1)<<8|  \
229                      (guint32)*((const guint8 *)(p)+0)<<0)
230 #endif
231
232
233 #ifndef pletohl
234 #define pletohl(p) ((guint32)*((const guint8 *)(p)+3)<<24|  \
235                     (guint32)*((const guint8 *)(p)+2)<<16|  \
236                     (guint32)*((const guint8 *)(p)+1)<<8|   \
237                     (guint32)*((const guint8 *)(p)+0)<<0)
238 #endif
239
240
241 #ifndef pletohll
242 #define pletohll(p) ((guint64)*((const guint8 *)(p)+7)<<56|  \
243                      (guint64)*((const guint8 *)(p)+6)<<48|  \
244                      (guint64)*((const guint8 *)(p)+5)<<40|  \
245                      (guint64)*((const guint8 *)(p)+4)<<32|  \
246                      (guint64)*((const guint8 *)(p)+3)<<24|  \
247                      (guint64)*((const guint8 *)(p)+2)<<16|  \
248                      (guint64)*((const guint8 *)(p)+1)<<8|   \
249                      (guint64)*((const guint8 *)(p)+0)<<0)
250 #endif
251
252 /* Pointer routines to put items out in a particular byte order.
253  * These will work regardless of the byte alignment of the pointer.
254  */
255
256 #ifndef phtons
257 #define phtons(p, v) \
258         {                               \
259         (p)[0] = (guint8)((v) >> 8);    \
260         (p)[1] = (guint8)((v) >> 0);    \
261         }
262 #endif
263
264 #ifndef phton24
265 #define phton24(p, v) \
266         {                               \
267         (p)[0] = (guint8)((v) >> 16);   \
268         (p)[1] = (guint8)((v) >> 8);    \
269         (p)[2] = (guint8)((v) >> 0);    \
270         }
271 #endif
272
273 #ifndef phtonl
274 #define phtonl(p, v) \
275         {                               \
276         (p)[0] = (guint8)((v) >> 24);   \
277         (p)[1] = (guint8)((v) >> 16);   \
278         (p)[2] = (guint8)((v) >> 8);    \
279         (p)[3] = (guint8)((v) >> 0);    \
280         }
281 #endif
282
283 #ifndef phtonll
284 #define phtonll(p, v) \
285         {                               \
286         (p)[0] = (guint8)((v) >> 56);   \
287         (p)[1] = (guint8)((v) >> 48);   \
288         (p)[2] = (guint8)((v) >> 40);   \
289         (p)[3] = (guint8)((v) >> 32);   \
290         (p)[4] = (guint8)((v) >> 24);   \
291         (p)[5] = (guint8)((v) >> 16);   \
292         (p)[6] = (guint8)((v) >> 8);    \
293         (p)[7] = (guint8)((v) >> 0);    \
294         }
295 #endif
296
297 #ifndef pletonll
298 #define pletonll(p, v) \
299         {                               \
300         (p)[0] = (guint8)((v) >> 0);    \
301         (p)[1] = (guint8)((v) >> 8);    \
302         (p)[2] = (guint8)((v) >> 16);   \
303         (p)[3] = (guint8)((v) >> 24);   \
304         (p)[4] = (guint8)((v) >> 32);   \
305         (p)[5] = (guint8)((v) >> 40);   \
306         (p)[6] = (guint8)((v) >> 48);   \
307         (p)[7] = (guint8)((v) >> 56);   \
308         }
309 #endif
310
311 #define wtap_file_read_unknown_bytes(target, num_bytes, fh, err, err_info) \
312         G_STMT_START \
313         { \
314                 int _bytes_read; \
315                 _bytes_read = file_read((target), (num_bytes), (fh)); \
316                 if (_bytes_read != (int) (num_bytes)) { \
317                         *(err) = file_error((fh), (err_info)); \
318                         return FALSE; \
319                 } \
320         } \
321         G_STMT_END
322
323 #define wtap_file_read_expected_bytes(target, num_bytes, fh, err, err_info) \
324         G_STMT_START \
325         { \
326                 int _bytes_read; \
327                 _bytes_read = file_read((target), (num_bytes), (fh)); \
328                 if (_bytes_read != (int) (num_bytes)) { \
329                         *(err) = file_error((fh), (err_info)); \
330                         if (*(err) == 0 && _bytes_read > 0) { \
331                                 *(err) = WTAP_ERR_SHORT_READ; \
332                         } \
333                         return FALSE; \
334                 } \
335         } \
336         G_STMT_END
337
338 /* glib doesn't have g_ptr_array_len of all things!*/
339 #ifndef g_ptr_array_len
340 #define g_ptr_array_len(a)      ((a)->len)
341 #endif
342
343 #endif /* __WTAP_INT_H__ */
344
345 /*
346  * Editor modelines
347  *
348  * Local Variables:
349  * c-basic-offset: 8
350  * tab-width: 8
351  * indent-tabs-mode: t
352  * End:
353  *
354  * ex: set shiftwidth=8 tabstop=8 noexpandtab
355  * :indentSize=8:tabSize=8:noTabs=false:
356  */