Home | History | Annotate | Line # | Download | only in lib
addipopt.c revision 1.2
      1 /*	$NetBSD: addipopt.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2012 by Darren Reed.
      5  *
      6  * See the IPFILTER.LICENCE file for details on licencing.
      7  *
      8  * Id: addipopt.c,v 1.1.1.2 2012/07/22 13:44:38 darrenr Exp $
      9  */
     10 
     11 #include "ipf.h"
     12 
     13 
     14 int addipopt(op, io, len, class)
     15 	char *op;
     16 	struct ipopt_names *io;
     17 	int len;
     18 	char *class;
     19 {
     20 	int olen = len;
     21 	struct in_addr ipadr;
     22 	u_short val;
     23 	u_char lvl;
     24 	char *s;
     25 
     26 	if ((len + io->on_siz) > 48) {
     27 		fprintf(stderr, "options too long\n");
     28 		return 0;
     29 	}
     30 	len += io->on_siz;
     31 	*op++ = io->on_value;
     32 	if (io->on_siz > 1) {
     33 		s = op;
     34 		*op++ = io->on_siz;
     35 		*op++ = IPOPT_MINOFF;
     36 
     37 		if (class) {
     38 			switch (io->on_value)
     39 			{
     40 			case IPOPT_SECURITY :
     41 				lvl = seclevel(class);
     42 				*(op - 1) = lvl;
     43 				break;
     44 			case IPOPT_RR :
     45 			case IPOPT_TS :
     46 				s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4;
     47 				break;
     48 			case IPOPT_LSRR :
     49 			case IPOPT_SSRR :
     50 				ipadr.s_addr = inet_addr(class);
     51 				s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4;
     52 				bcopy((char *)&ipadr, op, sizeof(ipadr));
     53 				break;
     54 			case IPOPT_SATID :
     55 				val = atoi(class);
     56 				bcopy((char *)&val, op, 2);
     57 				break;
     58 			}
     59 		}
     60 	}
     61 	if (opts & OPT_DEBUG)
     62 		fprintf(stderr, "bo: %s %d %#x: %d\n",
     63 			io->on_name, io->on_value, io->on_bit, len);
     64 	return len - olen;
     65 }
     66