68 lines
1.2 KiB
C
68 lines
1.2 KiB
C
/* $NetBSD: addipopt.c,v 1.1.1.2 2007/04/14 20:17:31 martin Exp $ */
|
|
|
|
/*
|
|
* Copyright (C) 2000-2002 by Darren Reed.
|
|
*
|
|
* See the IPFILTER.LICENCE file for details on licencing.
|
|
*
|
|
* Id: addipopt.c,v 1.7.4.1 2006/06/16 17:20:56 darrenr Exp
|
|
*/
|
|
|
|
#include "ipf.h"
|
|
|
|
|
|
int addipopt(op, io, len, class)
|
|
char *op;
|
|
struct ipopt_names *io;
|
|
int len;
|
|
char *class;
|
|
{
|
|
int olen = len;
|
|
struct in_addr ipadr;
|
|
u_short val;
|
|
u_char lvl;
|
|
char *s;
|
|
|
|
if ((len + io->on_siz) > 48) {
|
|
fprintf(stderr, "options too long\n");
|
|
return 0;
|
|
}
|
|
len += io->on_siz;
|
|
*op++ = io->on_value;
|
|
if (io->on_siz > 1) {
|
|
s = op;
|
|
*op++ = io->on_siz;
|
|
*op++ = IPOPT_MINOFF;
|
|
|
|
if (class) {
|
|
switch (io->on_value)
|
|
{
|
|
case IPOPT_SECURITY :
|
|
lvl = seclevel(class);
|
|
*(op - 1) = lvl;
|
|
break;
|
|
case IPOPT_LSRR :
|
|
case IPOPT_SSRR :
|
|
ipadr.s_addr = inet_addr(class);
|
|
s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4;
|
|
bcopy((char *)&ipadr, op, sizeof(ipadr));
|
|
break;
|
|
case IPOPT_SATID :
|
|
val = atoi(class);
|
|
bcopy((char *)&val, op, 2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
op += io->on_siz - 3;
|
|
if (len & 3) {
|
|
*op++ = IPOPT_NOP;
|
|
len++;
|
|
}
|
|
}
|
|
if (opts & OPT_DEBUG)
|
|
fprintf(stderr, "bo: %s %d %#x: %d\n",
|
|
io->on_name, io->on_value, io->on_bit, len);
|
|
return len - olen;
|
|
}
|