3 * Testy, Virtual(-izable) Buffer of guint8*'s
5 * "Testy" -- the buffer gets mad when an attempt is made to access data
6 * beyond the bounds of the buffer. An exception is thrown.
8 * "Virtual" -- the buffer can have its own data, can use a subset of
9 * the data of a backing tvbuff, or can be a composite of
14 * Copyright (c) 2000 by Gilbert Ramirez <gram@alumni.rice.edu>
16 * Wireshark - Network traffic analyzer
17 * By Gerald Combs <gerald@wireshark.org>
18 * Copyright 1998 Gerald Combs
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version 2
23 * of the License, or (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
39 #include <epan/guid-utils.h>
40 #include <epan/wmem/wmem.h>
44 #endif /* __cplusplus */
47 * "testy, virtual(-izable) buffer". They are testy in that they get mad when
48 * an attempt is made to access data beyond the bounds of their array. In that
49 * case, they throw an exception.
51 * They are virtualizable in that new tvbuff's can be made from other tvbuffs,
52 * while only the original tvbuff may have data. That is, the new tvbuff has
57 typedef struct tvbuff tvbuff_t
;
59 struct e_in6_addr
; /* ipv6-utils.h */
61 /** @defgroup tvbuff Testy, Virtual(-izable) Buffers
63 * Dissector use and management
65 * Consider a collection of tvbs as being a chain or stack of tvbs.
67 * When dissecting a frame:
68 * The top-level dissector (packet.c) pushes the initial tvb (containing
69 * the complete frame) onto the stack (starts the chain) and then calls
70 * a sub-dissector which in turn calls the next sub-dissector and so on.
71 * Each sub-dissector may chain additional tvbs (see below) to the tvb
72 * handed to that dissector. After dissection is complete and control has
73 * returned to the top-level dissector, the chain of tvbs (stack) is free'd
74 * via a call to tvb_free_chain() (in epan_dissect_cleanup()).
77 * - Can chain new tvbs (subset, real, composite) to the
78 * tvb handed to the dissector using tvb_new_subset(),
79 * tvb_new_subset_length(), tvb_new_subset_remaining(),
80 * tvb_new_child_real_data(), tvb_set_child_real_data_tvbuff(),
81 * tvb_composite_finalize(), and tvb_child_uncompress(). (Composite
82 * tvbs should reference only tvbs which are already part of the chain).
83 * - Must not save for later use (e.g., when dissecting another frame) a
84 * pointer to a tvb handed to the dissector; (A higher level function
85 * may very well free the chain thus leaving a dangling pointer).
86 * This (obviously) also applies to any tvbs chained to the tvb handed
88 * - Can create its own tvb chain (using tvb_new_real_data() which the
90 * dissector is free to manage as desired.
94 /** TVBUFF_REAL_DATA contains a guint8* that points to real data.
95 * The data is allocated and contiguous.
97 * TVBUFF_SUBSET has a backing tvbuff. The TVBUFF_SUBSET is a "window"
98 * through which the program sees only a portion of the backing tvbuff.
100 * TVBUFF_COMPOSITE combines multiple tvbuffs sequentially to produce
101 * a larger byte array.
103 * tvbuff's of any type can be used as the backing-tvbuff of a
104 * TVBUFF_SUBSET or as the member of a TVBUFF_COMPOSITE.
105 * TVBUFF_COMPOSITEs can have member-tvbuffs of different types.
107 * Once a tvbuff is create/initialized/finalized, the tvbuff is read-only.
108 * That is, it cannot point to any other data. A new tvbuff must be created if
109 * you want a tvbuff that points to other data.
111 * tvbuff's are normally chained together to allow efficient de-allocation of
115 typedef void (*tvbuff_free_cb_t
)(void*);
117 /** Extracts 'number of bits' starting at 'bit offset'.
118 * Returns a pointer to a newly initialized g_malloc'd REAL_DATA
119 * tvbuff with the bits octet aligned.
121 WS_DLL_PUBLIC tvbuff_t
*tvb_new_octet_aligned(tvbuff_t
*tvb
,
122 guint32 bit_offset
, gint32 no_of_bits
);
124 WS_DLL_PUBLIC tvbuff_t
*tvb_new_chain(tvbuff_t
*parent
, tvbuff_t
*backing
);
126 WS_DLL_PUBLIC tvbuff_t
*tvb_clone(tvbuff_t
*tvb
);
128 WS_DLL_PUBLIC tvbuff_t
*tvb_clone_offset_len(tvbuff_t
*tvb
, guint offset
,
131 /** Free a tvbuff_t and all tvbuffs chained from it
132 * The tvbuff must be 'the 'head' (initial) tvb of a chain or
133 * must not be in a chain.
134 * If specified, a callback to free the tvbuff data will be invoked
135 * for each tvbuff free'd */
136 WS_DLL_PUBLIC
void tvb_free(tvbuff_t
*tvb
);
138 /** Free the tvbuff_t and all tvbuffs chained from it.
139 * The tvbuff must be 'the 'head' (initial) tvb of a chain or
140 * must not be in a chain.
141 * If specified, a callback to free the tvbuff data will be invoked
142 * for each tvbuff free'd */
143 WS_DLL_PUBLIC
void tvb_free_chain(tvbuff_t
*tvb
);
145 /** Set a callback function to call when a tvbuff is actually freed
146 * One argument is passed to that callback --- a void* that points
147 * to the real data. Obviously, this only applies to a
148 * TVBUFF_REAL_DATA tvbuff. */
149 WS_DLL_PUBLIC
void tvb_set_free_cb(tvbuff_t
*tvb
, const tvbuff_free_cb_t func
);
151 /** Attach a TVBUFF_REAL_DATA tvbuff to a parent tvbuff. This connection
152 * is used during a tvb_free_chain()... the "child" TVBUFF_REAL_DATA acts
153 * as if is part of the chain-of-creation of the parent tvbuff, although it
154 * isn't. This is useful if you need to take the data from some tvbuff,
155 * run some operation on it, like decryption or decompression, and make a new
156 * tvbuff from it, yet want the new tvbuff to be part of the chain. The reality
157 * is that the new tvbuff *is* part of the "chain of creation", but in a way
158 * that these tvbuff routines are ignorant of. Use this function to make
159 * the tvbuff routines knowledgable of this fact. */
160 WS_DLL_PUBLIC
void tvb_set_child_real_data_tvbuff(tvbuff_t
*parent
,
163 WS_DLL_PUBLIC tvbuff_t
*tvb_new_child_real_data(tvbuff_t
*parent
,
164 const guint8
*data
, const guint length
, const gint reported_length
);
166 /** Create a tvbuff backed by existing data. Can throw ReportedBoundsError.
167 * Normally, a callback to free the data should be registered using
168 * tvb_set_free_cb(); when this tvbuff is freed, then your callback will be
169 * called, and at that time you can free your original data. */
170 WS_DLL_PUBLIC tvbuff_t
*tvb_new_real_data(const guint8
*data
,
171 const guint length
, const gint reported_length
);
173 /** Create a tvbuff that's a subset of another tvbuff.
175 * 'backing_offset', if positive, is the offset from the beginning of
176 * the backing tvbuff at which the new tvbuff's data begins, and, if
177 * negative, is the offset from the end of the backing tvbuff at which
178 * the new tvbuff's data begins.
180 * 'backing_length' is the length of the data to include in the new
181 * tvbuff, starting with the byte at 'backing_offset"; if -1, it
182 * means "to the end of the backing tvbuff". It can be 0, although
183 * the usefulness of the buffer would be rather limited.
185 * Will throw BoundsError if 'backing_offset'/'length'
186 * is beyond the bounds of the backing tvbuff.
187 * Can throw ReportedBoundsError. */
188 WS_DLL_PUBLIC tvbuff_t
*tvb_new_subset(tvbuff_t
*backing
,
189 const gint backing_offset
, const gint backing_length
,
190 const gint reported_length
);
193 * Similar to tvb_new_subset() but with captured length calculated
194 * to fit within the existing captured length and the specified
195 * backing length (which is used as the reported length).
196 * Can throw ReportedBoundsError. */
197 WS_DLL_PUBLIC tvbuff_t
*tvb_new_subset_length(tvbuff_t
*backing
,
198 const gint backing_offset
, const gint backing_length
);
200 /** Similar to tvb_new_subset() but with backing_length and reported_length set
201 * to -1. Can throw ReportedBoundsError. */
202 WS_DLL_PUBLIC tvbuff_t
*tvb_new_subset_remaining(tvbuff_t
*backing
,
203 const gint backing_offset
);
206 * Both tvb_composite_append and tvb_composite_prepend can throw
207 * BoundsError if member_offset/member_length goes beyond bounds of
208 * the 'member' tvbuff. */
210 /** Append to the list of tvbuffs that make up this composite tvbuff */
211 WS_DLL_PUBLIC
void tvb_composite_append(tvbuff_t
*tvb
, tvbuff_t
*member
);
213 /** Prepend to the list of tvbuffs that make up this composite tvbuff */
214 extern void tvb_composite_prepend(tvbuff_t
*tvb
, tvbuff_t
*member
);
216 /** Create an empty composite tvbuff. */
217 WS_DLL_PUBLIC tvbuff_t
*tvb_new_composite(void);
219 /** Mark a composite tvbuff as initialized. No further appends or prepends
220 * occur, data access can finally happen after this finalization. */
221 WS_DLL_PUBLIC
void tvb_composite_finalize(tvbuff_t
*tvb
);
224 /* Get total length of buffer */
225 WS_DLL_PUBLIC guint
tvb_length(const tvbuff_t
*tvb
);
227 /** Computes bytes to end of buffer, from offset (which can be negative,
228 * to indicate bytes from end of buffer). Function returns 0 if offset is
229 * either at the end of the buffer or out of bounds. No exception is thrown. */
230 WS_DLL_PUBLIC gint
tvb_length_remaining(const tvbuff_t
*tvb
, const gint offset
);
232 /** Same as above, but throws an exception if the offset is out of bounds. */
233 WS_DLL_PUBLIC guint
tvb_ensure_length_remaining(const tvbuff_t
*tvb
,
236 /* Checks (w/o throwing exception) that the bytes referred to by
237 * 'offset'/'length' actually exist in the buffer */
238 WS_DLL_PUBLIC gboolean
tvb_bytes_exist(const tvbuff_t
*tvb
, const gint offset
,
241 /** Checks that the bytes referred to by 'offset'/'length' actually exist
242 * in the buffer, and throws an exception if they aren't. */
243 WS_DLL_PUBLIC
void tvb_ensure_bytes_exist(const tvbuff_t
*tvb
,
244 const gint offset
, const gint length
);
246 /* Checks (w/o throwing exception) that offset exists in buffer */
247 WS_DLL_PUBLIC gboolean
tvb_offset_exists(const tvbuff_t
*tvb
,
250 /* Get reported length of buffer */
251 WS_DLL_PUBLIC guint
tvb_reported_length(const tvbuff_t
*tvb
);
253 /** Computes bytes of reported packet data to end of buffer, from offset
254 * (which can be negative, to indicate bytes from end of buffer). Function
255 * returns 0 if offset is either at the end of the buffer or out of bounds.
256 * No exception is thrown. */
257 WS_DLL_PUBLIC gint
tvb_reported_length_remaining(const tvbuff_t
*tvb
,
260 /** Set the reported length of a tvbuff to a given value; used for protocols
261 whose headers contain an explicit length and where the calling
262 dissector's payload may include padding as well as the packet for
265 Also adjusts the data length. */
266 WS_DLL_PUBLIC
void tvb_set_reported_length(tvbuff_t
*tvb
, const guint
);
268 WS_DLL_PUBLIC guint
tvb_offset_from_real_beginning(const tvbuff_t
*tvb
);
270 /* Returns the offset from the first byte of real data. */
271 WS_DLL_PUBLIC gint
tvb_raw_offset(tvbuff_t
*tvb
);
273 /** Set the "this is a fragment" flag. */
274 WS_DLL_PUBLIC
void tvb_set_fragment(tvbuff_t
*tvb
);
276 WS_DLL_PUBLIC
struct tvbuff
*tvb_get_ds_tvb(tvbuff_t
*tvb
);
279 /************** START OF ACCESSORS ****************/
280 /* All accessors will throw an exception if appropriate */
282 WS_DLL_PUBLIC guint8
tvb_get_guint8(tvbuff_t
*tvb
, const gint offset
);
284 WS_DLL_PUBLIC guint16
tvb_get_ntohs(tvbuff_t
*tvb
, const gint offset
);
285 WS_DLL_PUBLIC guint32
tvb_get_ntoh24(tvbuff_t
*tvb
, const gint offset
);
286 WS_DLL_PUBLIC guint32
tvb_get_ntohl(tvbuff_t
*tvb
, const gint offset
);
287 WS_DLL_PUBLIC guint64
tvb_get_ntoh40(tvbuff_t
*tvb
, const gint offset
);
288 WS_DLL_PUBLIC guint64
tvb_get_ntoh48(tvbuff_t
*tvb
, const gint offset
);
289 WS_DLL_PUBLIC guint64
tvb_get_ntoh56(tvbuff_t
*tvb
, const gint offset
);
290 WS_DLL_PUBLIC guint64
tvb_get_ntoh64(tvbuff_t
*tvb
, const gint offset
);
291 WS_DLL_PUBLIC gfloat
tvb_get_ntohieee_float(tvbuff_t
*tvb
, const gint offset
);
292 WS_DLL_PUBLIC gdouble
tvb_get_ntohieee_double(tvbuff_t
*tvb
,
295 WS_DLL_PUBLIC guint16
tvb_get_letohs(tvbuff_t
*tvb
, const gint offset
);
296 WS_DLL_PUBLIC guint32
tvb_get_letoh24(tvbuff_t
*tvb
, const gint offset
);
297 WS_DLL_PUBLIC guint32
tvb_get_letohl(tvbuff_t
*tvb
, const gint offset
);
298 WS_DLL_PUBLIC guint64
tvb_get_letoh40(tvbuff_t
*tvb
, const gint offset
);
299 WS_DLL_PUBLIC guint64
tvb_get_letoh48(tvbuff_t
*tvb
, const gint offset
);
300 WS_DLL_PUBLIC guint64
tvb_get_letoh56(tvbuff_t
*tvb
, const gint offset
);
301 WS_DLL_PUBLIC guint64
tvb_get_letoh64(tvbuff_t
*tvb
, const gint offset
);
302 WS_DLL_PUBLIC gfloat
tvb_get_letohieee_float(tvbuff_t
*tvb
, const gint offset
);
303 WS_DLL_PUBLIC gdouble
tvb_get_letohieee_double(tvbuff_t
*tvb
,
307 * Fetch an IPv4 address, in network byte order.
308 * We do *not* convert it to host byte order; we leave it in
309 * network byte order, as that's what its callers expect. */
310 WS_DLL_PUBLIC guint32
tvb_get_ipv4(tvbuff_t
*tvb
, const gint offset
);
312 /* Fetch an IPv6 address. */
313 WS_DLL_PUBLIC
void tvb_get_ipv6(tvbuff_t
*tvb
, const gint offset
,
314 struct e_in6_addr
*addr
);
317 WS_DLL_PUBLIC
void tvb_get_ntohguid(tvbuff_t
*tvb
, const gint offset
,
319 WS_DLL_PUBLIC
void tvb_get_letohguid(tvbuff_t
*tvb
, const gint offset
,
321 WS_DLL_PUBLIC
void tvb_get_guid(tvbuff_t
*tvb
, const gint offset
,
322 e_guid_t
*guid
, const guint representation
);
324 /* Fetch a specified number of bits from bit offset in a tvb. All of these
325 * functions are equivalent, except for the type of the return value. Note
326 * that the parameter encoding (where supplied) is meaningless and ignored */
328 /* get 1 - 8 bits returned in a guint8 */
329 WS_DLL_PUBLIC guint8
tvb_get_bits8(tvbuff_t
*tvb
, guint bit_offset
,
330 const gint no_of_bits
);
331 /* get 1 - 16 bits returned in a guint16 */
332 WS_DLL_PUBLIC guint16
tvb_get_bits16(tvbuff_t
*tvb
, guint bit_offset
,
333 const gint no_of_bits
, const guint encoding
);
334 /* get 1 - 32 bits returned in a guint32 */
335 WS_DLL_PUBLIC guint32
tvb_get_bits32(tvbuff_t
*tvb
, guint bit_offset
,
336 const gint no_of_bits
, const guint encoding
);
337 /* get 1 - 64 bits returned in a guint64 */
338 WS_DLL_PUBLIC guint64
tvb_get_bits64(tvbuff_t
*tvb
, guint bit_offset
,
339 const gint no_of_bits
, const guint encoding
);
342 * This function has EXACTLY the same behavior as
345 WS_DLL_PUBLIC guint32
tvb_get_bits(tvbuff_t
*tvb
, const guint bit_offset
,
346 const gint no_of_bits
, const guint encoding
);
348 /** Returns target for convenience. Does not suffer from possible
349 * expense of tvb_get_ptr(), since this routine is smart enough
350 * to copy data in chunks if the request range actually exists in
351 * different TVBUFF_REAL_DATA tvbuffs. This function assumes that the
352 * target memory is already allocated; it does not allocate or free the
354 WS_DLL_PUBLIC
void *tvb_memcpy(tvbuff_t
*tvb
, void *target
, const gint offset
,
357 /** If scope is set to NULL it is the user's responsibility to g_free()
358 * the memory allocated by tvb_memdup(). Otherwise memory is
359 * automatically freed when the scope lifetime is reached.
360 * Calls tvb_memcpy() */
361 WS_DLL_PUBLIC
void *tvb_memdup(wmem_allocator_t
*scope
, tvbuff_t
*tvb
,
362 const gint offset
, size_t length
);
364 /** WARNING! This function is possibly expensive, temporarily allocating
365 * another copy of the packet data. Furthermore, it's dangerous because once
366 * this pointer is given to the user, there's no guarantee that the user will
367 * honor the 'length' and not overstep the boundaries of the buffer.
369 * If you're thinking of using tvb_get_ptr, STOP WHAT YOU ARE DOING
370 * IMMEDIATELY. Go take a break. Consider that tvb_get_ptr hands you
371 * a raw, unprotected pointer that you can easily use to create a
372 * security vulnerability or otherwise crash Wireshark. Then consider
373 * that you can probably find a function elsewhere in this file that
374 * does exactly what you want in a much more safe and robust manner.
376 * The returned pointer is data that is internal to the tvbuff, so do not
377 * attempt to free it. Don't modify the data, either, because another tvbuff
378 * that might be using this tvbuff may have already copied that portion of
379 * the data (sometimes tvbuff's need to make copies of data, but that's the
380 * internal implementation that you need not worry about). Assume that the
381 * guint8* points to read-only data that the tvbuff manages.
383 * Return a pointer into our buffer if the data asked for via 'offset'/'length'
384 * is contiguous (which might not be the case for TVBUFF_COMPOSITE). If the
385 * data is not contiguous, a tvb_memdup() is called for the entire buffer
386 * and the pointer to the newly-contiguous data is returned. This dynamically-
387 * allocated memory will be freed when the tvbuff is freed, after the
388 * tvbuff_free_cb_t() is called, if any. */
389 WS_DLL_PUBLIC
const guint8
*tvb_get_ptr(tvbuff_t
*tvb
, const gint offset
,
392 /** Find first occurrence of needle in tvbuff, starting at offset. Searches
393 * at most maxlength number of bytes; if maxlength is -1, searches to
395 * Returns the offset of the found needle, or -1 if not found.
396 * Will not throw an exception, even if maxlength exceeds boundary of tvbuff;
397 * in that case, -1 will be returned if the boundary is reached before
399 WS_DLL_PUBLIC gint
tvb_find_guint8(tvbuff_t
*tvb
, const gint offset
,
400 const gint maxlength
, const guint8 needle
);
402 /** Find first occurrence of any of the needles in tvbuff, starting at offset.
403 * Searches at most maxlength number of bytes. Returns the offset of the
404 * found needle, or -1 if not found and the found needle.
405 * Will not throw an exception, even if
406 * maxlength exceeds boundary of tvbuff; in that case, -1 will be returned if
407 * the boundary is reached before finding needle. */
408 WS_DLL_PUBLIC gint
tvb_pbrk_guint8(tvbuff_t
*tvb
, const gint offset
,
409 const gint maxlength
, const guint8
*needles
, guchar
*found_needle
);
411 /** Find size of stringz (NUL-terminated string) by looking for terminating
412 * NUL. The size of the string includes the terminating NUL.
414 * If the NUL isn't found, it throws the appropriate exception.
416 WS_DLL_PUBLIC guint
tvb_strsize(tvbuff_t
*tvb
, const gint offset
);
418 /** Find size of UCS-2 or UTF-16 stringz (NUL-terminated string) by
419 * looking for terminating 16-bit NUL. The size of the string includes
420 * the terminating NUL.
422 * If the NUL isn't found, it throws the appropriate exception.
424 WS_DLL_PUBLIC guint
tvb_unicode_strsize(tvbuff_t
*tvb
, const gint offset
);
426 /** Find length of string by looking for end of zero terminated string, up to
427 * 'maxlength' characters'; if 'maxlength' is -1, searches to end
429 * Returns -1 if 'maxlength' reached before finding EOS. */
430 WS_DLL_PUBLIC gint
tvb_strnlen(tvbuff_t
*tvb
, const gint offset
,
431 const guint maxlength
);
433 /** Convert a string from Unicode to ASCII. At the moment we fake it by
434 * assuming all characters are ASCII )-: The len parameter is the number
435 * of guint16's to convert from Unicode.
437 * XXX - These functions have been superceded by tvb_get_unicode_string()
439 * If scope is set to NULL, returned buffer is allocated by g_malloc()
440 * and must be g_free by the caller. Otherwise memory is automatically
441 * freed when the scope lifetime is reached.
443 WS_DLL_PUBLIC
char *tvb_get_faked_unicode(wmem_allocator_t
*scope
,
444 tvbuff_t
*tvb
, int offset
, const int len
, const gboolean little_endian
);
447 * Format the data in the tvb from offset for size ...
449 WS_DLL_PUBLIC gchar
*tvb_format_text(tvbuff_t
*tvb
, const gint offset
,
453 * Like "tvb_format_text()", but for 'wsp'; don't show
454 * the characters as C-style escapes.
456 WS_DLL_PUBLIC gchar
*tvb_format_text_wsp(tvbuff_t
*tvb
, const gint offset
,
460 * Like "tvb_format_text()", but for null-padded strings; don't show
461 * the null padding characters as "\000".
463 extern gchar
*tvb_format_stringzpad(tvbuff_t
*tvb
, const gint offset
,
467 * Like "tvb_format_text_wsp()", but for null-padded strings; don't show
468 * the null padding characters as "\000".
470 extern gchar
*tvb_format_stringzpad_wsp(tvbuff_t
*tvb
, const gint offset
,
475 * Given a tvbuff, an offset, and a length, allocate a buffer big enough
476 * to hold a non-null-terminated string of that length at that offset,
477 * plus a trailing zero, copy the string into it, and return a pointer
480 * Throws an exception if the tvbuff ends before the string does.
482 * tvb_get_string() returns a string allocated.
484 * tvb_get_unicode_string() Unicode (UTF-16) version of above.
486 * tvb_get_string_enc() takes a string encoding as well, and converts to UTF-8
487 * from the encoding (only UTF-8 and EBCDIC supported).
489 * If scope is set to NULL it is the user's responsibility to g_free()
490 * the memory allocated by tvb_memdup(). Otherwise memory is
491 * automatically freed when the scope lifetime is reached.
493 WS_DLL_PUBLIC guint8
*tvb_get_string(wmem_allocator_t
*scope
, tvbuff_t
*tvb
,
494 const gint offset
, const gint length
);
495 WS_DLL_PUBLIC gchar
*tvb_get_unicode_string(wmem_allocator_t
*scope
,
496 tvbuff_t
*tvb
, const gint offset
, gint length
, const guint encoding
);
497 WS_DLL_PUBLIC guint8
*tvb_get_string_enc(wmem_allocator_t
*scope
,
498 tvbuff_t
*tvb
, const gint offset
, const gint length
, const guint encoding
);
502 * Given a tvbuff and an offset, with the offset assumed to refer to
503 * a null-terminated string, find the length of that string (and throw
504 * an exception if the tvbuff ends before we find the null), allocate
505 * a buffer big enough to hold the string, copy the string into it,
506 * and return a pointer to the string. Also return the length of the
507 * string (including the terminating null) through a pointer.
509 * tvb_get_stringz() returns a string
511 * tvb_get_stringz_enc() takes a string encoding as well, and converts to
512 * UTF-8 from the encoding (only UTF-8 and EBCDIC supported)
514 * tvb_get_const_stringz() returns a constant (unmodifiable) string that does
515 * not need to be freed, instead it will automatically be
516 * freed once the next packet is dissected. It is slightly
517 * more efficient than the other routines.
519 * tvb_get_unicode_stringz() Unicode (UTF-16) version of above
521 * If scope is set to NULL it is the user's responsibility to g_free()
522 * the memory allocated by tvb_memdup(). Otherwise memory is
523 * automatically freed when the scope lifetime is reached.
525 WS_DLL_PUBLIC guint8
*tvb_get_stringz(wmem_allocator_t
*scope
, tvbuff_t
*tvb
,
526 const gint offset
, gint
*lengthp
);
527 WS_DLL_PUBLIC guint8
*tvb_get_stringz_enc(wmem_allocator_t
*scope
,
528 tvbuff_t
*tvb
, const gint offset
, gint
*lengthp
, const guint encoding
);
529 WS_DLL_PUBLIC
const guint8
*tvb_get_const_stringz(tvbuff_t
*tvb
,
530 const gint offset
, gint
*lengthp
);
531 WS_DLL_PUBLIC gchar
*tvb_get_unicode_stringz(wmem_allocator_t
*scope
,
532 tvbuff_t
*tvb
, const gint offset
, gint
*lengthp
, const guint encoding
);
534 /** Looks for a stringz (NUL-terminated string) in tvbuff and copies
535 * no more than bufsize number of bytes, including terminating NUL, to buffer.
536 * Returns length of string (not including terminating NUL), or -1 if the
537 * string was truncated in the buffer due to not having reached the terminating
538 * NUL. In this way, it acts like g_snprintf().
540 * When processing a packet where the remaining number of bytes is less
541 * than bufsize, an exception is not thrown if the end of the packet
542 * is reached before the NUL is found. If no NUL is found before reaching
543 * the end of the short packet, -1 is still returned, and the string
544 * is truncated with a NUL, albeit not at buffer[bufsize - 1], but
545 * at the correct spot, terminating the string.
547 WS_DLL_PUBLIC gint
tvb_get_nstringz(tvbuff_t
*tvb
, const gint offset
,
548 const guint bufsize
, guint8
*buffer
);
550 /** Like tvb_get_nstringz(), but never returns -1. The string is guaranteed to
551 * have a terminating NUL. If the string was truncated when copied into buffer,
552 * a NUL is placed at the end of buffer to terminate it.
554 * bufsize MUST be greater than 0.
556 WS_DLL_PUBLIC gint
tvb_get_nstringz0(tvbuff_t
*tvb
, const gint offset
,
557 const guint bufsize
, guint8
*buffer
);
560 * Given a tvbuff, an offset into the tvbuff, and a length that starts
561 * at that offset (which may be -1 for "all the way to the end of the
562 * tvbuff"), find the end of the (putative) line that starts at the
563 * specified offset in the tvbuff, going no further than the specified
566 * Return the length of the line (not counting the line terminator at
567 * the end), or, if we don't find a line terminator:
569 * if "deseg" is true, return -1;
571 * if "deseg" is false, return the amount of data remaining in
574 * Set "*next_offset" to the offset of the character past the line
575 * terminator, or past the end of the buffer if we don't find a line
576 * terminator. (It's not set if we return -1.)
578 WS_DLL_PUBLIC gint
tvb_find_line_end(tvbuff_t
*tvb
, const gint offset
, int len
,
579 gint
*next_offset
, const gboolean desegment
);
582 * Given a tvbuff, an offset into the tvbuff, and a length that starts
583 * at that offset (which may be -1 for "all the way to the end of the
584 * tvbuff"), find the end of the (putative) line that starts at the
585 * specified offset in the tvbuff, going no further than the specified
588 * However, treat quoted strings inside the buffer specially - don't
589 * treat newlines in quoted strings as line terminators.
591 * Return the length of the line (not counting the line terminator at
592 * the end), or the amount of data remaining in the buffer if we don't
593 * find a line terminator.
595 * Set "*next_offset" to the offset of the character past the line
596 * terminator, or past the end of the buffer if we don't find a line
599 WS_DLL_PUBLIC gint
tvb_find_line_end_unquoted(tvbuff_t
*tvb
, const gint offset
,
600 int len
, gint
*next_offset
);
603 * Copied from the mgcp dissector. (This function should be moved to /epan )
604 * tvb_skip_wsp - Returns the position in tvb of the first non-whitespace
605 * character following offset or offset + maxlength -1 whichever
609 * tvb - The tvbuff in which we are skipping whitespace.
610 * offset - The offset in tvb from which we begin trying to skip whitespace.
611 * maxlength - The maximum distance from offset that we may try to skip
614 * Returns: The position in tvb of the first non-whitespace
615 * character following offset or offset + maxlength -1 whichever
619 WS_DLL_PUBLIC gint
tvb_skip_wsp(tvbuff_t
*tvb
, const gint offset
,
620 const gint maxlength
);
622 WS_DLL_PUBLIC gint
tvb_skip_wsp_return(tvbuff_t
*tvb
, const gint offset
);
625 * Call strncmp after checking if enough chars left, returning 0 if
626 * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
628 WS_DLL_PUBLIC gint
tvb_strneql(tvbuff_t
*tvb
, const gint offset
,
629 const gchar
*str
, const size_t size
);
632 * Call g_ascii_strncasecmp after checking if enough chars left, returning
633 * 0 if it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
635 WS_DLL_PUBLIC gint
tvb_strncaseeql(tvbuff_t
*tvb
, const gint offset
,
636 const gchar
*str
, const size_t size
);
639 * Call memcmp after checking if enough chars left, returning 0 if
640 * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
642 WS_DLL_PUBLIC gint
tvb_memeql(tvbuff_t
*tvb
, const gint offset
,
643 const guint8
*str
, size_t size
);
646 * Format a bunch of data from a tvbuff as bytes, returning a pointer
647 * to the string with the formatted data, with "punct" as a byte
650 WS_DLL_PUBLIC gchar
*tvb_bytes_to_str_punct(tvbuff_t
*tvb
, const gint offset
,
651 const gint len
, const gchar punct
);
654 * Format a bunch of data from a tvbuff as bytes, returning a pointer
655 * to the string with the formatted data.
657 WS_DLL_PUBLIC gchar
*tvb_bytes_to_str(tvbuff_t
*tvb
, const gint offset
,
661 * Given a tvbuff, an offset into the tvbuff, and a length that starts
662 * at that offset (which may be -1 for "all the way to the end of the
663 * tvbuff"), fetch BCD encoded digits from a tvbuff starting from either
664 * the low or high half byte, formatting the digits according to an input digit
665 * set, if NUL a default digit set of 0-9 returning "?" for overdecadic digits
666 * will be used. A pointer to the EP allocated string will be returned.
667 * Note a tvbuff content of 0xf is considered a 'filler' and will end the
670 typedef struct dgt_set_t
672 const unsigned char out
[15];
676 WS_DLL_PUBLIC
const gchar
*tvb_bcd_dig_to_wmem_packet_str(tvbuff_t
*tvb
,
677 const gint offset
, const gint len
, dgt_set_t
*dgt
, gboolean skip_first
);
679 /** Locate a sub-tvbuff within another tvbuff, starting at position
680 * 'haystack_offset'. Returns the index of the beginning of 'needle' within
681 * 'haystack', or -1 if 'needle' is not found. The index is relative
682 * to the start of 'haystack', not 'haystack_offset'. */
683 WS_DLL_PUBLIC gint
tvb_find_tvb(tvbuff_t
*haystack_tvb
, tvbuff_t
*needle_tvb
,
684 const gint haystack_offset
);
687 * Uncompresses a zlib compressed packet inside a tvbuff at offset with
688 * length comprlen. Returns an uncompressed tvbuffer if uncompression
689 * succeeded or NULL if uncompression failed.
691 WS_DLL_PUBLIC tvbuff_t
*tvb_uncompress(tvbuff_t
*tvb
, const int offset
,
695 * Uncompresses a zlib compressed packet inside a tvbuff at offset with
696 * length comprlen. Returns an uncompressed tvbuffer attached to tvb if
697 * uncompression succeeded or NULL if uncompression failed.
699 extern tvbuff_t
*tvb_child_uncompress(tvbuff_t
*parent
, tvbuff_t
*tvb
,
700 const int offset
, int comprlen
);
702 /************** END OF ACCESSORS ****************/
708 #endif /* __cplusplus */
710 #endif /* __TVBUFF_H__ */
713 * Editor modelines - http://www.wireshark.org/tools/modelines.html
718 * indent-tabs-mode: nil
721 * vi: set shiftwidth=4 tabstop=4 expandtab:
722 * :indentSize=4:tabSize=4:noTabs=true: