1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3145510Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
8255332Scy * $Id$
9145510Sdarrenr */
10145510Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145510Sdarrenr
13145510Sdarrenr
14145510Sdarrenru_32_t optname(cp, sp, linenum)
15255332Scy	char ***cp;
16255332Scy	u_short *sp;
17255332Scy	int linenum;
18145510Sdarrenr{
19145510Sdarrenr	struct ipopt_names *io, *so;
20145510Sdarrenr	u_long msk = 0;
21145510Sdarrenr	u_short smsk = 0;
22145510Sdarrenr	char *s;
23145510Sdarrenr	int sec = 0;
24145510Sdarrenr
25145510Sdarrenr	for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) {
26145510Sdarrenr		for (io = ionames; io->on_name; io++)
27145510Sdarrenr			if (!strcasecmp(s, io->on_name)) {
28145510Sdarrenr				msk |= io->on_bit;
29145510Sdarrenr				break;
30145510Sdarrenr			}
31145510Sdarrenr		if (!io->on_name) {
32145510Sdarrenr			fprintf(stderr, "%d: unknown IP option name %s\n",
33145510Sdarrenr				linenum, s);
34145510Sdarrenr			return 0;
35145510Sdarrenr		}
36145510Sdarrenr		if (!strcasecmp(s, "sec-class"))
37145510Sdarrenr			sec = 1;
38145510Sdarrenr	}
39145510Sdarrenr
40145510Sdarrenr	if (sec && !*(*cp + 1)) {
41145510Sdarrenr		fprintf(stderr, "%d: missing security level after sec-class\n",
42145510Sdarrenr			linenum);
43145510Sdarrenr		return 0;
44145510Sdarrenr	}
45145510Sdarrenr
46145510Sdarrenr	if (sec) {
47145510Sdarrenr		(*cp)++;
48145510Sdarrenr		for (s = strtok(**cp, ","); s; s = strtok(NULL, ",")) {
49145510Sdarrenr			for (so = secclass; so->on_name; so++)
50145510Sdarrenr				if (!strcasecmp(s, so->on_name)) {
51145510Sdarrenr					smsk |= so->on_bit;
52145510Sdarrenr					break;
53145510Sdarrenr				}
54145510Sdarrenr			if (!so->on_name) {
55145510Sdarrenr				fprintf(stderr,
56145510Sdarrenr					"%d: no such security level: %s\n",
57145510Sdarrenr					linenum, s);
58145510Sdarrenr				return 0;
59145510Sdarrenr			}
60145510Sdarrenr		}
61145510Sdarrenr		if (smsk)
62145510Sdarrenr			*sp = smsk;
63145510Sdarrenr	}
64145510Sdarrenr	return msk;
65145510Sdarrenr}
66