1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * distributions including binary code include the above copyright notice and
9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * features or use of this software display the following acknowledgement:
12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ``This product includes software developed by the University of California,
13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the University nor the names of its contributors may be used to endorse
15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * or promote products derived from this software without specific prior
16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * written permission.
17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Name to id translation routines used by the scanner.
22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * These functions are not time critical.
23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H
26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h"
27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef DECNETLIB
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <netdnet/dnetdb.h>
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
34965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#ifdef _WIN32
35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pcap-stdinc.h>
36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
37965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#ifdef INET6
38965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes/*
39965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * To quote the MSDN page for getaddrinfo() at
40965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes *
41965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes *    https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx
42965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes *
43965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * "Support for getaddrinfo on Windows 2000 and older versions
44965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * The getaddrinfo function was added to the Ws2_32.dll on Windows XP and
45965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * later. To execute an application that uses this function on earlier
46965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * versions of Windows, then you need to include the Ws2tcpip.h and
47965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Wspiapi.h files. When the Wspiapi.h include file is added, the
48965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * getaddrinfo function is defined to the WspiapiGetAddrInfo inline
49965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * function in the Wspiapi.h file. At runtime, the WspiapiGetAddrInfo
50965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * function is implemented in such a way that if the Ws2_32.dll or the
51965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Wship6.dll (the file containing getaddrinfo in the IPv6 Technology
52965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Preview for Windows 2000) does not include getaddrinfo, then a
53965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * version of getaddrinfo is implemented inline based on code in the
54965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Wspiapi.h header file. This inline code will be used on older Windows
55965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * platforms that do not natively support the getaddrinfo function."
56965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes *
57965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * We use getaddrinfo(), so we include Wspiapi.h here.  pcap-stdinc.h
58965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * includes Ws2tcpip.h, so we don't need to include it ourselves.
59965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes */
60965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#include <Wspiapi.h>
61965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#endif
62965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes
63965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#else /* _WIN32 */
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/param.h>
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h>				/* concession to AIX */
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h>
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/time.h>
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h>
71965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#endif /* _WIN32 */
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
73965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#ifndef _WIN32
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_ETHER_HOSTTON
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - do we need any of this if <netinet/if_ether.h> doesn't declare
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ether_hostton()?
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_NETINET_IF_ETHER_H
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct mbuf;		/* Squelch compiler warnings on some platforms for */
81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct rtentry;		/* declarations in <net/if.h> */
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/if.h>	/* for "struct ifnet" in "struct arpcom" on Solaris */
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/if_ether.h>
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_NETINET_IF_ETHER_H */
85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/ether.h>
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* NETINET_ETHER_H_DECLARES_ETHER_HOSTTON */
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_ETHER_HOSTTON */
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <arpa/inet.h>
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netdb.h>
91965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#endif /* _WIN32 */
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h>
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h>
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h>
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h>
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h"
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "gencode.h"
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap/namedb.h>
103965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#include "nametoaddr.h"
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H
106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h"
107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef NTOHL
110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NTOHL(x) (x) = ntohl(x)
111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NTOHS(x) (x) = ntohs(x)
112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int xdtoi(int);
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Convert host name to internet address.
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Return 0 upon failure.
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_u_int32 **
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoaddr(const char *name)
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef h_addr
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static bpf_u_int32 *hlist[2];
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	bpf_u_int32 **p;
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct hostent *hp;
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if ((hp = gethostbyname(name)) != NULL) {
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef h_addr
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		hlist[0] = (bpf_u_int32 *)hp->h_addr;
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		NTOHL(hp->h_addr);
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return hlist;
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		for (p = (bpf_u_int32 **)hp->h_addr_list; *p; ++p)
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			NTOHL(**p);
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (bpf_u_int32 **)hp->h_addr_list;
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 0;
142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef INET6
145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct addrinfo *
146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoaddrinfo(const char *name)
147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct addrinfo hints, *res;
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int error;
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	memset(&hints, 0, sizeof(hints));
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_family = PF_UNSPEC;
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_socktype = SOCK_STREAM;	/*not really*/
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_protocol = IPPROTO_TCP;	/*not really*/
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	error = getaddrinfo(name, NULL, &hints, &res);
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (error)
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return NULL;
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return res;
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /*INET6*/
162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Convert net name to internet address.
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Return 0 upon failure.
166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_u_int32
168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametonetaddr(const char *name)
169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
170965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#ifndef _WIN32
171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct netent *np;
172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if ((np = getnetbyname(name)) != NULL)
174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return np->n_net;
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 0;
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * There's no "getnetbyname()" on Windows.
180965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 *
181965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * XXX - I guess we could use the BSD code to read
182965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * C:\Windows\System32\drivers\etc/networks, assuming
183965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * that's its home on all the versions of Windows
184965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * we use, but that file probably just has the loopback
185965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * network on 127/24 on 99 44/100% of Windows machines.
186965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 *
187965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * (Heck, these days it probably just has that on 99 44/100%
188965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	 * of *UN*X* machines.)
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Convert a port name to its port and protocol numbers.
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We assume only TCP or UDP.
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Return 0 upon failure.
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoport(const char *name, int *port, int *proto)
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct servent *sp;
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int tcp_port = -1;
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int udp_port = -1;
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * We need to check /etc/services for ambiguous entries.
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * If we find the ambiguous entry, and it has the
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * same port number, change the proto to PROTO_UNDEF
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * so both TCP and UDP will be checked.
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	sp = getservbyname(name, "tcp");
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sp != NULL) tcp_port = ntohs(sp->s_port);
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	sp = getservbyname(name, "udp");
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sp != NULL) udp_port = ntohs(sp->s_port);
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (tcp_port >= 0) {
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = tcp_port;
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = IPPROTO_TCP;
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (udp_port >= 0) {
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (udp_port == tcp_port)
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				*proto = PROTO_UNDEF;
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef notdef
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			else
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				/* Can't handle ambiguous names that refer
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				   to different port numbers. */
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				warning("ambiguous port %s in /etc/services",
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					name);
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (udp_port >= 0) {
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = udp_port;
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = IPPROTO_UDP;
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined(ultrix) || defined(__osf__)
238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Special hack in case NFS isn't in /etc/services */
239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (strcmp(name, "nfs") == 0) {
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = 2049;
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = PROTO_UNDEF;
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Convert a string in the form PPP-PPP, where correspond to ports, to
250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * a starting and ending port in a port range.
251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Return 0 on failure.
252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoportrange(const char *name, int *port1, int *port2, int *proto)
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int p1, p2;
257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	char *off, *cpy;
258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int save_proto;
259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sscanf(name, "%d-%d", &p1, &p2) != 2) {
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if ((cpy = strdup(name)) == NULL)
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if ((off = strchr(cpy, '-')) == NULL) {
265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*off = '\0';
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (pcap_nametoport(cpy, port1, proto) == 0) {
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		save_proto = *proto;
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (pcap_nametoport(off + 1, port2, proto) == 0) {
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
281511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		free(cpy);
282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (*proto != save_proto)
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			*proto = PROTO_UNDEF;
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} else {
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port1 = p1;
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port2 = p2;
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = PROTO_UNDEF;
289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 1;
292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoproto(const char *str)
296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct protoent *p;
298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p = getprotobyname(str);
300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p != 0)
301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return p->p_proto;
302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return PROTO_UNDEF;
304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "ethertype.h"
307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct eproto {
309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	const char *s;
310478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_short p;
311478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
313965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes/*
314965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Static data base of ether protocol types.
315965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * tcpdump used to import this, and it's declared as an export on
316965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * Debian, at least, so make it a public symbol, even though we
317965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * don't officially export it by declaring it in a header file.
318965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes * (Programs *should* do this themselves, as tcpdump now does.)
319965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes */
320965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott HughesPCAP_API_DEF struct eproto eproto_db[] = {
321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "pup", ETHERTYPE_PUP },
322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "xns", ETHERTYPE_NS },
323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ip", ETHERTYPE_IP },
324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef INET6
325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ip6", ETHERTYPE_IPV6 },
326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "arp", ETHERTYPE_ARP },
328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "rarp", ETHERTYPE_REVARP },
329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "sprite", ETHERTYPE_SPRITE },
330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "mopdl", ETHERTYPE_MOPDL },
331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "moprc", ETHERTYPE_MOPRC },
332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decnet", ETHERTYPE_DN },
333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "lat", ETHERTYPE_LAT },
334478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "sca", ETHERTYPE_SCA },
335478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "lanbridge", ETHERTYPE_LANBRIDGE },
336478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "vexp", ETHERTYPE_VEXP },
337478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "vprod", ETHERTYPE_VPROD },
338478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "atalk", ETHERTYPE_ATALK },
339478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "atalkarp", ETHERTYPE_AARP },
340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "loopback", ETHERTYPE_LOOPBACK },
341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decdts", ETHERTYPE_DECDTS },
342478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decdns", ETHERTYPE_DECDNS },
343478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ (char *)0, 0 }
344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
345478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
346478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
347478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoeproto(const char *s)
348478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
349478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct eproto *p = eproto_db;
350478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
351478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (p->s != 0) {
352478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(p->s, s) == 0)
353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return p->p;
354478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p += 1;
355478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return PROTO_UNDEF;
357478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
358478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
359478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "llc.h"
360478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
361478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Static data base of LLC values. */
362478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic struct eproto llc_db[] = {
363478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "iso", LLCSAP_ISONS },
364478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "stp", LLCSAP_8021D },
365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ipx", LLCSAP_IPX },
366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "netbeui", LLCSAP_NETBEUI },
367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ (char *)0, 0 }
368478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
369478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametollc(const char *s)
372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct eproto *p = llc_db;
374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (p->s != 0) {
376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(p->s, s) == 0)
377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return p->p;
378478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p += 1;
379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return PROTO_UNDEF;
381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Hex digit to integer. */
384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int
385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectxdtoi(c)
386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register int c;
387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (isdigit(c))
389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - '0';
390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else if (islower(c))
391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - 'a' + 10;
392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - 'A' + 10;
394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project__pcap_atoin(const char *s, bpf_u_int32 *addr)
398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int n;
400478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int len;
401478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
402478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr = 0;
403478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	len = 0;
404478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (1) {
405478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		n = 0;
406478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		while (*s && *s != '.')
407478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			n = n * 10 + *s++ - '0';
408478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*addr <<= 8;
409478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*addr |= n & 0xff;
410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		len += 8;
411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (*s == '\0')
412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return len;
413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		++s;
414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* NOTREACHED */
416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
417478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
418478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
419478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project__pcap_atodn(const char *s, bpf_u_int32 *addr)
420478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
421478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define AREASHIFT 10
422478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define AREAMASK 0176000
423478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NODEMASK 01777
424478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
425478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int node, area;
426478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
427478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sscanf(s, "%d.%d", &area, &node) != 2)
428965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes		return(0);
429478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
430478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr = (area << AREASHIFT) & AREAMASK;
431478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr |= (node & NODEMASK);
432478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
433478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(32);
434478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
435478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
436478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
437511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Convert 's', which can have the one of the forms:
438511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
439511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx:xx:xx:xx:xx:xx"
440511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx.xx.xx.xx.xx.xx"
441511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx-xx-xx-xx-xx-xx"
442511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xxxx.xxxx.xxxx"
443511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xxxxxxxxxxxx"
444511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
445511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * (or various mixes of ':', '.', and '-') into a new
446478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ethernet address.  Assumes 's' is well formed.
447478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
448478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
449478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_aton(const char *s)
450478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
451478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ep, *e;
452478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_int d;
453478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
454478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	e = ep = (u_char *)malloc(6);
455511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (e == NULL)
456511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (NULL);
457478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
458478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (*s) {
459511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (*s == ':' || *s == '.' || *s == '-')
460478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			s += 1;
461478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		d = xdtoi(*s++);
462478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (isxdigit((unsigned char)*s)) {
463478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			d <<= 4;
464478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			d |= xdtoi(*s++);
465478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
466478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*ep++ = d;
467478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
468478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
469478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (e);
470478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
471478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
472478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef HAVE_ETHER_HOSTTON
473478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Roll our own */
474478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
475478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_hostton(const char *name)
476478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
477478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register struct pcap_etherent *ep;
478478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ap;
479478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static FILE *fp = NULL;
480478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static int init = 0;
481478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
482478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (!init) {
483478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fp = fopen(PCAP_ETHERS_FILE, "r");
484478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		++init;
485478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (fp == NULL)
486478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (NULL);
487478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} else if (fp == NULL)
488478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (NULL);
489478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
490478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		rewind(fp);
491478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
492478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while ((ep = pcap_next_etherent(fp)) != NULL) {
493478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(ep->name, name) == 0) {
494478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ap = (u_char *)malloc(6);
495478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (ap != NULL) {
496478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				memcpy(ap, ep->addr, 6);
497478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (ap);
498478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
499478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
500478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
501478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
502478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (NULL);
503478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
504478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
505478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
506478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if !defined(HAVE_DECL_ETHER_HOSTTON) || !HAVE_DECL_ETHER_HOSTTON
507478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef HAVE_STRUCT_ETHER_ADDR
508478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct ether_addr {
509478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned char ether_addr_octet[6];
510478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
511478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
512478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectextern int ether_hostton(const char *, struct ether_addr *);
513478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
514478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
515478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Use the os supplied routines */
516478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
517478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_hostton(const char *name)
518478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
519478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ap;
520478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_char a[6];
521478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
522478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ap = NULL;
523478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ether_hostton(name, (struct ether_addr *)a) == 0) {
524478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		ap = (u_char *)malloc(6);
525478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (ap != NULL)
526478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			memcpy((char *)ap, (char *)a, 6);
527478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
528478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (ap);
529478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
530478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
531478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
532965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughesint
533965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes__pcap_nametodnaddr(const char *name, u_short *res)
534478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
535478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	DECNETLIB
536478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct nodeent *getnodebyname();
537478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct nodeent *nep;
538478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
539478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	nep = getnodebyname(name);
540478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (nep == ((struct nodeent *)0))
541965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes		return(0);
542478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
543965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	memcpy((char *)res, (char *)nep->n_addr, sizeof(unsigned short));
544965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	return(1);
545478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
546478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(0);
547478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
548478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
549