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