1 /*
2 * Copyright (C) 1995-2001 by Darren Reed.
3 *
4 * See the IPFILTER.LICENCE file for details on licencing.
5 */
6 #if !defined(lint)
7 static const char sccsid[] = "@(#)ipft_hx.c 1.1 3/9/96 (C) 1996 Darren Reed";
8 static const char rcsid[] = "@(#)$Id: ipft_hx.c,v 1.11.4.1 2004/12/09 19:41:20 darrenr Exp $";
9 #endif
10
11 #include <ctype.h>
12
13 #include "ipf.h"
14 #include "ipt.h"
15
16
17 extern int opts;
18
19 static int hex_open __P((char *));
20 static int hex_close __P((void));
21 static int hex_readip __P((char *, int, char **, int *));
22 static char *readhex __P((char *, char *));
23
24 struct ipread iphex = { hex_open, hex_close, hex_readip, 0 };
25 static FILE *tfp = NULL;
26 static int tfd = -1;
27
hex_open(fname)28 static int hex_open(fname)
29 char *fname;
30 {
31 if (tfp && tfd != -1) {
32 rewind(tfp);
33 return tfd;
34 }
35
36 if (!strcmp(fname, "-")) {
37 tfd = 0;
38 tfp = stdin;
39 } else {
40 tfd = open(fname, O_RDONLY);
41 if (tfd != -1)
42 tfp = fdopen(tfd, "r");
43 }
44 return tfd;
45 }
46
47
hex_close()48 static int hex_close()
49 {
50 int cfd = tfd;
51
52 tfd = -1;
53 return close(cfd);
54 }
55
56
hex_readip(buf,cnt,ifn,dir)57 static int hex_readip(buf, cnt, ifn, dir)
58 char *buf, **ifn;
59 int cnt, *dir;
60 {
61 register char *s, *t, *u;
62 char line[513];
63 ip_t *ip;
64
65 /*
66 * interpret start of line as possibly "[ifname]" or
67 * "[in/out,ifname]".
68 */
69 if (ifn)
70 *ifn = NULL;
71 if (dir)
72 *dir = 0;
73 ip = (ip_t *)buf;
74 while (fgets(line, sizeof(line)-1, tfp)) {
75 if ((s = strchr(line, '\n'))) {
76 if (s == line)
77 return (char *)ip - buf;
78 *s = '\0';
79 }
80 if ((s = strchr(line, '#')))
81 *s = '\0';
82 if (!*line)
83 continue;
84 if (!(opts & OPT_BRIEF)) {
85 printf("input: %s", line);
86 }
87
88 if ((*line == '[') && (s = strchr(line, ']'))) {
89 t = line + 1;
90 if (s - t > 0) {
91 *s++ = '\0';
92 if ((u = strchr(t, ',')) && (u < s)) {
93 u++;
94 if (ifn)
95 *ifn = strdup(u);
96 if (dir) {
97 if (*t == 'i')
98 *dir = 0;
99 else if (*t == 'o')
100 *dir = 1;
101 }
102 } else if (ifn)
103 *ifn = t;
104 }
105 } else
106 s = line;
107 t = (char *)ip;
108 ip = (ip_t *)readhex(s, (char *)ip);
109 if (!(opts & OPT_BRIEF)) {
110 if (opts & OPT_ASCII) {
111 if (t < (char *)ip)
112 putchar('\t');
113 while (t < (char *)ip) {
114 if (ISPRINT(*t) && ISASCII(*t))
115 putchar(*t);
116 else
117 putchar('.');
118 t++;
119 }
120 }
121 putchar('\n');
122 fflush(stdout);
123 }
124 }
125 return -1;
126 }
127
128
readhex(src,dst)129 static char *readhex(src, dst)
130 register char *src, *dst;
131 {
132 int state = 0;
133 char c;
134
135 while ((c = *src++)) {
136 if (ISSPACE(c)) {
137 if (state) {
138 dst++;
139 state = 0;
140 }
141 continue;
142 } else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
143 (c >= 'A' && c <= 'F')) {
144 c = ISDIGIT(c) ? (c - '0') : (TOUPPER(c) - 55);
145 if (state == 0) {
146 *dst = (c << 4);
147 state++;
148 } else {
149 *dst++ |= c;
150 state = 0;
151 }
152 } else
153 break;
154 }
155 return dst;
156 }
157