summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCHTEKK <CHTEKK@localhost>2007-05-01 14:15:36 +0000
committerCHTEKK <CHTEKK@localhost>2007-05-01 14:15:36 +0000
commit90f9cf6f9903e4da74fa8254111048a436f6f4e6 (patch)
tree1e3d212e74ce00e867732d484e76ea47ffc006ca
parentNew release for Postfix 2.4.0, should fix all known bugs. (diff)
downloadchtekk-90f9cf6f9903e4da74fa8254111048a436f6f4e6.tar.gz
chtekk-90f9cf6f9903e4da74fa8254111048a436f6f4e6.tar.bz2
chtekk-90f9cf6f9903e4da74fa8254111048a436f6f4e6.zip
Add maildirfolder file creation fix for Maildir++ compatibility, thanks to Tomas Macek!
Also make the MOVE filter target dependant on Maildir++, because it makes sense to MOVE only when you have other subfolders, and that's possible only if we're using a Maildir++ compliant maildir. svn path=/; revision=48
-rw-r--r--vda/postfix-2.4.1-vda-ng.patch138
1 files changed, 85 insertions, 53 deletions
diff --git a/vda/postfix-2.4.1-vda-ng.patch b/vda/postfix-2.4.1-vda-ng.patch
index 9359615..d5ff590 100644
--- a/vda/postfix-2.4.1-vda-ng.patch
+++ b/vda/postfix-2.4.1-vda-ng.patch
@@ -345,8 +345,8 @@ diff -Nru postfix-2.4.1/src/virtual/mailbox.c postfix-2.4.1-vda/src/virtual/mail
* Cleanup.
diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/maildir.c
--- postfix-2.4.1/src/virtual/maildir.c 2006-06-26 14:59:19.000000000 +0200
-+++ postfix-2.4.1-vda/src/virtual/maildir.c 2007-05-01 12:52:50.000000000 +0200
-@@ -63,28 +63,394 @@
++++ postfix-2.4.1-vda/src/virtual/maildir.c 2007-05-01 16:13:32.000000000 +0200
+@@ -63,28 +63,406 @@
#include <mbox_open.h>
#include <dsn_util.h>
@@ -390,23 +390,25 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+{
+ struct stat statbuf;
+ VSTRING *sizefilename = vstring_alloc(1024);
-+ VSTRING *sizebuf = vstring_alloc(SIZEFILE_MAX);
+ VSTREAM *sizefile;
+ char *p;
+ int len, first;
+ long sum = 0, count = 0;
+
+ vstring_sprintf(sizefilename, "%s/%s", dirname, "maildirsize");
++
+ sizefile = vstream_fopen(STR(sizefilename), O_RDONLY, 0);
+ if (!sizefile || (stat(STR(sizefilename), &statbuf) < 0) || (statbuf.st_size > SIZEFILE_MAX)) {
+ if (sizefile) {
+ vstream_fclose(sizefile);
+ unlink(STR(sizefilename));
+ }
++ vstring_free(sizefilename);
+
+ return 0;
+ }
+
++ VSTRING *sizebuf = vstring_alloc(SIZEFILE_MAX);
+ len = vstream_fread(sizefile, STR(sizebuf), SIZEFILE_MAX);
+
+ p = STR(sizebuf);
@@ -434,13 +436,14 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ count += c;
+ }
+ else {
-+ if (sizefile) {
-+ vstream_fclose(sizefile);
-+ unlink(STR(sizefilename));
-+ }
++ vstream_fclose(sizefile);
++ unlink(STR(sizefilename));
+
+ msg_warn("read_maildirsize: invalid line '%s' found in %s, removing maildirsize file", q, STR(sizefilename));
+
++ vstring_free(sizefilename);
++ vstring_free(sizebuf);
++
+ return 0;
+ }
+ }
@@ -573,6 +576,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ else {
+ buffer = vstring_alloc(1024);
+ vstring_sprintf(buffer, "%s/%s", dirname, name);
++
+ if (stat(STR(buffer), &statbuf) < 0) {
+ vstring_free(buffer);
+ continue;
@@ -581,12 +585,14 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ sum += (long) statbuf.st_size;
+ (*countptr)++;
+ }
++
+ vstring_free(buffer);
+ }
+ }
+ else {
+ buffer = vstring_alloc(1024);
+ vstring_sprintf(buffer, "%s/%s", dirname, name);
++
+ if (stat(STR(buffer), &statbuf) < 0) {
+ vstring_free(buffer);
+ continue;
@@ -600,12 +606,12 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ else if ((statbuf.st_mode & S_IFDIR) != 0) {
+ sum += check_dir_size(STR(buffer), countptr);
+ }
++
+ vstring_free(buffer);
+ }
+ }
+ closedir(dir);
-
--int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
++
+ if (msg_verbose)
+ msg_info("%s: full scan done: dir=%s sum=%ld count=%ld", myname, dirname, sum, *countptr);
+
@@ -633,7 +639,8 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ *str++ = *loc++;
+
+ *str = 0;
-+
+
+-int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
+ return(ret);
+}
+
@@ -714,8 +721,8 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ char *newdir;
+ char *tmpdir;
+ char *curdir;
-+ char *tmpfile;
+ char *newfile;
++ char *tmpfile;
DSN_BUF *why = state.msg_attr.why;
VSTRING *buf;
VSTREAM *dst;
@@ -732,28 +739,33 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+
+ /* Maildir Quota. */
+ const char *limit_res; /* Limit from map. */
-+ char *sizefilename = (char *) 0;
-+ VSTRING *filequota; /* Quota from 'maildirsize' file. */
-+ VSTREAM *sizefile;
++ char *sizefilename = (char *) 0; /* Maildirsize file name. */
++ VSTRING *filequota; /* Quota setting from the maildirsize file. */
++ VSTREAM *sizefile; /* Maildirsize file handle. */
+ long n = 0; /* Limit in long integer format. */
+ long saved_count = 0; /* The total number of files. */
-+ long saved_size = 0; /* The quota of the whole Maildir. */
-+ struct stat statbuf; /* To check the size of the mail written. */
-+ struct stat sizefile_stat; /* To check the size of the maildirsize file (cannot be larger than 5k). */
-+ time_t tm;
++ long saved_size = 0; /* The total quota of all files. */
++ struct stat mail_stat; /* To check the size of the mail to be written. */
++ struct stat sizefile_stat; /* To check the size of the maildirsize file. */
++ time_t tm; /* To check the age of the maildirsize file. */
+
+ /* Maildir Filters. */
-+ const char *value, *cmd_text;
-+ char *filtername, *header, *bkpnewfile;
++ const char *value, *cmd_text; /* Filter values. */
++ char *filtername;
++ char *header;
++ char *bkpnewfile;
++ char *mdffilename = (char *) 0; /* Maildirfolder file name. */
+ VSTRING *fltstr;
+ VSTREAM *tmpfilter;
++ VSTREAM *mdffile; /* Maildirfolder file handle. */
+ DICT *FILTERS;
-+ long sqlmtime;
++ long sqlmtime; /* Latest modification time from sql2file(). */
+ int cmd_len;
++ struct stat mdffile_stat; /* To check if the maildirfolder file exists. */
GETTIMEOFDAY(&starttime);
-@@ -93,15 +459,14 @@
+@@ -93,15 +471,14 @@
*/
state.level++;
if (msg_verbose)
@@ -772,7 +784,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
}
/*
-@@ -109,17 +474,81 @@
+@@ -109,17 +486,81 @@
* attribute to reflect the final recipient.
*/
if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
@@ -860,7 +872,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
/*
* Create and write the file as the recipient, so that file quota work.
-@@ -174,46 +603,278 @@
+@@ -174,46 +615,296 @@
* [...]
*/
set_eugid(usr_attr.uid, usr_attr.gid);
@@ -936,15 +948,16 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ * This needs a stat(2) of the tempfile and modification of the
+ * name of the file.
+ */
-+ if (stat(tmpfile, &statbuf) == 0) {
++ if (stat(tmpfile, &mail_stat) == 0) {
+ if (n != 0) {
-+ saved_size += (long) statbuf.st_size;
++ saved_size += (long) mail_stat.st_size;
+ saved_count++;
+ }
+ if (var_virt_maildir_extended) {
+ /* Append the size of the file to newfile. */
-+ vstring_sprintf(buf, ",S=%ld", (long) statbuf.st_size);
++ vstring_sprintf(buf, ",S=%ld", (long) mail_stat.st_size);
+ newfile = concatenate(newfile, STR(buf), (char *) 0);
++ bkpnewfile = concatenate(bkpnewfile, STR(buf), (char *) 0);
+ }
+ }
+
@@ -954,7 +967,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ */
+ if (saved_size > n) {
+ mail_copy_status = MAIL_COPY_STAT_WRITE;
-+ if (((long) statbuf.st_size > n) || (var_virt_overquota_bounce))
++ if (((long) mail_stat.st_size > n) || (var_virt_overquota_bounce))
+ errno = EFBIG;
+ else
+ errno = EDQUOT;
@@ -985,7 +998,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ * If we have mtime in our DICT structure, check it against sqlmtime
+ * and reload the filters if they differ.
+ */
-+ if (FILTERS->mtime > 0 && sqlmtime > 0 && sqlmtime != FILTERS->mtime) {
++ if (FILTERS->mtime > 0 && sqlmtime > 0 && FILTERS->mtime != sqlmtime) {
+ if (msg_verbose)
+ msg_info("%s: reloading DICT filters (dict_mtime=%ld != sql_mtime=%ld)",
+ myname, FILTERS->mtime, sqlmtime);
@@ -1066,29 +1079,32 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ dsb_simple(why, "5.0.0", "User filter - DISCARD");
+ }
+
-+ if (STREQUAL(value, "MOVE", cmd_len)) {
-+ if (msg_verbose)
-+ msg_info("%s: executing filter CMD MOVE", myname);
-+
-+ strcut((char *) cmd_text, " ");
-+ strcut((char *) cmd_text, "\t");
-+ strcut((char *) cmd_text, "/");
-+ strcut((char *) cmd_text, "..");
-+
-+ if (*var_virt_maildir_suffix == 0) {
-+ newfile = concatenate(usr_attr.mailbox, (char *) 0);
-+ }
-+ else {
-+ newfile = concatenate(usr_attr.mailbox, var_virt_maildir_suffix, (char *) 0);
-+ }
-+
-+ if (cmd_text[0] != '.') {
-+ newfile = concatenate(newfile, ".", (char *) 0);
++ if (var_virt_maildir_extended) {
++ if (STREQUAL(value, "MOVE", cmd_len)) {
++ if (msg_verbose)
++ msg_info("%s: executing filter CMD MOVE", myname);
++
++ strcut((char *) cmd_text, " ");
++ strcut((char *) cmd_text, "\t");
++ strcut((char *) cmd_text, "/");
++ strcut((char *) cmd_text, "..");
++
++ if (*var_virt_maildir_suffix == 0) {
++ newfile = concatenate(usr_attr.mailbox, (char *) 0);
++ }
++ else {
++ newfile = concatenate(usr_attr.mailbox, var_virt_maildir_suffix, (char *) 0);
++ }
++
++ if (cmd_text[0] != '.') {
++ newfile = concatenate(newfile, ".", (char *) 0);
++ }
++ newdir = concatenate(newfile, cmd_text, "/", "new/", (char *) 0);
++ tmpdir = concatenate(newfile, cmd_text, "/", "tmp/", (char *) 0);
++ curdir = concatenate(newfile, cmd_text, "/", "cur/", (char *) 0);
++ newfile = concatenate(newfile, cmd_text, "/", "new/", bkpnewfile, (char *) 0);
++ mdffilename = concatenate(newfile, cmd_text, "/", "maildirfolder", (char *) 0);
+ }
-+ newdir = concatenate(newfile, cmd_text, "/", "new/", (char *) 0);
-+ tmpdir = concatenate(newfile, cmd_text, "/", "tmp/", (char *) 0);
-+ curdir = concatenate(newfile, cmd_text, "/", "cur/", (char *) 0);
-+ newfile = concatenate(newfile, cmd_text, "/", "new/", bkpnewfile, (char *) 0);
+ }
+
+ if (STREQUAL(value, "LOG", cmd_len) || STREQUAL(value, "WARN", cmd_len)) {
@@ -1164,9 +1180,23 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
+ }
+ else {
+ /* We opened maildirsize, so let's just append this transaction and close it. */
-+ vstream_fprintf(sizefile, "%ld 1\n", (long) statbuf.st_size);
++ vstream_fprintf(sizefile, "%ld 1\n", (long) mail_stat.st_size);
+ vstream_fclose(sizefile);
+ }
++
++ /*
++ * 1) mdffilename != 0, so the maildirfilter code went through the MOVE to subfolder rule.
++ * 2) stat() failed, maybe the file does not exist? Try to create it.
++ */
++ if (mdffilename && (stat(mdffilename, &mdffile_stat) < 0)) {
++ mdffile = vstream_fopen(mdffilename, O_WRONLY | O_CREAT, 0600);
++ if (mdffile) {
++ vstream_fclose(mdffile);
++ }
++ else {
++ msg_warn("Cannot create maildirfolder file '%s': %s", mdffilename, strerror(errno));
++ }
++ }
+ }
+ }
+ }
@@ -1176,7 +1206,7 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
}
set_eugid(var_owner_uid, var_owner_gid);
-@@ -223,31 +884,57 @@
+@@ -223,31 +914,59 @@
* location possibly under user control.
*/
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
@@ -1246,6 +1276,8 @@ diff -Nru postfix-2.4.1/src/virtual/maildir.c postfix-2.4.1-vda/src/virtual/mail
myfree(curdir);
+ if (sizefilename)
+ myfree(sizefilename);
++ if (mdffilename)
++ myfree(mdffilename);
myfree(tmpfile);
if (newfile)
- myfree(newfile);