--- /dev/null
+#
+# Copyright (C) 2007 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+# $Id: $
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=flow-tools
+PKG_VERSION:=0.68
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=ftp://ftp.eng.oar.net/pub/flow-tools/
+PKG_MD5SUM:=c9e0a8b53c79611b6bffcb9d510a5a38
+PKG_CAT:=zcat
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/flow-tools
+ SECTION:=net
+ CATEGORY:=Network
+ TITLE:=flow-tools
+ DESCRIPTION:=\
+ Flow-tools is a software package for collecting and processing \\\
+ NetFlow data from Cisco and Juniper routers.
+ URL:=http://www.splintered.net/sw/flow-tools/
+endef
+
+define Build/Compile
+ $(call Build/Compile/Default)
+endef
+
+define Package/flow-tools/install
+ $(INSTALL_DIR) $(1)/usr/bin/
+ $(CP) $(PKG_BUILD_DIR)/src/flow-* $(1)/usr/bin/
+endef
+
+$(eval $(call BuildPackage,flow-tools))
--- /dev/null
+-- flow-tools-0.68.orig/configure 2007-02-08 07:21:42.000000000 -0500
++++ flow-tools-0.68/configure 2007-02-08 07:53:42.000000000 -0500
+@@ -6308,7 +6308,7 @@
+ See \`config.log' for more details." >&5
+ echo "$as_me: error: cannot run test program while cross compiling
+ See \`config.log' for more details." >&2;}
+- { (exit 1); exit 1; }; }
++}
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+ #line $LINENO "configure"
--- /dev/null
+--- flow-tools-0.68.orig/Makefile.in 2007-02-08 07:21:42.000000000 -0500
++++ flow-tools-0.68/Makefile.in 2007-02-08 08:18:36.000000000 -0500
+@@ -70,7 +70,7 @@
+ DEPDIR = @DEPDIR@
+ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ LEX = @LEX@
+-LEXLIB = @LEXLIB@
++LEXLIB =
+ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+ MYSQLCFLAGS = @MYSQLCFLAGS@
+ MYSQLINCLUDE = @MYSQLINCLUDE@
+--- flow-tools-0.68.orig/src/Makefile.in 2007-02-08 07:21:42.000000000 -0500
++++ flow-tools-0.68/src/Makefile.in 2007-02-08 08:18:31.000000000 -0500
+@@ -70,7 +70,7 @@
+ DEPDIR = @DEPDIR@
+ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ LEX = @LEX@
+-LEXLIB = @LEXLIB@
++LEXLIB =
+ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+ MYSQLCFLAGS = @MYSQLCFLAGS@
+ MYSQLINCLUDE = @MYSQLINCLUDE@
+--- flow-tools-0.68.orig/src/acllex.c 2007-02-08 07:21:42.000000000 -0500
++++ flow-tools-0.68/src/acllex.c 2007-02-08 08:25:10.000000000 -0500
+@@ -503,7 +503,9 @@
+ #ifdef __cplusplus
+ extern "C" int yywrap YY_PROTO(( void ));
+ #else
+-extern int yywrap YY_PROTO(( void ));
++int yywrap (void ) {
++ return 1;
++}
+ #endif
+ #endif
+
+--- flow-tools-0.68.orig/configure 2007-02-08 07:21:42.000000000 -0500
++++ flow-tools-0.68/configure 2007-02-08 08:19:30.000000000 -0500
+@@ -2952,7 +2952,7 @@
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+-LIBS="-lfl $LIBS"
++LIBS="$LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+ #line $LINENO "configure"
+ /* confdefs.h. */
--- /dev/null
+diff --git a/bin/flow-log2rrd b/bin/flow-log2rrd
+index 0567ba5..db4fdda 100755
+--- a/bin/flow-log2rrd
++++ b/bin/flow-log2rrd
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/python
++#!/bin/env python
+
+ import getopt
+ import os
+diff --git a/bin/flow-rpt2rrd b/bin/flow-rpt2rrd
+index 72a74c7..7698f2b 100755
+--- a/bin/flow-rpt2rrd
++++ b/bin/flow-rpt2rrd
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/python
++#!/bin/env python
+
+ import getopt
+ import os
+diff --git a/bin/flow-rptfmt b/bin/flow-rptfmt
+index 047d1ba..f663fae 100755
+--- a/bin/flow-rptfmt
++++ b/bin/flow-rptfmt
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/python
++#!/bin/env python
+
+ import sys
+ import string
--- /dev/null
+diff --git a/lib/ftchash.c b/lib/ftchash.c
+index 9cc7efa..28bafbf 100644
+--- a/lib/ftchash.c
++++ b/lib/ftchash.c
+@@ -326,7 +326,7 @@ void *ftchash_foreach(struct ftchash *ft
+ (char*)ftch->traverse_chunk->base+ftch->traverse_chunk->next) {
+
+ ret = ftch->traverse_rec;
+- (char*)ftch->traverse_rec += ftch->d_size;
++ ftch->traverse_rec = vpadd(ftch->traverse_rec, ftch->d_size);
+ return ret;
+
+ } else {
+diff --git a/lib/ftio.c b/lib/ftio.c
+index f6c739c..1082416 100644
+--- a/lib/ftio.c
++++ b/lib/ftio.c
+@@ -2267,7 +2267,7 @@ int readn(register int fd, register void
+ break;
+
+ nleft -= nread;
+- (char*)ptr += nread;
++ ptr = vpadd(ptr, nread);
+ }
+ return (nbytes - nleft);
+ } /* readn */
+@@ -2292,7 +2292,7 @@ int writen(register int fd, register voi
+ return(nwritten); /* error */
+
+ nleft -= nwritten;
+- (char*)ptr += nwritten;
++ ptr = vpadd(ptr,nwritten);
+ }
+ return(nbytes - nleft);
+ } /* writen */
+diff --git a/lib/ftlib.h b/lib/ftlib.h
+index f91ad0a..66bf2f3 100644
+--- a/lib/ftlib.h
++++ b/lib/ftlib.h
+@@ -152,7 +152,6 @@ #define FT_PDU_V8_11_MAXFLOWS 44 /* max
+ #define FT_PDU_V8_12_MAXFLOWS 44 /* max records in V8 DST_PREFIX_TOS packet */
+ #define FT_PDU_V8_13_MAXFLOWS 35 /* max records in V8 PREFIX_TOS packet */
+ #define FT_PDU_V8_14_MAXFLOWS 35 /* max records in V8 PREFIX_PORT_TOS packet */
+-
+ #define FT_PDU_V8_1_VERSION 2 /* version of AS packet */
+ #define FT_PDU_V8_2_VERSION 2 /* version of PROTO PORT packet */
+ #define FT_PDU_V8_3_VERSION 2 /* version of SRC PREFIX packet */
+@@ -3029,6 +3028,8 @@ #ifndef IN_CLASSD_SSM
+ #define IN_CLASSD_SSM(i) (((u_int32_t)(i) & 0xff000000) == 0xe8000000)
+ #endif /* IN_CLASSD_SSM */
+
++void *vpadd(const void* v, const int change);
++
+ /* MACHINE DEPENDANT */
+ #define fmt_uint fmt_uint32
+
+diff --git a/lib/fttlv.c b/lib/fttlv.c
+index 7035813..330a783 100644
+--- a/lib/fttlv.c
++++ b/lib/fttlv.c
+@@ -68,10 +68,10 @@ int fttlv_enc_uint32(void *buf, int buf_
+ }
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&v, buf, 4);
+
+@@ -107,10 +107,10 @@ int fttlv_enc_uint16(void *buf, int buf_
+ }
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&v, buf, 2);
+
+@@ -145,10 +145,10 @@ int fttlv_enc_uint8(void *buf, int buf_s
+ }
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&v, buf, 1);
+
+@@ -183,10 +183,10 @@ int fttlv_enc_str(void *buf, int buf_siz
+ }
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(v, buf, len);
+
+@@ -230,16 +230,16 @@ int fttlv_enc_ifname(void *buf, int buf_
+ return -1;
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&ip, buf, 4);
+- (char*)buf += 4;
++ buf = vpadd(buf, 4);
+
+ bcopy(&ifIndex, buf, 2);
+- (char*)buf += 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(name, buf, n);
+
+@@ -287,19 +287,19 @@ int fttlv_enc_ifalias(void *buf, int buf
+ }
+
+ bcopy(&t, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&len, buf, 2);
+- (char*)buf+= 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(&ip, buf, 4);
+- (char*)buf += 4;
++ buf = vpadd(buf, 4);
+
+ bcopy(&entries, buf, 2);
+- (char*)buf += 2;
++ buf = vpadd(buf, 2);
+
+ bcopy(ifIndex_list, buf, esize);
+- (char*)buf += esize;
++ buf = vpadd(buf, esize);
+
+ bcopy(name, buf, n);
+
+diff --git a/lib/support.c b/lib/support.c
+index a32ffe7..2e1db9f 100644
+--- a/lib/support.c
++++ b/lib/support.c
+@@ -736,3 +736,8 @@ int udp_cksum(struct ip *ip, struct udph
+ return sum;
+ } /* udp_cksum */
+
++// void pointer add
++
++void * vpadd(const void *v, const int change) {
++ return (void *) (((char*) v) + change);
++}
--- /dev/null
+diff --git a/lib/ftfile.c b/lib/ftfile.c
+index 2f3ae76..f25e849 100644
+--- a/lib/ftfile.c
++++ b/lib/ftfile.c
+@@ -53,7 +53,7 @@ #endif
+
+ int load_dir(char *prefix, struct ftfile_entries *fte, int flags, int *depth);
+
+-extern int debug;
++#define debug 0
+
+ /*
+ * function: ftfile_entry_new
--- /dev/null
+diff --git a/lib/ftfile.c b/lib/ftfile.c
+index f25e849..ec17771 100644
+--- a/lib/ftfile.c
++++ b/lib/ftfile.c
+@@ -413,16 +413,17 @@ void ftfile_pathname(char *buf, int bsiz
+ int done, u_int32 ftime)
+ {
+ struct tm *tm;
++ time_t _t = (time_t) ftime;
+ char *prefix, dbuf[64];
+ long gmt_val;
+ char gmt_sign;
+ int tm_gmtoff;
+
+- if (!(tm = localtime ((time_t*)&ftime))) {
++ if (!(tm = localtime (&_t))) {
+ snprintf(buf, bsize, ".");
+ }
+
+- tm_gmtoff = get_gmtoff(ftime);
++ tm_gmtoff = get_gmtoff(_t);
+
+ /* compute GMT offset */
+ if (tm_gmtoff >= 0) {
+@@ -502,6 +503,7 @@ void ftfile_pathname(char *buf, int bsiz
+ int ftfile_mkpath(u_int32 ftime, int nest)
+ {
+ struct tm *tm;
++ time_t _t = (time_t) ftime;
+ char buf[32];
+
+ /* no directories */
+@@ -512,7 +514,7 @@ int ftfile_mkpath(u_int32 ftime, int nes
+ if ((nest > 3) || (nest < -3))
+ return -1;
+
+- if (!(tm = localtime ((time_t*)&ftime)))
++ if (!(tm = localtime (&_t)))
+ return -1;
+
+ if (nest == -1)
--- /dev/null
+diff --git a/src/flow-send.c b/src/flow-send.c
+index 83ca926..ad87024 100644
+--- a/src/flow-send.c
++++ b/src/flow-send.c
+@@ -76,7 +76,7 @@ int main(int argc, char **argv)
+ u_int32 privacy_mask;
+ unsigned int v1, v2, one;
+ int i, n, ret, tx_delay, udp_sock;
+- int src_ip_spoof, hdr_len;
++ int src_ip_spoof, hdr_len = 0;
+ void *rec;
+
+ /* init fterr */
--- /dev/null
+diff --git a/lib/ftdecode.c b/lib/ftdecode.c
+index ff6b0cf..8884db9 100644
+--- a/lib/ftdecode.c
++++ b/lib/ftdecode.c
+@@ -122,8 +122,10 @@ int ftpdu_verify(struct ftpdu *ftpdu)
+ ret = -1;
+
+ /* enough bytes to decode the count and version? */
+- if (ftpdu->bused < 4)
++ if (ftpdu->bused < 4) {
++ fterr_warnx("not enough bytes to decode the count and version.");
+ goto ftpdu_verify_out_quick;
++ }
+
+ ph = (struct ftpdu_header*)&ftpdu->buf;
+
+@@ -158,15 +160,22 @@ #endif /* LITTLE_ENDIAN */
+ case 5:
+
+ /* max PDU's in record */
+- if (ph->count > FT_PDU_V5_MAXFLOWS)
++ if (ph->count > FT_PDU_V5_MAXFLOWS) {
++ fterr_warnx("too many pdus (%d) in record, max %d", ph->count,
++ FT_PDU_V5_MAXFLOWS);
+ goto ftpdu_verify_out;
++ }
++
+
+ size = offsetof(struct ftpdu_v5, records) +
+ ph->count * sizeof (struct ftrec_v5);
+
+ /* PDU received size == PDU expected size? */
+- if (size != ftpdu->bused)
++ if (size != ftpdu->bused) {
++ fterr_warnx("pdu received size was wrong. expected %d got %d",
++ ftpdu->bused, size);
+ goto ftpdu_verify_out;
++ }
+
+ ftpdu->ftv.d_version = 5;
+ ftpdu->decodef = fts3rec_pdu_v5_decode;
+@@ -516,6 +525,7 @@ #endif /* LITTLE_ENDIAN */
+ break; /* 8 */
+
+ default:
++ fterr_warnx("ftpdu version not set.");
+ goto ftpdu_verify_out;
+
+ } /* switch ph->version */
--- /dev/null
+diff --git a/src/flow-export.c b/src/flow-export.c
+index 52ae4d2..22b0330 100644
+--- a/src/flow-export.c
++++ b/src/flow-export.c
+@@ -961,7 +961,7 @@ #endif /* PGSQL */
+
+ int fmt_xfields_type(char *buf, u_int64 xfield)
+ {
+- int comma;
++ int comma = 0;
+
+ buf[0] = 0;
+