contrib: remove notmuch deliver

contrib/notmuch-deliver is presumed obsoleted by notmuch-insert.
This commit is contained in:
David Bremner 2015-01-14 15:25:30 +01:00
parent 5ddaf59915
commit 9060a1f617
36 changed files with 9 additions and 2632 deletions

9
NEWS
View file

@ -1,3 +1,12 @@
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) Notmuch 0.19 (2014-11-14)
========================= =========================

View file

@ -1,42 +0,0 @@
# 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

View file

@ -1 +0,0 @@
Ali Polatel <alip@exherbo.org> <alip@penguen.ev>

View file

@ -1,8 +0,0 @@
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

View file

@ -1,43 +0,0 @@
## 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 : -->

View file

@ -1,20 +0,0 @@
#!/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"

View file

@ -1,156 +0,0 @@
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 }}}

View file

@ -1,74 +0,0 @@
# ===========================================================================
# 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

View file

@ -1,201 +0,0 @@
#
# 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)

View file

@ -1,165 +0,0 @@
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)

View file

@ -1,240 +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"
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);
}

View file

@ -1,51 +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
/* 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

View file

@ -1,201 +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
/*
**
** 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

View file

@ -1,77 +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"
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);
}

View file

@ -1,140 +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"
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);
}

View file

@ -1,26 +0,0 @@
#
# 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

View file

@ -1,13 +0,0 @@
/*
** 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)

View file

@ -1,14 +0,0 @@
/*
** 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)

View file

@ -1,110 +0,0 @@
/*
** 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);
}
}

View file

@ -1,46 +0,0 @@
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)

View file

@ -1,101 +0,0 @@
#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

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,28 +0,0 @@
/*
** 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));
}

View file

@ -1,28 +0,0 @@
/*
** 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));
}

View file

@ -1,28 +0,0 @@
/*
** 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));
}

View file

@ -1,28 +0,0 @@
/*
** 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));
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,64 +0,0 @@
/*
** 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));
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,61 +0,0 @@
/*
** 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);
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,25 +0,0 @@
/*
** 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));
}

View file

@ -1,22 +0,0 @@
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)

View file

@ -1,469 +0,0 @@
/* 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;
}