diff options
author | CHTEKK <CHTEKK@localhost> | 2007-05-01 14:15:36 +0000 |
---|---|---|
committer | CHTEKK <CHTEKK@localhost> | 2007-05-01 14:15:36 +0000 |
commit | 90f9cf6f9903e4da74fa8254111048a436f6f4e6 (patch) | |
tree | 1e3d212e74ce00e867732d484e76ea47ffc006ca | |
parent | New release for Postfix 2.4.0, should fix all known bugs. (diff) | |
download | chtekk-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.patch | 138 |
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); |