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
13u_32_t
14optname(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