1 /*
2 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Some portions Copyright (C) 2010-2013 Sourcefire, Inc.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that: (1) source code distributions
9 * retain the above copyright notice and this paragraph in its entirety, (2)
10 * distributions including binary code include the above copyright notice and
11 * this paragraph in its entirety in the documentation or other materials
12 * provided with the distribution, and (3) all advertising materials mentioning
13 * features or use of this software display the following acknowledgement:
14 * ``This product includes software developed by the University of California,
15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16 * the University nor the names of its contributors may be used to endorse
17 * or promote products derived from this software without specific prior
18 * written permission.
19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22 */
23
24 /*
25 * This file mostly consists of code extraced from libpcap as required by the
26 * BPF library. It originates from multiple files in the original libpcap
27 * distribution.
28 */
29
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33
34 #include <ctype.h>
35 #ifndef WIN32
36 #include <netdb.h>
37 #endif
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include "sfbpf-int.h"
42 #include "namedb.h"
43 #include "gencode.h"
44
45 /*
46 * This array is designed for mapping upper and lower case letter
47 * together for a case independent comparison. The mappings are
48 * based upon ascii character sequences.
49 */
50 static const u_char charmap[] = {
51 (u_char) '\000', (u_char) '\001', (u_char) '\002', (u_char) '\003',
52 (u_char) '\004', (u_char) '\005', (u_char) '\006', (u_char) '\007',
53 (u_char) '\010', (u_char) '\011', (u_char) '\012', (u_char) '\013',
54 (u_char) '\014', (u_char) '\015', (u_char) '\016', (u_char) '\017',
55 (u_char) '\020', (u_char) '\021', (u_char) '\022', (u_char) '\023',
56 (u_char) '\024', (u_char) '\025', (u_char) '\026', (u_char) '\027',
57 (u_char) '\030', (u_char) '\031', (u_char) '\032', (u_char) '\033',
58 (u_char) '\034', (u_char) '\035', (u_char) '\036', (u_char) '\037',
59 (u_char) '\040', (u_char) '\041', (u_char) '\042', (u_char) '\043',
60 (u_char) '\044', (u_char) '\045', (u_char) '\046', (u_char) '\047',
61 (u_char) '\050', (u_char) '\051', (u_char) '\052', (u_char) '\053',
62 (u_char) '\054', (u_char) '\055', (u_char) '\056', (u_char) '\057',
63 (u_char) '\060', (u_char) '\061', (u_char) '\062', (u_char) '\063',
64 (u_char) '\064', (u_char) '\065', (u_char) '\066', (u_char) '\067',
65 (u_char) '\070', (u_char) '\071', (u_char) '\072', (u_char) '\073',
66 (u_char) '\074', (u_char) '\075', (u_char) '\076', (u_char) '\077',
67 (u_char) '\100', (u_char) '\141', (u_char) '\142', (u_char) '\143',
68 (u_char) '\144', (u_char) '\145', (u_char) '\146', (u_char) '\147',
69 (u_char) '\150', (u_char) '\151', (u_char) '\152', (u_char) '\153',
70 (u_char) '\154', (u_char) '\155', (u_char) '\156', (u_char) '\157',
71 (u_char) '\160', (u_char) '\161', (u_char) '\162', (u_char) '\163',
72 (u_char) '\164', (u_char) '\165', (u_char) '\166', (u_char) '\167',
73 (u_char) '\170', (u_char) '\171', (u_char) '\172', (u_char) '\133',
74 (u_char) '\134', (u_char) '\135', (u_char) '\136', (u_char) '\137',
75 (u_char) '\140', (u_char) '\141', (u_char) '\142', (u_char) '\143',
76 (u_char) '\144', (u_char) '\145', (u_char) '\146', (u_char) '\147',
77 (u_char) '\150', (u_char) '\151', (u_char) '\152', (u_char) '\153',
78 (u_char) '\154', (u_char) '\155', (u_char) '\156', (u_char) '\157',
79 (u_char) '\160', (u_char) '\161', (u_char) '\162', (u_char) '\163',
80 (u_char) '\164', (u_char) '\165', (u_char) '\166', (u_char) '\167',
81 (u_char) '\170', (u_char) '\171', (u_char) '\172', (u_char) '\173',
82 (u_char) '\174', (u_char) '\175', (u_char) '\176', (u_char) '\177',
83 (u_char) '\200', (u_char) '\201', (u_char) '\202', (u_char) '\203',
84 (u_char) '\204', (u_char) '\205', (u_char) '\206', (u_char) '\207',
85 (u_char) '\210', (u_char) '\211', (u_char) '\212', (u_char) '\213',
86 (u_char) '\214', (u_char) '\215', (u_char) '\216', (u_char) '\217',
87 (u_char) '\220', (u_char) '\221', (u_char) '\222', (u_char) '\223',
88 (u_char) '\224', (u_char) '\225', (u_char) '\226', (u_char) '\227',
89 (u_char) '\230', (u_char) '\231', (u_char) '\232', (u_char) '\233',
90 (u_char) '\234', (u_char) '\235', (u_char) '\236', (u_char) '\237',
91 (u_char) '\240', (u_char) '\241', (u_char) '\242', (u_char) '\243',
92 (u_char) '\244', (u_char) '\245', (u_char) '\246', (u_char) '\247',
93 (u_char) '\250', (u_char) '\251', (u_char) '\252', (u_char) '\253',
94 (u_char) '\254', (u_char) '\255', (u_char) '\256', (u_char) '\257',
95 (u_char) '\260', (u_char) '\261', (u_char) '\262', (u_char) '\263',
96 (u_char) '\264', (u_char) '\265', (u_char) '\266', (u_char) '\267',
97 (u_char) '\270', (u_char) '\271', (u_char) '\272', (u_char) '\273',
98 (u_char) '\274', (u_char) '\275', (u_char) '\276', (u_char) '\277',
99 (u_char) '\300', (u_char) '\341', (u_char) '\342', (u_char) '\343',
100 (u_char) '\344', (u_char) '\345', (u_char) '\346', (u_char) '\347',
101 (u_char) '\350', (u_char) '\351', (u_char) '\352', (u_char) '\353',
102 (u_char) '\354', (u_char) '\355', (u_char) '\356', (u_char) '\357',
103 (u_char) '\360', (u_char) '\361', (u_char) '\362', (u_char) '\363',
104 (u_char) '\364', (u_char) '\365', (u_char) '\366', (u_char) '\367',
105 (u_char) '\370', (u_char) '\371', (u_char) '\372', (u_char) '\333',
106 (u_char) '\334', (u_char) '\335', (u_char) '\336', (u_char) '\337',
107 (u_char) '\340', (u_char) '\341', (u_char) '\342', (u_char) '\343',
108 (u_char) '\344', (u_char) '\345', (u_char) '\346', (u_char) '\347',
109 (u_char) '\350', (u_char) '\351', (u_char) '\352', (u_char) '\353',
110 (u_char) '\354', (u_char) '\355', (u_char) '\356', (u_char) '\357',
111 (u_char) '\360', (u_char) '\361', (u_char) '\362', (u_char) '\363',
112 (u_char) '\364', (u_char) '\365', (u_char) '\366', (u_char) '\367',
113 (u_char) '\370', (u_char) '\371', (u_char) '\372', (u_char) '\373',
114 (u_char) '\374', (u_char) '\375', (u_char) '\376', (u_char) '\377',
115 };
116
sfbpf_strcasecmp(const char * s1,const char * s2)117 int sfbpf_strcasecmp(const char *s1, const char *s2)
118 {
119 register const u_char *cm = charmap, *us1 = (const u_char *) s1, *us2 = (const u_char *) s2;
120
121 while (cm[*us1] == cm[*us2++])
122 if (*us1++ == '\0')
123 return (0);
124 return (cm[*us1] - cm[*--us2]);
125 }
126
127 /* Hex digit to integer. */
xdtoi(c)128 static inline int xdtoi(c)
129 register int c;
130 {
131 if (isdigit(c))
132 return c - '0';
133 else if (islower(c))
134 return c - 'a' + 10;
135 else
136 return c - 'A' + 10;
137 }
138
skip_space(f)139 static inline int skip_space(f)
140 FILE *f;
141 {
142 int c;
143
144 do
145 {
146 c = getc(f);
147 } while (isspace(c) && c != '\n');
148
149 return c;
150 }
151
skip_line(f)152 static inline int skip_line(f)
153 FILE *f;
154 {
155 int c;
156
157 do
158 c = getc(f);
159 while (c != '\n' && c != EOF);
160
161 return c;
162 }
163
pcap_next_etherent(FILE * fp)164 struct pcap_etherent *pcap_next_etherent(FILE * fp)
165 {
166 register int c, d, i;
167 char *bp;
168 static struct pcap_etherent e;
169
170 memset((char *) &e, 0, sizeof(e));
171 do
172 {
173 /* Find addr */
174 c = skip_space(fp);
175 if (c == '\n')
176 continue;
177
178 /* If this is a comment, or first thing on line
179 cannot be etehrnet address, skip the line. */
180 if (!isxdigit(c))
181 {
182 c = skip_line(fp);
183 continue;
184 }
185
186 /* must be the start of an address */
187 for (i = 0; i < 6; i += 1)
188 {
189 d = xdtoi(c);
190 c = getc(fp);
191 if (isxdigit(c))
192 {
193 d <<= 4;
194 d |= xdtoi(c);
195 c = getc(fp);
196 }
197 e.addr[i] = d;
198 if (c != ':')
199 break;
200 c = getc(fp);
201 }
202 if (c == EOF)
203 break;
204
205 /* Must be whitespace */
206 if (!isspace(c))
207 {
208 c = skip_line(fp);
209 continue;
210 }
211 c = skip_space(fp);
212
213 /* hit end of line... */
214 if (c == '\n')
215 continue;
216
217 if (c == '#')
218 {
219 c = skip_line(fp);
220 continue;
221 }
222
223 /* pick up name */
224 bp = e.name;
225 /* Use 'd' to prevent buffer overflow. */
226 d = sizeof(e.name) - 1;
227 do
228 {
229 *bp++ = c;
230 c = getc(fp);
231 } while (!isspace(c) && c != EOF && --d > 0);
232 *bp = '\0';
233
234 /* Eat trailing junk */
235 if (c != '\n')
236 (void) skip_line(fp);
237
238 return &e;
239
240 } while (c != EOF);
241
242 return (NULL);
243 }
244