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