]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ipfilter/ipt.c
This commit was generated by cvs2svn to compensate for changes in r51728,
[FreeBSD/FreeBSD.git] / contrib / ipfilter / ipt.c
1 /*
2  * Copyright (C) 1993-1997 by Darren Reed.
3  *
4  * Redistribution and use in source and binary forms are permitted
5  * provided that this notice is preserved and due credit is given
6  * to the original author and the contributors.
7  */
8 #ifdef  __FreeBSD__
9 # include <osreldate.h>
10 #endif
11 #include <stdio.h>
12 #include <assert.h>
13 #include <string.h>
14 #include <sys/types.h>
15 #if !defined(__SVR4) && !defined(__svr4__) && !defined(__sgi)
16 #include <strings.h>
17 #else
18 #if !defined(__sgi)
19 #include <sys/byteorder.h>
20 #endif
21 #include <sys/file.h>
22 #endif
23 #include <sys/param.h>
24 #include <sys/time.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <stddef.h>
28 #include <sys/socket.h>
29 #include <sys/ioctl.h>
30 #include <netinet/in.h>
31 #include <netinet/in_systm.h>
32 #ifndef linux
33 #include <netinet/ip_var.h>
34 #endif
35 #include <netinet/ip.h>
36 #include <netinet/udp.h>
37 #include <netinet/tcp.h>
38 #include <netinet/ip_icmp.h>
39 #include <net/if.h>
40 #if __FreeBSD_version >= 300000
41 # include <net/if_var.h>
42 #endif
43 #include <netdb.h>
44 #include <arpa/nameser.h>
45 #include <arpa/inet.h>
46 #include <resolv.h>
47 #include <ctype.h>
48 #include "ip_compat.h"
49 #include <netinet/tcpip.h>
50 #include "ip_fil.h"
51 #include "ipf.h"
52 #include "ipt.h"
53
54 #if !defined(lint)
55 static const char sccsid[] = "@(#)ipt.c 1.19 6/3/96 (C) 1993-1996 Darren Reed";
56 static const char rcsid[] = "@(#)$Id: ipt.c,v 2.0.2.12.2.1 1997/11/12 10:58:10 darrenr Exp $";
57 #endif
58
59 extern  char    *optarg;
60 extern  struct frentry  *ipfilter[2][2];
61 extern  struct ipread   snoop, etherf, tcpd, pcap, iptext, iphex;
62 extern  struct ifnet    *get_unit __P((char *));
63 extern  void    init_ifp __P((void));
64
65 int     opts = 0;
66 int     main __P((int, char *[]));
67
68 int main(argc,argv)
69 int argc;
70 char *argv[];
71 {
72         struct  ipread  *r = &iptext;
73         u_long  buf[64];
74         struct  ifnet   *ifp;
75         char    *rules = NULL, *datain = NULL, *iface = NULL;
76         ip_t    *ip;
77         int     fd, i, dir = 0, c;
78
79         while ((c = getopt(argc, argv, "bdEHi:I:oPr:STvX")) != -1)
80                 switch (c)
81                 {
82                 case 'b' :
83                         opts |= OPT_BRIEF;
84                         break;
85                 case 'd' :
86                         opts |= OPT_DEBUG;
87                         break;
88                 case 'i' :
89                         datain = optarg;
90                         break;
91                 case 'I' :
92                         iface = optarg;
93                         break;
94                 case 'o' :
95                         opts |= OPT_SAVEOUT;
96                         break;
97                 case 'r' :
98                         rules = optarg;
99                         break;
100                 case 'v' :
101                         opts |= OPT_VERBOSE;
102                         break;
103                 case 'E' :
104                         r = &etherf;
105                         break;
106                 case 'H' :
107                         r = &iphex;
108                         break;
109                 case 'P' :
110                         r = &pcap;
111                         break;
112                 case 'S' :
113                         r = &snoop;
114                         break;
115                 case 'T' :
116                         r = &tcpd;
117                         break;
118                 case 'X' :
119                         r = &iptext;
120                         break;
121                 }
122
123         if (!rules) {
124                 (void)fprintf(stderr,"no rule file present\n");
125                 exit(-1);
126         }
127
128         initparse();
129
130         if (rules) {
131                 struct  frentry *fr;
132                 char    line[513], *s;
133                 FILE    *fp;
134
135                 if (!strcmp(rules, "-"))
136                         fp = stdin;
137                 else if (!(fp = fopen(rules, "r"))) {
138                         (void)fprintf(stderr, "couldn't open %s\n", rules);
139                         exit(-1);
140                 }
141                 if (!(opts & OPT_BRIEF))
142                         (void)printf("opening rule file \"%s\"\n", rules);
143                 while (fgets(line, sizeof(line)-1, fp)) {
144                         /*
145                          * treat both CR and LF as EOL
146                          */
147                         if ((s = index(line, '\n')))
148                                 *s = '\0';
149                         if ((s = index(line, '\r')))
150                                 *s = '\0';
151                         /*
152                          * # is comment marker, everything after is a ignored
153                          */
154                         if ((s = index(line, '#')))
155                                 *s = '\0';
156
157                         if (!*line)
158                                 continue;
159
160                         if (!(fr = parse(line)))
161                                 continue;
162                         /* fake an `ioctl' call :) */
163                         i = IPL_EXTERN(ioctl)(0, SIOCADDFR, (caddr_t)fr, FWRITE|FREAD);
164                         if (opts & OPT_DEBUG)
165                                 fprintf(stderr,
166                                         "iplioctl(SIOCADDFR,%p,1) = %d\n",
167                                         fr, i);
168                 }
169                 (void)fclose(fp);
170         }
171
172         if (opts & OPT_SAVEOUT)
173                 init_ifp();
174
175         if (datain)
176                 fd = (*r->r_open)(datain);
177         else
178                 fd = (*r->r_open)("-");
179
180         if (fd < 0)
181                 exit(-1);
182
183         ip = (ip_t *)buf;
184         while ((i = (*r->r_readip)((char *)buf, sizeof(buf),
185                                     &iface, &dir)) > 0) {
186                 ifp = iface ? get_unit(iface) : NULL;
187                 ip->ip_off = ntohs(ip->ip_off);
188                 ip->ip_len = ntohs(ip->ip_len);
189                 switch (fr_check(ip, ip->ip_hl << 2, ifp, dir, (mb_t **)&buf))
190                 {
191                 case -2 :
192                         (void)printf("auth");
193                         break;
194                 case -1 :
195                         (void)printf("block");
196                         break;
197                 case 0 :
198                         (void)printf("pass");
199                         break;
200                 case 1 :
201                         (void)printf("nomatch");
202                         break;
203                 }
204                 if (!(opts & OPT_BRIEF)) {
205                         putchar(' ');
206                         printpacket((ip_t *)buf);
207                         printf("--------------");
208                 }
209 #ifndef linux
210                 if (dir && ifp && ip->ip_v)
211 # ifdef __sgi
212                         (*ifp->if_output)(ifp, (void *)buf, NULL);
213 # else
214                         (*ifp->if_output)(ifp, (void *)buf, NULL, 0);
215 # endif
216 #endif
217                 putchar('\n');
218                 dir = 0;
219         }
220         (*r->r_close)();
221         return 0;
222 }