diff options
Diffstat (limited to 'contrib/notmuch-deliver/src')
-rw-r--r-- | contrib/notmuch-deliver/src/Makefile.am | 17 | ||||
-rw-r--r-- | contrib/notmuch-deliver/src/maildircreate.c | 241 | ||||
-rw-r--r-- | contrib/notmuch-deliver/src/maildircreate.h | 52 | ||||
-rw-r--r-- | contrib/notmuch-deliver/src/maildirmisc.h | 202 | ||||
-rw-r--r-- | contrib/notmuch-deliver/src/maildirmkdir.c | 78 | ||||
-rw-r--r-- | contrib/notmuch-deliver/src/maildiropen.c | 141 |
6 files changed, 10 insertions, 721 deletions
diff --git a/contrib/notmuch-deliver/src/Makefile.am b/contrib/notmuch-deliver/src/Makefile.am index fbb29ab2..e2ff7baa 100644 --- a/contrib/notmuch-deliver/src/Makefile.am +++ b/contrib/notmuch-deliver/src/Makefile.am @@ -1,19 +1,22 @@ DEFS+= -DGITHEAD=\"$(GITHEAD)\" -AM_CPPFLAGS= -I$(top_srcdir) +AM_CPPFLAGS= \ + -I$(top_builddir)/maildrop/numlib \ + -I$(top_srcdir)/maildrop \ + -I$(top_srcdir)/maildrop/maildir AM_CFLAGS= @NOTMUCH_DELIVER_CFLAGS@ $(glib_CFLAGS) noinst_HEADERS=\ - maildircreate.h \ - maildirmisc.h + $(top_srcdir)/maildrop/maildir/maildircreate.h \ + $(top_srcdir)/maildrop/maildir/maildirmisc.h bin_PROGRAMS=\ notmuch-deliver notmuch_deliver_SOURCES=\ - maildircreate.c \ - maildiropen.c \ - maildirmkdir.c \ + $(top_srcdir)/maildrop/maildir/maildircreate.c \ + $(top_srcdir)/maildrop/maildir/maildiropen.c \ + $(top_srcdir)/maildrop/maildir/maildirmkdir.c \ main.c notmuch_deliver_LDADD=\ - $(top_builddir)/numlib/libnumlib.la \ + $(top_builddir)/maildrop/numlib/libnumlib.la \ $(glib_LIBS) diff --git a/contrib/notmuch-deliver/src/maildircreate.c b/contrib/notmuch-deliver/src/maildircreate.c deleted file mode 100644 index 74030f41..00000000 --- a/contrib/notmuch-deliver/src/maildircreate.c +++ /dev/null @@ -1,241 +0,0 @@ -/* -** Copyright 1998 - 2003 Double Precision, Inc. -** See COPYING for distribution information. -*/ - -#include "maildircreate.h" -#include "maildirmisc.h" -#include <sys/types.h> -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif - -#if TIME_WITH_SYS_TIME -#include <sys/time.h> -#include <time.h> -#else -#if HAVE_SYS_TIME_H -#include <sys/time.h> -#else -#include <time.h> -#endif -#endif -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <string.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include "numlib/numlib.h" - - -static const char rcsid[]="$Id: maildircreate.c,v 1.6 2003/01/26 04:07:03 mrsam Exp $"; - -FILE *maildir_tmpcreate_fp(struct maildir_tmpcreate_info *info) -{ - int fd=maildir_tmpcreate_fd(info); - FILE *fp; - - if (fd < 0) - return NULL; - - fp=fdopen(fd, "w+"); - - if (fp == NULL) - { - close(fd); - return NULL; - } - - return fp; -} - -static int maildir_tmpcreate_fd_do(struct maildir_tmpcreate_info *info); - -#define KEEPTRYING (60 * 60) -#define SLEEPFOR 3 - -int maildir_tmpcreate_fd(struct maildir_tmpcreate_info *info) -{ - int i; - - if (!info->doordie) - return (maildir_tmpcreate_fd_do(info)); - - for (i=0; i<KEEPTRYING / SLEEPFOR; i++) - { - int fd=maildir_tmpcreate_fd_do(info); - - if (fd >= 0 || errno != EAGAIN) - return fd; - - sleep(SLEEPFOR); - } - - return -1; -} - -static int maildir_tmpcreate_fd_do(struct maildir_tmpcreate_info *info) -{ - const char *maildir=info->maildir; - const char *uniq=info->uniq; - const char *hostname=info->hostname; - - char hostname_buf[256]; - char time_buf[NUMBUFSIZE]; - char usec_buf[NUMBUFSIZE]; - char pid_buf[NUMBUFSIZE]; - char len_buf[NUMBUFSIZE+3]; - char dev_buf[NUMBUFSIZE]; - char ino_buf[NUMBUFSIZE]; - struct timeval tv; - - struct stat stat_buf; - int fd; - - if (!maildir) - maildir="."; - if (!uniq) - uniq=""; - - if (!hostname || !*hostname) - { - hostname_buf[sizeof(hostname_buf)-1]=0; - if (gethostname(hostname_buf, sizeof(hostname_buf)-1) < 0) - strcpy(hostname_buf, "localhost"); - hostname=hostname_buf; - } - - gettimeofday(&tv, NULL); - - libmail_str_time_t(tv.tv_sec, time_buf); - libmail_str_time_t(tv.tv_usec, usec_buf); - libmail_str_pid_t(getpid(), pid_buf); - len_buf[0]=0; - if (info->msgsize > 0) - { - strcpy(len_buf, ",S="); - libmail_str_size_t(info->msgsize, len_buf+3); - } - - if (info->tmpname) - free(info->tmpname); - - info->tmpname=malloc(strlen(maildir)+strlen(uniq)+ - strlen(hostname)+strlen(time_buf)+ - strlen(usec_buf)+ - strlen(pid_buf)+strlen(len_buf)+100); - - if (!info->tmpname) - { - maildir_tmpcreate_free(info); - return -1; - } - - strcpy(info->tmpname, maildir); - strcat(info->tmpname, "/tmp/"); - strcat(info->tmpname, time_buf); - strcat(info->tmpname, ".M"); - strcat(info->tmpname, usec_buf); - strcat(info->tmpname, "P"); - strcat(info->tmpname, pid_buf); - - if (*uniq) - strcat(strcat(info->tmpname, "_"), uniq); - strcat(info->tmpname, "."); - strcat(info->tmpname, hostname); - strcat(info->tmpname, len_buf); - - if (stat( info->tmpname, &stat_buf) == 0) - { - maildir_tmpcreate_free(info); - errno=EAGAIN; - return -1; - } - - if (errno != ENOENT) - { - maildir_tmpcreate_free(info); - if (errno == EAGAIN) - errno=EIO; - return -1; - } - - if ((fd=maildir_safeopen_stat(info->tmpname, O_CREAT|O_RDWR|O_TRUNC, - info->openmode, &stat_buf)) < 0) - { - maildir_tmpcreate_free(info); - return -1; - } - - libmail_strh_dev_t(stat_buf.st_dev, dev_buf); - libmail_strh_ino_t(stat_buf.st_ino, ino_buf); - - if (info->newname) - free(info->newname); - - info->newname=malloc(strlen(info->tmpname)+strlen(ino_buf)+ - strlen(dev_buf)+3); - - if (!info->newname) - { - maildir_tmpcreate_free(info); - unlink(info->tmpname); - close(fd); - if (errno == EAGAIN) - errno=EIO; - return -1; - } - - strcpy(info->newname, maildir); - strcat(info->newname, "/new/"); - strcat(info->newname, time_buf); - strcat(info->newname, ".M"); - strcat(info->newname, usec_buf); - strcat(info->newname, "P"); - strcat(info->newname, pid_buf); - strcat(info->newname, "V"); - strcat(info->newname, dev_buf); - strcat(info->newname, "I"); - strcat(info->newname, ino_buf); - if (*uniq) - strcat(strcat(info->newname, "_"), uniq); - strcat(info->newname, "."); - strcat(info->newname, hostname); - strcat(info->newname, len_buf); - - return fd; -} - -void maildir_tmpcreate_free(struct maildir_tmpcreate_info *info) -{ - if (info->tmpname) - free(info->tmpname); - info->tmpname=NULL; - - if (info->newname) - free(info->newname); - info->newname=NULL; -} - -int maildir_movetmpnew(const char *tmpname, const char *newname) -{ - if (link(tmpname, newname) == 0) - { - unlink(tmpname); - return 0; - } - - if (errno != EXDEV) - return -1; - - /* AFS? */ - - return rename(tmpname, newname); -} diff --git a/contrib/notmuch-deliver/src/maildircreate.h b/contrib/notmuch-deliver/src/maildircreate.h deleted file mode 100644 index ea1c71ac..00000000 --- a/contrib/notmuch-deliver/src/maildircreate.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef maildircreate_h -#define maildircreate_h - -/* -** Copyright 1998 - 2003 Double Precision, Inc. -** See COPYING for distribution information. -*/ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -static const char maildircreate_h_rcsid[]="$Id: maildircreate.h,v 1.10 2006/10/29 00:03:53 mrsam Exp $"; - - /* Create messages in maildirs */ - -struct maildir_tmpcreate_info { - const char *maildir; - unsigned long msgsize; /* If known, 0 otherwise (must use requota later)*/ - const char *uniq; /* You need when creating multiple msgs */ - const char *hostname; /* If known, NULL otherwise */ - int openmode; /* Default open mode */ - int doordie; /* Loop until we get it right. */ - char *tmpname; /* On exit, filename in tmp */ - char *newname; /* On exit, filename in new */ -}; - -#define maildir_tmpcreate_init(i) \ - do \ - { \ - memset( (i), 0, sizeof(*(i))); \ - (i)->openmode=0644; \ - } while(0) - -int maildir_tmpcreate_fd(struct maildir_tmpcreate_info *); -FILE *maildir_tmpcreate_fp(struct maildir_tmpcreate_info *); -void maildir_tmpcreate_free(struct maildir_tmpcreate_info *); - - /* Move created message from tmp to new */ -int maildir_movetmpnew(const char *tmpname, const char *newname); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/contrib/notmuch-deliver/src/maildirmisc.h b/contrib/notmuch-deliver/src/maildirmisc.h deleted file mode 100644 index 545d11e1..00000000 --- a/contrib/notmuch-deliver/src/maildirmisc.h +++ /dev/null @@ -1,202 +0,0 @@ -#ifndef maildirmisc_h -#define maildirmisc_h - -/* -** Copyright 2000-2003 Double Precision, Inc. -** See COPYING for distribution information. -*/ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -static const char maildirmisc_h_rcsid[]="$Id: maildirmisc.h,v 1.18 2006/07/22 02:48:15 mrsam Exp $"; - -/* -** -** Miscellaneous maildir-related code -** -*/ - -/* Some special folders */ - -#define INBOX "INBOX" -#define DRAFTS "Drafts" -#define SENT "Sent" -#define TRASH "Trash" -#define SHARED "shared" - -#define SHAREDSUBDIR "shared-folders" - -#define NEWSHAREDSP "#shared" -#define NEWSHARED "#shared." - -#define PUBLIC "public" /* SMAP */ - -int maildir_make(const char *maildir, int perm, int subdirperm, - int folder); - -int maildir_del(const char *maildir); - -int maildir_del_content(const char *maildir); - -char *maildir_name2dir(const char *maildir, /* DIR location */ - const char *foldername); /* INBOX.name */ - -char *maildir_location(const char *homedir, - const char *maildir); -/* -** Homedir is the account's home directory, "maildir" is where the account's -** default Maildir is configured to be (usually "./Maildir"). Combine the -** two to produce an absolute pathname. -*/ - - -char *maildir_folderdir(const char *, /* maildir */ - const char *); /* folder name */ - /* Returns the directory corresponding to foldername (foldername is - ** checked to make sure that it's a valid name, else we set errno - ** to EINVAL, and return (0). - */ - -char *maildir_filename(const char *, /* maildir */ - const char *, /* folder */ - const char *); /* filename */ - /* - ** Builds the filename to this message, suitable for opening. - ** If the file doesn't appear to be there, search the maildir to - ** see if someone changed the flags, and return the current filename. - */ - -int maildir_safeopen(const char *, /* filename */ - int, /* mode */ - int); /* perm */ - -/* -** Same arguments as open(). When we're accessing a shared maildir, -** prevent someone from playing cute and dumping a bunch of symlinks -** in there. This function will open the indicate file only if the -** last component is not a symlink. -** This is implemented by opening the file with O_NONBLOCK (to prevent -** a DOS attack of someone pointing the symlink to a pipe, causing -** the open to hang), clearing O_NONBLOCK, then stat-int the file -** descriptor, lstating the filename, and making sure that dev/ino -** match. -*/ - -int maildir_semisafeopen(const char *, /* filename */ - int, /* mode */ - int); /* perm */ - -/* -** Same thing, except that we allow ONE level of soft link indirection, -** because we're reading from our own maildir, which points to the -** message in the sharable maildir. -*/ - -int maildir_safeopen_stat(const char *path, int mode, int perm, - struct stat *stat1); - /* Sane as maildir_safeopen(), except that we also initialize a - ** struct stat, saving an extra syscall to the caller. - */ - -int maildir_mkdir(const char *); /* directory */ -/* -** Create maildir including all subdirectories in the path (like mkdir -p) -*/ - -void maildir_purgetmp(const char *); /* maildir */ - /* purges old stuff out of tmp */ - -void maildir_purge(const char *, /* directory */ - unsigned); /* time_t to purge */ - -void maildir_getnew(const char *, /* maildir */ - const char *, /* folder */ - void (*)(const char *, void *), /* Callback function for - ** every moved msg. - */ - void *arg); /* Passthrough callback arg */ - - /* move messages from new to cur */ - -int maildir_deletefolder(const char *, /* maildir */ - const char *); /* folder */ - /* deletes a folder */ - -void maildir_list(const char *maildir, - void (*func)(const char *, void *), - void *voidp); - -void maildir_list_sharable(const char *, /* maildir */ - void (*)(const char *, void *), /* callback function */ - void *); /* 2nd arg to callback func */ - /* list sharable folders */ - -int maildir_shared_subscribe(const char *, /* maildir */ - const char *); /* folder */ - /* subscribe to a shared folder */ - -void maildir_list_shared(const char *, /* maildir */ - void (*)(const char *, void *), /* callback function */ - void *); /* 2nd arg to the callback func */ - /* list subscribed folders */ - -int maildir_shared_unsubscribe(const char *, /* maildir */ - const char *); /* folder */ - /* unsubscribe from a shared folder */ - -char *maildir_shareddir(const char *, /* maildir */ - const char *); /* folder */ - /* - ** Validate and return a path to a shared folder. folderdir must be - ** a name of a valid shared folder. - */ - -void maildir_shared_sync(const char *); /* maildir */ - /* "sync" the shared folder */ - -int maildir_sharedisro(const char *); /* maildir */ - /* maildir is a shared read-only folder */ - -int maildir_unlinksharedmsg(const char *); /* filename */ - /* Remove a message from a shared folder */ - -/* Internal function that reads a symlink */ - -char *maildir_getlink(const char *); - - /* Determine whether the maildir filename has a certain flag */ - -int maildir_hasflag(const char *filename, char); - -#define MAILDIR_DELETED(f) maildir_hasflag((f), 'T') - - /* - ** Hierarchical maildir rename. - */ - -#define MAILDIR_RENAME_FOLDER 1 -#define MAILDIR_RENAME_SUBFOLDERS 2 - -int maildir_rename(const char *maildir, /* Path to the maildir */ - const char *oldname, /* .foldername */ - const char *newname, /* .foldername */ - int flags, /* See above */ - void (*callback_func)(const char *old_path, - const char *new_path) - ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/contrib/notmuch-deliver/src/maildirmkdir.c b/contrib/notmuch-deliver/src/maildirmkdir.c deleted file mode 100644 index 754b2c70..00000000 --- a/contrib/notmuch-deliver/src/maildirmkdir.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -** Copyright 2000 Double Precision, Inc. -** See COPYING for distribution information. -*/ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> -#include <stdlib.h> -#if HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <errno.h> - -#include "maildirmisc.h" - -static const char rcsid[]="$Id: maildirmkdir.c,v 1.2 2002/03/15 03:09:21 mrsam Exp $"; - -int maildir_mkdir(const char *dir) -{ -char *buf, *p; -size_t l; - - if (dir == 0 || dir[0] == 0) - { - errno = EINVAL; - return (-1); - } - l = strlen(dir); - if ((buf = malloc(l + sizeof("/tmp"))) == 0) - { - errno = ENOMEM; - return (-1); - } - strcpy(buf, dir); - strcpy(buf+l, "/cur"); - - /* We do mkdir -p here */ - - p = buf+1; - while ((p = strchr(p, '/')) != 0) - { - *p = '\0'; - if (mkdir(buf, 0700) < 0 && errno != EEXIST) - { - free(buf); - return (-1); - } - *p++ = '/'; - } - - if (mkdir(buf, 0700) < 0 && errno != EEXIST) { - free(buf); - return (-1); - } - strcpy(buf+l, "/new"); - if (mkdir(buf, 0700) < 0 && errno != EEXIST) { - free(buf); - return (-1); - } - /* - * make /tmp last because this is the one we open first - - * the existence of this directory implies the whole - * Maildir structure is complete - */ - strcpy(buf+l, "/tmp"); - if (mkdir(buf, 0700) < 0 && errno != EEXIST) { - free(buf); - return (-1); - } - free(buf); - return (0); -} - diff --git a/contrib/notmuch-deliver/src/maildiropen.c b/contrib/notmuch-deliver/src/maildiropen.c deleted file mode 100644 index 5071df76..00000000 --- a/contrib/notmuch-deliver/src/maildiropen.c +++ /dev/null @@ -1,141 +0,0 @@ -/* -** Copyright 2000 Double Precision, Inc. -** See COPYING for distribution information. -*/ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> -#include <stdlib.h> -#include <time.h> -#if HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <stdio.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> - -#include "maildirmisc.h" - -static const char rcsid[]="$Id: maildiropen.c,v 1.8 2003/01/19 16:39:52 mrsam Exp $"; - -char *maildir_getlink(const char *filename) -{ -#if HAVE_READLINK -size_t bufsiz; -char *buf; - - bufsiz=0; - buf=0; - - for (;;) - { - int n; - - if (buf) free(buf); - bufsiz += 256; - if ((buf=malloc(bufsiz)) == 0) - { - perror("malloc"); - return (0); - } - if ((n=readlink(filename, buf, bufsiz)) < 0) - { - free(buf); - return (0); - } - if (n < bufsiz) - { - buf[n]=0; - break; - } - } - return (buf); -#else - return (0); -#endif -} - -int maildir_semisafeopen(const char *path, int mode, int perm) -{ - -#if HAVE_READLINK - -char *l=maildir_getlink(path); - - if (l) - { - int f; - - if (*l != '/') - { - char *q=malloc(strlen(path)+strlen(l)+2); - char *s; - - if (!q) - { - free(l); - return (-1); - } - - strcpy(q, path); - if ((s=strchr(q, '/')) != 0) - s[1]=0; - else *q=0; - strcat(q, l); - free(l); - l=q; - } - - f=maildir_safeopen(l, mode, perm); - - free(l); - return (f); - } -#endif - - return (maildir_safeopen(path, mode, perm)); -} - -int maildir_safeopen(const char *path, int mode, int perm) -{ - struct stat stat1; - - return maildir_safeopen_stat(path, mode, perm, &stat1); -} - -int maildir_safeopen_stat(const char *path, int mode, int perm, - struct stat *stat1) -{ - struct stat stat2; - - int fd=open(path, mode -#ifdef O_NONBLOCK - | O_NONBLOCK -#else - | O_NDELAY -#endif - , perm); - - if (fd < 0) return (fd); - if (fcntl(fd, F_SETFL, (mode & O_APPEND)) || fstat(fd, stat1) - || lstat(path, &stat2)) - { - close(fd); - return (-1); - } - - if (stat1->st_dev != stat2.st_dev || stat1->st_ino != stat2.st_ino) - { - close(fd); - errno=ENOENT; - return (-1); - } - - return (fd); -} |