1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1993, 1994, 1995, 1996, 1997 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The Regents of the University of California. All rights reserved. 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * distributions including binary code include the above copyright notice and 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * features or use of this software display the following acknowledgement: 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ``This product includes software developed by the University of California, 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the University nor the names of its contributors may be used to endorse 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * or promote products derived from this software without specific prior 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * written permission. 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * savefile.c - supports offline use of tcpdump 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Extraction/creation by Jeffrey Mogul, DECWRL 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Modified by Steve McCanne, LBL. 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Used to save the received packet headers, after filtering, to 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * a file, and then read them later. 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The first record in the file contains saved values for the machine 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * dependent values so we can print the dump file on any architecture. 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap-stdinc.h> 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /* WIN32 */ 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if HAVE_INTTYPES_H 39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <inttypes.h> 40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif HAVE_STDINT_H 41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdint.h> 42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_SYS_BITYPES_H 44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/bitypes.h> 45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h> 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* WIN32 */ 48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h> 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <memory.h> 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h> 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h> 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "pcap/usb.h" 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h" 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "sf-pcap.h" 63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "sf-pcap-ng.h" 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Setting O_BINARY on DOS/Windows is a bit tricky 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined(WIN32) 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #define SET_BINMODE(f) _setmode(_fileno(f), _O_BINARY) 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#elif defined(MSDOS) 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #if defined(__HIGHC__) 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #define SET_BINMODE(f) setmode(f, O_BINARY) 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #else 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #define SET_BINMODE(f) setmode(fileno(f), O_BINARY) 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project #endif 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_getnonblock(pcap_t *p, char *errbuf) 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * This is a savefile, not a live capture file, so never say 83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * it's in non-blocking mode. 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (0); 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_setnonblock(pcap_t *p, int nonblock, char *errbuf) 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * This is a savefile, not a live capture file, so reject 93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * requests to put it in non-blocking mode. (If it's a 94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * pipe, it could be put in non-blocking mode, but that 95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * would significantly complicate the code to read packets, 96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * as it would have to handle reading partial packets and 97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * keeping the state of the read.) 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "Savefiles cannot be put into non-blocking mode"); 101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_stats(pcap_t *p, struct pcap_stat *ps) 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "Statistics aren't available from savefiles"); 109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_setbuff(pcap_t *p, int dim) 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "The kernel buffer size cannot be set while reading from a file"); 118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_setmode(pcap_t *p, int mode) 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "impossible to set mode while reading from a file"); 126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_setmintocopy(pcap_t *p, int size) 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, 133511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "The mintocopy parameter cannot be set while reading from a file"); 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectsf_inject(pcap_t *p, const void *buf _U_, size_t size _U_) 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strlcpy(p->errbuf, "Sending packets isn't supported on savefiles", 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PCAP_ERRBUF_SIZE); 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Set direction flag: Which packets do we accept on a forwarding 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * single device? IN, OUT or both? 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectsf_setdirection(pcap_t *p, pcap_direction_t d) 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, sizeof(p->errbuf), 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "Setting direction is not supported on savefiles"); 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallvoid 159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsf_cleanup(pcap_t *p) 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p->rfile != stdin) 162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (void)fclose(p->rfile); 163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p->buffer != NULL) 164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall free(p->buffer); 165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_freecode(&p->fcode); 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_t * 169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_open_offline_with_tstamp_precision(const char *fname, u_int precision, 170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char *errbuf) 171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project FILE *fp; 173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_t *p; 174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (fname[0] == '-' && fname[1] == '\0') 176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fp = stdin; 178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined(WIN32) || defined(MSDOS) 179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We're reading from the standard input, so put it in binary 181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * mode, as savefiles are binary files. 182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project SET_BINMODE(fp); 184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else { 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if !defined(WIN32) && !defined(MSDOS) 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fp = fopen(fname, "r"); 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fp = fopen(fname, "rb"); 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (fp == NULL) { 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", fname, 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (NULL); 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 198511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p = pcap_fopen_offline_with_tstamp_precision(fp, precision, errbuf); 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p == NULL) { 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (fp != stdin) 201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fclose(fp); 202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (p); 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_t * 207511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_open_offline(const char *fname, char *errbuf) 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 209511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (pcap_open_offline_with_tstamp_precision(fname, 210511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall PCAP_TSTAMP_PRECISION_MICRO, errbuf)); 211511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 213511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 214511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t* pcap_hopen_offline_with_tstamp_precision(intptr_t osfd, u_int precision, 215511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char *errbuf) 216511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 217511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall int fd; 218511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall FILE *file; 219511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 220511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fd = _open_osfhandle(osfd, _O_RDONLY); 221d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes if ( fd < 0 ) 222511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 223511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(errbuf, PCAP_ERRBUF_SIZE, pcap_strerror(errno)); 224511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return NULL; 225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 227511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall file = _fdopen(fd, "rb"); 228d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes if ( file == NULL ) 229511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 230511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(errbuf, PCAP_ERRBUF_SIZE, pcap_strerror(errno)); 231511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return NULL; 232511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 233511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 234511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return pcap_fopen_offline_with_tstamp_precision(file, precision, 235511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall errbuf); 236511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 237511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 238511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t* pcap_hopen_offline(intptr_t osfd, char *errbuf) 239511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 240511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return pcap_hopen_offline_with_tstamp_precision(osfd, 241511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall PCAP_TSTAMP_PRECISION_MICRO, errbuf); 242511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 243511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 245511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic pcap_t *(*check_headers[])(bpf_u_int32, FILE *, u_int, char *, int *) = { 246511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_check_header, 247511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_ng_check_header 248511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}; 249511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 250511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define N_FILE_TYPES (sizeof check_headers / sizeof check_headers[0]) 251511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 252511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 253511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic 254511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 255511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t * 256511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_fopen_offline_with_tstamp_precision(FILE *fp, u_int precision, 257511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char *errbuf) 258511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 259511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall register pcap_t *p; 260511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall bpf_u_int32 magic; 261511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall size_t amt_read; 262511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall u_int i; 263511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall int err; 264511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 265511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 266511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Read the first 4 bytes of the file; the network analyzer dump 267511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * file formats we support (pcap and pcap-ng), and several other 268511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * formats we might support in the future (such as snoop, DOS and 269511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Windows Sniffer, and Microsoft Network Monitor) all have magic 270511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * numbers that are unique in their first 4 bytes. 271511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 272511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall amt_read = fread((char *)&magic, 1, sizeof(magic), fp); 273511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (amt_read != sizeof(magic)) { 274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ferror(fp)) { 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(errbuf, PCAP_ERRBUF_SIZE, 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "error reading dump file: %s", 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(errbuf, PCAP_ERRBUF_SIZE, 280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "truncated dump file; tried to read %lu file header bytes, only got %lu", 281511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (unsigned long)sizeof(magic), 282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (unsigned long)amt_read); 283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 284511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (NULL); 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 287511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 288511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Try all file types. 289511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 290511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall for (i = 0; i < N_FILE_TYPES; i++) { 291511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p = (*check_headers[i])(magic, fp, precision, errbuf, &err); 292511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p != NULL) { 293511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* Yup, that's it. */ 294511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall goto found; 295511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 296511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (err) { 297511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 298511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Error trying to read the header. 299511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 300511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (NULL); 301511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 305511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Well, who knows what this mess is.... 306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 307511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(errbuf, PCAP_ERRBUF_SIZE, "unknown file format"); 308511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (NULL); 309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 310511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallfound: 311511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->rfile = fp; 312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 313511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* Padding only needed for live capture fcode */ 314511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->fddipad = 0; 315478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 316478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if !defined(WIN32) && !defined(MSDOS) 317478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 318478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * You can do "select()" and "poll()" on plain files on most 319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * platforms, and should be able to do so on pipes. 320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * You can't do "select()" on anything other than sockets in 322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Windows, so, on Win32 systems, we don't have "selectable_fd". 323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->selectable_fd = fileno(fp); 325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->read_op = pcap_offline_read; 328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->inject_op = sf_inject; 329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setfilter_op = install_bpf_program; 330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setdirection_op = sf_setdirection; 331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->set_datalink_op = NULL; /* we don't support munging link-layer headers */ 332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->getnonblock_op = sf_getnonblock; 333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setnonblock_op = sf_setnonblock; 334478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->stats_op = sf_stats; 335511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 336511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setbuff_op = sf_setbuff; 337511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setmode_op = sf_setmode; 338511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setmintocopy_op = sf_setmintocopy; 339511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 342511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * For offline captures, the standard one-shot callback can 343511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * be used for pcap_next()/pcap_next_ex(). 344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 345511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->oneshot_callback = pcap_oneshot; 346478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 347d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes /* 348d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes * Savefiles never require special BPF code generation. 349d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes */ 350d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes p->bpf_codegen_flags = 0; 351d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes 352511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->activated = 1; 353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 354511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (p); 355511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 357511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 358511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic 359511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 360511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t * 361511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_fopen_offline(FILE *fp, char *errbuf) 362511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 363511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (pcap_fopen_offline_with_tstamp_precision(fp, 364511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall PCAP_TSTAMP_PRECISION_MICRO, errbuf)); 365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 368511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Read packets from a capture file, and call the callback for each 369511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * packet. 370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If cnt > 0, return after 'cnt' packets, otherwise continue until eof. 371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint 373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_offline_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct bpf_insn *fcode; 376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int status = 0; 377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int n = 0; 378511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall u_char *data; 379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (status == 0) { 381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct pcap_pkthdr h; 382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Has "pcap_breakloop()" been called? 385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If so, return immediately - if we haven't read any 386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * packets, clear the flag and return -2 to indicate 387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that we were told to break out of the loop, otherwise 388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * leave the flag set, so that the *next* call will break 389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * out of the loop without having read any packets, and 390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * return the number of packets we've processed so far. 391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->break_loop) { 393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (n == 0) { 394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->break_loop = 0; 395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-2); 396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else 397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 400511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall status = p->next_packet_op(p, &h, &data); 401478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (status) { 402478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (status == 1) 403478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (0); 404478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (status); 405478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 406478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 407478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if ((fcode = p->fcode.bf_insns) == NULL || 408511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall bpf_filter(fcode, data, h.len, h.caplen)) { 409511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (*callback)(user, &h, data); 410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (++n >= cnt && cnt > 0) 411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /*XXX this breaks semantics tcpslice expects */ 415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 417