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:
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
|
@ -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
|
||||
|
|
160
mail/mboxgrep/files/patch-md5
Normal file
160
mail/mboxgrep/files/patch-md5
Normal 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;
|
||||
|
16
mail/mboxgrep/files/patch-noredundancy
Normal file
16
mail/mboxgrep/files/patch-noredundancy
Normal 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@
|
Loading…
Reference in a new issue