1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1990, 1993, 1994, 1995, 1996 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 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap-stdinc.h> 28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /* WIN32 */ 29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if HAVE_INTTYPES_H 30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <inttypes.h> 31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif HAVE_STDINT_H 32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdint.h> 33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_SYS_BITYPES_H 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/bitypes.h> 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h> 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* WIN32 */ 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h> 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <memory.h> 42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h> 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap/namedb.h> 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h" 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int xdtoi(int); 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int skip_space(FILE *); 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int skip_line(FILE *); 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Hex digit to integer. */ 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectxdtoi(c) 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register int c; 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (isdigit(c)) 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return c - '0'; 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else if (islower(c)) 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return c - 'a' + 10; 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return c - 'A' + 10; 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectskip_space(f) 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project FILE *f; 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int c; 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do { 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(f); 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } while (isspace(c) && c != '\n'); 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return c; 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic inline int 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectskip_line(f) 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project FILE *f; 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int c; 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(f); 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (c != '\n' && c != EOF); 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return c; 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct pcap_etherent * 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_next_etherent(FILE *fp) 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register int c, d, i; 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char *bp; 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project static struct pcap_etherent e; 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project memset((char *)&e, 0, sizeof(e)); 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do { 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Find addr */ 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = skip_space(fp); 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c == '\n') 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* If this is a comment, or first thing on line 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project cannot be etehrnet address, skip the line. */ 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!isxdigit(c)) { 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = skip_line(fp); 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* must be the start of an address */ 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project for (i = 0; i < 6; i += 1) { 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project d = xdtoi(c); 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(fp); 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (isxdigit(c)) { 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project d <<= 4; 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project d |= xdtoi(c); 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(fp); 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project e.addr[i] = d; 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c != ':') 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(fp); 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c == EOF) 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Must be whitespace */ 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!isspace(c)) { 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = skip_line(fp); 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = skip_space(fp); 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* hit end of line... */ 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c == '\n') 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c == '#') { 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = skip_line(fp); 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* pick up name */ 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project bp = e.name; 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Use 'd' to prevent buffer overflow. */ 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project d = sizeof(e.name) - 1; 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do { 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *bp++ = c; 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project c = getc(fp); 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } while (!isspace(c) && c != EOF && --d > 0); 158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *bp = '\0'; 159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Eat trailing junk */ 161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (c != '\n') 162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)skip_line(fp); 163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return &e; 165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } while (c != EOF); 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (NULL); 169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 170