xref: /aosp_15_r20/external/libpcap/etherent.c (revision 8b26181f966a6af5cf6981a6f474313de533bb28)
1*8b26181fSAndroid Build Coastguard Worker /*
2*8b26181fSAndroid Build Coastguard Worker  * Copyright (c) 1990, 1993, 1994, 1995, 1996
3*8b26181fSAndroid Build Coastguard Worker  *	The Regents of the University of California.  All rights reserved.
4*8b26181fSAndroid Build Coastguard Worker  *
5*8b26181fSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8b26181fSAndroid Build Coastguard Worker  * modification, are permitted provided that: (1) source code distributions
7*8b26181fSAndroid Build Coastguard Worker  * retain the above copyright notice and this paragraph in its entirety, (2)
8*8b26181fSAndroid Build Coastguard Worker  * distributions including binary code include the above copyright notice and
9*8b26181fSAndroid Build Coastguard Worker  * this paragraph in its entirety in the documentation or other materials
10*8b26181fSAndroid Build Coastguard Worker  * provided with the distribution, and (3) all advertising materials mentioning
11*8b26181fSAndroid Build Coastguard Worker  * features or use of this software display the following acknowledgement:
12*8b26181fSAndroid Build Coastguard Worker  * ``This product includes software developed by the University of California,
13*8b26181fSAndroid Build Coastguard Worker  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*8b26181fSAndroid Build Coastguard Worker  * the University nor the names of its contributors may be used to endorse
15*8b26181fSAndroid Build Coastguard Worker  * or promote products derived from this software without specific prior
16*8b26181fSAndroid Build Coastguard Worker  * written permission.
17*8b26181fSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*8b26181fSAndroid Build Coastguard Worker  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*8b26181fSAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*8b26181fSAndroid Build Coastguard Worker  */
21*8b26181fSAndroid Build Coastguard Worker 
22*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
23*8b26181fSAndroid Build Coastguard Worker #include <config.h>
24*8b26181fSAndroid Build Coastguard Worker #endif
25*8b26181fSAndroid Build Coastguard Worker 
26*8b26181fSAndroid Build Coastguard Worker #include <pcap-types.h>
27*8b26181fSAndroid Build Coastguard Worker 
28*8b26181fSAndroid Build Coastguard Worker #include <memory.h>
29*8b26181fSAndroid Build Coastguard Worker #include <stdio.h>
30*8b26181fSAndroid Build Coastguard Worker #include <string.h>
31*8b26181fSAndroid Build Coastguard Worker 
32*8b26181fSAndroid Build Coastguard Worker #include "pcap-int.h"
33*8b26181fSAndroid Build Coastguard Worker 
34*8b26181fSAndroid Build Coastguard Worker #include <pcap/namedb.h>
35*8b26181fSAndroid Build Coastguard Worker 
36*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_OS_PROTO_H
37*8b26181fSAndroid Build Coastguard Worker #include "os-proto.h"
38*8b26181fSAndroid Build Coastguard Worker #endif
39*8b26181fSAndroid Build Coastguard Worker 
40*8b26181fSAndroid Build Coastguard Worker static inline int skip_space(FILE *);
41*8b26181fSAndroid Build Coastguard Worker static inline int skip_line(FILE *);
42*8b26181fSAndroid Build Coastguard Worker 
43*8b26181fSAndroid Build Coastguard Worker /* Hex digit to integer. */
44*8b26181fSAndroid Build Coastguard Worker static inline u_char
xdtoi(u_char c)45*8b26181fSAndroid Build Coastguard Worker xdtoi(u_char c)
46*8b26181fSAndroid Build Coastguard Worker {
47*8b26181fSAndroid Build Coastguard Worker 	if (c >= '0' && c <= '9')
48*8b26181fSAndroid Build Coastguard Worker 		return (u_char)(c - '0');
49*8b26181fSAndroid Build Coastguard Worker 	else if (c >= 'a' && c <= 'f')
50*8b26181fSAndroid Build Coastguard Worker 		return (u_char)(c - 'a' + 10);
51*8b26181fSAndroid Build Coastguard Worker 	else
52*8b26181fSAndroid Build Coastguard Worker 		return (u_char)(c - 'A' + 10);
53*8b26181fSAndroid Build Coastguard Worker }
54*8b26181fSAndroid Build Coastguard Worker 
55*8b26181fSAndroid Build Coastguard Worker /*
56*8b26181fSAndroid Build Coastguard Worker  * Skip linear white space (space and tab) and any CRs before LF.
57*8b26181fSAndroid Build Coastguard Worker  * Stop when we hit a non-white-space character or an end-of-line LF.
58*8b26181fSAndroid Build Coastguard Worker  */
59*8b26181fSAndroid Build Coastguard Worker static inline int
skip_space(FILE * f)60*8b26181fSAndroid Build Coastguard Worker skip_space(FILE *f)
61*8b26181fSAndroid Build Coastguard Worker {
62*8b26181fSAndroid Build Coastguard Worker 	int c;
63*8b26181fSAndroid Build Coastguard Worker 
64*8b26181fSAndroid Build Coastguard Worker 	do {
65*8b26181fSAndroid Build Coastguard Worker 		c = getc(f);
66*8b26181fSAndroid Build Coastguard Worker 	} while (c == ' ' || c == '\t' || c == '\r');
67*8b26181fSAndroid Build Coastguard Worker 
68*8b26181fSAndroid Build Coastguard Worker 	return c;
69*8b26181fSAndroid Build Coastguard Worker }
70*8b26181fSAndroid Build Coastguard Worker 
71*8b26181fSAndroid Build Coastguard Worker static inline int
skip_line(FILE * f)72*8b26181fSAndroid Build Coastguard Worker skip_line(FILE *f)
73*8b26181fSAndroid Build Coastguard Worker {
74*8b26181fSAndroid Build Coastguard Worker 	int c;
75*8b26181fSAndroid Build Coastguard Worker 
76*8b26181fSAndroid Build Coastguard Worker 	do
77*8b26181fSAndroid Build Coastguard Worker 		c = getc(f);
78*8b26181fSAndroid Build Coastguard Worker 	while (c != '\n' && c != EOF);
79*8b26181fSAndroid Build Coastguard Worker 
80*8b26181fSAndroid Build Coastguard Worker 	return c;
81*8b26181fSAndroid Build Coastguard Worker }
82*8b26181fSAndroid Build Coastguard Worker 
83*8b26181fSAndroid Build Coastguard Worker struct pcap_etherent *
pcap_next_etherent(FILE * fp)84*8b26181fSAndroid Build Coastguard Worker pcap_next_etherent(FILE *fp)
85*8b26181fSAndroid Build Coastguard Worker {
86*8b26181fSAndroid Build Coastguard Worker 	register int c, i;
87*8b26181fSAndroid Build Coastguard Worker 	u_char d;
88*8b26181fSAndroid Build Coastguard Worker 	char *bp;
89*8b26181fSAndroid Build Coastguard Worker 	size_t namesize;
90*8b26181fSAndroid Build Coastguard Worker 	static struct pcap_etherent e;
91*8b26181fSAndroid Build Coastguard Worker 
92*8b26181fSAndroid Build Coastguard Worker 	memset((char *)&e, 0, sizeof(e));
93*8b26181fSAndroid Build Coastguard Worker 	for (;;) {
94*8b26181fSAndroid Build Coastguard Worker 		/* Find addr */
95*8b26181fSAndroid Build Coastguard Worker 		c = skip_space(fp);
96*8b26181fSAndroid Build Coastguard Worker 		if (c == EOF)
97*8b26181fSAndroid Build Coastguard Worker 			return (NULL);
98*8b26181fSAndroid Build Coastguard Worker 		if (c == '\n')
99*8b26181fSAndroid Build Coastguard Worker 			continue;
100*8b26181fSAndroid Build Coastguard Worker 
101*8b26181fSAndroid Build Coastguard Worker 		/* If this is a comment, or first thing on line
102*8b26181fSAndroid Build Coastguard Worker 		   cannot be Ethernet address, skip the line. */
103*8b26181fSAndroid Build Coastguard Worker 		if (!PCAP_ISXDIGIT(c)) {
104*8b26181fSAndroid Build Coastguard Worker 			c = skip_line(fp);
105*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
106*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
107*8b26181fSAndroid Build Coastguard Worker 			continue;
108*8b26181fSAndroid Build Coastguard Worker 		}
109*8b26181fSAndroid Build Coastguard Worker 
110*8b26181fSAndroid Build Coastguard Worker 		/* must be the start of an address */
111*8b26181fSAndroid Build Coastguard Worker 		for (i = 0; i < 6; i += 1) {
112*8b26181fSAndroid Build Coastguard Worker 			d = xdtoi((u_char)c);
113*8b26181fSAndroid Build Coastguard Worker 			c = getc(fp);
114*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
115*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
116*8b26181fSAndroid Build Coastguard Worker 			if (PCAP_ISXDIGIT(c)) {
117*8b26181fSAndroid Build Coastguard Worker 				d <<= 4;
118*8b26181fSAndroid Build Coastguard Worker 				d |= xdtoi((u_char)c);
119*8b26181fSAndroid Build Coastguard Worker 				c = getc(fp);
120*8b26181fSAndroid Build Coastguard Worker 				if (c == EOF)
121*8b26181fSAndroid Build Coastguard Worker 					return (NULL);
122*8b26181fSAndroid Build Coastguard Worker 			}
123*8b26181fSAndroid Build Coastguard Worker 			e.addr[i] = d;
124*8b26181fSAndroid Build Coastguard Worker 			if (c != ':')
125*8b26181fSAndroid Build Coastguard Worker 				break;
126*8b26181fSAndroid Build Coastguard Worker 			c = getc(fp);
127*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
128*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
129*8b26181fSAndroid Build Coastguard Worker 		}
130*8b26181fSAndroid Build Coastguard Worker 
131*8b26181fSAndroid Build Coastguard Worker 		/* Must be whitespace */
132*8b26181fSAndroid Build Coastguard Worker 		if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
133*8b26181fSAndroid Build Coastguard Worker 			c = skip_line(fp);
134*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
135*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
136*8b26181fSAndroid Build Coastguard Worker 			continue;
137*8b26181fSAndroid Build Coastguard Worker 		}
138*8b26181fSAndroid Build Coastguard Worker 		c = skip_space(fp);
139*8b26181fSAndroid Build Coastguard Worker 		if (c == EOF)
140*8b26181fSAndroid Build Coastguard Worker 			return (NULL);
141*8b26181fSAndroid Build Coastguard Worker 
142*8b26181fSAndroid Build Coastguard Worker 		/* hit end of line... */
143*8b26181fSAndroid Build Coastguard Worker 		if (c == '\n')
144*8b26181fSAndroid Build Coastguard Worker 			continue;
145*8b26181fSAndroid Build Coastguard Worker 
146*8b26181fSAndroid Build Coastguard Worker 		if (c == '#') {
147*8b26181fSAndroid Build Coastguard Worker 			c = skip_line(fp);
148*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
149*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
150*8b26181fSAndroid Build Coastguard Worker 			continue;
151*8b26181fSAndroid Build Coastguard Worker 		}
152*8b26181fSAndroid Build Coastguard Worker 
153*8b26181fSAndroid Build Coastguard Worker 		/* pick up name */
154*8b26181fSAndroid Build Coastguard Worker 		bp = e.name;
155*8b26181fSAndroid Build Coastguard Worker 		/* Use 'namesize' to prevent buffer overflow. */
156*8b26181fSAndroid Build Coastguard Worker 		namesize = sizeof(e.name) - 1;
157*8b26181fSAndroid Build Coastguard Worker 		do {
158*8b26181fSAndroid Build Coastguard Worker 			*bp++ = (u_char)c;
159*8b26181fSAndroid Build Coastguard Worker 			c = getc(fp);
160*8b26181fSAndroid Build Coastguard Worker 			if (c == EOF)
161*8b26181fSAndroid Build Coastguard Worker 				return (NULL);
162*8b26181fSAndroid Build Coastguard Worker 		} while (c != ' ' && c != '\t' && c != '\r' && c != '\n'
163*8b26181fSAndroid Build Coastguard Worker 		    && --namesize != 0);
164*8b26181fSAndroid Build Coastguard Worker 		*bp = '\0';
165*8b26181fSAndroid Build Coastguard Worker 
166*8b26181fSAndroid Build Coastguard Worker 		/* Eat trailing junk */
167*8b26181fSAndroid Build Coastguard Worker 		if (c != '\n')
168*8b26181fSAndroid Build Coastguard Worker 			(void)skip_line(fp);
169*8b26181fSAndroid Build Coastguard Worker 
170*8b26181fSAndroid Build Coastguard Worker 		return &e;
171*8b26181fSAndroid Build Coastguard Worker 	}
172*8b26181fSAndroid Build Coastguard Worker }
173