Don't use the bundled md5.c and getopt1.c in favor of OpenSSL and

USE_GETOPT_LONG respectively. This reduces the executable's size
considerably. (More ports should be doing this.)

When comparing md5 checksums (used to detect duplicates in the
input), treat each as a pair of 8-byte integers instead of calling
strncmp, which was just plain buggy. Memcmp should've been used
instead, but two integer comparisions are even faster.

Re-work the resizable array of checksums removing a separate malloc
call for each md5 checksum. This reduces the runtime memory consumption
considerably. (Tried using a hashtable instead of linearly searching
through the array, but did not see a speed-gain even over a large
collection of messages.)

Vendor notified, but has not responded (the software's last release
is several years old).

Bump PORTREVISION.

Approved by:	maintainer
This commit is contained in:
Mikhail Teterin 2007-03-09 08:05:08 +00:00
parent 1972dbab42
commit bd40f13590
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=186962
3 changed files with 179 additions and 0 deletions

View file

@ -7,6 +7,7 @@
PORTNAME= mboxgrep
PORTVERSION= 0.7.9
PORTREVISION= 1
CATEGORIES= mail
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@ -20,6 +21,8 @@ LIB_DEPENDS= pcre.0:${PORTSDIR}/devel/pcre
GNU_CONFIGURE= yes
CONFIGURE_ENV+= CFLAGS="${CFLAGS} -I${LOCALBASE}/include" LIBS="-L${LOCALBASE}/lib"
USE_OPENSSL= yes
USE_GETOPT_LONG=yes
MAN1= mboxgrep.1
INFO= mboxgrep

View file

@ -0,0 +1,160 @@
--- src/mboxgrep.h Sun Apr 6 17:01:49 2003
+++ src/mboxgrep.h Tue Feb 27 17:24:30 2007
@@ -29,4 +29,5 @@
#include <config.h>
+#include <stdint.h>
#include <time.h> /* for tm structure */
@@ -100,8 +101,13 @@
folder_t;
+typedef union {
+ uint64_t halves[2];
+ unsigned char bytes[16];
+} md5_t;
+
typedef struct
{
- char **md5;
int n;
+ md5_t md5s[];
}
checksum_t;
--- src/scan.c Sun Apr 6 17:01:49 2003
+++ src/scan.c Tue Feb 27 17:19:23 2007
@@ -60,5 +60,5 @@
#include "maildir.h"
#include "wrap.h"
-#include "md5.h"
+#include <openssl/md5.h>
#ifdef HAVE_FTS_OPEN
# include <sys/stat.h>
@@ -74,5 +74,8 @@
#endif /* HAVE_LIBDMALLOC */
-void scan_mailbox (char path[])
+static int md5_check_message (const char *body, size_t bbytes);
+
+void
+scan_mailbox (const char path[])
/* {{{ */
{
@@ -96,5 +99,4 @@
time_t tt;
struct tm *ct;
- extern checksum_t *cs;
extern option_t config;
@@ -145,10 +147,10 @@
if ((config.format == MBOX) || (config.format == ZMBOX) ||
(config.format == BZ2MBOX))
- msg = (message_t *) mbox_read_message (mbox);
+ msg = mbox_read_message (mbox);
else if ((config.format == MH) || (config.format == NNMH) ||
(config.format == NNML))
- msg = (message_t *) mh_read_message (boxd);
+ msg = mh_read_message (boxd);
else if (config.format == MAILDIR)
- msg = (message_t *) maildir_read_message (maildird);
+ msg = maildir_read_message (maildird);
if (msg == NULL) break;
@@ -179,5 +181,5 @@
if (config.dedup)
- isdup = md5_check_message (msg->body, cs);
+ isdup = md5_check_message (msg->body, msg->bbytes);
if (((res1 == 0) | (res2 == 0)) ^ ((config.invert ^ delete)) &&
@@ -282,5 +284,6 @@
/* }}} */
-void recursive_scan (char path[])
+void
+recursive_scan (const char path[])
/* {{{ */
@@ -313,5 +316,5 @@
}
#else
- ftw (path, (void *) scan_mailbox, 1);
+ ftw (path, (int (*)(const char *, const struct *, int))scan_mailbox, 1);
#endif /* HAVE_FTS_OPEN */
}
@@ -319,29 +322,33 @@
/* }}} */
-int md5_check_message (char *body, checksum_t *chksum)
+static int
+md5_check_message (const char *body, size_t bbytes)
/* {{{ */
{
- struct md5_ctx a;
- unsigned char b[16];
+ MD5_CTX a;
+ md5_t b;
int i;
+ extern checksum_t *cs;
- md5_init_ctx (&a);
+ MD5_Init(&a);
if (body == NULL)
- md5_process_bytes ("", 0, &a);
+ MD5_Update(&a, "", 0);
else
- md5_process_bytes (body, strlen(body), &a);
- md5_finish_ctx(&a, b);
+ MD5_Update(&a, body, bbytes);
+ MD5_Final(b.bytes, &a);
- for (i = 0; i < chksum->n; i++)
+ for (i = 0; i < cs->n; i++)
{
- if (0 == strncmp (chksum->md5[i], b, 16))
+ if (b.halves[0] == cs->md5s[i].halves[0] &&
+ b.halves[1] == cs->md5s[i].halves[1])
return 1;
}
- chksum->md5 =
- (char **) xrealloc (chksum->md5, (1 + chksum->n) * sizeof (char *));
- chksum->md5[chksum->n] = xstrdup (b);
+ cs =
+ xrealloc (cs, sizeof(checksum_t) + (i + 1) * sizeof (md5_t));
+ cs->md5s[i].halves[0] = b.halves[0];
+ cs->md5s[i].halves[1] = b.halves[1];
- (chksum->n)++;
+ cs->n++;
return 0;
--- src/scan.h Sun Mar 30 18:07:10 2003
+++ src/scan.h Tue Feb 27 16:51:58 2007
@@ -24,7 +24,6 @@
#include "mboxgrep.h"
-void scan_mailbox (char path[]);
-void recursive_scan (char path[]);
-int md5_check_message (char *body, checksum_t *chksum);
+void scan_mailbox(const char path[]);
+void recursive_scan(const char path[]);
#endif /* SCAN_H */
--- src/main.c Sun Aug 24 15:23:50 2003
+++ src/main.c Tue Feb 27 17:25:30 2007
@@ -56,5 +56,5 @@
int maildir_count = 0;
int count = 0;
-void *tmpp;
+FILE *tmpp;
checksum_t *cs;
@@ -239,6 +239,5 @@
}
- cs = (checksum_t *) xmalloc (sizeof (checksum_t));
- cs->md5 = (char **) xcalloc (1, sizeof (char **));
+ cs = xmalloc (sizeof (checksum_t));
cs->n = 0;

View file

@ -0,0 +1,16 @@
--- src/Makefile.in Sun Mar 30 18:07:10 2003
+++ src/Makefile.in Tue Feb 27 16:50:18 2007
@@ -22,10 +22,10 @@
CC = @CC@
OBJS = info.o main.o mh.o scan.o maildir.o mbox.o misc.o \
- wrap.o getopt.o getopt1.o md5.o
+ wrap.o
SRCS = info.c main.c mh.c scan.c maildir.c mbox.c misc.c \
- wrap.c getopt.c getopt1.c md5.c
+ wrap.c
TARGET = mboxgrep
CFLAGS = @CFLAGS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lcrypto
INSTALL = @INSTALL@
prefix = @prefix@