| /* |
| * Copyright (C) 2012 by Darren Reed. |
| * |
| * See the IPFILTER.LICENCE file for details on licencing. |
| * |
| * $Id$ |
| */ |
| |
| #include "ipf.h" |
| |
| |
| u_32_t optname(cp, sp, linenum) |
| char ***cp; |
| u_short *sp; |
| int linenum; |
| { |
| struct ipopt_names *io, *so; |
| u_long msk = 0; |
| u_short smsk = 0; |
| char *s; |
| int sec = 0; |
| |
| for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) { |
| for (io = ionames; io->on_name; io++) |
| if (!strcasecmp(s, io->on_name)) { |
| msk |= io->on_bit; |
| break; |
| } |
| if (!io->on_name) { |
| fprintf(stderr, "%d: unknown IP option name %s\n", |
| linenum, s); |
| return 0; |
| } |
| if (!strcasecmp(s, "sec-class")) |
| sec = 1; |
| } |
| |
| if (sec && !*(*cp + 1)) { |
| fprintf(stderr, "%d: missing security level after sec-class\n", |
| linenum); |
| return 0; |
| } |
| |
| if (sec) { |
| (*cp)++; |
| for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) { |
| for (so = secclass; so->on_name; so++) |
| if (!strcasecmp(s, so->on_name)) { |
| smsk |= so->on_bit; |
| break; |
| } |
| if (!so->on_name) { |
| fprintf(stderr, |
| "%d: no such security level: %s\n", |
| linenum, s); |
| return 0; |
| } |
| } |
| if (smsk) |
| *sp = smsk; |
| } |
| return msk; |
| } |