diff options
Diffstat (limited to 'package/dsniff/patches/patch-record_c')
-rw-r--r-- | package/dsniff/patches/patch-record_c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/package/dsniff/patches/patch-record_c b/package/dsniff/patches/patch-record_c new file mode 100644 index 000000000..cd63e0969 --- /dev/null +++ b/package/dsniff/patches/patch-record_c @@ -0,0 +1,151 @@ +$Id$ +--- dsniff-2.4.orig/record.c 2001-03-15 09:33:04.000000000 +0100 ++++ dsniff-2.4/record.c 2007-01-23 00:20:48.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,7 +59,6 @@ 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); + +@@ -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); + } + |