pcap.c revision 356341
1/*
2 * Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by the Computer Systems
16 *	Engineering Group at Lawrence Berkeley Laboratory.
17 * 4. Neither the name of the University nor of the Laboratory may be used
18 *    to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifdef HAVE_CONFIG_H
35#include <config.h>
36#endif
37
38#include <pcap-types.h>
39#ifndef _WIN32
40#include <sys/param.h>
41#ifndef MSDOS
42#include <sys/file.h>
43#endif
44#include <sys/ioctl.h>
45#include <sys/socket.h>
46#ifdef HAVE_SYS_SOCKIO_H
47#include <sys/sockio.h>
48#endif
49
50struct mbuf;		/* Squelch compiler warnings on some platforms for */
51struct rtentry;		/* declarations in <net/if.h> */
52#include <net/if.h>
53#include <netinet/in.h>
54#endif /* _WIN32 */
55
56#include <ctype.h>
57#include <stdio.h>
58#include <stdlib.h>
59#include <string.h>
60#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__MINGW32__)
61#include <unistd.h>
62#endif
63#include <fcntl.h>
64#include <errno.h>
65#ifdef HAVE_LIMITS_H
66#include <limits.h>
67#else
68#define INT_MAX		2147483647
69#endif
70
71#ifdef HAVE_OS_PROTO_H
72#include "os-proto.h"
73#endif
74
75#ifdef MSDOS
76#include "pcap-dos.h"
77#endif
78
79#include "pcap-int.h"
80
81#include "optimize.h"
82
83#ifdef HAVE_DAG_API
84#include "pcap-dag.h"
85#endif /* HAVE_DAG_API */
86
87#ifdef HAVE_SEPTEL_API
88#include "pcap-septel.h"
89#endif /* HAVE_SEPTEL_API */
90
91#ifdef HAVE_SNF_API
92#include "pcap-snf.h"
93#endif /* HAVE_SNF_API */
94
95#ifdef HAVE_TC_API
96#include "pcap-tc.h"
97#endif /* HAVE_TC_API */
98
99#ifdef PCAP_SUPPORT_USB
100#include "pcap-usb-linux.h"
101#endif
102
103#ifdef PCAP_SUPPORT_BT
104#include "pcap-bt-linux.h"
105#endif
106
107#ifdef PCAP_SUPPORT_BT_MONITOR
108#include "pcap-bt-monitor-linux.h"
109#endif
110
111#ifdef PCAP_SUPPORT_NETFILTER
112#include "pcap-netfilter-linux.h"
113#endif
114
115#ifdef PCAP_SUPPORT_NETMAP
116#include "pcap-netmap.h"
117#endif
118
119#ifdef PCAP_SUPPORT_DBUS
120#include "pcap-dbus.h"
121#endif
122
123#ifdef PCAP_SUPPORT_RDMASNIFF
124#include "pcap-rdmasniff.h"
125#endif
126
127#ifdef _WIN32
128/*
129 * DllMain(), required when built as a Windows DLL.
130 */
131BOOL WINAPI DllMain(
132  HANDLE hinstDLL,
133  DWORD dwReason,
134  LPVOID lpvReserved
135)
136{
137	return (TRUE);
138}
139
140/*
141 * Start WinSock.
142 * Exported in case some applications using WinPcap/Npcap called it,
143 * even though it wasn't exported.
144 */
145int
146wsockinit(void)
147{
148	WORD wVersionRequested;
149	WSADATA wsaData;
150	static int err = -1;
151	static int done = 0;
152
153	if (done)
154		return (err);
155
156	wVersionRequested = MAKEWORD( 1, 1);
157	err = WSAStartup( wVersionRequested, &wsaData );
158	atexit ((void(*)(void))WSACleanup);
159	done = 1;
160
161	if ( err != 0 )
162		err = -1;
163	return (err);
164}
165
166/*
167 * This is the exported function; new programs should call this.
168 */
169int
170pcap_wsockinit(void)
171{
172       return (wsockinit());
173}
174#endif /* _WIN32 */
175
176/*
177 * String containing the library version.
178 * Not explicitly exported via a header file - the right API to use
179 * is pcap_lib_version() - but some programs included it, so we
180 * provide it.
181 *
182 * We declare it here, right before defining it, to squelch any
183 * warnings we might get from compilers about the lack of a
184 * declaration.
185 */
186PCAP_API char pcap_version[];
187PCAP_API_DEF char pcap_version[] = PACKAGE_VERSION;
188
189static void
190pcap_set_not_initialized_message(pcap_t *pcap)
191{
192	if (pcap->activated) {
193		/* A module probably forgot to set the function pointer */
194		(void)pcap_snprintf(pcap->errbuf, sizeof(pcap->errbuf),
195		    "This operation isn't properly handled by that device");
196		return;
197	}
198	/* in case the caller doesn't check for PCAP_ERROR_NOT_ACTIVATED */
199	(void)pcap_snprintf(pcap->errbuf, sizeof(pcap->errbuf),
200	    "This handle hasn't been activated yet");
201}
202
203static int
204pcap_read_not_initialized(pcap_t *pcap, int cnt _U_, pcap_handler callback _U_,
205    u_char *user _U_)
206{
207	pcap_set_not_initialized_message(pcap);
208	/* this means 'not initialized' */
209	return (PCAP_ERROR_NOT_ACTIVATED);
210}
211
212static int
213pcap_inject_not_initialized(pcap_t *pcap, const void * buf _U_, size_t size _U_)
214{
215	pcap_set_not_initialized_message(pcap);
216	/* this means 'not initialized' */
217	return (PCAP_ERROR_NOT_ACTIVATED);
218}
219
220static int
221pcap_setfilter_not_initialized(pcap_t *pcap, struct bpf_program *fp _U_)
222{
223	pcap_set_not_initialized_message(pcap);
224	/* this means 'not initialized' */
225	return (PCAP_ERROR_NOT_ACTIVATED);
226}
227
228static int
229pcap_setdirection_not_initialized(pcap_t *pcap, pcap_direction_t d _U_)
230{
231	pcap_set_not_initialized_message(pcap);
232	/* this means 'not initialized' */
233	return (PCAP_ERROR_NOT_ACTIVATED);
234}
235
236static int
237pcap_set_datalink_not_initialized(pcap_t *pcap, int dlt _U_)
238{
239	pcap_set_not_initialized_message(pcap);
240	/* this means 'not initialized' */
241	return (PCAP_ERROR_NOT_ACTIVATED);
242}
243
244static int
245pcap_getnonblock_not_initialized(pcap_t *pcap)
246{
247	pcap_set_not_initialized_message(pcap);
248	/* this means 'not initialized' */
249	return (PCAP_ERROR_NOT_ACTIVATED);
250}
251
252static int
253pcap_stats_not_initialized(pcap_t *pcap, struct pcap_stat *ps _U_)
254{
255	pcap_set_not_initialized_message(pcap);
256	/* this means 'not initialized' */
257	return (PCAP_ERROR_NOT_ACTIVATED);
258}
259
260#ifdef _WIN32
261struct pcap_stat *
262pcap_stats_ex_not_initialized(pcap_t *pcap, int *pcap_stat_size _U_)
263{
264	pcap_set_not_initialized_message(pcap);
265	return (NULL);
266}
267
268static int
269pcap_setbuff_not_initialized(pcap_t *pcap, int dim _U_)
270{
271	pcap_set_not_initialized_message(pcap);
272	/* this means 'not initialized' */
273	return (PCAP_ERROR_NOT_ACTIVATED);
274}
275
276static int
277pcap_setmode_not_initialized(pcap_t *pcap, int mode _U_)
278{
279	pcap_set_not_initialized_message(pcap);
280	/* this means 'not initialized' */
281	return (PCAP_ERROR_NOT_ACTIVATED);
282}
283
284static int
285pcap_setmintocopy_not_initialized(pcap_t *pcap, int size _U_)
286{
287	pcap_set_not_initialized_message(pcap);
288	/* this means 'not initialized' */
289	return (PCAP_ERROR_NOT_ACTIVATED);
290}
291
292static HANDLE
293pcap_getevent_not_initialized(pcap_t *pcap)
294{
295	pcap_set_not_initialized_message(pcap);
296	return (INVALID_HANDLE_VALUE);
297}
298
299static int
300pcap_oid_get_request_not_initialized(pcap_t *pcap, bpf_u_int32 oid _U_,
301    void *data _U_, size_t *lenp _U_)
302{
303	pcap_set_not_initialized_message(pcap);
304	return (PCAP_ERROR_NOT_ACTIVATED);
305}
306
307static int
308pcap_oid_set_request_not_initialized(pcap_t *pcap, bpf_u_int32 oid _U_,
309    const void *data _U_, size_t *lenp _U_)
310{
311	pcap_set_not_initialized_message(pcap);
312	return (PCAP_ERROR_NOT_ACTIVATED);
313}
314
315static u_int
316pcap_sendqueue_transmit_not_initialized(pcap_t *pcap, pcap_send_queue* queue, int sync)
317{
318	pcap_set_not_initialized_message(pcap);
319	return (0);
320}
321
322static int
323pcap_setuserbuffer_not_initialized(pcap_t *pcap, int size _U_)
324{
325	pcap_set_not_initialized_message(pcap);
326	return (PCAP_ERROR_NOT_ACTIVATED);
327}
328
329static int
330pcap_live_dump_not_initialized(pcap_t *pcap, char *filename _U_, int maxsize _U_,
331    int maxpacks _U_)
332{
333	pcap_set_not_initialized_message(pcap);
334	return (PCAP_ERROR_NOT_ACTIVATED);
335}
336
337static int
338pcap_live_dump_ended_not_initialized(pcap_t *pcap, int sync _U_)
339{
340	pcap_set_not_initialized_message(pcap);
341	return (PCAP_ERROR_NOT_ACTIVATED);
342}
343
344static PAirpcapHandle
345pcap_get_airpcap_handle_not_initialized(pcap_t *pcap)
346{
347	pcap_set_not_initialized_message(pcap);
348	return (NULL);
349}
350#endif
351
352/*
353 * Returns 1 if rfmon mode can be set on the pcap_t, 0 if it can't,
354 * a PCAP_ERROR value on an error.
355 */
356int
357pcap_can_set_rfmon(pcap_t *p)
358{
359	return (p->can_set_rfmon_op(p));
360}
361
362/*
363 * For systems where rfmon mode is never supported.
364 */
365static int
366pcap_cant_set_rfmon(pcap_t *p _U_)
367{
368	return (0);
369}
370
371/*
372 * Sets *tstamp_typesp to point to an array 1 or more supported time stamp
373 * types; the return value is the number of supported time stamp types.
374 * The list should be freed by a call to pcap_free_tstamp_types() when
375 * you're done with it.
376 *
377 * A return value of 0 means "you don't get a choice of time stamp type",
378 * in which case *tstamp_typesp is set to null.
379 *
380 * PCAP_ERROR is returned on error.
381 */
382int
383pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp)
384{
385	if (p->tstamp_type_count == 0) {
386		/*
387		 * We don't support multiple time stamp types.
388		 * That means the only type we support is PCAP_TSTAMP_HOST;
389		 * set up a list containing only that type.
390		 */
391		*tstamp_typesp = (int*)malloc(sizeof(**tstamp_typesp));
392		if (*tstamp_typesp == NULL) {
393			pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
394			    errno, "malloc");
395			return (PCAP_ERROR);
396		}
397		**tstamp_typesp = PCAP_TSTAMP_HOST;
398		return (1);
399	} else {
400		*tstamp_typesp = (int*)calloc(sizeof(**tstamp_typesp),
401		    p->tstamp_type_count);
402		if (*tstamp_typesp == NULL) {
403			pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
404			    errno, "malloc");
405			return (PCAP_ERROR);
406		}
407		(void)memcpy(*tstamp_typesp, p->tstamp_type_list,
408		    sizeof(**tstamp_typesp) * p->tstamp_type_count);
409		return (p->tstamp_type_count);
410	}
411}
412
413/*
414 * In Windows, you might have a library built with one version of the
415 * C runtime library and an application built with another version of
416 * the C runtime library, which means that the library might use one
417 * version of malloc() and free() and the application might use another
418 * version of malloc() and free().  If so, that means something
419 * allocated by the library cannot be freed by the application, so we
420 * need to have a pcap_free_tstamp_types() routine to free up the list
421 * allocated by pcap_list_tstamp_types(), even though it's just a wrapper
422 * around free().
423 */
424void
425pcap_free_tstamp_types(int *tstamp_type_list)
426{
427	free(tstamp_type_list);
428}
429
430/*
431 * Default one-shot callback; overridden for capture types where the
432 * packet data cannot be guaranteed to be available after the callback
433 * returns, so that a copy must be made.
434 */
435void
436pcap_oneshot(u_char *user, const struct pcap_pkthdr *h, const u_char *pkt)
437{
438	struct oneshot_userdata *sp = (struct oneshot_userdata *)user;
439
440	*sp->hdr = *h;
441	*sp->pkt = pkt;
442}
443
444const u_char *
445pcap_next(pcap_t *p, struct pcap_pkthdr *h)
446{
447	struct oneshot_userdata s;
448	const u_char *pkt;
449
450	s.hdr = h;
451	s.pkt = &pkt;
452	s.pd = p;
453	if (pcap_dispatch(p, 1, p->oneshot_callback, (u_char *)&s) <= 0)
454		return (0);
455	return (pkt);
456}
457
458int
459pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
460    const u_char **pkt_data)
461{
462	struct oneshot_userdata s;
463
464	s.hdr = &p->pcap_header;
465	s.pkt = pkt_data;
466	s.pd = p;
467
468	/* Saves a pointer to the packet headers */
469	*pkt_header= &p->pcap_header;
470
471	if (p->rfile != NULL) {
472		int status;
473
474		/* We are on an offline capture */
475		status = pcap_offline_read(p, 1, p->oneshot_callback,
476		    (u_char *)&s);
477
478		/*
479		 * Return codes for pcap_offline_read() are:
480		 *   -  0: EOF
481		 *   - -1: error
482		 *   - >1: OK
483		 * The first one ('0') conflicts with the return code of
484		 * 0 from pcap_read() meaning "no packets arrived before
485		 * the timeout expired", so we map it to -2 so you can
486		 * distinguish between an EOF from a savefile and a
487		 * "no packets arrived before the timeout expired, try
488		 * again" from a live capture.
489		 */
490		if (status == 0)
491			return (-2);
492		else
493			return (status);
494	}
495
496	/*
497	 * Return codes for pcap_read() are:
498	 *   -  0: timeout
499	 *   - -1: error
500	 *   - -2: loop was broken out of with pcap_breakloop()
501	 *   - >1: OK
502	 * The first one ('0') conflicts with the return code of 0 from
503	 * pcap_offline_read() meaning "end of file".
504	*/
505	return (p->read_op(p, 1, p->oneshot_callback, (u_char *)&s));
506}
507
508/*
509 * Implementation of a pcap_if_list_t.
510 */
511struct pcap_if_list {
512	pcap_if_t *beginning;
513};
514
515static struct capture_source_type {
516	int (*findalldevs_op)(pcap_if_list_t *, char *);
517	pcap_t *(*create_op)(const char *, char *, int *);
518} capture_source_types[] = {
519#ifdef HAVE_DAG_API
520	{ dag_findalldevs, dag_create },
521#endif
522#ifdef HAVE_SEPTEL_API
523	{ septel_findalldevs, septel_create },
524#endif
525#ifdef HAVE_SNF_API
526	{ snf_findalldevs, snf_create },
527#endif
528#ifdef HAVE_TC_API
529	{ TcFindAllDevs, TcCreate },
530#endif
531#ifdef PCAP_SUPPORT_BT
532	{ bt_findalldevs, bt_create },
533#endif
534#ifdef PCAP_SUPPORT_BT_MONITOR
535	{ bt_monitor_findalldevs, bt_monitor_create },
536#endif
537#ifdef PCAP_SUPPORT_USB
538	{ usb_findalldevs, usb_create },
539#endif
540#ifdef PCAP_SUPPORT_NETFILTER
541	{ netfilter_findalldevs, netfilter_create },
542#endif
543#ifdef PCAP_SUPPORT_NETMAP
544	{ pcap_netmap_findalldevs, pcap_netmap_create },
545#endif
546#ifdef PCAP_SUPPORT_DBUS
547	{ dbus_findalldevs, dbus_create },
548#endif
549#ifdef PCAP_SUPPORT_RDMASNIFF
550	{ rdmasniff_findalldevs, rdmasniff_create },
551#endif
552	{ NULL, NULL }
553};
554
555/*
556 * Get a list of all capture sources that are up and that we can open.
557 * Returns -1 on error, 0 otherwise.
558 * The list, as returned through "alldevsp", may be null if no interfaces
559 * were up and could be opened.
560 */
561int
562pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
563{
564	size_t i;
565	pcap_if_list_t devlist;
566
567	/*
568	 * Find all the local network interfaces on which we
569	 * can capture.
570	 */
571	devlist.beginning = NULL;
572	if (pcap_platform_finddevs(&devlist, errbuf) == -1) {
573		/*
574		 * Failed - free all of the entries we were given
575		 * before we failed.
576		 */
577		if (devlist.beginning != NULL)
578			pcap_freealldevs(devlist.beginning);
579		*alldevsp = NULL;
580		return (-1);
581	}
582
583	/*
584	 * Ask each of the non-local-network-interface capture
585	 * source types what interfaces they have.
586	 */
587	for (i = 0; capture_source_types[i].findalldevs_op != NULL; i++) {
588		if (capture_source_types[i].findalldevs_op(&devlist, errbuf) == -1) {
589			/*
590			 * We had an error; free the list we've been
591			 * constructing.
592			 */
593			if (devlist.beginning != NULL)
594				pcap_freealldevs(devlist.beginning);
595			*alldevsp = NULL;
596			return (-1);
597		}
598	}
599
600	/*
601	 * Return the first entry of the list of all devices.
602	 */
603	*alldevsp = devlist.beginning;
604	return (0);
605}
606
607static struct sockaddr *
608dup_sockaddr(struct sockaddr *sa, size_t sa_length)
609{
610	struct sockaddr *newsa;
611
612	if ((newsa = malloc(sa_length)) == NULL)
613		return (NULL);
614	return (memcpy(newsa, sa, sa_length));
615}
616
617/*
618 * Construct a "figure of merit" for an interface, for use when sorting
619 * the list of interfaces, in which interfaces that are up are superior
620 * to interfaces that aren't up, interfaces that are up and running are
621 * superior to interfaces that are up but not running, and non-loopback
622 * interfaces that are up and running are superior to loopback interfaces,
623 * and interfaces with the same flags have a figure of merit that's higher
624 * the lower the instance number.
625 *
626 * The goal is to try to put the interfaces most likely to be useful for
627 * capture at the beginning of the list.
628 *
629 * The figure of merit, which is lower the "better" the interface is,
630 * has the uppermost bit set if the interface isn't running, the bit
631 * below that set if the interface isn't up, the bit below that set
632 * if the interface is a loopback interface, and the interface index
633 * in the 29 bits below that.  (Yes, we assume u_int is 32 bits.)
634 */
635static u_int
636get_figure_of_merit(pcap_if_t *dev)
637{
638	const char *cp;
639	u_int n;
640
641	if (strcmp(dev->name, "any") == 0) {
642		/*
643		 * Give the "any" device an artificially high instance
644		 * number, so it shows up after all other non-loopback
645		 * interfaces.
646		 */
647		n = 0x1FFFFFFF;	/* 29 all-1 bits */
648	} else {
649		/*
650		 * A number at the end of the device name string is
651		 * assumed to be an instance number.  Add 1 to the
652		 * instance number, and use 0 for "no instance
653		 * number", so we don't put "no instance number"
654		 * devices and "instance 0" devices together.
655		 */
656		cp = dev->name + strlen(dev->name) - 1;
657		while (cp-1 >= dev->name && *(cp-1) >= '0' && *(cp-1) <= '9')
658			cp--;
659		if (*cp >= '0' && *cp <= '9')
660			n = atoi(cp) + 1;
661		else
662			n = 0;
663	}
664	if (!(dev->flags & PCAP_IF_RUNNING))
665		n |= 0x80000000;
666	if (!(dev->flags & PCAP_IF_UP))
667		n |= 0x40000000;
668
669	/*
670	 * Give non-wireless interfaces that aren't disconnected a better
671	 * figure of merit than interfaces that are disconnected, as
672	 * "disconnected" should indicate that the interface isn't
673	 * plugged into a network and thus won't give you any traffic.
674	 *
675	 * For wireless interfaces, it means "associated with a network",
676	 * which we presume not to necessarily prevent capture, as you
677	 * might run the adapter in some flavor of monitor mode.
678	 */
679	if (!(dev->flags & PCAP_IF_WIRELESS) &&
680	    (dev->flags & PCAP_IF_CONNECTION_STATUS) == PCAP_IF_CONNECTION_STATUS_DISCONNECTED)
681		n |= 0x20000000;
682
683	/*
684	 * Sort loopback devices after non-loopback devices, *except* for
685	 * disconnected devices.
686	 */
687	if (dev->flags & PCAP_IF_LOOPBACK)
688		n |= 0x10000000;
689
690	return (n);
691}
692
693#ifndef _WIN32
694/*
695 * Try to get a description for a given device.
696 * Returns a mallocated description if it could and NULL if it couldn't.
697 *
698 * XXX - on FreeBSDs that support it, should it get the sysctl named
699 * "dev.{adapter family name}.{adapter unit}.%desc" to get a description
700 * of the adapter?  Note that "dev.an.0.%desc" is "Aironet PC4500/PC4800"
701 * with my Cisco 350 card, so the name isn't entirely descriptive.  The
702 * "dev.an.0.%pnpinfo" has a better description, although one might argue
703 * that the problem is really a driver bug - if it can find out that it's
704 * a Cisco 340 or 350, rather than an old Aironet card, it should use
705 * that in the description.
706 *
707 * Do NetBSD, DragonflyBSD, or OpenBSD support this as well?  FreeBSD
708 * and OpenBSD let you get a description, but it's not generated by the OS,
709 * it's set with another ioctl that ifconfig supports; we use that to get
710 * a description in FreeBSD and OpenBSD, but if there is no such
711 * description available, it still might be nice to get some description
712 * string based on the device type or something such as that.
713 *
714 * In macOS, the System Configuration framework can apparently return
715 * names in 10.4 and later.
716 *
717 * It also appears that freedesktop.org's HAL offers an "info.product"
718 * string, but the HAL specification says it "should not be used in any
719 * UI" and "subsystem/capability specific properties" should be used
720 * instead and, in any case, I think HAL is being deprecated in
721 * favor of other stuff such as DeviceKit.  DeviceKit doesn't appear
722 * to have any obvious product information for devices, but maybe
723 * I haven't looked hard enough.
724 *
725 * Using the System Configuration framework, or HAL, or DeviceKit, or
726 * whatever, would require that libpcap applications be linked with
727 * the frameworks/libraries in question.  That shouldn't be a problem
728 * for programs linking with the shared version of libpcap (unless
729 * you're running on AIX - which I think is the only UN*X that doesn't
730 * support linking a shared library with other libraries on which it
731 * depends, and having an executable linked only with the first shared
732 * library automatically pick up the other libraries when started -
733 * and using HAL or whatever).  Programs linked with the static
734 * version of libpcap would have to use pcap-config with the --static
735 * flag in order to get the right linker flags in order to pick up
736 * the additional libraries/frameworks; those programs need that anyway
737 * for libpcap 1.1 and beyond on Linux, as, by default, it requires
738 * -lnl.
739 *
740 * Do any other UN*Xes, or desktop environments support getting a
741 * description?
742 */
743static char *
744#ifdef SIOCGIFDESCR
745get_if_description(const char *name)
746{
747	char *description = NULL;
748	int s;
749	struct ifreq ifrdesc;
750#ifndef IFDESCRSIZE
751	size_t descrlen = 64;
752#else
753	size_t descrlen = IFDESCRSIZE;
754#endif /* IFDESCRSIZE */
755
756	/*
757	 * Get the description for the interface.
758	 */
759	memset(&ifrdesc, 0, sizeof ifrdesc);
760	pcap_strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name);
761	s = socket(AF_INET, SOCK_DGRAM, 0);
762	if (s >= 0) {
763#ifdef __FreeBSD__
764		/*
765		 * On FreeBSD, if the buffer isn't big enough for the
766		 * description, the ioctl succeeds, but the description
767		 * isn't copied, ifr_buffer.length is set to the description
768		 * length, and ifr_buffer.buffer is set to NULL.
769		 */
770		for (;;) {
771			free(description);
772			if ((description = malloc(descrlen)) != NULL) {
773				ifrdesc.ifr_buffer.buffer = description;
774				ifrdesc.ifr_buffer.length = descrlen;
775				if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0) {
776					if (ifrdesc.ifr_buffer.buffer ==
777					    description)
778						break;
779					else
780						descrlen = ifrdesc.ifr_buffer.length;
781				} else {
782					/*
783					 * Failed to get interface description.
784					 */
785					free(description);
786					description = NULL;
787					break;
788				}
789			} else
790				break;
791		}
792#else /* __FreeBSD__ */
793		/*
794		 * The only other OS that currently supports
795		 * SIOCGIFDESCR is OpenBSD, and it has no way
796		 * to get the description length - it's clamped
797		 * to a maximum of IFDESCRSIZE.
798		 */
799		if ((description = malloc(descrlen)) != NULL) {
800			ifrdesc.ifr_data = (caddr_t)description;
801			if (ioctl(s, SIOCGIFDESCR, &ifrdesc) != 0) {
802				/*
803				 * Failed to get interface description.
804				 */
805				free(description);
806				description = NULL;
807			}
808		}
809#endif /* __FreeBSD__ */
810		close(s);
811		if (description != NULL && description[0] == '\0') {
812			/*
813			 * Description is empty, so discard it.
814			 */
815			free(description);
816			description = NULL;
817		}
818	}
819
820#ifdef __FreeBSD__
821	/*
822	 * For FreeBSD, if we didn't get a description, and this is
823	 * a device with a name of the form usbusN, label it as a USB
824	 * bus.
825	 */
826	if (description == NULL) {
827		if (strncmp(name, "usbus", 5) == 0) {
828			/*
829			 * OK, it begins with "usbus".
830			 */
831			long busnum;
832			char *p;
833
834			errno = 0;
835			busnum = strtol(name + 5, &p, 10);
836			if (errno == 0 && p != name + 5 && *p == '\0' &&
837			    busnum >= 0 && busnum <= INT_MAX) {
838				/*
839				 * OK, it's a valid number that's not
840				 * bigger than INT_MAX.  Construct
841				 * a description from it.
842				 * (If that fails, we don't worry about
843				 * it, we just return NULL.)
844				 */
845				if (pcap_asprintf(&description,
846				    "USB bus number %ld", busnum) == -1) {
847					/* Failed. */
848					description = NULL;
849				}
850			}
851		}
852	}
853#endif
854	return (description);
855#else /* SIOCGIFDESCR */
856get_if_description(const char *name _U_)
857{
858	return (NULL);
859#endif /* SIOCGIFDESCR */
860}
861
862/*
863 * Look for a given device in the specified list of devices.
864 *
865 * If we find it, return a pointer to its entry.
866 *
867 * If we don't find it, attempt to add an entry for it, with the specified
868 * IFF_ flags and description, and, if that succeeds, return a pointer to
869 * the new entry, otherwise return NULL and set errbuf to an error message.
870 */
871pcap_if_t *
872find_or_add_if(pcap_if_list_t *devlistp, const char *name,
873    bpf_u_int32 if_flags, get_if_flags_func get_flags_func, char *errbuf)
874{
875	bpf_u_int32 pcap_flags;
876
877	/*
878	 * Convert IFF_ flags to pcap flags.
879	 */
880	pcap_flags = 0;
881#ifdef IFF_LOOPBACK
882	if (if_flags & IFF_LOOPBACK)
883		pcap_flags |= PCAP_IF_LOOPBACK;
884#else
885	/*
886	 * We don't have IFF_LOOPBACK, so look at the device name to
887	 * see if it looks like a loopback device.
888	 */
889	if (name[0] == 'l' && name[1] == 'o' &&
890	    (isdigit((unsigned char)(name[2])) || name[2] == '\0')
891		pcap_flags |= PCAP_IF_LOOPBACK;
892#endif
893#ifdef IFF_UP
894	if (if_flags & IFF_UP)
895		pcap_flags |= PCAP_IF_UP;
896#endif
897#ifdef IFF_RUNNING
898	if (if_flags & IFF_RUNNING)
899		pcap_flags |= PCAP_IF_RUNNING;
900#endif
901
902	/*
903	 * Attempt to find an entry for this device; if we don't find one,
904	 * attempt to add one.
905	 */
906	return (find_or_add_dev(devlistp, name, pcap_flags,
907	    get_flags_func, get_if_description(name), errbuf));
908}
909
910/*
911 * Look for a given device in the specified list of devices.
912 *
913 * If we find it, then, if the specified address isn't null, add it to
914 * the list of addresses for the device and return 0.
915 *
916 * If we don't find it, attempt to add an entry for it, with the specified
917 * IFF_ flags and description, and, if that succeeds, add the specified
918 * address to its list of addresses if that address is non-null, and
919 * return 0, otherwise return -1 and set errbuf to an error message.
920 *
921 * (We can get called with a null address because we might get a list
922 * of interface name/address combinations from the underlying OS, with
923 * the address being absent in some cases, rather than a list of
924 * interfaces with each interface having a list of addresses, so this
925 * call may be the only call made to add to the list, and we want to
926 * add interfaces even if they have no addresses.)
927 */
928int
929add_addr_to_if(pcap_if_list_t *devlistp, const char *name,
930    bpf_u_int32 if_flags, get_if_flags_func get_flags_func,
931    struct sockaddr *addr, size_t addr_size,
932    struct sockaddr *netmask, size_t netmask_size,
933    struct sockaddr *broadaddr, size_t broadaddr_size,
934    struct sockaddr *dstaddr, size_t dstaddr_size,
935    char *errbuf)
936{
937	pcap_if_t *curdev;
938
939	/*
940	 * Check whether the device exists and, if not, add it.
941	 */
942	curdev = find_or_add_if(devlistp, name, if_flags, get_flags_func,
943	    errbuf);
944	if (curdev == NULL) {
945		/*
946		 * Error - give up.
947		 */
948		return (-1);
949	}
950
951	if (addr == NULL) {
952		/*
953		 * There's no address to add; this entry just meant
954		 * "here's a new interface".
955		 */
956		return (0);
957	}
958
959	/*
960	 * "curdev" is an entry for this interface, and we have an
961	 * address for it; add an entry for that address to the
962	 * interface's list of addresses.
963	 */
964	return (add_addr_to_dev(curdev, addr, addr_size, netmask,
965	    netmask_size, broadaddr, broadaddr_size, dstaddr,
966	    dstaddr_size, errbuf));
967}
968#endif /* _WIN32 */
969
970/*
971 * Add an entry to the list of addresses for an interface.
972 * "curdev" is the entry for that interface.
973 */
974int
975add_addr_to_dev(pcap_if_t *curdev,
976    struct sockaddr *addr, size_t addr_size,
977    struct sockaddr *netmask, size_t netmask_size,
978    struct sockaddr *broadaddr, size_t broadaddr_size,
979    struct sockaddr *dstaddr, size_t dstaddr_size,
980    char *errbuf)
981{
982	pcap_addr_t *curaddr, *prevaddr, *nextaddr;
983
984	/*
985	 * Allocate the new entry and fill it in.
986	 */
987	curaddr = (pcap_addr_t *)malloc(sizeof(pcap_addr_t));
988	if (curaddr == NULL) {
989		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
990		    errno, "malloc");
991		return (-1);
992	}
993
994	curaddr->next = NULL;
995	if (addr != NULL && addr_size != 0) {
996		curaddr->addr = (struct sockaddr *)dup_sockaddr(addr, addr_size);
997		if (curaddr->addr == NULL) {
998			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
999			    errno, "malloc");
1000			free(curaddr);
1001			return (-1);
1002		}
1003	} else
1004		curaddr->addr = NULL;
1005
1006	if (netmask != NULL && netmask_size != 0) {
1007		curaddr->netmask = (struct sockaddr *)dup_sockaddr(netmask, netmask_size);
1008		if (curaddr->netmask == NULL) {
1009			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1010			    errno, "malloc");
1011			if (curaddr->addr != NULL)
1012				free(curaddr->addr);
1013			free(curaddr);
1014			return (-1);
1015		}
1016	} else
1017		curaddr->netmask = NULL;
1018
1019	if (broadaddr != NULL && broadaddr_size != 0) {
1020		curaddr->broadaddr = (struct sockaddr *)dup_sockaddr(broadaddr, broadaddr_size);
1021		if (curaddr->broadaddr == NULL) {
1022			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1023			    errno, "malloc");
1024			if (curaddr->netmask != NULL)
1025				free(curaddr->netmask);
1026			if (curaddr->addr != NULL)
1027				free(curaddr->addr);
1028			free(curaddr);
1029			return (-1);
1030		}
1031	} else
1032		curaddr->broadaddr = NULL;
1033
1034	if (dstaddr != NULL && dstaddr_size != 0) {
1035		curaddr->dstaddr = (struct sockaddr *)dup_sockaddr(dstaddr, dstaddr_size);
1036		if (curaddr->dstaddr == NULL) {
1037			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1038			    errno, "malloc");
1039			if (curaddr->broadaddr != NULL)
1040				free(curaddr->broadaddr);
1041			if (curaddr->netmask != NULL)
1042				free(curaddr->netmask);
1043			if (curaddr->addr != NULL)
1044				free(curaddr->addr);
1045			free(curaddr);
1046			return (-1);
1047		}
1048	} else
1049		curaddr->dstaddr = NULL;
1050
1051	/*
1052	 * Find the end of the list of addresses.
1053	 */
1054	for (prevaddr = curdev->addresses; prevaddr != NULL; prevaddr = nextaddr) {
1055		nextaddr = prevaddr->next;
1056		if (nextaddr == NULL) {
1057			/*
1058			 * This is the end of the list.
1059			 */
1060			break;
1061		}
1062	}
1063
1064	if (prevaddr == NULL) {
1065		/*
1066		 * The list was empty; this is the first member.
1067		 */
1068		curdev->addresses = curaddr;
1069	} else {
1070		/*
1071		 * "prevaddr" is the last member of the list; append
1072		 * this member to it.
1073		 */
1074		prevaddr->next = curaddr;
1075	}
1076
1077	return (0);
1078}
1079
1080/*
1081 * Look for a given device in the specified list of devices.
1082 *
1083 * If we find it, return 0 and set *curdev_ret to point to it.
1084 *
1085 * If we don't find it, attempt to add an entry for it, with the specified
1086 * flags and description, and, if that succeeds, return 0, otherwise
1087 * return -1 and set errbuf to an error message.
1088 */
1089pcap_if_t *
1090find_or_add_dev(pcap_if_list_t *devlistp, const char *name, bpf_u_int32 flags,
1091    get_if_flags_func get_flags_func, const char *description, char *errbuf)
1092{
1093	pcap_if_t *curdev;
1094
1095	/*
1096	 * Is there already an entry in the list for this device?
1097	 */
1098	curdev = find_dev(devlistp, name);
1099	if (curdev != NULL) {
1100		/*
1101		 * Yes, return it.
1102		 */
1103		return (curdev);
1104	}
1105
1106	/*
1107	 * No, we didn't find it.
1108	 */
1109
1110	/*
1111	 * Try to get additional flags for the device.
1112	 */
1113	if ((*get_flags_func)(name, &flags, errbuf) == -1) {
1114		/*
1115		 * Failed.
1116		 */
1117		return (NULL);
1118	}
1119
1120	/*
1121	 * Now, try to add it to the list of devices.
1122	 */
1123	return (add_dev(devlistp, name, flags, description, errbuf));
1124}
1125
1126/*
1127 * Look for a given device in the specified list of devices, and return
1128 * the entry for it if we find it or NULL if we don't.
1129 */
1130pcap_if_t *
1131find_dev(pcap_if_list_t *devlistp, const char *name)
1132{
1133	pcap_if_t *curdev;
1134
1135	/*
1136	 * Is there an entry in the list for this device?
1137	 */
1138	for (curdev = devlistp->beginning; curdev != NULL;
1139	    curdev = curdev->next) {
1140		if (strcmp(name, curdev->name) == 0) {
1141			/*
1142			 * We found it, so, yes, there is.  No need to
1143			 * add it.  Provide the entry we found to our
1144			 * caller.
1145			 */
1146			return (curdev);
1147		}
1148	}
1149
1150	/*
1151	 * No.
1152	 */
1153	return (NULL);
1154}
1155
1156/*
1157 * Attempt to add an entry for a device, with the specified flags
1158 * and description, and, if that succeeds, return 0 and return a pointer
1159 * to the new entry, otherwise return NULL and set errbuf to an error
1160 * message.
1161 *
1162 * If we weren't given a description, try to get one.
1163 */
1164pcap_if_t *
1165add_dev(pcap_if_list_t *devlistp, const char *name, bpf_u_int32 flags,
1166    const char *description, char *errbuf)
1167{
1168	pcap_if_t *curdev, *prevdev, *nextdev;
1169	u_int this_figure_of_merit, nextdev_figure_of_merit;
1170
1171	curdev = malloc(sizeof(pcap_if_t));
1172	if (curdev == NULL) {
1173		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1174		    errno, "malloc");
1175		return (NULL);
1176	}
1177
1178	/*
1179	 * Fill in the entry.
1180	 */
1181	curdev->next = NULL;
1182	curdev->name = strdup(name);
1183	if (curdev->name == NULL) {
1184		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1185		    errno, "malloc");
1186		free(curdev);
1187		return (NULL);
1188	}
1189	if (description == NULL) {
1190		/*
1191		 * We weren't handed a description for the interface.
1192		 */
1193		curdev->description = NULL;
1194	} else {
1195		/*
1196		 * We were handed a description; make a copy.
1197		 */
1198		curdev->description = strdup(description);
1199		if (curdev->description == NULL) {
1200			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1201			    errno, "malloc");
1202			free(curdev->name);
1203			free(curdev);
1204			return (NULL);
1205		}
1206	}
1207	curdev->addresses = NULL;	/* list starts out as empty */
1208	curdev->flags = flags;
1209
1210	/*
1211	 * Add it to the list, in the appropriate location.
1212	 * First, get the "figure of merit" for this interface.
1213	 */
1214	this_figure_of_merit = get_figure_of_merit(curdev);
1215
1216	/*
1217	 * Now look for the last interface with an figure of merit
1218	 * less than or equal to the new interface's figure of merit.
1219	 *
1220	 * We start with "prevdev" being NULL, meaning we're before
1221	 * the first element in the list.
1222	 */
1223	prevdev = NULL;
1224	for (;;) {
1225		/*
1226		 * Get the interface after this one.
1227		 */
1228		if (prevdev == NULL) {
1229			/*
1230			 * The next element is the first element.
1231			 */
1232			nextdev = devlistp->beginning;
1233		} else
1234			nextdev = prevdev->next;
1235
1236		/*
1237		 * Are we at the end of the list?
1238		 */
1239		if (nextdev == NULL) {
1240			/*
1241			 * Yes - we have to put the new entry after "prevdev".
1242			 */
1243			break;
1244		}
1245
1246		/*
1247		 * Is the new interface's figure of merit less
1248		 * than the next interface's figure of merit,
1249		 * meaning that the new interface is better
1250		 * than the next interface?
1251		 */
1252		nextdev_figure_of_merit = get_figure_of_merit(nextdev);
1253		if (this_figure_of_merit < nextdev_figure_of_merit) {
1254			/*
1255			 * Yes - we should put the new entry
1256			 * before "nextdev", i.e. after "prevdev".
1257			 */
1258			break;
1259		}
1260
1261		prevdev = nextdev;
1262	}
1263
1264	/*
1265	 * Insert before "nextdev".
1266	 */
1267	curdev->next = nextdev;
1268
1269	/*
1270	 * Insert after "prevdev" - unless "prevdev" is null,
1271	 * in which case this is the first interface.
1272	 */
1273	if (prevdev == NULL) {
1274		/*
1275		 * This is the first interface.  Make it
1276		 * the first element in the list of devices.
1277		 */
1278		devlistp->beginning = curdev;
1279	} else
1280		prevdev->next = curdev;
1281	return (curdev);
1282}
1283
1284/*
1285 * Free a list of interfaces.
1286 */
1287void
1288pcap_freealldevs(pcap_if_t *alldevs)
1289{
1290	pcap_if_t *curdev, *nextdev;
1291	pcap_addr_t *curaddr, *nextaddr;
1292
1293	for (curdev = alldevs; curdev != NULL; curdev = nextdev) {
1294		nextdev = curdev->next;
1295
1296		/*
1297		 * Free all addresses.
1298		 */
1299		for (curaddr = curdev->addresses; curaddr != NULL; curaddr = nextaddr) {
1300			nextaddr = curaddr->next;
1301			if (curaddr->addr)
1302				free(curaddr->addr);
1303			if (curaddr->netmask)
1304				free(curaddr->netmask);
1305			if (curaddr->broadaddr)
1306				free(curaddr->broadaddr);
1307			if (curaddr->dstaddr)
1308				free(curaddr->dstaddr);
1309			free(curaddr);
1310		}
1311
1312		/*
1313		 * Free the name string.
1314		 */
1315		free(curdev->name);
1316
1317		/*
1318		 * Free the description string, if any.
1319		 */
1320		if (curdev->description != NULL)
1321			free(curdev->description);
1322
1323		/*
1324		 * Free the interface.
1325		 */
1326		free(curdev);
1327	}
1328}
1329
1330/*
1331 * pcap-npf.c has its own pcap_lookupdev(), for compatibility reasons, as
1332 * it actually returns the names of all interfaces, with a NUL separator
1333 * between them; some callers may depend on that.
1334 *
1335 * MS-DOS has its own pcap_lookupdev(), but that might be useful only
1336 * as an optimization.
1337 *
1338 * In all other cases, we just use pcap_findalldevs() to get a list of
1339 * devices, and pick from that list.
1340 */
1341#if !defined(HAVE_PACKET32) && !defined(MSDOS)
1342/*
1343 * Return the name of a network interface attached to the system, or NULL
1344 * if none can be found.  The interface must be configured up; the
1345 * lowest unit number is preferred; loopback is ignored.
1346 */
1347char *
1348pcap_lookupdev(char *errbuf)
1349{
1350	pcap_if_t *alldevs;
1351#ifdef _WIN32
1352  /*
1353   * Windows - use the same size as the old WinPcap 3.1 code.
1354   * XXX - this is probably bigger than it needs to be.
1355   */
1356  #define IF_NAMESIZE 8192
1357#else
1358  /*
1359   * UN*X - use the system's interface name size.
1360   * XXX - that might not be large enough for capture devices
1361   * that aren't regular network interfaces.
1362   */
1363  /* for old BSD systems, including bsdi3 */
1364  #ifndef IF_NAMESIZE
1365  #define IF_NAMESIZE IFNAMSIZ
1366  #endif
1367#endif
1368	static char device[IF_NAMESIZE + 1];
1369	char *ret;
1370
1371	if (pcap_findalldevs(&alldevs, errbuf) == -1)
1372		return (NULL);
1373
1374	if (alldevs == NULL || (alldevs->flags & PCAP_IF_LOOPBACK)) {
1375		/*
1376		 * There are no devices on the list, or the first device
1377		 * on the list is a loopback device, which means there
1378		 * are no non-loopback devices on the list.  This means
1379		 * we can't return any device.
1380		 *
1381		 * XXX - why not return a loopback device?  If we can't
1382		 * capture on it, it won't be on the list, and if it's
1383		 * on the list, there aren't any non-loopback devices,
1384		 * so why not just supply it as the default device?
1385		 */
1386		(void)pcap_strlcpy(errbuf, "no suitable device found",
1387		    PCAP_ERRBUF_SIZE);
1388		ret = NULL;
1389	} else {
1390		/*
1391		 * Return the name of the first device on the list.
1392		 */
1393		(void)pcap_strlcpy(device, alldevs->name, sizeof(device));
1394		ret = device;
1395	}
1396
1397	pcap_freealldevs(alldevs);
1398	return (ret);
1399}
1400#endif /* !defined(HAVE_PACKET32) && !defined(MSDOS) */
1401
1402#if !defined(_WIN32) && !defined(MSDOS)
1403/*
1404 * We don't just fetch the entire list of devices, search for the
1405 * particular device, and use its first IPv4 address, as that's too
1406 * much work to get just one device's netmask.
1407 *
1408 * If we had an API to get attributes for a given device, we could
1409 * use that.
1410 */
1411int
1412pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp,
1413    char *errbuf)
1414{
1415	register int fd;
1416	register struct sockaddr_in *sin4;
1417	struct ifreq ifr;
1418
1419	/*
1420	 * The pseudo-device "any" listens on all interfaces and therefore
1421	 * has the network address and -mask "0.0.0.0" therefore catching
1422	 * all traffic. Using NULL for the interface is the same as "any".
1423	 */
1424	if (!device || strcmp(device, "any") == 0
1425#ifdef HAVE_DAG_API
1426	    || strstr(device, "dag") != NULL
1427#endif
1428#ifdef HAVE_SEPTEL_API
1429	    || strstr(device, "septel") != NULL
1430#endif
1431#ifdef PCAP_SUPPORT_BT
1432	    || strstr(device, "bluetooth") != NULL
1433#endif
1434#ifdef PCAP_SUPPORT_USB
1435	    || strstr(device, "usbmon") != NULL
1436#endif
1437#ifdef HAVE_SNF_API
1438	    || strstr(device, "snf") != NULL
1439#endif
1440#ifdef PCAP_SUPPORT_NETMAP
1441	    || strncmp(device, "netmap:", 7) == 0
1442	    || strncmp(device, "vale", 4) == 0
1443#endif
1444	    ) {
1445		*netp = *maskp = 0;
1446		return 0;
1447	}
1448
1449	fd = socket(AF_INET, SOCK_DGRAM, 0);
1450	if (fd < 0) {
1451		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1452		    errno, "socket");
1453		return (-1);
1454	}
1455	memset(&ifr, 0, sizeof(ifr));
1456#ifdef linux
1457	/* XXX Work around Linux kernel bug */
1458	ifr.ifr_addr.sa_family = AF_INET;
1459#endif
1460	(void)pcap_strlcpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
1461	if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) {
1462		if (errno == EADDRNOTAVAIL) {
1463			(void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1464			    "%s: no IPv4 address assigned", device);
1465		} else {
1466			pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1467			    errno, "SIOCGIFADDR: %s", device);
1468		}
1469		(void)close(fd);
1470		return (-1);
1471	}
1472	sin4 = (struct sockaddr_in *)&ifr.ifr_addr;
1473	*netp = sin4->sin_addr.s_addr;
1474	memset(&ifr, 0, sizeof(ifr));
1475#ifdef linux
1476	/* XXX Work around Linux kernel bug */
1477	ifr.ifr_addr.sa_family = AF_INET;
1478#endif
1479	(void)pcap_strlcpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
1480	if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) {
1481		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1482		    errno, "SIOCGIFNETMASK: %s", device);
1483		(void)close(fd);
1484		return (-1);
1485	}
1486	(void)close(fd);
1487	*maskp = sin4->sin_addr.s_addr;
1488	if (*maskp == 0) {
1489		if (IN_CLASSA(*netp))
1490			*maskp = IN_CLASSA_NET;
1491		else if (IN_CLASSB(*netp))
1492			*maskp = IN_CLASSB_NET;
1493		else if (IN_CLASSC(*netp))
1494			*maskp = IN_CLASSC_NET;
1495		else {
1496			(void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1497			    "inet class for 0x%x unknown", *netp);
1498			return (-1);
1499		}
1500	}
1501	*netp &= *maskp;
1502	return (0);
1503}
1504#endif /* !defined(_WIN32) && !defined(MSDOS) */
1505
1506#ifdef ENABLE_REMOTE
1507#include "pcap-rpcap.h"
1508
1509/*
1510 * Extract a substring from a string.
1511 */
1512static char *
1513get_substring(const char *p, size_t len, char *ebuf)
1514{
1515	char *token;
1516
1517	token = malloc(len + 1);
1518	if (token == NULL) {
1519		pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1520		    errno, "malloc");
1521		return (NULL);
1522	}
1523	memcpy(token, p, len);
1524	token[len] = '\0';
1525	return (token);
1526}
1527
1528/*
1529 * Parse a capture source that might be a URL.
1530 *
1531 * If the source is not a URL, *schemep, *userinfop, *hostp, and *portp
1532 * are set to NULL, *pathp is set to point to the source, and 0 is
1533 * returned.
1534 *
1535 * If source is a URL, and the URL refers to a local device (a special
1536 * case of rpcap:), *schemep, *userinfop, *hostp, and *portp are set
1537 * to NULL, *pathp is set to point to the device name, and 0 is returned.
1538 *
1539 * If source is a URL, and it's not a special case that refers to a local
1540 * device, and the parse succeeds:
1541 *
1542 *    *schemep is set to point to an allocated string containing the scheme;
1543 *
1544 *    if user information is present in the URL, *userinfop is set to point
1545 *    to an allocated string containing the user information, otherwise
1546 *    it's set to NULL;
1547 *
1548 *    if host information is present in the URL, *hostp is set to point
1549 *    to an allocated string containing the host information, otherwise
1550 *    it's set to NULL;
1551 *
1552 *    if a port number is present in the URL, *portp is set to point
1553 *    to an allocated string containing the port number, otherwise
1554 *    it's set to NULL;
1555 *
1556 *    *pathp is set to point to an allocated string containing the
1557 *    path;
1558 *
1559 * and 0 is returned.
1560 *
1561 * If the parse fails, ebuf is set to an error string, and -1 is returned.
1562 */
1563static int
1564pcap_parse_source(const char *source, char **schemep, char **userinfop,
1565    char **hostp, char **portp, char **pathp, char *ebuf)
1566{
1567	char *colonp;
1568	size_t scheme_len;
1569	char *scheme;
1570	const char *endp;
1571	size_t authority_len;
1572	char *authority;
1573	char *parsep, *atsignp, *bracketp;
1574	char *userinfo, *host, *port, *path;
1575
1576	/*
1577	 * Start out returning nothing.
1578	 */
1579	*schemep = NULL;
1580	*userinfop = NULL;
1581	*hostp = NULL;
1582	*portp = NULL;
1583	*pathp = NULL;
1584
1585	/*
1586	 * RFC 3986 says:
1587	 *
1588	 *   URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
1589	 *
1590	 *   hier-part   = "//" authority path-abempty
1591	 *               / path-absolute
1592	 *               / path-rootless
1593	 *               / path-empty
1594	 *
1595	 *   authority   = [ userinfo "@" ] host [ ":" port ]
1596	 *
1597	 *   userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
1598         *
1599         * Step 1: look for the ":" at the end of the scheme.
1600	 * A colon in the source is *NOT* sufficient to indicate that
1601	 * this is a URL, as interface names on some platforms might
1602	 * include colons (e.g., I think some Solaris interfaces
1603	 * might).
1604	 */
1605	colonp = strchr(source, ':');
1606	if (colonp == NULL) {
1607		/*
1608		 * The source is the device to open.
1609		 * Return a NULL pointer for the scheme, user information,
1610		 * host, and port, and return the device as the path.
1611		 */
1612		*pathp = strdup(source);
1613		if (*pathp == NULL) {
1614			pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1615			    errno, "malloc");
1616			return (-1);
1617		}
1618		return (0);
1619	}
1620
1621	/*
1622	 * All schemes must have "//" after them, i.e. we only support
1623	 * hier-part   = "//" authority path-abempty, not
1624	 * hier-part   = path-absolute
1625	 * hier-part   = path-rootless
1626	 * hier-part   = path-empty
1627	 *
1628	 * We need that in order to distinguish between a local device
1629	 * name that happens to contain a colon and a URI.
1630	 */
1631	if (strncmp(colonp + 1, "//", 2) != 0) {
1632		/*
1633		 * The source is the device to open.
1634		 * Return a NULL pointer for the scheme, user information,
1635		 * host, and port, and return the device as the path.
1636		 */
1637		*pathp = strdup(source);
1638		if (*pathp == NULL) {
1639			pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1640			    errno, "malloc");
1641			return (-1);
1642		}
1643		return (0);
1644	}
1645
1646	/*
1647	 * XXX - check whether the purported scheme could be a scheme?
1648	 */
1649
1650	/*
1651	 * OK, this looks like a URL.
1652	 * Get the scheme.
1653	 */
1654	scheme_len = colonp - source;
1655	scheme = malloc(scheme_len + 1);
1656	if (scheme == NULL) {
1657		pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1658		    errno, "malloc");
1659		return (-1);
1660	}
1661	memcpy(scheme, source, scheme_len);
1662	scheme[scheme_len] = '\0';
1663
1664	/*
1665	 * Treat file: specially - take everything after file:// as
1666	 * the pathname.
1667	 */
1668	if (pcap_strcasecmp(scheme, "file") == 0) {
1669		*pathp = strdup(colonp + 3);
1670		if (*pathp == NULL) {
1671			pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1672			    errno, "malloc");
1673			free(scheme);
1674			return (-1);
1675		}
1676		*schemep = scheme;
1677		return (0);
1678	}
1679
1680	/*
1681	 * The WinPcap documentation says you can specify a local
1682	 * interface with "rpcap://{device}"; we special-case
1683	 * that here.  If the scheme is "rpcap", and there are
1684	 * no slashes past the "//", we just return the device.
1685	 *
1686	 * XXX - %-escaping?
1687	 */
1688	if (pcap_strcasecmp(scheme, "rpcap") == 0 &&
1689	    strchr(colonp + 3, '/') == NULL) {
1690		/*
1691		 * Local device.
1692		 *
1693		 * Return a NULL pointer for the scheme, user information,
1694		 * host, and port, and return the device as the path.
1695		 */
1696		free(scheme);
1697		*pathp = strdup(colonp + 3);
1698		if (*pathp == NULL) {
1699			pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1700			    errno, "malloc");
1701			return (-1);
1702		}
1703		return (0);
1704	}
1705
1706	/*
1707	 * OK, now start parsing the authority.
1708	 * Get token, terminated with / or terminated at the end of
1709	 * the string.
1710	 */
1711	authority_len = strcspn(colonp + 3, "/");
1712	authority = get_substring(colonp + 3, authority_len, ebuf);
1713	if (authority == NULL) {
1714		/*
1715		 * Error.
1716		 */
1717		free(scheme);
1718		return (-1);
1719	}
1720	endp = colonp + 3 + authority_len;
1721
1722	/*
1723	 * Now carve the authority field into its components.
1724	 */
1725	parsep = authority;
1726
1727	/*
1728	 * Is there a userinfo field?
1729	 */
1730	atsignp = strchr(parsep, '@');
1731	if (atsignp != NULL) {
1732		/*
1733		 * Yes.
1734		 */
1735		size_t userinfo_len;
1736
1737		userinfo_len = atsignp - parsep;
1738		userinfo = get_substring(parsep, userinfo_len, ebuf);
1739		if (userinfo == NULL) {
1740			/*
1741			 * Error.
1742			 */
1743			free(authority);
1744			free(scheme);
1745			return (-1);
1746		}
1747		parsep = atsignp + 1;
1748	} else {
1749		/*
1750		 * No.
1751		 */
1752		userinfo = NULL;
1753	}
1754
1755	/*
1756	 * Is there a host field?
1757	 */
1758	if (*parsep == '\0') {
1759		/*
1760		 * No; there's no host field or port field.
1761		 */
1762		host = NULL;
1763		port = NULL;
1764	} else {
1765		/*
1766		 * Yes.
1767		 */
1768		size_t host_len;
1769
1770		/*
1771		 * Is it an IP-literal?
1772		 */
1773		if (*parsep == '[') {
1774			/*
1775			 * Yes.
1776			 * Treat verything up to the closing square
1777			 * bracket as the IP-Literal; we don't worry
1778			 * about whether it's a valid IPv6address or
1779			 * IPvFuture (or an IPv4address, for that
1780			 * matter, just in case we get handed a
1781			 * URL with an IPv4 IP-Literal, of the sort
1782			 * that pcap_createsrcstr() used to generate,
1783			 * and that pcap_parsesrcstr(), in the original
1784			 * WinPcap code, accepted).
1785			 */
1786			bracketp = strchr(parsep, ']');
1787			if (bracketp == NULL) {
1788				/*
1789				 * There's no closing square bracket.
1790				 */
1791				pcap_snprintf(ebuf, PCAP_ERRBUF_SIZE,
1792				    "IP-literal in URL doesn't end with ]");
1793				free(userinfo);
1794				free(authority);
1795				free(scheme);
1796				return (-1);
1797			}
1798			if (*(bracketp + 1) != '\0' &&
1799			    *(bracketp + 1) != ':') {
1800				/*
1801				 * There's extra crud after the
1802				 * closing square bracketn.
1803				 */
1804				pcap_snprintf(ebuf, PCAP_ERRBUF_SIZE,
1805				    "Extra text after IP-literal in URL");
1806				free(userinfo);
1807				free(authority);
1808				free(scheme);
1809				return (-1);
1810			}
1811			host_len = (bracketp - 1) - parsep;
1812			host = get_substring(parsep + 1, host_len, ebuf);
1813			if (host == NULL) {
1814				/*
1815				 * Error.
1816				 */
1817				free(userinfo);
1818				free(authority);
1819				free(scheme);
1820				return (-1);
1821			}
1822			parsep = bracketp + 1;
1823		} else {
1824			/*
1825			 * No.
1826			 * Treat everything up to a : or the end of
1827			 * the string as the host.
1828			 */
1829			host_len = strcspn(parsep, ":");
1830			host = get_substring(parsep, host_len, ebuf);
1831			if (host == NULL) {
1832				/*
1833				 * Error.
1834				 */
1835				free(userinfo);
1836				free(authority);
1837				free(scheme);
1838				return (-1);
1839			}
1840			parsep = parsep + host_len;
1841		}
1842
1843		/*
1844		 * Is there a port field?
1845		 */
1846		if (*parsep == ':') {
1847			/*
1848			 * Yes.  It's the rest of the authority field.
1849			 */
1850			size_t port_len;
1851
1852			parsep++;
1853			port_len = strlen(parsep);
1854			port = get_substring(parsep, port_len, ebuf);
1855			if (port == NULL) {
1856				/*
1857				 * Error.
1858				 */
1859				free(host);
1860				free(userinfo);
1861				free(authority);
1862				free(scheme);
1863				return (-1);
1864			}
1865		} else {
1866			/*
1867			 * No.
1868			 */
1869			port = NULL;
1870		}
1871	}
1872	free(authority);
1873
1874	/*
1875	 * Everything else is the path.  Strip off the leading /.
1876	 */
1877	if (*endp == '\0')
1878		path = strdup("");
1879	else
1880		path = strdup(endp + 1);
1881	if (path == NULL) {
1882		pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
1883		    errno, "malloc");
1884		free(port);
1885		free(host);
1886		free(userinfo);
1887		free(scheme);
1888		return (-1);
1889	}
1890	*schemep = scheme;
1891	*userinfop = userinfo;
1892	*hostp = host;
1893	*portp = port;
1894	*pathp = path;
1895	return (0);
1896}
1897
1898int
1899pcap_createsrcstr(char *source, int type, const char *host, const char *port,
1900    const char *name, char *errbuf)
1901{
1902	switch (type) {
1903
1904	case PCAP_SRC_FILE:
1905		pcap_strlcpy(source, PCAP_SRC_FILE_STRING, PCAP_BUF_SIZE);
1906		if (name != NULL && *name != '\0') {
1907			pcap_strlcat(source, name, PCAP_BUF_SIZE);
1908			return (0);
1909		} else {
1910			pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1911			    "The file name cannot be NULL.");
1912			return (-1);
1913		}
1914
1915	case PCAP_SRC_IFREMOTE:
1916		pcap_strlcpy(source, PCAP_SRC_IF_STRING, PCAP_BUF_SIZE);
1917		if (host != NULL && *host != '\0') {
1918			if (strchr(host, ':') != NULL) {
1919				/*
1920				 * The host name contains a colon, so it's
1921				 * probably an IPv6 address, and needs to
1922				 * be included in square brackets.
1923				 */
1924				pcap_strlcat(source, "[", PCAP_BUF_SIZE);
1925				pcap_strlcat(source, host, PCAP_BUF_SIZE);
1926				pcap_strlcat(source, "]", PCAP_BUF_SIZE);
1927			} else
1928				pcap_strlcat(source, host, PCAP_BUF_SIZE);
1929
1930			if (port != NULL && *port != '\0') {
1931				pcap_strlcat(source, ":", PCAP_BUF_SIZE);
1932				pcap_strlcat(source, port, PCAP_BUF_SIZE);
1933			}
1934
1935			pcap_strlcat(source, "/", PCAP_BUF_SIZE);
1936		} else {
1937			pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1938			    "The host name cannot be NULL.");
1939			return (-1);
1940		}
1941
1942		if (name != NULL && *name != '\0')
1943			pcap_strlcat(source, name, PCAP_BUF_SIZE);
1944
1945		return (0);
1946
1947	case PCAP_SRC_IFLOCAL:
1948		pcap_strlcpy(source, PCAP_SRC_IF_STRING, PCAP_BUF_SIZE);
1949
1950		if (name != NULL && *name != '\0')
1951			pcap_strlcat(source, name, PCAP_BUF_SIZE);
1952
1953		return (0);
1954
1955	default:
1956		pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1957		    "The interface type is not valid.");
1958		return (-1);
1959	}
1960}
1961
1962int
1963pcap_parsesrcstr(const char *source, int *type, char *host, char *port,
1964    char *name, char *errbuf)
1965{
1966	char *scheme, *tmpuserinfo, *tmphost, *tmpport, *tmppath;
1967
1968	/* Initialization stuff */
1969	if (host)
1970		*host = '\0';
1971	if (port)
1972		*port = '\0';
1973	if (name)
1974		*name = '\0';
1975
1976	/* Parse the source string */
1977	if (pcap_parse_source(source, &scheme, &tmpuserinfo, &tmphost,
1978	    &tmpport, &tmppath, errbuf) == -1) {
1979		/*
1980		 * Fail.
1981		 */
1982		return (-1);
1983	}
1984
1985	if (scheme == NULL) {
1986		/*
1987		 * Local device.
1988		 */
1989		if (name && tmppath)
1990			pcap_strlcpy(name, tmppath, PCAP_BUF_SIZE);
1991		if (type)
1992			*type = PCAP_SRC_IFLOCAL;
1993		free(tmppath);
1994		free(tmpport);
1995		free(tmphost);
1996		free(tmpuserinfo);
1997		return (0);
1998	}
1999
2000	if (strcmp(scheme, "rpcap") == 0) {
2001		/*
2002		 * rpcap://
2003		 *
2004		 * pcap_parse_source() has already handled the case of
2005		 * rpcap://device
2006		 */
2007		if (host && tmphost) {
2008			if (tmpuserinfo)
2009				pcap_snprintf(host, PCAP_BUF_SIZE, "%s@%s",
2010				    tmpuserinfo, tmphost);
2011			else
2012				pcap_strlcpy(host, tmphost, PCAP_BUF_SIZE);
2013		}
2014		if (port && tmpport)
2015			pcap_strlcpy(port, tmpport, PCAP_BUF_SIZE);
2016		if (name && tmppath)
2017			pcap_strlcpy(name, tmppath, PCAP_BUF_SIZE);
2018		if (type)
2019			*type = PCAP_SRC_IFREMOTE;
2020		free(tmppath);
2021		free(tmpport);
2022		free(tmphost);
2023		free(tmpuserinfo);
2024		free(scheme);
2025		return (0);
2026	}
2027
2028	if (strcmp(scheme, "file") == 0) {
2029		/*
2030		 * file://
2031		 */
2032		if (name && tmppath)
2033			pcap_strlcpy(name, tmppath, PCAP_BUF_SIZE);
2034		if (type)
2035			*type = PCAP_SRC_FILE;
2036		free(tmppath);
2037		free(tmpport);
2038		free(tmphost);
2039		free(tmpuserinfo);
2040		free(scheme);
2041		return (0);
2042	}
2043
2044	/*
2045	 * Neither rpcap: nor file:; just treat the entire string
2046	 * as a local device.
2047	 */
2048	if (name)
2049		pcap_strlcpy(name, source, PCAP_BUF_SIZE);
2050	if (type)
2051		*type = PCAP_SRC_IFLOCAL;
2052	free(tmppath);
2053	free(tmpport);
2054	free(tmphost);
2055	free(tmpuserinfo);
2056	free(scheme);
2057	return (0);
2058}
2059#endif
2060
2061pcap_t *
2062pcap_create(const char *device, char *errbuf)
2063{
2064	size_t i;
2065	int is_theirs;
2066	pcap_t *p;
2067	char *device_str;
2068
2069	/*
2070	 * A null device name is equivalent to the "any" device -
2071	 * which might not be supported on this platform, but
2072	 * this means that you'll get a "not supported" error
2073	 * rather than, say, a crash when we try to dereference
2074	 * the null pointer.
2075	 */
2076	if (device == NULL)
2077		device_str = strdup("any");
2078	else {
2079#ifdef _WIN32
2080		/*
2081		 * On Windows, for backwards compatibility reasons,
2082		 * pcap_lookupdev() returns a pointer to a sequence of
2083		 * pairs of UTF-16LE device names and local code page
2084		 * description strings.
2085		 *
2086		 * This means that if a program uses pcap_lookupdev()
2087		 * to get a default device, and hands that to an API
2088		 * that opens devices, we'll get handed a UTF-16LE
2089		 * string, not a string in the local code page.
2090		 *
2091		 * To work around that, we check whether the string
2092		 * looks as if it might be a UTF-16LE strinh and, if
2093		 * so, convert it back to the local code page's
2094		 * extended ASCII.
2095		 *
2096		 * XXX - you *cannot* reliably detect whether a
2097		 * string is UTF-16LE or not; "a" could either
2098		 * be a one-character ASCII string or the first
2099		 * character of a UTF-16LE string.  This particular
2100		 * version of this heuristic dates back to WinPcap
2101		 * 4.1.1; PacketOpenAdapter() does uses the same
2102		 * heuristic, with the exact same vulnerability.
2103		 */
2104		if (device[0] != '\0' && device[1] == '\0') {
2105			size_t length;
2106
2107			length = wcslen((wchar_t *)device);
2108			device_str = (char *)malloc(length + 1);
2109			if (device_str == NULL) {
2110				pcap_fmt_errmsg_for_errno(errbuf,
2111				    PCAP_ERRBUF_SIZE, errno,
2112				    "malloc");
2113				return (NULL);
2114			}
2115
2116			pcap_snprintf(device_str, length + 1, "%ws",
2117			    (const wchar_t *)device);
2118		} else
2119#endif
2120			device_str = strdup(device);
2121	}
2122	if (device_str == NULL) {
2123		pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
2124		    errno, "malloc");
2125		return (NULL);
2126	}
2127
2128	/*
2129	 * Try each of the non-local-network-interface capture
2130	 * source types until we find one that works for this
2131	 * device or run out of types.
2132	 */
2133	for (i = 0; capture_source_types[i].create_op != NULL; i++) {
2134		is_theirs = 0;
2135		p = capture_source_types[i].create_op(device_str, errbuf,
2136		    &is_theirs);
2137		if (is_theirs) {
2138			/*
2139			 * The device name refers to a device of the
2140			 * type in question; either it succeeded,
2141			 * in which case p refers to a pcap_t to
2142			 * later activate for the device, or it
2143			 * failed, in which case p is null and we
2144			 * should return that to report the failure
2145			 * to create.
2146			 */
2147			if (p == NULL) {
2148				/*
2149				 * We assume the caller filled in errbuf.
2150				 */
2151				free(device_str);
2152				return (NULL);
2153			}
2154			p->opt.device = device_str;
2155			return (p);
2156		}
2157	}
2158
2159	/*
2160	 * OK, try it as a regular network interface.
2161	 */
2162	p = pcap_create_interface(device_str, errbuf);
2163	if (p == NULL) {
2164		/*
2165		 * We assume the caller filled in errbuf.
2166		 */
2167		free(device_str);
2168		return (NULL);
2169	}
2170	p->opt.device = device_str;
2171	return (p);
2172}
2173
2174/*
2175 * Set nonblocking mode on an unactivated pcap_t; this sets a flag
2176 * checked by pcap_activate(), which sets the mode after calling
2177 * the activate routine.
2178 */
2179static int
2180pcap_setnonblock_unactivated(pcap_t *p, int nonblock)
2181{
2182	p->opt.nonblock = nonblock;
2183	return (0);
2184}
2185
2186static void
2187initialize_ops(pcap_t *p)
2188{
2189	/*
2190	 * Set operation pointers for operations that only work on
2191	 * an activated pcap_t to point to a routine that returns
2192	 * a "this isn't activated" error.
2193	 */
2194	p->read_op = pcap_read_not_initialized;
2195	p->inject_op = pcap_inject_not_initialized;
2196	p->setfilter_op = pcap_setfilter_not_initialized;
2197	p->setdirection_op = pcap_setdirection_not_initialized;
2198	p->set_datalink_op = pcap_set_datalink_not_initialized;
2199	p->getnonblock_op = pcap_getnonblock_not_initialized;
2200	p->stats_op = pcap_stats_not_initialized;
2201#ifdef _WIN32
2202	p->stats_ex_op = pcap_stats_ex_not_initialized;
2203	p->setbuff_op = pcap_setbuff_not_initialized;
2204	p->setmode_op = pcap_setmode_not_initialized;
2205	p->setmintocopy_op = pcap_setmintocopy_not_initialized;
2206	p->getevent_op = pcap_getevent_not_initialized;
2207	p->oid_get_request_op = pcap_oid_get_request_not_initialized;
2208	p->oid_set_request_op = pcap_oid_set_request_not_initialized;
2209	p->sendqueue_transmit_op = pcap_sendqueue_transmit_not_initialized;
2210	p->setuserbuffer_op = pcap_setuserbuffer_not_initialized;
2211	p->live_dump_op = pcap_live_dump_not_initialized;
2212	p->live_dump_ended_op = pcap_live_dump_ended_not_initialized;
2213	p->get_airpcap_handle_op = pcap_get_airpcap_handle_not_initialized;
2214#endif
2215
2216	/*
2217	 * Default cleanup operation - implementations can override
2218	 * this, but should call pcap_cleanup_live_common() after
2219	 * doing their own additional cleanup.
2220	 */
2221	p->cleanup_op = pcap_cleanup_live_common;
2222
2223	/*
2224	 * In most cases, the standard one-shot callback can
2225	 * be used for pcap_next()/pcap_next_ex().
2226	 */
2227	p->oneshot_callback = pcap_oneshot;
2228}
2229
2230static pcap_t *
2231pcap_alloc_pcap_t(char *ebuf, size_t size)
2232{
2233	char *chunk;
2234	pcap_t *p;
2235
2236	/*
2237	 * Allocate a chunk of memory big enough for a pcap_t
2238	 * plus a structure following it of size "size".  The
2239	 * structure following it is a private data structure
2240	 * for the routines that handle this pcap_t.
2241	 *
2242	 * The structure following it must be aligned on
2243	 * the appropriate alignment boundary for this platform.
2244	 * We align on an 8-byte boundary as that's probably what
2245	 * at least some platforms do, even with 32-bit integers,
2246	 * and because we can't be sure that some values won't
2247	 * require 8-byte alignment even on platforms with 32-bit
2248	 * integers.
2249	 */
2250#define PCAP_T_ALIGNED_SIZE	((sizeof(pcap_t) + 7U) & ~0x7U)
2251	chunk = malloc(PCAP_T_ALIGNED_SIZE + size);
2252	if (chunk == NULL) {
2253		pcap_fmt_errmsg_for_errno(ebuf, PCAP_ERRBUF_SIZE,
2254		    errno, "malloc");
2255		return (NULL);
2256	}
2257	memset(chunk, 0, PCAP_T_ALIGNED_SIZE + size);
2258
2259	/*
2260	 * Get a pointer to the pcap_t at the beginning.
2261	 */
2262	p = (pcap_t *)chunk;
2263
2264#ifdef _WIN32
2265	p->handle = INVALID_HANDLE_VALUE;	/* not opened yet */
2266#else /* _WIN32 */
2267	p->fd = -1;	/* not opened yet */
2268#ifndef MSDOS
2269	p->selectable_fd = -1;
2270	p->required_select_timeout = NULL;
2271#endif /* MSDOS */
2272#endif /* _WIN32 */
2273
2274	if (size == 0) {
2275		/* No private data was requested. */
2276		p->priv = NULL;
2277	} else {
2278		/*
2279		 * Set the pointer to the private data; that's the structure
2280		 * of size "size" following the pcap_t.
2281		 */
2282		p->priv = (void *)(chunk + PCAP_T_ALIGNED_SIZE);
2283	}
2284
2285	return (p);
2286}
2287
2288pcap_t *
2289pcap_create_common(char *ebuf, size_t size)
2290{
2291	pcap_t *p;
2292
2293	p = pcap_alloc_pcap_t(ebuf, size);
2294	if (p == NULL)
2295		return (NULL);
2296
2297	/*
2298	 * Default to "can't set rfmon mode"; if it's supported by
2299	 * a platform, the create routine that called us can set
2300	 * the op to its routine to check whether a particular
2301	 * device supports it.
2302	 */
2303	p->can_set_rfmon_op = pcap_cant_set_rfmon;
2304
2305	/*
2306	 * If pcap_setnonblock() is called on a not-yet-activated
2307	 * pcap_t, default to setting a flag and turning
2308	 * on non-blocking mode when activated.
2309	 */
2310	p->setnonblock_op = pcap_setnonblock_unactivated;
2311
2312	initialize_ops(p);
2313
2314	/* put in some defaults*/
2315	p->snapshot = 0;		/* max packet size unspecified */
2316	p->opt.timeout = 0;		/* no timeout specified */
2317	p->opt.buffer_size = 0;		/* use the platform's default */
2318	p->opt.promisc = 0;
2319	p->opt.rfmon = 0;
2320	p->opt.immediate = 0;
2321	p->opt.tstamp_type = -1;	/* default to not setting time stamp type */
2322	p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
2323	/*
2324	 * Platform-dependent options.
2325	 */
2326#ifdef __linux__
2327	p->opt.protocol = 0;
2328#endif
2329#ifdef _WIN32
2330	p->opt.nocapture_local = 0;
2331#endif
2332
2333	/*
2334	 * Start out with no BPF code generation flags set.
2335	 */
2336	p->bpf_codegen_flags = 0;
2337
2338	return (p);
2339}
2340
2341int
2342pcap_check_activated(pcap_t *p)
2343{
2344	if (p->activated) {
2345		pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "can't perform "
2346			" operation on activated capture");
2347		return (-1);
2348	}
2349	return (0);
2350}
2351
2352int
2353pcap_set_snaplen(pcap_t *p, int snaplen)
2354{
2355	if (pcap_check_activated(p))
2356		return (PCAP_ERROR_ACTIVATED);
2357	p->snapshot = snaplen;
2358	return (0);
2359}
2360
2361int
2362pcap_set_promisc(pcap_t *p, int promisc)
2363{
2364	if (pcap_check_activated(p))
2365		return (PCAP_ERROR_ACTIVATED);
2366	p->opt.promisc = promisc;
2367	return (0);
2368}
2369
2370int
2371pcap_set_rfmon(pcap_t *p, int rfmon)
2372{
2373	if (pcap_check_activated(p))
2374		return (PCAP_ERROR_ACTIVATED);
2375	p->opt.rfmon = rfmon;
2376	return (0);
2377}
2378
2379int
2380pcap_set_timeout(pcap_t *p, int timeout_ms)
2381{
2382	if (pcap_check_activated(p))
2383		return (PCAP_ERROR_ACTIVATED);
2384	p->opt.timeout = timeout_ms;
2385	return (0);
2386}
2387
2388int
2389pcap_set_tstamp_type(pcap_t *p, int tstamp_type)
2390{
2391	int i;
2392
2393	if (pcap_check_activated(p))
2394		return (PCAP_ERROR_ACTIVATED);
2395
2396	/*
2397	 * The argument should have been u_int, but that's too late
2398	 * to change now - it's an API.
2399	 */
2400	if (tstamp_type < 0)
2401		return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP);
2402
2403	/*
2404	 * If p->tstamp_type_count is 0, we only support PCAP_TSTAMP_HOST;
2405	 * the default time stamp type is PCAP_TSTAMP_HOST.
2406	 */
2407	if (p->tstamp_type_count == 0) {
2408		if (tstamp_type == PCAP_TSTAMP_HOST) {
2409			p->opt.tstamp_type = tstamp_type;
2410			return (0);
2411		}
2412	} else {
2413		/*
2414		 * Check whether we claim to support this type of time stamp.
2415		 */
2416		for (i = 0; i < p->tstamp_type_count; i++) {
2417			if (p->tstamp_type_list[i] == (u_int)tstamp_type) {
2418				/*
2419				 * Yes.
2420				 */
2421				p->opt.tstamp_type = tstamp_type;
2422				return (0);
2423			}
2424		}
2425	}
2426
2427	/*
2428	 * We don't support this type of time stamp.
2429	 */
2430	return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP);
2431}
2432
2433int
2434pcap_set_immediate_mode(pcap_t *p, int immediate)
2435{
2436	if (pcap_check_activated(p))
2437		return (PCAP_ERROR_ACTIVATED);
2438	p->opt.immediate = immediate;
2439	return (0);
2440}
2441
2442int
2443pcap_set_buffer_size(pcap_t *p, int buffer_size)
2444{
2445	if (pcap_check_activated(p))
2446		return (PCAP_ERROR_ACTIVATED);
2447	if (buffer_size <= 0) {
2448		/*
2449		 * Silently ignore invalid values.
2450		 */
2451		return (0);
2452	}
2453	p->opt.buffer_size = buffer_size;
2454	return (0);
2455}
2456
2457int
2458pcap_set_tstamp_precision(pcap_t *p, int tstamp_precision)
2459{
2460	int i;
2461
2462	if (pcap_check_activated(p))
2463		return (PCAP_ERROR_ACTIVATED);
2464
2465	/*
2466	 * The argument should have been u_int, but that's too late
2467	 * to change now - it's an API.
2468	 */
2469	if (tstamp_precision < 0)
2470		return (PCAP_ERROR_TSTAMP_PRECISION_NOTSUP);
2471
2472	/*
2473	 * If p->tstamp_precision_count is 0, we only support setting
2474	 * the time stamp precision to microsecond precision; every
2475	 * pcap module *MUST* support microsecond precision, even if
2476	 * it does so by converting the native precision to
2477	 * microseconds.
2478	 */
2479	if (p->tstamp_precision_count == 0) {
2480		if (tstamp_precision == PCAP_TSTAMP_PRECISION_MICRO) {
2481			p->opt.tstamp_precision = tstamp_precision;
2482			return (0);
2483		}
2484	} else {
2485		/*
2486		 * Check whether we claim to support this precision of
2487		 * time stamp.
2488		 */
2489		for (i = 0; i < p->tstamp_precision_count; i++) {
2490			if (p->tstamp_precision_list[i] == (u_int)tstamp_precision) {
2491				/*
2492				 * Yes.
2493				 */
2494				p->opt.tstamp_precision = tstamp_precision;
2495				return (0);
2496			}
2497		}
2498	}
2499
2500	/*
2501	 * We don't support this time stamp precision.
2502	 */
2503	return (PCAP_ERROR_TSTAMP_PRECISION_NOTSUP);
2504}
2505
2506int
2507pcap_get_tstamp_precision(pcap_t *p)
2508{
2509        return (p->opt.tstamp_precision);
2510}
2511
2512int
2513pcap_activate(pcap_t *p)
2514{
2515	int status;
2516
2517	/*
2518	 * Catch attempts to re-activate an already-activated
2519	 * pcap_t; this should, for example, catch code that
2520	 * calls pcap_open_live() followed by pcap_activate(),
2521	 * as some code that showed up in a Stack Exchange
2522	 * question did.
2523	 */
2524	if (pcap_check_activated(p))
2525		return (PCAP_ERROR_ACTIVATED);
2526	status = p->activate_op(p);
2527	if (status >= 0) {
2528		/*
2529		 * If somebody requested non-blocking mode before
2530		 * calling pcap_activate(), turn it on now.
2531		 */
2532		if (p->opt.nonblock) {
2533			status = p->setnonblock_op(p, 1);
2534			if (status < 0) {
2535				/*
2536				 * Failed.  Undo everything done by
2537				 * the activate operation.
2538				 */
2539				p->cleanup_op(p);
2540				initialize_ops(p);
2541				return (status);
2542			}
2543		}
2544		p->activated = 1;
2545	} else {
2546		if (p->errbuf[0] == '\0') {
2547			/*
2548			 * No error message supplied by the activate routine;
2549			 * for the benefit of programs that don't specially
2550			 * handle errors other than PCAP_ERROR, return the
2551			 * error message corresponding to the status.
2552			 */
2553			pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s",
2554			    pcap_statustostr(status));
2555		}
2556
2557		/*
2558		 * Undo any operation pointer setting, etc. done by
2559		 * the activate operation.
2560		 */
2561		initialize_ops(p);
2562	}
2563	return (status);
2564}
2565
2566pcap_t *
2567pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf)
2568{
2569	pcap_t *p;
2570	int status;
2571#ifdef ENABLE_REMOTE
2572	char host[PCAP_BUF_SIZE + 1];
2573	char port[PCAP_BUF_SIZE + 1];
2574	char name[PCAP_BUF_SIZE + 1];
2575	int srctype;
2576
2577	/*
2578	 * A null device name is equivalent to the "any" device -
2579	 * which might not be supported on this platform, but
2580	 * this means that you'll get a "not supported" error
2581	 * rather than, say, a crash when we try to dereference
2582	 * the null pointer.
2583	 */
2584	if (device == NULL)
2585		device = "any";
2586
2587	/*
2588	 * Retrofit - we have to make older applications compatible with
2589	 * remote capture.
2590	 * So we're calling pcap_open_remote() from here; this is a very
2591	 * dirty hack.
2592	 * Obviously, we cannot exploit all the new features; for instance,
2593	 * we cannot send authentication, we cannot use a UDP data connection,
2594	 * and so on.
2595	 */
2596	if (pcap_parsesrcstr(device, &srctype, host, port, name, errbuf))
2597		return (NULL);
2598
2599	if (srctype == PCAP_SRC_IFREMOTE) {
2600		/*
2601		 * Although we already have host, port and iface, we prefer
2602		 * to pass only 'device' to pcap_open_rpcap(), so that it has
2603		 * to call pcap_parsesrcstr() again.
2604		 * This is less optimized, but much clearer.
2605		 */
2606		return (pcap_open_rpcap(device, snaplen,
2607		    promisc ? PCAP_OPENFLAG_PROMISCUOUS : 0, to_ms,
2608		    NULL, errbuf));
2609	}
2610	if (srctype == PCAP_SRC_FILE) {
2611		pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "unknown URL scheme \"file\"");
2612		return (NULL);
2613	}
2614	if (srctype == PCAP_SRC_IFLOCAL) {
2615		/*
2616		 * If it starts with rpcap://, that refers to a local device
2617		 * (no host part in the URL). Remove the rpcap://, and
2618		 * fall through to the regular open path.
2619		 */
2620		if (strncmp(device, PCAP_SRC_IF_STRING, strlen(PCAP_SRC_IF_STRING)) == 0) {
2621			size_t len = strlen(device) - strlen(PCAP_SRC_IF_STRING) + 1;
2622
2623			if (len > 0)
2624				device += strlen(PCAP_SRC_IF_STRING);
2625		}
2626	}
2627#endif	/* ENABLE_REMOTE */
2628
2629	p = pcap_create(device, errbuf);
2630	if (p == NULL)
2631		return (NULL);
2632	status = pcap_set_snaplen(p, snaplen);
2633	if (status < 0)
2634		goto fail;
2635	status = pcap_set_promisc(p, promisc);
2636	if (status < 0)
2637		goto fail;
2638	status = pcap_set_timeout(p, to_ms);
2639	if (status < 0)
2640		goto fail;
2641	/*
2642	 * Mark this as opened with pcap_open_live(), so that, for
2643	 * example, we show the full list of DLT_ values, rather
2644	 * than just the ones that are compatible with capturing
2645	 * when not in monitor mode.  That allows existing applications
2646	 * to work the way they used to work, but allows new applications
2647	 * that know about the new open API to, for example, find out the
2648	 * DLT_ values that they can select without changing whether
2649	 * the adapter is in monitor mode or not.
2650	 */
2651	p->oldstyle = 1;
2652	status = pcap_activate(p);
2653	if (status < 0)
2654		goto fail;
2655	return (p);
2656fail:
2657	if (status == PCAP_ERROR)
2658		pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %.*s", device,
2659		    PCAP_ERRBUF_SIZE - 3, p->errbuf);
2660	else if (status == PCAP_ERROR_NO_SUCH_DEVICE ||
2661	    status == PCAP_ERROR_PERM_DENIED ||
2662	    status == PCAP_ERROR_PROMISC_PERM_DENIED)
2663		pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s (%.*s)", device,
2664		    pcap_statustostr(status), PCAP_ERRBUF_SIZE - 6, p->errbuf);
2665	else
2666		pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", device,
2667		    pcap_statustostr(status));
2668	pcap_close(p);
2669	return (NULL);
2670}
2671
2672pcap_t *
2673pcap_open_offline_common(char *ebuf, size_t size)
2674{
2675	pcap_t *p;
2676
2677	p = pcap_alloc_pcap_t(ebuf, size);
2678	if (p == NULL)
2679		return (NULL);
2680
2681	p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
2682
2683	return (p);
2684}
2685
2686int
2687pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
2688{
2689	return (p->read_op(p, cnt, callback, user));
2690}
2691
2692int
2693pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
2694{
2695	register int n;
2696
2697	for (;;) {
2698		if (p->rfile != NULL) {
2699			/*
2700			 * 0 means EOF, so don't loop if we get 0.
2701			 */
2702			n = pcap_offline_read(p, cnt, callback, user);
2703		} else {
2704			/*
2705			 * XXX keep reading until we get something
2706			 * (or an error occurs)
2707			 */
2708			do {
2709				n = p->read_op(p, cnt, callback, user);
2710			} while (n == 0);
2711		}
2712		if (n <= 0)
2713			return (n);
2714		if (!PACKET_COUNT_IS_UNLIMITED(cnt)) {
2715			cnt -= n;
2716			if (cnt <= 0)
2717				return (0);
2718		}
2719	}
2720}
2721
2722/*
2723 * Force the loop in "pcap_read()" or "pcap_read_offline()" to terminate.
2724 */
2725void
2726pcap_breakloop(pcap_t *p)
2727{
2728	p->break_loop = 1;
2729}
2730
2731int
2732pcap_datalink(pcap_t *p)
2733{
2734	if (!p->activated)
2735		return (PCAP_ERROR_NOT_ACTIVATED);
2736	return (p->linktype);
2737}
2738
2739int
2740pcap_datalink_ext(pcap_t *p)
2741{
2742	if (!p->activated)
2743		return (PCAP_ERROR_NOT_ACTIVATED);
2744	return (p->linktype_ext);
2745}
2746
2747int
2748pcap_list_datalinks(pcap_t *p, int **dlt_buffer)
2749{
2750	if (!p->activated)
2751		return (PCAP_ERROR_NOT_ACTIVATED);
2752	if (p->dlt_count == 0) {
2753		/*
2754		 * We couldn't fetch the list of DLTs, which means
2755		 * this platform doesn't support changing the
2756		 * DLT for an interface.  Return a list of DLTs
2757		 * containing only the DLT this device supports.
2758		 */
2759		*dlt_buffer = (int*)malloc(sizeof(**dlt_buffer));
2760		if (*dlt_buffer == NULL) {
2761			pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
2762			    errno, "malloc");
2763			return (PCAP_ERROR);
2764		}
2765		**dlt_buffer = p->linktype;
2766		return (1);
2767	} else {
2768		*dlt_buffer = (int*)calloc(sizeof(**dlt_buffer), p->dlt_count);
2769		if (*dlt_buffer == NULL) {
2770			pcap_fmt_errmsg_for_errno(p->errbuf, sizeof(p->errbuf),
2771			    errno, "malloc");
2772			return (PCAP_ERROR);
2773		}
2774		(void)memcpy(*dlt_buffer, p->dlt_list,
2775		    sizeof(**dlt_buffer) * p->dlt_count);
2776		return (p->dlt_count);
2777	}
2778}
2779
2780/*
2781 * In Windows, you might have a library built with one version of the
2782 * C runtime library and an application built with another version of
2783 * the C runtime library, which means that the library might use one
2784 * version of malloc() and free() and the application might use another
2785 * version of malloc() and free().  If so, that means something
2786 * allocated by the library cannot be freed by the application, so we
2787 * need to have a pcap_free_datalinks() routine to free up the list
2788 * allocated by pcap_list_datalinks(), even though it's just a wrapper
2789 * around free().
2790 */
2791void
2792pcap_free_datalinks(int *dlt_list)
2793{
2794	free(dlt_list);
2795}
2796
2797int
2798pcap_set_datalink(pcap_t *p, int dlt)
2799{
2800	int i;
2801	const char *dlt_name;
2802
2803	if (dlt < 0)
2804		goto unsupported;
2805
2806	if (p->dlt_count == 0 || p->set_datalink_op == NULL) {
2807		/*
2808		 * We couldn't fetch the list of DLTs, or we don't
2809		 * have a "set datalink" operation, which means
2810		 * this platform doesn't support changing the
2811		 * DLT for an interface.  Check whether the new
2812		 * DLT is the one this interface supports.
2813		 */
2814		if (p->linktype != dlt)
2815			goto unsupported;
2816
2817		/*
2818		 * It is, so there's nothing we need to do here.
2819		 */
2820		return (0);
2821	}
2822	for (i = 0; i < p->dlt_count; i++)
2823		if (p->dlt_list[i] == (u_int)dlt)
2824			break;
2825	if (i >= p->dlt_count)
2826		goto unsupported;
2827	if (p->dlt_count == 2 && p->dlt_list[0] == DLT_EN10MB &&
2828	    dlt == DLT_DOCSIS) {
2829		/*
2830		 * This is presumably an Ethernet device, as the first
2831		 * link-layer type it offers is DLT_EN10MB, and the only
2832		 * other type it offers is DLT_DOCSIS.  That means that
2833		 * we can't tell the driver to supply DOCSIS link-layer
2834		 * headers - we're just pretending that's what we're
2835		 * getting, as, presumably, we're capturing on a dedicated
2836		 * link to a Cisco Cable Modem Termination System, and
2837		 * it's putting raw DOCSIS frames on the wire inside low-level
2838		 * Ethernet framing.
2839		 */
2840		p->linktype = dlt;
2841		return (0);
2842	}
2843	if (p->set_datalink_op(p, dlt) == -1)
2844		return (-1);
2845	p->linktype = dlt;
2846	return (0);
2847
2848unsupported:
2849	dlt_name = pcap_datalink_val_to_name(dlt);
2850	if (dlt_name != NULL) {
2851		(void) pcap_snprintf(p->errbuf, sizeof(p->errbuf),
2852		    "%s is not one of the DLTs supported by this device",
2853		    dlt_name);
2854	} else {
2855		(void) pcap_snprintf(p->errbuf, sizeof(p->errbuf),
2856		    "DLT %d is not one of the DLTs supported by this device",
2857		    dlt);
2858	}
2859	return (-1);
2860}
2861
2862/*
2863 * This array is designed for mapping upper and lower case letter
2864 * together for a case independent comparison.  The mappings are
2865 * based upon ascii character sequences.
2866 */
2867static const u_char charmap[] = {
2868	(u_char)'\000', (u_char)'\001', (u_char)'\002', (u_char)'\003',
2869	(u_char)'\004', (u_char)'\005', (u_char)'\006', (u_char)'\007',
2870	(u_char)'\010', (u_char)'\011', (u_char)'\012', (u_char)'\013',
2871	(u_char)'\014', (u_char)'\015', (u_char)'\016', (u_char)'\017',
2872	(u_char)'\020', (u_char)'\021', (u_char)'\022', (u_char)'\023',
2873	(u_char)'\024', (u_char)'\025', (u_char)'\026', (u_char)'\027',
2874	(u_char)'\030', (u_char)'\031', (u_char)'\032', (u_char)'\033',
2875	(u_char)'\034', (u_char)'\035', (u_char)'\036', (u_char)'\037',
2876	(u_char)'\040', (u_char)'\041', (u_char)'\042', (u_char)'\043',
2877	(u_char)'\044', (u_char)'\045', (u_char)'\046', (u_char)'\047',
2878	(u_char)'\050', (u_char)'\051', (u_char)'\052', (u_char)'\053',
2879	(u_char)'\054', (u_char)'\055', (u_char)'\056', (u_char)'\057',
2880	(u_char)'\060', (u_char)'\061', (u_char)'\062', (u_char)'\063',
2881	(u_char)'\064', (u_char)'\065', (u_char)'\066', (u_char)'\067',
2882	(u_char)'\070', (u_char)'\071', (u_char)'\072', (u_char)'\073',
2883	(u_char)'\074', (u_char)'\075', (u_char)'\076', (u_char)'\077',
2884	(u_char)'\100', (u_char)'\141', (u_char)'\142', (u_char)'\143',
2885	(u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
2886	(u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
2887	(u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
2888	(u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
2889	(u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
2890	(u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\133',
2891	(u_char)'\134', (u_char)'\135', (u_char)'\136', (u_char)'\137',
2892	(u_char)'\140', (u_char)'\141', (u_char)'\142', (u_char)'\143',
2893	(u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
2894	(u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
2895	(u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
2896	(u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
2897	(u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
2898	(u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\173',
2899	(u_char)'\174', (u_char)'\175', (u_char)'\176', (u_char)'\177',
2900	(u_char)'\200', (u_char)'\201', (u_char)'\202', (u_char)'\203',
2901	(u_char)'\204', (u_char)'\205', (u_char)'\206', (u_char)'\207',
2902	(u_char)'\210', (u_char)'\211', (u_char)'\212', (u_char)'\213',
2903	(u_char)'\214', (u_char)'\215', (u_char)'\216', (u_char)'\217',
2904	(u_char)'\220', (u_char)'\221', (u_char)'\222', (u_char)'\223',
2905	(u_char)'\224', (u_char)'\225', (u_char)'\226', (u_char)'\227',
2906	(u_char)'\230', (u_char)'\231', (u_char)'\232', (u_char)'\233',
2907	(u_char)'\234', (u_char)'\235', (u_char)'\236', (u_char)'\237',
2908	(u_char)'\240', (u_char)'\241', (u_char)'\242', (u_char)'\243',
2909	(u_char)'\244', (u_char)'\245', (u_char)'\246', (u_char)'\247',
2910	(u_char)'\250', (u_char)'\251', (u_char)'\252', (u_char)'\253',
2911	(u_char)'\254', (u_char)'\255', (u_char)'\256', (u_char)'\257',
2912	(u_char)'\260', (u_char)'\261', (u_char)'\262', (u_char)'\263',
2913	(u_char)'\264', (u_char)'\265', (u_char)'\266', (u_char)'\267',
2914	(u_char)'\270', (u_char)'\271', (u_char)'\272', (u_char)'\273',
2915	(u_char)'\274', (u_char)'\275', (u_char)'\276', (u_char)'\277',
2916	(u_char)'\300', (u_char)'\341', (u_char)'\342', (u_char)'\343',
2917	(u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
2918	(u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
2919	(u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
2920	(u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
2921	(u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
2922	(u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\333',
2923	(u_char)'\334', (u_char)'\335', (u_char)'\336', (u_char)'\337',
2924	(u_char)'\340', (u_char)'\341', (u_char)'\342', (u_char)'\343',
2925	(u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
2926	(u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
2927	(u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
2928	(u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
2929	(u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
2930	(u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\373',
2931	(u_char)'\374', (u_char)'\375', (u_char)'\376', (u_char)'\377',
2932};
2933
2934int
2935pcap_strcasecmp(const char *s1, const char *s2)
2936{
2937	register const u_char	*cm = charmap,
2938				*us1 = (const u_char *)s1,
2939				*us2 = (const u_char *)s2;
2940
2941	while (cm[*us1] == cm[*us2++])
2942		if (*us1++ == '\0')
2943			return(0);
2944	return (cm[*us1] - cm[*--us2]);
2945}
2946
2947struct dlt_choice {
2948	const char *name;
2949	const char *description;
2950	int	dlt;
2951};
2952
2953#define DLT_CHOICE(code, description) { #code, description, DLT_ ## code }
2954#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
2955
2956static struct dlt_choice dlt_choices[] = {
2957	DLT_CHOICE(NULL, "BSD loopback"),
2958	DLT_CHOICE(EN10MB, "Ethernet"),
2959	DLT_CHOICE(IEEE802, "Token ring"),
2960	DLT_CHOICE(ARCNET, "BSD ARCNET"),
2961	DLT_CHOICE(SLIP, "SLIP"),
2962	DLT_CHOICE(PPP, "PPP"),
2963	DLT_CHOICE(FDDI, "FDDI"),
2964	DLT_CHOICE(ATM_RFC1483, "RFC 1483 LLC-encapsulated ATM"),
2965	DLT_CHOICE(RAW, "Raw IP"),
2966	DLT_CHOICE(SLIP_BSDOS, "BSD/OS SLIP"),
2967	DLT_CHOICE(PPP_BSDOS, "BSD/OS PPP"),
2968	DLT_CHOICE(ATM_CLIP, "Linux Classical IP-over-ATM"),
2969	DLT_CHOICE(PPP_SERIAL, "PPP over serial"),
2970	DLT_CHOICE(PPP_ETHER, "PPPoE"),
2971	DLT_CHOICE(SYMANTEC_FIREWALL, "Symantec Firewall"),
2972	DLT_CHOICE(C_HDLC, "Cisco HDLC"),
2973	DLT_CHOICE(IEEE802_11, "802.11"),
2974	DLT_CHOICE(FRELAY, "Frame Relay"),
2975	DLT_CHOICE(LOOP, "OpenBSD loopback"),
2976	DLT_CHOICE(ENC, "OpenBSD encapsulated IP"),
2977	DLT_CHOICE(LINUX_SLL, "Linux cooked v1"),
2978	DLT_CHOICE(LTALK, "Localtalk"),
2979	DLT_CHOICE(PFLOG, "OpenBSD pflog file"),
2980	DLT_CHOICE(PFSYNC, "Packet filter state syncing"),
2981	DLT_CHOICE(PRISM_HEADER, "802.11 plus Prism header"),
2982	DLT_CHOICE(IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"),
2983	DLT_CHOICE(SUNATM, "Sun raw ATM"),
2984	DLT_CHOICE(IEEE802_11_RADIO, "802.11 plus radiotap header"),
2985	DLT_CHOICE(ARCNET_LINUX, "Linux ARCNET"),
2986	DLT_CHOICE(JUNIPER_MLPPP, "Juniper Multi-Link PPP"),
2987	DLT_CHOICE(JUNIPER_MLFR, "Juniper Multi-Link Frame Relay"),
2988	DLT_CHOICE(JUNIPER_ES, "Juniper Encryption Services PIC"),
2989	DLT_CHOICE(JUNIPER_GGSN, "Juniper GGSN PIC"),
2990	DLT_CHOICE(JUNIPER_MFR, "Juniper FRF.16 Frame Relay"),
2991	DLT_CHOICE(JUNIPER_ATM2, "Juniper ATM2 PIC"),
2992	DLT_CHOICE(JUNIPER_SERVICES, "Juniper Advanced Services PIC"),
2993	DLT_CHOICE(JUNIPER_ATM1, "Juniper ATM1 PIC"),
2994	DLT_CHOICE(APPLE_IP_OVER_IEEE1394, "Apple IP-over-IEEE 1394"),
2995	DLT_CHOICE(MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"),
2996	DLT_CHOICE(MTP2, "SS7 MTP2"),
2997	DLT_CHOICE(MTP3, "SS7 MTP3"),
2998	DLT_CHOICE(SCCP, "SS7 SCCP"),
2999	DLT_CHOICE(DOCSIS, "DOCSIS"),
3000	DLT_CHOICE(LINUX_IRDA, "Linux IrDA"),
3001	DLT_CHOICE(IEEE802_11_RADIO_AVS, "802.11 plus AVS radio information header"),
3002	DLT_CHOICE(JUNIPER_MONITOR, "Juniper Passive Monitor PIC"),
3003	DLT_CHOICE(BACNET_MS_TP, "BACnet MS/TP"),
3004	DLT_CHOICE(PPP_PPPD, "PPP for pppd, with direction flag"),
3005	DLT_CHOICE(JUNIPER_PPPOE, "Juniper PPPoE"),
3006	DLT_CHOICE(JUNIPER_PPPOE_ATM, "Juniper PPPoE/ATM"),
3007	DLT_CHOICE(GPRS_LLC, "GPRS LLC"),
3008	DLT_CHOICE(GPF_T, "GPF-T"),
3009	DLT_CHOICE(GPF_F, "GPF-F"),
3010	DLT_CHOICE(JUNIPER_PIC_PEER, "Juniper PIC Peer"),
3011	DLT_CHOICE(ERF_ETH, "Ethernet with Endace ERF header"),
3012	DLT_CHOICE(ERF_POS, "Packet-over-SONET with Endace ERF header"),
3013	DLT_CHOICE(LINUX_LAPD, "Linux vISDN LAPD"),
3014	DLT_CHOICE(JUNIPER_ETHER, "Juniper Ethernet"),
3015	DLT_CHOICE(JUNIPER_PPP, "Juniper PPP"),
3016	DLT_CHOICE(JUNIPER_FRELAY, "Juniper Frame Relay"),
3017	DLT_CHOICE(JUNIPER_CHDLC, "Juniper C-HDLC"),
3018	DLT_CHOICE(MFR, "FRF.16 Frame Relay"),
3019	DLT_CHOICE(JUNIPER_VP, "Juniper Voice PIC"),
3020	DLT_CHOICE(A429, "Arinc 429"),
3021	DLT_CHOICE(A653_ICM, "Arinc 653 Interpartition Communication"),
3022	DLT_CHOICE(USB_FREEBSD, "USB with FreeBSD header"),
3023	DLT_CHOICE(BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"),
3024	DLT_CHOICE(IEEE802_16_MAC_CPS, "IEEE 802.16 MAC Common Part Sublayer"),
3025	DLT_CHOICE(USB_LINUX, "USB with Linux header"),
3026	DLT_CHOICE(CAN20B, "Controller Area Network (CAN) v. 2.0B"),
3027	DLT_CHOICE(IEEE802_15_4_LINUX, "IEEE 802.15.4 with Linux padding"),
3028	DLT_CHOICE(PPI, "Per-Packet Information"),
3029	DLT_CHOICE(IEEE802_16_MAC_CPS_RADIO, "IEEE 802.16 MAC Common Part Sublayer plus radiotap header"),
3030	DLT_CHOICE(JUNIPER_ISM, "Juniper Integrated Service Module"),
3031	DLT_CHOICE(IEEE802_15_4, "IEEE 802.15.4 with FCS"),
3032	DLT_CHOICE(SITA, "SITA pseudo-header"),
3033	DLT_CHOICE(ERF, "Endace ERF header"),
3034	DLT_CHOICE(RAIF1, "Ethernet with u10 Networks pseudo-header"),
3035	DLT_CHOICE(IPMB_KONTRON, "IPMB with Kontron pseudo-header"),
3036	DLT_CHOICE(JUNIPER_ST, "Juniper Secure Tunnel"),
3037	DLT_CHOICE(BLUETOOTH_HCI_H4_WITH_PHDR, "Bluetooth HCI UART transport layer plus pseudo-header"),
3038	DLT_CHOICE(AX25_KISS, "AX.25 with KISS header"),
3039	DLT_CHOICE(IPMB_LINUX, "IPMB with Linux/Pigeon Point pseudo-header"),
3040	DLT_CHOICE(IEEE802_15_4_NONASK_PHY, "IEEE 802.15.4 with non-ASK PHY data"),
3041	DLT_CHOICE(MPLS, "MPLS with label as link-layer header"),
3042	DLT_CHOICE(LINUX_EVDEV, "Linux evdev events"),
3043	DLT_CHOICE(USB_LINUX_MMAPPED, "USB with padded Linux header"),
3044	DLT_CHOICE(DECT, "DECT"),
3045	DLT_CHOICE(AOS, "AOS Space Data Link protocol"),
3046	DLT_CHOICE(WIHART, "Wireless HART"),
3047	DLT_CHOICE(FC_2, "Fibre Channel FC-2"),
3048	DLT_CHOICE(FC_2_WITH_FRAME_DELIMS, "Fibre Channel FC-2 with frame delimiters"),
3049	DLT_CHOICE(IPNET, "Solaris ipnet"),
3050	DLT_CHOICE(CAN_SOCKETCAN, "CAN-bus with SocketCAN headers"),
3051	DLT_CHOICE(IPV4, "Raw IPv4"),
3052	DLT_CHOICE(IPV6, "Raw IPv6"),
3053	DLT_CHOICE(IEEE802_15_4_NOFCS, "IEEE 802.15.4 without FCS"),
3054	DLT_CHOICE(DBUS, "D-Bus"),
3055	DLT_CHOICE(JUNIPER_VS, "Juniper Virtual Server"),
3056	DLT_CHOICE(JUNIPER_SRX_E2E, "Juniper SRX E2E"),
3057	DLT_CHOICE(JUNIPER_FIBRECHANNEL, "Juniper Fibre Channel"),
3058	DLT_CHOICE(DVB_CI, "DVB-CI"),
3059	DLT_CHOICE(MUX27010, "MUX27010"),
3060	DLT_CHOICE(STANAG_5066_D_PDU, "STANAG 5066 D_PDUs"),
3061	DLT_CHOICE(JUNIPER_ATM_CEMIC, "Juniper ATM CEMIC"),
3062	DLT_CHOICE(NFLOG, "Linux netfilter log messages"),
3063	DLT_CHOICE(NETANALYZER, "Ethernet with Hilscher netANALYZER pseudo-header"),
3064	DLT_CHOICE(NETANALYZER_TRANSPARENT, "Ethernet with Hilscher netANALYZER pseudo-header and with preamble and SFD"),
3065	DLT_CHOICE(IPOIB, "RFC 4391 IP-over-Infiniband"),
3066	DLT_CHOICE(MPEG_2_TS, "MPEG-2 transport stream"),
3067	DLT_CHOICE(NG40, "ng40 protocol tester Iub/Iur"),
3068	DLT_CHOICE(NFC_LLCP, "NFC LLCP PDUs with pseudo-header"),
3069	DLT_CHOICE(INFINIBAND, "InfiniBand"),
3070	DLT_CHOICE(SCTP, "SCTP"),
3071	DLT_CHOICE(USBPCAP, "USB with USBPcap header"),
3072	DLT_CHOICE(RTAC_SERIAL, "Schweitzer Engineering Laboratories RTAC packets"),
3073	DLT_CHOICE(BLUETOOTH_LE_LL, "Bluetooth Low Energy air interface"),
3074	DLT_CHOICE(NETLINK, "Linux netlink"),
3075	DLT_CHOICE(BLUETOOTH_LINUX_MONITOR, "Bluetooth Linux Monitor"),
3076	DLT_CHOICE(BLUETOOTH_BREDR_BB, "Bluetooth Basic Rate/Enhanced Data Rate baseband packets"),
3077	DLT_CHOICE(BLUETOOTH_LE_LL_WITH_PHDR, "Bluetooth Low Energy air interface with pseudo-header"),
3078	DLT_CHOICE(PROFIBUS_DL, "PROFIBUS data link layer"),
3079	DLT_CHOICE(PKTAP, "Apple DLT_PKTAP"),
3080	DLT_CHOICE(EPON, "Ethernet with 802.3 Clause 65 EPON preamble"),
3081	DLT_CHOICE(IPMI_HPM_2, "IPMI trace packets"),
3082	DLT_CHOICE(ZWAVE_R1_R2, "Z-Wave RF profile R1 and R2 packets"),
3083	DLT_CHOICE(ZWAVE_R3, "Z-Wave RF profile R3 packets"),
3084	DLT_CHOICE(WATTSTOPPER_DLM, "WattStopper Digital Lighting Management (DLM) and Legrand Nitoo Open protocol"),
3085	DLT_CHOICE(ISO_14443, "ISO 14443 messages"),
3086	DLT_CHOICE(RDS, "IEC 62106 Radio Data System groups"),
3087	DLT_CHOICE(USB_DARWIN, "USB with Darwin header"),
3088	DLT_CHOICE(OPENFLOW, "OpenBSD DLT_OPENFLOW"),
3089	DLT_CHOICE(SDLC, "IBM SDLC frames"),
3090	DLT_CHOICE(TI_LLN_SNIFFER, "TI LLN sniffer frames"),
3091	DLT_CHOICE(VSOCK, "Linux vsock"),
3092	DLT_CHOICE(NORDIC_BLE, "Nordic Semiconductor Bluetooth LE sniffer frames"),
3093	DLT_CHOICE(DOCSIS31_XRA31, "Excentis XRA-31 DOCSIS 3.1 RF sniffer frames"),
3094	DLT_CHOICE(ETHERNET_MPACKET, "802.3br mPackets"),
3095	DLT_CHOICE(DISPLAYPORT_AUX, "DisplayPort AUX channel monitoring data"),
3096	DLT_CHOICE(LINUX_SLL2, "Linux cooked v2"),
3097	DLT_CHOICE_SENTINEL
3098};
3099
3100int
3101pcap_datalink_name_to_val(const char *name)
3102{
3103	int i;
3104
3105	for (i = 0; dlt_choices[i].name != NULL; i++) {
3106		if (pcap_strcasecmp(dlt_choices[i].name, name) == 0)
3107			return (dlt_choices[i].dlt);
3108	}
3109	return (-1);
3110}
3111
3112const char *
3113pcap_datalink_val_to_name(int dlt)
3114{
3115	int i;
3116
3117	for (i = 0; dlt_choices[i].name != NULL; i++) {
3118		if (dlt_choices[i].dlt == dlt)
3119			return (dlt_choices[i].name);
3120	}
3121	return (NULL);
3122}
3123
3124const char *
3125pcap_datalink_val_to_description(int dlt)
3126{
3127	int i;
3128
3129	for (i = 0; dlt_choices[i].name != NULL; i++) {
3130		if (dlt_choices[i].dlt == dlt)
3131			return (dlt_choices[i].description);
3132	}
3133	return (NULL);
3134}
3135
3136const char *
3137pcap_datalink_val_to_description_or_dlt(int dlt)
3138{
3139        static char unkbuf[40];
3140        const char *description;
3141
3142        description = pcap_datalink_val_to_description(dlt);
3143        if (description != NULL) {
3144                return description;
3145        } else {
3146                (void)pcap_snprintf(unkbuf, sizeof(unkbuf), "DLT %u", dlt);
3147                return unkbuf;
3148        }
3149}
3150
3151struct tstamp_type_choice {
3152	const char *name;
3153	const char *description;
3154	int	type;
3155};
3156
3157static struct tstamp_type_choice tstamp_type_choices[] = {
3158	{ "host", "Host", PCAP_TSTAMP_HOST },
3159	{ "host_lowprec", "Host, low precision", PCAP_TSTAMP_HOST_LOWPREC },
3160	{ "host_hiprec", "Host, high precision", PCAP_TSTAMP_HOST_HIPREC },
3161	{ "adapter", "Adapter", PCAP_TSTAMP_ADAPTER },
3162	{ "adapter_unsynced", "Adapter, not synced with system time", PCAP_TSTAMP_ADAPTER_UNSYNCED },
3163	{ NULL, NULL, 0 }
3164};
3165
3166int
3167pcap_tstamp_type_name_to_val(const char *name)
3168{
3169	int i;
3170
3171	for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
3172		if (pcap_strcasecmp(tstamp_type_choices[i].name, name) == 0)
3173			return (tstamp_type_choices[i].type);
3174	}
3175	return (PCAP_ERROR);
3176}
3177
3178const char *
3179pcap_tstamp_type_val_to_name(int tstamp_type)
3180{
3181	int i;
3182
3183	for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
3184		if (tstamp_type_choices[i].type == tstamp_type)
3185			return (tstamp_type_choices[i].name);
3186	}
3187	return (NULL);
3188}
3189
3190const char *
3191pcap_tstamp_type_val_to_description(int tstamp_type)
3192{
3193	int i;
3194
3195	for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
3196		if (tstamp_type_choices[i].type == tstamp_type)
3197			return (tstamp_type_choices[i].description);
3198	}
3199	return (NULL);
3200}
3201
3202int
3203pcap_snapshot(pcap_t *p)
3204{
3205	if (!p->activated)
3206		return (PCAP_ERROR_NOT_ACTIVATED);
3207	return (p->snapshot);
3208}
3209
3210int
3211pcap_is_swapped(pcap_t *p)
3212{
3213	if (!p->activated)
3214		return (PCAP_ERROR_NOT_ACTIVATED);
3215	return (p->swapped);
3216}
3217
3218int
3219pcap_major_version(pcap_t *p)
3220{
3221	if (!p->activated)
3222		return (PCAP_ERROR_NOT_ACTIVATED);
3223	return (p->version_major);
3224}
3225
3226int
3227pcap_minor_version(pcap_t *p)
3228{
3229	if (!p->activated)
3230		return (PCAP_ERROR_NOT_ACTIVATED);
3231	return (p->version_minor);
3232}
3233
3234int
3235pcap_bufsize(pcap_t *p)
3236{
3237	if (!p->activated)
3238		return (PCAP_ERROR_NOT_ACTIVATED);
3239	return (p->bufsize);
3240}
3241
3242FILE *
3243pcap_file(pcap_t *p)
3244{
3245	return (p->rfile);
3246}
3247
3248int
3249pcap_fileno(pcap_t *p)
3250{
3251#ifndef _WIN32
3252	return (p->fd);
3253#else
3254	if (p->handle != INVALID_HANDLE_VALUE)
3255		return ((int)(DWORD)p->handle);
3256	else
3257		return (PCAP_ERROR);
3258#endif
3259}
3260
3261#if !defined(_WIN32) && !defined(MSDOS)
3262int
3263pcap_get_selectable_fd(pcap_t *p)
3264{
3265	return (p->selectable_fd);
3266}
3267
3268struct timeval *
3269pcap_get_required_select_timeout(pcap_t *p)
3270{
3271	return (p->required_select_timeout);
3272}
3273#endif
3274
3275void
3276pcap_perror(pcap_t *p, const char *prefix)
3277{
3278	fprintf(stderr, "%s: %s\n", prefix, p->errbuf);
3279}
3280
3281char *
3282pcap_geterr(pcap_t *p)
3283{
3284	return (p->errbuf);
3285}
3286
3287int
3288pcap_getnonblock(pcap_t *p, char *errbuf)
3289{
3290	int ret;
3291
3292	ret = p->getnonblock_op(p);
3293	if (ret == -1) {
3294		/*
3295		 * The get nonblock operation sets p->errbuf; this
3296		 * function *shouldn't* have had a separate errbuf
3297		 * argument, as it didn't need one, but I goofed
3298		 * when adding it.
3299		 *
3300		 * We copy the error message to errbuf, so callers
3301		 * can find it in either place.
3302		 */
3303		pcap_strlcpy(errbuf, p->errbuf, PCAP_ERRBUF_SIZE);
3304	}
3305	return (ret);
3306}
3307
3308/*
3309 * Get the current non-blocking mode setting, under the assumption that
3310 * it's just the standard POSIX non-blocking flag.
3311 */
3312#if !defined(_WIN32) && !defined(MSDOS)
3313int
3314pcap_getnonblock_fd(pcap_t *p)
3315{
3316	int fdflags;
3317
3318	fdflags = fcntl(p->fd, F_GETFL, 0);
3319	if (fdflags == -1) {
3320		pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
3321		    errno, "F_GETFL");
3322		return (-1);
3323	}
3324	if (fdflags & O_NONBLOCK)
3325		return (1);
3326	else
3327		return (0);
3328}
3329#endif
3330
3331int
3332pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf)
3333{
3334	int ret;
3335
3336	ret = p->setnonblock_op(p, nonblock);
3337	if (ret == -1) {
3338		/*
3339		 * The set nonblock operation sets p->errbuf; this
3340		 * function *shouldn't* have had a separate errbuf
3341		 * argument, as it didn't need one, but I goofed
3342		 * when adding it.
3343		 *
3344		 * We copy the error message to errbuf, so callers
3345		 * can find it in either place.
3346		 */
3347		pcap_strlcpy(errbuf, p->errbuf, PCAP_ERRBUF_SIZE);
3348	}
3349	return (ret);
3350}
3351
3352#if !defined(_WIN32) && !defined(MSDOS)
3353/*
3354 * Set non-blocking mode, under the assumption that it's just the
3355 * standard POSIX non-blocking flag.  (This can be called by the
3356 * per-platform non-blocking-mode routine if that routine also
3357 * needs to do some additional work.)
3358 */
3359int
3360pcap_setnonblock_fd(pcap_t *p, int nonblock)
3361{
3362	int fdflags;
3363
3364	fdflags = fcntl(p->fd, F_GETFL, 0);
3365	if (fdflags == -1) {
3366		pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
3367		    errno, "F_GETFL");
3368		return (-1);
3369	}
3370	if (nonblock)
3371		fdflags |= O_NONBLOCK;
3372	else
3373		fdflags &= ~O_NONBLOCK;
3374	if (fcntl(p->fd, F_SETFL, fdflags) == -1) {
3375		pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
3376		    errno, "F_SETFL");
3377		return (-1);
3378	}
3379	return (0);
3380}
3381#endif
3382
3383/*
3384 * Generate error strings for PCAP_ERROR_ and PCAP_WARNING_ values.
3385 */
3386const char *
3387pcap_statustostr(int errnum)
3388{
3389	static char ebuf[15+10+1];
3390
3391	switch (errnum) {
3392
3393	case PCAP_WARNING:
3394		return("Generic warning");
3395
3396	case PCAP_WARNING_TSTAMP_TYPE_NOTSUP:
3397		return ("That type of time stamp is not supported by that device");
3398
3399	case PCAP_WARNING_PROMISC_NOTSUP:
3400		return ("That device doesn't support promiscuous mode");
3401
3402	case PCAP_ERROR:
3403		return("Generic error");
3404
3405	case PCAP_ERROR_BREAK:
3406		return("Loop terminated by pcap_breakloop");
3407
3408	case PCAP_ERROR_NOT_ACTIVATED:
3409		return("The pcap_t has not been activated");
3410
3411	case PCAP_ERROR_ACTIVATED:
3412		return ("The setting can't be changed after the pcap_t is activated");
3413
3414	case PCAP_ERROR_NO_SUCH_DEVICE:
3415		return ("No such device exists");
3416
3417	case PCAP_ERROR_RFMON_NOTSUP:
3418		return ("That device doesn't support monitor mode");
3419
3420	case PCAP_ERROR_NOT_RFMON:
3421		return ("That operation is supported only in monitor mode");
3422
3423	case PCAP_ERROR_PERM_DENIED:
3424		return ("You don't have permission to capture on that device");
3425
3426	case PCAP_ERROR_IFACE_NOT_UP:
3427		return ("That device is not up");
3428
3429	case PCAP_ERROR_CANTSET_TSTAMP_TYPE:
3430		return ("That device doesn't support setting the time stamp type");
3431
3432	case PCAP_ERROR_PROMISC_PERM_DENIED:
3433		return ("You don't have permission to capture in promiscuous mode on that device");
3434
3435	case PCAP_ERROR_TSTAMP_PRECISION_NOTSUP:
3436		return ("That device doesn't support that time stamp precision");
3437	}
3438	(void)pcap_snprintf(ebuf, sizeof ebuf, "Unknown error: %d", errnum);
3439	return(ebuf);
3440}
3441
3442/*
3443 * Not all systems have strerror().
3444 */
3445const char *
3446pcap_strerror(int errnum)
3447{
3448#ifdef HAVE_STRERROR
3449#ifdef _WIN32
3450	static char errbuf[PCAP_ERRBUF_SIZE];
3451	errno_t err = strerror_s(errbuf, PCAP_ERRBUF_SIZE, errnum);
3452
3453	if (err != 0) /* err = 0 if successful */
3454		pcap_strlcpy(errbuf, "strerror_s() error", PCAP_ERRBUF_SIZE);
3455	return (errbuf);
3456#else
3457	return (strerror(errnum));
3458#endif /* _WIN32 */
3459#else
3460	extern int sys_nerr;
3461	extern const char *const sys_errlist[];
3462	static char errbuf[PCAP_ERRBUF_SIZE];
3463
3464	if ((unsigned int)errnum < sys_nerr)
3465		return ((char *)sys_errlist[errnum]);
3466	(void)pcap_snprintf(errbuf, sizeof errbuf, "Unknown error: %d", errnum);
3467	return (errbuf);
3468#endif
3469}
3470
3471int
3472pcap_setfilter(pcap_t *p, struct bpf_program *fp)
3473{
3474	return (p->setfilter_op(p, fp));
3475}
3476
3477/*
3478 * Set direction flag, which controls whether we accept only incoming
3479 * packets, only outgoing packets, or both.
3480 * Note that, depending on the platform, some or all direction arguments
3481 * might not be supported.
3482 */
3483int
3484pcap_setdirection(pcap_t *p, pcap_direction_t d)
3485{
3486	if (p->setdirection_op == NULL) {
3487		pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3488		    "Setting direction is not implemented on this platform");
3489		return (-1);
3490	} else
3491		return (p->setdirection_op(p, d));
3492}
3493
3494int
3495pcap_stats(pcap_t *p, struct pcap_stat *ps)
3496{
3497	return (p->stats_op(p, ps));
3498}
3499
3500#ifdef _WIN32
3501struct pcap_stat *
3502pcap_stats_ex(pcap_t *p, int *pcap_stat_size)
3503{
3504	return (p->stats_ex_op(p, pcap_stat_size));
3505}
3506
3507int
3508pcap_setbuff(pcap_t *p, int dim)
3509{
3510	return (p->setbuff_op(p, dim));
3511}
3512
3513int
3514pcap_setmode(pcap_t *p, int mode)
3515{
3516	return (p->setmode_op(p, mode));
3517}
3518
3519int
3520pcap_setmintocopy(pcap_t *p, int size)
3521{
3522	return (p->setmintocopy_op(p, size));
3523}
3524
3525HANDLE
3526pcap_getevent(pcap_t *p)
3527{
3528	return (p->getevent_op(p));
3529}
3530
3531int
3532pcap_oid_get_request(pcap_t *p, bpf_u_int32 oid, void *data, size_t *lenp)
3533{
3534	return (p->oid_get_request_op(p, oid, data, lenp));
3535}
3536
3537int
3538pcap_oid_set_request(pcap_t *p, bpf_u_int32 oid, const void *data, size_t *lenp)
3539{
3540	return (p->oid_set_request_op(p, oid, data, lenp));
3541}
3542
3543pcap_send_queue *
3544pcap_sendqueue_alloc(u_int memsize)
3545{
3546	pcap_send_queue *tqueue;
3547
3548	/* Allocate the queue */
3549	tqueue = (pcap_send_queue *)malloc(sizeof(pcap_send_queue));
3550	if (tqueue == NULL){
3551		return (NULL);
3552	}
3553
3554	/* Allocate the buffer */
3555	tqueue->buffer = (char *)malloc(memsize);
3556	if (tqueue->buffer == NULL) {
3557		free(tqueue);
3558		return (NULL);
3559	}
3560
3561	tqueue->maxlen = memsize;
3562	tqueue->len = 0;
3563
3564	return (tqueue);
3565}
3566
3567void
3568pcap_sendqueue_destroy(pcap_send_queue *queue)
3569{
3570	free(queue->buffer);
3571	free(queue);
3572}
3573
3574int
3575pcap_sendqueue_queue(pcap_send_queue *queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
3576{
3577	if (queue->len + sizeof(struct pcap_pkthdr) + pkt_header->caplen > queue->maxlen){
3578		return (-1);
3579	}
3580
3581	/* Copy the pcap_pkthdr header*/
3582	memcpy(queue->buffer + queue->len, pkt_header, sizeof(struct pcap_pkthdr));
3583	queue->len += sizeof(struct pcap_pkthdr);
3584
3585	/* copy the packet */
3586	memcpy(queue->buffer + queue->len, pkt_data, pkt_header->caplen);
3587	queue->len += pkt_header->caplen;
3588
3589	return (0);
3590}
3591
3592u_int
3593pcap_sendqueue_transmit(pcap_t *p, pcap_send_queue *queue, int sync)
3594{
3595	return (p->sendqueue_transmit_op(p, queue, sync));
3596}
3597
3598int
3599pcap_setuserbuffer(pcap_t *p, int size)
3600{
3601	return (p->setuserbuffer_op(p, size));
3602}
3603
3604int
3605pcap_live_dump(pcap_t *p, char *filename, int maxsize, int maxpacks)
3606{
3607	return (p->live_dump_op(p, filename, maxsize, maxpacks));
3608}
3609
3610int
3611pcap_live_dump_ended(pcap_t *p, int sync)
3612{
3613	return (p->live_dump_ended_op(p, sync));
3614}
3615
3616PAirpcapHandle
3617pcap_get_airpcap_handle(pcap_t *p)
3618{
3619	PAirpcapHandle handle;
3620
3621	handle = p->get_airpcap_handle_op(p);
3622	if (handle == NULL) {
3623		(void)pcap_snprintf(p->errbuf, sizeof(p->errbuf),
3624		    "This isn't an AirPcap device");
3625	}
3626	return (handle);
3627}
3628#endif
3629
3630/*
3631 * On some platforms, we need to clean up promiscuous or monitor mode
3632 * when we close a device - and we want that to happen even if the
3633 * application just exits without explicitl closing devices.
3634 * On those platforms, we need to register a "close all the pcaps"
3635 * routine to be called when we exit, and need to maintain a list of
3636 * pcaps that need to be closed to clean up modes.
3637 *
3638 * XXX - not thread-safe.
3639 */
3640
3641/*
3642 * List of pcaps on which we've done something that needs to be
3643 * cleaned up.
3644 * If there are any such pcaps, we arrange to call "pcap_close_all()"
3645 * when we exit, and have it close all of them.
3646 */
3647static struct pcap *pcaps_to_close;
3648
3649/*
3650 * TRUE if we've already called "atexit()" to cause "pcap_close_all()" to
3651 * be called on exit.
3652 */
3653static int did_atexit;
3654
3655static void
3656pcap_close_all(void)
3657{
3658	struct pcap *handle;
3659
3660	while ((handle = pcaps_to_close) != NULL)
3661		pcap_close(handle);
3662}
3663
3664int
3665pcap_do_addexit(pcap_t *p)
3666{
3667	/*
3668	 * If we haven't already done so, arrange to have
3669	 * "pcap_close_all()" called when we exit.
3670	 */
3671	if (!did_atexit) {
3672		if (atexit(pcap_close_all) != 0) {
3673			/*
3674			 * "atexit()" failed; let our caller know.
3675			 */
3676			pcap_strlcpy(p->errbuf, "atexit failed", PCAP_ERRBUF_SIZE);
3677			return (0);
3678		}
3679		did_atexit = 1;
3680	}
3681	return (1);
3682}
3683
3684void
3685pcap_add_to_pcaps_to_close(pcap_t *p)
3686{
3687	p->next = pcaps_to_close;
3688	pcaps_to_close = p;
3689}
3690
3691void
3692pcap_remove_from_pcaps_to_close(pcap_t *p)
3693{
3694	pcap_t *pc, *prevpc;
3695
3696	for (pc = pcaps_to_close, prevpc = NULL; pc != NULL;
3697	    prevpc = pc, pc = pc->next) {
3698		if (pc == p) {
3699			/*
3700			 * Found it.  Remove it from the list.
3701			 */
3702			if (prevpc == NULL) {
3703				/*
3704				 * It was at the head of the list.
3705				 */
3706				pcaps_to_close = pc->next;
3707			} else {
3708				/*
3709				 * It was in the middle of the list.
3710				 */
3711				prevpc->next = pc->next;
3712			}
3713			break;
3714		}
3715	}
3716}
3717
3718void
3719pcap_cleanup_live_common(pcap_t *p)
3720{
3721	if (p->buffer != NULL) {
3722		free(p->buffer);
3723		p->buffer = NULL;
3724	}
3725	if (p->dlt_list != NULL) {
3726		free(p->dlt_list);
3727		p->dlt_list = NULL;
3728		p->dlt_count = 0;
3729	}
3730	if (p->tstamp_type_list != NULL) {
3731		free(p->tstamp_type_list);
3732		p->tstamp_type_list = NULL;
3733		p->tstamp_type_count = 0;
3734	}
3735	if (p->tstamp_precision_list != NULL) {
3736		free(p->tstamp_precision_list);
3737		p->tstamp_precision_list = NULL;
3738		p->tstamp_precision_count = 0;
3739	}
3740	pcap_freecode(&p->fcode);
3741#if !defined(_WIN32) && !defined(MSDOS)
3742	if (p->fd >= 0) {
3743		close(p->fd);
3744		p->fd = -1;
3745	}
3746	p->selectable_fd = -1;
3747#endif
3748}
3749
3750/*
3751 * API compatible with WinPcap's "send a packet" routine - returns -1
3752 * on error, 0 otherwise.
3753 *
3754 * XXX - what if we get a short write?
3755 */
3756int
3757pcap_sendpacket(pcap_t *p, const u_char *buf, int size)
3758{
3759	if (p->inject_op(p, buf, size) == -1)
3760		return (-1);
3761	return (0);
3762}
3763
3764/*
3765 * API compatible with OpenBSD's "send a packet" routine - returns -1 on
3766 * error, number of bytes written otherwise.
3767 */
3768int
3769pcap_inject(pcap_t *p, const void *buf, size_t size)
3770{
3771	return (p->inject_op(p, buf, size));
3772}
3773
3774void
3775pcap_close(pcap_t *p)
3776{
3777	if (p->opt.device != NULL)
3778		free(p->opt.device);
3779	p->cleanup_op(p);
3780	free(p);
3781}
3782
3783/*
3784 * Given a BPF program, a pcap_pkthdr structure for a packet, and the raw
3785 * data for the packet, check whether the packet passes the filter.
3786 * Returns the return value of the filter program, which will be zero if
3787 * the packet doesn't pass and non-zero if the packet does pass.
3788 */
3789int
3790pcap_offline_filter(const struct bpf_program *fp, const struct pcap_pkthdr *h,
3791    const u_char *pkt)
3792{
3793	const struct bpf_insn *fcode = fp->bf_insns;
3794
3795	if (fcode != NULL)
3796		return (bpf_filter(fcode, pkt, h->len, h->caplen));
3797	else
3798		return (0);
3799}
3800
3801static int
3802pcap_can_set_rfmon_dead(pcap_t *p)
3803{
3804	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3805	    "Rfmon mode doesn't apply on a pcap_open_dead pcap_t");
3806	return (PCAP_ERROR);
3807}
3808
3809static int
3810pcap_read_dead(pcap_t *p, int cnt _U_, pcap_handler callback _U_,
3811    u_char *user _U_)
3812{
3813	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3814	    "Packets aren't available from a pcap_open_dead pcap_t");
3815	return (-1);
3816}
3817
3818static int
3819pcap_inject_dead(pcap_t *p, const void *buf _U_, size_t size _U_)
3820{
3821	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3822	    "Packets can't be sent on a pcap_open_dead pcap_t");
3823	return (-1);
3824}
3825
3826static int
3827pcap_setfilter_dead(pcap_t *p, struct bpf_program *fp _U_)
3828{
3829	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3830	    "A filter cannot be set on a pcap_open_dead pcap_t");
3831	return (-1);
3832}
3833
3834static int
3835pcap_setdirection_dead(pcap_t *p, pcap_direction_t d _U_)
3836{
3837	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3838	    "The packet direction cannot be set on a pcap_open_dead pcap_t");
3839	return (-1);
3840}
3841
3842static int
3843pcap_set_datalink_dead(pcap_t *p, int dlt _U_)
3844{
3845	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3846	    "The link-layer header type cannot be set on a pcap_open_dead pcap_t");
3847	return (-1);
3848}
3849
3850static int
3851pcap_getnonblock_dead(pcap_t *p)
3852{
3853	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3854	    "A pcap_open_dead pcap_t does not have a non-blocking mode setting");
3855	return (-1);
3856}
3857
3858static int
3859pcap_setnonblock_dead(pcap_t *p, int nonblock _U_)
3860{
3861	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3862	    "A pcap_open_dead pcap_t does not have a non-blocking mode setting");
3863	return (-1);
3864}
3865
3866static int
3867pcap_stats_dead(pcap_t *p, struct pcap_stat *ps _U_)
3868{
3869	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3870	    "Statistics aren't available from a pcap_open_dead pcap_t");
3871	return (-1);
3872}
3873
3874#ifdef _WIN32
3875struct pcap_stat *
3876pcap_stats_ex_dead(pcap_t *p, int *pcap_stat_size _U_)
3877{
3878	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3879	    "Statistics aren't available from a pcap_open_dead pcap_t");
3880	return (NULL);
3881}
3882
3883static int
3884pcap_setbuff_dead(pcap_t *p, int dim)
3885{
3886	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3887	    "The kernel buffer size cannot be set on a pcap_open_dead pcap_t");
3888	return (-1);
3889}
3890
3891static int
3892pcap_setmode_dead(pcap_t *p, int mode)
3893{
3894	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3895	    "impossible to set mode on a pcap_open_dead pcap_t");
3896	return (-1);
3897}
3898
3899static int
3900pcap_setmintocopy_dead(pcap_t *p, int size)
3901{
3902	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3903	    "The mintocopy parameter cannot be set on a pcap_open_dead pcap_t");
3904	return (-1);
3905}
3906
3907static HANDLE
3908pcap_getevent_dead(pcap_t *p)
3909{
3910	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3911	    "A pcap_open_dead pcap_t has no event handle");
3912	return (INVALID_HANDLE_VALUE);
3913}
3914
3915static int
3916pcap_oid_get_request_dead(pcap_t *p, bpf_u_int32 oid _U_, void *data _U_,
3917    size_t *lenp _U_)
3918{
3919	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3920	    "An OID get request cannot be performed on a pcap_open_dead pcap_t");
3921	return (PCAP_ERROR);
3922}
3923
3924static int
3925pcap_oid_set_request_dead(pcap_t *p, bpf_u_int32 oid _U_, const void *data _U_,
3926    size_t *lenp _U_)
3927{
3928	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3929	    "An OID set request cannot be performed on a pcap_open_dead pcap_t");
3930	return (PCAP_ERROR);
3931}
3932
3933static u_int
3934pcap_sendqueue_transmit_dead(pcap_t *p, pcap_send_queue *queue, int sync)
3935{
3936	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3937	    "Packets cannot be transmitted on a pcap_open_dead pcap_t");
3938	return (0);
3939}
3940
3941static int
3942pcap_setuserbuffer_dead(pcap_t *p, int size)
3943{
3944	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3945	    "The user buffer cannot be set on a pcap_open_dead pcap_t");
3946	return (-1);
3947}
3948
3949static int
3950pcap_live_dump_dead(pcap_t *p, char *filename, int maxsize, int maxpacks)
3951{
3952	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3953	    "Live packet dumping cannot be performed on a pcap_open_dead pcap_t");
3954	return (-1);
3955}
3956
3957static int
3958pcap_live_dump_ended_dead(pcap_t *p, int sync)
3959{
3960	pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
3961	    "Live packet dumping cannot be performed on a pcap_open_dead pcap_t");
3962	return (-1);
3963}
3964
3965static PAirpcapHandle
3966pcap_get_airpcap_handle_dead(pcap_t *p)
3967{
3968	return (NULL);
3969}
3970#endif /* _WIN32 */
3971
3972static void
3973pcap_cleanup_dead(pcap_t *p _U_)
3974{
3975	/* Nothing to do. */
3976}
3977
3978pcap_t *
3979pcap_open_dead_with_tstamp_precision(int linktype, int snaplen, u_int precision)
3980{
3981	pcap_t *p;
3982
3983	switch (precision) {
3984
3985	case PCAP_TSTAMP_PRECISION_MICRO:
3986	case PCAP_TSTAMP_PRECISION_NANO:
3987		break;
3988
3989	default:
3990		/*
3991		 * This doesn't really matter, but we don't have any way
3992		 * to report particular errors, so the only failure we
3993		 * should have is a memory allocation failure.  Just
3994		 * pick microsecond precision.
3995		 */
3996		precision = PCAP_TSTAMP_PRECISION_MICRO;
3997		break;
3998	}
3999	p = malloc(sizeof(*p));
4000	if (p == NULL)
4001		return NULL;
4002	memset (p, 0, sizeof(*p));
4003	p->snapshot = snaplen;
4004	p->linktype = linktype;
4005	p->opt.tstamp_precision = precision;
4006	p->can_set_rfmon_op = pcap_can_set_rfmon_dead;
4007	p->read_op = pcap_read_dead;
4008	p->inject_op = pcap_inject_dead;
4009	p->setfilter_op = pcap_setfilter_dead;
4010	p->setdirection_op = pcap_setdirection_dead;
4011	p->set_datalink_op = pcap_set_datalink_dead;
4012	p->getnonblock_op = pcap_getnonblock_dead;
4013	p->setnonblock_op = pcap_setnonblock_dead;
4014	p->stats_op = pcap_stats_dead;
4015#ifdef _WIN32
4016	p->stats_ex_op = pcap_stats_ex_dead;
4017	p->setbuff_op = pcap_setbuff_dead;
4018	p->setmode_op = pcap_setmode_dead;
4019	p->setmintocopy_op = pcap_setmintocopy_dead;
4020	p->getevent_op = pcap_getevent_dead;
4021	p->oid_get_request_op = pcap_oid_get_request_dead;
4022	p->oid_set_request_op = pcap_oid_set_request_dead;
4023	p->sendqueue_transmit_op = pcap_sendqueue_transmit_dead;
4024	p->setuserbuffer_op = pcap_setuserbuffer_dead;
4025	p->live_dump_op = pcap_live_dump_dead;
4026	p->live_dump_ended_op = pcap_live_dump_ended_dead;
4027	p->get_airpcap_handle_op = pcap_get_airpcap_handle_dead;
4028#endif
4029	p->cleanup_op = pcap_cleanup_dead;
4030
4031	/*
4032	 * A "dead" pcap_t never requires special BPF code generation.
4033	 */
4034	p->bpf_codegen_flags = 0;
4035
4036	p->activated = 1;
4037	return (p);
4038}
4039
4040pcap_t *
4041pcap_open_dead(int linktype, int snaplen)
4042{
4043	return (pcap_open_dead_with_tstamp_precision(linktype, snaplen,
4044	    PCAP_TSTAMP_PRECISION_MICRO));
4045}
4046
4047#ifdef YYDEBUG
4048/*
4049 * Set the internal "debug printout" flag for the filter expression parser.
4050 * The code to print that stuff is present only if YYDEBUG is defined, so
4051 * the flag, and the routine to set it, are defined only if YYDEBUG is
4052 * defined.
4053 *
4054 * This is intended for libpcap developers, not for general use.
4055 * If you want to set these in a program, you'll have to declare this
4056 * routine yourself, with the appropriate DLL import attribute on Windows;
4057 * it's not declared in any header file, and won't be declared in any
4058 * header file provided by libpcap.
4059 */
4060PCAP_API void pcap_set_parser_debug(int value);
4061
4062PCAP_API_DEF void
4063pcap_set_parser_debug(int value)
4064{
4065	pcap_debug = value;
4066}
4067#endif
4068