tcpick: Renewed version with several patches.

Message ID 1506356404-15692-1-git-send-email-erik.kapfer@ipfire.org
State Dropped
Headers
Series tcpick: Renewed version with several patches. |

Commit Message

Erik Kapfer Sept. 26, 2017, 2:20 a.m. UTC
  Patches has been included for:
- Fix for CVE-2006-0048
- Fix for build with GCC 5.
- Fix for double free error.
- Fix for man invocation.
- Fix for timestamp pcap header structure.
---
 config/rootfiles/packages/tcpick                   |   3 +
 lfs/tcpick                                         |  94 +++++++++
 make.sh                                            |   1 +
 src/patches/tcpick/001-CVE-2006-0048.patch         |  19 ++
 src/patches/tcpick/002-fix-build-with-gcc5.patch   | 233 +++++++++++++++++++++
 src/patches/tcpick/003-fix-double-free-error.patch |  40 ++++
 src/patches/tcpick/004-fix-man-invocation.patch    |  22 ++
 .../005-set-timestamp-pcap-header-structure.patch  |  77 +++++++
 .../006-avoid-implicitly-converted-pointers.patch  | 107 ++++++++++
 9 files changed, 596 insertions(+)
 create mode 100644 config/rootfiles/packages/tcpick
 create mode 100644 lfs/tcpick
 create mode 100644 src/patches/tcpick/001-CVE-2006-0048.patch
 create mode 100644 src/patches/tcpick/002-fix-build-with-gcc5.patch
 create mode 100644 src/patches/tcpick/003-fix-double-free-error.patch
 create mode 100644 src/patches/tcpick/004-fix-man-invocation.patch
 create mode 100644 src/patches/tcpick/005-set-timestamp-pcap-header-structure.patch
 create mode 100644 src/patches/tcpick/006-avoid-implicitly-converted-pointers.patch
  

Comments

ummeegge Sept. 26, 2017, 2:28 a.m. UTC | #1
Hi all,
since Debian and Ubuntu did some nice work to bring tcpick in a newer state, i tested some patches on IPFire and tcpick works here again without problems. It builds smoothly on Core 114 environment. Have tested it already on 32 and 64 bit architecture with several options and it makes a good impression for me. Might be nice if we can include it again into IPFire, the Wiki still exists :-) .

Greetings,

Erik
  

Patch

diff --git a/config/rootfiles/packages/tcpick b/config/rootfiles/packages/tcpick
new file mode 100644
index 0000000..d0bc1b1
--- /dev/null
+++ b/config/rootfiles/packages/tcpick
@@ -0,0 +1,3 @@ 
+usr/bin/tcpick
+#usr/share/man/man8/tcpick.8
+#usr/share/man/man8/tcpick_italian.8
diff --git a/lfs/tcpick b/lfs/tcpick
new file mode 100644
index 0000000..55d11b0
--- /dev/null
+++ b/lfs/tcpick
@@ -0,0 +1,94 @@ 
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
+#                                                                             #
+# This program is free software: you can redistribute it and/or modify        #
+# it under the terms of the GNU General Public License as published by        #
+# the Free Software Foundation, either version 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 0.2.1
+
+THISAPP    = tcpick-$(VER)
+DL_FILE    = $(THISAPP).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+TARGET     = $(DIR_INFO)/$(THISAPP)
+PROG       = tcpick
+PAK_VER    = 1
+
+DEPS       = ""
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = bb94f2f9ea81aeb645619fbe9b3b9a29
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+dist: 
+	@$(PAK)
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+	@$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+	@$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+	@$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+	@$(PREBUILD)
+	@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/001-CVE-2006-0048.patch
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/002-fix-build-with-gcc5.patch
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/003-fix-double-free-error.patch
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/004-fix-man-invocation.patch
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/005-set-timestamp-pcap-header-structure.patch
+	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/tcpick/006-avoid-implicitly-converted-pointers.patch
+
+	cd $(DIR_APP) && ./autogen.sh
+	cd $(DIR_APP) && ./configure --prefix=/usr
+	cd $(DIR_APP) && make $(MAKETUNING)
+	cd $(DIR_APP) && make install
+
+	@rm -rf $(DIR_APP)
+	@$(POSTBUILD)
diff --git a/make.sh b/make.sh
index f79f627..239add8 100755
--- a/make.sh
+++ b/make.sh
@@ -887,6 +887,7 @@  buildipfire() {
   lfsmake2 perl-Net-IP
   lfsmake2 wio
   lfsmake2 iftop
+  lfsmake2 tcpick
 }
 
 buildinstaller() {
diff --git a/src/patches/tcpick/001-CVE-2006-0048.patch b/src/patches/tcpick/001-CVE-2006-0048.patch
new file mode 100644
index 0000000..29ba2e1
--- /dev/null
+++ b/src/patches/tcpick/001-CVE-2006-0048.patch
@@ -0,0 +1,19 @@ 
+Description: Fix for CVE-2006-0048
+Author: Cédric Delfosse <cedric@debian.org>
+Origin: vendor
+Bug-Debian: http://bugs.debian.org/360571
+Last-Update: 2006-04-14
+
+diff -Nur tcpick-0.2.1_orig/src/write.c tcpick-0.2.1/src/write.c
+--- tcpick-0.2.1_orig/src/write.c	2005-01-09 00:54:47.000000000 +0100
++++ tcpick-0.2.1/src/write.c	2017-09-20 12:31:14.735311570 +0200
+@@ -241,6 +241,9 @@
+ 	if( flags.separator && ( out == stdout ) ) /* FIXME: sucks? */
+ 		color( c_SEPARATOR, stdout, SEPARATOR "\n" );
+ 
++	/* Temporary fix for CVE-2006-0048 */
++	if (buflen < 0) buflen = 0;
++
+ 	switch ( flavour ) {
+ 	case HEX_ASCII_DUMP:
+ 		out_xa( out, buf, buflen );
diff --git a/src/patches/tcpick/002-fix-build-with-gcc5.patch b/src/patches/tcpick/002-fix-build-with-gcc5.patch
new file mode 100644
index 0000000..eefc56f
--- /dev/null
+++ b/src/patches/tcpick/002-fix-build-with-gcc5.patch
@@ -0,0 +1,233 @@ 
+Description: Fix build with GCC	5
+ GCC 5 is more picky with external references which are not properly
+ declared with forward references. Add all relevant functions to tcpick.h
+ to avoid this problem and fix the problems put into light by this change
+ (some invalid function calls).
+Author: Raphaël Hertzog <hertzog@debian.org>
+Bug-Debian: http://bugs.debian.org/778141
+Origin: vendor
+Last-Update: 2015-07-13
+
+--- a/src/tcpick.h
++++ b/src/tcpick.h
+@@ -10,10 +10,12 @@
+  */
+ 
+ #include "config.h"
++#define _GNU_SOURCE
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <unistd.h>
++#include <ctype.h>
+ 
+ #ifdef HAVE_SIGNAL_H
+ # include <signal.h>
+@@ -114,3 +116,102 @@
+ #include "flags.h"
+ #include "lookup.h"
+ #include "timer.h"
++
++/* From args.c */
++void parse_args(int argc, char ** argv);
++
++/* From colors.c */
++void textcolor(FILE * out, int attr, int fg, int bg);
++void resetcolor(FILE * out);
++void color(int attr, int fg, FILE * out, char *fmt, ...);
++
++/* From datalink.c */
++char *datalink2str(int dl_id);
++int datalink2off(int dl_id);
++
++/* From display.c */
++char * status2str(enum STATUS status);
++int display_status( FILE * out, struct CONN * conn, enum STATUS status );
++int display_header( FILE * out );
++int out_h( FILE * out, u_char * buf, int buflen );
++int out_hn( FILE * out, u_char * buf, int buflen );
++int out_p( FILE * out, u_char * buf, int buflen );
++int out_xa (FILE * out, u_char * buf, int buflen);
++int out_x (FILE * out, u_char * buf, int buflen);
++
++/* From fragments.c */
++int
++addfr( struct FRAGMENT ** first,
++       int wlen,
++       u_int32_t data_off,
++       u_char * payload,
++       int payload_len );
++
++int
++flush_ack( struct HOST_DESC * desc,
++           struct CONN * conn_ptr,
++           int ack_num );
++
++/* From lookup_query.c */
++char * lookup_new(struct in_addr ia);
++char * lookup(struct in_addr ia);
++char * getportname(u_int16_t port);
++
++/* From lookup_tree.c */
++struct _l_node *_l_alloc(struct in_addr, char *);
++char *_l_get(struct in_addr);
++int _l_insert(struct _l_node * new);
++
++/* Form msg.c */
++void err(char *fmt, ...);
++void msg(int v, int attr, int fg, char *fmt, ...);
++void sorry(char * func, char * desc);
++
++/* From quit.c */
++void fault(char * func, char * desc);
++void suicide(char * func, char * fmt, ...);
++void print_statistics();
++void cleanup();
++void exit_signal(int sig_type);
++
++/* From tcpick.c */
++void signal_setup(int sig, void (*handler)(  ));
++
++/* From time.c */
++char * time_ascii(char * ret);
++
++/* From timer.c */
++void set_timer();
++void check_expired();
++void sigalrm_callback(int sig_type);
++
++/* From tracker.c */
++int status_switch(struct CONN * prev, enum STATUS status);
++int newconn( struct CONN * prev_ring );
++int rmconn( struct CONN * prev_ring );
++int free_desc( struct HOST_DESC * desc, int freedescfilename );
++
++/* From verify.c */
++int
++verify();
++
++/* From write.c */
++char *
++avail_filename(struct CONN * conn_ptr,
++               enum PART side, char * ext);
++
++void
++open_file(struct CONN * conn_ptr,
++          struct HOST_DESC * desc);
++
++int
++flowflush(struct CONN * conn_ptr,
++          struct HOST_DESC * desc,
++          u_char * buf,
++          int buflen);
++
++int
++out_flavour(enum FLAVOUR flavour,
++            FILE * out,
++            u_char * buf,
++            int buflen);
+--- a/src/loop.c
++++ b/src/loop.c
+@@ -95,8 +95,7 @@ got_packet (u_char * useless,
+ #endif /* TCPICK_DEBUG */
+ 
+ 		if( flags.header > 0 )
+-			display_header( stdout, ippacket, tcppacket, 
+-					payload_len );
++			display_header(stdout);
+ 		
+ 		verify(); /* call the core to manage the packet */
+ 
+--- a/src/display.c
++++ b/src/display.c
+@@ -297,7 +297,7 @@ out_x (FILE * out, u_char * buf, int buf
+ 					color( c_NONPRINT, out, pos % 2 ? "%2.2x " : "%2.2x", *( buf + pos ) );
+ 			else
+ 				/* hex space fill */
+-				fprintf(out, pos % 2 ? "   " : "  ", *( buf + pos ) );
++				fprintf(out, pos % 2 ? "   " : "  ");
+ 			pos++;
+ 		} while ( pos % 16 );
+ 		
+--- a/src/tcpick.c
++++ b/src/tcpick.c
+@@ -50,10 +50,10 @@
+ #include "tcpick.h"
+ #include "globals.h"
+ 
+-char *errbuf[PCAP_ERRBUF_SIZE];
++char errbuf[PCAP_ERRBUF_SIZE];
+ struct bpf_program filter_compiled;
+ bpf_u_int32 netp; /* ip */
+-bpf_u_int32 maskp; /* subnet mask */
++bpf_u_int32 maskp = PCAP_NETMASK_UNKNOWN; /* subnet mask */
+ struct in_addr addr;
+ char *other_args = NULL;
+ pcap_t *descr;
+@@ -238,7 +238,7 @@ int main(int argc, char **argv)
+ 				    &filter_compiled,
+ 				    filter, 
+ 				    0, 
+-				    (int)net 
++				    maskp
+ 			      ) == -1) )
+ 			err("error compiling filter \"%s\"",filter);
+ 
+--- a/src/time.c
++++ b/src/time.c
+@@ -42,7 +42,7 @@ char * time_ascii(char * ret)
+   tzp = (struct timezone * ) S_malloc( sizeof(struct timezone) );
+ 
+   memset(tp,  0, sizeof(struct timeval));
+-  memset(tzp, 0, sizeof(struct timeval));
++  memset(tzp, 0, sizeof(struct timezone));
+   
+   if(gettimeofday(tp, tzp)) {
+ 
+@@ -58,7 +58,7 @@ char * time_ascii(char * ret)
+ 			  brokentime->tm_hour,
+ 			  brokentime->tm_min,
+ 			  brokentime->tm_sec,
+-			  tp->tv_usec
++			  (int)tp->tv_usec
+ 			  );
+ 		  break;
+ 
+@@ -79,7 +79,7 @@ char * time_ascii(char * ret)
+ 			  brokentime->tm_hour,
+ 			  brokentime->tm_min,
+ 			  brokentime->tm_sec,
+-			  tp->tv_usec
++			  (int)tp->tv_usec
+ 			  );
+ 		  break;
+ 		  
+@@ -99,7 +99,7 @@ char * time_ascii(char * ret)
+   return ret;
+ 
+ retNULL:
+-  sprintf(ret,"");
++  ret[0] = '\0';
+   return NULL;
+ 
+ }
+--- a/src/debug.c
++++ b/src/debug.c
+@@ -32,7 +32,7 @@ void
+ print_conn_chain (struct CONN * f)
+ {
+ 	while (f) {
+-		printf ("%x->",f);
++		printf ("%p->",f);
+ 		
+ 		if (f == f->next) {
+ 			printf ("inf\n");
+@@ -48,7 +48,7 @@ int
+ print_fragment_chain(struct FRAGMENT * f)
+ {
+ 	while (f) {
+-		printf ("%x(%i,%i)->",f,f->off,f->len);
++		printf ("%p(%i,%i)->",f,f->off,f->len);
+ 
+ 		if (f == f->next) {
+ 			printf ("inf\n");
diff --git a/src/patches/tcpick/003-fix-double-free-error.patch b/src/patches/tcpick/003-fix-double-free-error.patch
new file mode 100644
index 0000000..c5d934b
--- /dev/null
+++ b/src/patches/tcpick/003-fix-double-free-error.patch
@@ -0,0 +1,40 @@ 
+Description: Fix double-free error
+ tcpick try to free twice the pointer to the filename it uses to write
+ the data. This patches fixes that.
+Author: Cedric Delfosse <cedric@debian.org>
+Bug-Debian: http://bugs.debian.org/319864
+Last-Update: 2005-07-26
+Origin: vendor, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=319864#19
+
+--- a/src/tracker.c
++++ b/src/tracker.c
+@@ -99,8 +99,9 @@ int rmconn( struct CONN * prev_ring )
+ 	if( curr->next == NULL )
+ 		last_conn = prev_ring;
+ 	
+-	free_desc( &(curr->client) );
+-	free_desc( &(curr->server) );
++	free_desc( &(curr->client), 1);
++	if (flags.writer.type == UNIQUE) free_desc( &(curr->server), 0);
++	else free_desc( &(curr->server), 1);
+ 	S_free( curr );
+ 
+ 	conn = first_conn;
+@@ -124,7 +125,7 @@ int rmconn( struct CONN * prev_ring )
+ 		count_opened--;
+ }
+ 
+-int free_desc( struct HOST_DESC * desc )
++int free_desc( struct HOST_DESC * desc, int freedescfilename )
+ /* frees the host descriptor and closes the file */
+ {
+ 	struct FRAGMENT * tmp;
+@@ -134,7 +135,7 @@ int free_desc( struct HOST_DESC * desc )
+ 		if (flags.writer.type == UNIQUE)
+ 			desc->oth->file = NULL;
+ 	}
+-	if( desc->filename ) {
++	if( desc->filename && freedescfilename ) {
+ 		S_free( desc->filename );
+ 		desc->filename = NULL;
+ 	}
diff --git a/src/patches/tcpick/004-fix-man-invocation.patch b/src/patches/tcpick/004-fix-man-invocation.patch
new file mode 100644
index 0000000..411cfd8
--- /dev/null
+++ b/src/patches/tcpick/004-fix-man-invocation.patch
@@ -0,0 +1,22 @@ 
+Description: Fix man invocation
+ Upon startup, tcpick says:
+ .
+ important: `man 1 tcpick' explains all options available
+ .
+ but the man page is in section 8, not 1. This patch fixes that.
+Bug-Debian: http://bugs.debian.org/265067
+Origin: vendor
+Author: Cédric Delfosse <cedric@debian.org>
+Last-Update: 2004-08-18
+
+--- a/src/args.c
++++ b/src/args.c
+@@ -386,7 +386,7 @@ parse_args(int argc, char ** argv)
+ 	if(flags.versionandquit) {
+ 		color( c_USAGE, stdout, PACKAGE_STRING "\n"
+ 			     " Author: " AUTHOR "\n"
+-			     " for other info try `man 1 tcpick', or `%s --help'\n\n"
++			     " for other info try `man tcpick', or `%s --help'\n\n"
+ 			     TERMS ,TCPICK_NAME);
+ 		exit( TCPICK_SUCCESS );
+ 	}
diff --git a/src/patches/tcpick/005-set-timestamp-pcap-header-structure.patch b/src/patches/tcpick/005-set-timestamp-pcap-header-structure.patch
new file mode 100644
index 0000000..288887b
--- /dev/null
+++ b/src/patches/tcpick/005-set-timestamp-pcap-header-structure.patch
@@ -0,0 +1,77 @@ 
+Description:Tcpick can display timestamps in the output with the -t and -td switch. It currently computes a timestamp on the fly which has the following consequences
+* Inaccurate timestamps when it is operated in real time mode (-i switch)
+* Nonsense when reassembling off-line captures / when reading pcap files
+Author: Gerard Wagener
+Bug-Ubuntu:https://bugs.launchpad.net/ubuntu/+source/tcpick/+bug/364688
+
+--- a/src/extern.h
++++ b/src/extern.h
+@@ -13,6 +13,7 @@
+ extern struct ip *ippacket;
+ extern struct tcphdr *tcppacket;
+ extern struct udphdr *udppacket;
++extern struct pcap_pkthdr* phdr;
+ extern u_char *payload;
+ extern int payload_len;
+ extern struct FLAGS flags;
+--- a/src/globals.h
++++ b/src/globals.h
+@@ -12,6 +12,7 @@
+ struct ip *ippacket;
+ struct tcphdr *tcppacket;
+ struct udphdr *udppacket;
++struct pcap_pkthdr* phdr = NULL;
+ u_char *payload;
+ int payload_len = 0;
+ struct FLAGS flags;
+--- a/src/loop.c
++++ b/src/loop.c
+@@ -38,6 +38,9 @@
+ 
+ { /* FIXME: this function is too long */
+ 
++/* Keep track of the original pcap header in order to put correct timestamps */
++    phdr=(struct pcap_pkthdr *)hdr;
++
+ 	/* check if the flag for checking for expired connections 
+ 	   is turned on */
+ 	
+--- a/src/time.c
++++ b/src/time.c
+@@ -32,22 +32,16 @@
+ {
+ 
+   struct timeval  *tp;
+-  struct timezone *tzp;
+   struct tm * brokentime;
+ 
+   if(flags.displaytime == NOTHING_TIME)
+ 	  goto retNULL;
+ 
+-  tp  = (struct timeval  * ) S_malloc( sizeof(struct timeval) );
+-  tzp = (struct timezone * ) S_malloc( sizeof(struct timezone) );
++  tp = &phdr->ts;
++  if(!tp) {
+ 
+-  memset(tp,  0, sizeof(struct timeval));
+-  memset(tzp, 0, sizeof(struct timezone));
+-  
+-  if(gettimeofday(tp, tzp)) {
+-
+-	  perror("gettimeofday returned not 0!");
+-	  goto retNULL;
++    perror("No timestamp was available!");
++    goto retNULL;
+ 
+   } else {
+ 	  brokentime = localtime(&(tp->tv_sec));
+@@ -93,9 +87,6 @@
+ 	  }
+   }
+ 
+-  S_free ( tp ); 
+-  S_free ( tzp );
+-
+   return ret;
+ 
+ retNULL:
diff --git a/src/patches/tcpick/006-avoid-implicitly-converted-pointers.patch b/src/patches/tcpick/006-avoid-implicitly-converted-pointers.patch
new file mode 100644
index 0000000..635ce2c
--- /dev/null
+++ b/src/patches/tcpick/006-avoid-implicitly-converted-pointers.patch
@@ -0,0 +1,107 @@ 
+Description: Avoid implicitly converted pointers
+ Implicitly converted pointers will cause segfault on architectures where
+ the size of a pointer is greater than the size of an integer, such as
+ ia64.
+Author: dann frazier <dannf@dannf.org>
+Origin: vendor, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=326927#5
+Bug-Debian: http://bugs.debian.org/326927
+Last-Update: 2005-09-06
+Modified: 2017-09-20
+Author: Erik Kapfer <erik.kapfer@ipfire.org>
+Description: Added avoid-implicitly-converted-pointers.patch again to
+ prevent hunk with set-timestamp-header-structure.patch
+
+diff -Nur tcpick-0.2.1_orig/src/datalink.h tcpick-0.2.1/src/datalink.h
+--- tcpick-0.2.1_orig/src/datalink.h	1970-01-01 01:00:00.000000000 +0100
++++ tcpick-0.2.1/src/datalink.h	2017-09-20 12:43:25.711276936 +0200
+@@ -0,0 +1,29 @@
++/*
++ * datalink.h -- calculates datalink offsets
++ * Part of the tcpick project
++ *
++ * Author: Francesco Stablum <duskdruid @ despammed.com>
++ *
++ * Copyright (C) 2003, 2004  Francesco Stablum
++ * Licensed under the GPL
++ *
++ */
++
++/* 
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at you option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
++ * See the GNU General Public License for more details.
++ * 
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
++ * USA.
++ */
++
++char *datalink2str(int dl_id);
+\ Kein Zeilenumbruch am Dateiende.
+diff -Nur tcpick-0.2.1_orig/src/display.c tcpick-0.2.1/src/display.c
+--- tcpick-0.2.1_orig/src/display.c	2017-09-20 12:40:04.803286455 +0200
++++ tcpick-0.2.1/src/display.c	2017-09-20 12:43:54.719275562 +0200
+@@ -28,6 +28,7 @@
+ /* FIXME: most code is duplicated: find a better solution! */
+ 
+ #include "tcpick.h"
++#include "lookup.h"
+ #include "extern.h"
+ 
+ char * 
+diff -Nur tcpick-0.2.1_orig/src/lookup.h tcpick-0.2.1/src/lookup.h
+--- tcpick-0.2.1_orig/src/lookup.h	2004-12-31 14:53:30.000000000 +0100
++++ tcpick-0.2.1/src/lookup.h	2017-09-20 12:44:38.719273477 +0200
+@@ -26,6 +26,8 @@
+  * USA.
+  */
+ 
++#ifndef _LOOKUP_H
++#define _LOOKUP_H
+ 
+ struct _l_node /* the node/leaf of the tree */
+ {
+@@ -40,3 +42,9 @@
+ 	char * name;
+ 	struct in_addr ip;
+ };
++
++char *lookup(struct in_addr ia);
++struct _l_node *_l_alloc(struct in_addr, char *);
++char *_l_get(struct in_addr);
++
++#endif
+\ Kein Zeilenumbruch am Dateiende.
+diff -Nur tcpick-0.2.1_orig/src/tcpick.c tcpick-0.2.1/src/tcpick.c
+--- tcpick-0.2.1_orig/src/tcpick.c	2017-09-20 12:40:36.319284962 +0200
++++ tcpick-0.2.1/src/tcpick.c	2017-09-20 12:45:07.895272095 +0200
+@@ -49,6 +49,7 @@
+ 
+ #include "tcpick.h"
+ #include "globals.h"
++#include "datalink.h"
+ 
+ char errbuf[PCAP_ERRBUF_SIZE];
+ struct bpf_program filter_compiled;
+diff -Nur tcpick-0.2.1_orig/src/write.c tcpick-0.2.1/src/write.c
+--- tcpick-0.2.1_orig/src/write.c	2017-09-20 12:39:56.783286835 +0200
++++ tcpick-0.2.1/src/write.c	2017-09-20 12:46:49.223267294 +0200
+@@ -25,8 +25,11 @@
+  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  */
+ 
++#define _GNU_SOURCE
++#include <string.h>
+ #include "tcpick.h"
+ #include "extern.h"
++#include "lookup.h"
+ 
+ __inline__ char * 
+ avail_filename(struct CONN * conn_ptr,