summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--maildir/.gitignore1
-rw-r--r--maildir/Makefile.am8
-rw-r--r--maildir/maildirkeywords2.c14
-rw-r--r--maildir/maildirkw.C (renamed from maildir/maildirkw.c)20
-rw-r--r--maildir/maildirkwtest2.c25
-rw-r--r--maildir/testsuite30
-rw-r--r--maildir/testsuite.txt28
7 files changed, 118 insertions, 8 deletions
diff --git a/maildir/.gitignore b/maildir/.gitignore
index 8b7d08e..0d863fa 100644
--- a/maildir/.gitignore
+++ b/maildir/.gitignore
@@ -21,6 +21,7 @@
/maildirkw.1
/maildirkw.html
/maildirkwtest
+/maildirkwtest2
/maildirmake
/maildirmake.1
/maildirmake.1.in
diff --git a/maildir/Makefile.am b/maildir/Makefile.am
index bd4dadc..bcac417 100644
--- a/maildir/Makefile.am
+++ b/maildir/Makefile.am
@@ -53,6 +53,7 @@ libmaildir_la_SOURCES=autoresponse.c autoresponse.h \
maildirwatch.c maildirwatch.h loginexec.c loginexec.h
noinst_PROGRAMS=deliverquota maildirmake testmaildirfilter maildirkwtest \
+ maildirkwtest2 \
maildirkw maildiracl maildiraclttest testmaildirsearch maildirwatch
deliverquota_SOURCES=deliverquota.c
@@ -80,12 +81,17 @@ maildirkwtest_LDADD=libmaildir.la
maildirkwtest_DEPENDENCIES=libmaildir.la
maildirkwtest_LDFLAGS=-static
-maildirkw_SOURCES=maildirkw.c
+maildirkw_SOURCES=maildirkw.C
maildirkw_LDADD=libmaildir.la ../liblock/liblock.la ../numlib/libnumlib.la
maildirkw_DEPENDENCIES=libmaildir.la ../liblock/liblock.la \
../numlib/libnumlib.la
maildirkw_LDFLAGS=-static
+maildirkwtest2_SOURCES=maildirkw.C maildirkwtest2.c
+maildirkwtest2_LDADD=$(maildirkw_LDADD)
+maildirkwtest2_DEPENDENCIES=$(maildirkw_DEPENDENCIES)
+maildirkwtest2_LDFLAGS=-static
+
maildirwatch_SOURCES=maildirwatchprog.c
maildirwatch_LDADD=libmaildir.la ../liblock/liblock.la ../numlib/libnumlib.la
maildirwatch_DEPENDENCIES=libmaildir.la ../liblock/liblock.la \
diff --git a/maildir/maildirkeywords2.c b/maildir/maildirkeywords2.c
index 6923a7a..4bcbcff 100644
--- a/maildir/maildirkeywords2.c
+++ b/maildir/maildirkeywords2.c
@@ -148,7 +148,12 @@ static void doReadKeywords2(const char *maildir, const char *dir,
struct keywordUpdateInfo *updateInfo;
time_t t=time(NULL);
- time_t tn=t/300;
+ time_t tn;
+#ifdef MAILDIRKW_MOCKTIME
+ MAILDIRKW_MOCKTIME();
+#endif
+
+ tn=t/300;
rki->updateNeeded=0;
rki->tryagain=0;
@@ -307,6 +312,9 @@ int maildir_kwImport(FILE *fp, struct maildir_kwReadInfo *rki)
*q++=0;
+#ifdef MAILDIRKW_MOCKTIME2
+ MAILDIRKW_MOCKTIME2()
+#endif
i= (*rki->findMessageByFilename)(p, 0, &n,
rki->voidarg);
@@ -458,7 +466,7 @@ static void scan_updates(const char *dir,
if (in >= n)
{
/* libmail_kwgReadMaildir autocrerate */
-
+
struct keywordUpdateInfo *u=
realloc(*updateInfo,
sizeof(**updateInfo) * (in+1));
@@ -919,7 +927,7 @@ static int maildir_kwSaveCommon(const char *maildir,
if (p)
*p=0;
-
+
maildir_tmpcreate_init(&createInfo);
createInfo.maildir=maildir;
diff --git a/maildir/maildirkw.c b/maildir/maildirkw.C
index a0df76c..1c17959 100644
--- a/maildir/maildirkw.c
+++ b/maildir/maildirkw.C
@@ -1,5 +1,5 @@
/*
-** Copyright 2003-2004 Double Precision, Inc.
+** Copyright 2003-2022 Double Precision, Inc.
** See COPYING for distribution information.
*/
@@ -19,6 +19,9 @@
#include "maildirkeywords.h"
#include "maildirwatch.h"
+#include <string>
+#include <map>
+
static void usage()
{
printf("Usage: maildirkw [ options ] maildir [+/-]flag [+/-]flag...\n");
@@ -171,10 +174,10 @@ static int doit_locked(const char *maildir,
rc= -1;
unlink(tmpname);
}
+ free(tmpname);
+ free(newname);
}
- free(tmpname);
- free(newname);
if (kwm_alloced)
libmail_kwmDestroy(kwm_alloced);
libmail_kwgDestroy(&g);
@@ -196,10 +199,21 @@ static int list_locked(const char *maildir)
if (rc)
return rc;
+ std::map<std::string, size_t> messages;
+
for (n=0; n<g.nMessages; n++)
{
struct libmail_kwGenericEntry *e=
libmail_kwgFindByIndex(&g, n);
+
+ if (e)
+ messages[e->filename]=n;
+ }
+
+ for (auto b=messages.begin(), ee=messages.end(); b != ee; ++b)
+ {
+ struct libmail_kwGenericEntry *e=
+ libmail_kwgFindByIndex(&g, b->second);
struct libmail_kwMessageEntry *k;
if (!e)
diff --git a/maildir/maildirkwtest2.c b/maildir/maildirkwtest2.c
new file mode 100644
index 0000000..9a1dd7d
--- /dev/null
+++ b/maildir/maildirkwtest2.c
@@ -0,0 +1,25 @@
+#define MAILDIRKW_MOCKTIME() \
+ do { \
+ const char *p=getenv("MOCKTIME"); \
+ if (p) \
+ t=atoi(p); \
+ } while (0)
+
+#define MAILDIRKW_MOCKTIME2() \
+ do { \
+ const char *eee=getenv("MOCKTIME"); \
+ \
+ if (eee && strcmp(eee, "1000") == 0 && \
+ strcmp(p, "004") == 0) \
+ { \
+ printf("Faked stale filename\n"); \
+ fflush(stdout); \
+ p=NULL; \
+ \
+ } \
+ } while(0); \
+ \
+ i=NULL; \
+ if (p)
+
+#include "maildirkeywords2.c"
diff --git a/maildir/testsuite b/maildir/testsuite
index 71b9fe2..7245f9c 100644
--- a/maildir/testsuite
+++ b/maildir/testsuite
@@ -40,7 +40,7 @@ echo ""
$VALGRIND ./maildirkw -L md | sort
rm -rf md testmd
-maildirmake ./testmd
+./maildirmake ./testmd
$VALGRIND ./maildiracl -set testmd INBOX.Folder user1 rw
$VALGRIND ./maildiracl -list testmd INBOX.Folder | sort
@@ -49,3 +49,31 @@ $VALGRIND ./maildirmake -f Folder testmd
$VALGRIND ./maildiracl -list testmd INBOX.Folder | sort
ls testmd/courierimaphieracl
rm -rf testmd
+
+./maildirmake ./testmd
+echo "Subject: message 1" >testmd/cur/001:2,S
+echo "Subject: message 2" >testmd/cur/002:2,S
+echo "Subject: message 3" >testmd/cur/003:2,S
+$VALGRIND ./maildirkw testmd 003 gamma alpha beta
+$VALGRIND ./maildirkw testmd 002 alpha gamma
+$VALGRIND ./maildirkw testmd 001 beta gamma
+$VALGRIND ./maildirkw testmd 004 000
+MOCKTIME=1000 $VALGRIND ./maildirkwtest2 -L testmd
+echo "==="
+MOCKTIME=1000 $VALGRIND ./maildirkwtest2 -L testmd
+MOCKTIME=2000 $VALGRIND ./maildirkwtest2 -L testmd
+MOCKTIME=1000 $VALGRIND ./maildirkwtest2 -L testmd
+>testmd/courierimapkeywords/.tmp.4.foo
+>testmd/courierimapkeywords/.tmp.1000.baz
+MOCKTIME=1000 $VALGRIND ./maildirkwtest2 -L testmd
+ls testmd/courierimapkeywords/.tmp.* 2>&1
+rm -f testmd/courierimapkeywords/:list
+echo "epsilon" >testmd/courierimapkeywords/.1.002
+echo "zeta" >testmd/courierimapkeywords/.2.002
+MOCKTIME=1000 $VALGRIND ./maildirkwtest2 -L testmd
+ls testmd/courierimapkeywords/.*002
+$VALGRIND ./maildirkw -a testmd 001 alpha beta
+$VALGRIND ./maildirkw -L testmd
+$VALGRIND ./maildirkw -r testmd 001 beta
+$VALGRIND ./maildirkw -L testmd
+rm -rf testmd
diff --git a/maildir/testsuite.txt b/maildir/testsuite.txt
index ed34d92..cc5eb74 100644
--- a/maildir/testsuite.txt
+++ b/maildir/testsuite.txt
@@ -38,3 +38,31 @@ administrators aceilrstwx
owner aceilrstwx
user1 rw
Folder.Subfolder
+001 beta gamma
+002 alpha gamma
+003 alpha beta gamma
+004 000
+===
+Faked stale filename
+001 beta gamma
+002 alpha gamma
+003 alpha beta gamma
+004 000
+001 beta gamma
+002 alpha gamma
+003 alpha beta gamma
+004 000
+Faked stale filename
+001 beta gamma
+002 alpha gamma
+003 alpha beta gamma
+001 beta gamma
+002 alpha gamma
+003 alpha beta gamma
+testmd/courierimapkeywords/.tmp.1000.baz
+002 zeta
+testmd/courierimapkeywords/.2.002
+001 alpha beta
+002 zeta
+001 alpha
+002 zeta