diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | README-hacking | 12 | ||||
-rw-r--r-- | bootstrap.conf | 1 | ||||
-rwxr-xr-x | build/bootstrap | 246 | ||||
-rw-r--r-- | build/gnulib.modules | 8 | ||||
-rw-r--r-- | lib/.cvsignore | 41 | ||||
-rw-r--r-- | lib/Makefile.am | 5 | ||||
-rw-r--r-- | m4/.cvsignore | 16 | ||||
-rw-r--r-- | po/.cvsignore | 1 | ||||
-rw-r--r-- | src/authmode.c | 75 | ||||
-rw-r--r-- | src/env.opt | 4 | ||||
-rw-r--r-- | src/headers.h | 40 | ||||
-rw-r--r-- | src/tls.c | 1 | ||||
-rw-r--r-- | src/transmode.c | 138 |
14 files changed, 304 insertions, 304 deletions
@@ -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); @@ -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); |