forked from osmocom/wireshark
![Michael Mann](/assets/img/avatar_default.png)
Change-Id: I7e484de65c49060793a91cc11cb211effa2006db Reviewed-on: https://code.wireshark.org/review/1494 Reviewed-by: Michael Mann <mmann78@netscape.net>
389 lines
13 KiB
C
389 lines
13 KiB
C
/* ftap.h
|
|
*
|
|
* Filetap Library
|
|
* Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __FTAP_H__
|
|
#define __FTAP_H__
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif
|
|
|
|
#include <glib.h>
|
|
#include <time.h>
|
|
#include <filetap/buffer.h>
|
|
#include <wsutil/nstime.h>
|
|
#include "ws_symbol_export.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/* Encapsulation types. Choose names that truly reflect
|
|
* what is contained in the packet trace file.
|
|
*
|
|
* FTAP_ENCAP_PER_RECORD is a value passed to "ftap_dump_open()" or
|
|
* "ftap_dump_fd_open()" to indicate that there is no single encapsulation
|
|
* type for all records in the file; this may cause those routines to
|
|
* fail if the file format being written can't support that.
|
|
* It's also returned by "ftap_file_encap()" for capture files that
|
|
* don't have a single encapsulation type for all packets in the file.
|
|
*
|
|
* FTAP_ENCAP_UNKNOWN is returned by "ftap_pcap_encap_to_ftap_encap()"
|
|
* if it's handed an unknown encapsulation.
|
|
*
|
|
*/
|
|
#define FTAP_ENCAP_PER_RECORD -1
|
|
#define FTAP_ENCAP_UNKNOWN 0
|
|
|
|
/* After adding new item here, please also add new item to encap_table_base array */
|
|
|
|
#define FTAP_NUM_ENCAP_TYPES ftap_get_num_encap_types()
|
|
|
|
/* File types/subtypes that can be read by filetap. */
|
|
#define FTAP_FILE_TYPE_SUBTYPE_UNKNOWN 0
|
|
|
|
#define FTAP_NUM_FILE_TYPES_SUBTYPES ftap_get_num_file_types_subtypes()
|
|
|
|
/*
|
|
* Maximum record size we'll support.
|
|
* 65535 is the largest snapshot length that libpcap supports, so we
|
|
* use that.
|
|
*/
|
|
#define FTAP_MAX_RECORD_SIZE 65535
|
|
|
|
typedef struct ftap ftap;
|
|
typedef struct ftap_dumper ftap_dumper;
|
|
|
|
typedef struct ftap_reader *FILE_F;
|
|
|
|
/*
|
|
* For registering extensions used for capture file formats.
|
|
*
|
|
* These items are used in dialogs for opening files, so that
|
|
* the user can ask to see all capture files (as identified
|
|
* by file extension) or particular types of capture files.
|
|
*
|
|
* Each file type has a description and a list of extensions the file
|
|
* might have. Some file types aren't real file types, they're
|
|
* just generic types, such as "text file" or "XML file", that can
|
|
* be used for, among other things, captures we can read, or for
|
|
* extensions such as ".cap" that were unimaginatively chosen by
|
|
* several different sniffers for their file formats.
|
|
*/
|
|
struct filetap_extension_info {
|
|
/* the file type name */
|
|
const char *name;
|
|
|
|
/* a semicolon-separated list of file extensions used for this type */
|
|
const char *extensions;
|
|
};
|
|
|
|
/*
|
|
* For registering file types that we can open.
|
|
*
|
|
* Each file type has an open routine and an optional list of extensions
|
|
* the file might have.
|
|
*
|
|
* The open routine should return:
|
|
*
|
|
* -1 on an I/O error;
|
|
*
|
|
* 1 if the file it's reading is one of the types it handles;
|
|
*
|
|
* 0 if the file it's reading isn't the type it handles.
|
|
*
|
|
* If the routine handles this type of file, it should set the "file_type"
|
|
* field in the "struct ftap" to the type of the file.
|
|
*
|
|
* Note that the routine does not have to free the private data pointer on
|
|
* error. The caller takes care of that by calling ftap_close on error.
|
|
* (See https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8518)
|
|
*
|
|
* However, the caller does have to free the private data pointer when
|
|
* returning 0, since the next file type will be called and will likely
|
|
* just overwrite the pointer.
|
|
*/
|
|
|
|
/*
|
|
* Some file formats have defined magic numbers at fixed offsets from
|
|
* the beginning of the file; those routines should return 1 if and
|
|
* only if the file has the magic number at that offset. (pcap-ng
|
|
* is a bit of a special case, as it has both the Section Header Block
|
|
* type field and its byte-order magic field; it checks for both.)
|
|
* Those file formats do not require a file name extension in order
|
|
* to recognize them or to avoid recognizing other file types as that
|
|
* type, and have no extensions specified for them.
|
|
*/
|
|
typedef int (*ftap_open_routine_t)(struct ftap*, int *, char **);
|
|
|
|
/*
|
|
* Some file formats don't have defined magic numbers at fixed offsets,
|
|
* so a heuristic is required. If that file format has any file name
|
|
* extensions used for it, a list of those extensions should be
|
|
* specified, so that, if the name of the file being opened has an
|
|
* extension, the file formats that use that extension are tried before
|
|
* the ones that don't, to handle the case where a file of one type
|
|
* might be recognized by the heuristics for a different file type.
|
|
*/
|
|
struct ftap_heuristic_open_info {
|
|
ftap_open_routine_t open_routine;
|
|
const char *extensions;
|
|
gchar **extensions_set; /* populated using extensions member during initialization */
|
|
};
|
|
|
|
struct ftap_file_type_subtype_info {
|
|
/* the file type name */
|
|
/* should be NULL for all "pseudo" types that are only internally used and not read/writeable */
|
|
const char *name;
|
|
|
|
/* the file type short name, used as a shortcut for the command line tools */
|
|
/* should be NULL for all "pseudo" types that are only internally used and not read/writeable */
|
|
const char *short_name;
|
|
|
|
/* the default file extension, used to save this type */
|
|
/* should be NULL if no default extension is known */
|
|
const char *default_file_extension;
|
|
|
|
/* a semicolon-separated list of additional file extensions */
|
|
/* used for this type */
|
|
/* should be NULL if no extensions, or no extensions other */
|
|
/* than the default extension, are known */
|
|
const char *additional_file_extensions;
|
|
};
|
|
|
|
|
|
/** On failure, "ftap_open_offline()" returns NULL, and puts into the
|
|
* "int" pointed to by its second argument:
|
|
*
|
|
* @param filename Name of the file to open
|
|
* @param err a positive "errno" value if the capture file can't be opened;
|
|
* a negative number, indicating the type of error, on other failures.
|
|
* @param err_info for some errors, a string giving more details of
|
|
* the error
|
|
* @param do_random TRUE if random access to the file will be done,
|
|
* FALSE if not
|
|
*/
|
|
WS_DLL_PUBLIC
|
|
struct ftap* ftap_open_offline(const char *filename, int *err,
|
|
gchar **err_info, gboolean do_random);
|
|
|
|
/**
|
|
* If we were compiled with zlib and we're at EOF, unset EOF so that
|
|
* ftap_read/gzread has a chance to succeed. This is necessary if
|
|
* we're tailing a file.
|
|
*/
|
|
WS_DLL_PUBLIC
|
|
void ftap_cleareof(ftap *fth);
|
|
|
|
/** Returns TRUE if read was successful. FALSE if failure. data_offset is
|
|
* set to the offset in the file where the data for the read packet is
|
|
* located. */
|
|
WS_DLL_PUBLIC
|
|
gboolean ftap_read(ftap *fth, int *err, gchar **err_info,
|
|
gint64 *data_offset);
|
|
|
|
WS_DLL_PUBLIC
|
|
gboolean ftap_seek_read (ftap *fth, gint64 seek_off,
|
|
Buffer *buf, int len,
|
|
int *err, gchar **err_info);
|
|
|
|
/*** get various information snippets about the current file ***/
|
|
|
|
/** Return an approximation of the amount of data we've read sequentially
|
|
* from the file so far. */
|
|
WS_DLL_PUBLIC
|
|
gint64 ftap_read_so_far(ftap *fth);
|
|
WS_DLL_PUBLIC
|
|
gint64 ftap_file_size(ftap *fth, int *err);
|
|
WS_DLL_PUBLIC
|
|
gboolean ftap_iscompressed(ftap *fth);
|
|
WS_DLL_PUBLIC
|
|
guint ftap_snapshot_length(ftap *fth); /* per file */
|
|
WS_DLL_PUBLIC
|
|
int ftap_file_type_subtype(ftap *fth);
|
|
WS_DLL_PUBLIC
|
|
int ftap_file_encap(ftap *fth);
|
|
|
|
/*** close the file descriptors for the current file ***/
|
|
WS_DLL_PUBLIC
|
|
void ftap_fdclose(ftap *fth);
|
|
|
|
/*** reopen the random file descriptor for the current file ***/
|
|
WS_DLL_PUBLIC
|
|
gboolean ftap_fdreopen(ftap *fth, const char *filename, int *err);
|
|
|
|
/*** close the current file ***/
|
|
WS_DLL_PUBLIC
|
|
void ftap_sequential_close(ftap *fth);
|
|
WS_DLL_PUBLIC
|
|
void ftap_close(ftap *fth);
|
|
|
|
/*** various string converter functions ***/
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_file_type_subtype_string(int file_type_subtype);
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_file_type_subtype_short_string(int file_type_subtype);
|
|
WS_DLL_PUBLIC
|
|
int ftap_short_string_to_file_type_subtype(const char *short_name);
|
|
|
|
/*** various file extension functions ***/
|
|
WS_DLL_PUBLIC
|
|
GSList *ftap_get_all_file_extensions_list(void);
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_default_file_extension(int filetype);
|
|
WS_DLL_PUBLIC
|
|
GSList *ftap_get_file_extensions_list(int filetype, gboolean include_compressed);
|
|
WS_DLL_PUBLIC
|
|
void ftap_free_extensions_list(GSList *extensions);
|
|
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_encap_string(int encap);
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_encap_short_string(int encap);
|
|
WS_DLL_PUBLIC
|
|
int ftap_short_string_to_encap(const char *short_name);
|
|
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_strerror(int err);
|
|
|
|
/*** get available number of file types and encapsulations ***/
|
|
WS_DLL_PUBLIC
|
|
int ftap_get_num_file_type_extensions(void);
|
|
WS_DLL_PUBLIC
|
|
int ftap_get_num_encap_types(void);
|
|
WS_DLL_PUBLIC
|
|
int ftap_get_num_file_types_subtypes(void);
|
|
|
|
/*** get information for file type extension ***/
|
|
WS_DLL_PUBLIC
|
|
const char *ftap_get_file_extension_type_name(int extension_type);
|
|
WS_DLL_PUBLIC
|
|
GSList *ftap_get_file_extension_type_extensions(guint extension_type);
|
|
|
|
/*** dynamically register new file types and encapsulations ***/
|
|
WS_DLL_PUBLIC
|
|
void ftap_register_plugin_types(void);
|
|
WS_DLL_PUBLIC
|
|
void register_all_filetap_modules(void);
|
|
WS_DLL_PUBLIC
|
|
void ftap_register_file_type_extension(const struct filetap_extension_info *ei);
|
|
WS_DLL_PUBLIC
|
|
void ftap_register_magic_number_open_routine(ftap_open_routine_t open_routine);
|
|
WS_DLL_PUBLIC
|
|
void ftap_register_heuristic_open_info(struct ftap_heuristic_open_info *oi);
|
|
WS_DLL_PUBLIC
|
|
int ftap_register_file_type_subtypes(const struct ftap_file_type_subtype_info* fi);
|
|
WS_DLL_PUBLIC
|
|
int ftap_register_encap_type(const char* name, const char* short_name);
|
|
|
|
|
|
/**
|
|
* Filetap error codes.
|
|
*/
|
|
#define FTAP_ERR_NOT_REGULAR_FILE -1
|
|
/** The file being opened for reading isn't a plain file (or pipe) */
|
|
|
|
#define FTAP_ERR_RANDOM_OPEN_PIPE -2
|
|
/** The file is being opened for random access and it's a pipe */
|
|
|
|
#define FTAP_ERR_FILE_UNKNOWN_FORMAT -3
|
|
/** The file being opened is not a capture file in a known format */
|
|
|
|
#define FTAP_ERR_UNSUPPORTED -4
|
|
/** Supported file type, but there's something in the file we
|
|
can't support */
|
|
|
|
#define FTAP_ERR_CANT_WRITE_TO_PIPE -5
|
|
/** Filetap can't save to a pipe in the specified format */
|
|
|
|
#define FTAP_ERR_CANT_OPEN -6
|
|
/** The file couldn't be opened, reason unknown */
|
|
|
|
#define FTAP_ERR_UNSUPPORTED_FILE_TYPE -7
|
|
/** Filetap can't save files in the specified format */
|
|
|
|
#define FTAP_ERR_UNSUPPORTED_ENCAP -8
|
|
/** Filetap can't read or save files in the specified format with the
|
|
specified encapsulation */
|
|
|
|
#define FTAP_ERR_ENCAP_PER_RECORD_UNSUPPORTED -9
|
|
/** The specified format doesn't support per-packet encapsulations */
|
|
|
|
#define FTAP_ERR_CANT_CLOSE -10
|
|
/** The file couldn't be closed, reason unknown */
|
|
|
|
#define FTAP_ERR_CANT_READ -11
|
|
/** An attempt to read failed, reason unknown */
|
|
|
|
#define FTAP_ERR_SHORT_READ -12
|
|
/** An attempt to read read less data than it should have */
|
|
|
|
#define FTAP_ERR_BAD_FILE -13
|
|
/** The file appears to be damaged or corrupted or otherwise bogus */
|
|
|
|
#define FTAP_ERR_SHORT_WRITE -14
|
|
/** An attempt to write wrote less data than it should have */
|
|
|
|
#define FTAP_ERR_UNC_TRUNCATED -15
|
|
/** Compressed data was oddly truncated */
|
|
|
|
#define FTAP_ERR_UNC_OVERFLOW -16
|
|
/** Uncompressing data would overflow buffer */
|
|
|
|
#define FTAP_ERR_UNC_BAD_OFFSET -17
|
|
/** LZ77 compressed data has bad offset to string */
|
|
|
|
#define FTAP_ERR_RANDOM_OPEN_STDIN -18
|
|
/** We're trying to open the standard input for random access */
|
|
|
|
#define FTAP_ERR_COMPRESSION_NOT_SUPPORTED -19
|
|
/* The filetype doesn't support output compression */
|
|
|
|
#define FTAP_ERR_CANT_SEEK -20
|
|
/** An attempt to seek failed, reason unknown */
|
|
|
|
#define FTAP_ERR_CANT_SEEK_COMPRESSED -21
|
|
/** An attempt to seek on a compressed stream */
|
|
|
|
#define FTAP_ERR_DECOMPRESS -22
|
|
/** Error decompressing */
|
|
|
|
#define FTAP_ERR_INTERNAL -23
|
|
/** "Shouldn't happen" internal errors */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* __FTAP_H__ */
|
|
|
|
/*
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
*
|
|
* Local variables:
|
|
* c-basic-offset: 4
|
|
* tab-width: 8
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*
|
|
* vi: set shiftwidth=4 tabstop=8 expandtab:
|
|
* :indentSize=4:tabSize=8:noTabs=true:
|
|
*/
|