From adcad1c794c6f51a4da88a2435565b65613ee2d1 Mon Sep 17 00:00:00 2001 From: gram Date: Sun, 3 Jan 1999 04:30:13 +0000 Subject: Added files to handle AIX iptrace 2.0 files in wiretap. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@148 f5534014-38df-0310-8fa8-9805f1628bb7 --- wiretap/iptrace.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ wiretap/iptrace.h | 40 +++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 wiretap/iptrace.c create mode 100644 wiretap/iptrace.h (limited to 'wiretap') diff --git a/wiretap/iptrace.c b/wiretap/iptrace.c new file mode 100644 index 0000000000..315fa51d53 --- /dev/null +++ b/wiretap/iptrace.c @@ -0,0 +1,114 @@ +/* iptrace.c + * + * $Id: iptrace.c,v 1.1 1999/01/03 04:30:13 gram Exp $ + * + * Wiretap Library + * Copyright (c) 1998 by Gilbert Ramirez + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ +#include +#include +#include +#include "wtap.h" +#include "iptrace.h" + +int iptrace_open(wtap *wth) +{ + int bytes_read; + char name[12]; + + fseek(wth->fh, 0, SEEK_SET); + bytes_read = fread(name, 1, 11, wth->fh); + + if (bytes_read != 11) { + return WTAP_FILE_UNKNOWN; + } + name[11] = 0; + if (strcmp(name, "iptrace 2.0") != 0) { + return WTAP_FILE_UNKNOWN; + } + wth->encapsulation = WTAP_ENCAP_PER_PACKET; + wth->subtype_read = iptrace_read; + + return WTAP_FILE_IPTRACE; +} + +/* Read the next packet */ +int iptrace_read(wtap *wth) +{ + int bytes_read; + int data_offset; + guint16 packet_size; + guint8 header[40]; + char if_name1, if_name2; + + /* Read the descriptor data */ + bytes_read = fread(header, 1, 40, wth->fh); + if (bytes_read != 40) { + /* because of the way we have to kill the iptrace command, + * the existence of a partial header or packet is probable, + * and we should not complain about it. Simply return + * quietly and pretend that the trace file ended on + * a packet boundary + */ + return 0; + } + + packet_size = pntohs(&header[2]) - 32; + + /* Read the packet data */ + buffer_assure_space(&wth->frame_buffer, packet_size); + data_offset = ftell(wth->fh); + bytes_read = fread(buffer_start_ptr(&wth->frame_buffer), 1, + packet_size, wth->fh); + + if (bytes_read != packet_size) { + /* don't complain about a partial packet. Just + * pretend that we reached the end of the file + * normally. If, however, there was a read error + * because of some other reason, complain + */ + if (ferror(wth->fh)) { + g_print("iptrace_read: fread for data: read error\n"); + } + return -1; + } + + wth->phdr.len = packet_size; + wth->phdr.caplen = packet_size; + wth->phdr.ts.tv_sec = pntohl(&header[32]); + /* AIX saves time in nsec, not usec. It's easier to make iptrace + * files more Unix-compliant here than try to get the calling + * program to know when to use nsec or usec */ + wth->phdr.ts.tv_usec = pntohl(&header[36]) / 1000; + + if_name1 = header[12]; + if_name2 = header[13]; + if (if_name1 == 't' && if_name2 == 'r') { + wth->phdr.pkt_encap = WTAP_ENCAP_TR; + } + else if (if_name1 == 'e' && if_name2 == 'n') { + wth->phdr.pkt_encap = WTAP_ENCAP_ETHERNET; + } + else if (if_name1 == 'f' && if_name2 == 'd') { + wth->phdr.pkt_encap = WTAP_ENCAP_FDDI; + } + else { + wth->phdr.pkt_encap = WTAP_ENCAP_NONE; + } + return data_offset; +} diff --git a/wiretap/iptrace.h b/wiretap/iptrace.h new file mode 100644 index 0000000000..2c883dc44b --- /dev/null +++ b/wiretap/iptrace.h @@ -0,0 +1,40 @@ +/* iptrace.h + * + * $Id: iptrace.h,v 1.1 1999/01/03 04:30:13 gram Exp $ + * + * Wiretap Library + * Copyright (c) 1998 by Gilbert Ramirez + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +/* the iptrace 2.0 packet header, as guessed */ +#if 0 +struct iptrace_pkt_hdr { + guint16 unknown; + guint16 pkt_length; /* packet length + 32 */ + guint32 tv_sec; + char if_name[4]; /* not null-terminated */ + guint16 if_num; + char if_desc[12]; /* interface description. why? */ + guint32 tv_sec; + guint32 tv_usec; +}; +#endif + + +int iptrace_open(wtap *wth); +int iptrace_read(wtap *wth); -- cgit v1.2.3