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