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