aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--README-hacking12
-rw-r--r--bootstrap.conf1
-rwxr-xr-xbuild/bootstrap246
-rw-r--r--build/gnulib.modules8
-rw-r--r--lib/.cvsignore41
-rw-r--r--lib/Makefile.am5
-rw-r--r--m4/.cvsignore16
-rw-r--r--po/.cvsignore1
-rw-r--r--src/authmode.c75
-rw-r--r--src/env.opt4
-rw-r--r--src/headers.h40
-rw-r--r--src/tls.c1
-rw-r--r--src/transmode.c138
14 files changed, 304 insertions, 304 deletions
diff --git a/ChangeLog b/ChangeLog
index d2a27ac..f1031b2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2008-07-03 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Fix loop-detection code, add some minor improvements.
+
+ * README-hacking: Update.
+ * bootstrap.conf: Add sysexits.
+ * build/bootstrap: Synch with gnulib repository.
+ * build/gnulib.modules: Remove.
+ * lib/.cvsignore, m4/.cvsignore, po/.cvsignore: Update.
+ * lib/Makefile.am: Remove unnecessary initializations.
+ * src/authmode.c (anubis_authenticate_mode): Remove a block of
+ code duplicated in transmode.c and replace it with a call to
+ session_prologue.
+ * src/transmode.c (anubis_transparent_mode): Likewise.
+ (string_to_ipaddr, session_prologue): New functions.
+ * src/env.opt: Fix Emacs mode marker.
+ * src/headers.h: Include sysexits.h unconditionally.
+ (session_prologue): New prototype.
+ * src/tls.c (cipher_info): Add missing newline.
+
2007-11-04 Wojciech Polak <polak@gnu.org>
======================
diff --git a/README-hacking b/README-hacking
index 5b86625..7f4710e 100644
--- a/README-hacking
+++ b/README-hacking
@@ -29,9 +29,7 @@ which are extracted from other source packages:
2. Run
- ./build/bootstrap GNULIB-DIR
-
-where GNULIB-DIR is the directory where Gnulib sources reside.
+ ./build/bootstrap
Once done, proceed as described in the file README (section
INSTALLATION).
@@ -43,17 +41,19 @@ avoiding downloading the same files again. If so, create in GNU anubis
root directory the file named `.bootstrap' with the following
contents:
- $HOME/gnulib --skip-po
+ --gnulib-srcdir=$HOME/gnulib
Replace `$HOME/gnulib' with the actual directory where the Gnulib
-sources reside.
+sources reside. Another option that might be useful in `.bootstrap'
+is `--skip-po', which tells bootstrap not to download localization
+files.
For more information about `bootstrap', run `bootstrap --help'.
* Copyright information
- Copyright (C) 2007 The Anubis Team.
+ Copyright (C) 2007, 2008 The Anubis Team.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
diff --git a/bootstrap.conf b/bootstrap.conf
index 25bb922..b113971 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -11,6 +11,7 @@ gnulib_modules="\
getopt\
getpass\
setenv\
+ sysexits\
xalloc"
build_aux=build
diff --git a/build/bootstrap b/build/bootstrap
index 223e820..9a85762 100755
--- a/build/bootstrap
+++ b/build/bootstrap
@@ -2,12 +2,12 @@
# Bootstrap this package from checked-out sources.
-# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2003-2008 Free Software Foundation, Inc.
-# This program is free software; you can redistribute it and/or modify
+# 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 2, or (at your option)
-# any later version.
+# 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
@@ -15,9 +15,7 @@
# 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Written by Paul Eggert.
@@ -25,10 +23,11 @@ nl='
'
# Ensure file names are sorted consistently across platforms.
-# Also, ensure diagnostics are in English, e.g., "wget --help" below.
LC_ALL=C
export LC_ALL
+local_gl_dir=gl
+
# Temporary directory names.
bt='._bootmp'
bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
@@ -49,8 +48,6 @@ Options:
--force Attempt to bootstrap even if the sources seem
not to have been checked out.
--skip-po Do not download po files.
- --cvs-user=USERNAME Set the username to use when checking out
- sources from the gnulib repository.
If the file bootstrap.conf exists in the current working directory, its
contents are read as shell variables to configure the bootstrap.
@@ -70,15 +67,20 @@ gnulib_modules=
# Any gnulib files needed that are not in modules.
gnulib_files=
-# Translation Project URL, for the registry of all projects
-# and for the translation-team master directory.
-TP_URL="http://translationproject.org/latest/"
+# The command to download all .po files for a specified domain into
+# a specified directory. Fill in the first %s is the domain name, and
+# the second with the destination directory. Use rsync's -L and -r
+# options because the latest/%s directory and the .po files within are
+# all symlinks.
+po_download_command_format=\
+"rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
extract_package_name='
/^AC_INIT(/{
- /.*,.*,.*,/{
+ /.*,.*,.*, */{
s///
s/[][]//g
+ s/)$//
p
q
}
@@ -94,6 +96,11 @@ package=`sed -n "$extract_package_name" configure.ac` || exit
gnulib_name=lib$package
build_aux=build-aux
+source_base=lib
+m4_base=m4
+doc_base=doc
+tests_base=tests
+
# Extra files from gnulib, which override files from other sources.
gnulib_extra_files="
$build_aux/install-sh
@@ -119,6 +126,9 @@ XGETTEXT_OPTIONS='\\\
--flag=error:3:c-format --flag=error_at_line:5:c-format\\\
'
+# Package bug report address for gettext files
+MSGID_BUGS_ADDRESS=bug-$package@gnu.org
+
# Files we don't want to import.
excluded_files=
@@ -129,9 +139,21 @@ checkout_only_file=README-hacking
# Whether to use copies instead of symlinks.
copy=false
+# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
+# those files to be generated in directories like lib/, m4/, and po/.
+# Or set it to 'auto' to make this script select which to use based
+# on which version control system (if any) is used in the source directory.
+vc_ignore=auto
+
# Override the default configuration, if necessary.
test -r bootstrap.conf && . ./bootstrap.conf
+if test "$vc_ignore" = auto; then
+ vc_ignore=
+ test -d .git && vc_ignore=.gitignore
+ test -d CVS && vc_ignore="$vc_ignore .cvsignore"
+fi
+
# Translate configuration into internal form.
# Parse options.
@@ -144,8 +166,6 @@ do
exit;;
--gnulib-srcdir=*)
GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
- --cvs-user=*)
- CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
--skip-po)
SKIP_PO=t;;
--force)
@@ -168,6 +188,7 @@ fi
insert_sorted_if_absent() {
file=$1
str=$2
+ test -f $file || touch $file
echo "$str" | sort -u - $file | cmp -s - $file \
|| echo "$str" | sort -u - $file -o $file \
|| exit 1
@@ -189,8 +210,9 @@ fi
# below will malfunction. If creating it, also mark it as ignored.
if test ! -d $build_aux; then
mkdir $build_aux
- for ig in .cvsignore .gitignore; do
- test -f $ig && insert_sorted_if_absent $ig $build_aux
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
+ insert_sorted_if_absent $dot_ig $build_aux
done
fi
@@ -209,23 +231,9 @@ case ${GNULIB_SRCDIR--} in
if [ ! -d gnulib ]; then
echo "$0: getting gnulib files..."
- case ${CVS_AUTH-pserver} in
- pserver)
- CVS_PREFIX=':pserver:anonymous@';;
- ssh)
- CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
- *)
- echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
- exit 1;;
- esac
-
- case $CVS_RSH in
- '') CVS_RSH=ssh; export CVS_RSH;;
- esac
-
trap cleanup_gnulib 1 2 13 15
- cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
+ git clone --depth 2 git://git.sv.gnu.org/gnulib ||
cleanup_gnulib
trap - 1 2 13 15
@@ -238,52 +246,81 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
# Get translations.
-get_translations() {
+download_po_files() {
subdir=$1
domain=$2
+ echo "$0: getting translations into $subdir for $domain..."
+ cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
+ eval "$cmd"
+}
- case $WGET_COMMAND in
- '')
- echo "$0: wget not available; skipping translations";;
- ?*)
- echo "$0: getting translations into $subdir for $domain..." &&
-
- (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'` &&
- $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
- ;;
- esac &&
- ls "$subdir"/*.po 2>/dev/null |
- sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS"
+# Download .po files to $po_dir/.reference and copy only the new
+# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
+update_po_files() {
+ # Directory containing primary .po files.
+ # Overwrite them only when we're sure a .po file is new.
+ po_dir=$1
+ domain=$2
+
+ # Download *.po files into this dir.
+ # Usually contains *.s1 checksum files.
+ ref_po_dir="$po_dir/.reference"
+
+ test -d $ref_po_dir || mkdir $ref_po_dir || return
+ download_po_files $ref_po_dir $domain \
+ && ls "$ref_po_dir"/*.po 2>/dev/null |
+ sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
+
+ langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
+ test "$langs" = '*' && langs=x
+ for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
+ case $po in x) continue;; esac
+ new_po="$ref_po_dir/$po.po"
+ cksum_file="$ref_po_dir/$po.s1"
+ if ! test -f "$cksum_file" ||
+ ! test -f "$po_dir/$po.po" ||
+ ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
+ echo "updated $po_dir/$po.po..."
+ cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
+ fi
+ done
}
case $SKIP_PO in
'')
- case `wget --help` in
- *'--no-cache'*)
- WGET_COMMAND='wget -nv --no-cache';;
- *'--cache=on/off'*)
- WGET_COMMAND='wget -nv --cache=off';;
- *'--non-verbose'*)
- WGET_COMMAND='wget -nv';;
- *)
- WGET_COMMAND='';;
- esac
-
if test -d po; then
- get_translations po $package || exit
+ update_po_files po $package || exit
fi
if test -d runtime-po; then
- get_translations runtime-po $package-runtime || exit
+ update_po_files runtime-po $package-runtime || exit
fi;;
esac
-symlink_to_gnulib()
+symlink_to_dir()
{
- src=$GNULIB_SRCDIR/$1
- dst=${2-$1}
+ src=$1/$2
+ dst=${3-$2}
test -f "$src" && {
+
+ # If the destination directory doesn't exist, create it.
+ # This is required at least for "lib/uniwidth/cjk.h".
+ dst_dir=`dirname "$dst"`
+ if ! test -d "$dst_dir"; then
+ mkdir -p "$dst_dir"
+
+ # If we've just created a directory like lib/uniwidth,
+ # tell version control system(s) it's ignorable.
+ # FIXME: for now, this does only one level
+ parent=`dirname "$dst_dir"`
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
+ ig=$parent/$dot_ig
+ insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
+ done
+ fi
+
if $copy; then
{
test ! -h "$dst" || {
@@ -328,7 +365,9 @@ cp_mark_as_generated()
cp_dst=$2
if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
- symlink_to_gnulib "$cp_dst"
+ symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
+ elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
+ symlink_to_dir $local_gl_dir "$cp_dst"
else
case $cp_dst in
*.[ch]) c1='/* '; c2=' */';;
@@ -337,6 +376,11 @@ cp_mark_as_generated()
*) c1= ; c2= ;;
esac
+ # If the destination directory doesn't exist, create it.
+ # This is required at least for "lib/uniwidth/cjk.h".
+ dst_dir=`dirname "$cp_dst"`
+ test -d "$dst_dir" || mkdir -p "$dst_dir"
+
if test -z "$c1"; then
cmp -s "$cp_src" "$cp_dst" || {
echo "$0: cp -f $cp_src $cp_dst" &&
@@ -370,7 +414,9 @@ version_controlled_file() {
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
grep '^/[^/]*/[0-9]' > /dev/null && found=yes
elif test -d .git; then
- git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
+ git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
+ elif test -d .svn; then
+ svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
else
echo "$0: no version control for $dir/$file?" >&2
fi
@@ -381,7 +427,11 @@ slurp() {
for dir in . `(cd $1 && find * -type d -print)`; do
copied=
sep=
- for file in `ls $1/$dir`; do
+ for file in `ls -a $1/$dir`; do
+ case $file in
+ .|..) continue;;
+ .*) continue;; # FIXME: should all file names starting with "." be ignored?
+ esac
test -d $1/$dir/$file && continue
for excluded_file in $excluded_files; do
test "$dir/$file" = "$excluded_file" && continue 2
@@ -416,14 +466,21 @@ slurp() {
fi || exit
done
- for dot_ig in .cvsignore .gitignore; do
+ for dot_ig in x $vc_ignore; do
+ test $dot_ig = x && continue
ig=$dir/$dot_ig
- if test -n "$copied" && test -f $ig; then
+ if test -n "$copied"; then
insert_sorted_if_absent $ig "$copied"
- # If an ignored file name ends with _.h, then also add
+ # If an ignored file name ends with .in.h, then also add
# the name with just ".h". Many gnulib headers are generated,
- # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
- f=`echo "$copied"|sed 's/_\.h$/.h/'`
+ # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
+ # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
+ f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
+ insert_sorted_if_absent $ig "$f"
+
+ # For files like sys_stat.in.h and sys_time.in.h, record as
+ # ignorable the directory we might eventually create: sys/.
+ f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
insert_sorted_if_absent $ig "$f"
fi
done
@@ -441,20 +498,20 @@ gnulib_tool_options="\
--import\
--no-changelog\
--aux-dir $bt/$build_aux\
- --doc-base $bt/doc\
+ --doc-base $bt/$doc_base\
--lib $gnulib_name\
- --m4-base $bt/m4/\
- --source-base $bt/lib/\
- --tests-base $bt/tests\
- --local-dir gl\
-$gnulib_tool_option_extras\
+ --m4-base $bt/$m4_base/\
+ --source-base $bt/$source_base/\
+ --tests-base $bt/$tests_base\
+ --local-dir $local_gl_dir\
+ $gnulib_tool_option_extras\
"
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
slurp $bt || exit
for file in $gnulib_files; do
- symlink_to_gnulib $file || exit
+ symlink_to_dir "$GNULIB_SRCDIR" $file || exit
done
@@ -472,6 +529,36 @@ if test $with_gettext = yes; then
rm -fr $bt $bt2 || exit
fi
+# Coreutils is unusual in that it generates some of its test-related
+# Makefile.am files. That must be done before invoking automake.
+mam_template=tests/Makefile.am.in
+if test -f $mam_template; then
+ PERL=perl
+ for tool in cut head join pr sort tac tail test tr uniq wc; do
+ m=tests/$tool/Makefile.am
+ t=${m}t
+ rm -f $m $t
+ sed -n '1,/^##test-files-begin/p' $mam_template > $t
+ echo "x = $tool" >> $t
+ srcdir=tests/$tool
+ $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
+ sed -n '/^##test-files-end/,$p' $mam_template >> $t
+ chmod -w $t
+ mv $t $m
+ done
+fi
+
+# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
+# gnulib-populated directories. Such .m4 files would cause aclocal to fail.
+# The following requires GNU find 4.2.3 or newer. Considering the usual
+# portability constraints of this script, that may seem a very demanding
+# requirement, but it should be ok. Ignore any failure, which is fine,
+# since this is only a convenience to help developers avoid the relatively
+# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
+# between successive runs of this script.
+find "$m4_base" "$source_base" \
+ -depth \( -name '*.m4' -o -name '*.[ch]' \) \
+ -type l -xtype l -delete > /dev/null 2>&1
# Reconfigure, getting other files.
@@ -499,7 +586,7 @@ for file in $gnulib_extra_files; do
build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
*) dst=$file;;
esac
- symlink_to_gnulib $file $dst || exit
+ symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
done
if test $with_gettext = yes; then
@@ -508,8 +595,7 @@ if test $with_gettext = yes; then
rm -f po/Makevars
sed '
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
- /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
- /^COPYRIGHT_HOLDER *=/s/=.*/= '"${COPYRIGHT_HOLDER:-Free Software Foundation, Inc.}"'/
+ /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
diff --git a/build/gnulib.modules b/build/gnulib.modules
deleted file mode 100644
index 426f66f..0000000
--- a/build/gnulib.modules
+++ /dev/null
@@ -1,8 +0,0 @@
-# List of gnulib modules needed for GNU Anubis.
-# A module name per line. Empty lines and comments are ignored.
-
-getline
-getopt
-getpass
-obstack
-#setenv
diff --git a/lib/.cvsignore b/lib/.cvsignore
index 9afb9d8..4f0ac07 100644
--- a/lib/.cvsignore
+++ b/lib/.cvsignore
@@ -1,55 +1,46 @@
-.deps
-.libs
-Makefile
-Makefile.in
alloca.h
-alloca_.h
-dummy.c
+alloca.in.h
+error.c
+error.h
exitfail.c
exitfail.h
fseeko.c
getdelim.c
-getdelim.h
getline.c
-getline.h
getopt.c
getopt.h
+getopt.in.h
getopt1.c
-getopt_.h
getopt_int.h
getpass.c
getpass.h
gettext.h
gnulib.mk
+intprops.h
lseek.c
malloca.c
malloca.h
malloca.valgrind
obstack.c
obstack.h
+realloc.c
setenv.c
-setenv.h
stdbool.h
-stdbool_.h
-stdint.h
-stdint_.h
-stdio.h
-stdio_.h
-stdlib.h
-stdlib_.h
-unistd.h
-unistd_.h
-unsetenv.c
-wchar.h
-wchar_.h
-alloca.in.h
-getopt.in.h
-realloc.c
stdbool.in.h
+stdint.h
stdint.in.h
+stdio-impl.h
+stdio.h
stdio.in.h
+stdlib.h
stdlib.in.h
+strerror.c
+string.h
+string.in.h
+unistd.h
unistd.in.h
+wchar.h
wchar.in.h
+xalloc-die.c
xalloc.h
xmalloc.c
diff --git a/lib/Makefile.am b/lib/Makefile.am
index e314014..8b31ba5 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -18,11 +18,6 @@
## with GNU Anubis. If not, see <http://www.gnu.org/licenses/>.
##
-MOSTLYCLEANFILES=
-noinst_LIBRARIES=
-BUILT_SOURCES=
-EXTRA_DIST=
-AM_CPPFLAGS=
include gnulib.mk
EXTRA_DIST += argcv.c argcv.h lbuf.c lbuf.h
diff --git a/m4/.cvsignore b/m4/.cvsignore
index 7f7e4c7..0942c7d 100644
--- a/m4/.cvsignore
+++ b/m4/.cvsignore
@@ -4,7 +4,11 @@ absolute-header.m4
alloca.m4
codeset.m4
eealloc.m4
+environ.m4
+eoverflow.m4
+error.m4
exitfail.m4
+extensions.m4
fseeko.m4
getdelim.m4
getline.m4
@@ -20,6 +24,7 @@ gnulib-tool.m4
gnulib.m4
iconv.m4
include_next.m4
+inline.m4
intdiv0.m4
intl.m4
intldir.m4
@@ -38,13 +43,16 @@ lock.m4
longdouble.m4
longlong.m4
lseek.m4
+malloc.m4
malloca.m4
nls.m4
obstack.m4
+onceonly.m4
onceonly_2_57.m4
po.m4
printf-posix.m4
progtest.m4
+realloc.m4
setenv.m4
signed.m4
size_max.m4
@@ -54,6 +62,8 @@ stdint_h.m4
stdint_h_gl.m4
stdio_h.m4
stdlib_h.m4
+strerror.m4
+string_h.m4
uintmax_t.m4
uintmax_t_gl.m4
ulonglong.m4
@@ -64,9 +74,5 @@ visibility.m4
wchar.m4
wchar_t.m4
wint_t.m4
-xsize.m4
-extensions.m4
-inline.m4
-malloc.m4
-realloc.m4
xalloc.m4
+xsize.m4
diff --git a/po/.cvsignore b/po/.cvsignore
index cc857fc..f0ca311 100644
--- a/po/.cvsignore
+++ b/po/.cvsignore
@@ -10,6 +10,7 @@ anubis.pot
boldquot.sed
en@boldquot.header
en@quot.header
+insert-header.sed
insert-header.sin
quot.sed
remove-potcdate.sed
diff --git a/src/authmode.c b/src/authmode.c
index 3fa5d95..1af40f0 100644
--- a/src/authmode.c
+++ b/src/authmode.c
@@ -2,7 +2,7 @@
authmode.c
This file is part of GNU Anubis.
- Copyright (C) 2003, 2004, 2005, 2007 The Anubis Team.
+ Copyright (C) 2003, 2004, 2005, 2007, 2008 The Anubis Team.
GNU Anubis is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -589,78 +589,7 @@ anubis_authenticate_mode (struct sockaddr_in *addr)
}
else
{
- if (!(topt & T_LOCAL_MTA) && !session.mta)
- {
- anubis_error (EXIT_FAILURE, 0,
- _("MTA has not been specified. "
- "Set either REMOTE-MTA or LOCAL-MTA."));
- }
-
- /*
- Protection against a loop connection.
- */
-
- if (!(topt & T_LOCAL_MTA))
- {
- unsigned long inaddr;
- struct sockaddr_in ad;
-
- memset (&ad, 0, sizeof (ad));
- inaddr = inet_addr (session.mta);
- if (inaddr != INADDR_NONE)
- memcpy (&ad.sin_addr, &inaddr, sizeof (inaddr));
- else
- {
- struct hostent *hp = 0;
- hp = gethostbyname (session.mta);
- if (hp == 0)
- {
- hostname_error (session.mta);
- return EXIT_FAILURE;
- }
- else
- {
- if (hp->h_length != 4 && hp->h_length != 8)
- {
- anubis_error (EXIT_FAILURE, 0,
- _("Illegal address length received for host %s"),
- session.mta);
- }
- else
- {
- memcpy ((char *) &ad.sin_addr.s_addr,
- hp->h_addr, hp->h_length);
- }
- }
- }
- if (ntohl (ad.sin_addr.s_addr) == INADDR_LOOPBACK
- && session.anubis_port == session.mta_port)
- {
- anubis_error (EXIT_FAILURE, 0,
- _("Loop not allowed. Connection rejected."));
- }
- }
-
- alarm (300);
- if (topt & T_LOCAL_MTA)
- {
- remote_server = make_local_connection (session.execpath,
- session.execargs);
- if (!remote_server)
- {
- service_unavailable (&remote_client);
- return EXIT_FAILURE;
- }
- }
- else
- {
- remote_server = make_remote_connection (session.mta,
- session.mta_port);
- if (!remote_server)
- service_unavailable (&remote_client);
- }
-
- alarm (900);
+ session_prologue ();
smtp_session ();
alarm (0);
}
diff --git a/src/env.opt b/src/env.opt
index 6f08490..33bdbd4 100644
--- a/src/env.opt
+++ b/src/env.opt
@@ -1,8 +1,8 @@
-/* -* c -*-
+/* -*- c -*-
env.c
This file is part of GNU Anubis.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 The Anubis Team.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 The Anubis Team.
GNU Anubis is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/src/headers.h b/src/headers.h
index 0a4f739..e42374f 100644
--- a/src/headers.h
+++ b/src/headers.h
@@ -2,7 +2,7 @@
headers.h
This file is part of GNU Anubis.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 The Anubis Team.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 The Anubis Team.
GNU Anubis is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -60,17 +60,17 @@
#include <stdio.h>
#ifdef STDC_HEADERS
-#include <stdlib.h>
-#include <stdarg.h>
+# include <stdlib.h>
+# include <stdarg.h>
#endif /* STDC_HEADERS */
#ifdef HAVE_STRING_H
-#include <string.h>
+# include <string.h>
#endif /* HAVE_STRING_H */
#ifdef HAVE_UNISTD_H
-#include <unistd.h>
+# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_MEMORY_H
-#include <memory.h>
+# include <memory.h>
#endif /* HAVE_MEMORY_H */
#include <signal.h>
#include <errno.h>
@@ -79,10 +79,10 @@
#include <time.h>
#include <pwd.h>
#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
+# include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
+# include <sys/stat.h>
#endif /* HAVE_SYS_STAT_H */
#include <sys/file.h>
#include <sys/fcntl.h>
@@ -143,28 +143,7 @@
#include <argcv.h>
#include "list.h"
-#ifdef HAVE_SYSEXITS_H
-# include <sysexits.h>
-#else
-# define EX_OK 0 /* successful termination */
-# define EX__BASE 64 /* base value for error messages */
-# define EX_USAGE 64 /* command line usage error */
-# define EX_DATAERR 65 /* data format error */
-# define EX_NOINPUT 66 /* cannot open input */
-# define EX_NOUSER 67 /* addressee unknown */
-# define EX_NOHOST 68 /* host name unknown */
-# define EX_UNAVAILABLE 69 /* service unavailable */
-# define EX_SOFTWARE 70 /* internal software error */
-# define EX_OSERR 71 /* system error (e.g., can't fork) */
-# define EX_OSFILE 72 /* critical OS file missing */
-# define EX_CANTCREAT 73 /* can't create (user) output file */
-# define EX_IOERR 74 /* input/output error */
-# define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */
-# define EX_PROTOCOL 76 /* remote error in protocol */
-# define EX_NOPERM 77 /* permission denied */
-# define EX_CONFIG 78 /* configuration error */
-# define EX__MAX 78 /* maximum listed value */
-#endif
+#include <sysexits.h>
#ifndef INADDR_NONE
# define INADDR_NONE (unsigned long)0xffffffff
@@ -585,6 +564,7 @@ void pgsql_db_init (void);
/* transmode.c */
int anubis_transparent_mode (struct sockaddr_in *addr);
+void session_prologue ();
/* authmode.c */
int anubis_authenticate_mode (struct sockaddr_in *addr);
diff --git a/src/tls.c b/src/tls.c
index 58c7445..42cb66d 100644
--- a/src/tls.c
+++ b/src/tls.c
@@ -361,6 +361,7 @@ cipher_info (gnutls_session session)
ngettext ("- Anonymous DH using prime of %d bit.\n",
"- Anonymous DH using prime of %d bits.\n", bits), bits);
break;
+
case GNUTLS_CRD_CERTIFICATE: /* certificate authentication */
if (kx == GNUTLS_KX_DHE_RSA || kx == GNUTLS_KX_DHE_DSS)
{
diff --git a/src/transmode.c b/src/transmode.c
index ae6633a..5fee8f6 100644
--- a/src/transmode.c
+++ b/src/transmode.c
@@ -2,7 +2,7 @@
transmode.c
This file is part of GNU Anubis.
- Copyright (C) 2003, 2004, 2005, 2007 The Anubis Team.
+ Copyright (C) 2003, 2004, 2005, 2007, 2008 The Anubis Team.
GNU Anubis is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -21,6 +21,72 @@
#include "headers.h"
#include "extern.h"
+static unsigned long
+string_to_ipaddr (const char *str)
+{
+ unsigned long inaddr;
+ struct sockaddr_in ad;
+
+ memset (&ad, 0, sizeof (ad));
+ inaddr = inet_addr (str);
+ if (inaddr != INADDR_NONE)
+ memcpy (&ad.sin_addr, &inaddr, sizeof (inaddr));
+ else
+ {
+ struct hostent *hp = 0;
+ hp = gethostbyname (str);
+ if (hp == 0)
+ hostname_error (str);
+ else
+ {
+ if (hp->h_length != 4 && hp->h_length != 8)
+ {
+ anubis_error (EXIT_FAILURE, 0,
+ _("Illegal address length received for host %s"),
+ str);
+ }
+ else
+ memcpy ((char *) &ad.sin_addr.s_addr, hp->h_addr, hp->h_length);
+ }
+ }
+
+ return inaddr;
+}
+
+void
+session_prologue ()
+{
+ if (!(topt & T_LOCAL_MTA) && !session.mta)
+ anubis_error (EXIT_FAILURE, 0, _("The MTA has not been specified. "
+ "Set the REMOTE-MTA or LOCAL-MTA."));
+
+ if (!(topt & T_LOCAL_MTA)
+ && string_to_ipaddr (session.mta)
+ == string_to_ipaddr (session.anubis)
+ && session.anubis_port == session.mta_port)
+ anubis_error (EXIT_FAILURE, 0, _("remote-mta loops back to Anubis"));
+
+ alarm (300);
+ if (topt & T_LOCAL_MTA)
+ {
+ remote_server = make_local_connection (session.execpath,
+ session.execargs);
+ if (!remote_server)
+ {
+ service_unavailable (&remote_client);
+ return EXIT_FAILURE;
+ }
+ }
+ else
+ {
+ remote_server = make_remote_connection (session.mta, session.mta_port);
+ if (!remote_server)
+ service_unavailable (&remote_client);
+ }
+
+ alarm (900);
+}
+
int
anubis_transparent_mode (struct sockaddr_in *addr)
{
@@ -55,76 +121,8 @@ anubis_transparent_mode (struct sockaddr_in *addr)
set_unprivileged_user ();
auth_tunnel ();
-
- if (!(topt & T_LOCAL_MTA) && !session.mta)
- {
- anubis_error (EXIT_FAILURE, 0, _("The MTA has not been specified. "
- "Set the REMOTE-MTA or LOCAL-MTA."));
- }
-
- /*
- Protection against a loop connection.
- */
-
- if (!(topt & T_LOCAL_MTA))
- {
- unsigned long inaddr;
- struct sockaddr_in ad;
-
- memset (&ad, 0, sizeof (ad));
- inaddr = inet_addr (session.mta);
- if (inaddr != INADDR_NONE)
- memcpy (&ad.sin_addr, &inaddr, sizeof (inaddr));
- else
- {
- struct hostent *hp = 0;
- hp = gethostbyname (session.mta);
- if (hp == 0)
- {
- hostname_error (session.mta);
- }
- else
- {
- if (hp->h_length != 4 && hp->h_length != 8)
- {
- anubis_error (EXIT_FAILURE, 0,
- _("Illegal address length received for host %s"),
- session.mta);
- }
- else
- {
- memcpy ((char *) &ad.sin_addr.s_addr,
- hp->h_addr, hp->h_length);
- }
- }
- }
- if (ntohl (ad.sin_addr.s_addr) == INADDR_LOOPBACK
- && session.anubis_port == session.mta_port)
- {
- anubis_error (EXIT_FAILURE, 0,
- _("Loop not allowed. Connection rejected."));
- }
- }
- alarm (300);
- if (topt & T_LOCAL_MTA)
- {
- remote_server = make_local_connection (session.execpath,
- session.execargs);
- if (!remote_server)
- {
- service_unavailable (&remote_client);
- return EXIT_FAILURE;
- }
- }
- else
- {
- remote_server = make_remote_connection (session.mta, session.mta_port);
- if (!remote_server)
- service_unavailable (&remote_client);
- }
-
- alarm (900);
+ session_prologue ();
smtp_session_transparent ();
alarm (0);

Ret