1 /*        $NetBSD: optname.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $  */
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * Id: optname.c,v 1.1.1.2 2012/07/22 13:44:39 darrenr Exp $
9  */
10 
11 #include "ipf.h"
12 
13 
optname(cp,sp,linenum)14 u_32_t optname(cp, sp, linenum)
15           char ***cp;
16           u_short *sp;
17           int linenum;
18 {
19           struct ipopt_names *io, *so;
20           u_long msk = 0;
21           u_short smsk = 0;
22           char *s;
23           int sec = 0;
24 
25           for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) {
26                     for (io = ionames; io->on_name; io++)
27                               if (!strcasecmp(s, io->on_name)) {
28                                         msk |= io->on_bit;
29                                         break;
30                               }
31                     if (!io->on_name) {
32                               fprintf(stderr, "%d: unknown IP option name %s\n",
33                                         linenum, s);
34                               return 0;
35                     }
36                     if (!strcasecmp(s, "sec-class"))
37                               sec = 1;
38           }
39 
40           if (sec && !*(*cp + 1)) {
41                     fprintf(stderr, "%d: missing security level after sec-class\n",
42                               linenum);
43                     return 0;
44           }
45 
46           if (sec) {
47                     (*cp)++;
48                     for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) {
49                               for (so = secclass; so->on_name; so++)
50                                         if (!strcasecmp(s, so->on_name)) {
51                                                   smsk |= so->on_bit;
52                                                   break;
53                                         }
54                               if (!so->on_name) {
55                                         fprintf(stderr,
56                                                   "%d: no such security level: %s\n",
57                                                   linenum, s);
58                                         return 0;
59                               }
60                     }
61                     if (smsk)
62                               *sp = smsk;
63           }
64           return msk;
65 }
66