44bc301921
Reported by: jrtc27 Fixes: 2582ae5740181e0d2bab10003d66ae91c9b56329 MFC after: 1 month
50 lines
817 B
C
50 lines
817 B
C
/* $FreeBSD$ */
|
|
|
|
/*
|
|
* Copyright (C) 2012 by Darren Reed.
|
|
*
|
|
* See the IPFILTER.LICENCE file for details on licencing.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
#include "ipf.h"
|
|
|
|
|
|
u_32_t
|
|
buildopts(char *cp, char *op, int len)
|
|
{
|
|
struct ipopt_names *io;
|
|
u_32_t msk = 0;
|
|
char *s, *t;
|
|
int inc;
|
|
|
|
for (s = strtok(cp, ","); s; s = strtok(NULL, ",")) {
|
|
if ((t = strchr(s, '=')))
|
|
*t++ = '\0';
|
|
else
|
|
t = "";
|
|
for (io = ionames; io->on_name; io++) {
|
|
if (strcasecmp(s, io->on_name) || (msk & io->on_bit))
|
|
continue;
|
|
if ((inc = addipopt(op, io, len, t))) {
|
|
op += inc;
|
|
len += inc;
|
|
}
|
|
msk |= io->on_bit;
|
|
break;
|
|
}
|
|
if (!io->on_name) {
|
|
fprintf(stderr, "unknown IP option name %s\n", s);
|
|
return (0);
|
|
}
|
|
}
|
|
while ((len & 3) != 3) {
|
|
*op++ = IPOPT_NOP;
|
|
len++;
|
|
}
|
|
*op++ = IPOPT_EOL;
|
|
len++;
|
|
return (len);
|
|
}
|