]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ipfilter/lib/ports.c
This commit was generated by cvs2svn to compensate for changes in r157571,
[FreeBSD/FreeBSD.git] / contrib / ipfilter / lib / ports.c
1 /*      $FreeBSD$       */
2
3 /*
4  * Copyright (C) 1993-2001 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id: ports.c,v 1.9.4.1 2004/12/09 19:41:22 darrenr Exp $
9  */
10
11 #include <ctype.h>
12
13 #include "ipf.h"
14
15
16 /*
17  * check for possible presence of the port fields in the line
18  */
19 int     ports(seg, proto, pp, cp, tp, linenum)
20 char    ***seg;
21 char    *proto;
22 u_short *pp;
23 int     *cp;
24 u_short *tp;
25 int     linenum;
26 {
27         int     comp = -1;
28
29         if (!*seg || !**seg || !***seg)
30                 return 0;
31         if (!strcasecmp(**seg, "port") && *(*seg + 1) && *(*seg + 2)) {
32                 (*seg)++;
33                 if (ISALNUM(***seg) && *(*seg + 2)) {
34                         if (portnum(**seg, proto, pp, linenum) == 0)
35                                 return -1;
36                         (*seg)++;
37                         if (!strcmp(**seg, "<>"))
38                                 comp = FR_OUTRANGE;
39                         else if (!strcmp(**seg, "><"))
40                                 comp = FR_INRANGE;
41                         else {
42                                 fprintf(stderr,
43                                         "%d: unknown range operator (%s)\n",
44                                         linenum, **seg);
45                                 return -1;
46                         }
47                         (*seg)++;
48                         if (**seg == NULL) {
49                                 fprintf(stderr, "%d: missing 2nd port value\n",
50                                         linenum);
51                                 return -1;
52                         }
53                         if (portnum(**seg, proto, tp, linenum) == 0)
54                                 return -1;
55                 } else if (!strcmp(**seg, "=") || !strcasecmp(**seg, "eq"))
56                         comp = FR_EQUAL;
57                 else if (!strcmp(**seg, "!=") || !strcasecmp(**seg, "ne"))
58                         comp = FR_NEQUAL;
59                 else if (!strcmp(**seg, "<") || !strcasecmp(**seg, "lt"))
60                         comp = FR_LESST;
61                 else if (!strcmp(**seg, ">") || !strcasecmp(**seg, "gt"))
62                         comp = FR_GREATERT;
63                 else if (!strcmp(**seg, "<=") || !strcasecmp(**seg, "le"))
64                         comp = FR_LESSTE;
65                 else if (!strcmp(**seg, ">=") || !strcasecmp(**seg, "ge"))
66                         comp = FR_GREATERTE;
67                 else {
68                         fprintf(stderr, "%d: unknown comparator (%s)\n",
69                                         linenum, **seg);
70                         return -1;
71                 }
72                 if (comp != FR_OUTRANGE && comp != FR_INRANGE) {
73                         (*seg)++;
74                         if (portnum(**seg, proto, pp, linenum) == 0)
75                                 return -1;
76                 }
77                 *cp = comp;
78                 (*seg)++;
79         }
80         return 0;
81 }