$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 #include #include -#ifdef HAVE_DB_185_H -#define DB_LIBRARY_COMPATIBILITY_API -#include -#elif HAVE_DB_H -#include -#endif +#include #include #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); }