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#ifndef lint
26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ =
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.83 2008-02-06 10:21:30 guy Exp $ (LBL)";
28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H
31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h"
32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef DECNETLIB
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <netdnet/dnetdb.h>
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef WIN32
40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pcap-stdinc.h>
41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else /* WIN32 */
43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/param.h>
45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h>				/* concession to AIX */
46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h>
47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/time.h>
48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h>
50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* WIN32 */
51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef WIN32
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_ETHER_HOSTTON
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - do we need any of this if <netinet/if_ether.h> doesn't declare
56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ether_hostton()?
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_NETINET_IF_ETHER_H
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct mbuf;		/* Squelch compiler warnings on some platforms for */
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct rtentry;		/* declarations in <net/if.h> */
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/if.h>	/* for "struct ifnet" in "struct arpcom" on Solaris */
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/if_ether.h>
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_NETINET_IF_ETHER_H */
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/ether.h>
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* NETINET_ETHER_H_DECLARES_ETHER_HOSTTON */
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_ETHER_HOSTTON */
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <arpa/inet.h>
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netdb.h>
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* WIN32 */
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h>
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h>
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h>
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h>
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h"
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "gencode.h"
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap/namedb.h>
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h"
85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef NTOHL
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NTOHL(x) (x) = ntohl(x)
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NTOHS(x) (x) = ntohs(x)
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int xdtoi(int);
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Convert host name to internet address.
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Return 0 upon failure.
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_u_int32 **
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoaddr(const char *name)
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef h_addr
102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static bpf_u_int32 *hlist[2];
103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	bpf_u_int32 **p;
105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct hostent *hp;
106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if ((hp = gethostbyname(name)) != NULL) {
108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef h_addr
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		hlist[0] = (bpf_u_int32 *)hp->h_addr;
110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		NTOHL(hp->h_addr);
111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return hlist;
112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		for (p = (bpf_u_int32 **)hp->h_addr_list; *p; ++p)
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			NTOHL(**p);
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (bpf_u_int32 **)hp->h_addr_list;
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 0;
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef INET6
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct addrinfo *
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoaddrinfo(const char *name)
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct addrinfo hints, *res;
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int error;
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	memset(&hints, 0, sizeof(hints));
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_family = PF_UNSPEC;
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_socktype = SOCK_STREAM;	/*not really*/
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	hints.ai_protocol = IPPROTO_TCP;	/*not really*/
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	error = getaddrinfo(name, NULL, &hints, &res);
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (error)
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return NULL;
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return res;
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /*INET6*/
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Convert net name to internet address.
143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *  Return 0 upon failure.
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_u_int32
146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametonetaddr(const char *name)
147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef WIN32
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct netent *np;
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if ((np = getnetbyname(name)) != NULL)
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return np->n_net;
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 0;
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * There's no "getnetbyname()" on Windows.
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Convert a port name to its port and protocol numbers.
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We assume only TCP or UDP.
166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Return 0 upon failure.
167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoport(const char *name, int *port, int *proto)
170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct servent *sp;
172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int tcp_port = -1;
173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int udp_port = -1;
174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * We need to check /etc/services for ambiguous entries.
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * If we find the ambiguous entry, and it has the
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * same port number, change the proto to PROTO_UNDEF
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * so both TCP and UDP will be checked.
180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	sp = getservbyname(name, "tcp");
182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sp != NULL) tcp_port = ntohs(sp->s_port);
183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	sp = getservbyname(name, "udp");
184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sp != NULL) udp_port = ntohs(sp->s_port);
185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (tcp_port >= 0) {
186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = tcp_port;
187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = IPPROTO_TCP;
188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (udp_port >= 0) {
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (udp_port == tcp_port)
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				*proto = PROTO_UNDEF;
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef notdef
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			else
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				/* Can't handle ambiguous names that refer
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				   to different port numbers. */
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				warning("ambiguous port %s in /etc/services",
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					name);
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (udp_port >= 0) {
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = udp_port;
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = IPPROTO_UDP;
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined(ultrix) || defined(__osf__)
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Special hack in case NFS isn't in /etc/services */
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (strcmp(name, "nfs") == 0) {
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port = 2049;
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = PROTO_UNDEF;
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return 1;
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Convert a string in the form PPP-PPP, where correspond to ports, to
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * a starting and ending port in a port range.
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Return 0 on failure.
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoportrange(const char *name, int *port1, int *port2, int *proto)
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int p1, p2;
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	char *off, *cpy;
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int save_proto;
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sscanf(name, "%d-%d", &p1, &p2) != 2) {
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if ((cpy = strdup(name)) == NULL)
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if ((off = strchr(cpy, '-')) == NULL) {
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*off = '\0';
239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (pcap_nametoport(cpy, port1, proto) == 0) {
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		save_proto = *proto;
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (pcap_nametoport(off + 1, port2, proto) == 0) {
247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			free(cpy);
248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
250511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		free(cpy);
251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (*proto != save_proto)
253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			*proto = PROTO_UNDEF;
254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} else {
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port1 = p1;
256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*port2 = p2;
257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*proto = PROTO_UNDEF;
258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 1;
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoproto(const char *str)
265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct protoent *p;
267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p = getprotobyname(str);
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p != 0)
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return p->p_proto;
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return PROTO_UNDEF;
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "ethertype.h"
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct eproto {
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	const char *s;
279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_short p;
280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Static data base of ether protocol types. */
283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct eproto eproto_db[] = {
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "pup", ETHERTYPE_PUP },
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "xns", ETHERTYPE_NS },
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ip", ETHERTYPE_IP },
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef INET6
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ip6", ETHERTYPE_IPV6 },
289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "arp", ETHERTYPE_ARP },
291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "rarp", ETHERTYPE_REVARP },
292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "sprite", ETHERTYPE_SPRITE },
293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "mopdl", ETHERTYPE_MOPDL },
294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "moprc", ETHERTYPE_MOPRC },
295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decnet", ETHERTYPE_DN },
296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "lat", ETHERTYPE_LAT },
297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "sca", ETHERTYPE_SCA },
298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "lanbridge", ETHERTYPE_LANBRIDGE },
299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "vexp", ETHERTYPE_VEXP },
300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "vprod", ETHERTYPE_VPROD },
301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "atalk", ETHERTYPE_ATALK },
302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "atalkarp", ETHERTYPE_AARP },
303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "loopback", ETHERTYPE_LOOPBACK },
304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decdts", ETHERTYPE_DECDTS },
305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "decdns", ETHERTYPE_DECDNS },
306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ (char *)0, 0 }
307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
310478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametoeproto(const char *s)
311478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct eproto *p = eproto_db;
313478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
314478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (p->s != 0) {
315478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(p->s, s) == 0)
316478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return p->p;
317478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p += 1;
318478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return PROTO_UNDEF;
320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "llc.h"
323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Static data base of LLC values. */
325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic struct eproto llc_db[] = {
326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "iso", LLCSAP_ISONS },
327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "stp", LLCSAP_8021D },
328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "ipx", LLCSAP_IPX },
329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ "netbeui", LLCSAP_NETBEUI },
330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{ (char *)0, 0 }
331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
334478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_nametollc(const char *s)
335478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
336478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct eproto *p = llc_db;
337478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
338478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (p->s != 0) {
339478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(p->s, s) == 0)
340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return p->p;
341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p += 1;
342478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
343478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return PROTO_UNDEF;
344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
345478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
346478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Hex digit to integer. */
347478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int
348478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectxdtoi(c)
349478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register int c;
350478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
351478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (isdigit(c))
352478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - '0';
353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else if (islower(c))
354478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - 'a' + 10;
355478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return c - 'A' + 10;
357478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
358478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
359478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
360478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project__pcap_atoin(const char *s, bpf_u_int32 *addr)
361478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
362478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int n;
363478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int len;
364478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr = 0;
366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	len = 0;
367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (1) {
368478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		n = 0;
369478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		while (*s && *s != '.')
370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			n = n * 10 + *s++ - '0';
371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*addr <<= 8;
372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*addr |= n & 0xff;
373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		len += 8;
374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (*s == '\0')
375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return len;
376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		++s;
377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
378478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* NOTREACHED */
379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project__pcap_atodn(const char *s, bpf_u_int32 *addr)
383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define AREASHIFT 10
385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define AREAMASK 0176000
386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define NODEMASK 01777
387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int node, area;
389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (sscanf(s, "%d.%d", &area, &node) != 2)
391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		bpf_error("malformed decnet address '%s'", s);
392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr = (area << AREASHIFT) & AREAMASK;
394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*addr |= (node & NODEMASK);
395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(32);
397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
400511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Convert 's', which can have the one of the forms:
401511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
402511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx:xx:xx:xx:xx:xx"
403511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx.xx.xx.xx.xx.xx"
404511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xx-xx-xx-xx-xx-xx"
405511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xxxx.xxxx.xxxx"
406511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	"xxxxxxxxxxxx"
407511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
408511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * (or various mixes of ':', '.', and '-') into a new
409478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ethernet address.  Assumes 's' is well formed.
410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_aton(const char *s)
413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ep, *e;
415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_int d;
416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
417478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	e = ep = (u_char *)malloc(6);
418511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (e == NULL)
419511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (NULL);
420478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
421478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (*s) {
422511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (*s == ':' || *s == '.' || *s == '-')
423478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			s += 1;
424478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		d = xdtoi(*s++);
425478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (isxdigit((unsigned char)*s)) {
426478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			d <<= 4;
427478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			d |= xdtoi(*s++);
428478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
429478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		*ep++ = d;
430478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
431478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
432478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (e);
433478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
434478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
435478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef HAVE_ETHER_HOSTTON
436478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Roll our own */
437478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
438478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_hostton(const char *name)
439478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
440478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register struct pcap_etherent *ep;
441478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ap;
442478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static FILE *fp = NULL;
443478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static int init = 0;
444478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
445478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (!init) {
446478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fp = fopen(PCAP_ETHERS_FILE, "r");
447478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		++init;
448478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (fp == NULL)
449478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (NULL);
450478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} else if (fp == NULL)
451478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (NULL);
452478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
453478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		rewind(fp);
454478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
455478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while ((ep = pcap_next_etherent(fp)) != NULL) {
456478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (strcmp(ep->name, name) == 0) {
457478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ap = (u_char *)malloc(6);
458478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (ap != NULL) {
459478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				memcpy(ap, ep->addr, 6);
460478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (ap);
461478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
462478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
463478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
464478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
465478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (NULL);
466478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
467478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
468478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
469478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if !defined(HAVE_DECL_ETHER_HOSTTON) || !HAVE_DECL_ETHER_HOSTTON
470478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef HAVE_STRUCT_ETHER_ADDR
471478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct ether_addr {
472478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned char ether_addr_octet[6];
473478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
474478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
475478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectextern int ether_hostton(const char *, struct ether_addr *);
476478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
477478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
478478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Use the os supplied routines */
479478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_char *
480478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_ether_hostton(const char *name)
481478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
482478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *ap;
483478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_char a[6];
484478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
485478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ap = NULL;
486478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ether_hostton(name, (struct ether_addr *)a) == 0) {
487478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		ap = (u_char *)malloc(6);
488478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (ap != NULL)
489478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			memcpy((char *)ap, (char *)a, 6);
490478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
491478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (ap);
492478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
493478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
494478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
495478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectu_short
496478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project__pcap_nametodnaddr(const char *name)
497478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
498478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	DECNETLIB
499478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct nodeent *getnodebyname();
500478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct nodeent *nep;
501478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned short res;
502478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
503478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	nep = getnodebyname(name);
504478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (nep == ((struct nodeent *)0))
505478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		bpf_error("unknown decnet host name '%s'\n", name);
506478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
507478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	memcpy((char *)&res, (char *)nep->n_addr, sizeof(unsigned short));
508478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(res);
509478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
510478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	bpf_error("decnet name support not included, '%s' cannot be translated\n",
511478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		name);
512478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(0);
513478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
514478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
515