summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/lib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ipfilter/lib')
-rw-r--r--contrib/ipfilter/lib/Makefile209
-rw-r--r--contrib/ipfilter/lib/addicmp.c4
-rw-r--r--contrib/ipfilter/lib/addipopt.c22
-rw-r--r--contrib/ipfilter/lib/alist_free.c6
-rw-r--r--contrib/ipfilter/lib/alist_new.c89
-rw-r--r--contrib/ipfilter/lib/allocmbt.c22
-rw-r--r--contrib/ipfilter/lib/assigndefined.c27
-rw-r--r--contrib/ipfilter/lib/bcopywrap.c12
-rw-r--r--contrib/ipfilter/lib/binprint.c8
-rw-r--r--contrib/ipfilter/lib/buildopts.c14
-rw-r--r--contrib/ipfilter/lib/checkrev.c24
-rw-r--r--contrib/ipfilter/lib/connecttcp.c48
-rw-r--r--contrib/ipfilter/lib/count4bits.c6
-rw-r--r--contrib/ipfilter/lib/count6bits.c6
-rw-r--r--contrib/ipfilter/lib/debug.c37
-rw-r--r--contrib/ipfilter/lib/dupmbt.c24
-rw-r--r--contrib/ipfilter/lib/facpri.c24
-rw-r--r--contrib/ipfilter/lib/facpri.h4
-rw-r--r--contrib/ipfilter/lib/familyname.c12
-rw-r--r--contrib/ipfilter/lib/fill6bits.c8
-rw-r--r--contrib/ipfilter/lib/findword.c25
-rw-r--r--contrib/ipfilter/lib/flags.c4
-rw-r--r--contrib/ipfilter/lib/freembt.c16
-rw-r--r--contrib/ipfilter/lib/ftov.c16
-rw-r--r--contrib/ipfilter/lib/gethost.c69
-rw-r--r--contrib/ipfilter/lib/geticmptype.c29
-rw-r--r--contrib/ipfilter/lib/getifname.c21
-rw-r--r--contrib/ipfilter/lib/getnattype.c43
-rw-r--r--contrib/ipfilter/lib/getport.c31
-rw-r--r--contrib/ipfilter/lib/getportproto.c16
-rw-r--r--contrib/ipfilter/lib/getproto.c20
-rw-r--r--contrib/ipfilter/lib/getsumd.c14
-rw-r--r--contrib/ipfilter/lib/hostname.c24
-rw-r--r--contrib/ipfilter/lib/icmpcode.c4
-rw-r--r--contrib/ipfilter/lib/icmptypename.c28
-rw-r--r--contrib/ipfilter/lib/icmptypes.c107
-rw-r--r--contrib/ipfilter/lib/initparse.c4
-rw-r--r--contrib/ipfilter/lib/interror.c582
-rw-r--r--contrib/ipfilter/lib/ionames.c49
-rw-r--r--contrib/ipfilter/lib/ipf_dotuning.c26
-rw-r--r--contrib/ipfilter/lib/ipf_perror.c47
-rw-r--r--contrib/ipfilter/lib/ipft_ef.c135
-rw-r--r--contrib/ipfilter/lib/ipft_hx.c47
-rw-r--r--contrib/ipfilter/lib/ipft_pc.c165
-rw-r--r--contrib/ipfilter/lib/ipft_sn.c197
-rw-r--r--contrib/ipfilter/lib/ipft_td.c178
-rw-r--r--contrib/ipfilter/lib/ipft_tx.c273
-rw-r--r--contrib/ipfilter/lib/ipoptsec.c15
-rw-r--r--contrib/ipfilter/lib/kmem.c32
-rw-r--r--contrib/ipfilter/lib/kmem.h4
-rw-r--r--contrib/ipfilter/lib/kmemcpywrap.c16
-rw-r--r--contrib/ipfilter/lib/kvatoname.c18
-rw-r--r--contrib/ipfilter/lib/load_dstlist.c69
-rw-r--r--contrib/ipfilter/lib/load_dstlistnode.c70
-rw-r--r--contrib/ipfilter/lib/load_file.c44
-rw-r--r--contrib/ipfilter/lib/load_hash.c47
-rw-r--r--contrib/ipfilter/lib/load_hashnode.c42
-rw-r--r--contrib/ipfilter/lib/load_http.c97
-rw-r--r--contrib/ipfilter/lib/load_pool.c36
-rw-r--r--contrib/ipfilter/lib/load_poolnode.c43
-rw-r--r--contrib/ipfilter/lib/load_url.c12
-rw-r--r--contrib/ipfilter/lib/mb_hexdump.c32
-rw-r--r--contrib/ipfilter/lib/msgdsize.c20
-rw-r--r--contrib/ipfilter/lib/mutex_emul.c81
-rw-r--r--contrib/ipfilter/lib/nametokva.c18
-rw-r--r--contrib/ipfilter/lib/nat_setgroupmap.c20
-rw-r--r--contrib/ipfilter/lib/ntomask.c29
-rw-r--r--contrib/ipfilter/lib/optname.c10
-rw-r--r--contrib/ipfilter/lib/optprint.c8
-rw-r--r--contrib/ipfilter/lib/optprintv6.c10
-rw-r--r--contrib/ipfilter/lib/optvalue.c8
-rw-r--r--contrib/ipfilter/lib/parsefields.c48
-rw-r--r--contrib/ipfilter/lib/parseipfexpr.c283
-rw-r--r--contrib/ipfilter/lib/parsewhoisline.c132
-rw-r--r--contrib/ipfilter/lib/poolio.c53
-rw-r--r--contrib/ipfilter/lib/portname.c15
-rw-r--r--contrib/ipfilter/lib/prependmbt.c18
-rw-r--r--contrib/ipfilter/lib/print_toif.c50
-rw-r--r--contrib/ipfilter/lib/printactiveaddr.c37
-rw-r--r--contrib/ipfilter/lib/printactivenat.c130
-rw-r--r--contrib/ipfilter/lib/printaddr.c75
-rw-r--r--contrib/ipfilter/lib/printaps.c63
-rw-r--r--contrib/ipfilter/lib/printbuf.c18
-rw-r--r--contrib/ipfilter/lib/printdstl_live.c84
-rw-r--r--contrib/ipfilter/lib/printdstlist.c60
-rw-r--r--contrib/ipfilter/lib/printdstlistdata.c47
-rw-r--r--contrib/ipfilter/lib/printdstlistnode.c78
-rw-r--r--contrib/ipfilter/lib/printdstlistpolicy.c31
-rw-r--r--contrib/ipfilter/lib/printfieldhdr.c55
-rw-r--r--contrib/ipfilter/lib/printfr.c448
-rw-r--r--contrib/ipfilter/lib/printfraginfo.c32
-rw-r--r--contrib/ipfilter/lib/printhash.c22
-rw-r--r--contrib/ipfilter/lib/printhash_live.c41
-rw-r--r--contrib/ipfilter/lib/printhashdata.c52
-rw-r--r--contrib/ipfilter/lib/printhashnode.c48
-rw-r--r--contrib/ipfilter/lib/printhost.c35
-rw-r--r--contrib/ipfilter/lib/printhostmap.c35
-rw-r--r--contrib/ipfilter/lib/printhostmask.c33
-rw-r--r--contrib/ipfilter/lib/printifname.c16
-rw-r--r--contrib/ipfilter/lib/printip.c35
-rw-r--r--contrib/ipfilter/lib/printipfexpr.c197
-rw-r--r--contrib/ipfilter/lib/printiphdr.c20
-rw-r--r--contrib/ipfilter/lib/printlog.c21
-rw-r--r--contrib/ipfilter/lib/printlookup.c42
-rw-r--r--contrib/ipfilter/lib/printmask.c26
-rw-r--r--contrib/ipfilter/lib/printnat.c367
-rw-r--r--contrib/ipfilter/lib/printnataddr.c48
-rw-r--r--contrib/ipfilter/lib/printnatfield.c220
-rw-r--r--contrib/ipfilter/lib/printnatside.c55
-rw-r--r--contrib/ipfilter/lib/printpacket.c67
-rw-r--r--contrib/ipfilter/lib/printpacket6.c39
-rw-r--r--contrib/ipfilter/lib/printpool.c29
-rw-r--r--contrib/ipfilter/lib/printpool_live.c54
-rw-r--r--contrib/ipfilter/lib/printpooldata.c52
-rw-r--r--contrib/ipfilter/lib/printpoolfield.c168
-rw-r--r--contrib/ipfilter/lib/printpoolnode.c42
-rw-r--r--contrib/ipfilter/lib/printportcmp.c17
-rw-r--r--contrib/ipfilter/lib/printproto.c38
-rw-r--r--contrib/ipfilter/lib/printsbuf.c28
-rw-r--r--contrib/ipfilter/lib/printstate.c151
-rw-r--r--contrib/ipfilter/lib/printstatefields.c358
-rw-r--r--contrib/ipfilter/lib/printtcpflags.c30
-rw-r--r--contrib/ipfilter/lib/printtqtable.c17
-rw-r--r--contrib/ipfilter/lib/printtunable.c29
-rw-r--r--contrib/ipfilter/lib/printunit.c47
-rw-r--r--contrib/ipfilter/lib/remove_hash.c25
-rw-r--r--contrib/ipfilter/lib/remove_hashnode.c28
-rw-r--r--contrib/ipfilter/lib/remove_pool.c25
-rw-r--r--contrib/ipfilter/lib/remove_poolnode.c27
-rw-r--r--contrib/ipfilter/lib/resetlexer.c12
-rw-r--r--contrib/ipfilter/lib/rwlock_emul.c50
-rw-r--r--contrib/ipfilter/lib/save_execute.c80
-rw-r--r--contrib/ipfilter/lib/save_file.c130
-rw-r--r--contrib/ipfilter/lib/save_nothing.c62
-rw-r--r--contrib/ipfilter/lib/save_syslog.c137
-rw-r--r--contrib/ipfilter/lib/save_v1trap.c463
-rw-r--r--contrib/ipfilter/lib/save_v2trap.c459
-rw-r--r--contrib/ipfilter/lib/tcpflags.c6
-rw-r--r--contrib/ipfilter/lib/tcpoptnames.c4
-rw-r--r--contrib/ipfilter/lib/v6ionames.c8
-rw-r--r--contrib/ipfilter/lib/v6optvalue.c8
-rw-r--r--contrib/ipfilter/lib/var.c26
-rw-r--r--contrib/ipfilter/lib/verbose.c32
-rw-r--r--contrib/ipfilter/lib/vtof.c16
144 files changed, 7222 insertions, 2169 deletions
diff --git a/contrib/ipfilter/lib/Makefile b/contrib/ipfilter/lib/Makefile
index a838063..fdda78e 100644
--- a/contrib/ipfilter/lib/Makefile
+++ b/contrib/ipfilter/lib/Makefile
@@ -1,27 +1,37 @@
#
-# Copyright (C) 1993-2001 by Darren Reed.
-#
-# See the IPFILTER.LICENCE file for details on licencing.
-#
-# $Id: Makefile,v 1.41.2.14 2007/09/21 08:30:43 darrenr Exp $
-#
+# Copyright (C) 2012 by Darren Reed.
+#
+# See the IPFILTER.LICENCE file for details on licencing.
+#
+# $Id$
+#
INCDEP=$(TOP)/ip_compat.h $(TOP)/ip_fil.h $(TOP)/ipf.h
LIBOBJS=$(DEST)/addicmp.o \
$(DEST)/addipopt.o \
$(DEST)/alist_free.o \
$(DEST)/alist_new.o \
+ $(DEST)/allocmbt.o \
+ $(DEST)/assigndefined.o \
$(DEST)/bcopywrap.o \
$(DEST)/binprint.o \
$(DEST)/buildopts.o \
$(DEST)/checkrev.o \
+ $(DEST)/connecttcp.o \
$(DEST)/count6bits.o \
$(DEST)/count4bits.o \
$(DEST)/debug.o \
+ $(DEST)/dupmbt.o \
+ $(DEST)/familyname.o \
$(DEST)/facpri.o \
- $(DEST)/flags.o \
$(DEST)/fill6bits.o \
+ $(DEST)/findword.o \
+ $(DEST)/flags.o \
+ $(DEST)/freembt.o \
+ $(DEST)/ftov.o \
+ $(DEST)/genmask.o \
$(DEST)/gethost.o \
+ $(DEST)/geticmptype.o \
$(DEST)/getifname.o \
$(DEST)/getnattype.o \
$(DEST)/getport.o \
@@ -30,27 +40,30 @@ LIBOBJS=$(DEST)/addicmp.o \
$(DEST)/getsumd.o \
$(DEST)/hostname.o \
$(DEST)/icmpcode.o \
- $(DEST)/inet_addr.o \
+ $(DEST)/icmptypename.o \
+ $(DEST)/icmptypes.o \
$(DEST)/initparse.o \
+ $(DEST)/interror.o \
$(DEST)/ionames.o \
- $(DEST)/ipoptsec.o \
$(DEST)/ipf_dotuning.o \
- $(DEST)/ipft_ef.o \
+ $(DEST)/ipf_perror.o \
$(DEST)/ipft_hx.o \
$(DEST)/ipft_pc.o \
- $(DEST)/ipft_sn.o \
- $(DEST)/ipft_td.o \
$(DEST)/ipft_tx.o \
+ $(DEST)/ipoptsec.o \
$(DEST)/kmem.o \
$(DEST)/kmemcpywrap.o \
$(DEST)/kvatoname.o \
$(DEST)/load_file.o \
+ $(DEST)/load_dstlist.o \
+ $(DEST)/load_dstlistnode.o \
$(DEST)/load_hash.o \
$(DEST)/load_hashnode.o \
$(DEST)/load_http.o \
$(DEST)/load_pool.o \
$(DEST)/load_poolnode.o \
$(DEST)/load_url.o \
+ $(DEST)/msgdsize.o \
$(DEST)/mutex_emul.o \
$(DEST)/nametokva.o \
$(DEST)/nat_setgroupmap.o \
@@ -59,46 +72,74 @@ LIBOBJS=$(DEST)/addicmp.o \
$(DEST)/optprint.o \
$(DEST)/optprintv6.o \
$(DEST)/optvalue.o \
+ $(DEST)/parsefields.o \
+ $(DEST)/parseipfexpr.o \
+ $(DEST)/parsewhoisline.o \
+ $(DEST)/poolio.o \
$(DEST)/portname.o \
$(DEST)/print_toif.o \
+ $(DEST)/printactiveaddr.o \
$(DEST)/printactivenat.o \
+ $(DEST)/printaddr.o \
$(DEST)/printaps.o \
$(DEST)/printbuf.o \
+ $(DEST)/printdstlist.o \
+ $(DEST)/printdstlistdata.o \
+ $(DEST)/printdstlistnode.o \
+ $(DEST)/printdstlistpolicy.o \
+ $(DEST)/printdstl_live.o \
+ $(DEST)/printfieldhdr.o \
+ $(DEST)/printfr.o \
+ $(DEST)/printfraginfo.o \
$(DEST)/printhash.o \
$(DEST)/printhashdata.o \
$(DEST)/printhashnode.o \
$(DEST)/printhash_live.o \
+ $(DEST)/printhost.o \
+ $(DEST)/printhostmap.o \
+ $(DEST)/printhostmask.o \
+ $(DEST)/printifname.o \
$(DEST)/printip.o \
+ $(DEST)/printipfexpr.o \
+ $(DEST)/printlog.o \
+ $(DEST)/printlookup.o \
+ $(DEST)/printmask.o \
+ $(DEST)/printnat.o \
+ $(DEST)/printnataddr.o \
+ $(DEST)/printnatfield.o \
+ $(DEST)/printnatside.o \
$(DEST)/printpool.o \
$(DEST)/printpooldata.o \
+ $(DEST)/printpoolfield.o \
$(DEST)/printpoolnode.o \
$(DEST)/printpool_live.o \
$(DEST)/printproto.o \
- $(DEST)/printfr.o \
- $(DEST)/printfraginfo.o \
- $(DEST)/printhostmap.o \
- $(DEST)/printifname.o \
- $(DEST)/printhostmask.o \
- $(DEST)/printlog.o \
- $(DEST)/printmask.o \
- $(DEST)/printnat.o \
$(DEST)/printportcmp.o \
$(DEST)/printpacket.o \
$(DEST)/printpacket6.o \
$(DEST)/printsbuf.o \
$(DEST)/printstate.o \
+ $(DEST)/printstatefields.o \
+ $(DEST)/printtcpflags.o \
$(DEST)/printtqtable.o \
$(DEST)/printtunable.o \
+ $(DEST)/printunit.o \
$(DEST)/remove_hash.o \
$(DEST)/remove_hashnode.o \
$(DEST)/remove_pool.o \
$(DEST)/remove_poolnode.o \
$(DEST)/resetlexer.o \
$(DEST)/rwlock_emul.o \
+ $(DEST)/save_execute.o \
+ $(DEST)/save_file.o \
+ $(DEST)/save_nothing.o \
+ $(DEST)/save_syslog.o \
+ $(DEST)/save_v1trap.o \
+ $(DEST)/save_v2trap.o \
$(DEST)/tcpflags.o \
- $(DEST)/tcp_flags.o \
$(DEST)/var.o \
$(DEST)/verbose.o \
+ $(DEST)/vtof.o \
$(DEST)/v6ionames.o \
$(DEST)/v6optvalue.o
@@ -115,12 +156,18 @@ $(DEST)/alist_free.o: $(LIBSRC)/alist_free.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/alist_free.c -o $@
$(DEST)/alist_new.o: $(LIBSRC)/alist_new.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/alist_new.c -o $@
+$(DEST)/allocmbt.o: $(LIBSRC)/allocmbt.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/allocmbt.c -o $@
+$(DEST)/assigndefined.o: $(LIBSRC)/assigndefined.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/assigndefined.c -o $@
$(DEST)/bcopywrap.o: $(LIBSRC)/bcopywrap.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/bcopywrap.c -o $@
$(DEST)/binprint.o: $(LIBSRC)/binprint.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/binprint.c -o $@
$(DEST)/buildopts.o: $(LIBSRC)/buildopts.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/buildopts.c -o $@
+$(DEST)/connecttcp.o: $(LIBSRC)/connecttcp.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/connecttcp.c -o $@
$(DEST)/count6bits.o: $(LIBSRC)/count6bits.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/count6bits.c -o $@
$(DEST)/checkrev.o: $(LIBSRC)/checkrev.c $(INCDEP) $(TOP)/ipl.h
@@ -129,17 +176,31 @@ $(DEST)/count4bits.o: $(LIBSRC)/count4bits.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/count4bits.c -o $@
$(DEST)/debug.o: $(LIBSRC)/debug.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/debug.c -o $@
+$(DEST)/dupmbt.o: $(LIBSRC)/dupmbt.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/dupmbt.c -o $@
$(DEST)/facpri.o: $(LIBSRC)/facpri.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/facpri.c -o $@
+$(DEST)/familyname.o: $(LIBSRC)/familyname.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/familyname.c -o $@
$(DEST)/fill6bits.o: $(LIBSRC)/fill6bits.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/fill6bits.c -o $@
+$(DEST)/findword.o: $(LIBSRC)/findword.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/findword.c -o $@
$(DEST)/flags.o: $(LIBSRC)/flags.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/flags.c -o $@
+$(DEST)/freembt.o: $(LIBSRC)/freembt.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/freembt.c -o $@
+$(DEST)/ftov.o: $(LIBSRC)/ftov.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/ftov.c -o $@
+$(DEST)/genmask.o: $(LIBSRC)/genmask.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/genmask.c -o $@
$(DEST)/gethost.o: $(LIBSRC)/gethost.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/gethost.c -o $@
+$(DEST)/geticmptype.o: $(LIBSRC)/geticmptype.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/geticmptype.c -o $@
$(DEST)/getifname.o: $(LIBSRC)/getifname.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/getifname.c -o $@
-$(DEST)/getnattype.o: $(LIBSRC)/getnattype.c $(INCDEP)
+$(DEST)/getnattype.o: $(LIBSRC)/getnattype.c $(INCDEP) $(TOP)/ip_nat.h
$(CC) $(CCARGS) -c $(LIBSRC)/getnattype.c -o $@
$(DEST)/getport.o: $(LIBSRC)/getport.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/getport.c -o $@
@@ -153,26 +214,26 @@ $(DEST)/hostname.o: $(LIBSRC)/hostname.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/hostname.c -o $@
$(DEST)/icmpcode.o: $(LIBSRC)/icmpcode.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/icmpcode.c -o $@
+$(DEST)/icmptypename.o: $(LIBSRC)/icmptypename.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/icmptypename.c -o $@
+$(DEST)/icmptypes.o: $(LIBSRC)/icmptypes.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/icmptypes.c -o $@
+$(DEST)/interror.o: $(LIBSRC)/interror.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/interror.c -o $@
$(DEST)/ipoptsec.o: $(LIBSRC)/ipoptsec.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ipoptsec.c -o $@
-$(DEST)/inet_addr.o: $(LIBSRC)/inet_addr.c $(INCDEP)
- $(CC) $(CCARGS) -c $(LIBSRC)/inet_addr.c -o $@
$(DEST)/initparse.o: $(LIBSRC)/initparse.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/initparse.c -o $@
$(DEST)/ionames.o: $(LIBSRC)/ionames.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ionames.c -o $@
$(DEST)/ipf_dotuning.o: $(LIBSRC)/ipf_dotuning.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ipf_dotuning.c -o $@
-$(DEST)/ipft_ef.o: $(LIBSRC)/ipft_ef.c $(INCDEP)
- $(CC) $(CCARGS) -c $(LIBSRC)/ipft_ef.c -o $@
+$(DEST)/ipf_perror.o: $(LIBSRC)/ipf_perror.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/ipf_perror.c -o $@
$(DEST)/ipft_hx.o: $(LIBSRC)/ipft_hx.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ipft_hx.c -o $@
$(DEST)/ipft_pc.o: $(LIBSRC)/ipft_pc.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ipft_pc.c -o $@
-$(DEST)/ipft_sn.o: $(LIBSRC)/ipft_sn.c $(TOP)/snoop.h
- $(CC) $(CCARGS) -c $(LIBSRC)/ipft_sn.c -o $@
-$(DEST)/ipft_td.o: $(LIBSRC)/ipft_td.c $(INCDEP)
- $(CC) $(CCARGS) -c $(LIBSRC)/ipft_td.c -o $@
$(DEST)/ipft_tx.o: $(LIBSRC)/ipft_tx.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/ipft_tx.c -o $@
$(DEST)/kmem.o: $(LIBSRC)/kmem.c $(INCDEP)
@@ -183,6 +244,11 @@ $(DEST)/kvatoname.o: $(LIBSRC)/kvatoname.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/kvatoname.c -o $@
$(DEST)/load_file.o: $(LIBSRC)/load_file.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/load_file.c -o $@
+$(DEST)/load_dstlist.o: $(LIBSRC)/load_dstlist.c $(INCDEP) $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/load_dstlist.c -o $@
+$(DEST)/load_dstlistnode.o: $(LIBSRC)/load_dstlistnode.c $(INCDEP) \
+ $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/load_dstlistnode.c -o $@
$(DEST)/load_hash.o: $(LIBSRC)/load_hash.c $(INCDEP) $(TOP)/ip_htable.h
$(CC) $(CCARGS) -c $(LIBSRC)/load_hash.c -o $@
$(DEST)/load_hashnode.o: $(LIBSRC)/load_hashnode.c $(INCDEP) $(TOP)/ip_htable.h
@@ -195,8 +261,8 @@ $(DEST)/load_poolnode.o: $(LIBSRC)/load_poolnode.c $(INCDEP) $(TOP)/ip_pool.h
$(CC) $(CCARGS) -c $(LIBSRC)/load_poolnode.c -o $@
$(DEST)/load_url.o: $(LIBSRC)/load_url.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/load_url.c -o $@
-$(DEST)/make_range.o: $(LIBSRC)/make_range.c $(INCDEP)
- $(CC) $(CCARGS) -c $(LIBSRC)/make_range.c -o $@
+$(DEST)/msgdsize.o: $(LIBSRC)/msgdsize.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/msgdsize.c -o $@
$(DEST)/mutex_emul.o: $(LIBSRC)/mutex_emul.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/mutex_emul.c -o $@
$(DEST)/nametokva.o: $(LIBSRC)/nametokva.c $(INCDEP)
@@ -214,35 +280,78 @@ $(DEST)/optprintv6.o: $(LIBSRC)/optprintv6.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/optprintv6.c -o $@
$(DEST)/optvalue.o: $(LIBSRC)/optvalue.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/optvalue.c -o $@
+$(DEST)/parsefields.o: $(LIBSRC)/parsefields.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/parsefields.c -o $@
+$(DEST)/parseipfexpr.o: $(LIBSRC)/parseipfexpr.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/parseipfexpr.c -o $@
+$(DEST)/parsewhoisline.o: $(LIBSRC)/parsewhoisline.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/parsewhoisline.c -o $@
+$(DEST)/poolio.o: $(LIBSRC)/poolio.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/poolio.c -o $@
$(DEST)/portname.o: $(LIBSRC)/portname.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/portname.c -o $@
$(DEST)/print_toif.o: $(LIBSRC)/print_toif.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/print_toif.c -o $@
-$(DEST)/printactivenat.o: $(LIBSRC)/printactivenat.c $(INCDEP)
+$(DEST)/printactiveaddr.o: $(LIBSRC)/printactiveaddr.c $(INCDEP) $(TOP)/ip_nat.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printactiveaddr.c -o $@
+$(DEST)/printactivenat.o: $(LIBSRC)/printactivenat.c $(INCDEP) $(TOP)/ip_nat.h
$(CC) $(CCARGS) -c $(LIBSRC)/printactivenat.c -o $@
+$(DEST)/printaddr.o: $(LIBSRC)/printaddr.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/printaddr.c -o $@
$(DEST)/printaps.o: $(LIBSRC)/printaps.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printaps.c -o $@
$(DEST)/printbuf.o: $(LIBSRC)/printbuf.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printbuf.c -o $@
+$(DEST)/printdstlist.o: $(LIBSRC)/printdstlist.c $(INCDEP) $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printdstlist.c -o $@
+$(DEST)/printdstlistdata.o: $(LIBSRC)/printdstlistdata.c $(INCDEP) \
+ $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printdstlistdata.c -o $@
+$(DEST)/printdstlistnode.o: $(LIBSRC)/printdstlistnode.c $(INCDEP) \
+ $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printdstlistnode.c -o $@
+$(DEST)/printdstlistpolicy.o: $(LIBSRC)/printdstlistpolicy.c $(INCDEP) \
+ $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printdstlistpolicy.c -o $@
+$(DEST)/printfieldhdr.o: $(LIBSRC)/printfieldhdr.c $(TOP)/ip_fil.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printfieldhdr.c -o $@
$(DEST)/printfr.o: $(LIBSRC)/printfr.c $(TOP)/ip_fil.h
$(CC) $(CCARGS) -c $(LIBSRC)/printfr.c -o $@
-$(DEST)/printfraginfo.o: $(LIBSRC)/printfraginfo.c $(TOP)/ip_fil.h
+$(DEST)/printfraginfo.o: $(LIBSRC)/printfraginfo.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_frag.h
$(CC) $(CCARGS) -c $(LIBSRC)/printfraginfo.c -o $@
$(DEST)/printhash.o: $(LIBSRC)/printhash.c $(TOP)/ip_fil.h $(TOP)/ip_htable.h
$(CC) $(CCARGS) -c $(LIBSRC)/printhash.c -o $@
-$(DEST)/printhashdata.o: $(LIBSRC)/printhash.c $(TOP)/ip_fil.h $(TOP)/ip_htable.h
+$(DEST)/printhashdata.o: $(LIBSRC)/printhashdata.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_htable.h
$(CC) $(CCARGS) -c $(LIBSRC)/printhashdata.c -o $@
$(DEST)/printhashnode.o: $(LIBSRC)/printhashnode.c $(TOP)/ip_fil.h \
$(TOP)/ip_htable.h $(TOP)/ip_lookup.h
$(CC) $(CCARGS) -c $(LIBSRC)/printhashnode.c -o $@
-$(DEST)/printhash_live.o: $(LIBSRC)/printhash_live.c $(TOP)/ip_fil.h $(TOP)/ip_htable.h
+$(DEST)/printhash_live.o: $(LIBSRC)/printhash_live.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_htable.h
$(CC) $(CCARGS) -c $(LIBSRC)/printhash_live.c -o $@
+$(DEST)/printdstl_live.o: $(LIBSRC)/printdstl_live.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_dstlist.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printdstl_live.c -o $@
$(DEST)/printip.o: $(LIBSRC)/printip.c $(TOP)/ip_fil.h
$(CC) $(CCARGS) -c $(LIBSRC)/printip.c -o $@
+$(DEST)/printipfexpr.o: $(LIBSRC)/printipfexpr.c $(TOP)/ip_fil.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printipfexpr.c -o $@
+$(DEST)/printlookup.o: $(LIBSRC)/printlookup.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/printlookup.c -o $@
+$(DEST)/printnataddr.o: $(LIBSRC)/printnataddr.c $(INCDEP) $(TOP)/ip_nat.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printnataddr.c -o $@
+$(DEST)/printnatside.o: $(LIBSRC)/printnatside.c $(INCDEP) $(TOP)/ip_nat.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printnatside.c -o $@
$(DEST)/printpool.o: $(LIBSRC)/printpool.c $(TOP)/ip_fil.h $(TOP)/ip_pool.h
$(CC) $(CCARGS) -c $(LIBSRC)/printpool.c -o $@
-$(DEST)/printpooldata.o: $(LIBSRC)/printpooldata.c $(TOP)/ip_fil.h $(TOP)/ip_pool.h
+$(DEST)/printpooldata.o: $(LIBSRC)/printpooldata.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_pool.h $(TOP)/ip_lookup.h
$(CC) $(CCARGS) -c $(LIBSRC)/printpooldata.c -o $@
+$(DEST)/printpoolfield.o: $(LIBSRC)/printpoolfield.c $(TOP)/ip_fil.h \
+ $(TOP)/ip_pool.h $(TOP)/ip_lookup.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printpoolfield.c -o $@
$(DEST)/printpoolnode.o: $(LIBSRC)/printpoolnode.c $(TOP)/ip_fil.h \
$(TOP)/ip_pool.h $(TOP)/ip_lookup.h
$(CC) $(CCARGS) -c $(LIBSRC)/printpoolnode.c -o $@
@@ -251,14 +360,18 @@ $(DEST)/printpool_live.o: $(LIBSRC)/printpool_live.c $(TOP)/ip_fil.h \
$(CC) $(CCARGS) -c $(LIBSRC)/printpool_live.c -o $@
$(DEST)/printproto.o: $(LIBSRC)/printproto.c $(TOP)/ip_fil.h
$(CC) $(CCARGS) -c $(LIBSRC)/printproto.c -o $@
+$(DEST)/printhost.o: $(LIBSRC)/printhost.c $(TOP)/ip_fil.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printhost.c -o $@
$(DEST)/printhostmap.o: $(LIBSRC)/printhostmap.c $(TOP)/ip_fil.h
$(CC) $(CCARGS) -c $(LIBSRC)/printhostmap.c -o $@
$(DEST)/printifname.o: $(LIBSRC)/printifname.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printifname.c -o $@
$(DEST)/printmask.o: $(LIBSRC)/printmask.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printmask.c -o $@
-$(DEST)/printnat.o: $(LIBSRC)/printnat.c $(INCDEP)
+$(DEST)/printnat.o: $(LIBSRC)/printnat.c $(INCDEP) $(TOP)/ip_nat.h
$(CC) $(CCARGS) -c $(LIBSRC)/printnat.c -o $@
+$(DEST)/printnatfield.o: $(LIBSRC)/printnatfield.c $(INCDEP) $(TOP)/ip_nat.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printnatfield.c -o $@
$(DEST)/printhostmask.o: $(LIBSRC)/printhostmask.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printhostmask.c -o $@
$(DEST)/printlog.o: $(LIBSRC)/printlog.c $(INCDEP)
@@ -273,10 +386,16 @@ $(DEST)/printsbuf.o: $(LIBSRC)/printsbuf.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printsbuf.c -o $@
$(DEST)/printstate.o: $(LIBSRC)/printstate.c $(INCDEP) $(TOP)/ip_state.h
$(CC) $(CCARGS) -c $(LIBSRC)/printstate.c -o $@
+$(DEST)/printstatefields.o: $(LIBSRC)/printstatefields.c $(INCDEP) $(TOP)/ip_state.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/printstatefields.c -o $@
+$(DEST)/printtcpflags.o: $(LIBSRC)/printtcpflags.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/printtcpflags.c -o $@
$(DEST)/printtqtable.o: $(LIBSRC)/printtqtable.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printtqtable.c -o $@
$(DEST)/printtunable.o: $(LIBSRC)/printtunable.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/printtunable.c -o $@
+$(DEST)/printunit.o: $(LIBSRC)/printunit.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/printunit.c -o $@
$(DEST)/remove_hash.o: $(LIBSRC)/remove_hash.c $(INCDEP) \
$(TOP)/ip_htable.h
$(CC) $(CCARGS) -c $(LIBSRC)/remove_hash.c -o $@
@@ -301,6 +420,20 @@ $(DEST)/var.o: $(LIBSRC)/var.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/var.c -o $@
$(DEST)/verbose.o: $(LIBSRC)/verbose.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/verbose.c -o $@
+$(DEST)/save_execute.o: $(LIBSRC)/save_execute.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_execute.c -o $@
+$(DEST)/save_file.o: $(LIBSRC)/save_file.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_file.c -o $@
+$(DEST)/save_nothing.o: $(LIBSRC)/save_nothing.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_nothing.c -o $@
+$(DEST)/save_syslog.o: $(LIBSRC)/save_syslog.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_syslog.c -o $@
+$(DEST)/vtof.o: $(LIBSRC)/vtof.c $(INCDEP)
+ $(CC) $(CCARGS) -c $(LIBSRC)/vtof.c -o $@
+$(DEST)/save_v1trap.o: $(LIBSRC)/save_v1trap.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_v1trap.c -o $@
+$(DEST)/save_v2trap.o: $(LIBSRC)/save_v2trap.c $(TOP)/ipl.h
+ $(CC) $(CCARGS) -c $(LIBSRC)/save_v2trap.c -o $@
$(DEST)/v6ionames.o: $(LIBSRC)/v6ionames.c $(INCDEP)
$(CC) $(CCARGS) -c $(LIBSRC)/v6ionames.c -o $@
$(DEST)/v6optvalue.o: $(LIBSRC)/v6optvalue.c $(INCDEP)
diff --git a/contrib/ipfilter/lib/addicmp.c b/contrib/ipfilter/lib/addicmp.c
index ef9abfe..da52f1c 100644
--- a/contrib/ipfilter/lib/addicmp.c
+++ b/contrib/ipfilter/lib/addicmp.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: addicmp.c,v 1.10.2.5 2006/06/16 17:20:55 darrenr Exp $
+ * $Id$
*/
#include <ctype.h>
diff --git a/contrib/ipfilter/lib/addipopt.c b/contrib/ipfilter/lib/addipopt.c
index 79155e7..26aff83 100644
--- a/contrib/ipfilter/lib/addipopt.c
+++ b/contrib/ipfilter/lib/addipopt.c
@@ -1,21 +1,21 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 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 $
+ * $Id$
*/
#include "ipf.h"
int addipopt(op, io, len, class)
-char *op;
-struct ipopt_names *io;
-int len;
-char *class;
+ char *op;
+ struct ipopt_names *io;
+ int len;
+ char *class;
{
int olen = len;
struct in_addr ipadr;
@@ -41,6 +41,10 @@ char *class;
lvl = seclevel(class);
*(op - 1) = lvl;
break;
+ case IPOPT_RR :
+ case IPOPT_TS :
+ s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4;
+ break;
case IPOPT_LSRR :
case IPOPT_SSRR :
ipadr.s_addr = inet_addr(class);
@@ -53,12 +57,6 @@ char *class;
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",
diff --git a/contrib/ipfilter/lib/alist_free.c b/contrib/ipfilter/lib/alist_free.c
index 3c1a518..44dea13 100644
--- a/contrib/ipfilter/lib/alist_free.c
+++ b/contrib/ipfilter/lib/alist_free.c
@@ -1,15 +1,15 @@
/*
- * Copyright (C) 2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: alist_free.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp $
+ * $Id: alist_free.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
*/
#include "ipf.h"
void
alist_free(hosts)
-alist_t *hosts;
+ alist_t *hosts;
{
alist_t *a, *next;
diff --git a/contrib/ipfilter/lib/alist_new.c b/contrib/ipfilter/lib/alist_new.c
index 50a4275..73bc030 100644
--- a/contrib/ipfilter/lib/alist_new.c
+++ b/contrib/ipfilter/lib/alist_new.c
@@ -1,20 +1,30 @@
/*
- * Copyright (C) 2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: alist_new.c,v 1.1.2.3 2007/06/06 08:05:33 darrenr Exp $
+ * $Id: alist_new.c,v 1.5.2.2 2012/07/22 08:04:24 darren_r Exp $
*/
#include "ipf.h"
+#include <ctype.h>
-alist_t *
-alist_new(int v, char *host)
+alist_t *
+alist_new(int family, char *host)
{
int a, b, c, d, bits;
- char *slash;
- alist_t *al;
- u_int mask;
+ char *slash;
+ alist_t *al;
+ u_int mask;
+
+ if (family == AF_UNSPEC) {
+ if (strchr(host, ':') != NULL)
+ family = AF_INET6;
+ else
+ family = AF_INET;
+ }
+ if (family != AF_INET && family != AF_INET6)
+ return NULL;
al = calloc(1, sizeof(*al));
if (al == NULL) {
@@ -22,45 +32,62 @@ alist_new(int v, char *host)
return NULL;
}
- bits = -1;
+ while (ISSPACE(*host))
+ host++;
+
+ if (*host == '!') {
+ al->al_not = 1;
+ host++;
+ while (ISSPACE(*host))
+ host++;
+ }
+
+ bits = -1;
slash = strchr(host, '/');
if (slash != NULL) {
*slash = '\0';
bits = atoi(slash + 1);
}
- a = b = c = d = -1;
- sscanf(host, "%d.%d.%d.%d", &a, &b, &c, &d);
+ if (family == AF_INET) {
+ if (bits > 32)
+ goto bad;
- if (bits > 0 && bits < 33) {
- mask = 0xffffffff << (32 - bits);
- } else if (b == -1) {
- mask = 0xff000000;
- b = c = d = 0;
- } else if (c == -1) {
- mask = 0xffff0000;
- c = d = 0;
- } else if (d == -1) {
- mask = 0xffffff00;
- d = 0;
- } else {
- mask = 0xffffffff;
- }
+ a = b = c = d = -1;
+ sscanf(host, "%d.%d.%d.%d", &a, &b, &c, &d);
- if (*host == '!') {
- al->al_not = 1;
- host++;
+ if (bits > 0 && bits < 33) {
+ mask = 0xffffffff << (32 - bits);
+ } else if (b == -1) {
+ mask = 0xff000000;
+ b = c = d = 0;
+ } else if (c == -1) {
+ mask = 0xffff0000;
+ c = d = 0;
+ } else if (d == -1) {
+ mask = 0xffffff00;
+ d = 0;
+ } else {
+ mask = 0xffffffff;
+ }
+ al->al_mask = htonl(mask);
+ } else {
+ if (bits > 128)
+ goto bad;
+ fill6bits(bits, al->al_i6mask.i6);
}
- if (gethost(host, &al->al_addr) == -1) {
+ if (gethost(family, host, &al->al_i6addr) == -1) {
if (slash != NULL)
*slash = '/';
fprintf(stderr, "Cannot parse hostname\n");
- free(al);
- return NULL;
+ goto bad;
}
- al->al_mask = htonl(mask);
+ al->al_family = family;
if (slash != NULL)
*slash = '/';
return al;
+bad:
+ free(al);
+ return NULL;
}
diff --git a/contrib/ipfilter/lib/allocmbt.c b/contrib/ipfilter/lib/allocmbt.c
new file mode 100644
index 0000000..df77684
--- /dev/null
+++ b/contrib/ipfilter/lib/allocmbt.c
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: allocmbt.c,v 1.1.4.1 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+mb_t *allocmbt(size_t len)
+{
+ mb_t *m;
+
+ m = (mb_t *)malloc(sizeof(mb_t));
+ if (m == NULL)
+ return NULL;
+ m->mb_len = len;
+ m->mb_next = NULL;
+ m->mb_data = (char *)m->mb_buf;
+ return m;
+}
diff --git a/contrib/ipfilter/lib/assigndefined.c b/contrib/ipfilter/lib/assigndefined.c
new file mode 100644
index 0000000..34f8d9a
--- /dev/null
+++ b/contrib/ipfilter/lib/assigndefined.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: assigndefined.c,v 1.4.2.2 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+void assigndefined(env)
+ char *env;
+{
+ char *s, *t;
+
+ if (env == NULL)
+ return;
+
+ for (s = strtok(env, ";"); s != NULL; s = strtok(NULL, ";")) {
+ t = strchr(s, '=');
+ if (t == NULL)
+ continue;
+ *t++ = '\0';
+ set_variable(s, t);
+ *--t = '=';
+ }
+}
diff --git a/contrib/ipfilter/lib/bcopywrap.c b/contrib/ipfilter/lib/bcopywrap.c
index b2e8427..453c046 100644
--- a/contrib/ipfilter/lib/bcopywrap.c
+++ b/contrib/ipfilter/lib/bcopywrap.c
@@ -1,18 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: bcopywrap.c,v 1.1.4.1 2006/06/16 17:20:56 darrenr Exp $
- */
+ *
+ * $Id$
+ */
#include "ipf.h"
int bcopywrap(from, to, size)
-void *from, *to;
-size_t size;
+ void *from, *to;
+ size_t size;
{
bcopy((caddr_t)from, (caddr_t)to, size);
return 0;
diff --git a/contrib/ipfilter/lib/binprint.c b/contrib/ipfilter/lib/binprint.c
index fcb47ed..f826721 100644
--- a/contrib/ipfilter/lib/binprint.c
+++ b/contrib/ipfilter/lib/binprint.c
@@ -1,19 +1,19 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: binprint.c,v 1.8.4.1 2006/06/16 17:20:56 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
void binprint(ptr, size)
-void *ptr;
-size_t size;
+ void *ptr;
+ size_t size;
{
u_char *s;
int i, j;
diff --git a/contrib/ipfilter/lib/buildopts.c b/contrib/ipfilter/lib/buildopts.c
index bdd0538..1d1de8c 100644
--- a/contrib/ipfilter/lib/buildopts.c
+++ b/contrib/ipfilter/lib/buildopts.c
@@ -1,19 +1,19 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: buildopts.c,v 1.6.4.1 2006/06/16 17:20:56 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
u_32_t buildopts(cp, op, len)
-char *cp, *op;
-int len;
+ char *cp, *op;
+ int len;
{
struct ipopt_names *io;
u_32_t msk = 0;
@@ -23,6 +23,8 @@ int len;
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;
@@ -38,6 +40,10 @@ int len;
return 0;
}
}
+ while ((len & 3) != 3) {
+ *op++ = IPOPT_NOP;
+ len++;
+ }
*op++ = IPOPT_EOL;
len++;
return len;
diff --git a/contrib/ipfilter/lib/checkrev.c b/contrib/ipfilter/lib/checkrev.c
index 9e584cc..b6f8eee 100644
--- a/contrib/ipfilter/lib/checkrev.c
+++ b/contrib/ipfilter/lib/checkrev.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: checkrev.c,v 1.12.2.2 2006/06/16 17:20:56 darrenr Exp $
+ * $Id$
*/
#include <sys/ioctl.h>
@@ -15,25 +15,25 @@
#include "netinet/ipl.h"
int checkrev(ipfname)
-char *ipfname;
+ char *ipfname;
{
static int vfd = -1;
- struct friostat fio, *fiop = &fio;
- ipfobj_t ipfo;
+ struct friostat fio;
+ ipfobj_t obj;
- bzero((caddr_t)&ipfo, sizeof(ipfo));
- ipfo.ipfo_rev = IPFILTER_VERSION;
- ipfo.ipfo_size = sizeof(*fiop);
- ipfo.ipfo_ptr = (void *)fiop;
- ipfo.ipfo_type = IPFOBJ_IPFSTAT;
+ bzero((caddr_t)&obj, sizeof(obj));
+ obj.ipfo_rev = IPFILTER_VERSION;
+ obj.ipfo_size = sizeof(fio);
+ obj.ipfo_ptr = (void *)&fio;
+ obj.ipfo_type = IPFOBJ_IPFSTAT;
if ((vfd == -1) && ((vfd = open(ipfname, O_RDONLY)) == -1)) {
perror("open device");
return -1;
}
- if (ioctl(vfd, SIOCGETFS, &ipfo)) {
- perror("ioctl(SIOCGETFS)");
+ if (ioctl(vfd, SIOCGETFS, &obj)) {
+ ipferror(vfd, "ioctl(SIOCGETFS)");
close(vfd);
vfd = -1;
return -1;
diff --git a/contrib/ipfilter/lib/connecttcp.c b/contrib/ipfilter/lib/connecttcp.c
new file mode 100644
index 0000000..2bab2af
--- /dev/null
+++ b/contrib/ipfilter/lib/connecttcp.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: connecttcp.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+#include <ctype.h>
+
+/*
+ * Format expected is one addres per line, at the start of each line.
+ */
+int
+connecttcp(char *server, int port)
+{
+ struct sockaddr_in sin;
+ struct hostent *host;
+ int fd;
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(port & 65535);
+
+ if (ISDIGIT(*server)) {
+ if (inet_aton(server, &sin.sin_addr) == -1) {
+ return -1;
+ }
+ } else {
+ host = gethostbyname(server);
+ if (host == NULL)
+ return -1;
+ memcpy(&sin.sin_addr, host->h_addr_list[0],
+ sizeof(sin.sin_addr));
+ }
+
+ fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (fd == -1)
+ return -1;
+
+ if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
+ close(fd);
+ return -1;
+ }
+
+ return fd;
+}
diff --git a/contrib/ipfilter/lib/count4bits.c b/contrib/ipfilter/lib/count4bits.c
index 38e5742..a847388 100644
--- a/contrib/ipfilter/lib/count4bits.c
+++ b/contrib/ipfilter/lib/count4bits.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: count4bits.c,v 1.1.4.1 2006/06/16 17:20:57 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -17,7 +17,7 @@
* of bits.
*/
int count4bits(ip)
-u_int ip;
+ u_int ip;
{
int cnt = 0, i, j;
u_int ipn;
diff --git a/contrib/ipfilter/lib/count6bits.c b/contrib/ipfilter/lib/count6bits.c
index 15538c3..b8f4320 100644
--- a/contrib/ipfilter/lib/count6bits.c
+++ b/contrib/ipfilter/lib/count6bits.c
@@ -1,18 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2001 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: count6bits.c,v 1.4.4.1 2006/06/16 17:20:57 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
int count6bits(msk)
-u_32_t *msk;
+ u_32_t *msk;
{
int i = 0, k;
u_32_t j;
diff --git a/contrib/ipfilter/lib/debug.c b/contrib/ipfilter/lib/debug.c
index 3181e78..02e5f5b 100644
--- a/contrib/ipfilter/lib/debug.c
+++ b/contrib/ipfilter/lib/debug.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2001 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: debug.c,v 1.6.4.1 2006/06/16 17:20:57 darrenr Exp $
+ * $Id$
*/
#if defined(__STDC__)
@@ -15,16 +15,37 @@
#endif
#include <stdio.h>
-#include "ipt.h"
+#include "ipf.h"
#include "opts.h"
+int debuglevel = 0;
+
+
+#ifdef __STDC__
+void debug(int level, char *fmt, ...)
+#else
+void debug(level, fmt, va_alist)
+ int level;
+ char *fmt;
+ va_dcl
+#endif
+{
+ va_list pvar;
+
+ va_start(pvar, fmt);
+
+ if ((debuglevel > 0) && (level <= debuglevel))
+ vfprintf(stderr, fmt, pvar);
+ va_end(pvar);
+}
+
#ifdef __STDC__
-void debug(char *fmt, ...)
+void ipfkdebug(char *fmt, ...)
#else
-void debug(fmt, va_alist)
-char *fmt;
-va_dcl
+void ipfkdebug(fmt, va_alist)
+ char *fmt;
+ va_dcl
#endif
{
va_list pvar;
@@ -32,6 +53,6 @@ va_dcl
va_start(pvar, fmt);
if (opts & OPT_DEBUG)
- vprintf(fmt, pvar);
+ debug(0x1fffffff, fmt, pvar);
va_end(pvar);
}
diff --git a/contrib/ipfilter/lib/dupmbt.c b/contrib/ipfilter/lib/dupmbt.c
new file mode 100644
index 0000000..0929eeb
--- /dev/null
+++ b/contrib/ipfilter/lib/dupmbt.c
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: dupmbt.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+mb_t *dupmbt(orig)
+ mb_t *orig;
+{
+ mb_t *m;
+
+ m = (mb_t *)malloc(sizeof(mb_t));
+ if (m == NULL)
+ return NULL;
+ m->mb_len = orig->mb_len;
+ m->mb_next = NULL;
+ m->mb_data = (char *)m->mb_buf + (orig->mb_data - (char *)orig->mb_buf);
+ bcopy(orig->mb_data, m->mb_data, m->mb_len);
+ return m;
+}
diff --git a/contrib/ipfilter/lib/facpri.c b/contrib/ipfilter/lib/facpri.c
index b89e0f8..c9b4774 100644
--- a/contrib/ipfilter/lib/facpri.c
+++ b/contrib/ipfilter/lib/facpri.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: facpri.c,v 1.6.2.5 2006/06/16 17:20:58 darrenr Exp $
+ * $Id$
*/
#include <stdio.h>
@@ -22,7 +22,7 @@
#include "facpri.h"
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: facpri.c,v 1.6.2.5 2006/06/16 17:20:58 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
@@ -96,7 +96,7 @@ fac_toname(facpri)
/*
* map a facility name to its number
*/
-int
+int
fac_findname(name)
char *name;
{
@@ -119,6 +119,22 @@ table_t pris[] = {
/*
+ * map a facility name to its number
+ */
+int
+pri_findname(name)
+ char *name;
+{
+ int i;
+
+ for (i = 0; pris[i].name; i++)
+ if (!strcmp(pris[i].name, name))
+ return pris[i].value;
+ return -1;
+}
+
+
+/*
* map a priority number to its name
*/
char *
diff --git a/contrib/ipfilter/lib/facpri.h b/contrib/ipfilter/lib/facpri.h
index ca53e05..54ecabd 100644
--- a/contrib/ipfilter/lib/facpri.h
+++ b/contrib/ipfilter/lib/facpri.h
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2001 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: facpri.h,v 1.3.4.1 2006/06/16 17:20:58 darrenr Exp $
+ * $Id$
*/
#ifndef __FACPRI_H__
diff --git a/contrib/ipfilter/lib/familyname.c b/contrib/ipfilter/lib/familyname.c
new file mode 100644
index 0000000..35bb975
--- /dev/null
+++ b/contrib/ipfilter/lib/familyname.c
@@ -0,0 +1,12 @@
+#include "ipf.h"
+
+const char *familyname(int family)
+{
+ if (family == AF_INET)
+ return "inet";
+#ifdef AF_INET6
+ if (family == AF_INET6)
+ return "inet6";
+#endif
+ return "unknown";
+}
diff --git a/contrib/ipfilter/lib/fill6bits.c b/contrib/ipfilter/lib/fill6bits.c
index c0faf6a..39ec735 100644
--- a/contrib/ipfilter/lib/fill6bits.c
+++ b/contrib/ipfilter/lib/fill6bits.c
@@ -1,19 +1,19 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: fill6bits.c,v 1.5.4.1 2006/06/16 17:20:58 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
void fill6bits(bits, msk)
-int bits;
-u_int *msk;
+ int bits;
+ u_int *msk;
{
if (bits == 0) {
msk[0] = 0;
diff --git a/contrib/ipfilter/lib/findword.c b/contrib/ipfilter/lib/findword.c
new file mode 100644
index 0000000..e06f213
--- /dev/null
+++ b/contrib/ipfilter/lib/findword.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: findword.c,v 1.3.4.1 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+
+wordtab_t *findword(words, name)
+ wordtab_t *words;
+ char *name;
+{
+ wordtab_t *w;
+
+ for (w = words; w->w_word != NULL; w++)
+ if (!strcmp(name, w->w_word))
+ break;
+ if (w->w_word == NULL)
+ return NULL;
+
+ return w;
+}
diff --git a/contrib/ipfilter/lib/flags.c b/contrib/ipfilter/lib/flags.c
index 200484c..05fcc98 100644
--- a/contrib/ipfilter/lib/flags.c
+++ b/contrib/ipfilter/lib/flags.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2001-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: flags.c,v 1.4.4.1 2006/06/16 17:20:58 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
diff --git a/contrib/ipfilter/lib/freembt.c b/contrib/ipfilter/lib/freembt.c
new file mode 100644
index 0000000..0fc748d
--- /dev/null
+++ b/contrib/ipfilter/lib/freembt.c
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: freembt.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+void freembt(m)
+ mb_t *m;
+{
+
+ free(m);
+}
diff --git a/contrib/ipfilter/lib/ftov.c b/contrib/ipfilter/lib/ftov.c
new file mode 100644
index 0000000..cb9715d
--- /dev/null
+++ b/contrib/ipfilter/lib/ftov.c
@@ -0,0 +1,16 @@
+#include "ipf.h"
+
+int
+ftov(version)
+ int version;
+{
+#ifdef USE_INET6
+ if (version == AF_INET6)
+ return 6;
+#endif
+ if (version == AF_INET)
+ return 4;
+ if (version == AF_UNSPEC)
+ return 0;
+ return -1;
+}
diff --git a/contrib/ipfilter/lib/gethost.c b/contrib/ipfilter/lib/gethost.c
index be536c1..a11b09b 100644
--- a/contrib/ipfilter/lib/gethost.c
+++ b/contrib/ipfilter/lib/gethost.c
@@ -1,44 +1,75 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: gethost.c,v 1.3.2.2 2006/06/16 17:20:59 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
-int gethost(name, hostp)
-char *name;
-u_32_t *hostp;
+int gethost(family, name, hostp)
+ int family;
+ char *name;
+ i6addr_t *hostp;
{
struct hostent *h;
struct netent *n;
u_32_t addr;
if (!strcmp(name, "test.host.dots")) {
- *hostp = htonl(0xfedcba98);
+ if (family == AF_INET) {
+ hostp->in4.s_addr = htonl(0xfedcba98);
+ }
+#ifdef USE_INET6
+ if (family == AF_INET6) {
+ hostp->i6[0] = 0xfe80aa55;
+ hostp->i6[1] = 0x12345678;
+ hostp->i6[2] = 0x5a5aa5a5;
+ hostp->i6[3] = 0xfedcba98;
+ }
+#endif
return 0;
}
if (!strcmp(name, "<thishost>"))
name = thishost;
- h = gethostbyname(name);
- if (h != NULL) {
- if ((h->h_addr != NULL) && (h->h_length == sizeof(addr))) {
- bcopy(h->h_addr, (char *)&addr, sizeof(addr));
- *hostp = addr;
+ if (family == AF_INET) {
+ h = gethostbyname(name);
+ if (h != NULL) {
+ if ((h->h_addr != NULL) &&
+ (h->h_length == sizeof(addr))) {
+ bcopy(h->h_addr, (char *)&addr, sizeof(addr));
+ hostp->in4.s_addr = addr;
+ return 0;
+ }
+ }
+
+ n = getnetbyname(name);
+ if (n != NULL) {
+ hostp->in4.s_addr = htonl(n->n_net & 0xffffffff);
return 0;
}
}
+#ifdef USE_INET6
+ if (family == AF_INET6) {
+ struct addrinfo hints, *res;
+ struct sockaddr_in6 *sin6;
- n = getnetbyname(name);
- if (n != NULL) {
- *hostp = (u_32_t)htonl(n->n_net & 0xffffffff);
- return 0;
+ bzero((char *)&hints, sizeof(hints));
+ hints.ai_family = PF_INET6;
+
+ getaddrinfo(name, NULL, &hints, &res);
+ if (res != NULL) {
+ sin6 = (struct sockaddr_in6 *)res->ai_addr;
+ hostp->in6 = sin6->sin6_addr;
+ freeaddrinfo(res);
+ return 0;
+ }
}
+#endif
return -1;
}
diff --git a/contrib/ipfilter/lib/geticmptype.c b/contrib/ipfilter/lib/geticmptype.c
new file mode 100644
index 0000000..5c962e9
--- /dev/null
+++ b/contrib/ipfilter/lib/geticmptype.c
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+#include "ipf.h"
+
+int geticmptype(family, name)
+ int family;
+ char *name;
+{
+ icmptype_t *i;
+
+ for (i = icmptypelist; i->it_name != NULL; i++) {
+ if (!strcmp(name, i->it_name)) {
+ if (family == AF_INET)
+ return i->it_v4;
+#ifdef USE_INET6
+ if (family == AF_INET6)
+ return i->it_v6;
+#endif
+ return -1;
+ }
+ }
+
+ return -1;
+}
diff --git a/contrib/ipfilter/lib/getifname.c b/contrib/ipfilter/lib/getifname.c
index 7246fbb..88cad32 100644
--- a/contrib/ipfilter/lib/getifname.c
+++ b/contrib/ipfilter/lib/getifname.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: getifname.c,v 1.5.2.3 2006/07/14 06:12:24 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
@@ -18,7 +18,7 @@
*/
#if 0
char *getifname(ptr)
-struct ifnet *ptr;
+ struct ifnet *ptr;
{
#if SOLARIS || defined(__hpux)
# if SOLARIS
@@ -50,7 +50,7 @@ struct ifnet *ptr;
defined(__OpenBSD__) || \
(defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
#else
- char buf[32];
+ char buf[LIFNAMSIZ];
int len;
# endif
struct ifnet netif;
@@ -85,8 +85,11 @@ struct ifnet *ptr;
}
#else
char *getifname(ptr)
-struct ifnet *ptr;
+ struct ifnet *ptr;
{
+#if 0
+ ptr = ptr;
+#endif
return "X";
}
#endif
diff --git a/contrib/ipfilter/lib/getnattype.c b/contrib/ipfilter/lib/getnattype.c
index 2fb5d17..ef7ffd4 100644
--- a/contrib/ipfilter/lib/getnattype.c
+++ b/contrib/ipfilter/lib/getnattype.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
@@ -11,34 +11,24 @@
#include "kmem.h"
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: getnattype.c,v 1.3.2.2 2006/07/14 06:12:24 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
/*
* Get a nat filter type given its kernel address.
*/
-char *getnattype(nat, alive)
-nat_t *nat;
-int alive;
+char *
+getnattype(nat)
+ nat_t *nat;
{
static char unknownbuf[20];
- ipnat_t *ipn, ipnat;
char *which;
- int type;
if (!nat)
return "???";
- if (alive) {
- type = nat->nat_redir;
- } else {
- ipn = nat->nat_ptr;
- if (kmemcpy((char *)&ipnat, (long)ipn, sizeof(ipnat)))
- return "!!!";
- type = ipnat.in_redir;
- }
- switch (type)
+ switch (nat->nat_redir)
{
case NAT_MAP :
which = "MAP";
@@ -49,11 +39,30 @@ int alive;
case NAT_REDIRECT :
which = "RDR";
break;
+ case NAT_MAP|NAT_REWRITE :
+ which = "RWR-MAP";
+ break;
+ case NAT_REDIRECT|NAT_REWRITE :
+ which = "RWR-RDR";
+ break;
case NAT_BIMAP :
which = "BIMAP";
break;
+ case NAT_REDIRECT|NAT_DIVERTUDP :
+ which = "DIV-RDR";
+ break;
+ case NAT_MAP|NAT_DIVERTUDP :
+ which = "DIV-MAP";
+ break;
+ case NAT_REDIRECT|NAT_ENCAP :
+ which = "ENC-RDR";
+ break;
+ case NAT_MAP|NAT_ENCAP :
+ which = "ENC-MAP";
+ break;
default :
- sprintf(unknownbuf, "unknown(%04x)", type & 0xffffffff);
+ sprintf(unknownbuf, "unknown(%04x)",
+ nat->nat_redir & 0xffffffff);
which = unknownbuf;
break;
}
diff --git a/contrib/ipfilter/lib/getport.c b/contrib/ipfilter/lib/getport.c
index 69e897c..0981ff1 100644
--- a/contrib/ipfilter/lib/getport.c
+++ b/contrib/ipfilter/lib/getport.c
@@ -1,30 +1,39 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: getport.c,v 1.1.4.6 2006/06/16 17:21:00 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
+#include <ctype.h>
-int getport(fr, name, port)
-frentry_t *fr;
-char *name;
-u_short *port;
+int getport(fr, name, port, proto)
+ frentry_t *fr;
+ char *name, *proto;
+ u_short *port;
{
struct protoent *p;
struct servent *s;
u_short p1;
if (fr == NULL || fr->fr_type != FR_T_IPF) {
- s = getservbyname(name, NULL);
+ s = getservbyname(name, proto);
if (s != NULL) {
*port = s->s_port;
return 0;
}
+
+ if (ISDIGIT(*name)) {
+ int portval = atoi(name);
+ if (portval < 0 || portval > 65535)
+ return -1;
+ *port = htons((u_short)portval);
+ return 0;
+ }
return -1;
}
diff --git a/contrib/ipfilter/lib/getportproto.c b/contrib/ipfilter/lib/getportproto.c
index 23e5fb1..69fecff 100644
--- a/contrib/ipfilter/lib/getportproto.c
+++ b/contrib/ipfilter/lib/getportproto.c
@@ -1,19 +1,19 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: getportproto.c,v 1.2.4.4 2006/06/16 17:21:00 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include <ctype.h>
#include "ipf.h"
int getportproto(name, proto)
-char *name;
-int proto;
+ char *name;
+ int proto;
{
struct servent *s;
struct protoent *p;
diff --git a/contrib/ipfilter/lib/getproto.c b/contrib/ipfilter/lib/getproto.c
index 33f6f47..6c52cd3 100644
--- a/contrib/ipfilter/lib/getproto.c
+++ b/contrib/ipfilter/lib/getproto.c
@@ -1,17 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: getproto.c,v 1.2.2.3 2006/06/16 17:21:00 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
+#include <ctype.h>
int getproto(name)
-char *name;
+ char *name;
{
struct protoent *p;
char *s;
@@ -25,10 +26,13 @@ char *name;
#ifdef _AIX51
/*
* For some bogus reason, "ip" is 252 in /etc/protocols on AIX 5
+ * The IANA has doubled up on the definition of 0 - it is now also
+ * used for IPv6 hop-opts, so we can no longer rely on /etc/protocols
+ * providing the correct name->number mapping
*/
+#endif
if (!strcasecmp(name, "ip"))
return 0;
-#endif
p = getprotobyname(name);
if (p != NULL)
diff --git a/contrib/ipfilter/lib/getsumd.c b/contrib/ipfilter/lib/getsumd.c
index fdad461..84acc7a 100644
--- a/contrib/ipfilter/lib/getsumd.c
+++ b/contrib/ipfilter/lib/getsumd.c
@@ -1,17 +1,17 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: getsumd.c,v 1.2.4.1 2006/06/16 17:21:01 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
char *getsumd(sum)
-u_32_t sum;
+ u_32_t sum;
{
static char sumdbuf[17];
diff --git a/contrib/ipfilter/lib/hostname.c b/contrib/ipfilter/lib/hostname.c
index e8fde98..28ead89 100644
--- a/contrib/ipfilter/lib/hostname.c
+++ b/contrib/ipfilter/lib/hostname.c
@@ -1,18 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2003 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: hostname.c,v 1.6.2.2 2007/01/16 02:25:22 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
-char *hostname(v, ip)
-int v;
-void *ip;
+char *hostname(family, ip)
+ int family;
+ void *ip;
{
static char hostbuf[MAXHOSTNAMELEN+1];
struct hostent *hp;
@@ -21,14 +21,14 @@ void *ip;
memset(&ipa, 0, sizeof(ipa)); /* XXX gcc */
- if (v == 4) {
+ if (family == AF_INET) {
ipa.s_addr = *(u_32_t *)ip;
if (ipa.s_addr == htonl(0xfedcba98))
return "test.host.dots";
}
if ((opts & OPT_NORESOLVE) == 0) {
- if (v == 4) {
+ if (family == AF_INET) {
hp = gethostbyaddr(ip, 4, AF_INET);
if (hp != NULL && hp->h_name != NULL &&
*hp->h_name != '\0') {
@@ -47,7 +47,7 @@ void *ip;
}
}
- if (v == 4) {
+ if (family == AF_INET) {
return inet_ntoa(ipa);
}
#ifdef USE_INET6
diff --git a/contrib/ipfilter/lib/icmpcode.c b/contrib/ipfilter/lib/icmpcode.c
index d558beb..e898ebf 100644
--- a/contrib/ipfilter/lib/icmpcode.c
+++ b/contrib/ipfilter/lib/icmpcode.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: icmpcode.c,v 1.7.2.5 2006/06/16 17:21:02 darrenr Exp $
+ * $Id$
*/
#include <ctype.h>
diff --git a/contrib/ipfilter/lib/icmptypename.c b/contrib/ipfilter/lib/icmptypename.c
new file mode 100644
index 0000000..d7eb3bd
--- /dev/null
+++ b/contrib/ipfilter/lib/icmptypename.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+#include "ipf.h"
+
+char *icmptypename(family, type)
+ int family, type;
+{
+ icmptype_t *i;
+
+ if ((type < 0) || (type > 255))
+ return NULL;
+
+ for (i = icmptypelist; i->it_name != NULL; i++) {
+ if ((family == AF_INET) && (i->it_v4 == type))
+ return i->it_name;
+#ifdef USE_INET6
+ if ((family == AF_INET6) && (i->it_v6 == type))
+ return i->it_name;
+#endif
+ }
+
+ return NULL;
+}
diff --git a/contrib/ipfilter/lib/icmptypes.c b/contrib/ipfilter/lib/icmptypes.c
new file mode 100644
index 0000000..c1123ff
--- /dev/null
+++ b/contrib/ipfilter/lib/icmptypes.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+#include "ipf.h"
+
+#ifndef USE_INET6
+# undef ICMP6_ECHO_REQUEST
+# define ICMP6_ECHO_REQUEST 0
+# undef ICMP6_ECHO_REPLY
+# define ICMP6_ECHO_REPLY 0
+# undef ICMP6_NI_QUERY
+# define ICMP6_NI_QUERY 0
+# undef ICMP6_NI_REPLY
+# define ICMP6_NI_REPLY 0
+# undef ICMP6_PARAM_PROB
+# define ICMP6_PARAM_PROB 0
+# undef ND_ROUTER_ADVERT
+# define ND_ROUTER_ADVERT 0
+# undef ND_ROUTER_SOLICIT
+# define ND_ROUTER_SOLICIT 0
+# undef ICMP6_TIME_EXCEEDED
+# define ICMP6_TIME_EXCEEDED 0
+# undef ICMP6_DST_UNREACH
+# define ICMP6_DST_UNREACH 0
+# undef ICMP6_PACKET_TOO_BIG
+# define ICMP6_PACKET_TOO_BIG 0
+# undef MLD_LISTENER_QUERY
+# define MLD_LISTENER_QUERY 0
+# undef MLD_LISTENER_REPORT
+# define MLD_LISTENER_REPORT 0
+# undef MLD_LISTENER_DONE
+# define MLD_LISTENER_DONE 0
+# undef ICMP6_MEMBERSHIP_QUERY
+# define ICMP6_MEMBERSHIP_QUERY 0
+# undef ICMP6_MEMBERSHIP_REPORT
+# define ICMP6_MEMBERSHIP_REPORT 0
+# undef ICMP6_MEMBERSHIP_REDUCTION
+# define ICMP6_MEMBERSHIP_REDUCTION 0
+# undef ND_NEIGHBOR_ADVERT
+# define ND_NEIGHBOR_ADVERT 0
+# undef ND_NEIGHBOR_SOLICIT
+# define ND_NEIGHBOR_SOLICIT 0
+# undef ICMP6_ROUTER_RENUMBERING
+# define ICMP6_ROUTER_RENUMBERING 0
+# undef ICMP6_WRUREQUEST
+# define ICMP6_WRUREQUEST 0
+# undef ICMP6_WRUREPLY
+# define ICMP6_WRUREPLY 0
+# undef ICMP6_FQDN_QUERY
+# define ICMP6_FQDN_QUERY 0
+# undef ICMP6_FQDN_REPLY
+# define ICMP6_FQDN_REPLY 0
+#else
+# if !defined(MLD_LISTENER_QUERY)
+# define MLD_LISTENER_QUERY 130
+# endif
+# if !defined(MLD_LISTENER_REPORT)
+# define MLD_LISTENER_REPORT 131
+# endif
+# if !defined(MLD_LISTENER_DONE)
+# define MLD_LISTENER_DONE 132
+# endif
+# if defined(MLD_LISTENER_REDUCTION) && !defined(MLD_LISTENER_DONE)
+# define MLD_LISTENER_DONE MLD_LISTENER_REDUCTION
+# endif
+#endif
+
+icmptype_t icmptypelist[] = {
+ { "echo", ICMP_ECHO, ICMP6_ECHO_REQUEST },
+ { "echorep", ICMP_ECHOREPLY, ICMP6_ECHO_REPLY },
+ { "fqdnquery", -1, ICMP6_FQDN_QUERY },
+ { "fqdnreply", -1, ICMP6_FQDN_REPLY },
+ { "infoqry", -1, ICMP6_NI_QUERY },
+ { "inforeq", ICMP_IREQ, ICMP6_NI_QUERY },
+ { "inforep", ICMP_IREQREPLY, ICMP6_NI_REPLY },
+ { "listendone", -1, MLD_LISTENER_DONE },
+ { "listenqry", -1, MLD_LISTENER_QUERY },
+ { "listenrep", -1, MLD_LISTENER_REPORT },
+ { "maskrep", ICMP_MASKREPLY, -1 },
+ { "maskreq", ICMP_MASKREQ, -1 },
+ { "memberqry", -1, ICMP6_MEMBERSHIP_QUERY },
+ { "memberred", -1, ICMP6_MEMBERSHIP_REDUCTION },
+ { "memberreply",-1, ICMP6_MEMBERSHIP_REPORT },
+ { "neighadvert", -1, ND_NEIGHBOR_ADVERT },
+ { "neighborsol", -1, ND_NEIGHBOR_SOLICIT },
+ { "neighborsolicit", -1, ND_NEIGHBOR_SOLICIT },
+ { "paramprob", ICMP_PARAMPROB, ICMP6_PARAM_PROB },
+ { "redir", ICMP_REDIRECT, ND_REDIRECT },
+ { "renumber", -1, ICMP6_ROUTER_RENUMBERING },
+ { "routerad", ICMP_ROUTERADVERT, ND_ROUTER_ADVERT },
+ { "routeradvert",ICMP_ROUTERADVERT, ND_ROUTER_ADVERT },
+ { "routersol", ICMP_ROUTERSOLICIT, ND_ROUTER_SOLICIT },
+ { "routersolcit",ICMP_ROUTERSOLICIT, ND_ROUTER_SOLICIT },
+ { "squench", ICMP_SOURCEQUENCH, -1 },
+ { "timest", ICMP_TSTAMP, -1 },
+ { "timestrep", ICMP_TSTAMPREPLY, -1 },
+ { "timex", ICMP_TIMXCEED, ICMP6_TIME_EXCEEDED },
+ { "toobig", -1, ICMP6_PACKET_TOO_BIG },
+ { "unreach", ICMP_UNREACH, ICMP6_DST_UNREACH },
+ { "whorep", -1, ICMP6_WRUREPLY },
+ { "whoreq", -1, ICMP6_WRUREQUEST },
+ { NULL, -1, -1 }
+};
diff --git a/contrib/ipfilter/lib/initparse.c b/contrib/ipfilter/lib/initparse.c
index 6fdfc8a..a16ac0f 100644
--- a/contrib/ipfilter/lib/initparse.c
+++ b/contrib/ipfilter/lib/initparse.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: initparse.c,v 1.6.4.1 2006/06/16 17:21:02 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
diff --git a/contrib/ipfilter/lib/interror.c b/contrib/ipfilter/lib/interror.c
new file mode 100644
index 0000000..c13f5f8
--- /dev/null
+++ b/contrib/ipfilter/lib/interror.c
@@ -0,0 +1,582 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: interror.c,v 1.9.2.12 2012/07/22 08:03:39 darren_r Exp $
+ */
+
+#include "ipf.h"
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+typedef struct {
+ int iee_number;
+ char *iee_text;
+} ipf_error_entry_t;
+
+static ipf_error_entry_t *find_error __P((int));
+
+#define IPF_NUM_ERRORS 475
+
+/*
+ * NO REUSE OF NUMBERS!
+ *
+ * IF YOU WANT TO ADD AN ERROR TO THIS TABLE, _ADD_ A NEW NUMBER.
+ * DO _NOT_ USE AN EMPTY NUMBER OR FILL IN A GAP.
+ */
+static ipf_error_entry_t ipf_errors[IPF_NUM_ERRORS] = {
+ { 1, "auth table locked/full" },
+ { 2, "" },
+ { 3, "copyinptr received bad address" },
+ { 4, "copyoutptr received bad address" },
+ { 5, "" },
+ { 6, "cannot load a rule with FR_T_BUILTIN flag set" },
+ { 7, "internal rule without FR_T_BUILDINT flag set" },
+ { 8, "no data provided with filter rule" },
+ { 9, "invalid ioctl for rule" },
+ { 10, "rule protocol is not 4 or 6" },
+ { 11, "cannot find rule function" },
+ { 12, "cannot find rule group" },
+ { 13, "group in/out does not match rule in/out" },
+ { 14, "rule without in/out does not belong to a group" },
+ { 15, "cannot determine where to append rule" },
+ { 16, "malloc for rule data failed" },
+ { 17, "copyin for rule data failed" },
+ { 18, "" },
+ { 19, "zero data size for BPF rule" },
+ { 20, "BPF validation failed" },
+ { 21, "incorrect data size for IPF rule" },
+ { 22, "'keep state' rule included 'with oow'" },
+ { 23, "bad interface index with dynamic source address" },
+ { 24, "bad interface index with dynamic dest. address" },
+ { 25, "match array verif failed for filter rule" },
+ { 26, "bad filter rule type" },
+ { 27, "rule not found for zero'stats" },
+ { 28, "copyout failed for zero'ing stats" },
+ { 29, "rule not found for removing" },
+ { 30, "cannot remove internal rule" },
+ { 31, "rule in use" },
+ { 32, "rule already exists" },
+ { 33, "no memory for another rule" },
+ { 34, "could not find function" },
+ { 35, "copyout failed for resolving function name -> addr" },
+ { 36, "copyout failed for resolving function addr -> name" },
+ { 37, "function name/addr resolving search failed" },
+ { 38, "group map cannot find it's hash table" },
+ { 39, "group map hash-table in/out do not match rule" },
+ { 40, "bcopyout failed for SIOCIPFINTERROR" },
+ { 41, "" },
+ { 42, "ipfilter not enabled for NAT ioctl" },
+ { 43, "ipfilter not enabled for state ioctl" },
+ { 44, "ipfilter not enabled for auth ioctl" },
+ { 45, "ipfilter not enbaled for sync ioctl" },
+ { 46, "ipfilter not enabled for scan ioctl" },
+ { 47, "ipfilter not enabled for lookup ioctl" },
+ { 48, "unrecognised device minor number for ioctl" },
+ { 49, "unrecognised object type for copying in ipfobj" },
+ { 50, "mismatching object type for copying in ipfobj" },
+ { 51, "object size too small for copying in ipfobj" },
+ { 52, "object size mismatch for copying in ipfobj" },
+ { 53, "compat object size too small for copying in ipfobj" },
+ { 54, "compat object size mismatch for copying in ipfobj" },
+ { 55, "error doing copyin of data for in ipfobj" },
+ { 56, "unrecognised object type for size copy in ipfobj" },
+ { 57, "object size too small for size copy in ipfobj" },
+ { 58, "mismatching object type for size copy in ipfobj" },
+ { 59, "object size mismatch for size copy in ipfobj" },
+ { 60, "compat object size mismatch for size copy in ipfobj" },
+ { 61, "error doing size copyin of data for in ipfobj" },
+ { 62, "bad object type for size copy out ipfobj" },
+ { 63, "mismatching object type for size copy out ipfobj" },
+ { 64, "object size mismatch for size copy out ipfobj" },
+ { 65, "compat object size wrong for size copy out ipfobj" },
+ { 66, "error doing size copyout of data for out ipfobj" },
+ { 67, "unrecognised object type for copying out ipfobj" },
+ { 68, "mismatching object type for copying out ipfobj" },
+ { 69, "object size too small for copying out ipfobj" },
+ { 70, "object size mismatch for copying out ipfobj" },
+ { 71, "compat object size too small for copying out ipfobj" },
+ { 72, "compat object size mismatch for copying out ipfobj" },
+ { 73, "error doing copyout of data for out ipfobj" },
+ { 74, "attempt to add existing tunable name" },
+ { 75, "cannot find tunable name to delete" },
+ { 76, "internal data too big for next tunable" },
+ { 77, "could not find tunable" },
+ { 78, "tunable can only be changed when ipfilter disabled" },
+ { 79, "new tunable value outside accepted range" },
+ { 80, "ipftune called for unrecognised ioctl" },
+ { 81, "" },
+ { 82, "could not find token to delete" },
+ { 83, "" },
+ { 84, "attempt to get next rule when no more exist" },
+ { 85, "value for iri_inout outside accepted range" },
+ { 86, "value for iri_active outside accepted range" },
+ { 87, "value for iri_nrules is 0" },
+ { 88, "NULL pointer specified for where to copy rule to" },
+ { 89, "copyout of rule failed" },
+ { 90, "" },
+ { 91, "could not get token for rule iteration" },
+ { 92, "unrecognised generic iterator" },
+ { 93, "could not find token for generic iterator" },
+ { 94, "need write permissions to disable/enable ipfilter" },
+ { 95, "error copying in enable/disable value" },
+ { 96, "need write permissions to set ipf tunable" },
+ { 97, "need write permissions to set ipf flags" },
+ { 98, "error doing copyin of ipf flags" },
+ { 99, "error doing copyout of ipf flags" },
+ { 100, "need write permissions to add another rule" },
+ { 101, "need write permissions to insert another rule" },
+ { 102, "need write permissions to swap active rule set" },
+ { 103, "error copying out current active rule set" },
+ { 104, "need write permissions to zero ipf stats" },
+ { 105, "need write permissions to flush ipf v4 rules" },
+ { 106, "error copying out v4 flush results" },
+ { 107, "error copying in v4 flush command" },
+ { 108, "need write permissions to flush ipf v6 rules" },
+ { 109, "error copying out v6 flush results" },
+ { 110, "error copying in v6 flush command" },
+ { 111, "error copying in new lock state for ipfilter" },
+ { 112, "need write permissions to flush ipf logs" },
+ { 113, "error copying out results of log flush" },
+ { 114, "need write permissions to resync ipf" },
+ { 115, "unrecognised ipf ioctl" },
+ { 116, "error copying in match array" },
+ { 117, "match array type is not IPFOBJ_IPFEXPR" },
+ { 118, "bad size for match array" },
+ { 119, "cannot allocate memory for match aray" },
+ { 120, "error copying in match array" },
+ { 121, "error verifying contents of match array" },
+ { 122, "need write permissions to set ipf lock status" },
+ { 123, "error copying in data for function resolution" },
+ { 124, "error copying in ipfobj structure" },
+ { 125, "error copying in ipfobj structure" },
+ { 126, "error copying in ipfobj structure" },
+ { 127, "error copying in ipfobj structure" },
+ { 128, "no memory for filter rule comment" },
+ { 129, "error copying in filter rule comment" },
+ { 130, "error copying out filter rule comment" },
+ { 131, "no memory for new rule alloc buffer" },
+ { 132, "cannot find source lookup pool" },
+ { 133, "unknown source address type" },
+ { 134, "cannot find destination lookup pool" },
+ { 135, "unknown destination address type" },
+ { 136, "icmp head group name index incorrect" },
+ { 137, "group head name index incorrect" },
+ { 138, "group name index incorrect" },
+ { 139, "to interface name index incorrect" },
+ { 140, "dup-to interface name index incorrect" },
+ { 141, "reply-to interface name index incorrect" },
+ { 142, "could not initialise call now function" },
+ { 143, "could not initialise call function" },
+ { 144, "could not find destination list" },
+ { 145, "auth rules cannot have dup/to/fastroute" },
+ { 146, "incorrect size for object to copy out" },
+ { 147, "object type out of bounds for kernel copyout" },
+ { 148, "object size too small for kernel copyout" },
+ { 149, "object size validation failed for kernel copyout" },
+ { 150, "error copying data out for kernel copyout" },
+ { 151, "version mismatch for kernel copyout" },
+/* -------------------------------------------------------------------------- */
+ { 10001, "could not find token for auth iterator" },
+ { 10002, "write permissions require to add/remove auth rule" },
+ { 10003, "need write permissions to set auth lock" },
+ { 10004, "error copying out results of auth flush" },
+ { 10005, "unknown auth ioctl" },
+ { 10006, "can only append or remove preauth rules" },
+ { 10007, "NULL pointers passed in for preauth remove" },
+ { 10008, "preauth rule not found to remove" },
+ { 10009, "could not malloc memory for preauth entry" },
+ { 10010, "unrecognised preauth rule ioctl command" },
+ { 10011, "iterator data supplied with NULL pointer" },
+ { 10012, "unknown auth iterator type" },
+ { 10013, "iterator error copying out auth data" },
+ { 10014, "sleep waiting for auth packet interrupted" },
+ { 10015, "bad index supplied in auth reply" },
+ { 10016, "error injecting outbound packet back into kernel" },
+ { 10017, "error injecting inbound packet back into kernel" },
+ { 10018, "could not attempt to inject packet back into kernel" },
+ { 10019, "packet id does not match" },
+/* -------------------------------------------------------------------------- */
+ { 20001, "invalid frag token data pointer supplied" },
+ { 20002, "error copying out frag token data" },
+ { 20003, "can only copy one fragment state entry at a time" },
+/* -------------------------------------------------------------------------- */
+ { 30001, "incorrect object size to get hash table stats" },
+ { 30002, "could not malloc memory for new hash table" },
+ { 30003, "error coping in hash table structure" },
+ { 30004, "hash table already exists" },
+ { 30005, "mismach between new hash table and operation unit" },
+ { 30006, "could not malloc memory for hash table base" },
+ { 30007, "could not find hash table" },
+ { 30008, "mismatch between hash table and operation unit" },
+ { 30009, "could not find hash table for iterators next node" },
+ { 30010, "unknown iterator tpe" },
+ { 30011, "iterator error copying out hash table" },
+ { 30012, "iterator error copying out hash table entry" },
+ { 30013, "error copying out hash table statistics" },
+ { 30014, "table node delete structure wrong size" },
+ { 30015, "error copying in node to delete" },
+ { 30016, "table to delete node from does not exist" },
+ { 30017, "could not find table to remove node from" },
+ { 30018, "table node add structure wrong size" },
+ { 30019, "error copying in node to add" },
+ { 30020, "could not find table to add node to" },
+ { 30021, "node already exists in the table" },
+ { 30022, "could not find node to delete in table" },
+ { 30023, "uid mismatch on node to delete" },
+ { 30024, "object size incorrect for hash table" },
+ { 30025, "hash table size must be at least 1"},
+ { 30026, "cannot allocate memory for hash table context" },
+/* -------------------------------------------------------------------------- */
+ { 40001, "invalid minor device numebr for log read" },
+ { 40002, "read size too small" },
+ { 40003, "interrupted waiting for log data to read" },
+ { 40004, "interrupted waiting for log data to read" },
+ { 40005, "read size too large" },
+ { 40006, "uiomove for read operation failed" },
+/* -------------------------------------------------------------------------- */
+ { 50001, "unknown lookup ioctl" },
+ { 50002, "error copying in object data for add node" },
+ { 50003, "invalid unit for lookup add node" },
+ { 50004, "incorrect size for adding a pool node" },
+ { 50005, "error copying in pool node structure" },
+ { 50006, "mismatch in pool node address/mask families" },
+ { 50007, "could not find pool name" },
+ { 50008, "node already exists in pool" },
+ { 50009, "incorrect size for adding a hash node" },
+ { 50010, "error copying in hash node structure" },
+ { 50011, "could not find hash table name" },
+ { 50012, "unrecognised object type for lookup add node" },
+ { 50013, "invalid unit for lookup delete node" },
+ { 50014, "incorrect size for deleting a pool node" },
+ { 50015, "error copying in pool node structure" },
+ { 50016, "could not find pool name" },
+ { 50017, "could not find pool node" },
+ { 50018, "incorrect size for removing a hash node" },
+ { 50019, "error copying in hash node structure" },
+ { 50020, "could not find hash table name" },
+ { 50021, "unrecognised object type for lookup delete node" },
+ { 50022, "error copying in add table data" },
+ { 50023, "invalid unit for lookup add table" },
+ { 50024, "pool name already exists" },
+ { 50025, "hash table name already exists" },
+ { 50026, "unrecognised object type for lookup add table" },
+ { 50027, "error copying table data back out" },
+ { 50028, "error copying in remove table data" },
+ { 50029, "invalid unit for lookup remove table" },
+ { 50030, "unrecognised object type for lookup remove table" },
+ { 50031, "error copying in lookup stats structure" },
+ { 50032, "invalid unit for lookup stats" },
+ { 50033, "unrecognised object type for lookup stats" },
+ { 50034, "error copying in flush lookup data" },
+ { 50035, "invalid unit for lookup flush" },
+ { 50036, "incorrect table type for lookup flush" },
+ { 50037, "error copying out lookup flush results" },
+ { 50038, "invalid unit for lookup iterator" },
+ { 50039, "invalid unit for lookup iterator" },
+ { 50040, "could not find token for lookup iterator" },
+ { 50041, "unrecognised object type for lookup interator" },
+ { 50042, "error copying in lookup delete node operation" },
+/* -------------------------------------------------------------------------- */
+ { 60001, "insufficient privilege for NAT write operation" },
+ { 60002, "need write permissions to flush NAT logs" },
+ { 60003, "need write permissions to turn NAT logging on/off" },
+ { 60004, "error copying out current NAT log setting" },
+ { 60005, "error copying out bytes waiting to be read in NAT \
+log" },
+ { 60006, "need write permissions to add NAT rule" },
+ { 60007, "NAT rule already exists" },
+ { 60008, "could not allocate memory for NAT rule" },
+ { 60009, "need write permissions to remove NAT rule" },
+ { 60010, "NAT rule could not be found" },
+ { 60011, "could not find NAT entry for redirect lookup" },
+ { 60012, "need write permissions to flush NAT table" },
+ { 60013, "error copying in NAT flush command" },
+ { 60014, "need write permissions to do matching NAT flush" },
+ { 60015, "need write permissions to set NAT lock" },
+ { 60016, "need write permissions to add entry to NAT table" },
+ { 60017, "NAT not locked for size retrieval" },
+ { 60018, "NAT not locked for fetching NAT table entry" },
+ { 60019, "error copying in NAT token data for deletion" },
+ { 60020, "unknown NAT ioctl" },
+ { 60021, "" },
+ { 60022, "resolving proxy name in NAT rule failed" },
+ { 60023, "only reply age specified in NAT rule" },
+ { 60024, "error doing copyin to determine NAT entry size" },
+ { 60025, "error copying out NAT size of 0" },
+ { 60026, "NAT entry not found" },
+ { 60027, "error doing copyout of NAT entry size" },
+ { 60028, "invalid data size for getting NAT entry" },
+ { 60029, "could not malloc temporary space for NAT entry" },
+ { 60030, "no NAT table entries present" },
+ { 60031, "NAT entry to get next from not found" },
+ { 60032, "not enough space for proxy structure" },
+ { 60033, "not enough space for private proxy data" },
+ { 60034, "NAT entry size is too large" },
+ { 60035, "could not malloc memory for NAT entry sratch space" },
+ { 60036, "" },
+ { 60037, "could not malloc memory for NAT entry" },
+ { 60038, "could not malloc memory for NAT entry rule" },
+ { 60039, "could not resolve NAT entry rule's proxy" },
+ { 60040, "cannot add outbound duplicate NAT entry" },
+ { 60041, "cannot add inbound duplicate NAT entry" },
+ { 60042, "cannot add NAT entry that is neither IN nor OUT" },
+ { 60043, "could not malloc memory for NAT proxy data" },
+ { 60044, "proxy data size too big" },
+ { 60045, "could not malloc proxy private data for NAT entry" },
+ { 60046, "could not malloc memory for new NAT filter rule" },
+ { 60047, "could not find existing filter rule for NAT entry" },
+ { 60048, "insertion into NAT table failed" },
+ { 60049, "iterator error copying out hostmap data" },
+ { 60050, "iterator error copying out NAT rule data" },
+ { 60051, "iterator error copying out NAT entry data" },
+ { 60052, "iterator data supplied with NULL pointer" },
+ { 60053, "unknown NAT iterator type" },
+ { 60054, "unknwon next address type" },
+ { 60055, "iterator suppled with unknown type for get-next" },
+ { 60056, "unknown lookup group for next address" },
+ { 60057, "error copying out NAT log flush results" },
+ { 60058, "bucket table type is incorrect" },
+ { 60059, "error copying out NAT bucket table" },
+ { 60060, "function not found for lookup" },
+ { 60061, "address family not supported with SIOCSTPUT" },
+ { 60062, "unknown timeout name" },
+ { 60063, "cannot allocate new inbound NAT entry table" },
+ { 60064, "cannot allocate new outbound NAT entry table" },
+ { 60065, "cannot allocate new inbound NAT bucketlen table" },
+ { 60066, "cannot allocate new outbound NAT bucketlen table" },
+ { 60067, "cannot allocate new NAT rules table" },
+ { 60068, "cannot allocate new NAT hostmap table" },
+ { 60069, "new source lookup type is not dstlist" },
+ { 60070, "cannot allocate NAT rule scratch space" },
+ { 60071, "new destination lookup type is not dstlist" },
+ { 60072, "function not found for lookup (ipv6)" },
+ { 60073, "unknown lookup group for next address (ipv6)" },
+ { 60074, "unknown next address type (ipv6)" },
+ { 60075, "one object at a time must be copied" },
+/* -------------------------------------------------------------------------- */
+ { 70001, "incorrect object size to get pool stats" },
+ { 70002, "could not malloc memory for new pool node" },
+ { 70003, "invalid addresss length for new pool node" },
+ { 70004, "invalid mask length for new pool node" },
+ { 70005, "error adding node to pool" },
+ { 70006, "pool already exists" },
+ { 70007, "could not malloc memory for new pool" },
+ { 70008, "could not allocate radix tree for new pool" },
+ { 70009, "could not find pool" },
+ { 70010, "unknown pool name for iteration" },
+ { 70011, "unknown pool iterator" },
+ { 70012, "error copying out pool head" },
+ { 70013, "error copying out pool node" },
+ { 70014, "add node size incorrect" },
+ { 70015, "error copying in pool node" },
+ { 70016, "" },
+ { 70017, "cannot find pool for node" },
+ { 70018, "node entry already present in pool" },
+ { 70019, "delete node size incorrect" },
+ { 70020, "error copying in node to delete" },
+ { 70021, "cannot find pool to delete node from" },
+ { 70022, "cannot find node to delete in pool" },
+ { 70023, "pool name already exists" },
+ { 70024, "uid mismatch for node removal" },
+ { 70025, "stats device unit is invalid" },
+ { 70026, "error copying out statistics" },
+ { 70027, "could not remove node from radix tree" },
+ { 70028, "incorrect address length in pool node add" },
+ { 70029, "incorrect mask length in pool node add" },
+ { 70030, "incorrect address length in pool node remove" },
+ { 70031, "incorrect mask length in pool node remove" },
+ { 70032, "cannot allocate memory for pool context" },
+ { 70033, "cannot allocate memory for radix tree context" },
+ { 70034, "adding IPv6 node with incorrect address length" },
+ { 70035, "IPv4 address not masked" },
+ { 70036, "IPv6 address not masked" },
+ { 70037, "removing IPv6 node with incorrect address length" },
+/* -------------------------------------------------------------------------- */
+ { 80001, "could not find proxy" },
+ { 80002, "proxy does not support control operations" },
+ { 80003, "could not allocate data to hold proxy operation" },
+ { 80004, "unknown proxy ioctl" },
+ { 80005, "could not copyin proxy control structure" },
+ { 80006, "DNS proxy could not find rule to delete" },
+ { 80007, "DNS proxy found existing matching rule" },
+ { 80008, "DNS proxy could not allocate memory for new rule" },
+ { 80009, "DNS proxy unknown command request" },
+/* -------------------------------------------------------------------------- */
+ { 90001, "could not malloc space for new scan structure" },
+ { 90002, "scan tag already exists" },
+ { 90003, "scan structure in use" },
+ { 90004, "could not find matching scan tag for filter rule" },
+ { 90005, "could not copyout scan statistics" },
+/* -------------------------------------------------------------------------- */
+ { 100001, "cannot find matching state entry to remove" },
+ { 100002, "error copying in v4 state flush command" },
+ { 100003, "error copying out v4 state flush results" },
+ { 100004, "error copying in v6 state flush command" },
+ { 100005, "error copying out v6 state flush results" },
+ { 100006, "" },
+ { 100007, "" },
+ { 100008, "need write permissions to flush state log" },
+ { 100009, "erorr copyout results of flushing state log" },
+ { 100010, "need write permissions to turn state logging on/off" },
+ { 100011, "error copying in new state logging state" },
+ { 100012, "error copying out current state logging state" },
+ { 100013, "error copying out bytes waiting to be read in state \
+log" },
+ { 100014, "need write permissions to set state lock" },
+ { 100015, "need write permissions to add entry to state table" },
+ { 100016, "state not locked for size retrieval" },
+ { 100017, "error copying out hash table bucket lengths" },
+ { 100018, "could not find token for state iterator" },
+ { 100019, "error copying in state token data for deletion" },
+ { 100020, "unknown state ioctl" },
+ { 100021, "no state table entries present" },
+ { 100022, "state entry to get next from not found" },
+ { 100023, "could not malloc memory for state entry" },
+ { 100024, "could not malloc memory for state entry rule" },
+ { 100025, "could not copy back state entry to user space" },
+ { 100026, "iterator data supplied with NULL pointer" },
+ { 100027, "iterator supplied with 0 item count" },
+ { 100028, "iterator type is incorrect" },
+ { 100029, "invalid state token data pointer supplied" },
+ { 100030, "error copying out next state entry" },
+ { 100031, "unrecognised table request" },
+ { 100032, "error copying out bucket length data" },
+ { 100033, "could not find existing filter rule for state entry" },
+ { 100034, "could not find timeout name" },
+ { 100035, "could not allocate new state table" },
+ { 100036, "could not allocate new state bucket length table" },
+/* -------------------------------------------------------------------------- */
+ { 110001, "sync write header magic number is incorrect" },
+ { 110002, "sync write header protocol is incorrect" },
+ { 110003, "sync write header command is incorrect" },
+ { 110004, "sync write header table number is incorrect" },
+ { 110005, "data structure too small for sync write operation" },
+ { 110006, "zero length data with sync write header" },
+ { 110007, "insufficient data for sync write" },
+ { 110008, "bad sync read size" },
+ { 110009, "interrupted sync read (solaris)" },
+ { 110010, "interrupted sync read (hpux)" },
+ { 110011, "interrupted sync read (osf)" },
+ { 110012, "interrupted sync read" },
+ { 110013, "could not malloc memory for sync'd state" },
+ { 110014, "could not malloc memory for sync-state list item" },
+ { 110015, "sync update could not find state" },
+ { 110016, "unrecognised sync state command" },
+ { 110017, "could not malloc memory for new sync'd NAT entry" },
+ { 110018, "could not malloc memory for sync-NAT list item" },
+ { 110019, "sync update could not find NAT entry" },
+ { 110020, "unrecognised sync NAT command" },
+ { 110021, "ioctls are not handled with sync" },
+/* -------------------------------------------------------------------------- */
+ { 120001, "null data pointer for iterator" },
+ { 120002, "unit outside of acceptable range" },
+ { 120003, "unknown iterator subtype" },
+ { 120004, "cannot find dest. list for iteration" },
+ { 120005, "error copying out destination iteration list" },
+ { 120006, "error copying out destination iteration node" },
+ { 120007, "wrong size for frdest_t structure" },
+ { 120008, "cannot allocate memory for new destination node" },
+ { 120009, "error copying in destination node to add" },
+ { 120010, "could not find destination list to add node to" },
+ { 120011, "error copying in destination node to remove" },
+ { 120012, "could not find dest. list to remove node from" },
+ { 120013, "destination list already exists" },
+ { 120014, "could not allocate new destination table" },
+ { 120015, "could not find destination list to remove" },
+ { 120016, "destination list cannot be removed - it is busy" },
+ { 120017, "error copying in names for destination" },
+ { 120018, "destination name is too long/short" },
+ { 120019, "unrecognised address family in destination" },
+ { 120020, "" },
+ { 120021, "error copying in new destination table" },
+ { 120022, "cannot allocate memory for node table" },
+ { 120023, "stats object size is incorrect for dest. lists" },
+ { 120024, "stats device unit is invalid for dest. lists" },
+ { 120025, "error copying out dest. list statistics" },
+ { 120026, "cannot allocate memory for destination node" },
+ { 120027, "error copying in destination node" },
+ { 120028, "cannot allocate memory for destination context " },
+/* -------------------------------------------------------------------------- */
+ { 130001, "ioctl denied by system security level" },
+ { 130002, "ioctl operation on invalid minor device" },
+ { 130003, "ioctl on device denied, ipfitler is disabled" },
+ { 130004, "ioctl command not allowed when disabled" },
+ { 130005, "ioctl denied due to insufficient authorisation" },
+ { 130006, "cannot read while ipfilter is disabled" },
+ { 130007, "read on minor device not supported" },
+ { 130008, "cannot write while ipfilter is disabled" },
+ { 130009, "write on minor device not supported" },
+ { 130010, "poll on minor device is not supported" },
+ { 130011, "error removing IPv4 filter hooks" },
+ { 130012, "error removing IPv6 filter hooks" },
+ { 130013, "attaching IPv4 hook failed" },
+ { 130014, "attaching IPv6 hook failed" },
+ { 130015, "ipf_init_all failed" },
+ { 130016, "finding pfil head failed" },
+ { 130017, "ipfilter is already initialised and running" },
+};
+
+
+static ipf_error_entry_t *
+find_error(errnum)
+ int errnum;
+{
+ ipf_error_entry_t *ie;
+
+ int l = -1, r = IPF_NUM_ERRORS + 1, step;
+ step = (r - l) / 2;;
+
+ while (step != 0) {
+ ie = ipf_errors + l + step;
+ if (ie->iee_number == errnum)
+ return ie;
+ step = l + step;
+ if (ie->iee_number > errnum)
+ r = step;
+ else
+ l = step;
+ step = (r - l) / 2;;
+ }
+
+ return NULL;
+}
+
+char *
+ipf_geterror(fd, func)
+ int fd;
+ ioctlfunc_t *func;
+{
+ static char text[80];
+ ipf_error_entry_t *ie;
+ int errnum;
+
+ if ((*func)(fd, SIOCIPFINTERROR, &errnum) == 0) {
+
+ ie = find_error(errnum);
+ if (ie != NULL)
+ return ie->iee_text;
+ sprintf(text, "unknown error %d", errnum);
+ } else {
+ sprintf(text, "retrieving error number failed (%d)", errno);
+ }
+ return text;
+}
+
+
+char *
+ipf_strerror(errnum)
+ int errnum;
+{
+ static char text[80];
+ ipf_error_entry_t *ie;
+
+
+ ie = find_error(errnum);
+ if (ie != NULL)
+ return ie->iee_text;
+
+ sprintf(text, "unknown error %d", errnum);
+ return text;
+}
diff --git a/contrib/ipfilter/lib/ionames.c b/contrib/ipfilter/lib/ionames.c
index d2fc977..9b58642 100644
--- a/contrib/ipfilter/lib/ionames.c
+++ b/contrib/ipfilter/lib/ionames.c
@@ -1,40 +1,41 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: ionames.c,v 1.7.4.1 2006/06/16 17:21:02 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
struct ipopt_names ionames[] ={
{ IPOPT_NOP, 0x000001, 1, "nop" }, /* RFC791 */
- { IPOPT_RR, 0x000002, 7, "rr" }, /* 1 route */
- { IPOPT_ZSU, 0x000004, 3, "zsu" }, /* size ?? */
- { IPOPT_MTUP, 0x000008, 3, "mtup" }, /* RFC1191 */
- { IPOPT_MTUR, 0x000010, 3, "mtur" }, /* RFC1191 */
- { IPOPT_ENCODE, 0x000020, 3, "encode" }, /* size ?? */
+ { IPOPT_RR, 0x000002, 8, "rr" }, /* 1 route */
+ { IPOPT_ZSU, 0x000004, 4, "zsu" }, /* size ?? */
+ { IPOPT_MTUP, 0x000008, 4, "mtup" }, /* RFC1191 */
+ { IPOPT_MTUR, 0x000010, 4, "mtur" }, /* RFC1191 */
+ { IPOPT_ENCODE, 0x000020, 4, "encode" }, /* size ?? */
{ IPOPT_TS, 0x000040, 8, "ts" }, /* 1 TS */
- { IPOPT_TR, 0x000080, 3, "tr" }, /* RFC1393 */
- { IPOPT_SECURITY,0x000100, 11, "sec" }, /* RFC1108 */
- { IPOPT_SECURITY,0x000100, 11, "sec-class" }, /* RFC1108 */
- { IPOPT_LSRR, 0x000200, 7, "lsrr" }, /* 1 route */
- { IPOPT_E_SEC, 0x000400, 3, "e-sec" }, /* RFC1108 */
- { IPOPT_CIPSO, 0x000800, 3, "cipso" }, /* size ?? */
+ { IPOPT_TR, 0x000080, 4, "tr" }, /* RFC1393 */
+ { IPOPT_SECURITY,0x000100, 12, "sec" }, /* RFC1108 */
+ { IPOPT_SECURITY,0x000100, 12, "sec-class" }, /* RFC1108 */
+ { IPOPT_LSRR, 0x000200, 8, "lsrr" }, /* 1 route */
+ { IPOPT_E_SEC, 0x000400, 8, "e-sec" }, /* RFC1108 */
+ { IPOPT_CIPSO, 0x000800, 8, "cipso" }, /* size ?? */
{ IPOPT_SATID, 0x001000, 4, "satid" }, /* RFC791 */
- { IPOPT_SSRR, 0x002000, 7, "ssrr" }, /* 1 route */
- { IPOPT_ADDEXT, 0x004000, 3, "addext" }, /* IPv7 ?? */
- { IPOPT_VISA, 0x008000, 3, "visa" }, /* size ?? */
- { IPOPT_IMITD, 0x010000, 3, "imitd" }, /* size ?? */
- { IPOPT_EIP, 0x020000, 3, "eip" }, /* RFC1385 */
- { IPOPT_FINN, 0x040000, 3, "finn" }, /* size ?? */
- { IPOPT_DPS, 0x080000, 3, "dps" }, /* size ?? */
- { IPOPT_SDB, 0x100000, 3, "sdb" }, /* size ?? */
- { IPOPT_NSAPA, 0x200000, 3, "nsapa" }, /* size ?? */
- { IPOPT_RTRALRT,0x400000, 3, "rtralrt" }, /* RFC2113 */
- { IPOPT_UMP, 0x800000, 3, "ump" }, /* size ?? */
+ { IPOPT_SSRR, 0x002000, 8, "ssrr" }, /* 1 route */
+ { IPOPT_ADDEXT, 0x004000, 4, "addext" }, /* IPv7 ?? */
+ { IPOPT_VISA, 0x008000, 4, "visa" }, /* size ?? */
+ { IPOPT_IMITD, 0x010000, 4, "imitd" }, /* size ?? */
+ { IPOPT_EIP, 0x020000, 4, "eip" }, /* RFC1385 */
+ { IPOPT_FINN, 0x040000, 4, "finn" }, /* size ?? */
+ { IPOPT_DPS, 0x080000, 4, "dps" }, /* size ?? */
+ { IPOPT_SDB, 0x100000, 4, "sdb" }, /* size ?? */
+ { IPOPT_NSAPA, 0x200000, 4, "nsapa" }, /* size ?? */
+ { IPOPT_RTRALRT,0x400000, 4, "rtralrt" }, /* RFC2113 */
+ { IPOPT_UMP, 0x800000, 4, "ump" }, /* size ?? */
+ { IPOPT_AH, 0x1000000, 0, "ah" }, /* IPPROTO_AH */
{ 0, 0, 0, (char *)NULL } /* must be last */
};
diff --git a/contrib/ipfilter/lib/ipf_dotuning.c b/contrib/ipfilter/lib/ipf_dotuning.c
index 6508a26..b0ac8b4 100644
--- a/contrib/ipfilter/lib/ipf_dotuning.c
+++ b/contrib/ipfilter/lib/ipf_dotuning.c
@@ -1,21 +1,21 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: ipf_dotuning.c,v 1.2.4.3 2006/06/16 17:21:02 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
#include "netinet/ipl.h"
#include <sys/ioctl.h>
void ipf_dotuning(fd, tuneargs, iocfn)
-int fd;
-char *tuneargs;
-ioctlfunc_t iocfn;
+ int fd;
+ char *tuneargs;
+ ioctlfunc_t iocfn;
{
ipfobj_t obj;
ipftune_t tu;
@@ -31,7 +31,8 @@ ioctlfunc_t iocfn;
if (!strcmp(s, "list")) {
while (1) {
if ((*iocfn)(fd, SIOCIPFGETNEXT, &obj) == -1) {
- perror("ioctl(SIOCIPFGETNEXT)");
+ ipf_perror_fd(fd, iocfn,
+ "ioctl(SIOCIPFGETNEXT)");
break;
}
if (tu.ipft_cookie == NULL)
@@ -46,7 +47,8 @@ ioctlfunc_t iocfn;
strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
- perror("ioctl(SIOCIPFSET)");
+ ipf_perror_fd(fd, iocfn,
+ "ioctl(SIOCIPFSET)");
return;
}
} else {
@@ -57,7 +59,7 @@ ioctlfunc_t iocfn;
tu.ipft_cookie = NULL;
strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
- perror("ioctl(SIOCIPFGET)");
+ ipf_perror_fd(fd, iocfn, "ioctl(SIOCIPFGET)");
return;
}
if (tu.ipft_cookie == NULL) {
diff --git a/contrib/ipfilter/lib/ipf_perror.c b/contrib/ipfilter/lib/ipf_perror.c
new file mode 100644
index 0000000..85a1b1d
--- /dev/null
+++ b/contrib/ipfilter/lib/ipf_perror.c
@@ -0,0 +1,47 @@
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "ipf.h"
+
+void
+ipf_perror(err, string)
+ int err;
+ char *string;
+{
+ if (err == 0)
+ fprintf(stderr, "%s\n", string);
+ else
+ fprintf(stderr, "%s %s\n", string, ipf_strerror(err));
+}
+
+int
+ipf_perror_fd(fd, iocfunc, string)
+ int fd;
+ ioctlfunc_t iocfunc;
+ char *string;
+{
+ int save;
+ int realerr;
+
+ save = errno;
+ if ((*iocfunc)(fd, SIOCIPFINTERROR, &realerr) == -1)
+ realerr = 0;
+
+ errno = save;
+ fprintf(stderr, "%d:", realerr);
+ ipf_perror(realerr, string);
+ return realerr ? realerr : save;
+
+}
+
+void
+ipferror(fd, msg)
+ int fd;
+ char *msg;
+{
+ if (fd >= 0) {
+ ipf_perror_fd(fd, ioctl, msg);
+ } else {
+ fprintf(stderr, "0:");
+ perror(msg);
+ }
+}
diff --git a/contrib/ipfilter/lib/ipft_ef.c b/contrib/ipfilter/lib/ipft_ef.c
deleted file mode 100644
index 2d50f07..0000000
--- a/contrib/ipfilter/lib/ipft_ef.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* $FreeBSD$ */
-
-/*
- * Copyright (C) 2000-2006 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: ipft_ef.c,v 1.14.2.2 2006/06/16 17:21:02 darrenr Exp $
- */
-
-/*
- icmp type
- lnth proto source destination src port dst port
-
-etherfind -n
-
- 60 tcp 128.250.20.20 128.250.133.13 2419 telnet
-
-etherfind -n -t
-
- 0.32 91 04 131.170.1.10 128.250.133.13
- 0.33 566 udp 128.250.37.155 128.250.133.3 901 901
-*/
-
-#include "ipf.h"
-#include "ipt.h"
-
-#ifndef linux
-#include <netinet/ip_var.h>
-#endif
-#include <netinet/tcpip.h>
-
-
-#if !defined(lint)
-static const char sccsid[] = "@(#)ipft_ef.c 1.6 2/4/96 (C)1995 Darren Reed";
-static const char rcsid[] = "@(#)$Id: ipft_ef.c,v 1.14.2.2 2006/06/16 17:21:02 darrenr Exp $";
-#endif
-
-static int etherf_open __P((char *));
-static int etherf_close __P((void));
-static int etherf_readip __P((char *, int, char **, int *));
-
-struct ipread etherf = { etherf_open, etherf_close, etherf_readip, 0 };
-
-static FILE *efp = NULL;
-static int efd = -1;
-
-
-static int etherf_open(fname)
-char *fname;
-{
- if (efd != -1)
- return efd;
-
- if (!strcmp(fname, "-")) {
- efd = 0;
- efp = stdin;
- } else {
- efd = open(fname, O_RDONLY);
- efp = fdopen(efd, "r");
- }
- return efd;
-}
-
-
-static int etherf_close()
-{
- return close(efd);
-}
-
-
-static int etherf_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
-{
- struct tcpiphdr pkt;
- ip_t *ip = (ip_t *)&pkt;
- char src[16], dst[16], sprt[16], dprt[16];
- char lbuf[128], len[8], prot[8], time[8], *s;
- int slen, extra = 0, i;
-
- if (!fgets(lbuf, sizeof(lbuf) - 1, efp))
- return 0;
-
- if ((s = strchr(lbuf, '\n')))
- *s = '\0';
- lbuf[sizeof(lbuf)-1] = '\0';
-
- bzero(&pkt, sizeof(pkt));
-
- if (sscanf(lbuf, "%7s %7s %15s %15s %15s %15s", len, prot, src, dst,
- sprt, dprt) != 6)
- if (sscanf(lbuf, "%7s %7s %7s %15s %15s %15s %15s", time,
- len, prot, src, dst, sprt, dprt) != 7)
- return -1;
-
- ip->ip_p = getproto(prot);
-
- switch (ip->ip_p) {
- case IPPROTO_TCP :
- if (isdigit(*sprt))
- pkt.ti_sport = htons(atoi(sprt) & 65535);
- if (isdigit(*dprt))
- pkt.ti_dport = htons(atoi(dprt) & 65535);
- extra = sizeof(struct tcphdr);
- break;
- case IPPROTO_UDP :
- if (isdigit(*sprt))
- pkt.ti_sport = htons(atoi(sprt) & 65535);
- if (isdigit(*dprt))
- pkt.ti_dport = htons(atoi(dprt) & 65535);
- extra = sizeof(struct udphdr);
- break;
-#ifdef IGMP
- case IPPROTO_IGMP :
- extra = sizeof(struct igmp);
- break;
-#endif
- case IPPROTO_ICMP :
- extra = sizeof(struct icmp);
- break;
- default :
- break;
- }
-
- (void) inet_aton(src, &ip->ip_src);
- (void) inet_aton(dst, &ip->ip_dst);
- ip->ip_len = atoi(len);
- IP_HL_A(ip, sizeof(ip_t));
-
- slen = IP_HL(ip) + extra;
- i = MIN(cnt, slen);
- bcopy((char *)&pkt, buf, i);
- return i;
-}
diff --git a/contrib/ipfilter/lib/ipft_hx.c b/contrib/ipfilter/lib/ipft_hx.c
index d295c21..15002ea 100644
--- a/contrib/ipfilter/lib/ipft_hx.c
+++ b/contrib/ipfilter/lib/ipft_hx.c
@@ -1,13 +1,13 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#if !defined(lint)
static const char sccsid[] = "@(#)ipft_hx.c 1.1 3/9/96 (C) 1996 Darren Reed";
-static const char rcsid[] = "@(#)$Id: ipft_hx.c,v 1.11.4.4 2006/06/16 17:21:03 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
#include <ctype.h>
@@ -20,7 +20,7 @@ extern int opts;
static int hex_open __P((char *));
static int hex_close __P((void));
-static int hex_readip __P((char *, int, char **, int *));
+static int hex_readip __P((mb_t *, char **, int *));
static char *readhex __P((char *, char *));
struct ipread iphex = { hex_open, hex_close, hex_readip, 0 };
@@ -28,7 +28,7 @@ static FILE *tfp = NULL;
static int tfd = -1;
static int hex_open(fname)
-char *fname;
+ char *fname;
{
if (tfp && tfd != -1) {
rewind(tfp);
@@ -56,14 +56,19 @@ static int hex_close()
}
-static int hex_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
+static int hex_readip(mb, ifn, dir)
+ mb_t *mb;
+ char **ifn;
+ int *dir;
{
register char *s, *t, *u;
char line[513];
ip_t *ip;
+ char *buf;
+ int cnt;
+ buf = (char *)mb->mb_buf;
+ cnt = sizeof(mb->mb_buf);
/*
* interpret start of line as possibly "[ifname]" or
* "[in/out,ifname]".
@@ -75,8 +80,10 @@ int cnt, *dir;
ip = (ip_t *)buf;
while (fgets(line, sizeof(line)-1, tfp)) {
if ((s = strchr(line, '\n'))) {
- if (s == line)
- return (char *)ip - buf;
+ if (s == line) {
+ mb->mb_len = (char *)ip - buf;
+ return mb->mb_len;
+ }
*s = '\0';
}
if ((s = strchr(line, '#')))
@@ -104,17 +111,35 @@ int cnt, *dir;
} else if (ifn)
*ifn = t;
}
+
+ while (*s++ == '+') {
+ if (!strncasecmp(s, "mcast", 5)) {
+ mb->mb_flags |= M_MCAST;
+ s += 5;
+ }
+ if (!strncasecmp(s, "bcast", 5)) {
+ mb->mb_flags |= M_BCAST;
+ s += 5;
+ }
+ if (!strncasecmp(s, "mbcast", 6)) {
+ mb->mb_flags |= M_MBCAST;
+ s += 6;
+ }
+ }
+ while (ISSPACE(*s))
+ s++;
} else
s = line;
t = (char *)ip;
ip = (ip_t *)readhex(s, (char *)ip);
if ((opts & OPT_DEBUG) != 0) {
if (opts & OPT_ASCII) {
+ int c = *t;
if (t < (char *)ip)
putchar('\t');
while (t < (char *)ip) {
- if (ISPRINT(*t) && ISASCII(*t))
- putchar(*t);
+ if (isprint(c) && isascii(c))
+ putchar(c);
else
putchar('.');
t++;
diff --git a/contrib/ipfilter/lib/ipft_pc.c b/contrib/ipfilter/lib/ipft_pc.c
index 0f31a10..3a264bd 100644
--- a/contrib/ipfilter/lib/ipft_pc.c
+++ b/contrib/ipfilter/lib/ipft_pc.c
@@ -1,19 +1,17 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: ipft_pc.c,v 1.10.2.2 2006/06/16 17:21:03 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-#include "pcap-ipf.h"
-#include "bpf-ipf.h"
#include "ipt.h"
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: ipft_pc.c,v 1.10.2.2 2006/06/16 17:21:03 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
struct llc {
@@ -29,79 +27,61 @@ struct llc {
*/
static struct llc llcs[] = {
- { DLT_NULL, 0, 0, 0 },
- { DLT_EN10MB, 14, 12, 2 },
- { DLT_EN3MB, 0, 0, 0 },
- { DLT_AX25, 0, 0, 0 },
- { DLT_PRONET, 0, 0, 0 },
- { DLT_CHAOS, 0, 0, 0 },
- { DLT_IEEE802, 0, 0, 0 },
- { DLT_ARCNET, 0, 0, 0 },
- { DLT_SLIP, 0, 0, 0 },
- { DLT_PPP, 0, 0, 0 },
- { DLT_FDDI, 0, 0, 0 },
-#ifdef DLT_ATMRFC1483
- { DLT_ATMRFC1483, 0, 0, 0 },
-#endif
- { DLT_RAW, 0, 0, 0 },
-#ifdef DLT_ENC
- { DLT_ENC, 0, 0, 0 },
-#endif
-#ifdef DLT_SLIP_BSDOS
- { DLT_SLIP_BSDOS, 0, 0, 0 },
-#endif
-#ifdef DLT_PPP_BSDOS
- { DLT_PPP_BSDOS, 0, 0, 0 },
-#endif
-#ifdef DLT_HIPPI
- { DLT_HIPPI, 0, 0, 0 },
-#endif
-#ifdef DLT_HDLC
- { DLT_HDLC, 0, 0, 0 },
-#endif
-#ifdef DLT_PPP_SERIAL
- { DLT_PPP_SERIAL, 4, 4, 0 },
-#endif
-#ifdef DLT_PPP_ETHER
- { DLT_PPP_ETHER, 8, 8, 0 },
-#endif
-#ifdef DLT_ECONET
- { DLT_ECONET, 0, 0, 0 },
-#endif
+ { 0, 0, 0, 0 }, /* DLT_NULL */
+ { 1, 14, 12, 2 }, /* DLT_Ethernet */
+ { 10, 0, 0, 0 }, /* DLT_FDDI */
+ { 12, 0, 0, 0 }, /* DLT_RAW */
{ -1, -1, -1, -1 }
};
-static int pcap_open __P((char *));
-static int pcap_close __P((void));
-static int pcap_readip __P((char *, int, char **, int *));
-static void swap_hdr __P((pcaphdr_t *));
-static int pcap_read_rec __P((struct pcap_pkthdr *));
+typedef struct {
+ u_int id;
+ u_short major;
+ u_short minor;
+ u_int timezone;
+ u_int sigfigs;
+ u_int snaplen;
+ u_int type;
+} fileheader_t;
+
+typedef struct {
+ u_32_t seconds;
+ u_32_t microseconds;
+ u_32_t caplen;
+ u_32_t wirelen;
+} packetheader_t;
+
+static int ipcap_open __P((char *));
+static int ipcap_close __P((void));
+static int ipcap_readip __P((mb_t *, char **, int *));
+static int ipcap_read_rec __P((packetheader_t *));
+static void iswap_hdr __P((fileheader_t *));
static int pfd = -1, swapped = 0;
static struct llc *llcp = NULL;
-struct ipread pcap = { pcap_open, pcap_close, pcap_readip, 0 };
+struct ipread pcap = { ipcap_open, ipcap_close, ipcap_readip, 0 };
#define SWAPLONG(y) \
((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
#define SWAPSHORT(y) \
( (((y)&0xff)<<8) | (((y)&0xff00)>>8) )
-static void swap_hdr(p)
-pcaphdr_t *p;
+static void iswap_hdr(p)
+ fileheader_t *p;
{
- p->pc_v_maj = SWAPSHORT(p->pc_v_maj);
- p->pc_v_min = SWAPSHORT(p->pc_v_min);
- p->pc_zone = SWAPLONG(p->pc_zone);
- p->pc_sigfigs = SWAPLONG(p->pc_sigfigs);
- p->pc_slen = SWAPLONG(p->pc_slen);
- p->pc_type = SWAPLONG(p->pc_type);
+ p->major = SWAPSHORT(p->major);
+ p->minor = SWAPSHORT(p->minor);
+ p->timezone = SWAPLONG(p->timezone);
+ p->sigfigs = SWAPLONG(p->sigfigs);
+ p->snaplen = SWAPLONG(p->snaplen);
+ p->type = SWAPLONG(p->type);
}
-static int pcap_open(fname)
-char *fname;
+static int ipcap_open(fname)
+ char *fname;
{
- pcaphdr_t ph;
+ fileheader_t ph;
int fd, i;
if (pfd != -1)
@@ -115,22 +95,17 @@ char *fname;
if (read(fd, (char *)&ph, sizeof(ph)) != sizeof(ph))
return -2;
- if (ph.pc_id != TCPDUMP_MAGIC) {
- if (SWAPLONG(ph.pc_id) != TCPDUMP_MAGIC) {
+ if (ph.id != 0xa1b2c3d4) {
+ if (SWAPLONG(ph.id) != 0xa1b2c3d4) {
(void) close(fd);
return -2;
}
swapped = 1;
- swap_hdr(&ph);
- }
-
- if (ph.pc_v_maj != PCAP_VERSION_MAJ) {
- (void) close(fd);
- return -2;
+ iswap_hdr(&ph);
}
for (i = 0; llcs[i].lc_type != -1; i++)
- if (llcs[i].lc_type == ph.pc_type) {
+ if (llcs[i].lc_type == ph.type) {
llcp = llcs + i;
break;
}
@@ -143,13 +118,13 @@ char *fname;
pfd = fd;
printf("opened pcap file %s:\n", fname);
printf("\tid: %08x version: %d.%d type: %d snap %d\n",
- ph.pc_id, ph.pc_v_maj, ph.pc_v_min, ph.pc_type, ph.pc_slen);
+ ph.id, ph.major, ph.minor, ph.type, ph.snaplen);
return fd;
}
-static int pcap_close()
+static int ipcap_close()
{
return close(pfd);
}
@@ -159,8 +134,8 @@ static int pcap_close()
* read in the header (and validate) which should be the first record
* in a pcap file.
*/
-static int pcap_read_rec(rec)
-struct pcap_pkthdr *rec;
+static int ipcap_read_rec(rec)
+ packetheader_t *rec;
{
int n, p, i;
char *s;
@@ -177,13 +152,13 @@ struct pcap_pkthdr *rec;
}
if (swapped) {
- rec->ph_clen = SWAPLONG(rec->ph_clen);
- rec->ph_len = SWAPLONG(rec->ph_len);
- rec->ph_ts.tv_sec = SWAPLONG(rec->ph_ts.tv_sec);
- rec->ph_ts.tv_usec = SWAPLONG(rec->ph_ts.tv_usec);
+ rec->caplen = SWAPLONG(rec->caplen);
+ rec->wirelen = SWAPLONG(rec->wirelen);
+ rec->seconds = SWAPLONG(rec->seconds);
+ rec->microseconds = SWAPLONG(rec->microseconds);
}
- p = rec->ph_clen;
- n = MIN(p, rec->ph_len);
+ p = rec->caplen;
+ n = MIN(p, rec->wirelen);
if (!n || n < 0)
return -3;
@@ -198,15 +173,15 @@ struct pcap_pkthdr *rec;
* read an entire pcap packet record. only the data part is copied into
* the available buffer, with the number of bytes copied returned.
*/
-static int pcap_read(buf, cnt)
-char *buf;
-int cnt;
+static int ipcap_read(buf, cnt)
+ char *buf;
+ int cnt;
{
- struct pcap_pkthdr rec;
+ packetheader_t rec;
static char *bufp = NULL;
int i, n;
- if ((i = pcap_read_rec(&rec)) <= 0)
+ if ((i = ipcap_read_rec(&rec)) <= 0)
return i;
if (!bufp)
@@ -227,20 +202,29 @@ int cnt;
/*
* return only an IP packet read into buf
*/
-static int pcap_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
+static int ipcap_readip(mb, ifn, dir)
+ mb_t *mb;
+ char **ifn;
+ int *dir;
{
static char *bufp = NULL;
- struct pcap_pkthdr rec;
+ packetheader_t rec;
struct llc *l;
char *s, ty[4];
int i, j, n;
+ char *buf;
+ int cnt;
+#if 0
+ ifn = ifn; /* gcc -Wextra */
+ dir = dir; /* gcc -Wextra */
+#endif
+ buf = (char *)mb->mb_buf;
+ cnt = sizeof(mb->mb_buf);
l = llcp;
/* do { */
- if ((i = pcap_read_rec(&rec)) <= 0)
+ if ((i = ipcap_read_rec(&rec)) <= 0)
return i;
if (!bufp)
@@ -265,5 +249,6 @@ int cnt, *dir;
/* } while (ty[0] != 0x8 && ty[1] != 0); */
n = MIN(i, cnt);
bcopy(s, buf, n);
+ mb->mb_len = n;
return n;
}
diff --git a/contrib/ipfilter/lib/ipft_sn.c b/contrib/ipfilter/lib/ipft_sn.c
deleted file mode 100644
index 2beb6ee..0000000
--- a/contrib/ipfilter/lib/ipft_sn.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* $FreeBSD$ */
-
-/*
- * Copyright (C) 2000-2003 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: ipft_sn.c,v 1.7.4.1 2006/06/16 17:21:03 darrenr Exp $
- */
-
-/*
- * Written to comply with the recent RFC 1761 from Sun.
- */
-#include "ipf.h"
-#include "snoop.h"
-#include "ipt.h"
-
-#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: ipft_sn.c,v 1.7.4.1 2006/06/16 17:21:03 darrenr Exp $";
-#endif
-
-struct llc {
- int lc_sz; /* LLC header length */
- int lc_to; /* LLC Type offset */
- int lc_tl; /* LLC Type length */
-};
-
-/*
- * While many of these maybe the same, some do have different header formats
- * which make this useful.
- */
-static struct llc llcs[SDL_MAX+1] = {
- { 0, 0, 0 }, /* SDL_8023 */
- { 0, 0, 0 }, /* SDL_8024 */
- { 0, 0, 0 }, /* SDL_8025 */
- { 0, 0, 0 }, /* SDL_8026 */
- { 14, 12, 2 }, /* SDL_ETHER */
- { 0, 0, 0 }, /* SDL_HDLC */
- { 0, 0, 0 }, /* SDL_CHSYNC */
- { 0, 0, 0 }, /* SDL_IBMCC */
- { 0, 0, 0 }, /* SDL_FDDI */
- { 0, 0, 0 }, /* SDL_OTHER */
-};
-
-static int snoop_open __P((char *));
-static int snoop_close __P((void));
-static int snoop_readip __P((char *, int, char **, int *));
-
-static int sfd = -1, s_type = -1;
-static int snoop_read_rec __P((struct snooppkt *));
-
-struct ipread snoop = { snoop_open, snoop_close, snoop_readip, 0 };
-
-
-static int snoop_open(fname)
-char *fname;
-{
- struct snoophdr sh;
- int fd;
- int s_v;
-
- if (sfd != -1)
- return sfd;
-
- if (!strcmp(fname, "-"))
- fd = 0;
- else if ((fd = open(fname, O_RDONLY)) == -1)
- return -1;
-
- if (read(fd, (char *)&sh, sizeof(sh)) != sizeof(sh))
- return -2;
-
- s_v = (int)ntohl(sh.s_v);
- s_type = (int)ntohl(sh.s_type);
-
- if (s_v != SNOOP_VERSION ||
- s_type < 0 || s_type > SDL_MAX) {
- (void) close(fd);
- return -2;
- }
-
- sfd = fd;
- printf("opened snoop file %s:\n", fname);
- printf("\tid: %8.8s version: %d type: %d\n", sh.s_id, s_v, s_type);
-
- return fd;
-}
-
-
-static int snoop_close()
-{
- return close(sfd);
-}
-
-
-/*
- * read in the header (and validate) which should be the first record
- * in a snoop file.
- */
-static int snoop_read_rec(rec)
-struct snooppkt *rec;
-{
- int n, plen, ilen;
-
- if (read(sfd, (char *)rec, sizeof(*rec)) != sizeof(*rec))
- return -2;
-
- ilen = (int)ntohl(rec->sp_ilen);
- plen = (int)ntohl(rec->sp_plen);
- if (ilen > plen || plen < sizeof(*rec))
- return -2;
-
- plen -= sizeof(*rec);
- n = MIN(plen, ilen);
- if (!n || n < 0)
- return -3;
-
- return plen;
-}
-
-
-#ifdef notyet
-/*
- * read an entire snoop packet record. only the data part is copied into
- * the available buffer, with the number of bytes copied returned.
- */
-static int snoop_read(buf, cnt)
-char *buf;
-int cnt;
-{
- struct snooppkt rec;
- static char *bufp = NULL;
- int i, n;
-
- if ((i = snoop_read_rec(&rec)) <= 0)
- return i;
-
- if (!bufp)
- bufp = malloc(i);
- else
- bufp = realloc(bufp, i);
-
- if (read(sfd, bufp, i) != i)
- return -2;
-
- n = MIN(i, cnt);
- bcopy(bufp, buf, n);
- return n;
-}
-#endif
-
-
-/*
- * return only an IP packet read into buf
- */
-static int snoop_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
-{
- static char *bufp = NULL;
- struct snooppkt rec;
- struct llc *l;
- char ty[4], *s;
- int i, n;
-
- do {
- if ((i = snoop_read_rec(&rec)) <= 0)
- return i;
-
- if (!bufp)
- bufp = malloc(i);
- else
- bufp = realloc(bufp, i);
- s = bufp;
-
- if (read(sfd, s, i) != i)
- return -2;
-
- l = &llcs[s_type];
- i -= l->lc_to;
- s += l->lc_to;
- /*
- * XXX - bogus assumption here on the part of the time field
- * that it won't be greater than 4 bytes and the 1st two will
- * have the values 8 and 0 for IP. Should be a table of
- * these too somewhere. Really only works for SDL_ETHER.
- */
- bcopy(s, ty, l->lc_tl);
- } while (ty[0] != 0x8 && ty[1] != 0);
-
- i -= l->lc_tl;
- s += l->lc_tl;
- n = MIN(i, cnt);
- bcopy(s, buf, n);
-
- return n;
-}
diff --git a/contrib/ipfilter/lib/ipft_td.c b/contrib/ipfilter/lib/ipft_td.c
deleted file mode 100644
index d571ada..0000000
--- a/contrib/ipfilter/lib/ipft_td.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* $FreeBSD$ */
-
-/*
- * Copyright (C) 2000-2006 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: ipft_td.c,v 1.15.2.2 2006/06/16 17:21:03 darrenr Exp $
- */
-
-/*
-tcpdump -n
-
-00:05:47.816843 128.231.76.76.3291 > 224.2.252.231.36573: udp 36 (encap)
-
-tcpdump -nq
-
-00:33:48.410771 192.73.213.11.1463 > 224.2.248.153.59360: udp 31 (encap)
-
-tcpdump -nqt
-
-128.250.133.13.23 > 128.250.20.20.2419: tcp 27
-
-tcpdump -nqtt
-
-123456789.1234567 128.250.133.13.23 > 128.250.20.20.2419: tcp 27
-
-tcpdump -nqte
-
-8:0:20:f:65:f7 0:0:c:1:8a:c5 81: 128.250.133.13.23 > 128.250.20.20.2419: tcp 27
-
-*/
-
-#include "ipf.h"
-#include "ipt.h"
-
-#ifndef linux
-#include <netinet/ip_var.h>
-#endif
-#include <netinet/tcpip.h>
-
-
-#if !defined(lint)
-static const char sccsid[] = "@(#)ipft_td.c 1.8 2/4/96 (C)1995 Darren Reed";
-static const char rcsid[] = "@(#)$Id: ipft_td.c,v 1.15.2.2 2006/06/16 17:21:03 darrenr Exp $";
-#endif
-
-static int tcpd_open __P((char *));
-static int tcpd_close __P((void));
-static int tcpd_readip __P((char *, int, char **, int *));
-static int count_dots __P((char *));
-
-struct ipread tcpd = { tcpd_open, tcpd_close, tcpd_readip, 0 };
-
-static FILE *tfp = NULL;
-static int tfd = -1;
-
-
-static int tcpd_open(fname)
-char *fname;
-{
- if (tfd != -1)
- return tfd;
-
- if (!strcmp(fname, "-")) {
- tfd = 0;
- tfp = stdin;
- } else {
- tfd = open(fname, O_RDONLY);
- tfp = fdopen(tfd, "r");
- }
- return tfd;
-}
-
-
-static int tcpd_close()
-{
- (void) fclose(tfp);
- return close(tfd);
-}
-
-
-static int count_dots(str)
-char *str;
-{
- int i = 0;
-
- while (*str)
- if (*str++ == '.')
- i++;
- return i;
-}
-
-
-static int tcpd_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
-{
- struct tcpiphdr pkt;
- ip_t *ip = (ip_t *)&pkt;
- char src[32], dst[32], misc[256], time[32], link1[32], link2[32];
- char lbuf[160], *s;
- int n, slen, extra = 0;
-
- if (!fgets(lbuf, sizeof(lbuf) - 1, tfp))
- return 0;
-
- if ((s = strchr(lbuf, '\n')))
- *s = '\0';
- lbuf[sizeof(lbuf)-1] = '\0';
-
- bzero(&pkt, sizeof(pkt));
-
- if ((n = sscanf(lbuf, "%31s > %31s: %255s", src, dst, misc)) != 3)
- if ((n = sscanf(lbuf, "%31s %31s > %31s: %255s",
- time, src, dst, misc)) != 4)
- if ((n = sscanf(lbuf, "%31s %31s: %31s > %31s: %255s",
- link1, link2, src, dst, misc)) != 5) {
- n = sscanf(lbuf,
- "%31s %31s %31s: %31s > %31s: %255s",
- time, link1, link2, src, dst, misc);
- if (n != 6)
- return -1;
- }
-
- if (count_dots(dst) == 4) {
- s = strrchr(src, '.');
- *s++ = '\0';
- (void) inet_aton(src, &ip->ip_src);
- pkt.ti_sport = htons(atoi(s));
- *--s = '.';
- s = strrchr(dst, '.');
-
- *s++ = '\0';
- (void) inet_aton(src, &ip->ip_dst);
- pkt.ti_dport = htons(atoi(s));
- *--s = '.';
-
- } else {
- (void) inet_aton(src, &ip->ip_src);
- (void) inet_aton(src, &ip->ip_dst);
- }
- ip->ip_len = sizeof(ip_t);
- IP_HL_A(ip, sizeof(ip_t));
-
- s = strtok(misc, " :");
- if (s == NULL)
- return 0;
- ip->ip_p = getproto(s);
-
- switch (ip->ip_p)
- {
- case IPPROTO_TCP :
- case IPPROTO_UDP :
- s = strtok(NULL, " :");
- if (s == NULL)
- return 0;
- ip->ip_len += atoi(s);
- if (ip->ip_p == IPPROTO_TCP)
- extra = sizeof(struct tcphdr);
- else if (ip->ip_p == IPPROTO_UDP)
- extra = sizeof(struct udphdr);
- break;
-#ifdef IGMP
- case IPPROTO_IGMP :
- extra = sizeof(struct igmp);
- break;
-#endif
- case IPPROTO_ICMP :
- extra = sizeof(struct icmp);
- break;
- default :
- break;
- }
-
- slen = IP_HL(ip) + extra + ip->ip_len;
- return slen;
-}
diff --git a/contrib/ipfilter/lib/ipft_tx.c b/contrib/ipfilter/lib/ipft_tx.c
index f4475e3..a996c5b 100644
--- a/contrib/ipfilter/lib/ipft_tx.c
+++ b/contrib/ipfilter/lib/ipft_tx.c
@@ -1,15 +1,15 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: ipft_tx.c,v 1.15.2.10 2007/09/03 21:54:44 darrenr Exp $
+ * $Id$
*/
#if !defined(lint)
static const char sccsid[] = "@(#)ipft_tx.c 1.7 6/5/96 (C) 1993 Darren Reed";
-static const char rcsid[] = "@(#)$Id: ipft_tx.c,v 1.15.2.10 2007/09/03 21:54:44 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
#include <ctype.h>
@@ -17,18 +17,12 @@ static const char rcsid[] = "@(#)$Id: ipft_tx.c,v 1.15.2.10 2007/09/03 21:54:44
#include "ipf.h"
#include "ipt.h"
-#ifndef linux
-#include <netinet/ip_var.h>
-#endif
-#include <netinet/tcpip.h>
-
-
extern int opts;
static char *tx_proto = "";
static int text_open __P((char *)), text_close __P((void));
-static int text_readip __P((char *, int, char **, int *));
+static int text_readip __P((mb_t *, char **, int *));
static int parseline __P((char *, ip_t *, char **, int *));
static char myflagset[] = "FSRPAUEC";
@@ -42,16 +36,19 @@ static int tfd = -1;
static u_32_t tx_hostnum __P((char *, int *));
static u_short tx_portnum __P((char *));
+#ifdef USE_INET6
+int parseipv6 __P((char **, ip6_t *, char **, int *));
+#endif
/*
* returns an ip address as a long var as a result of either a DNS lookup or
* straight inet_addr() call
*/
static u_32_t tx_hostnum(host, resolved)
-char *host;
-int *resolved;
+ char *host;
+ int *resolved;
{
- u_32_t ipa;
+ i6addr_t ipa;
*resolved = 0;
if (!strcasecmp("any", host))
@@ -59,12 +56,12 @@ int *resolved;
if (ISDIGIT(*host))
return inet_addr(host);
- if (gethost(host, &ipa) == -1) {
+ if (gethost(AF_INET, host, &ipa) == -1) {
*resolved = -1;
fprintf(stderr, "can't resolve hostname: %s\n", host);
return 0;
}
- return ipa;
+ return ipa.in4.s_addr;
}
@@ -73,7 +70,7 @@ int *resolved;
* straight atoi()
*/
static u_short tx_portnum(name)
-char *name;
+ char *name;
{
struct servent *sp;
@@ -87,15 +84,8 @@ char *name;
}
-char *tx_icmptypes[] = {
- "echorep", (char *)NULL, (char *)NULL, "unreach", "squench",
- "redir", (char *)NULL, (char *)NULL, "echo", "routerad",
- "routersol", "timex", "paramprob", "timest", "timestrep",
- "inforeq", "inforep", "maskreq", "maskrep", "END"
-};
-
static int text_open(fname)
-char *fname;
+ char *fname;
{
if (tfp && tfd != -1) {
rewind(tfp);
@@ -123,13 +113,19 @@ static int text_close()
}
-static int text_readip(buf, cnt, ifn, dir)
-char *buf, **ifn;
-int cnt, *dir;
+static int text_readip(mb, ifn, dir)
+ mb_t *mb;
+ char **ifn;
+ int *dir;
{
register char *s;
char line[513];
ip_t *ip;
+ char *buf;
+ int cnt;
+
+ buf = (char *)mb->mb_buf;
+ cnt = sizeof(mb->mb_buf);
*ifn = NULL;
while (fgets(line, sizeof(line)-1, tfp)) {
@@ -147,7 +143,17 @@ int cnt, *dir;
*dir = 0;
if (!parseline(line, (ip_t *)buf, ifn, dir)) {
ip = (ip_t *)buf;
- return ntohs(ip->ip_len);
+ if (IP_V(ip) == 6) {
+#ifdef USE_INET6
+ mb->mb_len = ntohs(((ip6_t *)ip)->ip6_plen) +
+ sizeof(ip6_t);
+#else
+ mb->mb_len = 0;
+#endif
+ } else {
+ mb->mb_len = ntohs(ip->ip_len);
+ }
+ return mb->mb_len;
}
}
if (feof(tfp))
@@ -156,10 +162,10 @@ int cnt, *dir;
}
static int parseline(line, ip, ifn, out)
-char *line;
-ip_t *ip;
-char **ifn;
-int *out;
+ char *line;
+ ip_t *ip;
+ char **ifn;
+ int *out;
{
tcphdr_t th, *tcp = &th;
struct icmp icmp, *ic = &icmp;
@@ -174,6 +180,7 @@ int *out;
bzero(ipopts, sizeof(ipopts));
IP_HL_A(ip, sizeof(*ip) >> 2);
IP_V_A(ip, IPVERSION);
+ ip->ip_ttl = 63;
for (i = 0, cps[0] = strtok(line, " \b\t\r\n"); cps[i] && i < 19; )
cps[++i] = strtok(NULL, " \b\t\r\n");
@@ -186,6 +193,13 @@ int *out;
fprintf(stderr, "bad direction \"%s\"\n", *cpp);
return 1;
}
+
+#ifdef USE_INET6
+ if (!strcasecmp(*cpp, "out6") || !strcasecmp(*cpp, "in6")) {
+ return parseipv6(cpp, (ip6_t *)ip, ifn, out);
+ }
+#endif
+
*out = (TOLOWER(c) == 'o') ? 1 : 0;
cpp++;
if (!*cpp)
@@ -284,24 +298,20 @@ int *out;
cpp++;
}
} else if (*cpp && ip->ip_p == IPPROTO_ICMP) {
- extern char *tx_icmptypes[];
- char **s, *t;
- int i;
+ char *t;
t = strchr(*cpp, ',');
if (t != NULL)
*t = '\0';
- for (s = tx_icmptypes, i = 0; !*s || strcmp(*s, "END");
- s++, i++) {
- if (*s && !strcasecmp(*cpp, *s)) {
- ic->icmp_type = i;
- if (t != NULL)
- ic->icmp_code = atoi(t + 1);
- cpp++;
- break;
- }
- }
+ ic->icmp_type = geticmptype(AF_INET, *cpp);
+ if (t != NULL)
+ ic->icmp_code = atoi(t + 1);
+ cpp++;
+
+ if (ic->icmp_type == ICMP_ECHO ||
+ ic->icmp_type == ICMP_ECHOREPLY)
+ ic->icmp_id = htons(getpid());
if (t != NULL)
*t = ',';
}
@@ -314,6 +324,7 @@ int *out;
if (olen) {
bcopy(ipopts, (char *)(ip + 1), olen);
IP_HL_A(ip, IP_HL(ip) + (olen >> 2));
+ ip->ip_len += olen;
}
}
if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
@@ -325,3 +336,175 @@ int *out;
ip->ip_len = htons(ip->ip_len);
return 0;
}
+
+
+#ifdef USE_INET6
+int parseipv6(cpp, ip6, ifn, out)
+ char **cpp;
+ ip6_t *ip6;
+ char **ifn;
+ int *out;
+{
+ tcphdr_t th, *tcp = &th;
+ struct icmp6_hdr icmp, *ic6 = &icmp;
+
+ bzero((char *)ip6, MAX(sizeof(*tcp), sizeof(*ic6)) + sizeof(*ip6));
+ bzero((char *)tcp, sizeof(*tcp));
+ bzero((char *)ic6, sizeof(*ic6));
+ ip6->ip6_vfc = 0x60;
+
+ *out = (**cpp == 'o') ? 1 : 0;
+ cpp++;
+ if (!*cpp)
+ return 1;
+
+ if (!strcasecmp(*cpp, "on")) {
+ cpp++;
+ if (!*cpp)
+ return 1;
+ *ifn = strdup(*cpp++);
+ if (!*cpp)
+ return 1;
+ }
+
+ if (!strcasecmp(*cpp, "tcp")) {
+ ip6->ip6_nxt = IPPROTO_TCP;
+ tx_proto = "tcp";
+ cpp++;
+ } else if (!strcasecmp(*cpp, "udp")) {
+ ip6->ip6_nxt = IPPROTO_UDP;
+ tx_proto = "udp";
+ cpp++;
+ } else if (!strcasecmp(*cpp, "icmpv6")) {
+ ip6->ip6_nxt = IPPROTO_ICMPV6;
+ tx_proto = "icmpv6";
+ cpp++;
+ } else if (ISDIGIT(**cpp) && !index(*cpp, ':')) {
+ ip6->ip6_nxt = atoi(*cpp);
+ cpp++;
+ } else
+ ip6->ip6_nxt = IPPROTO_IPV6;
+
+ if (!*cpp)
+ return 1;
+
+ switch (ip6->ip6_nxt)
+ {
+ case IPPROTO_TCP :
+ ip6->ip6_plen = sizeof(struct tcphdr);
+ break;
+ case IPPROTO_UDP :
+ ip6->ip6_plen = sizeof(struct udphdr);
+ break;
+ case IPPROTO_ICMPV6 :
+ ip6->ip6_plen = ICMP6ERR_IPICMPHLEN;
+ break;
+ default :
+ break;
+ }
+
+ if (ip6->ip6_nxt == IPPROTO_TCP || ip6->ip6_nxt == IPPROTO_UDP) {
+ char *last;
+
+ last = strchr(*cpp, ',');
+ if (!last) {
+ fprintf(stderr, "tcp/udp with no source port\n");
+ return 1;
+ }
+ *last++ = '\0';
+ tcp->th_sport = htons(tx_portnum(last));
+ if (ip6->ip6_nxt == IPPROTO_TCP) {
+ tcp->th_win = htons(4096);
+ TCP_OFF_A(tcp, sizeof(*tcp) >> 2);
+ }
+ }
+
+ if (inet_pton(AF_INET6, *cpp, &ip6->ip6_src) != 1) {
+ fprintf(stderr, "cannot parse source address '%s'\n", *cpp);
+ return 1;
+ }
+
+ cpp++;
+ if (!*cpp)
+ return 1;
+
+ if (ip6->ip6_nxt == IPPROTO_TCP || ip6->ip6_nxt == IPPROTO_UDP) {
+ char *last;
+
+ last = strchr(*cpp, ',');
+ if (!last) {
+ fprintf(stderr, "tcp/udp with no destination port\n");
+ return 1;
+ }
+ *last++ = '\0';
+ tcp->th_dport = htons(tx_portnum(last));
+ }
+
+ if (inet_pton(AF_INET6, *cpp, &ip6->ip6_dst) != 1) {
+ fprintf(stderr, "cannot parse destination address '%s'\n",
+ *cpp);
+ return 1;
+ }
+
+ cpp++;
+ if (ip6->ip6_nxt == IPPROTO_TCP) {
+ if (*cpp != NULL) {
+ char *s, *t;
+
+ tcp->th_flags = 0;
+ for (s = *cpp; *s; s++)
+ if ((t = strchr(myflagset, *s)))
+ tcp->th_flags |= myflags[t-myflagset];
+ if (tcp->th_flags)
+ cpp++;
+ }
+
+ if (tcp->th_flags & TH_URG)
+ tcp->th_urp = htons(1);
+
+ if (*cpp && !strncasecmp(*cpp, "seq=", 4)) {
+ tcp->th_seq = htonl(atoi(*cpp + 4));
+ cpp++;
+ }
+
+ if (*cpp && !strncasecmp(*cpp, "ack=", 4)) {
+ tcp->th_ack = htonl(atoi(*cpp + 4));
+ cpp++;
+ }
+ } else if (*cpp && ip6->ip6_nxt == IPPROTO_ICMPV6) {
+ char *t;
+
+ t = strchr(*cpp, ',');
+ if (t != NULL)
+ *t = '\0';
+
+ ic6->icmp6_type = geticmptype(AF_INET6, *cpp);
+ if (t != NULL)
+ ic6->icmp6_code = atoi(t + 1);
+
+ if (ic6->icmp6_type == ICMP6_ECHO_REQUEST ||
+ ic6->icmp6_type == ICMP6_ECHO_REPLY)
+ ic6->icmp6_id = htons(getpid());
+
+ if (t != NULL)
+ *t = ',';
+ }
+
+ if (ip6->ip6_nxt == IPPROTO_TCP || ip6->ip6_nxt == IPPROTO_UDP) {
+ bcopy((char *)tcp, (char *)ip6 + sizeof(*ip6),
+ sizeof(*tcp));
+ } else if (ip6->ip6_nxt == IPPROTO_ICMPV6) {
+ bcopy((char *)ic6, (char *)ip6 + sizeof(*ip6),
+ sizeof(*ic6));
+ }
+
+ /*
+ * Because a length of 0 == jumbo gram...
+ */
+ if (ip6->ip6_plen == 0) {
+ ip6->ip6_plen++;
+ }
+ ip6->ip6_plen = htons(ip6->ip6_plen);
+ return 0;
+}
+#endif
diff --git a/contrib/ipfilter/lib/ipoptsec.c b/contrib/ipfilter/lib/ipoptsec.c
index 66a55c8..5e585ba 100644
--- a/contrib/ipfilter/lib/ipoptsec.c
+++ b/contrib/ipfilter/lib/ipoptsec.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2001-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: ipoptsec.c,v 1.2.4.1 2006/06/16 17:21:04 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -25,16 +25,19 @@ struct ipopt_names secclass[] = {
u_char seclevel(slevel)
-char *slevel;
+ char *slevel;
{
struct ipopt_names *so;
+ if (slevel == NULL || *slevel == '\0')
+ return 0;
+
for (so = secclass; so->on_name; so++)
if (!strcasecmp(slevel, so->on_name))
break;
if (!so->on_name) {
- fprintf(stderr, "no such security level: %s\n", slevel);
+ fprintf(stderr, "no such security level: '%s'\n", slevel);
return 0;
}
return (u_char)so->on_value;
@@ -42,7 +45,7 @@ char *slevel;
u_char secbit(class)
-int class;
+ int class;
{
struct ipopt_names *so;
@@ -51,7 +54,7 @@ int class;
break;
if (!so->on_name) {
- fprintf(stderr, "no such security class: %d\n", class);
+ fprintf(stderr, "no such security class: %d.\n", class);
return 0;
}
return (u_char)so->on_bit;
diff --git a/contrib/ipfilter/lib/kmem.c b/contrib/ipfilter/lib/kmem.c
index 26da2d0..382a51c 100644
--- a/contrib/ipfilter/lib/kmem.c
+++ b/contrib/ipfilter/lib/kmem.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -44,7 +44,7 @@
#if !defined(lint)
static const char sccsid[] = "@(#)kmem.c 1.4 1/12/96 (C) 1992 Darren Reed";
-static const char rcsid[] = "@(#)$Id: kmem.c,v 1.16.2.3 2006/06/16 17:21:04 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
@@ -70,9 +70,9 @@ kvm_t kvm_open __P((char *, char *, char *, int, char *));
int kvm_read __P((kvm_t, u_long, char *, size_t));
kvm_t kvm_open(kernel, core, swap, mode, errstr)
-char *kernel, *core, *swap;
-int mode;
-char *errstr;
+ char *kernel, *core, *swap;
+ int mode;
+ char *errstr;
{
kvm_t k;
int fd;
@@ -93,10 +93,10 @@ char *errstr;
}
int kvm_read(kvm, pos, buffer, size)
-kvm_t kvm;
-u_long pos;
-char *buffer;
-size_t size;
+ kvm_t kvm;
+ u_long pos;
+ char *buffer;
+ size_t size;
{
int r = 0, left;
char *bufp;
@@ -127,7 +127,7 @@ size_t size;
#endif /* !defined(__sgi) && !defined(__hpux) && !defined(__osf__) */
int openkmem(kern, core)
-char *kern, *core;
+ char *kern, *core;
{
kvm_f = kvm_open(kern, core, NULL, O_RDONLY, NULL);
if (kvm_f == NULL)
@@ -139,9 +139,9 @@ char *kern, *core;
}
int kmemcpy(buf, pos, n)
-register char *buf;
-long pos;
-register int n;
+ register char *buf;
+ long pos;
+ register int n;
{
register int r;
@@ -169,9 +169,9 @@ register int n;
}
int kstrncpy(buf, pos, n)
-register char *buf;
-long pos;
-register int n;
+ register char *buf;
+ long pos;
+ register int n;
{
register int r;
diff --git a/contrib/ipfilter/lib/kmem.h b/contrib/ipfilter/lib/kmem.h
index bcfde06..ce6ad56 100644
--- a/contrib/ipfilter/lib/kmem.h
+++ b/contrib/ipfilter/lib/kmem.h
@@ -1,10 +1,10 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
- * $Id: kmem.h,v 1.2.4.1 2006/06/16 17:21:04 darrenr Exp $
+ * $Id$
*/
#ifndef __KMEM_H__
diff --git a/contrib/ipfilter/lib/kmemcpywrap.c b/contrib/ipfilter/lib/kmemcpywrap.c
index 8747491..6c398d6 100644
--- a/contrib/ipfilter/lib/kmemcpywrap.c
+++ b/contrib/ipfilter/lib/kmemcpywrap.c
@@ -1,19 +1,19 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: kmemcpywrap.c,v 1.1.4.1 2006/06/16 17:21:05 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
#include "kmem.h"
int kmemcpywrap(from, to, size)
-void *from, *to;
-size_t size;
+ void *from, *to;
+ size_t size;
{
int ret;
diff --git a/contrib/ipfilter/lib/kvatoname.c b/contrib/ipfilter/lib/kvatoname.c
index c8c0d8f..65b5240 100644
--- a/contrib/ipfilter/lib/kvatoname.c
+++ b/contrib/ipfilter/lib/kvatoname.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: kvatoname.c,v 1.1.4.1 2006/06/16 17:21:05 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
@@ -14,8 +14,8 @@
#include <sys/ioctl.h>
char *kvatoname(func, iocfunc)
-ipfunc_t func;
-ioctlfunc_t iocfunc;
+ ipfunc_t func;
+ ioctlfunc_t iocfunc;
{
static char funcname[40];
ipfunc_resolve_t res;
@@ -25,7 +25,7 @@ ioctlfunc_t iocfunc;
res.ipfu_name[0] = '\0';
fd = -1;
- if ((opts & OPT_DONOTHING) == 0) {
+ if ((opts & OPT_DONTOPEN) == 0) {
fd = open(IPL_NAME, O_RDONLY);
if (fd == -1)
return NULL;
diff --git a/contrib/ipfilter/lib/load_dstlist.c b/contrib/ipfilter/lib/load_dstlist.c
new file mode 100644
index 0000000..760699d
--- /dev/null
+++ b/contrib/ipfilter/lib/load_dstlist.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: load_dstlist.c,v 1.1.2.5 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "ipf.h"
+#include "netinet/ip_lookup.h"
+#include "netinet/ip_dstlist.h"
+
+
+int
+load_dstlist(dst, iocfunc, nodes)
+ ippool_dst_t *dst;
+ ioctlfunc_t iocfunc;
+ ipf_dstnode_t *nodes;
+{
+ iplookupop_t op;
+ ipf_dstnode_t *a;
+ ippool_dst_t dest;
+
+ if (dst->ipld_name[0] == '\0')
+ return -1;
+
+ if (pool_open() == -1)
+ return -1;
+
+ op.iplo_unit = dst->ipld_unit;
+ op.iplo_type = IPLT_DSTLIST;
+ op.iplo_arg = 0;
+ strncpy(op.iplo_name, dst->ipld_name, sizeof(op.iplo_name));
+ op.iplo_size = sizeof(dest);
+ op.iplo_struct = &dest;
+ bzero((char *)&dest, sizeof(dest));
+ dest.ipld_unit = dst->ipld_unit;
+ dest.ipld_policy = dst->ipld_policy;
+ dest.ipld_flags = dst->ipld_flags;
+ strncpy(dest.ipld_name, dst->ipld_name, sizeof(dest.ipld_name));
+
+ if ((opts & OPT_REMOVE) == 0) {
+ if (pool_ioctl(iocfunc, SIOCLOOKUPADDTABLE, &op))
+ if ((opts & OPT_DONOTHING) == 0) {
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "add destination list table");
+ }
+ }
+
+ if ((opts & OPT_VERBOSE) != 0) {
+ dest.ipld_dests = dst->ipld_dests;
+ printdstlist(&dest, bcopywrap, dest.ipld_name, opts, nodes, NULL);
+ dest.ipld_dests = NULL;
+ }
+
+ for (a = nodes; a != NULL; a = a->ipfd_next)
+ load_dstlistnode(dst->ipld_unit, dest.ipld_name, a, iocfunc);
+
+ if ((opts & OPT_REMOVE) != 0) {
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op))
+ if ((opts & OPT_DONOTHING) == 0) {
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "delete destination list table");
+ }
+ }
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/load_dstlistnode.c b/contrib/ipfilter/lib/load_dstlistnode.c
new file mode 100644
index 0000000..e1ec001
--- /dev/null
+++ b/contrib/ipfilter/lib/load_dstlistnode.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: load_dstlistnode.c,v 1.1.2.5 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "ipf.h"
+#include "netinet/ip_lookup.h"
+#include "netinet/ip_pool.h"
+
+
+int
+load_dstlistnode(role, name, node, iocfunc)
+ int role;
+ char *name;
+ ipf_dstnode_t *node;
+ ioctlfunc_t iocfunc;
+{
+ iplookupop_t op;
+ frdest_t *dst;
+ char *what;
+ int err;
+
+ if (pool_open() == -1)
+ return -1;
+
+ dst = calloc(1, sizeof(*dst) + node->ipfd_dest.fd_name);
+ if (dst == NULL)
+ return -1;
+
+ op.iplo_unit = role;
+ op.iplo_type = IPLT_DSTLIST;
+ op.iplo_arg = 0;
+ op.iplo_struct = dst;
+ op.iplo_size = sizeof(*dst);
+ if (node->ipfd_dest.fd_name >= 0)
+ op.iplo_size += node->ipfd_dest.fd_name;
+ (void) strncpy(op.iplo_name, name, sizeof(op.iplo_name));
+
+ dst->fd_addr = node->ipfd_dest.fd_addr;
+ dst->fd_type = node->ipfd_dest.fd_type;
+ dst->fd_name = node->ipfd_dest.fd_name;
+ if (node->ipfd_dest.fd_name >= 0)
+ bcopy(node->ipfd_names, (char *)dst + sizeof(*dst),
+ node->ipfd_dest.fd_name);
+
+ if ((opts & OPT_REMOVE) == 0) {
+ what = "add";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPADDNODE, &op);
+ } else {
+ what = "delete";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op);
+ }
+ free(dst);
+
+ if (err != 0) {
+ if ((opts & OPT_DONOTHING) == 0) {
+ char msg[80];
+
+ (void) sprintf(msg, "%s lookup node", what);
+ return ipf_perror_fd(pool_fd(), iocfunc, msg);
+ }
+ }
+
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/load_file.c b/contrib/ipfilter/lib/load_file.c
index 9bb3899..a1d1f70 100644
--- a/contrib/ipfilter/lib/load_file.c
+++ b/contrib/ipfilter/lib/load_file.c
@@ -1,12 +1,13 @@
/*
- * Copyright (C) 2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_file.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp $
+ * $Id: load_file.c,v 1.6.2.2 2012/07/22 08:04:24 darren_r Exp $
*/
#include "ipf.h"
+#include <ctype.h>
alist_t *
load_file(char *filename)
@@ -20,13 +21,13 @@ load_file(char *filename)
if (fp == NULL) {
fprintf(stderr, "load_file cannot open '%s'\n", filename);
return NULL;
- }
+ }
a = NULL;
rtop = NULL;
rbot = NULL;
- linenum = 0;
-
+ linenum = 0;
+
while (fgets(line, sizeof(line) - 1, fp)) {
line[sizeof(line) - 1] = '\0';
linenum++;
@@ -35,17 +36,23 @@ load_file(char *filename)
*/
s = strchr(line, '\n');
if (s == NULL) {
- fprintf(stderr, "%d:%s: line too long\n", linenum, filename);
+ fprintf(stderr, "%d:%s: line too long\n",
+ linenum, filename);
fclose(fp);
alist_free(rtop);
return NULL;
}
- *s = '\0';
+ /*
+ * Remove trailing spaces
+ */
+ for (; ISSPACE(*s); s--)
+ *s = '\0';
+
s = strchr(line, '\r');
if (s != NULL)
*s = '\0';
- for (t = line; isspace(*t); t++)
+ for (t = line; ISSPACE(*t); t++)
;
if (*t == '!') {
not = 1;
@@ -56,21 +63,22 @@ load_file(char *filename)
/*
* Remove comment markers
*/
- for (s = t; *s; s++) {
- if (*s == '#')
- *s = '\0';
+ s = strchr(t, '#');
+ if (s != NULL) {
+ *s = '\0';
+ if (s == t)
+ continue;
}
- if (!*t)
- continue;
+
/*
* Trim off tailing white spaces
*/
s = strlen(t) + t - 1;
- while (isspace(*s))
+ while (ISSPACE(*s))
*s-- = '\0';
- if (isdigit(*t)) {
- a = alist_new(4, t);
+ a = alist_new(AF_UNSPEC, t);
+ if (a != NULL) {
a->al_not = not;
if (rbot != NULL)
rbot->al_next = a;
@@ -78,8 +86,8 @@ load_file(char *filename)
rtop = a;
rbot = a;
} else {
- fprintf(stderr, "%s: unrecognised content line %d\n",
- filename, linenum);
+ fprintf(stderr, "%s:%d unrecognised content :%s\n",
+ filename, linenum, t);
}
}
fclose(fp);
diff --git a/contrib/ipfilter/lib/load_hash.c b/contrib/ipfilter/lib/load_hash.c
index 7683470..7ec79a9 100644
--- a/contrib/ipfilter/lib/load_hash.c
+++ b/contrib/ipfilter/lib/load_hash.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_hash.c,v 1.11.2.5 2006/07/14 06:12:25 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,13 +14,12 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_htable.h"
-static int hashfd = -1;
-
-int load_hash(iphp, list, iocfunc)
-iphtable_t *iphp;
-iphtent_t *list;
-ioctlfunc_t iocfunc;
+int
+load_hash(iphp, list, iocfunc)
+ iphtable_t *iphp;
+ iphtent_t *list;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
iphtable_t iph;
@@ -28,14 +27,13 @@ ioctlfunc_t iocfunc;
size_t size;
int n;
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
- hashfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
for (n = 0, a = list; a != NULL; a = a->ipe_next)
n++;
+ bzero((char *)&iph, sizeof(iph));
op.iplo_arg = 0;
op.iplo_type = IPLT_HASH;
op.iplo_unit = iphp->iph_unit;
@@ -44,10 +42,7 @@ ioctlfunc_t iocfunc;
op.iplo_arg = IPHASH_ANON;
op.iplo_size = sizeof(iph);
op.iplo_struct = &iph;
- iph.iph_unit = iphp->iph_unit;
- iph.iph_type = iphp->iph_type;
- strncpy(iph.iph_name, iphp->iph_name, sizeof(iph.iph_name));
- iph.iph_flags = iphp->iph_flags;
+ iph = *iphp;
if (n <= 0)
n = 1;
if (iphp->iph_size == 0)
@@ -60,16 +55,15 @@ ioctlfunc_t iocfunc;
iphp->iph_name, "size to match expected use");
}
iph.iph_size = size;
- iph.iph_seed = iphp->iph_seed;
iph.iph_table = NULL;
iph.iph_list = NULL;
iph.iph_ref = 0;
if ((opts & OPT_REMOVE) == 0) {
- if ((*iocfunc)(hashfd, SIOCLOOKUPADDTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPADDTABLE, &op))
if ((opts & OPT_DONOTHING) == 0) {
- perror("load_hash:SIOCLOOKUPADDTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "add lookup hash table");
}
}
@@ -77,19 +71,14 @@ ioctlfunc_t iocfunc;
strncpy(iphp->iph_name, op.iplo_name, sizeof(op.iplo_name));
if (opts & OPT_VERBOSE) {
- for (a = list; a != NULL; a = a->ipe_next) {
- a->ipe_addr.in4_addr = ntohl(a->ipe_addr.in4_addr);
- a->ipe_mask.in4_addr = ntohl(a->ipe_mask.in4_addr);
- }
iph.iph_table = calloc(size, sizeof(*iph.iph_table));
if (iph.iph_table == NULL) {
perror("calloc(size, sizeof(*iph.iph_table))");
return -1;
}
iph.iph_list = list;
- printhash(&iph, bcopywrap, iph.iph_name, opts);
+ printhash(&iph, bcopywrap, iph.iph_name, opts, NULL);
free(iph.iph_table);
- iph.iph_list = NULL;
for (a = list; a != NULL; a = a->ipe_next) {
a->ipe_addr.in4_addr = htonl(a->ipe_addr.in4_addr);
@@ -101,13 +90,13 @@ ioctlfunc_t iocfunc;
printf("Hash %s:\n", iph.iph_name);
for (a = list; a != NULL; a = a->ipe_next)
- load_hashnode(iphp->iph_unit, iph.iph_name, a, iocfunc);
+ load_hashnode(iphp->iph_unit, iph.iph_name, a, 0, iocfunc);
if ((opts & OPT_REMOVE) != 0) {
- if ((*iocfunc)(hashfd, SIOCLOOKUPDELTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op))
if ((opts & OPT_DONOTHING) == 0) {
- perror("load_hash:SIOCLOOKUPDELTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "delete lookup hash table");
}
}
return 0;
diff --git a/contrib/ipfilter/lib/load_hashnode.c b/contrib/ipfilter/lib/load_hashnode.c
index 3c3416d..2aac433 100644
--- a/contrib/ipfilter/lib/load_hashnode.c
+++ b/contrib/ipfilter/lib/load_hashnode.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_hashnode.c,v 1.2.4.2 2006/06/16 17:21:05 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,22 +14,21 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_htable.h"
-static int hashfd = -1;
-
-int load_hashnode(unit, name, node, iocfunc)
-int unit;
-char *name;
-iphtent_t *node;
-ioctlfunc_t iocfunc;
+int
+load_hashnode(unit, name, node, ttl, iocfunc)
+ int unit;
+ char *name;
+ iphtent_t *node;
+ int ttl;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
iphtent_t ipe;
+ char *what;
int err;
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
- hashfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_type = IPLT_HASH;
@@ -40,6 +39,8 @@ ioctlfunc_t iocfunc;
strncpy(op.iplo_name, name, sizeof(op.iplo_name));
bzero((char *)&ipe, sizeof(ipe));
+ ipe.ipe_family = node->ipe_family;
+ ipe.ipe_die = ttl;
bcopy((char *)&node->ipe_addr, (char *)&ipe.ipe_addr,
sizeof(ipe.ipe_addr));
bcopy((char *)&node->ipe_mask, (char *)&ipe.ipe_mask,
@@ -47,15 +48,20 @@ ioctlfunc_t iocfunc;
bcopy((char *)&node->ipe_group, (char *)&ipe.ipe_group,
sizeof(ipe.ipe_group));
- if ((opts & OPT_REMOVE) == 0)
- err = (*iocfunc)(hashfd, SIOCLOOKUPADDNODE, &op);
- else
- err = (*iocfunc)(hashfd, SIOCLOOKUPDELNODE, &op);
+ if ((opts & OPT_REMOVE) == 0) {
+ what = "add";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPADDNODE, &op);
+ } else {
+ what = "delete";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op);
+ }
if (err != 0)
if (!(opts & OPT_DONOTHING)) {
- perror("load_hash:SIOCLOOKUP*NODE");
- return -1;
+ char msg[80];
+
+ sprintf(msg, "%s node from lookup hash table", what);
+ return ipf_perror_fd(pool_fd(), iocfunc, msg);
}
return 0;
}
diff --git a/contrib/ipfilter/lib/load_http.c b/contrib/ipfilter/lib/load_http.c
index 38d0b67..88fc1e3 100644
--- a/contrib/ipfilter/lib/load_http.c
+++ b/contrib/ipfilter/lib/load_http.c
@@ -1,12 +1,28 @@
+/* $FreeBSD$ */
+
/*
- * Copyright (C) 2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_http.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp $
+ * $Id: load_http.c,v 1.5.2.5 2012/07/22 08:04:24 darren_r Exp $
*/
#include "ipf.h"
+#include <ctype.h>
+
+/*
+ * Because the URL can be included twice into the buffer, once as the
+ * full path for the "GET" and once as the "Host:", the buffer it is
+ * put in needs to be larger than 512*2 to make room for the supporting
+ * text. Why not just use snprintf and truncate? The warning about the
+ * URL being too long tells you something is wrong and does not fetch
+ * any data - just truncating the URL (with snprintf, etc) and sending
+ * that to the server is allowing an unknown and unintentioned action
+ * to happen.
+ */
+#define MAX_URL_LEN 512
+#define LOAD_BUFSIZE (MAX_URL_LEN * 2 + 128)
/*
* Format expected is one addres per line, at the start of each line.
@@ -14,19 +30,18 @@
alist_t *
load_http(char *url)
{
- char *s, *t, *u, buffer[1044], *myurl;
+ int fd, len, left, port, endhdr, removed, linenum = 0;
+ char *s, *t, *u, buffer[LOAD_BUFSIZE], *myurl;
alist_t *a, *rtop, *rbot;
- struct sockaddr_in sin;
- struct hostent *host;
size_t avail;
- int fd, len, left, port, endhdr, removed;
int error;
/*
* More than this would just be absurd.
*/
- if (strlen(url) > 512) {
- fprintf(stderr, "load_http has a URL > 512 bytes?!\n");
+ if (strlen(url) > MAX_URL_LEN) {
+ fprintf(stderr, "load_http has a URL > %d bytes?!\n",
+ MAX_URL_LEN);
return NULL;
}
@@ -56,6 +71,15 @@ load_http(char *url)
}
*t++ = '\0';
+ /*
+ * 10 is the length of 'Host: \r\n\r\n' below.
+ */
+ if (strlen(s) + strlen(buffer) + 10 > sizeof(buffer)) {
+ fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
+ free(myurl);
+ return NULL;
+ }
+
u = strchr(s, '@');
if (u != NULL)
s = u + 1; /* AUTH */
@@ -76,28 +100,11 @@ load_http(char *url)
port = 80;
}
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
-
- if (isdigit(*s)) {
- if (inet_aton(s, &sin.sin_addr) == -1) {
- goto done;
- }
- } else {
- host = gethostbyname(s);
- if (host == NULL)
- goto done;
- memcpy(&sin.sin_addr, host->h_addr_list[0],
- sizeof(sin.sin_addr));
- }
- fd = socket(AF_INET, SOCK_STREAM, 0);
+ fd = connecttcp(s, port);
if (fd == -1)
goto done;
- if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
- goto done;
len = strlen(buffer);
if (write(fd, buffer, len) != len)
@@ -150,30 +157,40 @@ load_http(char *url)
if (t == NULL)
break;
- *t++ = '\0';
- for (u = buffer; isdigit(*u) || (*u == '.'); u++)
- ;
- if (*u == '/') {
- char *slash;
-
- slash = u;
- u++;
- while (isdigit(*u))
- u++;
- if (!isspace(*u) && *u)
- u = slash;
+ linenum++;
+ *t = '\0';
+
+ /*
+ * Remove comment and continue to the next line if
+ * the comment is at the start of the line.
+ */
+ u = strchr(buffer, '#');
+ if (u != NULL) {
+ *u = '\0';
+ if (u == buffer)
+ continue;
}
- *u = '\0';
- a = alist_new(4, buffer);
+ /*
+ * Trim off tailing white spaces, will include \r
+ */
+ for (u = t - 1; (u >= buffer) && ISSPACE(*u); u--)
+ *u = '\0';
+
+ a = alist_new(AF_UNSPEC, buffer);
if (a != NULL) {
if (rbot != NULL)
rbot->al_next = a;
else
rtop = a;
rbot = a;
+ } else {
+ fprintf(stderr,
+ "%s:%d unrecognised content:%s\n",
+ url, linenum, buffer);
}
+ t++;
removed = t - buffer;
memmove(buffer, t, sizeof(buffer) - left - removed);
s -= removed;
diff --git a/contrib/ipfilter/lib/load_pool.c b/contrib/ipfilter/lib/load_pool.c
index 08baae7..190a2df 100644
--- a/contrib/ipfilter/lib/load_pool.c
+++ b/contrib/ipfilter/lib/load_pool.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_pool.c,v 1.14.2.4 2006/06/16 17:21:06 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,20 +14,17 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_pool.h"
-static int poolfd = -1;
-
-int load_pool(plp, iocfunc)
-ip_pool_t *plp;
-ioctlfunc_t iocfunc;
+int
+load_pool(plp, iocfunc)
+ ip_pool_t *plp;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
ip_pool_node_t *a;
ip_pool_t pool;
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
- poolfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_unit = plp->ipo_unit;
@@ -37,16 +34,18 @@ ioctlfunc_t iocfunc;
op.iplo_size = sizeof(pool);
op.iplo_struct = &pool;
bzero((char *)&pool, sizeof(pool));
+ pool.ipo_unit = plp->ipo_unit;
strncpy(pool.ipo_name, plp->ipo_name, sizeof(pool.ipo_name));
if (plp->ipo_name[0] == '\0')
op.iplo_arg |= IPOOL_ANON;
if ((opts & OPT_REMOVE) == 0) {
- if ((*iocfunc)(poolfd, SIOCLOOKUPADDTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPADDTABLE, &op)) {
if ((opts & OPT_DONOTHING) == 0) {
- perror("load_pool:SIOCLOOKUPADDTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "add lookup table");
}
+ }
}
if (op.iplo_arg & IPOOL_ANON)
@@ -54,18 +53,19 @@ ioctlfunc_t iocfunc;
if ((opts & OPT_VERBOSE) != 0) {
pool.ipo_list = plp->ipo_list;
- printpool(&pool, bcopywrap, pool.ipo_name, opts);
+ (void) printpool(&pool, bcopywrap, pool.ipo_name, opts, NULL);
pool.ipo_list = NULL;
}
for (a = plp->ipo_list; a != NULL; a = a->ipn_next)
- load_poolnode(plp->ipo_unit, pool.ipo_name, a, iocfunc);
+ load_poolnode(plp->ipo_unit, pool.ipo_name,
+ a, 0, iocfunc);
if ((opts & OPT_REMOVE) != 0) {
- if ((*iocfunc)(poolfd, SIOCLOOKUPDELTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op))
if ((opts & OPT_DONOTHING) == 0) {
- perror("load_pool:SIOCLOOKUPDELTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "delete lookup table");
}
}
return 0;
diff --git a/contrib/ipfilter/lib/load_poolnode.c b/contrib/ipfilter/lib/load_poolnode.c
index 110a8b9..5afca84 100644
--- a/contrib/ipfilter/lib/load_poolnode.c
+++ b/contrib/ipfilter/lib/load_poolnode.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_poolnode.c,v 1.3.2.3 2006/06/16 17:21:06 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,22 +14,21 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_pool.h"
-static int poolfd = -1;
-
-int load_poolnode(role, name, node, iocfunc)
-int role;
-char *name;
-ip_pool_node_t *node;
-ioctlfunc_t iocfunc;
+int
+load_poolnode(role, name, node, ttl, iocfunc)
+ int role;
+ char *name;
+ ip_pool_node_t *node;
+ int ttl;
+ ioctlfunc_t iocfunc;
{
ip_pool_node_t pn;
iplookupop_t op;
+ char *what;
int err;
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
- poolfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_unit = role;
@@ -45,17 +44,25 @@ ioctlfunc_t iocfunc;
bcopy((char *)&node->ipn_mask, (char *)&pn.ipn_mask,
sizeof(pn.ipn_mask));
pn.ipn_info = node->ipn_info;
+ pn.ipn_die = ttl;
strncpy(pn.ipn_name, node->ipn_name, sizeof(pn.ipn_name));
- if ((opts & OPT_REMOVE) == 0)
- err = (*iocfunc)(poolfd, SIOCLOOKUPADDNODE, &op);
- else
- err = (*iocfunc)(poolfd, SIOCLOOKUPDELNODE, &op);
+ if ((opts & OPT_REMOVE) == 0) {
+ what = "add";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPADDNODE, &op);
+ } else {
+ what = "delete";
+ err = pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op);
+ }
if (err != 0) {
if ((opts & OPT_DONOTHING) == 0) {
- perror("load_poolnode:SIOCLOOKUP*NODE");
- return -1;
+ char msg[80];
+
+ sprintf(msg, "%s pool node(%s/", what,
+ inet_ntoa(pn.ipn_addr.adf_addr.in4));
+ strcat(msg, inet_ntoa(pn.ipn_mask.adf_addr.in4));
+ return ipf_perror_fd(pool_fd(), iocfunc, msg);
}
}
diff --git a/contrib/ipfilter/lib/load_url.c b/contrib/ipfilter/lib/load_url.c
index 7709153..dcda4c0 100644
--- a/contrib/ipfilter/lib/load_url.c
+++ b/contrib/ipfilter/lib/load_url.c
@@ -1,9 +1,9 @@
/*
- * Copyright (C) 2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: load_url.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp $
+ * $Id: load_url.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
*/
#include "ipf.h"
@@ -13,11 +13,11 @@ load_url(char *url)
{
alist_t *hosts = NULL;
- if (strncmp(url, "file://", 7) == 0) {
- /*
+ if (strncmp(url, "file://", 7) == 0) {
+ /*
* file:///etc/passwd
* ^------------s
- */
+ */
hosts = load_file(url);
} else if (*url == '/' || *url == '.') {
@@ -27,5 +27,5 @@ load_url(char *url)
hosts = load_http(url);
}
- return hosts;
+ return hosts;
}
diff --git a/contrib/ipfilter/lib/mb_hexdump.c b/contrib/ipfilter/lib/mb_hexdump.c
new file mode 100644
index 0000000..6da6563
--- /dev/null
+++ b/contrib/ipfilter/lib/mb_hexdump.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: mb_hexdump.c,v 1.1.2.3 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+void
+mb_hexdump(m, fp)
+ mb_t *m;
+ FILE *fp;
+{
+ u_char *s;
+ int len;
+ int i;
+
+ for (; m != NULL; m = m->mb_next) {
+ len = m->mb_len;
+ for (s = (u_char *)m->mb_data, i = 0; i < len; i++) {
+ fprintf(fp, "%02x", *s++ & 0xff);
+ if (len - i > 1) {
+ i++;
+ fprintf(fp, "%02x", *s++ & 0xff);
+ }
+ fputc(' ', fp);
+ }
+ }
+ fputc('\n', fp);
+}
diff --git a/contrib/ipfilter/lib/msgdsize.c b/contrib/ipfilter/lib/msgdsize.c
new file mode 100644
index 0000000..9bdc584
--- /dev/null
+++ b/contrib/ipfilter/lib/msgdsize.c
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: msgdsize.c,v 1.2.4.3 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+size_t msgdsize(orig)
+ mb_t *orig;
+{
+ size_t sz = 0;
+ mb_t *m;
+
+ for (m = orig; m != NULL; m = m->mb_next)
+ sz += m->mb_len;
+ return sz;
+}
diff --git a/contrib/ipfilter/lib/mutex_emul.c b/contrib/ipfilter/lib/mutex_emul.c
index 3983f04..1846701 100644
--- a/contrib/ipfilter/lib/mutex_emul.c
+++ b/contrib/ipfilter/lib/mutex_emul.c
@@ -1,22 +1,30 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: mutex_emul.c,v 1.2.4.1 2006/06/16 17:21:06 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
#define EMM_MAGIC 0x9d7adba3
-void eMmutex_enter(mtx, file, line)
-eMmutex_t *mtx;
-char *file;
-int line;
+static int mutex_debug = 0;
+static FILE *mutex_file = NULL;
+static int initcount = 0;
+
+void
+eMmutex_enter(mtx, file, line)
+ eMmutex_t *mtx;
+ char *file;
+ int line;
{
+ if (mutex_debug & 2)
+ fprintf(mutex_file, "%s:%d:eMmutex_enter(%s)\n", file, line,
+ mtx->eMm_owner);
if (mtx->eMm_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n",
mtx->eMm_owner, mtx, mtx->eMm_magic);
@@ -33,9 +41,15 @@ int line;
}
-void eMmutex_exit(mtx)
-eMmutex_t *mtx;
+void
+eMmutex_exit(mtx, file, line)
+ eMmutex_t *mtx;
+ char *file;
+ int line;
{
+ if (mutex_debug & 2)
+ fprintf(mutex_file, "%s:%d:eMmutex_exit(%s)\n", file, line,
+ mtx->eMm_owner);
if (mtx->eMm_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n",
mtx->eMm_owner, mtx, mtx->eMm_magic);
@@ -52,10 +66,18 @@ eMmutex_t *mtx;
}
-void eMmutex_init(mtx, who)
-eMmutex_t *mtx;
-char *who;
+void
+eMmutex_init(mtx, who, file, line)
+ eMmutex_t *mtx;
+ char *who;
+ char *file;
+ int line;
{
+ if (mutex_file == NULL && mutex_debug)
+ mutex_file = fopen("ipf_mutex_log", "w");
+ if (mutex_debug & 1)
+ fprintf(mutex_file, "%s:%d:eMmutex_init(%p,%s)\n",
+ file, line, mtx, who);
if (mtx->eMm_magic == EMM_MAGIC) { /* safe bet ? */
fprintf(stderr,
"%s:eMmutex_init(%p): already initialised?: %#x\n",
@@ -68,21 +90,44 @@ char *who;
mtx->eMm_owner = strdup(who);
else
mtx->eMm_owner = NULL;
+ initcount++;
}
-void eMmutex_destroy(mtx)
-eMmutex_t *mtx;
+void
+eMmutex_destroy(mtx, file, line)
+ eMmutex_t *mtx;
+ char *file;
+ int line;
{
+ if (mutex_debug & 1)
+ fprintf(mutex_file,
+ "%s:%d:eMmutex_destroy(%p,%s)\n", file, line,
+ mtx, mtx->eMm_owner);
if (mtx->eMm_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n",
mtx->eMm_owner, mtx, mtx->eMm_magic);
abort();
}
if (mtx->eMm_held != 0) {
- fprintf(stderr, "%s:eMmutex_enter(%p): still locked: %d\n",
+ fprintf(stderr,
+ "%s:eMmutex_enter(%p): still locked: %d\n",
mtx->eMm_owner, mtx, mtx->eMm_held);
abort();
}
+ if (mtx->eMm_owner != NULL)
+ free(mtx->eMm_owner);
memset(mtx, 0xa5, sizeof(*mtx));
+ initcount--;
+}
+
+
+void
+ipf_mutex_clean()
+{
+ if (initcount != 0) {
+ if (mutex_file)
+ fprintf(mutex_file, "initcount %d\n", initcount);
+ abort();
+ }
}
diff --git a/contrib/ipfilter/lib/nametokva.c b/contrib/ipfilter/lib/nametokva.c
index deee439..8e7af94 100644
--- a/contrib/ipfilter/lib/nametokva.c
+++ b/contrib/ipfilter/lib/nametokva.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: nametokva.c,v 1.1.4.1 2006/06/16 17:21:07 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
@@ -14,8 +14,8 @@
#include <fcntl.h>
ipfunc_t nametokva(name, iocfunc)
-char *name;
-ioctlfunc_t iocfunc;
+ char *name;
+ ioctlfunc_t iocfunc;
{
ipfunc_resolve_t res;
int fd;
@@ -24,7 +24,7 @@ ioctlfunc_t iocfunc;
res.ipfu_addr = NULL;
fd = -1;
- if ((opts & OPT_DONOTHING) == 0) {
+ if ((opts & OPT_DONTOPEN) == 0) {
fd = open(IPL_NAME, O_RDONLY);
if (fd == -1)
return NULL;
diff --git a/contrib/ipfilter/lib/nat_setgroupmap.c b/contrib/ipfilter/lib/nat_setgroupmap.c
index 08b1a0a..15c21f6 100644
--- a/contrib/ipfilter/lib/nat_setgroupmap.c
+++ b/contrib/ipfilter/lib/nat_setgroupmap.c
@@ -1,33 +1,33 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: nat_setgroupmap.c,v 1.1.4.1 2006/06/16 17:21:07 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
#include "ipf.h"
void nat_setgroupmap(n)
-ipnat_t *n;
+ ipnat_t *n;
{
- if (n->in_outmsk == n->in_inmsk)
+ if (n->in_nsrcmsk == n->in_osrcmsk)
n->in_ippip = 1;
else if (n->in_flags & IPN_AUTOPORTMAP) {
- n->in_ippip = ~ntohl(n->in_inmsk);
- if (n->in_outmsk != 0xffffffff)
- n->in_ippip /= (~ntohl(n->in_outmsk) + 1);
+ n->in_ippip = ~ntohl(n->in_osrcmsk);
+ if (n->in_nsrcmsk != 0xffffffff)
+ n->in_ippip /= (~ntohl(n->in_nsrcmsk) + 1);
n->in_ippip++;
if (n->in_ippip == 0)
n->in_ippip = 1;
n->in_ppip = USABLE_PORTS / n->in_ippip;
} else {
- n->in_space = USABLE_PORTS * ~ntohl(n->in_outmsk);
- n->in_nip = 0;
- if (!(n->in_ppip = n->in_pmin))
+ n->in_space = USABLE_PORTS * ~ntohl(n->in_nsrcmsk);
+ n->in_snip = 0;
+ if (!(n->in_ppip = n->in_spmin))
n->in_ppip = 1;
n->in_ippip = USABLE_PORTS / n->in_ppip;
}
diff --git a/contrib/ipfilter/lib/ntomask.c b/contrib/ipfilter/lib/ntomask.c
index ba91a65..98e3b26 100644
--- a/contrib/ipfilter/lib/ntomask.c
+++ b/contrib/ipfilter/lib/ntomask.c
@@ -1,28 +1,28 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: ntomask.c,v 1.6.2.1 2006/06/16 17:21:07 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
-int ntomask(v, nbits, ap)
-int v, nbits;
-u_32_t *ap;
+int ntomask(family, nbits, ap)
+ int family, nbits;
+ u_32_t *ap;
{
u_32_t mask;
if (nbits < 0)
return -1;
- switch (v)
+ switch (family)
{
- case 4 :
- if (nbits > 32 || use_inet6 != 0)
+ case AF_INET :
+ if (nbits > 32 || use_inet6 == 1)
return -1;
if (nbits == 0) {
mask = 0;
@@ -33,8 +33,9 @@ u_32_t *ap;
*ap = htonl(mask);
break;
- case 6 :
- if ((nbits > 128) || (use_inet6 == 0))
+ case 0 :
+ case AF_INET6 :
+ if ((nbits > 128) || (use_inet6 == -1))
return -1;
fill6bits(nbits, ap);
break;
diff --git a/contrib/ipfilter/lib/optname.c b/contrib/ipfilter/lib/optname.c
index f41cab1..2bc811b 100644
--- a/contrib/ipfilter/lib/optname.c
+++ b/contrib/ipfilter/lib/optname.c
@@ -1,20 +1,20 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2001 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: optname.c,v 1.3.4.1 2006/06/16 17:21:07 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
u_32_t optname(cp, sp, linenum)
-char ***cp;
-u_short *sp;
-int linenum;
+ char ***cp;
+ u_short *sp;
+ int linenum;
{
struct ipopt_names *io, *so;
u_long msk = 0;
diff --git a/contrib/ipfilter/lib/optprint.c b/contrib/ipfilter/lib/optprint.c
index 81a3287..8b1f5cd 100644
--- a/contrib/ipfilter/lib/optprint.c
+++ b/contrib/ipfilter/lib/optprint.c
@@ -1,18 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: optprint.c,v 1.6.4.2 2006/06/16 17:21:08 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
void optprint(sec, optmsk, optbits)
-u_short *sec;
-u_long optmsk, optbits;
+ u_short *sec;
+ u_long optmsk, optbits;
{
u_short secmsk = sec[0], secbits = sec[1];
struct ipopt_names *io, *so;
diff --git a/contrib/ipfilter/lib/optprintv6.c b/contrib/ipfilter/lib/optprintv6.c
index f6ea6ec..752d1b3 100644
--- a/contrib/ipfilter/lib/optprintv6.c
+++ b/contrib/ipfilter/lib/optprintv6.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: optprintv6.c,v 1.2.4.1 2006/06/16 17:21:08 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -13,14 +13,14 @@
#ifdef USE_INET6
void optprintv6(sec, optmsk, optbits)
-u_short *sec;
-u_long optmsk, optbits;
+ u_short *sec;
+ u_long optmsk, optbits;
{
u_short secmsk = sec[0], secbits = sec[1];
struct ipopt_names *io;
char *s;
- s = " v6hdrs ";
+ s = " v6hdr ";
for (io = v6ionames; io->on_name; io++)
if ((io->on_bit & optmsk) &&
((io->on_bit & optmsk) == (io->on_bit & optbits))) {
diff --git a/contrib/ipfilter/lib/optvalue.c b/contrib/ipfilter/lib/optvalue.c
index aa1ef2e..5bc1f42 100644
--- a/contrib/ipfilter/lib/optvalue.c
+++ b/contrib/ipfilter/lib/optvalue.c
@@ -1,17 +1,17 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2001-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: optvalue.c,v 1.2.4.1 2006/06/16 17:21:08 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
u_32_t getoptbyname(optname)
-char *optname;
+ char *optname;
{
struct ipopt_names *io;
@@ -23,7 +23,7 @@ char *optname;
u_32_t getoptbyvalue(optval)
-int optval;
+ int optval;
{
struct ipopt_names *io;
diff --git a/contrib/ipfilter/lib/parsefields.c b/contrib/ipfilter/lib/parsefields.c
new file mode 100644
index 0000000..241496c
--- /dev/null
+++ b/contrib/ipfilter/lib/parsefields.c
@@ -0,0 +1,48 @@
+#include "ipf.h"
+
+extern int nohdrfields;
+
+wordtab_t *parsefields(table, arg)
+ wordtab_t *table;
+ char *arg;
+{
+ wordtab_t *f, *fields;
+ char *s, *t;
+ int num;
+
+ fields = NULL;
+ num = 0;
+
+ for (s = strtok(arg, ","); s != NULL; s = strtok(NULL, ",")) {
+ t = strchr(s, '=');
+ if (t != NULL) {
+ *t++ = '\0';
+ if (*t == '\0')
+ nohdrfields = 1;
+ }
+
+ f = findword(table, s);
+ if (f == NULL) {
+ fprintf(stderr, "Unknown field '%s'\n", s);
+ exit(1);
+ }
+
+ num++;
+ if (fields == NULL) {
+ fields = malloc(2 * sizeof(*fields));
+ } else {
+ fields = realloc(fields, (num + 1) * sizeof(*fields));
+ }
+
+ if (t == NULL) {
+ fields[num - 1].w_word = f->w_word;
+ } else {
+ fields[num - 1].w_word = t;
+ }
+ fields[num - 1].w_value = f->w_value;
+ fields[num].w_word = NULL;
+ fields[num].w_value = 0;
+ }
+
+ return fields;
+}
diff --git a/contrib/ipfilter/lib/parseipfexpr.c b/contrib/ipfilter/lib/parseipfexpr.c
new file mode 100644
index 0000000..9a2a207
--- /dev/null
+++ b/contrib/ipfilter/lib/parseipfexpr.c
@@ -0,0 +1,283 @@
+#include "ipf.h"
+#include <ctype.h>
+
+
+typedef struct ipfopentry {
+ int ipoe_cmd;
+ int ipoe_nbasearg;
+ int ipoe_maxarg;
+ int ipoe_argsize;
+ char *ipoe_word;
+} ipfopentry_t;
+
+static ipfopentry_t opwords[17] = {
+ { IPF_EXP_IP_ADDR, 2, 0, 1, "ip.addr" },
+ { IPF_EXP_IP6_ADDR, 2, 0, 4, "ip6.addr" },
+ { IPF_EXP_IP_PR, 1, 0, 1, "ip.p" },
+ { IPF_EXP_IP_SRCADDR, 2, 0, 1, "ip.src" },
+ { IPF_EXP_IP_DSTADDR, 2, 0, 1, "ip.dst" },
+ { IPF_EXP_IP6_SRCADDR, 2, 0, 4, "ip6.src" },
+ { IPF_EXP_IP6_DSTADDR, 2, 0, 4, "ip6.dst" },
+ { IPF_EXP_TCP_PORT, 1, 0, 1, "tcp.port" },
+ { IPF_EXP_TCP_DPORT, 1, 0, 1, "tcp.dport" },
+ { IPF_EXP_TCP_SPORT, 1, 0, 1, "tcp.sport" },
+ { IPF_EXP_TCP_FLAGS, 2, 0, 1, "tcp.flags" },
+ { IPF_EXP_UDP_PORT, 1, 0, 1, "udp.port" },
+ { IPF_EXP_UDP_DPORT, 1, 0, 1, "udp.dport" },
+ { IPF_EXP_UDP_SPORT, 1, 0, 1, "udp.sport" },
+ { IPF_EXP_TCP_STATE, 1, 0, 1, "tcp.state" },
+ { IPF_EXP_IDLE_GT, 1, 1, 1, "idle-gt" },
+ { -1, 0, 0, 0, NULL }
+};
+
+
+int *
+parseipfexpr(line, errorptr)
+ char *line;
+ char **errorptr;
+{
+ int not, items, asize, *oplist, osize, i;
+ char *temp, *arg, *s, *t, *ops, *error;
+ ipfopentry_t *e;
+ ipfexp_t *ipfe;
+
+ asize = 0;
+ error = NULL;
+ oplist = NULL;
+
+ temp = strdup(line);
+ if (temp == NULL) {
+ error = "strdup failed";
+ goto parseerror;
+ }
+
+ /*
+ * Eliminate any white spaces to make parsing easier.
+ */
+ for (s = temp; *s != '\0'; ) {
+ if (ISSPACE(*s))
+ strcpy(s, s + 1);
+ else
+ s++;
+ }
+
+ /*
+ * Parse the string.
+ * It should be sets of "ip.dst=1.2.3.4/32;" things.
+ * There must be a "=" or "!=" and it must end in ";".
+ */
+ if (temp[strlen(temp) - 1] != ';') {
+ error = "last character not ';'";
+ goto parseerror;
+ }
+
+ /*
+ * Work through the list of complete operands present.
+ */
+ for (ops = strtok(temp, ";"); ops != NULL; ops = strtok(NULL, ";")) {
+ arg = strchr(ops, '=');
+ if ((arg < ops + 2) || (arg == NULL)) {
+ error = "bad 'arg' vlaue";
+ goto parseerror;
+ }
+
+ if (*(arg - 1) == '!') {
+ *(arg - 1) = '\0';
+ not = 1;
+ } else {
+ not = 0;
+ }
+ *arg++ = '\0';
+
+
+ for (e = opwords; e->ipoe_word; e++) {
+ if (strcmp(ops, e->ipoe_word) == 0)
+ break;
+ }
+ if (e->ipoe_word == NULL) {
+ error = malloc(32);
+ if (error != NULL) {
+ sprintf(error, "keyword (%.10s) not found",
+ ops);
+ }
+ goto parseerror;
+ }
+
+ /*
+ * Count the number of commas so we know how big to
+ * build the array
+ */
+ for (s = arg, items = 1; *s != '\0'; s++)
+ if (*s == ',')
+ items++;
+
+ if ((e->ipoe_maxarg != 0) && (items > e->ipoe_maxarg)) {
+ error = "too many items";
+ goto parseerror;
+ }
+
+ /*
+ * osize will mark the end of where we have filled up to
+ * and is thus where we start putting new data.
+ */
+ osize = asize;
+ asize += 4 + (items * e->ipoe_nbasearg * e->ipoe_argsize);
+ if (oplist == NULL)
+ oplist = calloc(1, sizeof(int) * (asize + 2));
+ else
+ oplist = realloc(oplist, sizeof(int) * (asize + 2));
+ if (oplist == NULL) {
+ error = "oplist alloc failed";
+ goto parseerror;
+ }
+ ipfe = (ipfexp_t *)(oplist + osize);
+ osize += 4;
+ ipfe->ipfe_cmd = e->ipoe_cmd;
+ ipfe->ipfe_not = not;
+ ipfe->ipfe_narg = items * e->ipoe_nbasearg;
+ ipfe->ipfe_size = items * e->ipoe_nbasearg * e->ipoe_argsize;
+ ipfe->ipfe_size += 4;
+
+ for (s = arg; (*s != '\0') && (osize < asize); s = t) {
+ /*
+ * Look for the end of this arg or the ',' to say
+ * there is another following.
+ */
+ for (t = s; (*t != '\0') && (*t != ','); t++)
+ ;
+ if (*t == ',')
+ *t++ = '\0';
+
+ if (!strcasecmp(ops, "ip.addr") ||
+ !strcasecmp(ops, "ip.src") ||
+ !strcasecmp(ops, "ip.dst")) {
+ i6addr_t mask, addr;
+ char *delim;
+
+ delim = strchr(s, '/');
+ if (delim != NULL) {
+ *delim++ = '\0';
+ if (genmask(AF_INET, delim,
+ &mask) == -1) {
+ error = "genmask failed";
+ goto parseerror;
+ }
+ } else {
+ mask.in4.s_addr = 0xffffffff;
+ }
+ if (gethost(AF_INET, s, &addr) == -1) {
+ error = "gethost failed";
+ goto parseerror;
+ }
+
+ oplist[osize++] = addr.in4.s_addr;
+ oplist[osize++] = mask.in4.s_addr;
+
+#ifdef USE_INET6
+ } else if (!strcasecmp(ops, "ip6.addr") ||
+ !strcasecmp(ops, "ip6.src") ||
+ !strcasecmp(ops, "ip6.dst")) {
+ i6addr_t mask, addr;
+ char *delim;
+
+ delim = strchr(s, '/');
+ if (delim != NULL) {
+ *delim++ = '\0';
+ if (genmask(AF_INET6, delim,
+ &mask) == -1) {
+ error = "genmask failed";
+ goto parseerror;
+ }
+ } else {
+ mask.i6[0] = 0xffffffff;
+ mask.i6[1] = 0xffffffff;
+ mask.i6[2] = 0xffffffff;
+ mask.i6[3] = 0xffffffff;
+ }
+ if (gethost(AF_INET6, s, &addr) == -1) {
+ error = "gethost failed";
+ goto parseerror;
+ }
+
+ oplist[osize++] = addr.i6[0];
+ oplist[osize++] = addr.i6[1];
+ oplist[osize++] = addr.i6[2];
+ oplist[osize++] = addr.i6[3];
+ oplist[osize++] = mask.i6[0];
+ oplist[osize++] = mask.i6[1];
+ oplist[osize++] = mask.i6[2];
+ oplist[osize++] = mask.i6[3];
+#endif
+
+ } else if (!strcasecmp(ops, "ip.p")) {
+ int p;
+
+ p = getproto(s);
+ if (p == -1)
+ goto parseerror;
+ oplist[osize++] = p;
+
+ } else if (!strcasecmp(ops, "tcp.flags")) {
+ u_32_t mask, flags;
+ char *delim;
+
+ delim = strchr(s, '/');
+ if (delim != NULL) {
+ *delim++ = '\0';
+ mask = tcpflags(delim);
+ } else {
+ mask = 0xff;
+ }
+ flags = tcpflags(s);
+
+ oplist[osize++] = flags;
+ oplist[osize++] = mask;
+
+
+ } else if (!strcasecmp(ops, "tcp.port") ||
+ !strcasecmp(ops, "tcp.sport") ||
+ !strcasecmp(ops, "tcp.dport") ||
+ !strcasecmp(ops, "udp.port") ||
+ !strcasecmp(ops, "udp.sport") ||
+ !strcasecmp(ops, "udp.dport")) {
+ char proto[4];
+ u_short port;
+
+ strncpy(proto, ops, 3);
+ proto[3] = '\0';
+ if (getport(NULL, s, &port, proto) == -1)
+ goto parseerror;
+ oplist[osize++] = port;
+
+ } else if (!strcasecmp(ops, "tcp.state")) {
+ oplist[osize++] = atoi(s);
+
+ } else {
+ error = "unknown word";
+ goto parseerror;
+ }
+ }
+ }
+
+ free(temp);
+
+ if (errorptr != NULL)
+ *errorptr = NULL;
+
+ for (i = asize; i > 0; i--)
+ oplist[i] = oplist[i - 1];
+
+ oplist[0] = asize + 2;
+ oplist[asize + 1] = IPF_EXP_END;
+
+ return oplist;
+
+parseerror:
+ if (errorptr != NULL)
+ *errorptr = error;
+ if (oplist != NULL)
+ free(oplist);
+ if (temp != NULL)
+ free(temp);
+ return NULL;
+}
diff --git a/contrib/ipfilter/lib/parsewhoisline.c b/contrib/ipfilter/lib/parsewhoisline.c
new file mode 100644
index 0000000..526935c
--- /dev/null
+++ b/contrib/ipfilter/lib/parsewhoisline.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: parsewhoisline.c,v 1.2.2.5 2012/07/22 08:04:24 darren_r Exp $
+ */
+#include "ipf.h"
+
+/*
+Microsoft Corp MICROSOFT19 (NET-198-136-97-0-1) 198.137.97.0 - 198.137.97.255
+Microsoft Corp SAVV-S233053-6 (NET-206-79-74-32-1) 206.79.74.32 - 206.79.74.47
+ */
+int
+parsewhoisline(line, addrp, maskp)
+ char *line;
+ addrfamily_t *addrp;
+ addrfamily_t *maskp;
+{
+ struct in_addr a1, a2;
+ char *src = line;
+ char *s = NULL;
+
+ if (line == NULL)
+ return -1;
+
+ while (*src != '\0') {
+ s = strchr(src, '(');
+ if (s == NULL)
+ break;
+
+ if (strncmp(s, "(NET", 4)) {
+ src = s + 1;
+ }
+ break;
+ }
+
+ if (s == NULL)
+ return -1;
+
+ memset(addrp, 0x00, sizeof(*maskp));
+ memset(maskp, 0x00, sizeof(*maskp));
+
+ if (*(s + 4) == '6') {
+#ifdef USE_INET6
+ i6addr_t a61, a62;
+
+ s = strchr(s, ')');
+ if (s == NULL || *++s != ' ')
+ return -1;
+ /*
+ * Parse the IPv6
+ */
+ if (inet_pton(AF_INET6, s, &a61.in6) != 1)
+ return -1;
+
+ s = strchr(s, ' ');
+ if (s == NULL || strncmp(s, " - ", 3))
+ return -1;
+
+ s += 3;
+ if (inet_pton(AF_INET6, s, &a62) != 1)
+ return -1;
+
+ addrp->adf_addr = a61;
+ addrp->adf_family = AF_INET6;
+ addrp->adf_len = offsetof(addrfamily_t, adf_addr) +
+ sizeof(struct in6_addr);
+
+ maskp->adf_addr.i6[0] = ~(a62.i6[0] ^ a61.i6[0]);
+ maskp->adf_addr.i6[1] = ~(a62.i6[1] ^ a61.i6[1]);
+ maskp->adf_addr.i6[2] = ~(a62.i6[2] ^ a61.i6[2]);
+ maskp->adf_addr.i6[3] = ~(a62.i6[3] ^ a61.i6[3]);
+
+ /*
+ * If the mask that's been generated isn't a consecutive mask
+ * then we can't add it into a pool.
+ */
+ if (count6bits(maskp->adf_addr.i6) == -1)
+ return -1;
+
+ maskp->adf_family = AF_INET6;
+ maskp->adf_len = addrp->adf_len;
+
+ if (IP6_MASKNEQ(&addrp->adf_addr.in6, &maskp->adf_addr.in6,
+ &addrp->adf_addr.in6)) {
+ return -1;
+ }
+ return 0;
+#else
+ return -1;
+#endif
+ }
+
+ s = strchr(s, ')');
+ if (s == NULL || *++s != ' ')
+ return -1;
+
+ s++;
+
+ if (inet_aton(s, &a1) != 1)
+ return -1;
+
+ s = strchr(s, ' ');
+ if (s == NULL || strncmp(s, " - ", 3))
+ return -1;
+
+ s += 3;
+ if (inet_aton(s, &a2) != 1)
+ return -1;
+
+ addrp->adf_addr.in4 = a1;
+ addrp->adf_family = AF_INET;
+ addrp->adf_len = offsetof(addrfamily_t, adf_addr) +
+ sizeof(struct in_addr);
+ maskp->adf_addr.in4.s_addr = ~(a2.s_addr ^ a1.s_addr);
+
+ /*
+ * If the mask that's been generated isn't a consecutive mask then
+ * we can't add it into a pool.
+ */
+ if (count4bits(maskp->adf_addr.in4.s_addr) == -1)
+ return -1;
+
+ maskp->adf_family = AF_INET;
+ maskp->adf_len = addrp->adf_len;
+ bzero((char *)maskp + maskp->adf_len, sizeof(*maskp) - maskp->adf_len);
+ if ((addrp->adf_addr.in4.s_addr & maskp->adf_addr.in4.s_addr) !=
+ addrp->adf_addr.in4.s_addr)
+ return -1;
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/poolio.c b/contrib/ipfilter/lib/poolio.c
new file mode 100644
index 0000000..18cf698
--- /dev/null
+++ b/contrib/ipfilter/lib/poolio.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: poolio.c,v 1.1.2.3 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "ipf.h"
+#include "netinet/ip_lookup.h"
+#include "netinet/ip_pool.h"
+
+static int poolfd = -1;
+
+
+int
+pool_open()
+{
+
+ if ((opts & OPT_DONTOPEN) != 0)
+ return 0;
+
+ if (poolfd == -1)
+ poolfd = open(IPLOOKUP_NAME, O_RDWR);
+ return poolfd;
+}
+
+int
+pool_ioctl(iocfunc, cmd, ptr)
+ ioctlfunc_t iocfunc;
+ ioctlcmd_t cmd;
+ void *ptr;
+{
+ return (*iocfunc)(poolfd, cmd, ptr);
+}
+
+
+void
+pool_close()
+{
+ if (poolfd != -1) {
+ close(poolfd);
+ poolfd = -1;
+ }
+}
+
+int
+pool_fd()
+{
+ return poolfd;
+}
diff --git a/contrib/ipfilter/lib/portname.c b/contrib/ipfilter/lib/portname.c
index f0c8625..59345f4 100644
--- a/contrib/ipfilter/lib/portname.c
+++ b/contrib/ipfilter/lib/portname.c
@@ -1,21 +1,22 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: portname.c,v 1.7.2.1 2006/06/16 17:21:09 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-char *portname(pr, port)
-int pr, port;
+char *portname(pr, port)
+ int pr, port;
{
- static char buf[32];
- struct protoent *p = NULL;
- struct servent *sv = NULL, *sv1 = NULL;
+ static char buf[32];
+ struct protoent *p = NULL;
+ struct servent *sv = NULL;
+ struct servent *sv1 = NULL;
if ((opts & OPT_NORESOLVE) == 0) {
if (pr == -1) {
diff --git a/contrib/ipfilter/lib/prependmbt.c b/contrib/ipfilter/lib/prependmbt.c
new file mode 100644
index 0000000..4f7220b
--- /dev/null
+++ b/contrib/ipfilter/lib/prependmbt.c
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: prependmbt.c,v 1.3.2.3 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+int prependmbt(fin, m)
+ fr_info_t *fin;
+ mb_t *m;
+{
+ m->mb_next = *fin->fin_mp;
+ *fin->fin_mp = m;
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/print_toif.c b/contrib/ipfilter/lib/print_toif.c
index 94a4618..fb4a266 100644
--- a/contrib/ipfilter/lib/print_toif.c
+++ b/contrib/ipfilter/lib/print_toif.c
@@ -1,32 +1,50 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: print_toif.c,v 1.8.4.1 2006/06/16 17:21:09 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void print_toif(tag, fdp)
-char *tag;
-frdest_t *fdp;
+void
+print_toif(family, tag, base, fdp)
+ int family;
+ char *tag;
+ char *base;
+ frdest_t *fdp;
{
- printf("%s %s%s", tag, fdp->fd_ifname,
- (fdp->fd_ifp || (long)fdp->fd_ifp == -1) ? "" : "(!)");
+ switch (fdp->fd_type)
+ {
+ case FRD_NORMAL :
+ PRINTF("%s %s%s", tag, base + fdp->fd_name,
+ (fdp->fd_ptr || (long)fdp->fd_ptr == -1) ? "" : "(!)");
#ifdef USE_INET6
- if (use_inet6 && IP6_NOTZERO(&fdp->fd_ip6.in6)) {
- char ipv6addr[80];
+ if (family == AF_INET6) {
+ if (IP6_NOTZERO(&fdp->fd_ip6)) {
+ char ipv6addr[80];
- inet_ntop(AF_INET6, &fdp->fd_ip6, ipv6addr,
- sizeof(fdp->fd_ip6));
- printf(":%s", ipv6addr);
- } else
+ inet_ntop(AF_INET6, &fdp->fd_ip6, ipv6addr,
+ sizeof(fdp->fd_ip6));
+ PRINTF(":%s", ipv6addr);
+ }
+ } else
#endif
- if (fdp->fd_ip.s_addr)
- printf(":%s", inet_ntoa(fdp->fd_ip));
- putchar(' ');
+ if (fdp->fd_ip.s_addr)
+ PRINTF(":%s", inet_ntoa(fdp->fd_ip));
+ putchar(' ');
+ break;
+
+ case FRD_DSTLIST :
+ PRINTF("%s dstlist/%s ", tag, base + fdp->fd_name);
+ break;
+
+ default :
+ PRINTF("%s <%d>", tag, fdp->fd_type);
+ break;
+ }
}
diff --git a/contrib/ipfilter/lib/printactiveaddr.c b/contrib/ipfilter/lib/printactiveaddr.c
new file mode 100644
index 0000000..531cdc1
--- /dev/null
+++ b/contrib/ipfilter/lib/printactiveaddr.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * Added redirect stuff and a variety of bug fixes. (mcn@EnGarde.com)
+ */
+
+#include "ipf.h"
+
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: printactiveaddr.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $";
+#endif
+
+
+void
+printactiveaddress(v, fmt, addr, ifname)
+ int v;
+ char *fmt, *ifname;
+ i6addr_t *addr;
+{
+ switch (v)
+ {
+ case 4 :
+ PRINTF(fmt, inet_ntoa(addr->in4));
+ break;
+#ifdef USE_INET6
+ case 6 :
+ printaddr(AF_INET6, FRI_NORMAL, ifname, 0,
+ (u_32_t *)&addr->in6, NULL);
+ break;
+#endif
+ default :
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printactivenat.c b/contrib/ipfilter/lib/printactivenat.c
index a2e2924..c696c0b 100644
--- a/contrib/ipfilter/lib/printactivenat.c
+++ b/contrib/ipfilter/lib/printactivenat.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
@@ -12,73 +12,135 @@
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: printactivenat.c,v 1.3.2.7 2006/12/12 16:13:00 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
-void printactivenat(nat, opts, alive, now)
-nat_t *nat;
-int opts, alive;
-u_long now;
+void
+printactivenat(nat, opts, ticks)
+ nat_t *nat;
+ int opts;
+ u_long ticks;
{
- printf("%s", getnattype(nat, alive));
+ PRINTF("%s", getnattype(nat));
if (nat->nat_flags & SI_CLONE)
- printf(" CLONE");
+ PRINTF(" CLONE");
+ if (nat->nat_phnext[0] == NULL && nat->nat_phnext[1] == NULL)
+ PRINTF(" ORPHAN");
- printf(" %-15s", inet_ntoa(nat->nat_inip));
+ putchar(' ');
+ if (nat->nat_redir & NAT_REWRITE) {
+ printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6,
+ nat->nat_ifnames[0]);
- if ((nat->nat_flags & IPN_TCPUDP) != 0)
- printf(" %-5hu", ntohs(nat->nat_inport));
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_osport));
- printf(" <- -> %-15s",inet_ntoa(nat->nat_outip));
+ putchar(' ');
+ printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6,
+ nat->nat_ifnames[0]);
- if ((nat->nat_flags & IPN_TCPUDP) != 0)
- printf(" %-5hu", ntohs(nat->nat_outport));
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_odport));
- printf(" [%s", inet_ntoa(nat->nat_oip));
- if ((nat->nat_flags & IPN_TCPUDP) != 0)
- printf(" %hu", ntohs(nat->nat_oport));
- printf("]");
+ PRINTF("<- -> ");
+ printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_nsport));
+
+ putchar(' ');
+ printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6,
+ nat->nat_ifnames[0]);
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_ndport));
+
+ } else if (nat->nat_dir == NAT_OUTBOUND) {
+ printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_osport));
+
+ PRINTF(" <- -> ");
+ printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_nsport));
+
+ PRINTF(" [");
+ printactiveaddress(nat->nat_v[0], "%s", &nat->nat_odst6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %hu", ntohs(nat->nat_odport));
+ PRINTF("]");
+ } else {
+ printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_ndport));
+
+ PRINTF(" <- -> ");
+ printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %-5hu", ntohs(nat->nat_odport));
+
+ PRINTF(" [");
+ printactiveaddress(nat->nat_v[0], "%s", &nat->nat_osrc6,
+ nat->nat_ifnames[0]);
+
+ if ((nat->nat_flags & IPN_TCPUDP) != 0)
+ PRINTF(" %hu", ntohs(nat->nat_osport));
+ PRINTF("]");
+ }
if (opts & OPT_VERBOSE) {
- printf("\n\tttl %lu use %hu sumd %s/",
- nat->nat_age - now, nat->nat_use,
+ PRINTF("\n\tttl %lu use %hu sumd %s/",
+ nat->nat_age - ticks, nat->nat_use,
getsumd(nat->nat_sumd[0]));
- printf("%s pr %u bkt %d/%d flags %x\n",
- getsumd(nat->nat_sumd[1]), nat->nat_p,
+ PRINTF("%s pr %u/%u hash %u/%u flags %x\n",
+ getsumd(nat->nat_sumd[1]),
+ nat->nat_pr[0], nat->nat_pr[1],
nat->nat_hv[0], nat->nat_hv[1], nat->nat_flags);
- printf("\tifp %s", getifname(nat->nat_ifps[0]));
- printf(",%s ", getifname(nat->nat_ifps[1]));
+ PRINTF("\tifp %s", getifname(nat->nat_ifps[0]));
+ PRINTF(",%s ", getifname(nat->nat_ifps[1]));
#ifdef USE_QUAD_T
- printf("bytes %qu/%qu pkts %qu/%qu",
+ PRINTF("bytes %"PRIu64"/%"PRIu64" pkts %"PRIu64"/%"PRIu64"",
(unsigned long long)nat->nat_bytes[0],
(unsigned long long)nat->nat_bytes[1],
(unsigned long long)nat->nat_pkts[0],
(unsigned long long)nat->nat_pkts[1]);
#else
- printf("bytes %lu/%lu pkts %lu/%lu", nat->nat_bytes[0],
+ PRINTF("bytes %lu/%lu pkts %lu/%lu", nat->nat_bytes[0],
nat->nat_bytes[1], nat->nat_pkts[0], nat->nat_pkts[1]);
#endif
- printf(" ipsumd %x", nat->nat_ipsumd);
+ PRINTF(" ipsumd %x", nat->nat_ipsumd);
}
if (opts & OPT_DEBUG) {
- printf("\n\tnat_next %p _pnext %p _hm %p\n",
+ PRINTF("\n\tnat_next %p _pnext %p _hm %p\n",
nat->nat_next, nat->nat_pnext, nat->nat_hm);
- printf("\t_hnext %p/%p _phnext %p/%p\n",
+ PRINTF("\t_hnext %p/%p _phnext %p/%p\n",
nat->nat_hnext[0], nat->nat_hnext[1],
nat->nat_phnext[0], nat->nat_phnext[1]);
- printf("\t_data %p _me %p _state %p _aps %p\n",
- nat->nat_data, nat->nat_me, nat->nat_state, nat->nat_aps);
- printf("\tfr %p ptr %p ifps %p/%p sync %p\n",
+ PRINTF("\t_data %p _me %p _state %p _aps %p\n",
+ nat->nat_data, nat->nat_me, nat->nat_state,
+ nat->nat_aps);
+ PRINTF("\tfr %p ptr %p ifps %p/%p sync %p\n",
nat->nat_fr, nat->nat_ptr, nat->nat_ifps[0],
nat->nat_ifps[1], nat->nat_sync);
- printf("\ttqe:pnext %p next %p ifq %p parent %p/%p\n",
+ PRINTF("\ttqe:pnext %p next %p ifq %p parent %p/%p\n",
nat->nat_tqe.tqe_pnext, nat->nat_tqe.tqe_next,
nat->nat_tqe.tqe_ifq, nat->nat_tqe.tqe_parent, nat);
- printf("\ttqe:die %ld touched %ld flags %x state %d/%d\n",
+ PRINTF("\ttqe:die %d touched %d flags %x state %d/%d\n",
nat->nat_tqe.tqe_die, nat->nat_tqe.tqe_touched,
nat->nat_tqe.tqe_flags, nat->nat_tqe.tqe_state[0],
nat->nat_tqe.tqe_state[1]);
diff --git a/contrib/ipfilter/lib/printaddr.c b/contrib/ipfilter/lib/printaddr.c
new file mode 100644
index 0000000..03fbacb
--- /dev/null
+++ b/contrib/ipfilter/lib/printaddr.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+
+#include "ipf.h"
+
+void
+printaddr(family, type, base, ifidx, addr, mask)
+ int family, type, ifidx;
+ char *base;
+ u_32_t *addr, *mask;
+{
+ char *suffix;
+
+ switch (type)
+ {
+ case FRI_BROADCAST :
+ suffix = "bcast";
+ break;
+
+ case FRI_DYNAMIC :
+ PRINTF("%s", base + ifidx);
+ printmask(family, mask);
+ suffix = NULL;
+ break;
+
+ case FRI_NETWORK :
+ suffix = "net";
+ break;
+
+ case FRI_NETMASKED :
+ suffix = "netmasked";
+ break;
+
+ case FRI_PEERADDR :
+ suffix = "peer";
+ break;
+
+ case FRI_LOOKUP :
+ suffix = NULL;
+ printlookup(base, (i6addr_t *)addr, (i6addr_t *)mask);
+ break;
+
+ case FRI_NONE :
+ case FRI_NORMAL :
+ printhostmask(family, addr, mask);
+ suffix = NULL;
+ break;
+ case FRI_RANGE :
+ printhost(family, addr);
+ putchar('-');
+ printhost(family, mask);
+ suffix = NULL;
+ break;
+ case FRI_SPLIT :
+ printhost(family, addr);
+ putchar(',');
+ printhost(family, mask);
+ suffix = NULL;
+ break;
+ default :
+ PRINTF("<%d>", type);
+ printmask(family, mask);
+ suffix = NULL;
+ break;
+ }
+
+ if (suffix != NULL) {
+ PRINTF("%s/%s", base + ifidx, suffix);
+ }
+}
diff --git a/contrib/ipfilter/lib/printaps.c b/contrib/ipfilter/lib/printaps.c
index 87a12cd4..0304f34 100644
--- a/contrib/ipfilter/lib/printaps.c
+++ b/contrib/ipfilter/lib/printaps.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
@@ -13,13 +13,14 @@
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: printaps.c,v 1.4.2.1 2006/06/16 17:21:10 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
-void printaps(aps, opts)
-ap_session_t *aps;
-int opts;
+void
+printaps(aps, opts, proto)
+ ap_session_t *aps;
+ int opts, proto;
{
ipsec_pxy_t ipsec;
ap_session_t ap;
@@ -31,33 +32,33 @@ int opts;
return;
if (kmemcpy((char *)&apr, (long)ap.aps_apr, sizeof(apr)))
return;
- printf("\tproxy %s/%d use %d flags %x\n", apr.apr_label,
+ PRINTF("\tproxy %s/%d use %d flags %x\n", apr.apr_label,
apr.apr_p, apr.apr_ref, apr.apr_flags);
- printf("\t\tproto %d flags %#x bytes ", ap.aps_p, ap.aps_flags);
#ifdef USE_QUAD_T
- printf("%qu pkts %qu", (unsigned long long)ap.aps_bytes,
+ PRINTF("\tbytes %"PRIu64" pkts %"PRIu64"",
+ (unsigned long long)ap.aps_bytes,
(unsigned long long)ap.aps_pkts);
#else
- printf("%lu pkts %lu", ap.aps_bytes, ap.aps_pkts);
+ PRINTF("\tbytes %lu pkts %lu", ap.aps_bytes, ap.aps_pkts);
#endif
- printf(" data %s size %d\n", ap.aps_data ? "YES" : "NO", ap.aps_psiz);
- if ((ap.aps_p == IPPROTO_TCP) && (opts & OPT_VERBOSE)) {
- printf("\t\tstate[%u,%u], sel[%d,%d]\n",
+ PRINTF(" data %s\n", ap.aps_data ? "YES" : "NO");
+ if ((proto == IPPROTO_TCP) && (opts & OPT_VERBOSE)) {
+ PRINTF("\t\tstate[%u,%u], sel[%d,%d]\n",
ap.aps_state[0], ap.aps_state[1],
ap.aps_sel[0], ap.aps_sel[1]);
#if (defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011)) || \
(__FreeBSD_version >= 300000) || defined(OpenBSD)
- printf("\t\tseq: off %hd/%hd min %x/%x\n",
+ PRINTF("\t\tseq: off %hd/%hd min %x/%x\n",
ap.aps_seqoff[0], ap.aps_seqoff[1],
ap.aps_seqmin[0], ap.aps_seqmin[1]);
- printf("\t\tack: off %hd/%hd min %x/%x\n",
+ PRINTF("\t\tack: off %hd/%hd min %x/%x\n",
ap.aps_ackoff[0], ap.aps_ackoff[1],
ap.aps_ackmin[0], ap.aps_ackmin[1]);
#else
- printf("\t\tseq: off %hd/%hd min %lx/%lx\n",
+ PRINTF("\t\tseq: off %hd/%hd min %lx/%lx\n",
ap.aps_seqoff[0], ap.aps_seqoff[1],
ap.aps_seqmin[0], ap.aps_seqmin[1]);
- printf("\t\tack: off %hd/%hd min %lx/%lx\n",
+ PRINTF("\t\tack: off %hd/%hd min %lx/%lx\n",
ap.aps_ackoff[0], ap.aps_ackoff[1],
ap.aps_ackmin[0], ap.aps_ackmin[1]);
#endif
@@ -66,43 +67,43 @@ int opts;
if (!strcmp(apr.apr_label, "raudio") && ap.aps_psiz == sizeof(ra)) {
if (kmemcpy((char *)&ra, (long)ap.aps_data, sizeof(ra)))
return;
- printf("\tReal Audio Proxy:\n");
- printf("\t\tSeen PNA: %d\tVersion: %d\tEOS: %d\n",
+ PRINTF("\tReal Audio Proxy:\n");
+ PRINTF("\t\tSeen PNA: %d\tVersion: %d\tEOS: %d\n",
ra.rap_seenpna, ra.rap_version, ra.rap_eos);
- printf("\t\tMode: %#x\tSBF: %#x\n", ra.rap_mode, ra.rap_sbf);
- printf("\t\tPorts:pl %hu, pr %hu, sr %hu\n",
+ PRINTF("\t\tMode: %#x\tSBF: %#x\n", ra.rap_mode, ra.rap_sbf);
+ PRINTF("\t\tPorts:pl %hu, pr %hu, sr %hu\n",
ra.rap_plport, ra.rap_prport, ra.rap_srport);
} else if (!strcmp(apr.apr_label, "ftp") &&
(ap.aps_psiz == sizeof(ftp))) {
if (kmemcpy((char *)&ftp, (long)ap.aps_data, sizeof(ftp)))
return;
- printf("\tFTP Proxy:\n");
- printf("\t\tpassok: %d\n", ftp.ftp_passok);
+ PRINTF("\tFTP Proxy:\n");
+ PRINTF("\t\tpassok: %d\n", ftp.ftp_passok);
ftp.ftp_side[0].ftps_buf[FTP_BUFSZ - 1] = '\0';
ftp.ftp_side[1].ftps_buf[FTP_BUFSZ - 1] = '\0';
- printf("\tClient:\n");
- printf("\t\tseq %x (ack %x) len %d junk %d cmds %d\n",
+ PRINTF("\tClient:\n");
+ PRINTF("\t\tseq %x (ack %x) len %d junk %d cmds %d\n",
ftp.ftp_side[0].ftps_seq[0],
ftp.ftp_side[0].ftps_seq[1],
ftp.ftp_side[0].ftps_len, ftp.ftp_side[0].ftps_junk,
ftp.ftp_side[0].ftps_cmds);
- printf("\t\tbuf [");
+ PRINTF("\t\tbuf [");
printbuf(ftp.ftp_side[0].ftps_buf, FTP_BUFSZ, 1);
- printf("]\n\tServer:\n");
- printf("\t\tseq %x (ack %x) len %d junk %d cmds %d\n",
+ PRINTF("]\n\tServer:\n");
+ PRINTF("\t\tseq %x (ack %x) len %d junk %d cmds %d\n",
ftp.ftp_side[1].ftps_seq[0],
ftp.ftp_side[1].ftps_seq[1],
ftp.ftp_side[1].ftps_len, ftp.ftp_side[1].ftps_junk,
ftp.ftp_side[1].ftps_cmds);
- printf("\t\tbuf [");
+ PRINTF("\t\tbuf [");
printbuf(ftp.ftp_side[1].ftps_buf, FTP_BUFSZ, 1);
- printf("]\n");
+ PRINTF("]\n");
} else if (!strcmp(apr.apr_label, "ipsec") &&
(ap.aps_psiz == sizeof(ipsec))) {
if (kmemcpy((char *)&ipsec, (long)ap.aps_data, sizeof(ipsec)))
return;
- printf("\tIPSec Proxy:\n");
- printf("\t\tICookie %08x%08x RCookie %08x%08x %s\n",
+ PRINTF("\tIPSec Proxy:\n");
+ PRINTF("\t\tICookie %08x%08x RCookie %08x%08x %s\n",
(u_int)ntohl(ipsec.ipsc_icookie[0]),
(u_int)ntohl(ipsec.ipsc_icookie[1]),
(u_int)ntohl(ipsec.ipsc_rcookie[0]),
diff --git a/contrib/ipfilter/lib/printbuf.c b/contrib/ipfilter/lib/printbuf.c
index b2e209a..4e9236f0 100644
--- a/contrib/ipfilter/lib/printbuf.c
+++ b/contrib/ipfilter/lib/printbuf.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2004 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printbuf.c,v 1.5.4.2 2006/06/16 17:21:10 darrenr Exp $
+ * $Id$
*/
#include <ctype.h>
@@ -13,19 +13,21 @@
#include "ipf.h"
-void printbuf(buf, len, zend)
-char *buf;
-int len, zend;
+void
+printbuf(buf, len, zend)
+ char *buf;
+ int len, zend;
{
- char *s, c;
+ char *s;
+ int c;
int i;
for (s = buf, i = len; i; i--) {
c = *s++;
- if (ISPRINT(c))
+ if (isprint(c))
putchar(c);
else
- printf("\\%03o", c);
+ PRINTF("\\%03o", c);
if ((c == '\0') && zend)
break;
}
diff --git a/contrib/ipfilter/lib/printdstl_live.c b/contrib/ipfilter/lib/printdstl_live.c
new file mode 100644
index 0000000..c8741ed
--- /dev/null
+++ b/contrib/ipfilter/lib/printdstl_live.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include <sys/ioctl.h>
+#include "ipf.h"
+#include "netinet/ipl.h"
+
+
+/*
+ * Because the ipf_dstnode_t can vary in size because of the interface name,
+ * the size may be larger than just sizeof().
+ */
+ippool_dst_t *
+printdstl_live(d, fd, name, opts, fields)
+ ippool_dst_t *d;
+ int fd;
+ char *name;
+ int opts;
+ wordtab_t *fields;
+{
+ ipf_dstnode_t *entry, *zero;
+ ipflookupiter_t iter;
+ int printed, last;
+ ipfobj_t obj;
+
+ if ((name != NULL) && strncmp(name, d->ipld_name, FR_GROUPLEN))
+ return d->ipld_next;
+
+ entry = calloc(1, sizeof(*entry) + 64);
+ if (entry == NULL)
+ return d->ipld_next;
+ zero = calloc(1, sizeof(*zero) + 64);
+ if (zero == NULL) {
+ free(entry);
+ return d->ipld_next;
+ }
+
+ if (fields == NULL)
+ printdstlistdata(d, opts);
+
+ if ((d->ipld_flags & IPHASH_DELETE) != 0)
+ PRINTF("# ");
+
+ if ((opts & OPT_DEBUG) == 0)
+ PRINTF("\t{");
+
+ obj.ipfo_rev = IPFILTER_VERSION;
+ obj.ipfo_type = IPFOBJ_LOOKUPITER;
+ obj.ipfo_ptr = &iter;
+ obj.ipfo_size = sizeof(iter);
+
+ iter.ili_data = entry;
+ iter.ili_type = IPLT_DSTLIST;
+ iter.ili_otype = IPFLOOKUPITER_NODE;
+ iter.ili_ival = IPFGENITER_LOOKUP;
+ iter.ili_unit = d->ipld_unit;
+ strncpy(iter.ili_name, d->ipld_name, FR_GROUPLEN);
+
+ last = 0;
+ printed = 0;
+
+ while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
+ if (entry->ipfd_next == NULL)
+ last = 1;
+ if (bcmp((char *)zero, (char *)entry, sizeof(*zero)) == 0)
+ break;
+ (void) printdstlistnode(entry, bcopywrap, opts, fields);
+ printed++;
+ }
+
+ (void) ioctl(fd, SIOCIPFDELTOK, &iter.ili_key);
+ free(entry);
+ free(zero);
+
+ if (printed == 0)
+ putchar(';');
+
+ if ((opts & OPT_DEBUG) == 0)
+ PRINTF(" };\n");
+ return d->ipld_next;
+}
diff --git a/contrib/ipfilter/lib/printdstlist.c b/contrib/ipfilter/lib/printdstlist.c
new file mode 100644
index 0000000..829a1d2
--- /dev/null
+++ b/contrib/ipfilter/lib/printdstlist.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include "ipf.h"
+
+
+ippool_dst_t *
+printdstlist(pp, copyfunc, name, opts, nodes, fields)
+ ippool_dst_t *pp;
+ copyfunc_t copyfunc;
+ char *name;
+ int opts;
+ ipf_dstnode_t *nodes;
+ wordtab_t *fields;
+{
+ ipf_dstnode_t *node;
+ ippool_dst_t dst;
+
+ if ((*copyfunc)(pp, &dst, sizeof(dst)))
+ return NULL;
+
+ if ((name != NULL) && strncmp(name, dst.ipld_name, FR_GROUPLEN))
+ return dst.ipld_next;
+
+ if (fields == NULL)
+ printdstlistdata(&dst, opts);
+
+ if ((dst.ipld_flags & IPDST_DELETE) != 0)
+ PRINTF("# ");
+ if ((opts & OPT_DEBUG) == 0)
+ PRINTF("\t{");
+
+ if (nodes == NULL) {
+ putchar(';');
+ } else {
+ for (node = nodes; node != NULL; ) {
+ ipf_dstnode_t *n;
+
+ n = calloc(1, node->ipfd_size);
+ if (n == NULL)
+ break;
+ if ((*copyfunc)(node, n, node->ipfd_size)) {
+ free(n);
+ return NULL;
+ }
+
+ node = printdstlistnode(n, bcopywrap, opts, fields);
+
+ free(n);
+ }
+ }
+
+ if ((opts & OPT_DEBUG) == 0)
+ PRINTF(" };\n");
+
+ return dst.ipld_next;
+}
diff --git a/contrib/ipfilter/lib/printdstlistdata.c b/contrib/ipfilter/lib/printdstlistdata.c
new file mode 100644
index 0000000..8b55afd
--- /dev/null
+++ b/contrib/ipfilter/lib/printdstlistdata.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include "ipf.h"
+#include <ctype.h>
+
+
+void
+printdstlistdata(pool, opts)
+ ippool_dst_t *pool;
+ int opts;
+{
+
+ if ((opts & OPT_DEBUG) == 0) {
+ if ((pool->ipld_flags & IPDST_DELETE) != 0)
+ PRINTF("# ");
+ PRINTF("pool ");
+ } else {
+ if ((pool->ipld_flags & IPDST_DELETE) != 0)
+ PRINTF("# ");
+ PRINTF("Name: %s\tRole: ", pool->ipld_name);
+ }
+
+ printunit(pool->ipld_unit);
+
+ if ((opts & OPT_DEBUG) == 0) {
+ PRINTF("/dstlist (name %s;", pool->ipld_name);
+ if (pool->ipld_policy != IPLDP_NONE) {
+ PRINTF(" policy ");
+ printdstlistpolicy(pool->ipld_policy);
+ putchar(';');
+ }
+ PRINTF(")\n");
+ } else {
+ putchar(' ');
+
+ PRINTF("\tReferences: %d\n", pool->ipld_ref);
+ if ((pool->ipld_flags & IPDST_DELETE) != 0)
+ PRINTF("# ");
+ PRINTF("Policy: \n");
+ printdstlistpolicy(pool->ipld_policy);
+ PRINTF("\n\tNodes Starting at %p\n", pool->ipld_dests);
+ }
+}
diff --git a/contrib/ipfilter/lib/printdstlistnode.c b/contrib/ipfilter/lib/printdstlistnode.c
new file mode 100644
index 0000000..898986d
--- /dev/null
+++ b/contrib/ipfilter/lib/printdstlistnode.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include "ipf.h"
+
+
+ipf_dstnode_t *
+printdstlistnode(inp, copyfunc, opts, fields)
+ ipf_dstnode_t *inp;
+ copyfunc_t copyfunc;
+ int opts;
+ wordtab_t *fields;
+{
+ ipf_dstnode_t node, *np;
+ int i;
+#ifdef USE_INET6
+ char buf[INET6_ADDRSTRLEN+1];
+ const char *str;
+#endif
+
+ if ((*copyfunc)(inp, &node, sizeof(node)))
+ return NULL;
+
+ np = calloc(1, node.ipfd_size);
+ if (np == NULL)
+ return node.ipfd_next;
+ if ((*copyfunc)(inp, np, node.ipfd_size))
+ return NULL;
+
+ if (fields != NULL) {
+ for (i = 0; fields[i].w_value != 0; i++) {
+ printpoolfield(np, IPLT_DSTLIST, i);
+ if (fields[i + 1].w_value != 0)
+ printf("\t");
+ }
+ printf("\n");
+ } else if ((opts & OPT_DEBUG) == 0) {
+ putchar(' ');
+ if (np->ipfd_dest.fd_name >= 0)
+ PRINTF("%s:", np->ipfd_names);
+ if (np->ipfd_dest.fd_addr.adf_family == AF_INET) {
+ printip(AF_INET, (u_32_t *)&np->ipfd_dest.fd_ip);
+ } else {
+#ifdef USE_INET6
+ str = inet_ntop(AF_INET6, &np->ipfd_dest.fd_ip6,
+ buf, sizeof(buf) - 1);
+ if (str != NULL)
+ PRINTF("%s", str);
+#endif
+ }
+ putchar(';');
+ } else {
+ PRINTF("Interface: [%s]/%d\n", np->ipfd_names,
+ np->ipfd_dest.fd_name);
+#ifdef USE_INET6
+ str = inet_ntop(np->ipfd_dest.fd_addr.adf_family,
+ &np->ipfd_dest.fd_ip6, buf, sizeof(buf) - 1);
+ if (str != NULL) {
+ PRINTF("\tAddress: %s\n", str);
+ }
+#else
+ PRINTF("\tAddress: %s\n", inet_ntoa(np->ipfd_dest.fd_ip));
+#endif
+ PRINTF(
+#ifdef USE_QUAD_T
+ "\t\tStates %d\tRef %d\tName [%s]\tUid %d\n",
+#else
+ "\t\tStates %d\tRef %d\tName [%s]\tUid %d\n",
+#endif
+ np->ipfd_states, np->ipfd_ref,
+ np->ipfd_names, np->ipfd_uid);
+ }
+ free(np);
+ return node.ipfd_next;
+}
diff --git a/contrib/ipfilter/lib/printdstlistpolicy.c b/contrib/ipfilter/lib/printdstlistpolicy.c
new file mode 100644
index 0000000..4873b95
--- /dev/null
+++ b/contrib/ipfilter/lib/printdstlistpolicy.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include "ipf.h"
+
+
+void
+printdstlistpolicy(policy)
+ ippool_policy_t policy;
+{
+ switch (policy)
+ {
+ case IPLDP_NONE :
+ PRINTF("none");
+ break;
+ case IPLDP_ROUNDROBIN :
+ PRINTF("round-robin");
+ break;
+ case IPLDP_CONNECTION :
+ PRINTF("weighting connection");
+ break;
+ case IPLDP_RANDOM :
+ PRINTF("random");
+ break;
+ default :
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printfieldhdr.c b/contrib/ipfilter/lib/printfieldhdr.c
new file mode 100644
index 0000000..3cc22a6
--- /dev/null
+++ b/contrib/ipfilter/lib/printfieldhdr.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printfieldhdr.c,v 1.5.2.3 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+#include <ctype.h>
+
+
+void
+printfieldhdr(words, field)
+ wordtab_t *words, *field;
+{
+ wordtab_t *w;
+ char *s, *t;
+ int i;
+
+ if (field->w_value == -2) {
+ for (i = 0, w = words; w->w_word != NULL; ) {
+ if (w->w_value > 0) {
+ printfieldhdr(words, w);
+ w++;
+ if (w->w_value > 0)
+ putchar('\t');
+ } else {
+ w++;
+ }
+ }
+ return;
+ }
+
+ for (w = words; w->w_word != NULL; w++) {
+ if (w->w_value == field->w_value) {
+ if (w->w_word == field->w_word) {
+ s = strdup(w->w_word);
+ } else {
+ s = NULL;
+ }
+
+ if ((w->w_word != field->w_word) || (s == NULL)) {
+ PRINTF("%s", field->w_word);
+ } else {
+ for (t = s; *t != '\0'; t++) {
+ if (ISALPHA(*t) && ISLOWER(*t))
+ *t = TOUPPER(*t);
+ }
+ PRINTF("%s", s);
+ free(s);
+ }
+ }
+ }
+}
diff --git a/contrib/ipfilter/lib/printfr.c b/contrib/ipfilter/lib/printfr.c
index 587d8cb..9883df4 100644
--- a/contrib/ipfilter/lib/printfr.c
+++ b/contrib/ipfilter/lib/printfr.c
@@ -1,161 +1,88 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2006 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printfr.c,v 1.43.2.18 2007/05/07 06:55:38 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-static void printaddr(int, int, char *, u_32_t *, u_32_t *);
-
-static void printaddr(v, type, ifname, addr, mask)
-int v, type;
-char *ifname;
-u_32_t *addr, *mask;
-{
- char *suffix;
-
- switch (type)
- {
- case FRI_BROADCAST :
- suffix = "bcast";
- break;
-
- case FRI_DYNAMIC :
- printf("%s", ifname);
- printmask(mask);
- suffix = NULL;
- break;
-
- case FRI_NETWORK :
- suffix = "net";
- break;
-
- case FRI_NETMASKED :
- suffix = "netmasked";
- break;
-
- case FRI_PEERADDR :
- suffix = "peer";
- break;
-
- case FRI_LOOKUP :
- suffix = NULL;
- printlookup((i6addr_t *)addr, (i6addr_t *)mask);
- break;
-
- case FRI_NORMAL :
- printhostmask(v, addr, mask);
- suffix = NULL;
- break;
- default :
- printf("<%d>", type);
- printmask(mask);
- suffix = NULL;
- break;
- }
-
- if (suffix != NULL) {
- printf("%s/%s", ifname, suffix);
- }
-}
-
-
-void printlookup(addr, mask)
-i6addr_t *addr, *mask;
-{
- switch (addr->iplookuptype)
- {
- case IPLT_POOL :
- printf("pool/");
- break;
- case IPLT_HASH :
- printf("hash/");
- break;
- default :
- printf("lookup(%x)=", addr->iplookuptype);
- break;
- }
-
- printf("%u", addr->iplookupnum);
- if (mask->iplookupptr == NULL)
- printf("(!)");
-}
-
/*
* print the filter structure in a useful way
*/
-void printfr(fp, iocfunc)
-struct frentry *fp;
-ioctlfunc_t iocfunc;
+void
+printfr(fp, iocfunc)
+ struct frentry *fp;
+ ioctlfunc_t iocfunc;
{
struct protoent *p;
u_short sec[2];
u_32_t type;
- u_char *t;
+ int pr, af;
char *s;
- int pr;
+ int hash;
pr = -2;
type = fp->fr_type & ~FR_T_BUILTIN;
if ((fp->fr_type & FR_T_BUILTIN) != 0)
- printf("# Builtin: ");
+ PRINTF("# Builtin: ");
if (fp->fr_collect != 0)
- printf("%u ", fp->fr_collect);
+ PRINTF("%u ", fp->fr_collect);
if (fp->fr_type == FR_T_CALLFUNC) {
;
} else if (fp->fr_func != NULL) {
- printf("call");
+ PRINTF("call");
if ((fp->fr_flags & FR_CALLNOW) != 0)
- printf(" now");
+ PRINTF(" now");
s = kvatoname(fp->fr_func, iocfunc);
- printf(" %s/%u", s ? s : "?", fp->fr_arg);
+ PRINTF(" %s/%u", s ? s : "?", fp->fr_arg);
} else if (FR_ISPASS(fp->fr_flags))
- printf("pass");
+ PRINTF("pass");
else if (FR_ISBLOCK(fp->fr_flags)) {
- printf("block");
+ PRINTF("block");
} else if ((fp->fr_flags & FR_LOGMASK) == FR_LOG) {
printlog(fp);
} else if (FR_ISACCOUNT(fp->fr_flags))
- printf("count");
+ PRINTF("count");
else if (FR_ISAUTH(fp->fr_flags))
- printf("auth");
+ PRINTF("auth");
else if (FR_ISPREAUTH(fp->fr_flags))
- printf("preauth");
+ PRINTF("preauth");
else if (FR_ISNOMATCH(fp->fr_flags))
- printf("nomatch");
+ PRINTF("nomatch");
+ else if (FR_ISDECAPS(fp->fr_flags))
+ PRINTF("decapsulate");
else if (FR_ISSKIP(fp->fr_flags))
- printf("skip %u", fp->fr_arg);
+ PRINTF("skip %u", fp->fr_arg);
else {
- printf("%x", fp->fr_flags);
+ PRINTF("%x", fp->fr_flags);
}
if (fp->fr_flags & FR_RETICMP) {
if ((fp->fr_flags & FR_RETMASK) == FR_FAKEICMP)
- printf(" return-icmp-as-dest");
+ PRINTF(" return-icmp-as-dest");
else if ((fp->fr_flags & FR_RETMASK) == FR_RETICMP)
- printf(" return-icmp");
+ PRINTF(" return-icmp");
if (fp->fr_icode) {
if (fp->fr_icode <= MAX_ICMPCODE)
- printf("(%s)",
+ PRINTF("(%s)",
icmpcodes[(int)fp->fr_icode]);
else
- printf("(%d)", fp->fr_icode);
+ PRINTF("(%d)", fp->fr_icode);
}
} else if ((fp->fr_flags & FR_RETMASK) == FR_RETRST)
- printf(" return-rst");
+ PRINTF(" return-rst");
if (fp->fr_flags & FR_OUTQUE)
- printf(" out ");
- else
- printf(" in ");
+ PRINTF(" out ");
+ else if (fp->fr_flags & FR_INQUE)
+ PRINTF(" in ");
if (((fp->fr_flags & FR_LOGB) == FR_LOGB) ||
((fp->fr_flags & FR_LOGP) == FR_LOGP)) {
@@ -164,126 +91,153 @@ ioctlfunc_t iocfunc;
}
if (fp->fr_flags & FR_QUICK)
- printf("quick ");
-
- if (*fp->fr_ifname) {
- printifname("on ", fp->fr_ifname, fp->fr_ifa);
- if (*fp->fr_ifnames[1] && strcmp(fp->fr_ifnames[1], "*"))
- printifname(",", fp->fr_ifnames[1], fp->fr_ifas[1]);
+ PRINTF("quick ");
+
+ if (fp->fr_ifnames[0] != -1) {
+ printifname("on ", fp->fr_names + fp->fr_ifnames[0],
+ fp->fr_ifa);
+ if (fp->fr_ifnames[1] != -1 &&
+ strcmp(fp->fr_names + fp->fr_ifnames[1], "*"))
+ printifname(",", fp->fr_names + fp->fr_ifnames[1],
+ fp->fr_ifas[1]);
putchar(' ');
}
- if (*fp->fr_dif.fd_ifname || (fp->fr_flags & FR_DUP))
- print_toif("dup-to", &fp->fr_dif);
- if (*fp->fr_tif.fd_ifname)
- print_toif("to", &fp->fr_tif);
- if (*fp->fr_rif.fd_ifname)
- print_toif("reply-to", &fp->fr_rif);
+ if (fp->fr_tif.fd_name != -1)
+ print_toif(fp->fr_family, "to", fp->fr_names, &fp->fr_tif);
+ if (fp->fr_dif.fd_name != -1)
+ print_toif(fp->fr_family, "dup-to", fp->fr_names,
+ &fp->fr_dif);
+ if (fp->fr_rif.fd_name != -1)
+ print_toif(fp->fr_family, "reply-to", fp->fr_names,
+ &fp->fr_rif);
if (fp->fr_flags & FR_FASTROUTE)
- printf("fastroute ");
+ PRINTF("fastroute ");
- if ((*fp->fr_ifnames[2] && strcmp(fp->fr_ifnames[2], "*")) ||
- (*fp->fr_ifnames[3] && strcmp(fp->fr_ifnames[3], "*"))) {
+ if ((fp->fr_ifnames[2] != -1 &&
+ strcmp(fp->fr_names + fp->fr_ifnames[2], "*")) ||
+ (fp->fr_ifnames[3] != -1 &&
+ strcmp(fp->fr_names + fp->fr_ifnames[3], "*"))) {
if (fp->fr_flags & FR_OUTQUE)
- printf("in-via ");
+ PRINTF("in-via ");
else
- printf("out-via ");
+ PRINTF("out-via ");
- if (*fp->fr_ifnames[2]) {
- printifname("", fp->fr_ifnames[2],
+ if (fp->fr_ifnames[2] != -1) {
+ printifname("", fp->fr_names + fp->fr_ifnames[2],
fp->fr_ifas[2]);
- if (*fp->fr_ifnames[3]) {
- printifname(",", fp->fr_ifnames[3],
+ if (fp->fr_ifnames[3] != -1) {
+ printifname(",",
+ fp->fr_names + fp->fr_ifnames[3],
fp->fr_ifas[3]);
}
putchar(' ');
}
}
+ if (fp->fr_family == AF_INET) {
+ PRINTF("inet ");
+ af = AF_INET;
+#ifdef USE_INET6
+ } else if (fp->fr_family == AF_INET6) {
+ PRINTF("inet6 ");
+ af = AF_INET6;
+#endif
+ } else {
+ af = -1;
+ }
+
if (type == FR_T_IPF) {
if (fp->fr_mip.fi_tos)
- printf("tos %#x ", fp->fr_tos);
+ PRINTF("tos %#x ", fp->fr_tos);
if (fp->fr_mip.fi_ttl)
- printf("ttl %d ", fp->fr_ttl);
+ PRINTF("ttl %d ", fp->fr_ttl);
if (fp->fr_flx & FI_TCPUDP) {
- printf("proto tcp/udp ");
+ PRINTF("proto tcp/udp ");
pr = -1;
} else if (fp->fr_mip.fi_p) {
pr = fp->fr_ip.fi_p;
p = getprotobynumber(pr);
- printf("proto ");
+ PRINTF("proto ");
printproto(p, pr, NULL);
putchar(' ');
}
}
- if (type == FR_T_NONE) {
- printf("all");
- } else if (type == FR_T_IPF) {
- printf("from %s", fp->fr_flags & FR_NOTSRCIP ? "!" : "");
- printaddr(fp->fr_v, fp->fr_satype, fp->fr_ifname,
+ switch (type)
+ {
+ case FR_T_NONE :
+ PRINTF("all");
+ break;
+
+ case FR_T_IPF :
+ PRINTF("from %s", fp->fr_flags & FR_NOTSRCIP ? "!" : "");
+ printaddr(af, fp->fr_satype, fp->fr_names, fp->fr_ifnames[0],
&fp->fr_src.s_addr, &fp->fr_smsk.s_addr);
if (fp->fr_scmp)
printportcmp(pr, &fp->fr_tuc.ftu_src);
- printf(" to %s", fp->fr_flags & FR_NOTDSTIP ? "!" : "");
- printaddr(fp->fr_v, fp->fr_datype, fp->fr_ifname,
+ PRINTF(" to %s", fp->fr_flags & FR_NOTDSTIP ? "!" : "");
+ printaddr(af, fp->fr_datype, fp->fr_names, fp->fr_ifnames[0],
&fp->fr_dst.s_addr, &fp->fr_dmsk.s_addr);
if (fp->fr_dcmp)
printportcmp(pr, &fp->fr_tuc.ftu_dst);
- if (fp->fr_proto == IPPROTO_ICMP && fp->fr_icmpm) {
+ if (((fp->fr_proto == IPPROTO_ICMP) ||
+ (fp->fr_proto == IPPROTO_ICMPV6)) && fp->fr_icmpm) {
int type = fp->fr_icmp, code;
+ char *name;
type = ntohs(fp->fr_icmp);
code = type & 0xff;
type /= 256;
- if (type < (sizeof(icmptypes) / sizeof(char *) - 1) &&
- icmptypes[type])
- printf(" icmp-type %s", icmptypes[type]);
+ name = icmptypename(fp->fr_family, type);
+ if (name == NULL)
+ PRINTF(" icmp-type %d", type);
else
- printf(" icmp-type %d", type);
+ PRINTF(" icmp-type %s", name);
if (ntohs(fp->fr_icmpm) & 0xff)
- printf(" code %d", code);
+ PRINTF(" code %d", code);
}
if ((fp->fr_proto == IPPROTO_TCP) &&
(fp->fr_tcpf || fp->fr_tcpfm)) {
- printf(" flags ");
- if (fp->fr_tcpf & ~TCPF_ALL)
- printf("0x%x", fp->fr_tcpf);
- else
- for (s = flagset, t = flags; *s; s++, t++)
- if (fp->fr_tcpf & *t)
- (void)putchar(*s);
- if (fp->fr_tcpfm) {
- (void)putchar('/');
- if (fp->fr_tcpfm & ~TCPF_ALL)
- printf("0x%x", fp->fr_tcpfm);
- else
- for (s = flagset, t = flags; *s;
- s++, t++)
- if (fp->fr_tcpfm & *t)
- (void)putchar(*s);
- }
+ PRINTF(" flags ");
+ printtcpflags(fp->fr_tcpf, fp->fr_tcpfm);
}
- } else if (type == FR_T_BPFOPC) {
+ break;
+
+ case FR_T_BPFOPC :
+ {
fakebpf_t *fb;
int i;
- printf("bpf-v%d { \"", fp->fr_v);
+ PRINTF("bpf-v%d { \"", fp->fr_family);
i = fp->fr_dsize / sizeof(*fb);
for (fb = fp->fr_data, s = ""; i; i--, fb++, s = " ")
- printf("%s%#x %#x %#x %#x", s, fb->fb_c, fb->fb_t,
+ PRINTF("%s%#x %#x %#x %#x", s, fb->fb_c, fb->fb_t,
fb->fb_f, fb->fb_k);
- printf("\" }");
- } else if (type == FR_T_COMPIPF) {
- ;
- } else if (type == FR_T_CALLFUNC) {
- printf("call function at %p", fp->fr_data);
- } else {
- printf("[unknown filter type %#x]", fp->fr_type);
+ PRINTF("\" }");
+ break;
+ }
+
+ case FR_T_COMPIPF :
+ break;
+
+ case FR_T_CALLFUNC :
+ PRINTF("call function at %p", fp->fr_data);
+ break;
+
+ case FR_T_IPFEXPR :
+ PRINTF("exp { \"");
+ printipfexpr(fp->fr_data);
+ PRINTF("\" } ");
+ break;
+
+ default :
+ PRINTF("[unknown filter type %#x]", fp->fr_type);
+ break;
}
if ((type == FR_T_IPF) &&
@@ -292,12 +246,12 @@ ioctlfunc_t iocfunc;
fp->fr_secbits || fp->fr_secmask)) {
char *comma = " ";
- printf(" with");
+ PRINTF(" with");
if (fp->fr_optbits || fp->fr_optmask ||
fp->fr_secbits || fp->fr_secmask) {
sec[0] = fp->fr_secmask;
sec[1] = fp->fr_secbits;
- if (fp->fr_v == 4)
+ if (fp->fr_family == AF_INET)
optprint(sec, fp->fr_optmask, fp->fr_optbits);
#ifdef USE_INET6
else
@@ -307,175 +261,213 @@ ioctlfunc_t iocfunc;
} else if (fp->fr_mflx & FI_OPTIONS) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_OPTIONS))
- printf("not ");
- printf("ipopts");
+ PRINTF("not ");
+ PRINTF("ipopts");
comma = ",";
}
if (fp->fr_mflx & FI_SHORT) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_SHORT))
- printf("not ");
- printf("short");
+ PRINTF("not ");
+ PRINTF("short");
comma = ",";
}
if (fp->fr_mflx & FI_FRAG) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_FRAG))
- printf("not ");
- printf("frag");
+ PRINTF("not ");
+ PRINTF("frag");
comma = ",";
}
if (fp->fr_mflx & FI_FRAGBODY) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_FRAGBODY))
- printf("not ");
- printf("frag-body");
+ PRINTF("not ");
+ PRINTF("frag-body");
comma = ",";
}
if (fp->fr_mflx & FI_NATED) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_NATED))
- printf("not ");
- printf("nat");
+ PRINTF("not ");
+ PRINTF("nat");
comma = ",";
}
if (fp->fr_mflx & FI_LOWTTL) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_LOWTTL))
- printf("not ");
- printf("lowttl");
+ PRINTF("not ");
+ PRINTF("lowttl");
comma = ",";
}
if (fp->fr_mflx & FI_BAD) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_BAD))
- printf("not ");
- printf("bad");
+ PRINTF("not ");
+ PRINTF("bad");
comma = ",";
}
if (fp->fr_mflx & FI_BADSRC) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_BADSRC))
- printf("not ");
- printf("bad-src");
+ PRINTF("not ");
+ PRINTF("bad-src");
comma = ",";
}
if (fp->fr_mflx & FI_BADNAT) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_BADNAT))
- printf("not ");
- printf("bad-nat");
+ PRINTF("not ");
+ PRINTF("bad-nat");
comma = ",";
}
if (fp->fr_mflx & FI_OOW) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_OOW))
- printf("not ");
- printf("oow");
+ PRINTF("not ");
+ PRINTF("oow");
comma = ",";
}
if (fp->fr_mflx & FI_MBCAST) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_MBCAST))
- printf("not ");
- printf("mbcast");
+ PRINTF("not ");
+ PRINTF("mbcast");
comma = ",";
}
if (fp->fr_mflx & FI_BROADCAST) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_BROADCAST))
- printf("not ");
- printf("bcast");
+ PRINTF("not ");
+ PRINTF("bcast");
comma = ",";
}
if (fp->fr_mflx & FI_MULTICAST) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_MULTICAST))
- printf("not ");
- printf("mcast");
+ PRINTF("not ");
+ PRINTF("mcast");
comma = ",";
}
if (fp->fr_mflx & FI_STATE) {
fputs(comma, stdout);
if (!(fp->fr_flx & FI_STATE))
- printf("not ");
- printf("state");
+ PRINTF("not ");
+ PRINTF("state");
+ comma = ",";
+ }
+ if (fp->fr_mflx & FI_V6EXTHDR) {
+ fputs(comma, stdout);
+ if (!(fp->fr_flx & FI_V6EXTHDR))
+ PRINTF("not ");
+ PRINTF("v6hdrs");
comma = ",";
}
}
if (fp->fr_flags & FR_KEEPSTATE) {
- printf(" keep state");
- if ((fp->fr_flags & (FR_STSTRICT|FR_NEWISN|FR_NOICMPERR|FR_STATESYNC)) ||
- (fp->fr_statemax != 0) || (fp->fr_age[0] != 0)) {
+ host_track_t *src = &fp->fr_srctrack;
+ PRINTF(" keep state");
+ if ((fp->fr_flags & (FR_STSTRICT|FR_NEWISN|
+ FR_NOICMPERR|FR_STATESYNC)) ||
+ (fp->fr_statemax != 0) || (fp->fr_age[0] != 0) ||
+ (src->ht_max_nodes != 0)) {
char *comma = "";
- printf(" (");
+ PRINTF(" (");
if (fp->fr_statemax != 0) {
- printf("limit %u", fp->fr_statemax);
+ PRINTF("limit %u", fp->fr_statemax);
+ comma = ",";
+ }
+ if (src->ht_max_nodes != 0) {
+ PRINTF("%smax-nodes %d", comma,
+ src->ht_max_nodes);
+ if (src->ht_max_per_node)
+ PRINTF(", max-per-src %d/%d",
+ src->ht_max_per_node,
+ src->ht_netmask);
comma = ",";
}
if (fp->fr_flags & FR_STSTRICT) {
- printf("%sstrict", comma);
+ PRINTF("%sstrict", comma);
+ comma = ",";
+ }
+ if (fp->fr_flags & FR_STLOOSE) {
+ PRINTF("%sloose", comma);
comma = ",";
}
if (fp->fr_flags & FR_NEWISN) {
- printf("%snewisn", comma);
+ PRINTF("%snewisn", comma);
comma = ",";
}
if (fp->fr_flags & FR_NOICMPERR) {
- printf("%sno-icmp-err", comma);
+ PRINTF("%sno-icmp-err", comma);
comma = ",";
}
if (fp->fr_flags & FR_STATESYNC) {
- printf("%ssync", comma);
+ PRINTF("%ssync", comma);
comma = ",";
}
if (fp->fr_age[0] || fp->fr_age[1])
- printf("%sage %d/%d", comma, fp->fr_age[0],
+ PRINTF("%sage %d/%d", comma, fp->fr_age[0],
fp->fr_age[1]);
- printf(")");
+ PRINTF(")");
}
}
if (fp->fr_flags & FR_KEEPFRAG) {
- printf(" keep frags");
+ PRINTF(" keep frags");
if (fp->fr_flags & (FR_FRSTRICT)) {
- printf(" (");
+ PRINTF(" (");
if (fp->fr_flags & FR_FRSTRICT)
- printf("strict");
- printf(")");
-
+ PRINTF("strict");
+ PRINTF(")");
+
}
}
if (fp->fr_isc != (struct ipscan *)-1) {
- if (fp->fr_isctag[0])
- printf(" scan %s", fp->fr_isctag);
+ if (fp->fr_isctag != -1)
+ PRINTF(" scan %s", fp->fr_isctag + fp->fr_names);
else
- printf(" scan *");
+ PRINTF(" scan *");
}
- if (*fp->fr_grhead != '\0')
- printf(" head %s", fp->fr_grhead);
- if (*fp->fr_group != '\0')
- printf(" group %s", fp->fr_group);
+ if (fp->fr_grhead != -1)
+ PRINTF(" head %s", fp->fr_names + fp->fr_grhead);
+ if (fp->fr_group != -1)
+ PRINTF(" group %s", fp->fr_names + fp->fr_group);
if (fp->fr_logtag != FR_NOLOGTAG || *fp->fr_nattag.ipt_tag) {
char *s = "";
- printf(" set-tag(");
+ PRINTF(" set-tag(");
if (fp->fr_logtag != FR_NOLOGTAG) {
- printf("log=%u", fp->fr_logtag);
+ PRINTF("log=%u", fp->fr_logtag);
s = ", ";
}
if (*fp->fr_nattag.ipt_tag) {
- printf("%snat=%-.*s", s, IPFTAG_LEN,
+ PRINTF("%snat=%-.*s", s, IPFTAG_LEN,
fp->fr_nattag.ipt_tag);
}
- printf(")");
+ PRINTF(")");
}
if (fp->fr_pps)
- printf(" pps %d", fp->fr_pps);
+ PRINTF(" pps %d", fp->fr_pps);
+ if (fp->fr_comment != -1)
+ PRINTF(" comment \"%s\"", fp->fr_names + fp->fr_comment);
+
+ hash = 0;
if ((fp->fr_flags & FR_KEEPSTATE) && (opts & OPT_VERBOSE)) {
- printf(" # count %d", fp->fr_statecnt);
+ PRINTF(" # count %d", fp->fr_statecnt);
+ if (fp->fr_die != 0)
+ PRINTF(" rule-ttl %u", fp->fr_die);
+ hash = 1;
+ } else if (fp->fr_die != 0) {
+ PRINTF(" # rule-ttl %u", fp->fr_die);
+ hash = 1;
+ }
+ if (opts & OPT_DEBUG) {
+ if (hash == 0)
+ putchar('#');
+ PRINTF(" ref %d", fp->fr_ref);
}
(void)putchar('\n');
}
diff --git a/contrib/ipfilter/lib/printfraginfo.c b/contrib/ipfilter/lib/printfraginfo.c
index d9317e8..dd2966f 100644
--- a/contrib/ipfilter/lib/printfraginfo.c
+++ b/contrib/ipfilter/lib/printfraginfo.c
@@ -1,30 +1,42 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2004-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printfraginfo.c,v 1.1.2.5 2006/12/25 15:10:37 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
#include "kmem.h"
-void printfraginfo(prefix, ifr)
-char *prefix;
-struct ipfr *ifr;
+
+void
+printfraginfo(prefix, ifr)
+ char *prefix;
+ struct ipfr *ifr;
{
frentry_t fr;
+ int family;
+ PRINTF("%s", prefix);
+ if (ifr->ipfr_v == 6) {
+ PRINTF("inet6");
+ family = AF_INET6;
+ } else {
+ PRINTF("inet");
+ family = AF_INET;
+ }
fr.fr_flags = 0xffffffff;
- printf("%s%s -> ", prefix, hostname(4, &ifr->ipfr_src));
+ PRINTF(" %s -> ", hostname(family, &ifr->ipfr_src));
/*
if (kmemcpy((char *)&fr, (u_long)ifr->ipfr_rule,
sizeof(fr)) == -1)
return;
-*/
- printf("%s id %d ttl %ld pr %d seen0 %d ref %d tos %#02x\n",
- hostname(4, &ifr->ipfr_dst), ifr->ipfr_id, ifr->ipfr_ttl,
- ifr->ipfr_p, ifr->ipfr_seen0, ifr->ipfr_ref, ifr->ipfr_tos);
+ */
+ PRINTF("%s id %x ttl %lu pr %d pkts %u bytes %u seen0 %d ref %d\n",
+ hostname(family, &ifr->ipfr_dst), ifr->ipfr_id,
+ ifr->ipfr_ttl, ifr->ipfr_p, ifr->ipfr_pkts, ifr->ipfr_bytes,
+ ifr->ipfr_seen0, ifr->ipfr_ref);
}
diff --git a/contrib/ipfilter/lib/printhash.c b/contrib/ipfilter/lib/printhash.c
index 975b60e..3779662 100644
--- a/contrib/ipfilter/lib/printhash.c
+++ b/contrib/ipfilter/lib/printhash.c
@@ -1,22 +1,21 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-
-iphtable_t *printhash(hp, copyfunc, name, opts)
-iphtable_t *hp;
-copyfunc_t copyfunc;
-char *name;
-int opts;
+iphtable_t *
+printhash(hp, copyfunc, name, opts, fields)
+ iphtable_t *hp;
+ copyfunc_t copyfunc;
+ char *name;
+ int opts;
+ wordtab_t *fields;
{
iphtent_t *ipep, **table;
iphtable_t iph;
@@ -29,7 +28,8 @@ int opts;
if ((name != NULL) && strncmp(name, iph.iph_name, FR_GROUPLEN))
return iph.iph_next;
- printhashdata(hp, opts);
+ if (fields == NULL)
+ printhashdata(hp, opts);
if ((hp->iph_flags & IPHASH_DELETE) != 0)
PRINTF("# ");
@@ -43,7 +43,7 @@ int opts;
return NULL;
for (printed = 0, ipep = iph.iph_list; ipep != NULL; ) {
- ipep = printhashnode(&iph, ipep, copyfunc, opts);
+ ipep = printhashnode(&iph, ipep, copyfunc, opts, fields);
printed++;
}
if (printed == 0)
diff --git a/contrib/ipfilter/lib/printhash_live.c b/contrib/ipfilter/lib/printhash_live.c
index 1afe632..53159b1 100644
--- a/contrib/ipfilter/lib/printhash_live.c
+++ b/contrib/ipfilter/lib/printhash_live.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -8,25 +8,25 @@
#include "ipf.h"
#include "netinet/ipl.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-
-iphtable_t *printhash_live(hp, fd, name, opts)
-iphtable_t *hp;
-int fd;
-char *name;
-int opts;
+iphtable_t *
+printhash_live(hp, fd, name, opts, fields)
+ iphtable_t *hp;
+ int fd;
+ char *name;
+ int opts;
+ wordtab_t *fields;
{
- iphtent_t entry, *top, *node;
+ iphtent_t entry, zero;
ipflookupiter_t iter;
- int printed, last;
+ int last, printed;
ipfobj_t obj;
if ((name != NULL) && strncmp(name, hp->iph_name, FR_GROUPLEN))
return hp->iph_next;
- printhashdata(hp, opts);
+ if (fields == NULL)
+ printhashdata(hp, opts);
if ((hp->iph_flags & IPHASH_DELETE) != 0)
PRINTF("# ");
@@ -47,26 +47,19 @@ int opts;
strncpy(iter.ili_name, hp->iph_name, FR_GROUPLEN);
last = 0;
- top = NULL;
printed = 0;
+ bzero((char *)&zero, sizeof(zero));
while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
if (entry.ipe_next == NULL)
last = 1;
- entry.ipe_next = top;
- top = malloc(sizeof(*top));
- if (top == NULL)
+ if (bcmp(&zero, &entry, sizeof(zero)) == 0)
break;
- bcopy(&entry, top, sizeof(entry));
- }
-
- while (top != NULL) {
- node = top;
- (void) printhashnode(hp, node, bcopywrap, opts);
- top = node->ipe_next;
- free(node);
+ (void) printhashnode(hp, &entry, bcopywrap, opts, fields);
printed++;
}
+ if (last == 0)
+ ipferror(fd, "walking hash nodes:");
if (printed == 0)
putchar(';');
diff --git a/contrib/ipfilter/lib/printhashdata.c b/contrib/ipfilter/lib/printhashdata.c
index d278c36..ea2d416 100644
--- a/contrib/ipfilter/lib/printhashdata.c
+++ b/contrib/ipfilter/lib/printhashdata.c
@@ -1,23 +1,22 @@
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
+#include <ctype.h>
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-
-void printhashdata(hp, opts)
-iphtable_t *hp;
-int opts;
+void
+printhashdata(hp, opts)
+ iphtable_t *hp;
+ int opts;
{
if ((opts & OPT_DEBUG) == 0) {
if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
- PRINTF("# 'anonymous' table\n");
+ PRINTF("# 'anonymous' table refs %d\n", hp->iph_ref);
if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
PRINTF("# ");
switch (hp->iph_type & ~IPHASH_ANON)
@@ -38,10 +37,10 @@ int opts;
PRINTF("%#x", hp->iph_type);
break;
}
- PRINTF(" role = ");
+ PRINTF(" role=");
} else {
PRINTF("Hash Table %s: %s",
- isdigit(*hp->iph_name) ? "Number" : "Name",
+ ISDIGIT(*hp->iph_name) ? "Number" : "Name",
hp->iph_name);
if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
PRINTF("(anon)");
@@ -49,33 +48,16 @@ int opts;
PRINTF("Role: ");
}
- switch (hp->iph_unit)
- {
- case IPL_LOGNAT :
- PRINTF("nat");
- break;
- case IPL_LOGIPF :
- PRINTF("ipf");
- break;
- case IPL_LOGAUTH :
- PRINTF("auth");
- break;
- case IPL_LOGCOUNT :
- PRINTF("count");
- break;
- default :
- PRINTF("#%d", hp->iph_unit);
- break;
- }
+ printunit(hp->iph_unit);
if ((opts & OPT_DEBUG) == 0) {
if ((hp->iph_type & ~IPHASH_ANON) == IPHASH_LOOKUP)
- PRINTF(" type = hash");
- PRINTF(" %s = %s size = %lu",
- isdigit(*hp->iph_name) ? "number" : "name",
+ PRINTF(" type=hash");
+ PRINTF(" %s=%s size=%lu",
+ ISDIGIT(*hp->iph_name) ? "number" : "name",
hp->iph_name, (u_long)hp->iph_size);
if (hp->iph_seed != 0)
- PRINTF(" seed = %lu", hp->iph_seed);
+ PRINTF(" seed=%lu", hp->iph_seed);
putchar('\n');
} else {
PRINTF(" Type: ");
@@ -95,7 +77,7 @@ int opts;
PRINTF("\t\tSize: %lu\tSeed: %lu",
(u_long)hp->iph_size, hp->iph_seed);
PRINTF("\tRef. Count: %d\tMasks: %#x\n", hp->iph_ref,
- hp->iph_masks);
+ hp->iph_maskset[0]);
}
if ((opts & OPT_DEBUG) != 0) {
@@ -103,8 +85,8 @@ int opts;
int i;
for (i = 0; i < 32; i++) {
- if ((1 << i) & hp->iph_masks) {
- ntomask(4, i, &m.s_addr);
+ if ((1 << i) & hp->iph_maskset[0]) {
+ ntomask(AF_INET, i, &m.s_addr);
PRINTF("\t\tMask: %s\n", inet_ntoa(m));
}
}
diff --git a/contrib/ipfilter/lib/printhashnode.c b/contrib/ipfilter/lib/printhashnode.c
index ed83c39..e245535 100644
--- a/contrib/ipfilter/lib/printhashnode.c
+++ b/contrib/ipfilter/lib/printhashnode.c
@@ -1,47 +1,63 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-iphtent_t *printhashnode(iph, ipep, copyfunc, opts)
-iphtable_t *iph;
-iphtent_t *ipep;
-copyfunc_t copyfunc;
-int opts;
+iphtent_t *
+printhashnode(iph, ipep, copyfunc, opts, fields)
+ iphtable_t *iph;
+ iphtent_t *ipep;
+ copyfunc_t copyfunc;
+ int opts;
+ wordtab_t *fields;
{
iphtent_t ipe;
+ u_int hv;
+ int i;
if ((*copyfunc)(ipep, &ipe, sizeof(ipe)))
return NULL;
- ipe.ipe_addr.in4_addr = htonl(ipe.ipe_addr.in4_addr);
- ipe.ipe_mask.in4_addr = htonl(ipe.ipe_mask.in4_addr);
+ hv = IPE_V4_HASH_FN(ipe.ipe_addr.i6[0], ipe.ipe_mask.i6[0],
+ iph->iph_size);
- if ((opts & OPT_DEBUG) != 0) {
- PRINTF("\tAddress: %s",
+ if (fields != NULL) {
+ for (i = 0; fields[i].w_value != 0; i++) {
+ printpoolfield(&ipe, IPLT_HASH, i);
+ if (fields[i + 1].w_value != 0)
+ printf("\t");
+ }
+ printf("\n");
+ } else if ((opts & OPT_DEBUG) != 0) {
+ PRINTF("\t%d\tAddress: %s", hv,
inet_ntoa(ipe.ipe_addr.in4));
- printmask((u_32_t *)&ipe.ipe_mask.in4_addr);
+ printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
PRINTF("\tRef. Count: %d\tGroup: %s\n", ipe.ipe_ref,
ipe.ipe_group);
+#ifdef USE_QUAD_T
+ PRINTF("\tHits: %"PRIu64"\tBytes: %"PRIu64"\n",
+ ipe.ipe_hits, ipe.ipe_bytes);
+#else
+ PRINTF("\tHits: %lu\tBytes: %lu\n",
+ ipe.ipe_hits, ipe.ipe_bytes);
+#endif
} else {
putchar(' ');
- printip((u_32_t *)&ipe.ipe_addr.in4_addr);
- printmask((u_32_t *)&ipe.ipe_mask.in4_addr);
+ printip(ipe.ipe_family, (u_32_t *)&ipe.ipe_addr.in4_addr);
+ printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
if (ipe.ipe_value != 0) {
switch (iph->iph_type & ~IPHASH_ANON)
{
case IPHASH_GROUPMAP :
if (strncmp(ipe.ipe_group, iph->iph_name,
FR_GROUPLEN))
- PRINTF(", group = %s", ipe.ipe_group);
+ PRINTF(", group=%s", ipe.ipe_group);
break;
}
}
diff --git a/contrib/ipfilter/lib/printhost.c b/contrib/ipfilter/lib/printhost.c
new file mode 100644
index 0000000..eaf3fda
--- /dev/null
+++ b/contrib/ipfilter/lib/printhost.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printhost.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+
+void
+printhost(family, addr)
+ int family;
+ u_32_t *addr;
+{
+#ifdef USE_INET6
+ char ipbuf[64];
+#else
+ struct in_addr ipa;
+#endif
+
+ if ((family == -1) || !*addr)
+ PRINTF("any");
+ else {
+ void *ptr = addr;
+
+#ifdef USE_INET6
+ PRINTF("%s", inet_ntop(family, ptr, ipbuf, sizeof(ipbuf)));
+#else
+ ipa.s_addr = *addr;
+ PRINTF("%s", inet_ntoa(ipa));
+#endif
+ }
+}
diff --git a/contrib/ipfilter/lib/printhostmap.c b/contrib/ipfilter/lib/printhostmap.c
index 0c9242f..714bc41 100644
--- a/contrib/ipfilter/lib/printhostmap.c
+++ b/contrib/ipfilter/lib/printhostmap.c
@@ -1,22 +1,31 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: printhostmap.c,v 1.3.2.3 2006/09/30 21:42:07 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
-void printhostmap(hmp, hv)
-hostmap_t *hmp;
-u_int hv;
+void
+printhostmap(hmp, hv)
+ hostmap_t *hmp;
+ u_int hv;
{
- printf("%s,", inet_ntoa(hmp->hm_srcip));
- printf("%s -> ", inet_ntoa(hmp->hm_dstip));
- printf("%s ", inet_ntoa(hmp->hm_mapip));
- printf("(use = %d hv = %u)\n", hmp->hm_ref, hv);
+ printactiveaddress(hmp->hm_v, "%s", &hmp->hm_osrcip6, NULL);
+ putchar(',');
+ printactiveaddress(hmp->hm_v, "%s", &hmp->hm_odstip6, NULL);
+ PRINTF(" -> ");
+ printactiveaddress(hmp->hm_v, "%s", &hmp->hm_nsrcip6, NULL);
+ putchar(',');
+ printactiveaddress(hmp->hm_v, "%s", &hmp->hm_ndstip6, NULL);
+ putchar(' ');
+ PRINTF("(use = %d", hmp->hm_ref);
+ if (opts & OPT_VERBOSE)
+ PRINTF(" hv = %u", hv);
+ printf(")\n");
}
diff --git a/contrib/ipfilter/lib/printhostmask.c b/contrib/ipfilter/lib/printhostmask.c
index 44703c4..10d90b2 100644
--- a/contrib/ipfilter/lib/printhostmask.c
+++ b/contrib/ipfilter/lib/printhostmask.c
@@ -1,19 +1,20 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printhostmask.c,v 1.8.4.1 2006/06/16 17:21:12 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void printhostmask(v, addr, mask)
-int v;
-u_32_t *addr, *mask;
+void
+printhostmask(family, addr, mask)
+ int family;
+ u_32_t *addr, *mask;
{
#ifdef USE_INET6
char ipbuf[64];
@@ -21,26 +22,18 @@ u_32_t *addr, *mask;
struct in_addr ipa;
#endif
- if (!*addr && !*mask)
- printf("any");
+ if ((family == -1) || ((!addr || !*addr) && (!mask || !*mask)))
+ PRINTF("any");
else {
-#ifdef USE_INET6
void *ptr = addr;
- int af;
- if (v == 4) {
- ptr = addr;
- af = AF_INET;
- } else if (v == 6) {
- ptr = addr;
- af = AF_INET6;
- } else
- af = 0;
- printf("%s", inet_ntop(af, ptr, ipbuf, sizeof(ipbuf)));
+#ifdef USE_INET6
+ PRINTF("%s", inet_ntop(family, ptr, ipbuf, sizeof(ipbuf)));
#else
ipa.s_addr = *addr;
- printf("%s", inet_ntoa(ipa));
+ PRINTF("%s", inet_ntoa(ipa));
#endif
- printmask(mask);
+ if (mask != NULL)
+ printmask(family, mask);
}
}
diff --git a/contrib/ipfilter/lib/printifname.c b/contrib/ipfilter/lib/printifname.c
index 2f7d912..2e554d9 100644
--- a/contrib/ipfilter/lib/printifname.c
+++ b/contrib/ipfilter/lib/printifname.c
@@ -1,20 +1,22 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printifname.c,v 1.2.4.1 2006/06/16 17:21:12 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void printifname(format, name, ifp)
-char *format, *name;
-void *ifp;
+
+void
+printifname(format, name, ifp)
+ char *format, *name;
+ void *ifp;
{
- printf("%s%s", format, name);
+ PRINTF("%s%s", format, name);
if ((ifp == NULL) && strcmp(name, "-") && strcmp(name, "*"))
- printf("(!)");
+ PRINTF("(!)");
}
diff --git a/contrib/ipfilter/lib/printip.c b/contrib/ipfilter/lib/printip.c
index 8c008af..6d414fe 100644
--- a/contrib/ipfilter/lib/printip.c
+++ b/contrib/ipfilter/lib/printip.c
@@ -1,24 +1,43 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printip.c,v 1.3.4.1 2006/06/16 17:21:12 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void printip(addr)
-u_32_t *addr;
+void
+printip(family, addr)
+ int family;
+ u_32_t *addr;
{
struct in_addr ipa;
- ipa.s_addr = *addr;
- if (ntohl(ipa.s_addr) < 256)
- printf("%lu", (u_long)ntohl(ipa.s_addr));
+ if (family == AF_INET) {
+ ipa.s_addr = *addr;
+ if (ntohl(ipa.s_addr) < 256)
+ PRINTF("%lu", (u_long)ntohl(ipa.s_addr));
+ else
+ PRINTF("%s", inet_ntoa(ipa));
+ }
+#ifdef AF_INET6
+ else if (family == AF_INET6) {
+ char buf[INET6_ADDRSTRLEN + 1];
+ const char *str;
+
+ buf[0] = '\0';
+ str = inet_ntop(AF_INET6, addr, buf, sizeof(buf) - 1);
+ if (str != NULL)
+ PRINTF("%s", str);
+ else
+ PRINTF("???");
+ }
+#endif
else
- printf("%s", inet_ntoa(ipa));
+ PRINTF("?(%d)?", family);
}
diff --git a/contrib/ipfilter/lib/printipfexpr.c b/contrib/ipfilter/lib/printipfexpr.c
new file mode 100644
index 0000000..64c2f1c
--- /dev/null
+++ b/contrib/ipfilter/lib/printipfexpr.c
@@ -0,0 +1,197 @@
+#include "ipf.h"
+
+static void printport __P((int *));
+static void printhosts __P((int *));
+static void printsingle __P((int *));
+static void printhostsv6 __P((int *));
+
+void
+printipfexpr(array)
+ int *array;
+{
+ int i, nelems, j, not;
+ ipfexp_t *ipfe;
+
+ nelems = array[0];
+
+ for (i = 1; i < nelems; ) {
+ ipfe = (ipfexp_t *)(array + i);
+ if (ipfe->ipfe_cmd == IPF_EXP_END)
+ break;
+
+ not = ipfe->ipfe_not;
+
+ switch (ipfe->ipfe_cmd)
+ {
+ case IPF_EXP_IP_ADDR :
+ PRINTF("ip.addr %s= ", not ? "!" : "");
+ printhosts(array + i);
+ break;
+
+ case IPF_EXP_IP_PR :
+ PRINTF("ip.p %s= ", not ? "!" : "");
+ printsingle(array + i);
+ break;
+
+ case IPF_EXP_IP_SRCADDR :
+ PRINTF("ip.src %s= ", not ? "!" : "");
+ printhosts(array + i);
+ break;
+
+ case IPF_EXP_IP_DSTADDR :
+ PRINTF("ip.dst %s= ", not ? "!" : "");
+ printhosts(array + i);
+ break;
+
+ case IPF_EXP_TCP_PORT :
+ PRINTF("tcp.port %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_TCP_DPORT :
+ PRINTF("tcp.dport %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_TCP_SPORT :
+ PRINTF("tcp.sport %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_TCP_FLAGS :
+ PRINTF("tcp.flags %s= ", not ? "!" : "");
+
+ for (j = 0; j < ipfe->ipfe_narg; ) {
+ printtcpflags(array[i + 4], array[i + 5]);
+ j += 2;
+ if (j < array[4])
+ putchar(',');
+ }
+ break;
+
+ case IPF_EXP_UDP_PORT :
+ PRINTF("udp.port %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_UDP_DPORT :
+ PRINTF("udp.dport %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_UDP_SPORT :
+ PRINTF("udp.sport %s= ", not ? "!" : "");
+ printport(array + i);
+ break;
+
+ case IPF_EXP_IDLE_GT :
+ PRINTF("idle-gt %s= ", not ? "!" : "");
+ printsingle(array + i);
+ break;
+
+ case IPF_EXP_TCP_STATE :
+ PRINTF("tcp-state %s= ", not ? "!" : "");
+ printsingle(array + i);
+ break;
+
+#ifdef USE_INET6
+ case IPF_EXP_IP6_ADDR :
+ PRINTF("ip6.addr %s= ", not ? "!" : "");
+ printhostsv6(array + i);
+ break;
+
+ case IPF_EXP_IP6_SRCADDR :
+ PRINTF("ip6.src %s= ", not ? "!" : "");
+ printhostsv6(array + i);
+ break;
+
+ case IPF_EXP_IP6_DSTADDR :
+ PRINTF("ip6.dst %s= ", not ? "!" : "");
+ printhostsv6(array + i);
+ break;
+#endif
+
+ case IPF_EXP_END :
+ break;
+
+ default :
+ PRINTF("#%#x,len=%d;",
+ ipfe->ipfe_cmd, ipfe->ipfe_narg);
+ }
+
+ if (array[i] != IPF_EXP_END)
+ putchar(';');
+
+ i += ipfe->ipfe_size;
+ if (array[i] != IPF_EXP_END)
+ putchar(' ');
+ }
+}
+
+
+static void
+printsingle(array)
+ int *array;
+{
+ ipfexp_t *ipfe = (ipfexp_t *)array;
+ int i;
+
+ for (i = 0; i < ipfe->ipfe_narg; ) {
+ PRINTF("%d", array[i + 4]);
+ i++;
+ if (i < ipfe->ipfe_narg)
+ putchar(',');
+ }
+}
+
+
+static void
+printport(array)
+ int *array;
+{
+ ipfexp_t *ipfe = (ipfexp_t *)array;
+ int i;
+
+ for (i = 0; i < ipfe->ipfe_narg; ) {
+ PRINTF("%d", ntohs(array[i + 4]));
+ i++;
+ if (i < ipfe->ipfe_narg)
+ putchar(',');
+ }
+}
+
+
+static void
+printhosts(array)
+ int *array;
+{
+ ipfexp_t *ipfe = (ipfexp_t *)array;
+ int i, j;
+
+ for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
+ printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
+ (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
+ i += 2;
+ if (i < ipfe->ipfe_narg)
+ putchar(',');
+ }
+}
+
+
+#ifdef USE_INET6
+static void
+printhostsv6(array)
+ int *array;
+{
+ ipfexp_t *ipfe = (ipfexp_t *)array;
+ int i, j;
+
+ for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
+ printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
+ (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
+ i += 8;
+ if (i < ipfe->ipfe_size)
+ putchar(',');
+ }
+}
+#endif
diff --git a/contrib/ipfilter/lib/printiphdr.c b/contrib/ipfilter/lib/printiphdr.c
new file mode 100644
index 0000000..fdf0f75
--- /dev/null
+++ b/contrib/ipfilter/lib/printiphdr.c
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printiphdr.c,v 1.1 2009/03/01 12:48:32 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+
+void
+printiphdr(ip)
+ ip_t *ip;
+{
+ PRINTF("ip(v=%d,hl=%d,len=%d,tos=%#x,off=%#x,sum=%#x,src=%#x,dst=%#x",
+ ip->ip_v, ip->ip_hl, ntohs(ip->ip_len), ip->ip_tos,
+ ntohs(ip->ip_off), ntohs(ip->ip_sum), ntohl(ip->ip_src.s_addr),
+ ntohl(ip->ip_dst.s_addr));
+}
diff --git a/contrib/ipfilter/lib/printlog.c b/contrib/ipfilter/lib/printlog.c
index 82c0400..c5278cd 100644
--- a/contrib/ipfilter/lib/printlog.c
+++ b/contrib/ipfilter/lib/printlog.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printlog.c,v 1.6.4.3 2006/06/16 17:21:12 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -13,26 +13,27 @@
#include <syslog.h>
-void printlog(fp)
-frentry_t *fp;
+void
+printlog(fp)
+ frentry_t *fp;
{
char *s, *u;
- printf("log");
+ PRINTF("log");
if (fp->fr_flags & FR_LOGBODY)
- printf(" body");
+ PRINTF(" body");
if (fp->fr_flags & FR_LOGFIRST)
- printf(" first");
+ PRINTF(" first");
if (fp->fr_flags & FR_LOGORBLOCK)
- printf(" or-block");
+ PRINTF(" or-block");
if (fp->fr_loglevel != 0xffff) {
- printf(" level ");
+ PRINTF(" level ");
s = fac_toname(fp->fr_loglevel);
if (s == NULL || *s == '\0')
s = "!!!";
u = pri_toname(fp->fr_loglevel);
if (u == NULL || *u == '\0')
u = "!!!";
- printf("%s.%s", s, u);
+ PRINTF("%s.%s", s, u);
}
}
diff --git a/contrib/ipfilter/lib/printlookup.c b/contrib/ipfilter/lib/printlookup.c
new file mode 100644
index 0000000..51f8d6e
--- /dev/null
+++ b/contrib/ipfilter/lib/printlookup.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+
+#include "ipf.h"
+
+
+void
+printlookup(base, addr, mask)
+ char *base;
+ i6addr_t *addr, *mask;
+{
+ char name[32];
+
+ switch (addr->iplookuptype)
+ {
+ case IPLT_POOL :
+ PRINTF("pool/");
+ break;
+ case IPLT_HASH :
+ PRINTF("hash/");
+ break;
+ case IPLT_DSTLIST :
+ PRINTF("dstlist/");
+ break;
+ default :
+ PRINTF("lookup(%x)=", addr->iplookuptype);
+ break;
+ }
+
+ if (addr->iplookupsubtype == 0)
+ PRINTF("%u", addr->iplookupnum);
+ else if (addr->iplookupsubtype == 1) {
+ strncpy(name, base + addr->iplookupname, sizeof(name));
+ name[sizeof(name) - 1] = '\0';
+ PRINTF("%s", name);
+ }
+}
diff --git a/contrib/ipfilter/lib/printmask.c b/contrib/ipfilter/lib/printmask.c
index 9230dc0..365d7ff 100644
--- a/contrib/ipfilter/lib/printmask.c
+++ b/contrib/ipfilter/lib/printmask.c
@@ -1,30 +1,30 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printmask.c,v 1.5.4.1 2006/06/16 17:21:13 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void printmask(mask)
-u_32_t *mask;
+void
+printmask(family, mask)
+ int family;
+ u_32_t *mask;
{
struct in_addr ipa;
int ones;
-#ifdef USE_INET6
- if (use_inet6)
- printf("/%d", count6bits(mask));
- else
-#endif
- if ((ones = count4bits(*mask)) == -1) {
+ if (family == AF_INET6) {
+ PRINTF("/%d", count6bits(mask));
+ } else if ((ones = count4bits(*mask)) == -1) {
ipa.s_addr = *mask;
- printf("/%s", inet_ntoa(ipa));
- } else
- printf("/%d", ones);
+ PRINTF("/%s", inet_ntoa(ipa));
+ } else {
+ PRINTF("/%d", ones);
+ }
}
diff --git a/contrib/ipfilter/lib/printnat.c b/contrib/ipfilter/lib/printnat.c
index 39c43ca..37a7e12 100644
--- a/contrib/ipfilter/lib/printnat.c
+++ b/contrib/ipfilter/lib/printnat.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
@@ -13,230 +13,339 @@
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: printnat.c,v 1.22.2.14 2007/09/06 16:40:11 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
+
/*
* Print out a NAT rule
*/
-void printnat(np, opts)
-ipnat_t *np;
-int opts;
+void
+printnat(np, opts)
+ ipnat_t *np;
+ int opts;
{
- struct protoent *pr;
- int bits;
+ struct protoent *pr;
+ char *base;
+ int family;
+ int proto;
+
+ if (np->in_v[0] == 4)
+ family = AF_INET;
+#ifdef USE_INET6
+ else if (np->in_v[0] == 6)
+ family = AF_INET6;
+#endif
+ else
+ family = AF_UNSPEC;
- pr = getprotobynumber(np->in_p);
+ if (np->in_flags & IPN_NO)
+ PRINTF("no ");
switch (np->in_redir)
{
+ case NAT_REDIRECT|NAT_ENCAP :
+ PRINTF("encap in on");
+ proto = np->in_pr[0];
+ break;
+ case NAT_MAP|NAT_ENCAP :
+ PRINTF("encap out on");
+ proto = np->in_pr[1];
+ break;
+ case NAT_REDIRECT|NAT_DIVERTUDP :
+ PRINTF("divert in on");
+ proto = np->in_pr[0];
+ break;
+ case NAT_MAP|NAT_DIVERTUDP :
+ PRINTF("divert out on");
+ proto = np->in_pr[1];
+ break;
+ case NAT_REDIRECT|NAT_REWRITE :
+ PRINTF("rewrite in on");
+ proto = np->in_pr[0];
+ break;
+ case NAT_MAP|NAT_REWRITE :
+ PRINTF("rewrite out on");
+ proto = np->in_pr[1];
+ break;
case NAT_REDIRECT :
- printf("rdr");
+ PRINTF("rdr");
+ proto = np->in_pr[0];
break;
case NAT_MAP :
- printf("map");
+ PRINTF("map");
+ proto = np->in_pr[1];
break;
case NAT_MAPBLK :
- printf("map-block");
+ PRINTF("map-block");
+ proto = np->in_pr[1];
break;
case NAT_BIMAP :
- printf("bimap");
+ PRINTF("bimap");
+ proto = np->in_pr[0];
break;
default :
- fprintf(stderr, "unknown value for in_redir: %#x\n",
+ FPRINTF(stderr, "unknown value for in_redir: %#x\n",
np->in_redir);
+ proto = np->in_pr[0];
break;
}
- if (!strcmp(np->in_ifnames[0], "-"))
- printf(" \"%s\"", np->in_ifnames[0]);
+ pr = getprotobynumber(proto);
+
+ base = np->in_names;
+ if (!strcmp(base + np->in_ifnames[0], "-"))
+ PRINTF(" \"%s\"", base + np->in_ifnames[0]);
else
- printf(" %s", np->in_ifnames[0]);
- if ((np->in_ifnames[1][0] != '\0') &&
- (strncmp(np->in_ifnames[0], np->in_ifnames[1], LIFNAMSIZ) != 0)) {
- if (!strcmp(np->in_ifnames[1], "-"))
- printf(",\"%s\"", np->in_ifnames[1]);
+ PRINTF(" %s", base + np->in_ifnames[0]);
+ if ((np->in_ifnames[1] != -1) &&
+ (strcmp(base + np->in_ifnames[0], base + np->in_ifnames[1]) != 0)) {
+ if (!strcmp(base + np->in_ifnames[1], "-"))
+ PRINTF(",\"%s\"", base + np->in_ifnames[1]);
else
- printf(",%s", np->in_ifnames[1]);
+ PRINTF(",%s", base + np->in_ifnames[1]);
}
putchar(' ');
+ if (family == AF_INET6)
+ PRINTF("inet6 ");
+
+ if (np->in_redir & (NAT_REWRITE|NAT_ENCAP|NAT_DIVERTUDP)) {
+ if ((proto != 0) || (np->in_flags & IPN_TCPUDP)) {
+ PRINTF("proto ");
+ printproto(pr, proto, np);
+ putchar(' ');
+ }
+ }
+
if (np->in_flags & IPN_FILTER) {
if (np->in_flags & IPN_NOTSRC)
- printf("! ");
- printf("from ");
- if (np->in_redir == NAT_REDIRECT) {
- printhostmask(4, (u_32_t *)&np->in_srcip,
- (u_32_t *)&np->in_srcmsk);
- } else {
- printhostmask(4, (u_32_t *)&np->in_inip,
- (u_32_t *)&np->in_inmsk);
- }
+ PRINTF("! ");
+ PRINTF("from ");
+ printnataddr(np->in_v[0], np->in_names, &np->in_osrc,
+ np->in_ifnames[0]);
if (np->in_scmp)
- printportcmp(np->in_p, &np->in_tuc.ftu_src);
+ printportcmp(proto, &np->in_tuc.ftu_src);
if (np->in_flags & IPN_NOTDST)
- printf(" !");
- printf(" to ");
- if (np->in_redir == NAT_REDIRECT) {
- printhostmask(4, (u_32_t *)&np->in_outip,
- (u_32_t *)&np->in_outmsk);
- } else {
- printhostmask(4, (u_32_t *)&np->in_srcip,
- (u_32_t *)&np->in_srcmsk);
- }
+ PRINTF(" !");
+ PRINTF(" to ");
+ printnataddr(np->in_v[0], np->in_names, &np->in_odst,
+ np->in_ifnames[0]);
if (np->in_dcmp)
- printportcmp(np->in_p, &np->in_tuc.ftu_dst);
+ printportcmp(proto, &np->in_tuc.ftu_dst);
}
- if (np->in_redir == NAT_REDIRECT) {
- if (!(np->in_flags & IPN_FILTER)) {
- printf("%s", inet_ntoa(np->in_out[0].in4));
- bits = count4bits(np->in_outmsk);
- if (bits != -1)
- printf("/%d", bits);
+ if (np->in_redir & (NAT_ENCAP|NAT_DIVERTUDP)) {
+ PRINTF(" -> src ");
+ printnataddr(np->in_v[1], np->in_names, &np->in_nsrc,
+ np->in_ifnames[0]);
+ if ((np->in_redir & NAT_DIVERTUDP) != 0)
+ PRINTF(",%u", np->in_spmin);
+ PRINTF(" dst ");
+ printnataddr(np->in_v[1], np->in_names, &np->in_ndst,
+ np->in_ifnames[0]);
+ if ((np->in_redir & NAT_DIVERTUDP) != 0)
+ PRINTF(",%u udp", np->in_dpmin);
+ if ((np->in_flags & IPN_PURGE) != 0)
+ PRINTF(" purge");
+ PRINTF(";\n");
+
+ } else if (np->in_redir & NAT_REWRITE) {
+ PRINTF(" -> src ");
+ if (np->in_nsrc.na_type == IPLT_DSTLIST) {
+ PRINTF("dstlist/");
+ if (np->in_nsrc.na_subtype == 0)
+ PRINTF("%d", np->in_nsrc.na_num);
else
- printf("/%s", inet_ntoa(np->in_out[1].in4));
+ PRINTF("%s", base + np->in_nsrc.na_num);
+ } else {
+ printnataddr(np->in_v[1], np->in_names, &np->in_nsrc,
+ np->in_ifnames[0]);
+ }
+ if ((((np->in_flags & IPN_TCPUDP) != 0)) &&
+ (np->in_spmin != 0)) {
+ if ((np->in_flags & IPN_FIXEDSPORT) != 0) {
+ PRINTF(",port = %u", np->in_spmin);
+ } else {
+ PRINTF(",%u", np->in_spmin);
+ if (np->in_spmax != np->in_spmin)
+ PRINTF("-%u", np->in_spmax);
+ }
+ }
+ PRINTF(" dst ");
+ if (np->in_ndst.na_type == IPLT_DSTLIST) {
+ PRINTF("dstlist/");
+ if (np->in_ndst.na_subtype == 0)
+ PRINTF("%d", np->in_nsrc.na_num);
+ else
+ PRINTF("%s", base + np->in_ndst.na_num);
+ } else {
+ printnataddr(np->in_v[1], np->in_names, &np->in_ndst,
+ np->in_ifnames[0]);
+ }
+ if ((((np->in_flags & IPN_TCPUDP) != 0)) &&
+ (np->in_dpmin != 0)) {
+ if ((np->in_flags & IPN_FIXEDDPORT) != 0) {
+ PRINTF(",port = %u", np->in_dpmin);
+ } else {
+ PRINTF(",%u", np->in_dpmin);
+ if (np->in_dpmax != np->in_dpmin)
+ PRINTF("-%u", np->in_dpmax);
+ }
+ }
+ if ((np->in_flags & IPN_PURGE) != 0)
+ PRINTF(" purge");
+ PRINTF(";\n");
+
+ } else if (np->in_redir == NAT_REDIRECT) {
+ if (!(np->in_flags & IPN_FILTER)) {
+ printnataddr(np->in_v[0], np->in_names, &np->in_odst,
+ np->in_ifnames[0]);
if (np->in_flags & IPN_TCPUDP) {
- printf(" port %d", ntohs(np->in_pmin));
- if (np->in_pmax != np->in_pmin)
- printf("-%d", ntohs(np->in_pmax));
+ PRINTF(" port %d", np->in_odport);
+ if (np->in_odport != np->in_dtop)
+ PRINTF("-%d", np->in_dtop);
}
}
- printf(" -> %s", inet_ntoa(np->in_in[0].in4));
- if (np->in_flags & IPN_SPLIT)
- printf(",%s", inet_ntoa(np->in_in[1].in4));
- else if (np->in_inmsk == 0 && np->in_inip == 0)
- printf("/0");
+ if (np->in_flags & IPN_NO) {
+ putchar(' ');
+ printproto(pr, proto, np);
+ PRINTF(";\n");
+ return;
+ }
+ PRINTF(" -> ");
+ printnataddr(np->in_v[1], np->in_names, &np->in_ndst,
+ np->in_ifnames[0]);
if (np->in_flags & IPN_TCPUDP) {
if ((np->in_flags & IPN_FIXEDDPORT) != 0)
- printf(" port = %d", ntohs(np->in_pnext));
- else
- printf(" port %d", ntohs(np->in_pnext));
+ PRINTF(" port = %d", np->in_dpmin);
+ else {
+ PRINTF(" port %d", np->in_dpmin);
+ if (np->in_dpmin != np->in_dpmax)
+ PRINTF("-%d", np->in_dpmax);
+ }
}
putchar(' ');
- printproto(pr, np->in_p, np);
+ printproto(pr, proto, np);
if (np->in_flags & IPN_ROUNDR)
- printf(" round-robin");
+ PRINTF(" round-robin");
if (np->in_flags & IPN_FRAG)
- printf(" frag");
+ PRINTF(" frag");
if (np->in_age[0] != 0 || np->in_age[1] != 0) {
- printf(" age %d/%d", np->in_age[0], np->in_age[1]);
+ PRINTF(" age %d/%d", np->in_age[0], np->in_age[1]);
}
if (np->in_flags & IPN_STICKY)
- printf(" sticky");
+ PRINTF(" sticky");
if (np->in_mssclamp != 0)
- printf(" mssclamp %d", np->in_mssclamp);
- if (*np->in_plabel != '\0')
- printf(" proxy %.*s", (int)sizeof(np->in_plabel),
- np->in_plabel);
+ PRINTF(" mssclamp %d", np->in_mssclamp);
+ if (np->in_plabel != -1)
+ PRINTF(" proxy %s", np->in_names + np->in_plabel);
if (np->in_tag.ipt_tag[0] != '\0')
- printf(" tag %-.*s", IPFTAG_LEN, np->in_tag.ipt_tag);
- printf("\n");
+ PRINTF(" tag %-.*s", IPFTAG_LEN, np->in_tag.ipt_tag);
+ if ((np->in_flags & IPN_PURGE) != 0)
+ PRINTF(" purge");
+ PRINTF("\n");
if (opts & OPT_DEBUG)
- printf("\tpmax %u\n", np->in_pmax);
+ PRINTF("\tpmax %u\n", np->in_dpmax);
+
} else {
int protoprinted = 0;
if (!(np->in_flags & IPN_FILTER)) {
- printf("%s/", inet_ntoa(np->in_in[0].in4));
- bits = count4bits(np->in_inmsk);
- if (bits != -1)
- printf("%d", bits);
- else
- printf("%s", inet_ntoa(np->in_in[1].in4));
+ printnataddr(np->in_v[0], np->in_names, &np->in_osrc,
+ np->in_ifnames[0]);
}
- printf(" -> ");
- if (np->in_flags & IPN_IPRANGE) {
- printf("range %s-", inet_ntoa(np->in_out[0].in4));
- printf("%s", inet_ntoa(np->in_out[1].in4));
+ if (np->in_flags & IPN_NO) {
+ putchar(' ');
+ printproto(pr, proto, np);
+ PRINTF(";\n");
+ return;
+ }
+ PRINTF(" -> ");
+ if (np->in_flags & IPN_SIPRANGE) {
+ PRINTF("range ");
+ printnataddr(np->in_v[1], np->in_names, &np->in_nsrc,
+ np->in_ifnames[0]);
} else {
- printf("%s/", inet_ntoa(np->in_out[0].in4));
- bits = count4bits(np->in_outmsk);
- if (bits != -1)
- printf("%d", bits);
- else
- printf("%s", inet_ntoa(np->in_out[1].in4));
+ printnataddr(np->in_v[1], np->in_names, &np->in_nsrc,
+ np->in_ifnames[0]);
}
- if (*np->in_plabel != '\0') {
- printf(" proxy port ");
- if (np->in_dcmp != 0)
- np->in_dport = htons(np->in_dport);
- if (np->in_dport != 0) {
+ if (np->in_plabel != -1) {
+ PRINTF(" proxy port ");
+ if (np->in_odport != 0) {
char *s;
- s = portname(np->in_p, ntohs(np->in_dport));
+ s = portname(proto, np->in_odport);
if (s != NULL)
fputs(s, stdout);
else
fputs("???", stdout);
}
- printf(" %.*s/", (int)sizeof(np->in_plabel),
- np->in_plabel);
- printproto(pr, np->in_p, NULL);
+ PRINTF(" %s/", np->in_names + np->in_plabel);
+ printproto(pr, proto, NULL);
protoprinted = 1;
} else if (np->in_redir == NAT_MAPBLK) {
- if ((np->in_pmin == 0) &&
+ if ((np->in_spmin == 0) &&
(np->in_flags & IPN_AUTOPORTMAP))
- printf(" ports auto");
+ PRINTF(" ports auto");
else
- printf(" ports %d", np->in_pmin);
+ PRINTF(" ports %d", np->in_spmin);
if (opts & OPT_DEBUG)
- printf("\n\tip modulous %d", np->in_pmax);
- } else if (np->in_pmin || np->in_pmax) {
+ PRINTF("\n\tip modulous %d", np->in_spmax);
+
+ } else if (np->in_spmin || np->in_spmax) {
if (np->in_flags & IPN_ICMPQUERY) {
- printf(" icmpidmap ");
+ PRINTF(" icmpidmap ");
} else {
- printf(" portmap ");
+ PRINTF(" portmap ");
}
- printproto(pr, np->in_p, np);
+ printproto(pr, proto, np);
protoprinted = 1;
if (np->in_flags & IPN_AUTOPORTMAP) {
- printf(" auto");
+ PRINTF(" auto");
if (opts & OPT_DEBUG)
- printf(" [%d:%d %d %d]",
- ntohs(np->in_pmin),
- ntohs(np->in_pmax),
+ PRINTF(" [%d:%d %d %d]",
+ np->in_spmin, np->in_spmax,
np->in_ippip, np->in_ppip);
} else {
- printf(" %d:%d", ntohs(np->in_pmin),
- ntohs(np->in_pmax));
+ PRINTF(" %d:%d", np->in_spmin, np->in_spmax);
}
+ if (np->in_flags & IPN_SEQUENTIAL)
+ PRINTF(" sequential");
}
if (np->in_flags & IPN_FRAG)
- printf(" frag");
+ PRINTF(" frag");
if (np->in_age[0] != 0 || np->in_age[1] != 0) {
- printf(" age %d/%d", np->in_age[0], np->in_age[1]);
+ PRINTF(" age %d/%d", np->in_age[0], np->in_age[1]);
}
if (np->in_mssclamp != 0)
- printf(" mssclamp %d", np->in_mssclamp);
+ PRINTF(" mssclamp %d", np->in_mssclamp);
if (np->in_tag.ipt_tag[0] != '\0')
- printf(" tag %s", np->in_tag.ipt_tag);
- if (!protoprinted && (np->in_flags & IPN_TCPUDP || np->in_p)) {
+ PRINTF(" tag %s", np->in_tag.ipt_tag);
+ if (!protoprinted && (np->in_flags & IPN_TCPUDP || proto)) {
putchar(' ');
- printproto(pr, np->in_p, np);
+ printproto(pr, proto, np);
}
- if (np->in_flags & IPN_SEQUENTIAL)
- printf(" sequential");
- printf("\n");
+ if ((np->in_flags & IPN_PURGE) != 0)
+ PRINTF(" purge");
+ PRINTF("\n");
if (opts & OPT_DEBUG) {
- struct in_addr nip;
-
- nip.s_addr = htonl(np->in_nextip.s_addr);
-
- printf("\tnextip %s pnext %d\n",
- inet_ntoa(nip), np->in_pnext);
+ PRINTF("\tnextip ");
+ printip(family, &np->in_snip);
+ PRINTF(" pnext %d\n", np->in_spnext);
}
}
if (opts & OPT_DEBUG) {
- printf("\tspace %lu use %u hits %lu flags %#x proto %d hv %d\n",
+ PRINTF("\tspace %lu use %u hits %lu flags %#x proto %d/%d",
np->in_space, np->in_use, np->in_hits,
- np->in_flags, np->in_p, np->in_hv);
- printf("\tifp[0] %p ifp[1] %p apr %p\n",
+ np->in_flags, np->in_pr[0], np->in_pr[1]);
+ PRINTF(" hv %u/%u\n", np->in_hv[0], np->in_hv[1]);
+ PRINTF("\tifp[0] %p ifp[1] %p apr %p\n",
np->in_ifps[0], np->in_ifps[1], np->in_apr);
- printf("\ttqehead %p/%p comment %p\n",
+ PRINTF("\ttqehead %p/%p comment %p\n",
np->in_tqehead[0], np->in_tqehead[1], np->in_comment);
}
}
diff --git a/contrib/ipfilter/lib/printnataddr.c b/contrib/ipfilter/lib/printnataddr.c
new file mode 100644
index 0000000..89faa62
--- /dev/null
+++ b/contrib/ipfilter/lib/printnataddr.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * Added redirect stuff and a variety of bug fixes. (mcn@EnGarde.com)
+ */
+
+#include "ipf.h"
+#include "kmem.h"
+
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: printnataddr.c,v 1.4.2.2 2012/07/22 08:04:24 darren_r Exp $";
+#endif
+
+
+void
+printnataddr(v, base, addr, ifidx)
+ int v;
+ char *base;
+ nat_addr_t *addr;
+ int ifidx;
+{
+ switch (v)
+ {
+ case 4 :
+ if (addr->na_atype == FRI_NORMAL &&
+ addr->na_addr[0].in4.s_addr == 0) {
+ PRINTF("0/%d", count4bits(addr->na_addr[1].in4.s_addr));
+ } else {
+ printaddr(AF_INET, addr->na_atype, base, ifidx,
+ (u_32_t *)&addr->na_addr[0].in4.s_addr,
+ (u_32_t *)&addr->na_addr[1].in4.s_addr);
+ }
+ break;
+#ifdef USE_INET6
+ case 6 :
+ printaddr(AF_INET6, addr->na_atype, base, ifidx,
+ (u_32_t *)&addr->na_addr[0].in6,
+ (u_32_t *)&addr->na_addr[1].in6);
+ break;
+#endif
+ default :
+ printf("{v=%d}", v);
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printnatfield.c b/contrib/ipfilter/lib/printnatfield.c
new file mode 100644
index 0000000..49596f6
--- /dev/null
+++ b/contrib/ipfilter/lib/printnatfield.c
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printnatfield.c,v 1.6.2.2 2012/01/26 05:44:26 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+wordtab_t natfields[] = {
+ { "all", -2 },
+ { "ifp0", 1 },
+ { "ifp1", 2 },
+ { "mtu0", 3 },
+ { "mtu1", 4 },
+ { "ifname0", 5 },
+ { "ifname1", 6 },
+ { "sumd0", 7 },
+ { "sumd1", 8 },
+ { "pkts0", 9 },
+ { "pkts1", 10 },
+ { "bytes0", 11 },
+ { "bytes1", 12 },
+ { "proto0", 13 },
+ { "proto1", 14 },
+ { "hash0", 15 },
+ { "hash1", 16 },
+ { "ref", 17 },
+ { "rev", 18 },
+ { "v0", 19 },
+ { "redir", 20 },
+ { "use", 21 },
+ { "ipsumd", 22 },
+ { "dir", 23 },
+ { "olddstip", 24 },
+ { "oldsrcip", 25 },
+ { "newdstip", 26 },
+ { "newsrcip", 27 },
+ { "olddport", 28 },
+ { "oldsport", 29 },
+ { "newdport", 30 },
+ { "newsport", 31 },
+ { "age", 32 },
+ { "v1", 33 },
+ { NULL, 0 }
+};
+
+
+void
+printnatfield(n, fieldnum)
+ nat_t *n;
+ int fieldnum;
+{
+ int i;
+
+ switch (fieldnum)
+ {
+ case -2 :
+ for (i = 1; natfields[i].w_word != NULL; i++) {
+ if (natfields[i].w_value > 0) {
+ printnatfield(n, i);
+ if (natfields[i + 1].w_value > 0)
+ putchar('\t');
+ }
+ }
+ break;
+
+ case 1:
+ PRINTF("%#lx", (u_long)n->nat_ifps[0]);
+ break;
+
+ case 2:
+ PRINTF("%#lx", (u_long)n->nat_ifps[1]);
+ break;
+
+ case 3:
+ PRINTF("%d", n->nat_mtu[0]);
+ break;
+
+ case 4:
+ PRINTF("%d", n->nat_mtu[1]);
+ break;
+
+ case 5:
+ PRINTF("%s", n->nat_ifnames[0]);
+ break;
+
+ case 6:
+ PRINTF("%s", n->nat_ifnames[1]);
+ break;
+
+ case 7:
+ PRINTF("%d", n->nat_sumd[0]);
+ break;
+
+ case 8:
+ PRINTF("%d", n->nat_sumd[1]);
+ break;
+
+ case 9:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", n->nat_pkts[0]);
+#else
+ PRINTF("%lu", n->nat_pkts[0]);
+#endif
+ break;
+
+ case 10:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", n->nat_pkts[1]);
+#else
+ PRINTF("%lu", n->nat_pkts[1]);
+#endif
+ break;
+
+ case 11:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", n->nat_bytes[0]);
+#else
+ PRINTF("%lu", n->nat_bytes[0]);
+#endif
+ break;
+
+ case 12:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", n->nat_bytes[1]);
+#else
+ PRINTF("%lu", n->nat_bytes[1]);
+#endif
+ break;
+
+ case 13:
+ PRINTF("%d", n->nat_pr[0]);
+ break;
+
+ case 14:
+ PRINTF("%d", n->nat_pr[1]);
+ break;
+
+ case 15:
+ PRINTF("%u", n->nat_hv[0]);
+ break;
+
+ case 16:
+ PRINTF("%u", n->nat_hv[1]);
+ break;
+
+ case 17:
+ PRINTF("%d", n->nat_ref);
+ break;
+
+ case 18:
+ PRINTF("%d", n->nat_rev);
+ break;
+
+ case 19:
+ PRINTF("%d", n->nat_v[0]);
+ break;
+
+ case 33:
+ PRINTF("%d", n->nat_v[0]);
+ break;
+
+ case 20:
+ PRINTF("%d", n->nat_redir);
+ break;
+
+ case 21:
+ PRINTF("%d", n->nat_use);
+ break;
+
+ case 22:
+ PRINTF("%u", n->nat_ipsumd);
+ break;
+
+ case 23:
+ PRINTF("%d", n->nat_dir);
+ break;
+
+ case 24:
+ PRINTF("%s", hostname(n->nat_v[0], &n->nat_odstip));
+ break;
+
+ case 25:
+ PRINTF("%s", hostname(n->nat_v[0], &n->nat_osrcip));
+ break;
+
+ case 26:
+ PRINTF("%s", hostname(n->nat_v[1], &n->nat_ndstip));
+ break;
+
+ case 27:
+ PRINTF("%s", hostname(n->nat_v[1], &n->nat_nsrcip));
+ break;
+
+ case 28:
+ PRINTF("%hu", ntohs(n->nat_odport));
+ break;
+
+ case 29:
+ PRINTF("%hu", ntohs(n->nat_osport));
+ break;
+
+ case 30:
+ PRINTF("%hu", ntohs(n->nat_ndport));
+ break;
+
+ case 31:
+ PRINTF("%hu", ntohs(n->nat_nsport));
+ break;
+
+ case 32:
+ PRINTF("%u", n->nat_age);
+ break;
+
+ default:
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printnatside.c b/contrib/ipfilter/lib/printnatside.c
new file mode 100644
index 0000000..37e1cb8
--- /dev/null
+++ b/contrib/ipfilter/lib/printnatside.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printnatside.c,v 1.2.2.6 2012/07/22 08:04:24 darren_r Exp $
+ */
+#include "ipf.h"
+
+void
+printnatside(side, ns)
+ char *side;
+ nat_stat_side_t *ns;
+{
+ PRINTF("%lu\tproxy create fail %s\n", ns->ns_appr_fail, side);
+ PRINTF("%lu\tproxy fail %s\n", ns->ns_ipf_proxy_fail, side);
+ PRINTF("%lu\tbad nat %s\n", ns->ns_badnat, side);
+ PRINTF("%lu\tbad nat new %s\n", ns->ns_badnatnew, side);
+ PRINTF("%lu\tbad next addr %s\n", ns->ns_badnextaddr, side);
+ PRINTF("%lu\tbucket max %s\n", ns->ns_bucket_max, side);
+ PRINTF("%lu\tclone nomem %s\n", ns->ns_clone_nomem, side);
+ PRINTF("%lu\tdecap bad %s\n", ns->ns_decap_bad, side);
+ PRINTF("%lu\tdecap fail %s\n", ns->ns_decap_fail, side);
+ PRINTF("%lu\tdecap pullup %s\n", ns->ns_decap_pullup, side);
+ PRINTF("%lu\tdivert dup %s\n", ns->ns_divert_dup, side);
+ PRINTF("%lu\tdivert exist %s\n", ns->ns_divert_exist, side);
+ PRINTF("%lu\tdrop %s\n", ns->ns_drop, side);
+ PRINTF("%lu\texhausted %s\n", ns->ns_exhausted, side);
+ PRINTF("%lu\ticmp address %s\n", ns->ns_icmp_address, side);
+ PRINTF("%lu\ticmp basic %s\n", ns->ns_icmp_basic, side);
+ PRINTF("%lu\tinuse %s\n", ns->ns_inuse, side);
+ PRINTF("%lu\ticmp mbuf wrong size %s\n", ns->ns_icmp_mbuf, side);
+ PRINTF("%lu\ticmp header unmatched %s\n", ns->ns_icmp_notfound, side);
+ PRINTF("%lu\ticmp rebuild failures %s\n", ns->ns_icmp_rebuild, side);
+ PRINTF("%lu\ticmp short %s\n", ns->ns_icmp_short, side);
+ PRINTF("%lu\ticmp packet size wrong %s\n", ns->ns_icmp_size, side);
+ PRINTF("%lu\tIFP address fetch failures %s\n",
+ ns->ns_ifpaddrfail, side);
+ PRINTF("%lu\tpackets untranslated %s\n", ns->ns_ignored, side);
+ PRINTF("%lu\tNAT insert failures %s\n", ns->ns_insert_fail, side);
+ PRINTF("%lu\tNAT lookup misses %s\n", ns->ns_lookup_miss, side);
+ PRINTF("%lu\tNAT lookup nowild %s\n", ns->ns_lookup_nowild, side);
+ PRINTF("%lu\tnew ifpaddr failed %s\n", ns->ns_new_ifpaddr, side);
+ PRINTF("%lu\tmemory requests failed %s\n", ns->ns_memfail, side);
+ PRINTF("%lu\ttable max reached %s\n", ns->ns_table_max, side);
+ PRINTF("%lu\tpackets translated %s\n", ns->ns_translated, side);
+ PRINTF("%lu\tfinalised failed %s\n", ns->ns_unfinalised, side);
+ PRINTF("%lu\tsearch wraps %s\n", ns->ns_wrap, side);
+ PRINTF("%lu\tnull translations %s\n", ns->ns_xlate_null, side);
+ PRINTF("%lu\ttranslation exists %s\n", ns->ns_xlate_exists, side);
+ PRINTF("%lu\tno memory %s\n", ns->ns_memfail, side);
+
+ if (opts & OPT_VERBOSE)
+ PRINTF("%p table %s\n", ns->ns_table, side);
+}
diff --git a/contrib/ipfilter/lib/printpacket.c b/contrib/ipfilter/lib/printpacket.c
index 25a4d5a..5c4a749 100644
--- a/contrib/ipfilter/lib/printpacket.c
+++ b/contrib/ipfilter/lib/printpacket.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printpacket.c,v 1.12.4.5 2007/09/09 22:15:30 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -15,32 +15,43 @@
#endif
-void printpacket(ip)
-struct ip *ip;
+void
+printpacket(dir, m)
+ int dir;
+ mb_t *m;
{
- struct tcphdr *tcp;
- u_short len;
- u_short off;
+ u_short len, off;
+ tcphdr_t *tcp;
+ ip_t *ip;
+
+ ip = MTOD(m, ip_t *);
if (IP_V(ip) == 6) {
- off = 0;
- len = ntohs(((u_short *)ip)[2]) + 40;
+#ifdef USE_INET6
+ len = ntohs(((ip6_t *)ip)->ip6_plen);
+#else
+ len = ntohs(((u_short *)ip)[2]);
+#endif
+ len += 40;
} else {
- off = ntohs(ip->ip_off);
len = ntohs(ip->ip_len);
}
+ ASSERT(len == msgdsize(m));
if ((opts & OPT_HEX) == OPT_HEX) {
u_char *s;
int i;
- for (s = (u_char *)ip, i = 0; i < len; i++) {
- printf("%02x", *s++ & 0xff);
- if (len - i > 1) {
- i++;
- printf("%02x", *s++ & 0xff);
+ for (; m != NULL; m = m->mb_next) {
+ len = m->mb_len;
+ for (s = (u_char *)m->mb_data, i = 0; i < len; i++) {
+ PRINTF("%02x", *s++ & 0xff);
+ if (len - i > 1) {
+ i++;
+ PRINTF("%02x", *s++ & 0xff);
+ }
+ putchar(' ');
}
- putchar(' ');
}
putchar('\n');
putchar('\n');
@@ -48,24 +59,32 @@ struct ip *ip;
}
if (IP_V(ip) == 6) {
- printpacket6(ip);
+ printpacket6(dir, m);
return;
}
+ if (dir)
+ PRINTF("> ");
+ else
+ PRINTF("< ");
+
+ PRINTF("%s ", IFNAME(m->mb_ifp));
+
+ off = ntohs(ip->ip_off);
tcp = (struct tcphdr *)((char *)ip + (IP_HL(ip) << 2));
- printf("ip #%d %d(%d) %d", ntohs(ip->ip_id), ntohs(ip->ip_len),
+ PRINTF("ip #%d %d(%d) %d", ntohs(ip->ip_id), ntohs(ip->ip_len),
IP_HL(ip) << 2, ip->ip_p);
if (off & IP_OFFMASK)
- printf(" @%d", (off & IP_OFFMASK) << 3);
- printf(" %s", inet_ntoa(ip->ip_src));
+ PRINTF(" @%d", off << 3);
+ PRINTF(" %s", inet_ntoa(ip->ip_src));
if (!(off & IP_OFFMASK))
if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
- printf(",%d", ntohs(tcp->th_sport));
- printf(" > ");
- printf("%s", inet_ntoa(ip->ip_dst));
+ PRINTF(",%d", ntohs(tcp->th_sport));
+ PRINTF(" > ");
+ PRINTF("%s", inet_ntoa(ip->ip_dst));
if (!(off & IP_OFFMASK)) {
if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
- printf(",%d", ntohs(tcp->th_dport));
+ PRINTF(",%d", ntohs(tcp->th_dport));
if ((ip->ip_p == IPPROTO_TCP) && (tcp->th_flags != 0)) {
putchar(' ');
if (tcp->th_flags & TH_FIN)
diff --git a/contrib/ipfilter/lib/printpacket6.c b/contrib/ipfilter/lib/printpacket6.c
index ca3b421..6363e55 100644
--- a/contrib/ipfilter/lib/printpacket6.c
+++ b/contrib/ipfilter/lib/printpacket6.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: printpacket6.c,v 1.3.4.1 2006/06/16 17:21:13 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
@@ -14,15 +14,17 @@
* This is meant to work without the IPv6 header files being present or
* the inet_ntop() library.
*/
-void printpacket6(ip)
-struct ip *ip;
+void
+printpacket6(dir, m)
+ int dir;
+ mb_t *m;
{
u_char *buf, p;
u_short plen, *addrs;
tcphdr_t *tcp;
u_32_t flow;
- buf = (u_char *)ip;
+ buf = (u_char *)m->mb_data;
tcp = (tcphdr_t *)(buf + 40);
p = buf[6];
flow = ntohl(*(u_32_t *)buf);
@@ -30,22 +32,29 @@ struct ip *ip;
plen = ntohs(*((u_short *)buf +2));
addrs = (u_short *)buf + 4;
- printf("ip6/%d %d %#x %d", buf[0] & 0xf, plen, flow, p);
- printf(" %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+ if (dir)
+ PRINTF("> ");
+ else
+ PRINTF("< ");
+
+ PRINTF("%s ", IFNAME(m->mb_ifp));
+
+ PRINTF("ip6/%d %d %#x %d", buf[0] & 0xf, plen, flow, p);
+ PRINTF(" %x:%x:%x:%x:%x:%x:%x:%x",
ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]),
ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]),
ntohs(addrs[6]), ntohs(addrs[7]));
if (plen >= 4)
if (p == IPPROTO_TCP || p == IPPROTO_UDP)
- (void)printf(",%d", ntohs(tcp->th_sport));
- printf(" >");
+ (void)PRINTF(",%d", ntohs(tcp->th_sport));
+ PRINTF(" >");
addrs += 8;
- printf(" %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+ PRINTF(" %x:%x:%x:%x:%x:%x:%x:%x",
ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]),
ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]),
ntohs(addrs[6]), ntohs(addrs[7]));
if (plen >= 4)
if (p == IPPROTO_TCP || p == IPPROTO_UDP)
- (void)printf(",%d", ntohs(tcp->th_dport));
+ PRINTF(",%d", ntohs(tcp->th_dport));
putchar('\n');
}
diff --git a/contrib/ipfilter/lib/printpool.c b/contrib/ipfilter/lib/printpool.c
index 4ab85fa..8d8cdcc 100644
--- a/contrib/ipfilter/lib/printpool.c
+++ b/contrib/ipfilter/lib/printpool.c
@@ -1,23 +1,23 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-ip_pool_t *printpool(pp, copyfunc, name, opts)
-ip_pool_t *pp;
-copyfunc_t copyfunc;
-char *name;
-int opts;
+ip_pool_t *
+printpool(pp, copyfunc, name, opts, fields)
+ ip_pool_t *pp;
+ copyfunc_t copyfunc;
+ char *name;
+ int opts;
+ wordtab_t *fields;
{
- ip_pool_node_t *ipnp, *ipnpn, ipn;
+ ip_pool_node_t *ipnp, *ipnpn, ipn, **pnext;
ip_pool_t ipp;
if ((*copyfunc)(pp, &ipp, sizeof(ipp)))
@@ -35,19 +35,22 @@ int opts;
ipnpn = ipp.ipo_list;
ipp.ipo_list = NULL;
+ pnext = &ipp.ipo_list;
while (ipnpn != NULL) {
ipnp = (ip_pool_node_t *)malloc(sizeof(*ipnp));
(*copyfunc)(ipnpn, ipnp, sizeof(ipn));
ipnpn = ipnp->ipn_next;
- ipnp->ipn_next = ipp.ipo_list;
- ipp.ipo_list = ipnp;
+ *pnext = ipnp;
+ pnext = &ipnp->ipn_next;
+ ipnp->ipn_next = NULL;
}
if (ipp.ipo_list == NULL) {
putchar(';');
} else {
- for (ipnp = ipp.ipo_list; ipnp != NULL; ) {
- ipnp = printpoolnode(ipnp, opts);
+ for (ipnp = ipp.ipo_list; ipnp != NULL; ipnp = ipnpn) {
+ ipnpn = printpoolnode(ipnp, opts, fields);
+ free(ipnp);
if ((opts & OPT_DEBUG) == 0) {
putchar(';');
diff --git a/contrib/ipfilter/lib/printpool_live.c b/contrib/ipfilter/lib/printpool_live.c
index e228a39..2aabf32 100644
--- a/contrib/ipfilter/lib/printpool_live.c
+++ b/contrib/ipfilter/lib/printpool_live.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -8,17 +8,16 @@
#include "ipf.h"
#include "netinet/ipl.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-
-ip_pool_t *printpool_live(pool, fd, name, opts)
-ip_pool_t *pool;
-int fd;
-char *name;
-int opts;
+ip_pool_t *
+printpool_live(pool, fd, name, opts, fields)
+ ip_pool_t *pool;
+ int fd;
+ char *name;
+ int opts;
+ wordtab_t *fields;
{
- ip_pool_node_t entry, *top, *node;
+ ip_pool_node_t entry;
ipflookupiter_t iter;
int printed, last;
ipfobj_t obj;
@@ -26,7 +25,8 @@ int opts;
if ((name != NULL) && strncmp(name, pool->ipo_name, FR_GROUPLEN))
return pool->ipo_next;
- printpooldata(pool, opts);
+ if (fields == NULL)
+ printpooldata(pool, opts);
if ((pool->ipo_flags & IPOOL_DELETE) != 0)
PRINTF("# ");
@@ -46,28 +46,17 @@ int opts;
strncpy(iter.ili_name, pool->ipo_name, FR_GROUPLEN);
last = 0;
- top = NULL;
printed = 0;
- while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
- if (entry.ipn_next == NULL)
- last = 1;
- node = malloc(sizeof(*top));
- if (node == NULL)
- break;
- bcopy(&entry, node, sizeof(entry));
- node->ipn_next = top;
- top = node;
- }
-
- while (top != NULL) {
- node = top;
- (void) printpoolnode(node, opts);
- if ((opts & OPT_DEBUG) == 0)
- putchar(';');
- top = node->ipn_next;
- free(node);
- printed++;
+ if (pool->ipo_list != NULL) {
+ while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
+ if (entry.ipn_next == NULL)
+ last = 1;
+ (void) printpoolnode(&entry, opts, fields);
+ if ((opts & OPT_DEBUG) == 0)
+ putchar(';');
+ printed++;
+ }
}
if (printed == 0)
@@ -76,8 +65,7 @@ int opts;
if ((opts & OPT_DEBUG) == 0)
PRINTF(" };\n");
- if (ioctl(fd, SIOCIPFDELTOK, &iter.ili_key) != 0)
- perror("SIOCIPFDELTOK");
+ (void) ioctl(fd,SIOCIPFDELTOK, &iter.ili_key);
return pool->ipo_next;
}
diff --git a/contrib/ipfilter/lib/printpooldata.c b/contrib/ipfilter/lib/printpooldata.c
index 8d8e962..a159177 100644
--- a/contrib/ipfilter/lib/printpooldata.c
+++ b/contrib/ipfilter/lib/printpooldata.c
@@ -1,17 +1,17 @@
/*
- * Copyright (C) 2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
+#include <ctype.h>
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-void printpooldata(pool, opts)
-ip_pool_t *pool;
-int opts;
+void
+printpooldata(pool, opts)
+ ip_pool_t *pool;
+ int opts;
{
if ((opts & OPT_DEBUG) == 0) {
@@ -19,12 +19,12 @@ int opts;
PRINTF("# 'anonymous' tree %s\n", pool->ipo_name);
if ((pool->ipo_flags & IPOOL_DELETE) != 0)
PRINTF("# ");
- PRINTF("table role = ");
+ PRINTF("table role=");
} else {
if ((pool->ipo_flags & IPOOL_DELETE) != 0)
PRINTF("# ");
PRINTF("%s: %s",
- isdigit(*pool->ipo_name) ? "Number" : "Name",
+ ISDIGIT(*pool->ipo_name) ? "Number" : "Name",
pool->ipo_name);
if ((pool->ipo_flags & IPOOL_ANON) == IPOOL_ANON)
PRINTF("(anon)");
@@ -32,40 +32,12 @@ int opts;
PRINTF("Role: ");
}
- switch (pool->ipo_unit)
- {
- case IPL_LOGIPF :
- printf("ipf");
- break;
- case IPL_LOGNAT :
- printf("nat");
- break;
- case IPL_LOGSTATE :
- printf("state");
- break;
- case IPL_LOGAUTH :
- printf("auth");
- break;
- case IPL_LOGSYNC :
- printf("sync");
- break;
- case IPL_LOGSCAN :
- printf("scan");
- break;
- case IPL_LOGLOOKUP :
- printf("lookup");
- break;
- case IPL_LOGCOUNT :
- printf("count");
- break;
- default :
- printf("unknown(%d)", pool->ipo_unit);
- }
+ printunit(pool->ipo_unit);
if ((opts & OPT_DEBUG) == 0) {
- PRINTF(" type = tree %s = %s\n",
- isdigit(*pool->ipo_name) ? "number" : "name",
- pool->ipo_name);
+ PRINTF(" type=tree %s=%s\n",
+ (!*pool->ipo_name || ISDIGIT(*pool->ipo_name)) ? \
+ "number" : "name", pool->ipo_name);
} else {
putchar(' ');
diff --git a/contrib/ipfilter/lib/printpoolfield.c b/contrib/ipfilter/lib/printpoolfield.c
new file mode 100644
index 0000000..9254ab8
--- /dev/null
+++ b/contrib/ipfilter/lib/printpoolfield.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printpoolfield.c,v 1.1.2.4 2012/01/26 05:44:26 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+wordtab_t poolfields[] = {
+ { "all", -2 },
+ { "address", 1 },
+ { "mask", 2 },
+ { "ifname", 3 },
+ { "pkts", 4 },
+ { "bytes", 5 },
+ { "family", 6 },
+ { NULL, 0 }
+};
+
+
+void
+printpoolfield(p, ptype, fieldnum)
+ void *p;
+ int ptype;
+ int fieldnum;
+{
+ addrfamily_t *a;
+ char abuf[80];
+ int i;
+
+ switch (fieldnum)
+ {
+ case -2 :
+ for (i = 1; poolfields[i].w_word != NULL; i++) {
+ if (poolfields[i].w_value > 0) {
+ printpoolfield(p, ptype, i);
+ if (poolfields[i + 1].w_value > 0)
+ putchar('\t');
+ }
+ }
+ break;
+
+ case 1:
+ if (ptype == IPLT_POOL) {
+ ip_pool_node_t *node = (ip_pool_node_t *)p;
+
+ if (node->ipn_info)
+ PRINTF("!");
+ a = &node->ipn_addr;
+ PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
+ abuf, sizeof(abuf)));
+ } else if (ptype == IPLT_HASH) {
+ iphtent_t *node = (iphtent_t *)p;
+
+ PRINTF("%s", inet_ntop(node->ipe_family,
+ &node->ipe_addr,
+ abuf, sizeof(abuf)));
+ } else if (ptype == IPLT_DSTLIST) {
+ ipf_dstnode_t *node = (ipf_dstnode_t *)p;
+
+ a = &node->ipfd_dest.fd_addr;
+ PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
+ abuf, sizeof(abuf)));
+ }
+ break;
+
+ case 2:
+ if (ptype == IPLT_POOL) {
+ ip_pool_node_t *node = (ip_pool_node_t *)p;
+
+ a = &node->ipn_mask;
+ PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
+ abuf, sizeof(abuf)));
+ } else if (ptype == IPLT_HASH) {
+ iphtent_t *node = (iphtent_t *)p;
+
+ PRINTF("%s", inet_ntop(node->ipe_family,
+ &node->ipe_mask,
+ abuf, sizeof(abuf)));
+ } else if (ptype == IPLT_DSTLIST) {
+ PRINTF("%s", "");
+ }
+ break;
+
+ case 3:
+ if (ptype == IPLT_POOL) {
+ PRINTF("%s", "");
+ } else if (ptype == IPLT_HASH) {
+ PRINTF("%s", "");
+ } else if (ptype == IPLT_DSTLIST) {
+ ipf_dstnode_t *node = (ipf_dstnode_t *)p;
+
+ if (node->ipfd_dest.fd_name == -1) {
+ PRINTF("%s", "");
+ } else {
+ PRINTF("%s", node->ipfd_names +
+ node->ipfd_dest.fd_name);
+ }
+ }
+ break;
+
+ case 4:
+ if (ptype == IPLT_POOL) {
+ ip_pool_node_t *node = (ip_pool_node_t *)p;
+
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", node->ipn_hits);
+#else
+ PRINTF("%lu", node->ipn_hits);
+#endif
+ } else if (ptype == IPLT_HASH) {
+ iphtent_t *node = (iphtent_t *)p;
+
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", node->ipe_hits);
+#else
+ PRINTF("%lu", node->ipe_hits);
+#endif
+ } else if (ptype == IPLT_DSTLIST) {
+ printf("0");
+ }
+ break;
+
+ case 5:
+ if (ptype == IPLT_POOL) {
+ ip_pool_node_t *node = (ip_pool_node_t *)p;
+
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", node->ipn_bytes);
+#else
+ PRINTF("%lu", node->ipn_bytes);
+#endif
+ } else if (ptype == IPLT_HASH) {
+ iphtent_t *node = (iphtent_t *)p;
+
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", node->ipe_bytes);
+#else
+ PRINTF("%lu", node->ipe_bytes);
+#endif
+ } else if (ptype == IPLT_DSTLIST) {
+ printf("0");
+ }
+ break;
+
+ case 6:
+ if (ptype == IPLT_POOL) {
+ ip_pool_node_t *node = (ip_pool_node_t *)p;
+
+ PRINTF("%s", familyname(node->ipn_addr.adf_family));
+ } else if (ptype == IPLT_HASH) {
+ iphtent_t *node = (iphtent_t *)p;
+
+ PRINTF("%s", familyname(node->ipe_family));
+ } else if (ptype == IPLT_DSTLIST) {
+ ipf_dstnode_t *node = (ipf_dstnode_t *)p;
+
+ a = &node->ipfd_dest.fd_addr;
+ PRINTF("%s", familyname(a->adf_family));
+ }
+ break;
+
+ default :
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printpoolnode.c b/contrib/ipfilter/lib/printpoolnode.c
index 3327b8a..aa2aed9 100644
--- a/contrib/ipfilter/lib/printpoolnode.c
+++ b/contrib/ipfilter/lib/printpoolnode.c
@@ -1,33 +1,51 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#include "ipf.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-ip_pool_node_t *printpoolnode(np, opts)
-ip_pool_node_t *np;
-int opts;
+ip_pool_node_t *
+printpoolnode(np, opts, fields)
+ ip_pool_node_t *np;
+ int opts;
+ wordtab_t *fields;
{
+ int i;
- if ((opts & OPT_DEBUG) == 0) {
+ if (fields != NULL) {
+ for (i = 0; fields[i].w_value != 0; i++) {
+ printpoolfield(np, IPLT_POOL, i);
+ if (fields[i + 1].w_value != 0)
+ printf("\t");
+ }
+ printf("\n");
+ } else if ((opts & OPT_DEBUG) == 0) {
putchar(' ');
if (np->ipn_info == 1)
PRINTF("! ");
- printip((u_32_t *)&np->ipn_addr.adf_addr.in4);
- printmask((u_32_t *)&np->ipn_mask.adf_addr);
+ printip(np->ipn_addr.adf_family,
+ (u_32_t *)&np->ipn_addr.adf_addr.in4);
+ printmask(np->ipn_addr.adf_family,
+ (u_32_t *)&np->ipn_mask.adf_addr);
} else {
PRINTF("\tAddress: %s%s", np->ipn_info ? "! " : "",
inet_ntoa(np->ipn_addr.adf_addr.in4));
- printmask((u_32_t *)&np->ipn_mask.adf_addr);
- PRINTF("\t\tHits %lu\tName %s\tRef %d\n",
- np->ipn_hits, np->ipn_name, np->ipn_ref);
+ printmask(np->ipn_addr.adf_family,
+ (u_32_t *)&np->ipn_mask.adf_addr);
+#ifdef USE_QUAD_T
+ PRINTF("\n\t\tHits %"PRIu64"\tBytes %"PRIu64"\tName %s\tRef %d\n",
+ np->ipn_hits, np->ipn_bytes,
+ np->ipn_name, np->ipn_ref);
+#else
+ PRINTF("\n\t\tHits %lu\tBytes %lu\tName %s\tRef %d\n",
+ np->ipn_hits, np->ipn_bytes,
+ np->ipn_name, np->ipn_ref);
+#endif
}
return np->ipn_next;
}
diff --git a/contrib/ipfilter/lib/printportcmp.c b/contrib/ipfilter/lib/printportcmp.c
index 6a1a461..2a5bd02 100644
--- a/contrib/ipfilter/lib/printportcmp.c
+++ b/contrib/ipfilter/lib/printportcmp.c
@@ -1,29 +1,30 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: printportcmp.c,v 1.7.4.1 2006/06/16 17:21:14 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
-void printportcmp(pr, frp)
-int pr;
-frpcmp_t *frp;
+void
+printportcmp(pr, frp)
+ int pr;
+ frpcmp_t *frp;
{
static char *pcmp1[] = { "*", "=", "!=", "<", ">", "<=", ">=",
"<>", "><", ":" };
if (frp->frp_cmp == FR_INRANGE || frp->frp_cmp == FR_OUTRANGE)
- printf(" port %d %s %d", frp->frp_port,
+ PRINTF(" port %d %s %d", frp->frp_port,
pcmp1[frp->frp_cmp], frp->frp_top);
else if (frp->frp_cmp == FR_INCRANGE)
- printf(" port %d:%d", frp->frp_port, frp->frp_top);
+ PRINTF(" port %d:%d", frp->frp_port, frp->frp_top);
else
- printf(" port %s %s", pcmp1[frp->frp_cmp],
+ PRINTF(" port %s %s", pcmp1[frp->frp_cmp],
portname(pr, frp->frp_port));
}
diff --git a/contrib/ipfilter/lib/printproto.c b/contrib/ipfilter/lib/printproto.c
index e65ec11..d411bfa 100644
--- a/contrib/ipfilter/lib/printproto.c
+++ b/contrib/ipfilter/lib/printproto.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -8,44 +8,48 @@
#if !defined(lint)
-static const char rcsid[] = "@(#)$Id: printproto.c,v 1.1.2.2 2006/06/16 17:21:14 darrenr Exp $";
+static const char rcsid[] = "@(#)$Id$";
#endif
-void printproto(pr, p, np)
-struct protoent *pr;
-int p;
-ipnat_t *np;
+void
+printproto(pr, p, np)
+ struct protoent *pr;
+ int p;
+ ipnat_t *np;
{
if (np != NULL) {
if ((np->in_flags & IPN_TCPUDP) == IPN_TCPUDP)
- printf("tcp/udp");
+ PRINTF("tcp/udp");
else if (np->in_flags & IPN_TCP)
- printf("tcp");
+ PRINTF("tcp");
else if (np->in_flags & IPN_UDP)
- printf("udp");
+ PRINTF("udp");
else if (np->in_flags & IPN_ICMPQUERY)
- printf("icmp");
+ PRINTF("icmp");
#ifdef _AIX51
/*
* To make up for "ip = 252" and "hopopt = 0" in /etc/protocols
+ * The IANA has doubled up on the definition of 0 - it is now
+ * also used for IPv6 hop-opts, so we can no longer rely on
+ * /etc/protocols providing the correct name->number mapping.
*/
- else if (np->in_p == 0)
- printf("ip");
#endif
+ else if (np->in_pr[0] == 0)
+ PRINTF("ip");
else if (pr != NULL)
- printf("%s", pr->p_name);
+ PRINTF("%s", pr->p_name);
else
- printf("%d", np->in_p);
+ PRINTF("%d", np->in_pr[0]);
} else {
#ifdef _AIX51
if (p == 0)
- printf("ip");
+ PRINTF("ip");
else
#endif
if (pr != NULL)
- printf("%s", pr->p_name);
+ PRINTF("%s", pr->p_name);
else
- printf("%d", p);
+ PRINTF("%d", p);
}
}
diff --git a/contrib/ipfilter/lib/printsbuf.c b/contrib/ipfilter/lib/printsbuf.c
index f6c633c..efda99e 100644
--- a/contrib/ipfilter/lib/printsbuf.c
+++ b/contrib/ipfilter/lib/printsbuf.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: printsbuf.c,v 1.2.4.2 2006/06/16 17:21:14 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#ifdef IPFILTER_SCAN
@@ -15,8 +15,9 @@
#include "ipf.h"
#include "netinet/ip_scan.h"
-void printsbuf(buf)
-char *buf;
+void
+printsbuf(buf)
+ char *buf;
{
u_char *s;
int i;
@@ -25,8 +26,17 @@ char *buf;
if (ISPRINT(*s))
putchar(*s);
else
- printf("\\%o", *s);
+ PRINTF("\\%o", *s);
}
}
+#else
+void printsbuf(char *buf);
+void printsbuf(buf)
+ char *buf;
+{
+#if 0
+ buf = buf; /* gcc -Wextra */
+#endif
+}
#endif
diff --git a/contrib/ipfilter/lib/printstate.c b/contrib/ipfilter/lib/printstate.c
index a8777b2..fc85a70 100644
--- a/contrib/ipfilter/lib/printstate.c
+++ b/contrib/ipfilter/lib/printstate.c
@@ -1,7 +1,7 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -9,75 +9,102 @@
#include "ipf.h"
#include "kmem.h"
-#define PRINTF (void)printf
-#define FPRINTF (void)fprintf
-ipstate_t *printstate(sp, opts, now)
-ipstate_t *sp;
-int opts;
-u_long now;
+ipstate_t *
+printstate(sp, opts, now)
+ ipstate_t *sp;
+ int opts;
+ u_long now;
{
+ struct protoent *pr;
synclist_t ipsync;
+ if ((opts & OPT_NORESOLVE) == 0)
+ pr = getprotobynumber(sp->is_p);
+ else
+ pr = NULL;
+
+ PRINTF("%d:", sp->is_v);
+ if (pr != NULL)
+ PRINTF("%s", pr->p_name);
+ else
+ PRINTF("%d", sp->is_p);
+
+ PRINTF(" src:%s", hostname(sp->is_family, &sp->is_src.in4));
+ if (sp->is_p == IPPROTO_UDP || sp->is_p == IPPROTO_TCP) {
+ if (sp->is_flags & IS_WSPORT)
+ PRINTF(",*");
+ else
+ PRINTF(",%d", ntohs(sp->is_sport));
+ }
+
+ PRINTF(" dst:%s", hostname(sp->is_family, &sp->is_dst.in4));
+ if (sp->is_p == IPPROTO_UDP || sp->is_p == IPPROTO_TCP) {
+ if (sp->is_flags & IS_WDPORT)
+ PRINTF(",*");
+ else
+ PRINTF(",%d", ntohs(sp->is_dport));
+ }
+
+ if (sp->is_p == IPPROTO_TCP) {
+ PRINTF(" state:%d/%d", sp->is_state[0], sp->is_state[1]);
+ }
+
+ PRINTF(" %ld", sp->is_die - now);
if (sp->is_phnext == NULL)
- PRINTF("ORPHAN ");
- PRINTF("%s -> ", hostname(sp->is_v, &sp->is_src.in4));
- PRINTF("%s pass %#x pr %d state %d/%d",
- hostname(sp->is_v, &sp->is_dst.in4), sp->is_pass, sp->is_p,
- sp->is_state[0], sp->is_state[1]);
- if (opts & OPT_DEBUG)
- PRINTF(" bkt %d ref %d", sp->is_hv, sp->is_ref);
- PRINTF("\n\ttag %u ttl %lu", sp->is_tag, sp->is_die - now);
+ PRINTF(" ORPHAN");
+ if (sp->is_flags & IS_CLONE)
+ PRINTF(" CLONE");
+ putchar('\n');
if (sp->is_p == IPPROTO_TCP) {
- PRINTF("\n\t%hu -> %hu %x:%x %hu<<%d:%hu<<%d\n",
- ntohs(sp->is_sport), ntohs(sp->is_dport),
+ PRINTF("\t%x:%x %hu<<%d:%hu<<%d\n",
sp->is_send, sp->is_dend,
sp->is_maxswin, sp->is_swinscale,
sp->is_maxdwin, sp->is_dwinscale);
- PRINTF("\tcmsk %04x smsk %04x s0 %08x/%08x\n",
- sp->is_smsk[0], sp->is_smsk[1],
- sp->is_s0[0], sp->is_s0[1]);
- PRINTF("\tFWD:ISN inc %x sumd %x\n",
- sp->is_isninc[0], sp->is_sumd[0]);
- PRINTF("\tREV:ISN inc %x sumd %x\n",
- sp->is_isninc[1], sp->is_sumd[1]);
+ if ((opts & OPT_VERBOSE) != 0) {
+ PRINTF("\tcmsk %04x smsk %04x isc %p s0 %08x/%08x\n",
+ sp->is_smsk[0], sp->is_smsk[1], sp->is_isc,
+ sp->is_s0[0], sp->is_s0[1]);
+ PRINTF("\tFWD: ISN inc %x sumd %x\n",
+ sp->is_isninc[0], sp->is_sumd[0]);
+ PRINTF("\tREV: ISN inc %x sumd %x\n",
+ sp->is_isninc[1], sp->is_sumd[1]);
#ifdef IPFILTER_SCAN
- PRINTF("\tsbuf[0] [");
- printsbuf(sp->is_sbuf[0]);
- PRINTF("] sbuf[1] [");
- printsbuf(sp->is_sbuf[1]);
- PRINTF("]\n");
+ PRINTF("\tsbuf[0] [");
+ printsbuf(sp->is_sbuf[0]);
+ PRINTF("] sbuf[1] [");
+ printsbuf(sp->is_sbuf[1]);
+ PRINTF("]\n");
#endif
- } else if (sp->is_p == IPPROTO_UDP) {
- PRINTF(" %hu -> %hu\n", ntohs(sp->is_sport),
- ntohs(sp->is_dport));
+ }
} else if (sp->is_p == IPPROTO_GRE) {
- PRINTF(" call %hx/%hx\n", ntohs(sp->is_gre.gs_call[0]),
+ PRINTF("\tcall %hx/%hx\n", ntohs(sp->is_gre.gs_call[0]),
ntohs(sp->is_gre.gs_call[1]));
} else if (sp->is_p == IPPROTO_ICMP
#ifdef USE_INET6
|| sp->is_p == IPPROTO_ICMPV6
#endif
- )
- PRINTF(" id %hu seq %hu type %d\n", sp->is_icmp.ici_id,
+ ) {
+ PRINTF("\tid %hu seq %hu type %d\n", sp->is_icmp.ici_id,
sp->is_icmp.ici_seq, sp->is_icmp.ici_type);
+ }
#ifdef USE_QUAD_T
- PRINTF("\tforward: pkts in %lld bytes in %lld pkts out %lld bytes out %lld\n\tbackward: pkts in %lld bytes in %lld pkts out %lld bytes out %lld\n",
+ PRINTF("\tFWD: IN pkts %"PRIu64" bytes %"PRIu64" OUT pkts %"PRIu64" bytes %"PRIu64"\n\tREV: IN pkts %"PRIu64" bytes %"PRIu64" OUT pkts %"PRIu64" bytes %"PRIu64"\n",
sp->is_pkts[0], sp->is_bytes[0],
sp->is_pkts[1], sp->is_bytes[1],
sp->is_pkts[2], sp->is_bytes[2],
sp->is_pkts[3], sp->is_bytes[3]);
#else
- PRINTF("\tforward: pkts in %ld bytes in %ld pkts out %ld bytes out %ld\n\tbackward: pkts in %ld bytes in %ld pkts out %ld bytes out %ld\n",
+ PRINTF("\tFWD: IN pkts %lu bytes %lu OUT pkts %lu bytes %lu\n\tREV: IN pkts %lu bytes %lu OUT pkts %lu bytes %lu\n",
sp->is_pkts[0], sp->is_bytes[0],
sp->is_pkts[1], sp->is_bytes[1],
sp->is_pkts[2], sp->is_bytes[2],
sp->is_pkts[3], sp->is_bytes[3]);
#endif
- PRINTF("\t");
+ PRINTF("\ttag %u pass %#x = ", sp->is_tag, sp->is_pass);
/*
* Print out bits set in the result code for the state being
@@ -135,22 +162,31 @@ u_long now;
/* a given; no? */
if (sp->is_pass & FR_KEEPSTATE) {
PRINTF(" keep state");
- if (sp->is_pass & FR_STATESYNC)
- PRINTF(" ( sync )");
+ if (sp->is_pass & (FR_STATESYNC|FR_STSTRICT|FR_STLOOSE)) {
+ PRINTF(" (");
+ if (sp->is_pass & FR_STATESYNC)
+ PRINTF(" sync");
+ if (sp->is_pass & FR_STSTRICT)
+ PRINTF(" strict");
+ if (sp->is_pass & FR_STLOOSE)
+ PRINTF(" loose");
+ PRINTF(" )");
+ }
}
- PRINTF("\tIPv%d", sp->is_v);
PRINTF("\n");
- PRINTF("\tpkt_flags & %x(%x) = %x,\t",
- sp->is_flags & 0xf, sp->is_flags,
- sp->is_flags >> 4);
- PRINTF("\tpkt_options & %x = %x, %x = %x \n", sp->is_optmsk[0],
- sp->is_opt[0], sp->is_optmsk[1], sp->is_opt[1]);
- PRINTF("\tpkt_security & %x = %x, pkt_auth & %x = %x\n",
- sp->is_secmsk, sp->is_sec, sp->is_authmsk,
- sp->is_auth);
- PRINTF("\tis_flx %#x %#x %#x %#x\n", sp->is_flx[0][0], sp->is_flx[0][1],
- sp->is_flx[1][0], sp->is_flx[1][1]);
+ if ((opts & OPT_VERBOSE) != 0) {
+ PRINTF("\tref %d", sp->is_ref);
+ PRINTF(" pkt_flags & %x(%x) = %x\n",
+ sp->is_flags & 0xf, sp->is_flags, sp->is_flags >> 4);
+ PRINTF("\tpkt_options & %x = %x, %x = %x \n", sp->is_optmsk[0],
+ sp->is_opt[0], sp->is_optmsk[1], sp->is_opt[1]);
+ PRINTF("\tpkt_security & %x = %x, pkt_auth & %x = %x\n",
+ sp->is_secmsk, sp->is_sec, sp->is_authmsk,
+ sp->is_auth);
+ PRINTF("\tis_flx %#x %#x %#x %#x\n", sp->is_flx[0][0],
+ sp->is_flx[0][1], sp->is_flx[1][0], sp->is_flx[1][1]);
+ }
PRINTF("\tinterfaces: in %s[%s", getifname(sp->is_ifp[0]),
sp->is_ifname[0]);
if (opts & OPT_DEBUG)
@@ -169,20 +205,19 @@ u_long now;
PRINTF("/%p", sp->is_ifp[3]);
PRINTF("]\n");
+ PRINTF("\tSync status: ");
if (sp->is_sync != NULL) {
-
- if (kmemcpy((char *)&ipsync, (u_long)sp->is_sync, sizeof(ipsync))) {
-
- PRINTF("\tSync status: status could not be retrieved\n");
+ if (kmemcpy((char *)&ipsync, (u_long)sp->is_sync,
+ sizeof(ipsync))) {
+ PRINTF("status could not be retrieved\n");
return NULL;
}
- PRINTF("\tSync status: idx %d num %d v %d pr %d rev %d\n",
+ PRINTF("idx %d num %d v %d pr %d rev %d\n",
ipsync.sl_idx, ipsync.sl_num, ipsync.sl_v,
ipsync.sl_p, ipsync.sl_rev);
-
} else {
- PRINTF("\tSync status: not synchronized\n");
+ PRINTF("not synchronized\n");
}
return sp->is_next;
diff --git a/contrib/ipfilter/lib/printstatefields.c b/contrib/ipfilter/lib/printstatefields.c
new file mode 100644
index 0000000..5632d84
--- /dev/null
+++ b/contrib/ipfilter/lib/printstatefields.c
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: printstatefields.c,v 1.4.2.2 2012/01/26 05:44:26 darren_r Exp $
+ */
+
+#include "ipf.h"
+
+wordtab_t statefields[] = {
+ { "all", -2 },
+ { "ifp0", 1 },
+ { "ifp1", 2 },
+ { "ifp2", 3 },
+ { "ifp3", 4 },
+ { "ifname0", 5 },
+ { "ifname1", 6 },
+ { "ifname2", 7 },
+ { "ifname3", 8 },
+ { "pkts0", 9 },
+ { "pkts1", 10 },
+ { "pkts2", 11 },
+ { "pkts3", 12 },
+ { "bytes0", 13 },
+ { "bytes1", 14 },
+ { "bytes2", 15 },
+ { "bytes3", 16 },
+ { "state0", 17 },
+ { "state1", 18 },
+ { "age0", 19 },
+ { "age1", 20 },
+ { "ref", 21 },
+ { "isn0", 22 },
+ { "isn1", 23 },
+ { "sumd0", 24 },
+ { "sumd1", 25 },
+ { "src", 26 },
+ { "dst", 27 },
+ { "sport", 28 },
+ { "dport", 29 },
+ { "icmptype", 30 },
+ { "-", 31 },
+ { "pass", 32 },
+ { "proto", 33 },
+ { "version", 34 },
+ { "hash", 35 },
+ { "tag", 36 },
+ { "flags", 37 },
+ { "rulen", 38 },
+ { "group", 39 },
+ { "flx0", 40 },
+ { "flx1", 41 },
+ { "flx2", 42 },
+ { "flx3", 43 },
+ { "opt0", 44 },
+ { "opt1", 45 },
+ { "optmsk0", 46 },
+ { "optmsk1", 47 },
+ { "sec", 48 },
+ { "secmsk", 49 },
+ { "auth", 50 },
+ { "authmsk", 51 },
+ { "icmppkts0", 52 },
+ { "icmppkts1", 53 },
+ { "icmppkts2", 54 },
+ { "icmppkts3", 55 },
+ { NULL, 0 }
+};
+
+
+void
+printstatefield(sp, fieldnum)
+ ipstate_t *sp;
+ int fieldnum;
+{
+ int i;
+
+ switch (fieldnum)
+ {
+ case -2 :
+ for (i = 1; statefields[i].w_word != NULL; i++) {
+ if (statefields[i].w_value > 0) {
+ printstatefield(sp, i);
+ if (statefields[i + 1].w_value > 0)
+ putchar('\t');
+ }
+ }
+ break;
+
+ case 1:
+ PRINTF("%#lx", (u_long)sp->is_ifp[0]);
+ break;
+
+ case 2:
+ PRINTF("%#lx", (u_long)sp->is_ifp[1]);
+ break;
+
+ case 3:
+ PRINTF("%#lx", (u_long)sp->is_ifp[2]);
+ break;
+
+ case 4:
+ PRINTF("%#lx", (u_long)sp->is_ifp[3]);
+ break;
+
+ case 5:
+ PRINTF("%s", sp->is_ifname[0]);
+ break;
+
+ case 6:
+ PRINTF("%s", sp->is_ifname[1]);
+ break;
+
+ case 7:
+ PRINTF("%s", sp->is_ifname[2]);
+ break;
+
+ case 8:
+ PRINTF("%s", sp->is_ifname[3]);
+ break;
+
+ case 9:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_pkts[0]);
+#else
+ PRINTF("%lu", sp->is_pkts[0]);
+#endif
+ break;
+
+ case 10:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_pkts[1]);
+#else
+ PRINTF("%lu", sp->is_pkts[1]);
+#endif
+ break;
+
+ case 11:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_pkts[2]);
+#else
+ PRINTF("%lu", sp->is_pkts[2]);
+#endif
+ break;
+
+ case 12:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_pkts[3]);
+#else
+ PRINTF("%lu", sp->is_pkts[3]);
+#endif
+ break;
+
+ case 13:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_bytes[0]);
+#else
+ PRINTF("%lu", sp->is_bytes[0]);
+#endif
+ break;
+
+ case 14:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_bytes[1]);
+#else
+ PRINTF("%lu", sp->is_bytes[1]);
+#endif
+ break;
+
+ case 15:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_bytes[2]);
+#else
+ PRINTF("%lu", sp->is_bytes[2]);
+#endif
+ break;
+
+ case 16:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_bytes[3]);
+#else
+ PRINTF("%lu", sp->is_bytes[3]);
+#endif
+ break;
+
+ case 17:
+ PRINTF("%d", sp->is_state[0]);
+ break;
+
+ case 18:
+ PRINTF("%d", sp->is_state[1]);
+ break;
+
+ case 19:
+ PRINTF("%d", sp->is_frage[0]);
+ break;
+
+ case 20:
+ PRINTF("%d", sp->is_frage[1]);
+ break;
+
+ case 21:
+ PRINTF("%d", sp->is_ref);
+ break;
+
+ case 22:
+ PRINTF("%d", sp->is_isninc[0]);
+ break;
+
+ case 23:
+ PRINTF("%d", sp->is_isninc[1]);
+ break;
+
+ case 24:
+ PRINTF("%hd", sp->is_sumd[0]);
+ break;
+
+ case 25:
+ PRINTF("%hd", sp->is_sumd[1]);
+ break;
+
+ case 26:
+ PRINTF("%s", hostname(sp->is_v, &sp->is_src.in4));
+ break;
+
+ case 27:
+ PRINTF("%s", hostname(sp->is_v, &sp->is_dst.in4));
+ break;
+
+ case 28:
+ PRINTF("%hu", ntohs(sp->is_sport));
+ break;
+
+ case 29:
+ PRINTF("%hu", ntohs(sp->is_dport));
+ break;
+
+ case 30:
+ PRINTF("%d", sp->is_type);
+ break;
+
+ case 32:
+ PRINTF("%#x", sp->is_pass);
+ break;
+
+ case 33:
+ PRINTF("%d", sp->is_p);
+ break;
+
+ case 34:
+ PRINTF("%d", sp->is_v);
+ break;
+
+ case 35:
+ PRINTF("%d", sp->is_hv);
+ break;
+
+ case 36:
+ PRINTF("%d", sp->is_tag);
+ break;
+
+ case 37:
+ PRINTF("%#x", sp->is_flags);
+ break;
+
+ case 38:
+ PRINTF("%d", sp->is_rulen);
+ break;
+
+ case 39:
+ PRINTF("%s", sp->is_group);
+ break;
+
+ case 40:
+ PRINTF("%#x", sp->is_flx[0][0]);
+ break;
+
+ case 41:
+ PRINTF("%#x", sp->is_flx[0][1]);
+ break;
+
+ case 42:
+ PRINTF("%#x", sp->is_flx[1][0]);
+ break;
+
+ case 43:
+ PRINTF("%#x", sp->is_flx[1][1]);
+ break;
+
+ case 44:
+ PRINTF("%#x", sp->is_opt[0]);
+ break;
+
+ case 45:
+ PRINTF("%#x", sp->is_opt[1]);
+ break;
+
+ case 46:
+ PRINTF("%#x", sp->is_optmsk[0]);
+ break;
+
+ case 47:
+ PRINTF("%#x", sp->is_optmsk[1]);
+ break;
+
+ case 48:
+ PRINTF("%#x", sp->is_sec);
+ break;
+
+ case 49:
+ PRINTF("%#x", sp->is_secmsk);
+ break;
+
+ case 50:
+ PRINTF("%#x", sp->is_auth);
+ break;
+
+ case 51:
+ PRINTF("%#x", sp->is_authmsk);
+ break;
+
+ case 52:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_icmppkts[0]);
+#else
+ PRINTF("%lu", sp->is_icmppkts[0]);
+#endif
+ break;
+
+ case 53:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_icmppkts[1]);
+#else
+ PRINTF("%lu", sp->is_icmppkts[1]);
+#endif
+ break;
+
+ case 54:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_icmppkts[2]);
+#else
+ PRINTF("%lu", sp->is_icmppkts[2]);
+#endif
+ break;
+
+ case 55:
+#ifdef USE_QUAD_T
+ PRINTF("%"PRIu64"", sp->is_icmppkts[3]);
+#else
+ PRINTF("%lu", sp->is_icmppkts[3]);
+#endif
+ break;
+
+ default:
+ break;
+ }
+}
diff --git a/contrib/ipfilter/lib/printtcpflags.c b/contrib/ipfilter/lib/printtcpflags.c
new file mode 100644
index 0000000..9860780
--- /dev/null
+++ b/contrib/ipfilter/lib/printtcpflags.c
@@ -0,0 +1,30 @@
+#include "ipf.h"
+
+
+void
+printtcpflags(tcpf, tcpfm)
+ u_32_t tcpf, tcpfm;
+{
+ u_char *t;
+ char *s;
+
+ if (tcpf & ~TCPF_ALL) {
+ PRINTF("0x%x", tcpf);
+ } else {
+ for (s = flagset, t = flags; *s; s++, t++) {
+ if (tcpf & *t)
+ (void)putchar(*s);
+ }
+ }
+
+ if (tcpfm) {
+ (void)putchar('/');
+ if (tcpfm & ~TCPF_ALL) {
+ PRINTF("0x%x", tcpfm);
+ } else {
+ for (s = flagset, t = flags; *s; s++, t++)
+ if (tcpfm & *t)
+ (void)putchar(*s);
+ }
+ }
+}
diff --git a/contrib/ipfilter/lib/printtqtable.c b/contrib/ipfilter/lib/printtqtable.c
index 67adb53..ffb512d 100644
--- a/contrib/ipfilter/lib/printtqtable.c
+++ b/contrib/ipfilter/lib/printtqtable.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
@@ -9,17 +9,18 @@
#include "ipf.h"
-void printtqtable(table)
-ipftq_t *table;
+void
+printtqtable(table)
+ ipftq_t *table;
{
int i;
- printf("TCP Entries per state\n");
+ PRINTF("TCP Entries per state\n");
for (i = 0; i < IPF_TCP_NSTATES; i++)
- printf(" %5d", i);
- printf("\n");
+ PRINTF(" %5d", i);
+ PRINTF("\n");
for (i = 0; i < IPF_TCP_NSTATES; i++)
- printf(" %5d", table[i].ifq_ref - 1);
- printf("\n");
+ PRINTF(" %5d", table[i].ifq_ref - 1);
+ PRINTF("\n");
}
diff --git a/contrib/ipfilter/lib/printtunable.c b/contrib/ipfilter/lib/printtunable.c
index aa7ae5d..aa82841 100644
--- a/contrib/ipfilter/lib/printtunable.c
+++ b/contrib/ipfilter/lib/printtunable.c
@@ -1,29 +1,30 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: printtunable.c,v 1.1.4.1 2006/06/16 17:21:15 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
-void printtunable(tup)
-ipftune_t *tup;
+void
+printtunable(tup)
+ ipftune_t *tup;
{
- printf("%s\tmin %#lx\tmax %#lx\tcurrent ",
+ PRINTF("%s\tmin %lu\tmax %lu\tcurrent ",
tup->ipft_name, tup->ipft_min, tup->ipft_max);
if (tup->ipft_sz == sizeof(u_long))
- printf("%lu\n", tup->ipft_vlong);
+ PRINTF("%lu\n", tup->ipft_vlong);
else if (tup->ipft_sz == sizeof(u_int))
- printf("%u\n", tup->ipft_vint);
+ PRINTF("%u\n", tup->ipft_vint);
else if (tup->ipft_sz == sizeof(u_short))
- printf("%hu\n", tup->ipft_vshort);
+ PRINTF("%hu\n", tup->ipft_vshort);
else if (tup->ipft_sz == sizeof(u_char))
- printf("%u\n", (u_int)tup->ipft_vchar);
+ PRINTF("%u\n", (u_int)tup->ipft_vchar);
else {
- printf("sz = %d\n", tup->ipft_sz);
+ PRINTF("sz = %d\n", tup->ipft_sz);
}
}
diff --git a/contrib/ipfilter/lib/printunit.c b/contrib/ipfilter/lib/printunit.c
new file mode 100644
index 0000000..bac3d45
--- /dev/null
+++ b/contrib/ipfilter/lib/printunit.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+#include "ipf.h"
+
+
+void
+printunit(unit)
+ int unit;
+{
+
+ switch (unit)
+ {
+ case IPL_LOGIPF :
+ PRINTF("ipf");
+ break;
+ case IPL_LOGNAT :
+ PRINTF("nat");
+ break;
+ case IPL_LOGSTATE :
+ PRINTF("state");
+ break;
+ case IPL_LOGAUTH :
+ PRINTF("auth");
+ break;
+ case IPL_LOGSYNC :
+ PRINTF("sync");
+ break;
+ case IPL_LOGSCAN :
+ PRINTF("scan");
+ break;
+ case IPL_LOGLOOKUP :
+ PRINTF("lookup");
+ break;
+ case IPL_LOGCOUNT :
+ PRINTF("count");
+ break;
+ case IPL_LOGALL :
+ PRINTF("all");
+ break;
+ default :
+ PRINTF("unknown(%d)", unit);
+ }
+}
diff --git a/contrib/ipfilter/lib/remove_hash.c b/contrib/ipfilter/lib/remove_hash.c
index 297db48..a60c1fd 100644
--- a/contrib/ipfilter/lib/remove_hash.c
+++ b/contrib/ipfilter/lib/remove_hash.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: remove_hash.c,v 1.1.4.1 2006/06/16 17:21:16 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,19 +14,16 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_htable.h"
-static int hashfd = -1;
-
-int remove_hash(iphp, iocfunc)
-iphtable_t *iphp;
-ioctlfunc_t iocfunc;
+int
+remove_hash(iphp, iocfunc)
+ iphtable_t *iphp;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
iphtable_t iph;
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
- hashfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_type = IPLT_HASH;
@@ -43,11 +40,11 @@ ioctlfunc_t iocfunc;
strncpy(iph.iph_name, iphp->iph_name, sizeof(iph.iph_name));
iph.iph_flags = iphp->iph_flags;
- if ((*iocfunc)(hashfd, SIOCLOOKUPDELTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op)) {
if ((opts & OPT_DONOTHING) == 0) {
- perror("remove_hash:SIOCLOOKUPDELTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "remove lookup hash table");
}
-
+ }
return 0;
}
diff --git a/contrib/ipfilter/lib/remove_hashnode.c b/contrib/ipfilter/lib/remove_hashnode.c
index 47a19dc..58e9125 100644
--- a/contrib/ipfilter/lib/remove_hashnode.c
+++ b/contrib/ipfilter/lib/remove_hashnode.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: remove_hashnode.c,v 1.1.4.1 2006/06/16 17:21:16 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,21 +14,18 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_htable.h"
-static int hashfd = -1;
-
-int remove_hashnode(unit, name, node, iocfunc)
-int unit;
-char *name;
-iphtent_t *node;
-ioctlfunc_t iocfunc;
+int
+remove_hashnode(unit, name, node, iocfunc)
+ int unit;
+ char *name;
+ iphtent_t *node;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
iphtent_t ipe;
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
- hashfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((hashfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_type = IPLT_HASH;
@@ -49,10 +46,11 @@ ioctlfunc_t iocfunc;
printf("%s\n", inet_ntoa(ipe.ipe_mask.in4));
}
- if ((*iocfunc)(hashfd, SIOCLOOKUPDELNODE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op)) {
if (!(opts & OPT_DONOTHING)) {
- perror("remove_hash:SIOCLOOKUPDELNODE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "remove lookup hash node");
}
+ }
return 0;
}
diff --git a/contrib/ipfilter/lib/remove_pool.c b/contrib/ipfilter/lib/remove_pool.c
index 1e7fe5f..8e75549 100644
--- a/contrib/ipfilter/lib/remove_pool.c
+++ b/contrib/ipfilter/lib/remove_pool.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: remove_pool.c,v 1.1.4.1 2006/06/16 17:21:16 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,19 +14,16 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_htable.h"
-static int poolfd = -1;
-
-int remove_pool(poolp, iocfunc)
-ip_pool_t *poolp;
-ioctlfunc_t iocfunc;
+int
+remove_pool(poolp, iocfunc)
+ ip_pool_t *poolp;
+ ioctlfunc_t iocfunc;
{
iplookupop_t op;
ip_pool_t pool;
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
- poolfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_type = IPLT_POOL;
@@ -40,11 +37,11 @@ ioctlfunc_t iocfunc;
strncpy(pool.ipo_name, poolp->ipo_name, sizeof(pool.ipo_name));
pool.ipo_flags = poolp->ipo_flags;
- if ((*iocfunc)(poolfd, SIOCLOOKUPDELTABLE, &op))
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELTABLE, &op)) {
if ((opts & OPT_DONOTHING) == 0) {
- perror("remove_pool:SIOCLOOKUPDELTABLE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "delete lookup pool");
}
-
+ }
return 0;
}
diff --git a/contrib/ipfilter/lib/remove_poolnode.c b/contrib/ipfilter/lib/remove_poolnode.c
index c80ff70..0b78118 100644
--- a/contrib/ipfilter/lib/remove_poolnode.c
+++ b/contrib/ipfilter/lib/remove_poolnode.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: remove_poolnode.c,v 1.3.2.1 2006/06/16 17:21:16 darrenr Exp $
+ * $Id$
*/
#include <fcntl.h>
@@ -14,21 +14,18 @@
#include "netinet/ip_lookup.h"
#include "netinet/ip_pool.h"
-static int poolfd = -1;
-
-int remove_poolnode(unit, name, node, iocfunc)
-int unit;
-char *name;
-ip_pool_node_t *node;
-ioctlfunc_t iocfunc;
+int
+remove_poolnode(unit, name, node, iocfunc)
+ int unit;
+ char *name;
+ ip_pool_node_t *node;
+ ioctlfunc_t iocfunc;
{
ip_pool_node_t pn;
iplookupop_t op;
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
- poolfd = open(IPLOOKUP_NAME, O_RDWR);
- if ((poolfd == -1) && ((opts & OPT_DONOTHING) == 0))
+ if (pool_open() == -1)
return -1;
op.iplo_unit = unit;
@@ -46,10 +43,10 @@ ioctlfunc_t iocfunc;
pn.ipn_info = node->ipn_info;
strncpy(pn.ipn_name, node->ipn_name, sizeof(pn.ipn_name));
- if ((*iocfunc)(poolfd, SIOCLOOKUPDELNODE, &op)) {
+ if (pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op)) {
if ((opts & OPT_DONOTHING) == 0) {
- perror("remove_pool:SIOCLOOKUPDELNODE");
- return -1;
+ return ipf_perror_fd(pool_fd(), iocfunc,
+ "remove lookup pool node");
}
}
diff --git a/contrib/ipfilter/lib/resetlexer.c b/contrib/ipfilter/lib/resetlexer.c
index 8ea83f1..558db98 100644
--- a/contrib/ipfilter/lib/resetlexer.c
+++ b/contrib/ipfilter/lib/resetlexer.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: resetlexer.c,v 1.1.4.1 2006/06/16 17:21:16 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
diff --git a/contrib/ipfilter/lib/rwlock_emul.c b/contrib/ipfilter/lib/rwlock_emul.c
index 1ee2475..24d00a5 100644
--- a/contrib/ipfilter/lib/rwlock_emul.c
+++ b/contrib/ipfilter/lib/rwlock_emul.c
@@ -1,21 +1,21 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: rwlock_emul.c,v 1.1.4.1 2006/06/16 17:21:17 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include "ipf.h"
#define EMM_MAGIC 0x97dd8b3a
void eMrwlock_read_enter(rw, file, line)
-eMrwlock_t *rw;
-char *file;
-int line;
+ eMrwlock_t *rw;
+ char *file;
+ int line;
{
if (rw->eMrw_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMrwlock_read_enter(%p): bad magic: %#x\n",
@@ -35,9 +35,9 @@ int line;
void eMrwlock_write_enter(rw, file, line)
-eMrwlock_t *rw;
-char *file;
-int line;
+ eMrwlock_t *rw;
+ char *file;
+ int line;
{
if (rw->eMrw_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
@@ -57,9 +57,9 @@ int line;
void eMrwlock_downgrade(rw, file, line)
-eMrwlock_t *rw;
-char *file;
-int line;
+ eMrwlock_t *rw;
+ char *file;
+ int line;
{
if (rw->eMrw_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n",
@@ -80,7 +80,7 @@ int line;
void eMrwlock_exit(rw)
-eMrwlock_t *rw;
+ eMrwlock_t *rw;
{
if (rw->eMrw_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMrwlock_exit(%p): bad magic: %#x\n",
@@ -101,9 +101,11 @@ eMrwlock_t *rw;
}
+static int initcount = 0;
+
void eMrwlock_init(rw, who)
-eMrwlock_t *rw;
-char *who;
+ eMrwlock_t *rw;
+ char *who;
{
if (rw->eMrw_magic == EMM_MAGIC) { /* safe bet ? */
fprintf(stderr,
@@ -118,16 +120,26 @@ char *who;
rw->eMrw_owner = strdup(who);
else
rw->eMrw_owner = NULL;
+ initcount++;
}
void eMrwlock_destroy(rw)
-eMrwlock_t *rw;
+ eMrwlock_t *rw;
{
if (rw->eMrw_magic != EMM_MAGIC) {
fprintf(stderr, "%s:eMrwlock_destroy(%p): bad magic: %#x\n",
rw->eMrw_owner, rw, rw->eMrw_magic);
abort();
}
+ if (rw->eMrw_owner != NULL)
+ free(rw->eMrw_owner);
memset(rw, 0xa5, sizeof(*rw));
+ initcount--;
+}
+
+void ipf_rwlock_clean()
+{
+ if (initcount != 0)
+ abort();
}
diff --git a/contrib/ipfilter/lib/save_execute.c b/contrib/ipfilter/lib/save_execute.c
new file mode 100644
index 0000000..65caca4
--- /dev/null
+++ b/contrib/ipfilter/lib/save_execute.c
@@ -0,0 +1,80 @@
+#include "ipf.h"
+#include "ipmon.h"
+
+static void *execute_parse __P((char **));
+static void execute_destroy __P((void *));
+static int execute_send __P((void *, ipmon_msg_t *));
+static void execute_print __P((void *));
+
+typedef struct execute_opts_s {
+ char *path;
+} execute_opts_t;
+
+ipmon_saver_t executesaver = {
+ "execute",
+ execute_destroy,
+ NULL, /* dup */
+ NULL, /* match */
+ execute_parse,
+ execute_print,
+ execute_send
+};
+
+
+static void *
+execute_parse(char **strings)
+{
+ execute_opts_t *ctx;
+
+ ctx = calloc(1, sizeof(*ctx));
+
+ if (ctx != NULL && strings[0] != NULL && strings[0][0] != '\0') {
+ ctx->path = strdup(strings[0]);
+
+ } else {
+ free(ctx);
+ return NULL;
+ }
+
+ return ctx;
+}
+
+
+static void
+execute_print(ctx)
+ void *ctx;
+{
+ execute_opts_t *exe = ctx;
+
+ printf("%s", exe->path);
+}
+
+
+static void
+execute_destroy(ctx)
+ void *ctx;
+{
+ execute_opts_t *exe = ctx;
+
+ if (exe != NULL)
+ free(exe->path);
+ free(exe);
+}
+
+
+static int
+execute_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+ execute_opts_t *exe = ctx;
+ FILE *fp;
+
+ fp = popen(exe->path, "w");
+ if (fp != NULL) {
+ fwrite(msg->imm_msg, msg->imm_msglen, 1, fp);
+ pclose(fp);
+ }
+ return 0;
+}
+
diff --git a/contrib/ipfilter/lib/save_file.c b/contrib/ipfilter/lib/save_file.c
new file mode 100644
index 0000000..b852bd6
--- /dev/null
+++ b/contrib/ipfilter/lib/save_file.c
@@ -0,0 +1,130 @@
+#include "ipf.h"
+#include "ipmon.h"
+
+static void *file_parse __P((char **));
+static void file_destroy __P((void *));
+static int file_send __P((void *, ipmon_msg_t *));
+static void file_print __P((void *));
+static int file_match __P((void *, void *));
+static void *file_dup __P((void *));
+
+typedef struct file_opts_s {
+ FILE *fp;
+ int raw;
+ char *path;
+ int ref;
+} file_opts_t;
+
+ipmon_saver_t filesaver = {
+ "file",
+ file_destroy,
+ file_dup,
+ file_match,
+ file_parse,
+ file_print,
+ file_send
+};
+
+
+static void *
+file_parse(strings)
+ char **strings;
+{
+ file_opts_t *ctx;
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL)
+ return NULL;
+
+ if (strings[0] != NULL && strings[0][0] != '\0') {
+ ctx->ref = 1;
+ if (!strncmp(strings[0], "raw://", 6)) {
+ ctx->raw = 1;
+ ctx->path = strdup(strings[0] + 6);
+ ctx->fp = fopen(ctx->path, "ab");
+ } else if (!strncmp(strings[0], "file://", 7)) {
+ ctx->path = strdup(strings[0] + 7);
+ ctx->fp = fopen(ctx->path, "a");
+ } else {
+ free(ctx);
+ ctx = NULL;
+ }
+ } else {
+ free(ctx);
+ ctx = NULL;
+ }
+
+ return ctx;
+}
+
+
+static int
+file_match(ctx1, ctx2)
+ void *ctx1, *ctx2;
+{
+ file_opts_t *f1 = ctx1, *f2 = ctx2;
+
+ if (f1->raw != f2->raw)
+ return 1;
+ if (strcmp(f1->path, f2->path))
+ return 1;
+ return 0;
+}
+
+
+static void *
+file_dup(ctx)
+ void *ctx;
+{
+ file_opts_t *f = ctx;
+
+ f->ref++;
+ return f;
+}
+
+
+static void
+file_print(ctx)
+ void *ctx;
+{
+ file_opts_t *file = ctx;
+
+ if (file->raw)
+ printf("raw://");
+ else
+ printf("file://");
+ printf("%s", file->path);
+}
+
+
+static void
+file_destroy(ctx)
+ void *ctx;
+{
+ file_opts_t *file = ctx;
+
+ file->ref--;
+ if (file->ref > 0)
+ return;
+
+ if (file->path != NULL)
+ free(file->path);
+ free(file);
+}
+
+
+static int
+file_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+ file_opts_t *file = ctx;
+
+ if (file->raw) {
+ fwrite(msg->imm_data, msg->imm_dsize, 1, file->fp);
+ } else {
+ fprintf(file->fp, "%s", msg->imm_msg);
+ }
+ return 0;
+}
+
diff --git a/contrib/ipfilter/lib/save_nothing.c b/contrib/ipfilter/lib/save_nothing.c
new file mode 100644
index 0000000..d25ab51
--- /dev/null
+++ b/contrib/ipfilter/lib/save_nothing.c
@@ -0,0 +1,62 @@
+#include "ipf.h"
+#include "ipmon.h"
+
+static void *nothing_parse __P((char **));
+static void nothing_destroy __P((void *));
+static int nothing_send __P((void *, ipmon_msg_t *));
+
+typedef struct nothing_opts_s {
+ FILE *fp;
+ int raw;
+ char *path;
+} nothing_opts_t;
+
+ipmon_saver_t nothingsaver = {
+ "nothing",
+ nothing_destroy,
+ NULL, /* dup */
+ NULL, /* match */
+ nothing_parse,
+ NULL, /* print */
+ nothing_send
+};
+
+
+static void *
+nothing_parse(char **strings)
+{
+ void *ctx;
+
+#if 0
+ strings = strings; /* gcc -Wextra */
+#endif
+
+ ctx = calloc(1, sizeof(void *));
+
+ return ctx;
+}
+
+
+static void
+nothing_destroy(ctx)
+ void *ctx;
+{
+ free(ctx);
+}
+
+
+static int
+nothing_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+#if 0
+ ctx = ctx; /* gcc -Wextra */
+ msg = msg; /* gcc -Wextra */
+#endif
+ /*
+ * Do nothing
+ */
+ return 0;
+}
+
diff --git a/contrib/ipfilter/lib/save_syslog.c b/contrib/ipfilter/lib/save_syslog.c
new file mode 100644
index 0000000..c1efdf4
--- /dev/null
+++ b/contrib/ipfilter/lib/save_syslog.c
@@ -0,0 +1,137 @@
+#include "ipf.h"
+#include "ipmon.h"
+#include <syslog.h>
+
+static void *syslog_parse __P((char **));
+static void syslog_destroy __P((void *));
+static int syslog_send __P((void *, ipmon_msg_t *));
+static void syslog_print __P((void *));
+
+typedef struct syslog_opts_s {
+ int facpri;
+ int fac;
+ int pri;
+} syslog_opts_t;
+
+ipmon_saver_t syslogsaver = {
+ "syslog",
+ syslog_destroy,
+ NULL, /* dup */
+ NULL, /* match */
+ syslog_parse,
+ syslog_print,
+ syslog_send
+};
+
+
+static void *
+syslog_parse(char **strings)
+{
+ syslog_opts_t *ctx;
+ char *str;
+ char *s;
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL)
+ return NULL;
+
+ ctx->facpri = -1;
+
+ if (strings[0] != NULL && strings[0][0] != '\0') {
+ str = strdup(*strings);
+ if (str != NULL && *str != '\0') {
+ int fac = -1, pri = -1;
+
+ s = strchr(str, '.');
+ if (s != NULL)
+ *s++ = '\0';
+
+ if (*str != '\0') {
+ fac = fac_findname(str);
+ if (fac == -1) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+ }
+
+ if (s != NULL && *s != '\0') {
+ pri = pri_findname(s);
+ if (pri == -1) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+ }
+ free(str);
+
+ ctx->fac = fac;
+ ctx->pri = pri;
+ if (pri == -1)
+ ctx->facpri = fac;
+ else if (fac == -1)
+ ctx->facpri = pri;
+ else
+ ctx->facpri = fac | pri;
+ } else {
+ if (str != NULL)
+ free(str);
+ free(ctx);
+ ctx = NULL;
+ }
+ }
+
+ return ctx;
+}
+
+
+static void
+syslog_print(ctx)
+ void *ctx;
+{
+ syslog_opts_t *sys = ctx;
+
+ if (sys->facpri == -1)
+ return;
+
+ if (sys->fac == -1) {
+ printf(".%s", pri_toname(sys->pri));
+ } else if (sys->pri == -1) {
+ printf("%s.", fac_toname(sys->fac));
+ } else {
+ printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK),
+ pri_toname(sys->facpri & LOG_PRIMASK));
+ }
+}
+
+
+static void
+syslog_destroy(ctx)
+ void *ctx;
+{
+ free(ctx);
+}
+
+
+static int
+syslog_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+ syslog_opts_t *sys = ctx;
+ int facpri;
+
+ if (sys->facpri == -1) {
+ facpri = msg->imm_loglevel;
+ } else {
+ if (sys->pri == -1) {
+ facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK);
+ } else if (sys->fac == -1) {
+ facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK);
+ } else {
+ facpri = sys->facpri;
+ }
+ }
+ syslog(facpri, "%s", msg->imm_msg);
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/save_v1trap.c b/contrib/ipfilter/lib/save_v1trap.c
new file mode 100644
index 0000000..b17f62c
--- /dev/null
+++ b/contrib/ipfilter/lib/save_v1trap.c
@@ -0,0 +1,463 @@
+#include "ipf.h"
+#include "netinet/ipl.h"
+#include "ipmon.h"
+#include <ctype.h>
+
+#define IPF_ENTERPRISE 9932
+/*
+ * Enterprise number OID:
+ * 1.3.6.1.4.1.9932
+ */
+static u_char ipf_enterprise[] = { 6, 7, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c };
+static u_char ipf_trap0_1[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 1 };
+static u_char ipf_trap0_2[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 2 };
+
+static int writeint __P((u_char *, int));
+static int writelength __P((u_char *, u_int));
+static int maketrap_v1 __P((char *, u_char *, int, u_char *, int, u_32_t,
+ time_t));
+static void snmpv1_destroy __P((void *));
+static void *snmpv1_dup __P((void *));
+static int snmpv1_match __P((void *, void *));
+static void *snmpv1_parse __P((char **));
+static void snmpv1_print __P((void *));
+static int snmpv1_send __P((void *, ipmon_msg_t *));
+
+typedef struct snmpv1_opts_s {
+ char *community;
+ int fd;
+ int v6;
+ int ref;
+#ifdef USE_INET6
+ struct sockaddr_in6 sin6;
+#endif
+ struct sockaddr_in sin;
+} snmpv1_opts_t;
+
+ipmon_saver_t snmpv1saver = {
+ "snmpv1",
+ snmpv1_destroy,
+ snmpv1_dup, /* dup */
+ snmpv1_match, /* match */
+ snmpv1_parse,
+ snmpv1_print,
+ snmpv1_send
+};
+
+
+static int
+snmpv1_match(ctx1, ctx2)
+ void *ctx1, *ctx2;
+{
+ snmpv1_opts_t *s1 = ctx1, *s2 = ctx2;
+
+ if (s1->v6 != s2->v6)
+ return 1;
+
+ if (strcmp(s1->community, s2->community))
+ return 1;
+
+#ifdef USE_INET6
+ if (s1->v6 == 1) {
+ if (memcmp(&s1->sin6, &s2->sin6, sizeof(s1->sin6)))
+ return 1;
+ } else
+#endif
+ {
+ if (memcmp(&s1->sin, &s2->sin, sizeof(s1->sin)))
+ return 1;
+ }
+
+ return 0;
+}
+
+
+static void *
+snmpv1_dup(ctx)
+ void *ctx;
+{
+ snmpv1_opts_t *s = ctx;
+
+ s->ref++;
+ return s;
+}
+
+
+static void
+snmpv1_print(ctx)
+ void *ctx;
+{
+ snmpv1_opts_t *snmpv1 = ctx;
+
+ printf("%s ", snmpv1->community);
+#ifdef USE_INET6
+ if (snmpv1->v6 == 1) {
+ char buf[80];
+
+ printf("%s", inet_ntop(AF_INET6, &snmpv1->sin6.sin6_addr, buf,
+ sizeof(snmpv1->sin6.sin6_addr)));
+ } else
+#endif
+ {
+ printf("%s", inet_ntoa(snmpv1->sin.sin_addr));
+ }
+}
+
+
+static void *
+snmpv1_parse(char **strings)
+{
+ snmpv1_opts_t *ctx;
+ int result;
+ char *str;
+ char *s;
+
+ if (strings[0] == NULL || strings[0][0] == '\0')
+ return NULL;
+
+ if (strchr(*strings, ' ') == NULL)
+ return NULL;
+
+ str = strdup(*strings);
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL)
+ return NULL;
+
+ ctx->fd = -1;
+
+ s = strchr(str, ' ');
+ *s++ = '\0';
+ ctx->community = str;
+
+ while (ISSPACE(*s))
+ s++;
+ if (!*s) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+
+#ifdef USE_INET6
+ if (strchr(s, ':') == NULL) {
+ result = inet_pton(AF_INET, s, &ctx->sin.sin_addr);
+ if (result == 1) {
+ ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin.sin_family = AF_INET;
+ ctx->sin.sin_port = htons(162);
+ if (connect(ctx->fd,
+ (struct sockaddr *)&ctx->sin,
+ sizeof(ctx->sin)) != 0) {
+ snmpv1_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+ } else {
+ result = inet_pton(AF_INET6, s, &ctx->sin6.sin6_addr);
+ if (result == 1) {
+ ctx->v6 = 1;
+ ctx->fd = socket(AF_INET6, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin6.sin6_family = AF_INET6;
+ ctx->sin6.sin6_port = htons(162);
+ if (connect(ctx->fd,
+ (struct sockaddr *)&ctx->sin6,
+ sizeof(ctx->sin6)) != 0) {
+ snmpv1_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+ }
+#else
+ result = inet_aton(s, &ctx->sin.sin_addr);
+ if (result == 1) {
+ ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin.sin_family = AF_INET;
+ ctx->sin.sin_port = htons(162);
+ if (connect(ctx->fd, &ctx->sin,
+ sizeof(ctx->sin)) != 0) {
+ snmpv1_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+#endif
+
+ if (result != 1) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+
+ ctx->ref = 1;
+
+ return ctx;
+}
+
+
+static void
+snmpv1_destroy(ctx)
+ void *ctx;
+{
+ snmpv1_opts_t *v1 = ctx;
+
+ v1->ref--;
+ if (v1->ref > 0)
+ return;
+
+ if (v1->community)
+ free(v1->community);
+ if (v1->fd >= 0)
+ close(v1->fd);
+ free(v1);
+}
+
+
+static int
+snmpv1_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+ snmpv1_opts_t *v1 = ctx;
+
+ return sendtrap_v1_0(v1->fd, v1->community,
+ msg->imm_msg, msg->imm_msglen, msg->imm_when);
+}
+
+static char def_community[] = "public"; /* ublic */
+
+static int
+writelength(buffer, value)
+ u_char *buffer;
+ u_int value;
+{
+ u_int n = htonl(value);
+ int len;
+
+ if (value < 128) {
+ *buffer = value;
+ return 1;
+ }
+ if (value > 0xffffff)
+ len = 4;
+ else if (value > 0xffff)
+ len = 3;
+ else if (value > 0xff)
+ len = 2;
+ else
+ len = 1;
+
+ *buffer = 0x80 | len;
+
+ bcopy((u_char *)&n + 4 - len, buffer + 1, len);
+
+ return len + 1;
+}
+
+
+static int
+writeint(buffer, value)
+ u_char *buffer;
+ int value;
+{
+ u_char *s = buffer;
+ u_int n = value;
+
+ if (value == 0) {
+ *buffer = 0;
+ return 1;
+ }
+
+ if (n > 4194304) {
+ *s++ = 0x80 | (n / 4194304);
+ n -= 4194304 * (n / 4194304);
+ }
+ if (n > 32768) {
+ *s++ = 0x80 | (n / 32768);
+ n -= 32768 * (n / 327678);
+ }
+ if (n > 128) {
+ *s++ = 0x80 | (n / 128);
+ n -= (n / 128) * 128;
+ }
+ *s++ = (u_char)n;
+
+ return s - buffer;
+}
+
+
+
+/*
+ * First style of traps is:
+ * 1.3.6.1.4.1.9932.1.1
+ */
+static int
+maketrap_v1(community, buffer, bufsize, msg, msglen, ipaddr, when)
+ char *community;
+ u_char *buffer;
+ int bufsize;
+ u_char *msg;
+ int msglen;
+ u_32_t ipaddr;
+ time_t when;
+{
+ u_char *s = buffer, *t, *pdulen, *varlen;
+ int basesize = 73;
+ u_short len;
+ int trapmsglen;
+ int pdulensz;
+ int varlensz;
+ int baselensz;
+ int n;
+
+ if (community == NULL || *community == '\0')
+ community = def_community;
+ basesize += strlen(community) + msglen;
+
+ if (basesize + 8 > bufsize)
+ return 0;
+
+ memset(buffer, 0xff, bufsize);
+ *s++ = 0x30; /* Sequence */
+ if (basesize - 1 >= 128) {
+ baselensz = 2;
+ basesize++;
+ } else {
+ baselensz = 1;
+ }
+ s += baselensz;
+ *s++ = 0x02; /* Integer32 */
+ *s++ = 0x01; /* length 1 */
+ *s++ = 0x00; /* version 1 */
+ *s++ = 0x04; /* octet string */
+ *s++ = strlen(community); /* length of "public" */
+ bcopy(community, s, s[-1]);
+ s += s[-1];
+ *s++ = 0xA4; /* PDU(4) */
+ pdulen = s++;
+ if (basesize - (s - buffer) >= 128) {
+ pdulensz = 2;
+ basesize++;
+ s++;
+ } else {
+ pdulensz = 1;
+ }
+
+ /* enterprise */
+ bcopy(ipf_enterprise, s, sizeof(ipf_enterprise));
+ s += sizeof(ipf_enterprise);
+
+ /* Agent address */
+ *s++ = 0x40;
+ *s++ = 0x4;
+ bcopy(&ipaddr, s, 4);
+ s += 4;
+
+ /* Generic Trap code */
+ *s++ = 0x2;
+ n = writeint(s + 1, 6);
+ if (n == 0)
+ return 0;
+ *s = n;
+ s += n + 1;
+
+ /* Specific Trap code */
+ *s++ = 0x2;
+ n = writeint(s + 1, 0);
+ if (n == 0)
+ return 0;
+ *s = n;
+ s += n + 1;
+
+ /* Time stamp */
+ *s++ = 0x43; /* TimeTicks */
+ *s++ = 0x04; /* TimeTicks */
+ s[0] = when >> 24;
+ s[1] = when >> 16;
+ s[2] = when >> 8;
+ s[3] = when & 0xff;
+ s += 4;
+
+ /*
+ * The trap0 message is "ipfilter_version" followed by the message
+ */
+ *s++ = 0x30;
+ varlen = s;
+ if (basesize - (s - buffer) >= 128) {
+ varlensz = 2;
+ basesize++;
+ } else {
+ varlensz = 1;
+ }
+ s += varlensz;
+
+ *s++ = 0x30;
+ t = s + 1;
+ bcopy(ipf_trap0_1, t, sizeof(ipf_trap0_1));
+ t += sizeof(ipf_trap0_1);
+
+ *t++ = 0x2; /* Integer */
+ n = writeint(t + 1, IPFILTER_VERSION);
+ *t = n;
+ t += n + 1;
+
+ len = t - s - 1;
+ writelength(s, len);
+
+ s = t;
+ *s++ = 0x30;
+ if (basesize - (s - buffer) >= 128) {
+ trapmsglen = 2;
+ basesize++;
+ } else {
+ trapmsglen = 1;
+ }
+ t = s + trapmsglen;
+ bcopy(ipf_trap0_2, t, sizeof(ipf_trap0_2));
+ t += sizeof(ipf_trap0_2);
+
+ *t++ = 0x4; /* Octet string */
+ n = writelength(t, msglen);
+ t += n;
+ bcopy(msg, t, msglen);
+ t += msglen;
+
+ len = t - s - trapmsglen;
+ writelength(s, len);
+
+ len = t - varlen - varlensz;
+ writelength(varlen, len); /* pdu length */
+
+ len = t - pdulen - pdulensz;
+ writelength(pdulen, len); /* pdu length */
+
+ len = t - buffer - baselensz - 1;
+ writelength(buffer + 1, len); /* length of trap */
+
+ return t - buffer;
+}
+
+
+int
+sendtrap_v1_0(fd, community, msg, msglen, when)
+ int fd;
+ char *community, *msg;
+ int msglen;
+ time_t when;
+{
+
+ u_char buffer[1500];
+ int n;
+
+ n = maketrap_v1(community, buffer, sizeof(buffer),
+ (u_char *)msg, msglen, 0, when);
+ if (n > 0) {
+ return send(fd, buffer, n, 0);
+ }
+
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/save_v2trap.c b/contrib/ipfilter/lib/save_v2trap.c
new file mode 100644
index 0000000..24349bb
--- /dev/null
+++ b/contrib/ipfilter/lib/save_v2trap.c
@@ -0,0 +1,459 @@
+#include "ipf.h"
+#include "netinet/ipl.h"
+#include "ipmon.h"
+#include <ctype.h>
+
+static u_char sysuptime[] = { 6, 8, 0x2b, 6, 1, 2, 1, 1, 3, 0 };
+/*
+ * Enterprise number OID:
+ * 1.3.6.1.4.1.9932
+ */
+static u_char ipf_trap0_1[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 1 };
+static u_char ipf_trap0_2[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 2 };
+
+static int writeint __P((u_char *, int));
+static int writelength __P((u_char *, u_int));
+static int maketrap_v2 __P((char *, u_char *, int, u_char *, int));
+static void snmpv2_destroy __P((void *));
+static void *snmpv2_dup __P((void *));
+static int snmpv2_match __P((void *, void *));
+static void *snmpv2_parse __P((char **));
+static void snmpv2_print __P((void *));
+static int snmpv2_send __P((void *, ipmon_msg_t *));
+
+
+int sendtrap_v2_0 __P((int, char *, char *, int));
+
+static char def_community[] = "public"; /* ublic */
+
+typedef struct snmpv2_opts_s {
+ char *community;
+ char *server;
+ int fd;
+ int v6;
+ int ref;
+#ifdef USE_INET6
+ struct sockaddr_in6 sin6;
+#endif
+ struct sockaddr_in sin;
+} snmpv2_opts_t;
+
+ipmon_saver_t snmpv2saver = {
+ "snmpv2",
+ snmpv2_destroy,
+ snmpv2_dup, /* dup */
+ snmpv2_match, /* match */
+ snmpv2_parse,
+ snmpv2_print,
+ snmpv2_send
+};
+
+
+static int
+snmpv2_match(ctx1, ctx2)
+ void *ctx1, *ctx2;
+{
+ snmpv2_opts_t *s1 = ctx1, *s2 = ctx2;
+
+ if (s1->v6 != s2->v6)
+ return 1;
+
+ if (strcmp(s1->community, s2->community))
+ return 1;
+
+#ifdef USE_INET6
+ if (s1->v6 == 1) {
+ if (memcmp(&s1->sin6, &s2->sin6, sizeof(s1->sin6)))
+ return 1;
+ } else
+#endif
+ {
+ if (memcmp(&s1->sin, &s2->sin, sizeof(s1->sin)))
+ return 1;
+ }
+
+ return 0;
+}
+
+
+static void *
+snmpv2_dup(ctx)
+ void *ctx;
+{
+ snmpv2_opts_t *s = ctx;
+
+ s->ref++;
+ return s;
+}
+
+
+static void
+snmpv2_print(ctx)
+ void *ctx;
+{
+ snmpv2_opts_t *snmpv2 = ctx;
+
+ printf("%s ", snmpv2->community);
+#ifdef USE_INET6
+ if (snmpv2->v6 == 1) {
+ char buf[80];
+
+ printf("%s", inet_ntop(AF_INET6, &snmpv2->sin6.sin6_addr, buf,
+ sizeof(snmpv2->sin6.sin6_addr)));
+ } else
+#endif
+ {
+ printf("%s", inet_ntoa(snmpv2->sin.sin_addr));
+ }
+}
+
+
+static void *
+snmpv2_parse(char **strings)
+{
+ snmpv2_opts_t *ctx;
+ int result;
+ char *str;
+ char *s;
+
+ if (strings[0] == NULL || strings[0][0] == '\0')
+ return NULL;
+ if (strchr(*strings, ' ') == NULL)
+ return NULL;
+
+ str = strdup(*strings);
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL)
+ return NULL;
+
+ ctx->fd = -1;
+
+ s = strchr(str, ' ');
+ *s++ = '\0';
+ ctx->community = str;
+
+ while (ISSPACE(*s))
+ s++;
+ if (!*s) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+
+#ifdef USE_INET6
+ if (strchr(s, ':') == NULL) {
+ result = inet_pton(AF_INET, s, &ctx->sin.sin_addr);
+ if (result == 1) {
+ ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin.sin_family = AF_INET;
+ ctx->sin.sin_port = htons(162);
+ if (connect(ctx->fd,
+ (struct sockaddr *)&ctx->sin,
+ sizeof(ctx->sin)) != 0) {
+ snmpv2_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+ } else {
+ result = inet_pton(AF_INET6, s, &ctx->sin6.sin6_addr);
+ if (result == 1) {
+ ctx->v6 = 1;
+ ctx->fd = socket(AF_INET6, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin6.sin6_family = AF_INET6;
+ ctx->sin6.sin6_port = htons(162);
+ if (connect(ctx->fd,
+ (struct sockaddr *)&ctx->sin6,
+ sizeof(ctx->sin6)) != 0) {
+ snmpv2_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+ }
+#else
+ result = inet_aton(s, &ctx->sin.sin_addr);
+ if (result == 1) {
+ ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (ctx->fd >= 0) {
+ ctx->sin.sin_family = AF_INET;
+ ctx->sin.sin_port = htons(162);
+ if (connect(ctx->fd, &ctx->sin,
+ sizeof(ctx->sin)) != 0) {
+ snmpv2_destroy(ctx);
+ return NULL;
+ }
+ }
+ }
+#endif
+
+ if (result != 1) {
+ free(str);
+ free(ctx);
+ return NULL;
+ }
+
+ ctx->ref = 1;
+
+ return ctx;
+}
+
+
+static void
+snmpv2_destroy(ctx)
+ void *ctx;
+{
+ snmpv2_opts_t *v2 = ctx;
+
+ v2->ref--;
+ if (v2->ref > 0)
+ return;
+
+ if (v2->community)
+ free(v2->community);
+ if (v2->fd >= 0)
+ close(v2->fd);
+ free(v2);
+}
+
+
+static int
+snmpv2_send(ctx, msg)
+ void *ctx;
+ ipmon_msg_t *msg;
+{
+ snmpv2_opts_t *v2 = ctx;
+
+ return sendtrap_v2_0(v2->fd, v2->community,
+ msg->imm_msg, msg->imm_msglen);
+}
+static int
+writelength(buffer, value)
+ u_char *buffer;
+ u_int value;
+{
+ u_int n = htonl(value);
+ int len;
+
+ if (value < 128) {
+ *buffer = value;
+ return 1;
+ }
+ if (value > 0xffffff)
+ len = 4;
+ else if (value > 0xffff)
+ len = 3;
+ else if (value > 0xff)
+ len = 2;
+ else
+ len = 1;
+
+ *buffer = 0x80 | len;
+
+ bcopy((u_char *)&n + 4 - len, buffer + 1, len);
+
+ return len + 1;
+}
+
+
+static int
+writeint(buffer, value)
+ u_char *buffer;
+ int value;
+{
+ u_char *s = buffer;
+ u_int n = value;
+
+ if (value == 0) {
+ *buffer = 0;
+ return 1;
+ }
+
+ if (n > 4194304) {
+ *s++ = 0x80 | (n / 4194304);
+ n -= 4194304 * (n / 4194304);
+ }
+ if (n > 32768) {
+ *s++ = 0x80 | (n / 32768);
+ n -= 32768 * (n / 327678);
+ }
+ if (n > 128) {
+ *s++ = 0x80 | (n / 128);
+ n -= (n / 128) * 128;
+ }
+ *s++ = (u_char)n;
+
+ return s - buffer;
+}
+
+
+
+/*
+ * First style of traps is:
+ * 1.3.6.1.4.1.9932.1.1
+ */
+static int
+maketrap_v2(community, buffer, bufsize, msg, msglen)
+ char *community;
+ u_char *buffer;
+ int bufsize;
+ u_char *msg;
+ int msglen;
+{
+ u_char *s = buffer, *t, *pdulen;
+ u_char *varlen;
+ int basesize = 77;
+ u_short len;
+ int trapmsglen;
+ int pdulensz;
+ int varlensz;
+ int baselensz;
+ int n;
+
+ if (community == NULL || *community == '\0')
+ community = def_community;
+ basesize += strlen(community) + msglen;
+
+ if (basesize + 8 > bufsize)
+ return 0;
+
+ memset(buffer, 0xff, bufsize);
+ *s++ = 0x30; /* Sequence */
+
+ if (basesize - 1 >= 128) {
+ baselensz = 2;
+ basesize++;
+ } else {
+ baselensz = 1;
+ }
+ s += baselensz;
+ *s++ = 0x02; /* Integer32 */
+ *s++ = 0x01; /* length 1 */
+ *s++ = 0x01; /* version 2 */
+ *s++ = 0x04; /* octet string */
+ *s++ = strlen(community); /* length of "public" */
+ bcopy(community, s, s[-1]);
+ s += s[-1];
+ *s++ = 0xA7; /* PDU(7) */
+ pdulen = s++;
+ if (basesize - (s - buffer) >= 128) {
+ pdulensz = 2;
+ basesize++;
+ s++;
+ } else {
+ pdulensz = 1;
+ }
+ /* request id */
+ *s++ = 0x2; /* integer */
+ *s++ = 0x4; /* len 4 */
+ *s++ = 0x0; /* noError */
+ *s++ = 0x0; /* noError */
+ *s++ = 0x0; /* noError */
+ *s++ = 0x0; /* noError */
+
+ /* error status */
+ *s++ = 0x2; /* integer */
+ *s++ = 0x1; /* len 1 */
+ *s++ = 0x0; /* noError */
+
+ /* error-index */
+ *s++ = 0x2; /* integer */
+ *s++ = 0x1; /* len 1 */
+ *s++ = 0x0; /* noError */
+
+ *s++ = 0x30; /* sequence */
+ varlen = s++;
+ if (basesize - (s - buffer) >= 128) {
+ varlensz = 2;
+ basesize++;
+ s++;
+ } else {
+ varlensz = 1;
+ }
+
+ *s++ = 0x30; /* sequence */
+ *s++ = sizeof(sysuptime) + 6;
+
+ bcopy(sysuptime, s, sizeof(sysuptime));
+ s += sizeof(sysuptime);
+
+ *s++ = 0x43; /* Timestamp */
+ *s++ = 0x04; /* TimeTicks */
+ *s++ = 0x0;
+ *s++ = 0x0;
+ *s++ = 0x0;
+ *s++ = 0x0;
+
+ *s++ = 0x30;
+ t = s + 1;
+ bcopy(ipf_trap0_1, t, sizeof(ipf_trap0_1));
+ t += sizeof(ipf_trap0_1);
+
+ *t++ = 0x2; /* Integer */
+ n = writeint(t + 1, IPFILTER_VERSION);
+ *t = n;
+ t += n + 1;
+
+ len = t - s - 1;
+ writelength(s, len);
+
+ s = t;
+ *s++ = 0x30;
+ if (msglen < 128) {
+ if (msglen + 1 + 1 + sizeof(ipf_trap0_2) >= 128)
+ trapmsglen = 2;
+ else
+ trapmsglen = 1;
+ } else {
+ if (msglen + 2 + 1 + sizeof(ipf_trap0_2) >= 128)
+ trapmsglen = 2;
+ else
+ trapmsglen = 1;
+ }
+ t = s + trapmsglen;
+ bcopy(ipf_trap0_2, t, sizeof(ipf_trap0_2));
+ t += sizeof(ipf_trap0_2);
+
+ *t++ = 0x4; /* Octet string */
+ n = writelength(t, msglen);
+ t += n;
+ bcopy(msg, t, msglen);
+ t += msglen;
+
+ len = t - s - trapmsglen;
+ writelength(s, len);
+
+ len = t - varlen - varlensz;
+ writelength(varlen, len); /* pdu length */
+
+ len = t - pdulen - pdulensz;
+ writelength(pdulen, len); /* pdu length */
+
+ len = t - buffer - baselensz - 1;
+ writelength(buffer + 1, len); /* length of trap */
+
+ return t - buffer;
+}
+
+
+int
+sendtrap_v2_0(fd, community, msg, msglen)
+ int fd;
+ char *community, *msg;
+ int msglen;
+{
+
+ u_char buffer[1500];
+ int n;
+
+ n = maketrap_v2(community, buffer, sizeof(buffer),
+ (u_char *)msg, msglen);
+ if (n > 0) {
+ return send(fd, buffer, n, 0);
+ }
+
+ return 0;
+}
diff --git a/contrib/ipfilter/lib/tcpflags.c b/contrib/ipfilter/lib/tcpflags.c
index f01d7dc..feb3e8a 100644
--- a/contrib/ipfilter/lib/tcpflags.c
+++ b/contrib/ipfilter/lib/tcpflags.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2001-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: tcpflags.c,v 1.3.4.1 2006/06/16 17:21:17 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -26,7 +26,7 @@ extern u_char flags[];
u_char tcpflags(flgs)
-char *flgs;
+ char *flgs;
{
u_char tcpf = 0;
char *s, *t;
diff --git a/contrib/ipfilter/lib/tcpoptnames.c b/contrib/ipfilter/lib/tcpoptnames.c
index 25e3b27..24e41bb 100644
--- a/contrib/ipfilter/lib/tcpoptnames.c
+++ b/contrib/ipfilter/lib/tcpoptnames.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2002 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: tcpoptnames.c,v 1.5.4.1 2006/06/16 17:21:17 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
diff --git a/contrib/ipfilter/lib/v6ionames.c b/contrib/ipfilter/lib/v6ionames.c
index b57b301..9f1207f 100644
--- a/contrib/ipfilter/lib/v6ionames.c
+++ b/contrib/ipfilter/lib/v6ionames.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003-2005 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: v6ionames.c,v 1.1.4.3 2006/06/16 17:21:18 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
@@ -16,10 +16,10 @@ struct ipopt_names v6ionames[] ={
{ IPPROTO_HOPOPTS, 0x000001, 0, "hopopts" },
{ IPPROTO_IPV6, 0x000002, 0, "ipv6" },
{ IPPROTO_ROUTING, 0x000004, 0, "routing" },
- { IPPROTO_FRAGMENT, 0x000008, 0, "frag" },
+ { IPPROTO_FRAGMENT, 0x000008, 0, "frag" },
{ IPPROTO_ESP, 0x000010, 0, "esp" },
{ IPPROTO_AH, 0x000020, 0, "ah" },
- { IPPROTO_NONE, 0x000040, 0, "none" },
+ { IPPROTO_NONE, 0x000040, 0, "none" },
{ IPPROTO_DSTOPTS, 0x000080, 0, "dstopts" },
{ IPPROTO_MOBILITY, 0x000100, 0, "mobility" },
{ 0, 0, 0, (char *)NULL }
diff --git a/contrib/ipfilter/lib/v6optvalue.c b/contrib/ipfilter/lib/v6optvalue.c
index a60d076..a6eff92 100644
--- a/contrib/ipfilter/lib/v6optvalue.c
+++ b/contrib/ipfilter/lib/v6optvalue.c
@@ -1,18 +1,18 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2003 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: v6optvalue.c,v 1.1.4.1 2006/06/16 17:21:18 darrenr Exp $
+ * $Id$
*/
#include "ipf.h"
u_32_t getv6optbyname(optname)
-char *optname;
+ char *optname;
{
#ifdef USE_INET6
struct ipopt_names *io;
@@ -26,7 +26,7 @@ char *optname;
u_32_t getv6optbyvalue(optval)
-int optval;
+ int optval;
{
#ifdef USE_INET6
struct ipopt_names *io;
diff --git a/contrib/ipfilter/lib/var.c b/contrib/ipfilter/lib/var.c
index 4a62d7a..e61c8d1 100644
--- a/contrib/ipfilter/lib/var.c
+++ b/contrib/ipfilter/lib/var.c
@@ -1,12 +1,12 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2002-2004 by Darren Reed.
- *
- * See the IPFILTER.LICENCE file for details on licencing.
- *
- * $Id: var.c,v 1.4.2.3 2006/06/16 17:21:18 darrenr Exp $
- */
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
#include <ctype.h>
@@ -25,7 +25,7 @@ static char *expand_string __P((char *, int));
static variable_t *find_var(name)
-char *name;
+ char *name;
{
variable_t *v;
@@ -37,8 +37,8 @@ char *name;
char *get_variable(string, after, line)
-char *string, **after;
-int line;
+ char *string, **after;
+ int line;
{
char c, *s, *t, *value;
variable_t *v;
@@ -84,8 +84,8 @@ int line;
static char *expand_string(oldstring, line)
-char *oldstring;
-int line;
+ char *oldstring;
+ int line;
{
char c, *s, *p1, *p2, *p3, *newstring, *value;
int len;
@@ -144,8 +144,8 @@ int line;
void set_variable(name, value)
-char *name;
-char *value;
+ char *name;
+ char *value;
{
variable_t *v;
int len;
diff --git a/contrib/ipfilter/lib/verbose.c b/contrib/ipfilter/lib/verbose.c
index f1b4516..710daab 100644
--- a/contrib/ipfilter/lib/verbose.c
+++ b/contrib/ipfilter/lib/verbose.c
@@ -1,11 +1,11 @@
/* $FreeBSD$ */
/*
- * Copyright (C) 2000-2001 by Darren Reed.
+ * Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
- * $Id: verbose.c,v 1.6.4.1 2006/06/16 17:21:18 darrenr Exp $
+ * $Id$
*/
#if defined(__STDC__)
@@ -15,16 +15,16 @@
#endif
#include <stdio.h>
-#include "ipt.h"
+#include "ipf.h"
#include "opts.h"
#if defined(__STDC__)
-void verbose(char *fmt, ...)
+void verbose(int level, char *fmt, ...)
#else
-void verbose(fmt, va_alist)
-char *fmt;
-va_dcl
+void verbose(level, fmt, va_alist)
+ char *fmt;
+ va_dcl
#endif
{
va_list pvar;
@@ -35,3 +35,21 @@ va_dcl
vprintf(fmt, pvar);
va_end(pvar);
}
+
+
+#if defined(__STDC__)
+void ipfkverbose(char *fmt, ...)
+#else
+void ipfkverbose(fmt, va_alist)
+ char *fmt;
+ va_dcl
+#endif
+{
+ va_list pvar;
+
+ va_start(pvar, fmt);
+
+ if (opts & OPT_VERBOSE)
+ verbose(0x1fffffff, fmt, pvar);
+ va_end(pvar);
+}
diff --git a/contrib/ipfilter/lib/vtof.c b/contrib/ipfilter/lib/vtof.c
new file mode 100644
index 0000000..fd1a984
--- /dev/null
+++ b/contrib/ipfilter/lib/vtof.c
@@ -0,0 +1,16 @@
+#include "ipf.h"
+
+int
+vtof(version)
+ int version;
+{
+#ifdef USE_INET6
+ if (version == 6)
+ return AF_INET6;
+#endif
+ if (version == 4)
+ return AF_INET;
+ if (version == 0)
+ return AF_UNSPEC;
+ return -1;
+}
OpenPOWER on IntegriCloud