mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +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)
|
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