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