diff -ur maildrop-1.8.0.orig/maildir/maildirmake2.c maildrop-1.8.0/maildir/maildirmake2.c --- maildrop-1.8.0.orig/maildir/maildirmake2.c 2004-03-14 11:31:40.000000000 +0900 +++ maildrop-1.8.0/maildir/maildirmake2.c 2005-04-26 23:01:47.910902540 +0900 @@ -44,16 +44,29 @@ if (!q) return -1; - if (mkdir(maildir, perm) < 0 || - chmod(maildir, perm) < 0 || - mkdir(strcat(strcpy(q, maildir), "/tmp"), subdirperm) < 0 || - chmod(q, subdirperm) < 0 || - mkdir(strcat(strcpy(q, maildir), "/new"), subdirperm) < 0 || - chmod(q, subdirperm) < 0 || - mkdir(strcat(strcpy(q, maildir), "/cur"), subdirperm) < 0 || - chmod(q, subdirperm) < 0 || - (folder && (fd=open(strcat(strcpy(q, maildir), "/maildirfolder"), - O_CREAT|O_WRONLY, 0600)) < 0)) + pmkdir(maildir, perm); + if (chmod(maildir, perm) < 0) { + free(q); + return -1; + } + mkdir(strcat(strcpy(q, maildir), "/tmp"), subdirperm); + if (chmod(q, subdirperm) < 0) { + free(q); + return -1; + } + mkdir(strcat(strcpy(q, maildir), "/new"), subdirperm); + if (chmod(q, subdirperm) < 0) { + free(q); + return -1; + } + mkdir(strcat(strcpy(q, maildir), "/cur"), subdirperm); + if (chmod(q, subdirperm) < 0) { + free(q); + return -1; + } + + if (folder && (fd=open(strcat(strcpy(q, maildir), "/maildirfolder"), + O_CREAT|O_WRONLY, 0600)) < 0) { free(q); return -1; @@ -131,3 +144,29 @@ } while (n); return rmdir(maildir) < 0 && errno != ENOENT ? -1:0; } + +/* mkdir(2) wrapper to make parent directory */ +int pmkdir(const char *pathname, mode_t mode) +{ + int first, last, retval=0; + char *p; + p = (char *)pathname; + if (p[0] == '/') + ++p; + for (first = 1, last = 0; !last ; ++p) { + if (p[0] == '\0') + last = 1; + else if (p[0] != '/') + continue; + *p = '\0'; + if (!last && p[1] == '\0') + last = 1; + if (first) { + first = 0; + } + retval = mkdir(pathname, mode); + if (!last) + *p = '/'; + } + return (retval); +} diff -ur maildrop-1.8.0.orig/maildir/maildirmisc.h maildrop-1.8.0/maildir/maildirmisc.h --- maildrop-1.8.0.orig/maildir/maildirmisc.h 2004-02-17 09:58:13.000000000 +0900 +++ maildrop-1.8.0/maildir/maildirmisc.h 2005-04-26 23:01:47.913538805 +0900 @@ -41,6 +41,8 @@ #define PUBLIC "public" /* SMAP */ +extern int pmkdir(const char *pathname, mode_t mode); + int maildir_make(const char *maildir, int perm, int subdirperm, int folder); diff -ur maildrop-1.8.0.orig/maildrop/deliver.C maildrop-1.8.0/maildrop/deliver.C --- maildrop-1.8.0.orig/maildrop/deliver.C 2002-04-09 00:11:02.000000000 +0900 +++ maildrop-1.8.0/maildrop/deliver.C 2005-04-26 23:02:59.229676980 +0900 @@ -29,6 +29,7 @@ #include #endif #include +#include "../maildir/maildirmisc.h" static const char rcsid[]="$Id: maildrop-1.8.0-maildirmake.diff,v 1.3 2005/04/26 15:58:04 nomo Exp $"; @@ -52,6 +53,18 @@ DeliverDotLock dotlock; Buffer b; +/* automake directory */ + struct stat mbuf; + char *maildir = (char *)malloc(strlen(mailbox) + 5); + if (stat(mailbox, &mbuf) != 0 || + stat(strcat(strcpy(maildir, mailbox), "/new"), &mbuf) != 0 || + stat(strcat(strcpy(maildir, mailbox), "/cur"), &mbuf) != 0 || + stat(strcat(strcpy(maildir, mailbox), "/tmp"), &mbuf) != 0 ) { + /* if mailbox/{new,cur,tmp} does not exist, maildir_make() */ + maildir_make(mailbox, 0700, 0700, 0); + } + /* automake directory end */ + if ( *mailbox == '!' || *mailbox == '|' ) { Buffer cmdbuf; diff -ur maildrop-1.8.0.orig/maildrop/main.C maildrop-1.8.0/maildrop/main.C --- maildrop-1.8.0.orig/maildrop/main.C 2004-11-30 12:31:38.000000000 +0900 +++ maildrop-1.8.0/maildrop/main.C 2005-04-26 23:01:47.916954109 +0900 @@ -2,7 +2,7 @@ ** Copyright 1998 - 2004 Double Precision, Inc. ** See COPYING for distribution information. */ - +#include "../maildir/maildirmisc.h" #include "lexer.h" #include "recipe.h" #include "varlist.h" @@ -641,6 +641,16 @@ if (VerboseLevel() > 1) merr << "maildrop: Changing to " << h << "\n"; + char *mtmp; + mtmp = (char *)malloc(strlen(h) + sizeof("/Maildir")); + strcat(strcpy(mtmp, h), "/Maildir"); + if (chdir(h) < 0) { + if (maildir_make(mtmp, 0700, 0700, 0) != 0) { + errexit=EX_TEMPFAIL; + throw "create Maildir failed."; + } + } + if (chdir(h) < 0) { errexit=EX_TEMPFAIL;