|  | /* | 
|  | * Copyright (C) 2000-2002 by Darren Reed. | 
|  | * | 
|  | * See the IPFILTER.LICENCE file for details on licencing. | 
|  | * | 
|  | * $Id$ | 
|  | */ | 
|  |  | 
|  | #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; | 
|  | } |