$Id$
--- dsniff-2.4.orig/record.c	2001-03-15 09:33:04.000000000 +0100
+++ dsniff-2.4/record.c	2009-12-11 12:49:32.000000000 +0100
@@ -15,12 +15,7 @@
 #include <stdio.h>
 #include <time.h>
 #include <md5.h>
-#ifdef HAVE_DB_185_H
-#define DB_LIBRARY_COMPATIBILITY_API
-#include <db_185.h>
-#elif HAVE_DB_H
-#include <db.h>
-#endif
+#include <gdbm.h>
 #include <libnet.h>
 
 #include "options.h"
@@ -37,7 +32,7 @@ struct rec {
 	struct netobj	data;
 };
 	
-static DB *db;
+GDBM_FILE dbf;
 
 static int
 xdr_rec(XDR *xdrs, struct rec *rec)
@@ -64,9 +59,8 @@ record_print(struct rec *rec)
 	
 	tm = localtime(&rec->time);
 	strftime(tstr, sizeof(tstr), "%x %X", tm);
-	
-	srcp = libnet_host_lookup(rec->src, Opt_dns);
-	dstp = libnet_host_lookup(rec->dst, Opt_dns);
+	srcp = libnet_addr2name4(rec->src, Opt_dns);
+	dstp = libnet_addr2name4(rec->dst, Opt_dns);
 
 	if ((pr = getprotobynumber(rec->proto)) == NULL)
 		protop = "unknown";
@@ -89,10 +83,10 @@ record_print(struct rec *rec)
 	fflush(stdout);
 }
 
-static DBT *
+static datum
 record_hash(struct rec *rec)
 {
-	static DBT key;
+	static datum key;
 	static u_char hash[16];
 	MD5_CTX ctx;
 
@@ -105,16 +99,16 @@ record_hash(struct rec *rec)
 	MD5Update(&ctx, rec->data.n_bytes, rec->data.n_len);
 	MD5Final(hash, &ctx);
 
-	key.data = hash;
-	key.size = sizeof(hash);
+	key.dptr = hash;
+	key.dsize = sizeof(hash);
 	
-	return (&key);
+	return (key);
 }
 
 static int
 record_save(struct rec *rec)
 {
-	DBT *key, data;
+	datum key, data;
 	XDR xdrs;
 	u_char buf[2048];
 	
@@ -123,15 +117,15 @@ record_save(struct rec *rec)
 	if (!xdr_rec(&xdrs, rec))
 		return (0);
 	
-	data.data = buf;
-	data.size = xdr_getpos(&xdrs);
+	data.dptr = buf;
+	data.dsize = xdr_getpos(&xdrs);
 	
 	xdr_destroy(&xdrs);
 
 	key = record_hash(rec);
 	
-	if (db->put(db, key, &data, R_NOOVERWRITE) == 0)
-		db->sync(db, 0);
+	if (gdbm_store(dbf, key, data, GDBM_INSERT) == 0)
+		gdbm_sync(dbf);
 	
 	return (1);
 }
@@ -139,18 +133,22 @@ record_save(struct rec *rec)
 void
 record_dump(void)
 {
-	DBT key, data;
+	datum nextkey, key, content;
 	XDR xdrs;
 	struct rec rec;
 	
-	while (db->seq(db, &key, &data, R_NEXT) == 0) {	
+	key = gdbm_firstkey(dbf);
+	while (key.dptr) {	
+		nextkey = gdbm_nextkey(dbf, key);
+		content = gdbm_fetch(dbf, key);
 		memset(&rec, 0, sizeof(rec));
-		xdrmem_create(&xdrs, data.data, data.size, XDR_DECODE);
-		
+		xdrmem_create(&xdrs, content.dptr, content.dsize, XDR_DECODE);
 		if (xdr_rec(&xdrs, &rec)) {
 			record_print(&rec);
 		}
 		xdr_destroy(&xdrs);
+		free(key.dptr);
+		key = nextkey;
 	}
 }
 
@@ -158,16 +156,23 @@ int
 record_init(char *file)
 {
 	int flags, mode;
-	
+	// needed for gdbm_open, which does not have the option to create
+	// a database in memory
+	if(file == NULL) {
+		char *record_file = "/tmp/.dsniff.db";
+		file = record_file;
+	}
+
 	if (Opt_read) {
-		flags = O_RDONLY;
+		flags = GDBM_READER;
 		mode = 0;
 	}
 	else {
-		flags = O_RDWR|O_CREAT;
+		flags = GDBM_WRCREAT;
 		mode = S_IRUSR|S_IWUSR;
 	}
-	if ((db = dbopen(file, flags, mode, DB_BTREE, NULL)) == NULL)
+
+	if ((dbf = gdbm_open(file, 1024, flags, mode, NULL)) == NULL)
 		return (0);
 
 	return (1);
@@ -206,6 +211,6 @@ record(in_addr_t src, in_addr_t dst, int
 void
 record_close(void)
 {
-	db->close(db);
+	gdbm_close(dbf);
 }