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