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