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