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