1/*	$FreeBSD$	*/
2
3/*
4 * Copyright (C) 2012 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 * $Id$
9 */
10
11#include "ipf.h"
12
13
14u_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