mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 10:28:09 +01:00
contrib: remove notmuch deliver
contrib/notmuch-deliver is presumed obsoleted by notmuch-insert.
This commit is contained in:
parent
5ddaf59915
commit
9060a1f617
36 changed files with 9 additions and 2632 deletions
9
NEWS
9
NEWS
|
@ -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)
|
||||
=========================
|
||||
|
||||
|
|
42
contrib/notmuch-deliver/.gitignore
vendored
42
contrib/notmuch-deliver/.gitignore
vendored
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
Ali Polatel <alip@exherbo.org> <alip@penguen.ev>
|
|
@ -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
|
|
@ -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 : -->
|
|
@ -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"
|
|
@ -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 }}}
|
|
@ -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
|
|
@ -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)
|
|
@ -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)
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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)
|
|
@ -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)
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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)
|
|
@ -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
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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));
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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)
|
|
@ -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;
|
||||
}
|
Loading…
Reference in a new issue