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 buildopts(cp, op, len) 15255332Scy char *cp, *op; 16255332Scy int len; 17145510Sdarrenr{ 18145510Sdarrenr struct ipopt_names *io; 19145510Sdarrenr u_32_t msk = 0; 20145510Sdarrenr char *s, *t; 21145510Sdarrenr int inc; 22145510Sdarrenr 23145510Sdarrenr for (s = strtok(cp, ","); s; s = strtok(NULL, ",")) { 24145510Sdarrenr if ((t = strchr(s, '='))) 25145510Sdarrenr *t++ = '\0'; 26255332Scy else 27255332Scy t = ""; 28145510Sdarrenr for (io = ionames; io->on_name; io++) { 29145510Sdarrenr if (strcasecmp(s, io->on_name) || (msk & io->on_bit)) 30145510Sdarrenr continue; 31145510Sdarrenr if ((inc = addipopt(op, io, len, t))) { 32145510Sdarrenr op += inc; 33145510Sdarrenr len += inc; 34145510Sdarrenr } 35145510Sdarrenr msk |= io->on_bit; 36145510Sdarrenr break; 37145510Sdarrenr } 38145510Sdarrenr if (!io->on_name) { 39145510Sdarrenr fprintf(stderr, "unknown IP option name %s\n", s); 40145510Sdarrenr return 0; 41145510Sdarrenr } 42145510Sdarrenr } 43255332Scy while ((len & 3) != 3) { 44255332Scy *op++ = IPOPT_NOP; 45255332Scy len++; 46255332Scy } 47145510Sdarrenr *op++ = IPOPT_EOL; 48145510Sdarrenr len++; 49145510Sdarrenr return len; 50145510Sdarrenr} 51