contrib/notmuch-deliver is presumed obsoleted by notmuch-insert.
+Notmuch 0.20 (UNRELEASED)
+
+Contrib
+-------
+
+`notmuch-deliver` is removed. As far as we know, all functionality
+previously provided by `notmuch-deliver` should now be provided by
+`notmuch insert`, provided by the main notmuch binary.
+
Notmuch 0.19 (2014-11-14)
=========================
+++ /dev/null
-# gitignore for notmuch-deliver
-.*.swp
-*~
-*.[oa]
-*.py[co]
-
-tags
-
-*.lo
-*.la
-
-.deps
-.libs
-Makefile.in
-Makefile
-
-gmon.out
-gprof*
-
-/INSTALL
-/aclocal.m4
-/autom4te.cache
-/config.guess
-/config.h
-/config.h.in
-/config.log
-/config.sub
-/config.status
-/configure
-/compile
-/depcomp
-/install-sh
-/missing
-/stamp-h1
-/libtool
-/ltmain.sh
-
-m4/libtool.m4
-m4/lt*.m4
-
-maildrop/numlib/config.h
-src/notmuch-deliver
+++ /dev/null
-Ali Polatel <alip@exherbo.org> <alip@penguen.ev>
+++ /dev/null
-CLEANFILES= *~
-MAINTAINERCLEANFILES= Makefile.in configure aclocal.m4 \
- config.h config.h.in INSTALL
-ACLOCAL_AMFLAGS= -I m4
-AUTOMAKE_OPTIONS= dist-bzip2 no-dist-gzip std-options foreign
-SUBDIRS= maildrop/numlib src .
-
-doc_DATA= README.mkd
+++ /dev/null
-## About
-`notmuch-deliver` is a [maildir](http://cr.yp.to/proto/maildir.html) delivery
-tool.
-
-## Overview
-`notmuch-deliver` is a [maildir](http://cr.yp.to/proto/maildir.html) delivery
-tool for [notmuch](http://notmuchmail.org) mail indexer. It reads from standard
-input, delivers the mail to the specified maildir and adds it to the notmuch
-database. This is meant as a convenient alternative to running `notmuch new`
-after mail delivery.
-
-## Usage
-Here's a simple example for [maildrop](http://www.courier-mta.org/maildrop/):
-
- # Deliver local mail to $MAILDIR/.Local and add local tag.
- if (/^From: root/:h)
- {
- to "|notmuch-deliver -f -t local Local"
- }
-
- # Deliver lkml mail to $MAILDIR/.Lkml, add lkml tag and remove inbox tag.
- if (/^List-Id: linux-kernel@vger.kernel.org/:h)
- {
- to "|notmuch-deliver -f -t lkml -r inbox Lkml"
- }
-
- # Deliver the rest to $MAILDIR, adding personal tag
- to "|notmuch-deliver -t personal"
-
-## Requirements
-- [notmuch](http://notmuchmail.org) shared library
-- [GLib](http://library.gnome.org/devel/glib/)-2.16 or newer
-
-## Contribute
-Clone [git://github.com/alip/notmuch-deliver.git](git://github.com/alip/notmuch-deliver.git).
-Format patches are preferred. Either send a mail to me or poke me on IRC.
-My personal e-mail address is [alip@exherbo.org](mailto:alip@exherbo.org).
-I'm available on IRC as `alip` on [Freenode](http://freenode.net) and [OFTC](http://www.oftc.net).
-
-## License
-You may redistribute this under the same terms as notmuch itself.
-
-<!-- vim: set ft=mkd spell spelllang=en sw=4 sts=4 et : -->
+++ /dev/null
-#!/bin/sh
-# vim: set sw=4 et sts=4 tw=80 :
-
-die() {
- echo "$@" >&2
- exit 1
-}
-
-echo ">>> libtoolize --copy --force --automake"
-libtoolize --copy --force --automake || die "libtoolize failed"
-echo ">>> rm -f config.cache"
-rm -f config.cache
-echo ">>> aclocal -I m4"
-aclocal -I m4 || die "aclocal failed"
-echo ">>> autoheader"
-autoheader || die "autoheader failed"
-echo ">>> autoconf"
-autoconf || die "autoconf failed"
-echo ">>> automake --foreign --add-missing --copy"
-automake --foreign --add-missing --copy || die "automake failed"
+++ /dev/null
-dnl vim: set sw=4 sts=4 ts=4 noet ft=config foldmethod=marker foldmarker={{{,}}} :
-
-dnl {{{ Program, version
-AC_PREREQ(2.59)
-AC_INIT([src/main.c])
-AC_CANONICAL_SYSTEM
-
-VERSION_MAJOR=0
-VERSION_MINOR=1
-VERSION_FULL="$VERSION_MAJOR.$VERSION_MINOR"
-VERSION="$VERSION_FULL"
-
-AC_SUBST([VERSION_MAJOR])
-AC_SUBST([VERSION_MINOR])
-AC_SUBST([VERSION_FULL])
-
-AM_INIT_AUTOMAKE(notmuch-deliver, [$VERSION_FULL])
-m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
-
-dnl {{{ Git revision
-AC_MSG_CHECKING([for git head])
-if test -d "${GIT_DIR:-${ac_top_srcdir:-./}/.git}" ; then
- GITHEAD=`git describe 2>/dev/null`
- if test -z ${GITHEAD} ; then
- GITHEAD=`git rev-parse HEAD`
- fi
- if test -n "`git diff-index -m --name-only HEAD`" ; then
- GITHEAD=${GITHEAD}-dirty
- fi
- if test -n "${GITHEAD}" ; then
- GITHEAD="-${GITHEAD}"
- fi
-fi
-AC_MSG_RESULT([$GITHEAD])
-AC_SUBST([GITHEAD])
-dnl }}}
-dnl }}}
-
-dnl {{{ Toolchain checks
-AC_USE_SYSTEM_EXTENSIONS
-AC_PROG_CC
-AC_PROG_CC_C99
-if test x"$ac_cv_prog_cc_c99" = x"no"; then
- AC_MSG_ERROR([notmuch-deliver requires a C compiler that supports ISO C99!])
-fi
-AC_PROG_LIBTOOL
-AC_PROG_LN_S
-AC_PROG_INSTALL
-AC_PROG_MAKE_SET
-dnl }}}
-
-dnl {{{ Check for headers
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_HEADER_TIME
-AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS([sys/stat.h unistd.h sysexits.h utime.h])
-dnl }}}
-
-dnl {{{ Check for typedefs, structures and compiler characteristics
-AC_C_CONST
-AC_TYPE_OFF_T
-AC_TYPE_SIZE_T
-AC_TYPE_UID_T
-AC_TYPE_PID_T
-AC_STRUCT_TM
-dnl }}}
-
-dnl {{{ Check for library functions
-AC_CHECK_FUNCS([setgroups initgroups symlink readlink strcasecmp utime utimes splice])
-dnl }}}
-
-dnl {{{ gethostname()
-AC_CACHE_CHECK([for missing gethostname prototype],
- maildir_cv_SYS_GETHOSTNAME,
- AC_TRY_COMPILE([
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-int gethostname(int,int);
-],,[maildir_cv_SYS_GETHOSTNAME=yes], [maildir_cv_SYS_GETHOSTNAME=no]))
-
-if test x"$maildir_cv_SYS_GETHOSTNAME" = x"no" ; then
- AC_DEFINE_UNQUOTED(HAS_GETHOSTNAME, 1, [Whether gethostname() is prototyped])
-fi
-dnl }}}
-
-dnl {{{ Check for maildir target separator
-if test "$target_os" = "cygwin" ; then
- AC_DEFINE_UNQUOTED(MDIRSEP, "!", [Maildir target separator])
-else
- AC_DEFINE_UNQUOTED(MDIRSEP, ":", [Maildir target separator])
-fi
-dnl }}}
-
-dnl {{{ Make pkg-config work
-PKG_PROG_PKG_CONFIG([0.9.0])
-dnl }}}
-
-dnl {{{ Check for libraries
-GLIB_REQUIRED=2.16
-
-PKG_CHECK_MODULES([glib], [glib-2.0 >= $GLIB_REQUIRED],,
- [AC_MSG_ERROR([notmuch-deliver requires glib-$GLIB_REQUIRED or newer])])
-AC_CHECK_LIB(notmuch, notmuch_database_create,,
- [AC_MSG_ERROR([notmuch-deliver requires notmuch mail indexing library])])
-dnl }}}
-
-dnl {{{ Extra CFLAGS
-NOTMUCH_DELIVER_CFLAGS=
-WANTED_CFLAGS="-Wall -W -Wextra -Wvla -Wformat=2 -Wformat-security -Wformat-nonliteral -Winit-self -Wfloat-equal -Wno-deprecated-declarations -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wredundant-decls -Wshadow -Wpointer-arith -Wstrict-prototypes -Wcast-qual -Wwrite-strings -pedantic"
-for flag in $WANTED_CFLAGS ; do
- AX_CHECK_COMPILER_FLAGS([$flag], [NOTMUCH_DELIVER_CFLAGS="$NOTMUCH_DELIVER_CFLAGS $flag"],)
-done
-dnl }}}
-
-dnl {{{ Profiling
-AC_MSG_CHECKING([whether gprof symbols are wanted])
-AC_ARG_ENABLE([gprof],
- [AS_HELP_STRING([--enable-gprof],
- [Add gprof symbols (-pg) (for debugging)])],
- PROFILE="$enableval",
- PROFILE="no")
-AC_MSG_RESULT([$PROFILE])
-if test x"$PROFILE" = x"yes" ; then
- AX_CHECK_COMPILER_FLAGS([-pg],, AC_MSG_ERROR([Your compiler doesn't support -pg flag]))
- NOTMUCH_DELIVER_CFLAGS="$NOTMUCH_DELIVER_CFLAGS -pg"
- LDFLAGS="$LDFLAGS -pg"
-fi
-AC_MSG_CHECKING([whether coverage testing should be enabled])
-AC_ARG_ENABLE([gcov],
- [AS_HELP_STRING([--enable-gcov],
- [add gcov support (for debugging)])],
- COVERAGE="$enableval",
- COVERAGE="no")
-AC_MSG_RESULT([$COVERAGE])
-if test x"$COVERAGE" = x"yes" ; then
- AX_CHECK_COMPILER_FLAGS([-fprofile-arcs],,
- AC_MSG_ERROR([Your compiler doesn't support -fprofile-arcs flag]))
- AX_CHECK_COMPILER_FLAGS([-ftest-coverage],,
- AC_MSG_ERROR([Your compiler doesn't support -ftest-coverage flag]))
- NOTMUCH_DELIVER_CFLAGS="$NOTMUCH_DELIVER_CFLAGS -fprofile-arcs -ftest-coverage"
-fi
-AC_SUBST([NOTMUCH_DELIVER_CFLAGS])
-dnl }}}
-
-dnl {{{ Output
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_LINKS([maildrop/numlib/config.h:config.h])
-AC_OUTPUT(
- Makefile
- maildrop/numlib/Makefile
- src/Makefile
- )
-dnl }}}
+++ /dev/null
-# ===========================================================================
-# http://www.nongnu.org/autoconf-archive/ax_check_compiler_flags.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-# Check whether the given compiler FLAGS work with the current language's
-# compiler, or whether they give an error. (Warnings, however, are
-# ignored.)
-#
-# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
-# success/failure.
-#
-# LICENSE
-#
-# Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
-# Copyright (c) 2009 Matteo Frigo
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
-[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
-AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
-dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
-AS_LITERAL_IF([$1],
- [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
- ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
- _AC_LANG_PREFIX[]FLAGS="$1"
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
- AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
- AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
- _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
- [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
- _AC_LANG_PREFIX[]FLAGS="$1"
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
- eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
- eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
- _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
-eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
-AC_MSG_RESULT($ax_check_compiler_flags)
-if test "x$ax_check_compiler_flags" = xyes; then
- m4_default([$2], :)
-else
- m4_default([$3], :)
-fi
-])dnl AX_CHECK_COMPILER_FLAGS
+++ /dev/null
-#
-# Copyright 1998 - 2005 Double Precision, Inc. See COPYING for
-# distribution information.
-
-
-noinst_LTLIBRARIES=libmaildir.la
-
-
-DOCS= deliverquota.html.in deliverquota.8.in \
- maildiracl.1.in \
- maildir.html maildir.5 \
- maildiracl.html.in \
- maildirmake.html.in maildirmake.1.in maildirquota.html maildirquota.7 \
- maildirkw.html maildirkw.1
-
-if HAVE_SGML
-BUILT_SOURCES=maildirsharedrc.h maildirfilterconfig.h quotawarnmsg.h \
- mailbot.h autoresponsequota.h $(noinst_DATA) $(DOCS)
-else
-BUILT_SOURCES=maildirsharedrc.h maildirfilterconfig.h quotawarnmsg.h \
- mailbot.h autoresponsequota.h $(noinst_DATA)
-endif
-
-noinst_DATA=deliverquota.html maildirmake.html deliverquota.8 maildirmake.1 \
- maildiracl.html maildiracl.1 maildir.libdeps
-
-libmaildir_la_SOURCES=autoresponse.c autoresponse.h \
- maildiraclt.c maildiraclt.h \
- maildircache.c maildircache.h \
- maildircreate.c maildircreate.h \
- maildirfilename.c maildirgetnew.c \
- maildirfilter.c maildirfilter2.c \
- maildirfilter.h maildirfiltertypelist.h\
- maildirflags.c maildirmkdir.c \
- maildirgetquota.c maildirgetquota.h \
- maildirinfo.c maildirinfo.h \
- maildirkeywords.c maildirkeywords2.c maildirkeywords3.c \
- maildirkeywords4.cpp \
- maildirkeywords.h maildirlist.c maildirlock.c \
- maildirmake2.c \
- maildirnewshared.c maildirnewshared.h maildirnewshared2.c \
- maildiropen.c maildirparsequota.c \
- maildirpath.c maildirpurgetmp.c maildirmisc.h \
- maildirrename.c \
- maildirsearch.c maildirsearchC.cpp maildirsearch.h \
- maildirshared.c maildirshared2.c maildirdelfolder.c\
- maildirquota.c maildirquota.h maildirrequota.c maildirrequota.h \
- maildirwatch.c maildirwatch.h loginexec.c loginexec.h
-
-noinst_PROGRAMS=deliverquota maildirmake testmaildirfilter maildirkwtest \
- maildirkw maildiracl maildiraclttest
-
-deliverquota_SOURCES=deliverquota.c
-deliverquota_DEPENDENCIES=libmaildir.la ../rfc822/librfc822.la \
- ../numlib/libnumlib.la
-deliverquota_LDADD=libmaildir.la ../rfc822/librfc822.la ../numlib/libnumlib.la
-deliverquota_LDFLAGS=-static
-
-maildirmake_SOURCES=maildirmake.c
-maildirmake_DEPENDENCIES=libmaildir.la ../numlib/libnumlib.la \
- ../rfc822/librfc822.la
-maildirmake_LDADD=libmaildir.la ../numlib/libnumlib.la \
- ../rfc822/librfc822.la
-maildirmake_LDFLAGS=-static
-
-testmaildirfilter_SOURCES=maildirfiltertypelist.h testmaildirfilter.c
-testmaildirfilter_DEPENDENCIES=libmaildir.la ../numlib/libnumlib.la
-testmaildirfilter_LDADD=libmaildir.la ../numlib/libnumlib.la @LIBPCRE@
-testmaildirfilter_LDFLAGS=-static
-
-maildirkwtest_SOURCES=maildirkwtest.c
-maildirkwtest_LDADD=libmaildir.la
-maildirkwtest_DEPENDENCIES=libmaildir.la
-maildirkwtest_LDFLAGS=-static
-
-maildirkw_SOURCES=maildirkw.c
-maildirkw_LDADD=libmaildir.la ../liblock/liblock.la ../numlib/libnumlib.la \
- `cat maildir.libdeps`
-maildirkw_DEPENDENCIES=libmaildir.la ../liblock/liblock.la \
- ../numlib/libnumlib.la maildir.libdeps
-maildirkw_LDFLAGS=-static
-
-maildiracl=maildiracl.c
-maildiracl_LDADD=libmaildir.la ../liblock/liblock.la ../numlib/libnumlib.la \
- `cat maildir.libdeps`
-maildiracl_DEPENDENCIES=libmaildir.la ../liblock/liblock.la \
- ../numlib/libnumlib.la maildir.libdeps
-maildiracl_LDFLAGS=-static
-
-maildiraclttest_SOURCES=testmaildiraclt.c
-maildiraclttest_LDADD=libmaildir.la ../liblock/liblock.la \
- ../numlib/libnumlib.la `cat maildir.libdeps`
-maildiraclttest_DEPENDENCIES=libmaildir.la ../liblock/liblock.la \
- ../numlib/libnumlib.la maildir.libdeps
-maildiraclttest_LDFLAGS=-static
-
-EXTRA_DIST=README.maildirquota.html README.maildirquota.txt \
- README.imapkeywords.html \
- README.maildirfilter.html \
- README.sharedfolders.html README.sharedfolders.txt \
- maildirkwtest.txt \
- testsuite testsuite.txt testsuite2 testsuite2.txt quotawarnmsg $(DOCS)
-
-HTML2TXT=links -dump -no-numbering
-
-README.maildirquota.txt: README.maildirquota.html
- $(HTML2TXT) README.maildirquota.html >README.maildirquota.txt
-
-README.sharedfolders.txt: README.sharedfolders.html
- $(HTML2TXT) README.sharedfolders.html >README.sharedfolders.txt
-
-mailbot.h: config.status
- echo '#define MAILBOT "@MAILBOT@"' >mailbot.h
-
-maildirsharedrc.h: config.status
- echo '#define MAILDIRSHAREDRC "$(sysconfdir)/maildirshared"' >maildirsharedrc.h
-
-maildirfilterconfig.h: config.status
- echo '#define MAILDIRFILTERCONFIG "$(sysconfdir)/maildirfilterconfig"' >maildirfilterconfig.h
-
-autoresponsequota.h: config.status
- echo '#define AUTORESPONSEQUOTA "$(sysconfdir)/autoresponsesquota"' >autoresponsequota.h
-
-quotawarnmsg.h: config.status
- echo '#define QUOTAWARNMSG "$(sysconfdir)/quotawarnmsg"' >quotawarnmsg.h
-maildir.libdeps: config.status
- echo @LIBFAM@ >maildir.libdeps
-
-clean-local:
- rm -rf maildir.libdeps testmd
-
-check-am:
- @SHELL@ $(srcdir)/testsuite 2>&1 | cmp - $(srcdir)/testsuite.txt
- test "@LIBPCRE@" != "" || exit 0 ; @SHELL@ $(srcdir)/testsuite2 2>&1 | cmp - $(srcdir)/testsuite2.txt
- LC_ALL=C; export LC_ALL; ./maildirkwtest | cmp -s - $(srcdir)/maildirkwtest.txt
- LC_ALL=C; export LC_ALL; ./maildiraclttest
-
-if HAVE_SGML
-
-deliverquota.html.in: deliverquota.sgml ../docbook/sgml2html
- ../docbook/sgml2html deliverquota.sgml deliverquota.html.in
-
-deliverquota.8.in: deliverquota.sgml ../docbook/sgml2html
- ../docbook/sgml2man deliverquota.sgml deliverquota.8.in
- mv deliverquota.8 deliverquota.8.in
-
-maildirmake.html.in: maildirmake.sgml ../docbook/sgml2html
- ../docbook/sgml2html maildirmake.sgml maildirmake.html.in
-
-maildirmake.1.in: maildirmake.sgml ../docbook/sgml2html
- ../docbook/sgml2man maildirmake.sgml maildirmake.1.in
- mv maildirmake.1 maildirmake.1.in
-
-maildiracl.html.in: maildiracl.sgml ../docbook/sgml2html
- ../docbook/sgml2html maildiracl.sgml maildiracl.html.in
-
-maildiracl.1.in: maildiracl.sgml ../docbook/sgml2html
- ../docbook/sgml2man maildiracl.sgml maildiracl.1.in
- mv maildiracl.1 maildiracl.1.in
-
-maildirquota.html: maildirquota.sgml ../docbook/sgml2html
- ../docbook/sgml2html maildirquota.sgml maildirquota.html
-
-maildirquota.7: maildirquota.sgml ../docbook/sgml2man
- ../docbook/sgml2man maildirquota.sgml maildirquota.7
-
-maildir.html: maildir.sgml ../docbook/sgml2html
- ../docbook/sgml2html maildir.sgml maildir.html
-
-maildir.5: maildir.sgml ../docbook/sgml2man
- ../docbook/sgml2man maildir.sgml maildir.5
-
-maildirkw.html: maildirkw.sgml ../docbook/sgml2html
- ../docbook/sgml2html maildirkw.sgml maildirkw.html
-
-maildirkw.1: maildirkw.sgml ../docbook/sgml2man
- ../docbook/sgml2man maildirkw.sgml maildirkw.1
-
-endif
-
-deliverquota.html: deliverquota.html.in
- ./config.status --file=$@
-
-deliverquota.8: deliverquota.8.in
- ./config.status --file=$@
-
-maildirmake.html: maildirmake.html.in
- ./config.status --file=$@
-
-maildirmake.1: maildirmake.1.in
- ./config.status --file=$@
-
-maildiracl.html: maildiracl.html.in
- ./config.status --file=$@
-
-maildiracl.1: maildiracl.1.in
- ./config.status --file=$@
-
-# autoresponse.c: autoresponsequota.h
-
-DISTCLEANFILES=$(BUILT_SOURCES)
+++ /dev/null
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl Copyright 1998 - 2001 Double Precision, Inc. See COPYING for
-dnl distribution information.
-
-AC_INIT(maildir, 0.11, [courier-maildrop@lists.sourceforge.net])
-
->confdefs.h # Kill PACKAGE_ macros
-
-AC_CONFIG_SRCDIR(maildirquota.c)
-LPATH="$PATH:/usr/local/bin"
-AC_CANONICAL_SYSTEM
-AM_INIT_AUTOMAKE([foreign no-define])
-AM_CONFIG_HEADER(config.h)
-
-dnl Checks for programs.
-AC_PROG_AWK
-AC_USE_SYSTEM_EXTENSIONS
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_LIBTOOL_DLOPEN
-AM_PROG_LIBTOOL
-
-AC_PROG_CXX
-
-AC_PATH_PROGS(PERL, perl5 perl, perl, $LPATH)
-
-if test "$GCC" = "yes"
-then
- CFLAGS="$CFLAGS -Wall"
-fi
-
-if test "$GXX" = "yes"
-then
- CXXFLAGS="$CXXFLAGS -Wall"
-fi
-
-CFLAGS="$CFLAGS -I${srcdir}/.. -I.."
-
-dnl Checks for libraries.
-
-dnl Checks for header files.
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_HEADER_TIME
-AC_CHECK_HEADERS(sys/stat.h sys/wait.h fcntl.h unistd.h sysexits.h utime.h pcre.h pcre/pcre.h)
-
-AC_CHECK_HEADER([pcre.h],
- [LIBPCRE=-lpcre])
-
-AC_CHECK_HEADER([pcre/pcre.h],
- [LIBPCRE=-lpcre])
-
-AC_SUBST(LIBPCRE)
-
-AC_HEADER_SYS_WAIT
-
-AC_LANG_CPLUSPLUS
-AC_CHECK_HEADERS(vector vector.h)
-AC_LANG_C
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_OFF_T
-AC_TYPE_SIZE_T
-AC_TYPE_UID_T
-AC_STRUCT_TM
-AC_SYS_LARGEFILE
-
-dnl Checks for library functions.
-AC_CHECK_HEADER(fam.h, :, :)
-AC_CHECK_FUNCS(symlink readlink strcasecmp utime utimes)
-AC_CHECK_LIB(fam, FAMOpen, [
- LIBFAM=-lfam
- AC_DEFINE_UNQUOTED(HAVE_FAM,1,
- [ Whether libfam.a is available ])
-
- AC_CHECK_HEADER(fam.h, : , [
-AC_MSG_WARN([[The development header files and libraries for fam,]])
-AC_MSG_WARN([[the File Alteration Monitor, are not installed.]])
-AC_MSG_WARN([[You appear to have the FAM runtime libraries installed,]])
-AC_MSG_WARN([[so you need to simply install the additional development]])
-AC_MSG_WARN([[package for your operating system.]])
-AC_MSG_ERROR([[FAM development libraries not found.]]) ]
- )
- ])
-
-AC_SUBST(LIBFAM)
-
-echo "$LIBFAM" >maildir.libdeps
-
-AC_CACHE_CHECK([for missing gethostname prototype],maildir_cv_SYS_GETHOSTNAME,
-
-AC_TRY_COMPILE([
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-extern "C" int gethostname(int,int);
-],[
-],maildir_cv_SYS_GETHOSTNAME=yes,maildir_cv_SYS_GETHOSTNAME=no
-)
-
-)
-
-if test $maildir_cv_SYS_GETHOSTNAME = "no"
-then
- AC_DEFINE_UNQUOTED(HAS_GETHOSTNAME,1,
- [ Whether gethostname() is prototyped ])
-fi
-
-AC_ARG_WITH(db, [ --with-db=gdbm Use the GDBM library.
- --with-db=db Use the libdb.a library.],
- db="$withval", db="")
-
-if test "$db" = "no"
-then
- db=""
-fi
-
-if test "$db" != ""
-then
- AC_DEFINE_UNQUOTED(HAVE_DBOBJ,1,
- [ Whether the top-level configure script defined dbobj ])
-fi
-
-AC_ARG_WITH(trashquota, [ --with-trashquota Count deleted messages as part of the quota],
- trashquota="$withval",
- trashquota="no")
-
-if test "$trashquota" = "yes"
-then
- AC_DEFINE_UNQUOTED(TRASHQUOTA,1,
- [ Whether to count deleted messages towards the maildir quota ])
-fi
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-eval "prefix=$prefix"
-eval "exec_prefix=$exec_prefix"
-eval "sysconfdir=$sysconfdir"
-
-AC_PATH_PROGS(MAILBOT, mailbot, mailbot, $LPATH)
-
-if test -d $srcdir/../courier
-then
- MAILBOT="$bindir/mailbot"
- AC_DEFINE_UNQUOTED(HAVE_COURIER,1,
- [ Whether building the full Courier suite. ])
-fi
-
-AC_SUBST(MAILBOT)
-AM_CONDITIONAL(HAVE_SGML, test -d ${srcdir}/../docbook)
-
-if test "$target_os" = "cygwin"
-then
- AC_DEFINE_UNQUOTED(MDIRSEP, "!",
- [ Maildir target separator ])
-else
- AC_DEFINE_UNQUOTED(MDIRSEP, ":",
- [ Maildir target separator ])
-fi
-
-AC_OUTPUT(Makefile sharedindexinstall sharedindexsplit)
+++ /dev/null
-/*
-** 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"
-
-
-
-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);
-}
+++ /dev/null
-#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
-
-
- /* 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
+++ /dev/null
-#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
-
-
-/*
-**
-** 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
+++ /dev/null
-/*
-** 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"
-
-
-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);
-}
-
+++ /dev/null
-/*
-** 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"
-
-
-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);
-}
+++ /dev/null
-#
-# Copyright 1998 - 2004 Double Precision, Inc. See COPYING for
-# distribution information.
-
-
-CLEANFILES=$(noinst_DATA)
-noinst_LTLIBRARIES=libnumlib.la
-
-libnumlib_la_SOURCES=\
- atotimet.c \
- atouidt.c \
- changeuidgid.c \
- numlib.h \
- strdevt.c \
- strgidt.c \
- strhdevt.c \
- strhinot.c \
- strhpidt.c \
- strhtimet.c \
- strinot.c \
- strofft.c \
- strpidt.c \
- strsize.c \
- strsizet.c \
- strtimet.c \
- struidt.c
+++ /dev/null
-/*
-** Copyright 2003 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-LIBMAIL_STRIMPL(time_t, libmail_strtotime_t, libmail_atotime_t)
+++ /dev/null
-/*
-** Copyright 2003 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-LIBMAIL_STRIMPL(uid_t, libmail_strtouid_t, libmail_atouid_t)
-LIBMAIL_STRIMPL(gid_t, libmail_strtogid_t, libmail_atogid_t)
+++ /dev/null
-/*
-** Copyright 1998 - 2002 Double Precision, Inc. See COPYING for
-** distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <sys/types.h>
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <grp.h>
-#include <pwd.h>
-#include <errno.h>
-
-#include "numlib.h"
-
-
-void libmail_changegroup(gid_t gid)
-{
- if ( setgid(gid))
- {
- perror("setgid");
- exit(1);
- }
-
-#if HAVE_SETGROUPS
- if ( getuid() == 0 && setgroups(1, &gid) )
- {
- perror("setgroups");
- exit(1);
- }
-#endif
-}
-
-void libmail_changeuidgid(uid_t uid, gid_t gid)
-{
- libmail_changegroup(gid);
- if ( setuid(uid))
- {
- perror("setuid");
- exit(1);
- }
-}
-
-void libmail_changeusername(const char *uname, const gid_t *forcegrp)
-{
-struct passwd *pw;
-uid_t changeuid;
-gid_t changegid;
-
-/* uname might be a pointer returned from a previous called to getpw(),
-** and libc has a problem getting it back.
-*/
-char *p=malloc(strlen(uname)+1);
-
- if (!p)
- {
- perror("malloc");
- exit(1);
- }
- strcpy(p, uname);
-
- errno=ENOENT;
- if ((pw=getpwnam(p)) == 0)
- {
- free(p);
- perror("getpwnam");
- exit(1);
- }
- free(p);
-
- changeuid=pw->pw_uid;
-
- if ( !forcegrp ) forcegrp= &pw->pw_gid;
-
- changegid= *forcegrp;
-
- if ( setgid( changegid ))
- {
- perror("setgid");
- exit(1);
- }
-
-#if HAVE_INITGROUPS
- if ( getuid() == 0 && initgroups(pw->pw_name, changegid) )
- {
- perror("initgroups");
- exit(1);
- }
-#else
-#if HAVE_SETGROUPS
- if ( getuid() == 0 && setgroups(1, &changegid) )
- {
- perror("setgroups");
- exit(1);
- }
-#endif
-#endif
-
- if (setuid(changeuid))
- {
- perror("setuid");
- exit(1);
- }
-}
+++ /dev/null
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl Copyright 1998 - 2010 Double Precision, Inc. See COPYING for
-dnl distribution information.
-
-AC_PREREQ(2.59)
-AC_INIT(numlib, 0.10, courier-users@lists.sourceforge.net)
-
->confdefs.h # Kill PACKAGE_ macros
-
-AC_CONFIG_SRCDIR([atotimet.c])
-AM_CONFIG_HEADER([config.h])
-AM_INIT_AUTOMAKE([foreign no-define])
-
-dnl Checks for programs.
-AC_PROG_AWK
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_LIBTOOL
-
-if test "$GCC" = "yes"
-then
- CFLAGS="$CFLAGS -Wall"
-fi
-
-dnl Checks for libraries.
-
-dnl Checks for header files.
-
-AC_CHECK_HEADERS(unistd.h stdint.h)
-
-AC_CHECK_TYPE(int64_t, [ : ],
- [
- AC_DEFINE_UNQUOTED(int64_t,long long,[default definition of int64_t])
- ])
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_TYPE_UID_T
-AC_TYPE_PID_T
-AC_SYS_LARGEFILE
-
-dnl Checks for library functions.
-
-AC_CHECK_FUNCS(setgroups initgroups)
-AC_OUTPUT(Makefile)
+++ /dev/null
-#ifndef numlib_h
-#define numlib_h
-
-/*
-** Copyright 1998 - 2010 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#if HAVE_CONFIG_H
-#include "../numlib/config.h" /* VPATH build */
-#endif
-
-#if HAVE_STDINT_H
-#include <stdint.h>
-#endif
-
-#include <sys/types.h>
-#include <time.h>
-
-#define NUMBUFSIZE 60
-
-/* Convert various system types to decimal */
-
-char *libmail_str_time_t(time_t, char *);
-char *libmail_str_off_t(off_t, char *);
-char *libmail_str_int64_t(int64_t, char *);
-char *libmail_str_pid_t(pid_t, char *);
-char *libmail_str_dev_t(dev_t, char *);
-char *libmail_str_ino_t(ino_t, char *);
-char *libmail_str_uid_t(uid_t, char *);
-char *libmail_str_gid_t(gid_t, char *);
-char *libmail_str_size_t(size_t, char *);
-
-char *libmail_str_sizekb(unsigned long, char *); /* X Kb or X Mb */
-
-/* Convert selected system types to hex */
-
-char *libmail_strh_time_t(time_t, char *);
-char *libmail_strh_pid_t(pid_t, char *);
-char *libmail_strh_ino_t(ino_t, char *);
-char *libmail_strh_dev_t(dev_t, char *);
-
-/* And, now let's do the reverse */
-
-time_t libmail_strtotime_t(const char **);
-time_t libmail_atotime_t(const char *);
-
-uid_t libmail_strtouid_t(const char **);
-uid_t libmail_atouid_t(const char *);
-
-gid_t libmail_strtogid_t(const char **);
-gid_t libmail_atogid_t(const char *);
-
- /* Common macros: */
-
-#define LIBMAIL_STRIMPL(type, f1, f2) \
-\
-type f1(const char **p)\
-{\
- type n=0;\
- while ( **p >= '0' && **p <= '9') n=n*10 + (char)(*(*p)++ - '0');\
- return n;\
-}\
-\
-type f2(const char *p)\
-{\
- return f1(&p);\
-}
-
-
-/*
-** The following functions are used by root to reset its user and group id
-** to the authenticated user's. Various functions are provided to handle
-** various situations.
-*/
-
-void libmail_changegroup(gid_t); /* Set the group id only. Also clear any
- ** auxiliary group ids */
-
-void libmail_changeuidgid(uid_t, gid_t);
- /* Set both user id and group id. Also clear
- ** aux group ids */
-
-void libmail_changeusername(const char *, const gid_t *);
- /*
- ** Set the userid to the indicate user's. If second argument is
- ** not null, it points to the groupid to set. If it's null, the
- ** group id is taken from the passwd file. Auxiliary IDs are set
- ** to any aux IDs set for the user in the group file. If there are
- ** no aux group IDs for the user, any AUX ids are cleared.
- */
-
-#ifdef __cplusplus
-}
-#endif
-#endif
+++ /dev/null
-/*
-** Copyright 2003 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_dev_t(dev_t t, char *arg)
-{
- char buf[NUMBUFSIZE];
- char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_gid_t(gid_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2003 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-static const char xdigit[]="0123456789ABCDEF";
-
-char *libmail_strh_dev_t(dev_t t, char *arg)
-{
-char buf[sizeof(t)*2+1];
-char *p=buf+sizeof(buf)-1;
-unsigned i;
-
- *p=0;
- for (i=0; i<sizeof(t)*2; i++)
- {
- *--p= xdigit[t & 15];
- t=t / 16;
- }
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-static const char xdigit[]="0123456789ABCDEF";
-
-char *libmail_strh_ino_t(ino_t t, char *arg)
-{
-char buf[sizeof(t)*2+1];
-char *p=buf+sizeof(buf)-1;
-unsigned i;
-
- *p=0;
- for (i=0; i<sizeof(t)*2; i++)
- {
- *--p= xdigit[t & 15];
- t=t / 16;
- }
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-static const char xdigit[]="0123456789ABCDEF";
-
-char *libmail_strh_pid_t(pid_t t, char *arg)
-{
-char buf[sizeof(t)*2+1];
-char *p=buf+sizeof(buf)-1;
-unsigned i;
-
- *p=0;
- for (i=0; i<sizeof(t)*2; i++)
- {
- *--p= xdigit[t & 15];
- t=t / 16;
- }
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-static const char xdigit[]="0123456789ABCDEF";
-
-char *libmail_strh_time_t(time_t t, char *arg)
-{
-char buf[sizeof(t)*2+1];
-char *p=buf+sizeof(buf)-1;
-unsigned i;
-
- *p=0;
- for (i=0; i<sizeof(t)*2; i++)
- {
- *--p= xdigit[t & 15];
- t=t / 16;
- }
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_ino_t(ino_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2010 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_off_t(off_t t, char *arg)
-{
- char buf[NUMBUFSIZE];
- char *p=buf+sizeof(buf)-1;
- int isneg=0;
-
- if (t < 0)
- {
- t= -t;
- isneg=1;
- }
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
-
- if (isneg)
- *--p='-';
-
- return (strcpy(arg, p));
-}
-
-char *libmail_str_int64_t(int64_t t, char *arg)
-{
- char buf[NUMBUFSIZE];
- char *p=buf+sizeof(buf)-1;
- int isneg=0;
-
- if (t < 0)
- {
- t= -t;
- isneg=1;
- }
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
-
- if (isneg)
- *--p='-';
-
- return (strcpy(arg, p));
-}
-
-
-
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_pid_t(pid_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 2001 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-static void cat_n(char *buf, unsigned long n)
-{
-char bb[NUMBUFSIZE+1];
-char *p=bb+sizeof(bb)-1;
-
- *p=0;
- do
- {
- *--p = "0123456789"[n % 10];
- n=n/10;
- } while (n);
- strcat(buf, p);
-}
-
-char *libmail_str_sizekb(unsigned long n, char *sizebuf)
-{
- /* If size is less than 1K bytes, display it as 0.xK */
-
- if (n < 1024)
- {
- strcpy(sizebuf, "0.");
- cat_n(sizebuf, (int)(10 * n / 1024 ));
- strcat(sizebuf, "K");
- }
- /* If size is less than 1 meg, display is as xK */
-
- else if (n < 1024 * 1024)
- {
- *sizebuf=0;
- cat_n(sizebuf, (unsigned long)(n+512)/1024);
- strcat(sizebuf, "K");
- }
-
- /* Otherwise, display in megabytes */
-
- else
- {
- unsigned long nm=(double)n / (1024.0 * 1024.0) * 10;
-
- *sizebuf=0;
- cat_n( sizebuf, nm / 10);
- strcat(sizebuf, ".");
- cat_n( sizebuf, nm % 10);
- strcat(sizebuf, "M");
- }
-
- return (sizebuf);
-}
-
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_size_t(size_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_time_t(time_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-/*
-** Copyright 1998 - 2000 Double Precision, Inc.
-** See COPYING for distribution information.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "numlib.h"
-#include <string.h>
-
-
-char *libmail_str_uid_t(uid_t t, char *arg)
-{
-char buf[NUMBUFSIZE];
-char *p=buf+sizeof(buf)-1;
-
- *p=0;
- do
- {
- *--p= '0' + (t % 10);
- t=t / 10;
- } while(t);
- return (strcpy(arg, p));
-}
+++ /dev/null
-DEFS+= -DGITHEAD=\"$(GITHEAD)\"
-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=\
- $(top_srcdir)/maildrop/maildir/maildircreate.h \
- $(top_srcdir)/maildrop/maildir/maildirmisc.h
-
-bin_PROGRAMS=\
- notmuch-deliver
-
-notmuch_deliver_SOURCES=\
- $(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)/maildrop/numlib/libnumlib.la \
- $(glib_LIBS)
+++ /dev/null
-/* notmuch-deliver - If you make the user a promise... make sure you deliver it!
- *
- * Copyright © 2010 Ali Polatel
- * Based in part upon deliverquota of maildrop which is:
- * Copyright 1998 - 2009 Double Precision, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see http://www.gnu.org/licenses/ .
- *
- * Author: Ali Polatel <polatel@gmail.com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_SPLICE
-#include <fcntl.h>
-#endif
-
-#ifdef HAVE_SYSEXITS_H
-#include <sysexits.h>
-#endif
-
-#include <glib.h>
-#include <notmuch.h>
-
-#include "maildircreate.h"
-#include "maildirmisc.h"
-
-#ifndef EX_USAGE
-#define EX_USAGE 64
-#endif
-
-#ifndef EX_SOFTWARE
-#define EX_SOFTWARE 70
-#endif
-
-#ifndef EX_OSERR
-#define EX_OSERR 71
-#endif
-
-#ifndef EX_IOERR
-#define EX_IOERR 74
-#endif
-
-#ifndef EX_TEMPFAIL
-#define EX_TEMPFAIL 75
-#endif
-
-#ifndef EX_NOPERM
-#define EX_NOPERM 77
-#endif
-
-#ifndef EX_CONFIG
-#define EX_CONFIG 78
-#endif
-
-static gboolean opt_create, opt_fatal, opt_folder, opt_version;
-static gboolean opt_verbose = FALSE;
-static gchar **opt_tags = NULL;
-static gchar **opt_rtags = NULL;
-
-static GOptionEntry options[] = {
- {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version,
- "Display version", NULL},
- {"verbose", 'v', 0, G_OPTION_ARG_NONE, &opt_verbose,
- "Be verbose (useful for debugging)", NULL},
- {"create", 'c', 0, G_OPTION_ARG_NONE, &opt_create,
- "Create the maildir if it doesn't exist", NULL},
- {"folder", 'f', 0, G_OPTION_ARG_NONE, &opt_folder,
- "Add a dot before FOLDER, e.g: Local => $MAILDIR/.Local", NULL},
- {"tag", 't', 0, G_OPTION_ARG_STRING_ARRAY, &opt_tags,
- "Add a tag to the message, may be specified multiple times", "TAG"},
- {"remove-tag", 'r', 0, G_OPTION_ARG_STRING_ARRAY, &opt_rtags,
- "Remove a tag from the message, may be specified multiple times", "TAG"},
- {"fatal-add", 0, 0, G_OPTION_ARG_NONE, &opt_fatal,
- "If adding the mail to the database fails, unlink it and return non-zero", NULL},
- {NULL, 0, 0, 0, NULL, NULL, NULL},
-};
-
-static void
-about(void)
-{
- printf(PACKAGE"-"VERSION GITHEAD "\n");
-}
-
-static void
-log_handler(G_GNUC_UNUSED const gchar *domain, GLogLevelFlags level,
- const gchar *message, G_GNUC_UNUSED gpointer user_data)
-{
- g_return_if_fail(message != NULL && message[0] != '\0');
-
- if (!opt_verbose && (level & G_LOG_LEVEL_DEBUG))
- return;
-
- g_printerr(PACKAGE": %s\n", message);
-}
-
-static gboolean
-load_keyfile(const gchar *path, gchar **db_path, gchar ***tags)
-{
- GKeyFile *fd;
- GError *error;
-
- fd = g_key_file_new();
- error = NULL;
- if (!g_key_file_load_from_file(fd, path, G_KEY_FILE_NONE, &error)) {
- g_printerr("Failed to parse `%s': %s", path, error->message);
- g_error_free(error);
- g_key_file_free(fd);
- return FALSE;
- }
-
- *db_path = g_key_file_get_string(fd, "database", "path", &error);
- if (*db_path == NULL) {
- g_critical("Failed to parse database.path from `%s': %s", path, error->message);
- g_error_free(error);
- g_key_file_free(fd);
- return FALSE;
- }
-
- *tags = g_key_file_get_string_list(fd, "new", "tags", NULL, NULL);
-
- g_key_file_free(fd);
- return TRUE;
-}
-
-#ifdef HAVE_SPLICE
-static int
-save_splice(int fdin, int fdout)
-{
- int ret, written, pfd[2];
-
- if (pipe(pfd) < 0) {
- g_critical("Failed to create pipe: %s", g_strerror(errno));
- return EX_IOERR;
- }
-
- for (;;) {
- ret = splice(fdin, NULL, pfd[1], NULL, 4096, 0);
- if (!ret)
- break;
- if (ret < 0) {
- g_critical("Splicing data from standard input failed: %s",
- g_strerror(errno));
- close(pfd[0]);
- close(pfd[1]);
- return EX_IOERR;
- }
-
- do {
- written = splice(pfd[0], NULL, fdout, NULL, ret, 0);
- if (!written) {
- g_critical("Splicing data to temporary file failed: internal error");
- close(pfd[0]);
- close(pfd[1]);
- return EX_IOERR;
- }
- if (written < 0) {
- g_critical("Splicing data to temporary file failed: %s",
- g_strerror(errno));
- close(pfd[0]);
- close(pfd[1]);
- return EX_IOERR;
- }
- ret -= written;
- } while (ret);
- }
-
- close(pfd[0]);
- close(pfd[1]);
- return 0;
-}
-#endif /* HAVE_SPLICE */
-
-static int
-save_readwrite(int fdin, int fdout)
-{
- int ret, written;
- char buf[4096], *p;
-
- for (;;) {
- ret = read(fdin, buf, 4096);
- if (!ret)
- break;
- if (ret < 0) {
- if (errno == EINTR)
- continue;
- g_critical("Reading from standard input failed: %s",
- g_strerror(errno));
- return EX_IOERR;
- }
- p = buf;
- do {
- written = write(fdout, p, ret);
- if (!written)
- return EX_IOERR;
- if (written < 0) {
- if (errno == EINTR)
- continue;
- g_critical("Writing to temporary file failed: %s",
- g_strerror(errno));
- return EX_IOERR;
- }
- p += written;
- ret -= written;
- } while (ret);
- }
-
- return 0;
-}
-
-static int
-save_maildir(int fdin, const char *dir, int auto_create, char **path)
-{
- int fdout, ret;
- struct maildir_tmpcreate_info info;
-
- maildir_tmpcreate_init(&info);
- info.openmode = 0666;
- info.maildir = dir;
- info.doordie = 1;
-
- while ((fdout = maildir_tmpcreate_fd(&info)) < 0)
- {
- if (errno == ENOENT && auto_create && maildir_mkdir(dir) == 0)
- {
- auto_create = 0;
- continue;
- }
-
- g_critical("Failed to create temporary file `%s': %s",
- info.tmpname, g_strerror(errno));
- return EX_TEMPFAIL;
- }
-
- g_debug("Reading from standard input and writing to `%s'", info.tmpname);
-#ifdef HAVE_SPLICE
- ret = g_getenv("NOTMUCH_DELIVER_NO_SPLICE")
- ? save_readwrite(fdin, fdout)
- : save_splice(fdin, fdout);
-#else
- ret = save_readwrite(fdin, fdout);
-#endif /* HAVE_SPLICE */
- if (ret)
- goto fail;
-
- close(fdout);
- g_debug("Moving `%s' to `%s'", info.tmpname, info.newname);
- if (maildir_movetmpnew(info.tmpname, info.newname)) {
- g_critical("Moving `%s' to `%s' failed: %s",
- info.tmpname, info.newname, g_strerror(errno));
- unlink(info.tmpname);
- return EX_IOERR;
- }
-
- if (path)
- *path = g_strdup(info.newname);
-
- maildir_tmpcreate_free(&info);
-
- return 0;
-
-fail:
- g_debug("Unlinking `%s'", info.tmpname);
- unlink(info.tmpname);
- return EX_IOERR;
-}
-
-static int
-add_tags(notmuch_message_t *message, char **tags)
-{
- unsigned i;
- notmuch_status_t ret;
-
- if (!tags)
- return 0;
-
- for (i = 0; tags[i]; i++) {
- ret = notmuch_message_add_tag(message, tags[i]);
- if (ret != NOTMUCH_STATUS_SUCCESS)
- g_warning("Failed to add tag `%s': %s",
- tags[i], notmuch_status_to_string(ret));
- }
-
- return i;
-}
-
-static int
-rm_tags(notmuch_message_t *message, char **tags)
-{
- unsigned i;
- notmuch_status_t ret;
-
- if (!tags)
- return 0;
-
- for (i = 0; tags[i]; i++) {
- ret = notmuch_message_remove_tag(message, tags[i]);
- if (ret != NOTMUCH_STATUS_SUCCESS)
- g_warning("Failed to remove tag `%s': %s",
- tags[i], notmuch_status_to_string(ret));
- }
-
- return i;
-}
-
-static int
-save_database(notmuch_database_t *db, const char *path, char **default_tags)
-{
- notmuch_status_t ret;
- notmuch_message_t *message;
-
- g_debug("Adding `%s' to notmuch database", path);
- ret = notmuch_database_add_message(db, path, &message);
- switch (ret) {
- case NOTMUCH_STATUS_SUCCESS:
- break;
- case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
- g_debug("Message is a duplicate, not adding tags");
- return 0;
- default:
- g_warning("Failed to add `%s' to notmuch database: %s",
- path, notmuch_status_to_string(ret));
- return EX_SOFTWARE;
- }
-
- g_debug("Message isn't a duplicate, adding tags");
- add_tags(message, default_tags);
- add_tags(message, opt_tags);
- rm_tags(message, opt_rtags);
-
- return 0;
-}
-
-int
-main(int argc, char **argv)
-{
- int ret;
- gchar *conf_path, *db_path, *folder, *maildir, *mail;
- gchar **conf_tags;
- GOptionContext *ctx;
- GError *error = NULL;
- notmuch_database_t *db;
- notmuch_status_t status;
-
- ctx = g_option_context_new("[FOLDER]");
- g_option_context_add_main_entries(ctx, options, PACKAGE);
- g_option_context_set_summary(ctx, PACKAGE"-"VERSION GITHEAD" - notmuch delivery tool");
- g_option_context_set_description(ctx,
- "\nConfiguration:\n"
- " "PACKAGE" uses notmuch's configuration file to determine database path and\n"
- " initial tags to add to new messages. You may set NOTMUCH_CONFIG environment\n"
- " variable to specify an alternative configuration file.\n"
- "\nEnvironment:\n"
- " NOTMUCH_CONFIG: Path to notmuch configuration file\n"
- " NOTMUCH_DELIVER_NO_SPLICE: Don't use splice() even if it's available\n"
- "\nExit codes:\n"
- " 0 => Successful run\n"
- " 64 => Usage error\n"
- " 70 => Failed to open the database\n"
- " (or to add to the database if --fatal-add is specified)\n"
- " 71 => Input output errors\n"
- " (failed to read from standard input)\n"
- " (failed to write to temporary file)\n"
- " 76 => Failed to open/create maildir\n"
- " 78 => Configuration error (wrt .notmuch-config)\n");
-
- g_log_set_default_handler(log_handler, NULL);
-
- if (!g_option_context_parse(ctx, &argc, &argv, &error)) {
- g_critical("Option parsing failed: %s", error->message);
- g_option_context_free(ctx);
- g_error_free(error);
- return EX_USAGE;
- }
- g_option_context_free(ctx);
-
- if (opt_version) {
- about();
- return 0;
- }
-
- if (g_getenv("NOTMUCH_CONFIG"))
- conf_path = g_strdup(g_getenv("NOTMUCH_CONFIG"));
- else if (g_getenv("HOME"))
- conf_path = g_build_filename(g_getenv("HOME"), ".notmuch-config", NULL);
- else {
- g_critical("Neither NOTMUCH_CONFIG nor HOME set");
- return EX_USAGE;
- }
-
- db_path = NULL;
- conf_tags = NULL;
- g_debug("Parsing configuration from `%s'", conf_path);
- if (!load_keyfile(conf_path, &db_path, &conf_tags)) {
- g_free(conf_path);
- return EX_CONFIG;
- }
- g_free(conf_path);
-
- if ((argc - 1) > 1) {
- g_critical("Won't deliver to %d folders", argc - 1);
- return EX_USAGE;
- }
-
- if (argc > 1) {
- folder = g_strdup_printf("%s%s", opt_folder ? "." : "", argv[1]);
- maildir = g_build_filename(db_path, folder, NULL);
- g_free(folder);
- }
- else
- maildir = g_strdup(db_path);
-
- g_debug("Opening notmuch database `%s'", db_path);
- status = notmuch_database_open(db_path, NOTMUCH_DATABASE_MODE_READ_WRITE,
- &db);
- if (status) {
- g_critical("Failed to open database `%s': %s",
- db_path, notmuch_status_to_string(status));
- g_free(maildir);
- return EX_SOFTWARE;
- }
- g_free(db_path);
- if (db == NULL)
- return EX_SOFTWARE;
- if (notmuch_database_needs_upgrade(db)) {
- g_message("Upgrading database");
- notmuch_database_upgrade(db, NULL, NULL);
- }
-
- g_debug("Opening maildir `%s'", maildir);
- if ((ret = save_maildir(STDIN_FILENO, maildir, opt_create, &mail)) != 0) {
- g_free(maildir);
- return ret;
- }
- g_free(maildir);
-
- if ((ret = save_database(db, mail, conf_tags)) != 0 && opt_fatal) {
- g_warning("Unlinking `%s'", mail);
- unlink(mail);
- return ret;
- }
- g_strfreev(conf_tags);
- g_strfreev(opt_tags);
- g_strfreev(opt_rtags);
- g_free(mail);
-
- notmuch_database_destroy(db);
-
- return 0;
-}