quickml-0.7/0000777000076400007640000000000010061420670006576 5quickml-0.7/README0000644000076400007640000000036610061026162007375 What's quickml: quickml server is a very-easy-to-user mailing list server. Installation: % make # make install Usage: # quickml-ctl start # quickml-ctl stop See quickml.*.html for details. -- Satoru Takabayashi satoru@namazu.org quickml-0.7/acinclude.m40000644000076400007640000000112310061026162010676 AC_DEFUN(AM_PATH_RUBYDIR, [dnl # dnl # Check Ruby directory dnl # AC_SUBST(rubydir) AC_ARG_WITH(rubydir, [ --with-rubydir=DIR Ruby library files go to DIR [[guessed]]], [case "${withval}" in yes) rubydir= ;; no) AC_MSG_ERROR(rubydir is not available) ;; *) rubydir=${withval} ;; esac], rubydir=) AC_MSG_CHECKING([where .rb files should go]) if test "x$rubydir" = x; then changequote(<<, >>) rubydir=`ruby -rrbconfig -e 'puts Config::CONFIG["sitelibdir"]'` changequote([, ]) fi AC_MSG_RESULT($rubydir) AC_SUBST(rubydir)]) quickml-0.7/configure.ac0000644000076400007640000000172510061026162011003 AC_INIT(quickml.in) AM_INIT_AUTOMAKE(quickml, 0.7) AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PATH_PROG(RUBY, ruby, no) if test "$RUBY" = "no"; then AC_MSG_ERROR(ruby not found) fi AC_ARG_WITH( user, [ --with-user=USER quickml runs as USER [[root]]], [USER=${withval}], [USER='root'] ) AC_SUBST(USER) AC_ARG_WITH( group, [ --with-group=GROUP quickml runs as GROUP [[root]]], [GROUP=${withval}], [GROUP='root'] ) AC_SUBST(GROUP) AC_ARG_WITH( pidfile, [ --with-pidfile=FILE PID is stored in FILE [[/var/run/quickml.pid]]], [PIDFILE=${withval}], [PIDFILE='/var/run/quickml.pid'] ) AC_SUBST(PIDFILE) AC_ARG_WITH( logfile, [ --with-logfile=FILE Log is recorded in FILE [[/var/log/quickml.log]]], [LOGFILE=${withval}], [LOGFILE='/var/log/quickml.log'] ) AC_SUBST(LOGFILE) AM_PATH_RUBYDIR AM_MAINTAINER_MODE AC_OUTPUT([ Makefile lib/Makefile lib/quickml/Makefile]) quickml-0.7/aclocal.m40000644000076400007640000005706310061040655010366 # generated automatically by aclocal 1.8.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # -*- Autoconf -*- # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # Generated from amversion.in; do not edit by hand. # 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. # 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.8.3])]) # AM_AUX_DIR_EXPAND # Copyright (C) 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_MISSING_PROG(AMTAR, tar) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright (C) 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # -*- Autoconf -*- # Copyright (C) 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # Keeping the `.' argument allows $(mkdir_p) to be used without # argument. Indeed, we sometimes output rules like # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more # expensive solution, as it forces Make to start a sub-shell.) mkdir_p='mkdir -p -- .' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # Copyright (C) 2001, 2003 Free Software Foundation, 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4_include([acinclude.m4]) quickml-0.7/Makefile.am0000644000076400007640000000476410061026162010557 SUBDIRS = lib . RD = quickml.en.rd ml-usage.en.rd quickml.ja.rd with-mta.ja.rd MESSAGES = messages.ja EXTRA_DIST = $(RD) $(MESSAGES) quickml.in quickml-ctl.in \ quickmlrc.sample.in quickml-analog.in CLEANFILES = quickml quickml-ctl quickmlrc.sample quickml-analog bin_SCRIPTS = quickml-analog sbin_SCRIPTS = quickml quickml-ctl quickmlstatedir = $(localstatedir)/quickml etcdir = $(sysconfdir) etc_DATA = quickmlrc.sample quickml: quickml.in for i in $(MESSAGES); do\ $(RUBY) lib/quickml/gettext.rb $$i quickml.in lib/quickml/*.rb;\ done rm -f quickml sed -e 's!%RUBY%!$(RUBY)!g' \ -e 's!%SYSCONFDIR%!$(sysconfdir)!g' quickml.in >quickml chmod +x quickml chmod -w quickml quickml-analog: quickml-analog.in Makefile rm -f quickml-analog sed -e 's!%RUBY%!$(RUBY)!g' \ quickml-analog.in > quickml-analog chmod +x quickml-analog chmod -w quickml-analog quickml-ctl: quickml-ctl.in Makefile rm -f quickml-ctl sed -e 's!%SBINDIR%!$(sbindir)!g' \ -e 's!%PIDFILE%!$(PIDFILE)!g' \ quickml-ctl.in > quickml-ctl chmod +x quickml-ctl chmod -w quickml-analog quickmlrc.sample: quickmlrc.sample.in Makefile rm -f quickmlrc.sample sed -e 's!%LOCALSTATEDIR%!$(quickmlstatedir)!g' \ -e 's!%DATADIR%!$(datadir)!g' \ -e 's!%USER%!$(USER)!g' \ -e 's!%GROUP%!$(GROUP)!g' \ -e 's!%PIDFILE%!$(PIDFILE)!g' \ -e 's!%LOGFILE%!$(LOGFILE)!g' \ quickmlrc.sample.in > quickmlrc.sample install-data-local: mkdir -p $(quickmlstatedir) chown -R $(USER) $(quickmlstatedir) chgrp -R $(GROUP) $(quickmlstatedir) chmod 750 $(quickmlstatedir) HTML = quickml.en.html quickml.ja.html ml-usage.en.html with-mta.ja.html RDOPT = --require=rd/rd2html-lib.rb\ --with-css=http://namazu.org/~satoru/satoru.css quickml.ja.html: quickml.ja.rd rd2 $(RDOPT) \ --html-title="quickmlサーバ: 超お手軽なメーリングリストシステム"\ quickml.ja.rd | reformat-rd2html > quickml.ja.html html-noarchive quickml.ja.html quickml.en.html: quickml.en.rd rd2 $(RDOPT) \ --html-title="quickml server: An easy-to-use mailing list system"\ quickml.en.rd | reformat-rd2html > quickml.en.html html-noarchive quickml.en.html with-mta.ja.html: with-mta.ja.rd rd2 $(RDOPT) \ --html-title="quickmlサーバ: 他のMTAと共存させる方法"\ with-mta.ja.rd | reformat-rd2html > with-mta.ja.html html-noarchive with-mta.ja.html ml-usage.en.html: ml-usage.en.rd rd2 $(RDOPT) \ --html-title="quickml server: How to Use Mailing List Service"\ ml-usage.en.rd | reformat-rd2html > ml-usage.en.html html-noarchive ml-usage.en.html html: $(HTML) quickml-0.7/Makefile.in0000644000076400007640000005323310061040660010562 # Makefile.in generated by automake 1.8.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(mkdir_p) CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(etcdir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) $(sbin_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive etcDATA_INSTALL = $(INSTALL_DATA) DATA = $(etc_DATA) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ GROUP = @GROUP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LOGFILE = @LOGFILE@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PIDFILE = @PIDFILE@ RUBY = @RUBY@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USER = @USER@ VERSION = @VERSION@ ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ rubydir = @rubydir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = lib . RD = quickml.en.rd ml-usage.en.rd quickml.ja.rd with-mta.ja.rd MESSAGES = messages.ja EXTRA_DIST = $(RD) $(MESSAGES) quickml.in quickml-ctl.in \ quickmlrc.sample.in quickml-analog.in CLEANFILES = quickml quickml-ctl quickmlrc.sample quickml-analog bin_SCRIPTS = quickml-analog sbin_SCRIPTS = quickml quickml-ctl quickmlstatedir = $(localstatedir)/quickml etcdir = $(sysconfdir) etc_DATA = quickmlrc.sample HTML = quickml.en.html quickml.ja.html ml-usage.en.html with-mta.ja.html RDOPT = --require=rd/rd2html-lib.rb\ --with-css=http://namazu.org/~satoru/satoru.css all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done install-sbinSCRIPTS: $(sbin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" @list='$(sbin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \ else :; fi; \ done uninstall-sbinSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(sbin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ done uninstall-info-am: install-etcDATA: $(etc_DATA) @$(NORMAL_INSTALL) test -z "$(etcdir)" || $(mkdir_p) "$(DESTDIR)$(etcdir)" @list='$(etc_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(etcDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(etcdir)/$$f'"; \ $(etcDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(etcdir)/$$f"; \ done uninstall-etcDATA: @$(NORMAL_UNINSTALL) @list='$(etc_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f '$(DESTDIR)$(etcdir)/$$f'"; \ rm -f "$(DESTDIR)$(etcdir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="../$(top_distdir)" \ distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(etcdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-data-local install-etcDATA install-exec-am: install-binSCRIPTS install-sbinSCRIPTS install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-etcDATA uninstall-info-am \ uninstall-sbinSCRIPTS uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-recursive distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-data-local install-etcDATA \ install-exec install-exec-am install-info install-info-am \ install-man install-sbinSCRIPTS install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-etcDATA uninstall-info-am \ uninstall-sbinSCRIPTS quickml: quickml.in for i in $(MESSAGES); do\ $(RUBY) lib/quickml/gettext.rb $$i quickml.in lib/quickml/*.rb;\ done rm -f quickml sed -e 's!%RUBY%!$(RUBY)!g' \ -e 's!%SYSCONFDIR%!$(sysconfdir)!g' quickml.in >quickml chmod +x quickml chmod -w quickml quickml-analog: quickml-analog.in Makefile rm -f quickml-analog sed -e 's!%RUBY%!$(RUBY)!g' \ quickml-analog.in > quickml-analog chmod +x quickml-analog chmod -w quickml-analog quickml-ctl: quickml-ctl.in Makefile rm -f quickml-ctl sed -e 's!%SBINDIR%!$(sbindir)!g' \ -e 's!%PIDFILE%!$(PIDFILE)!g' \ quickml-ctl.in > quickml-ctl chmod +x quickml-ctl chmod -w quickml-analog quickmlrc.sample: quickmlrc.sample.in Makefile rm -f quickmlrc.sample sed -e 's!%LOCALSTATEDIR%!$(quickmlstatedir)!g' \ -e 's!%DATADIR%!$(datadir)!g' \ -e 's!%USER%!$(USER)!g' \ -e 's!%GROUP%!$(GROUP)!g' \ -e 's!%PIDFILE%!$(PIDFILE)!g' \ -e 's!%LOGFILE%!$(LOGFILE)!g' \ quickmlrc.sample.in > quickmlrc.sample install-data-local: mkdir -p $(quickmlstatedir) chown -R $(USER) $(quickmlstatedir) chgrp -R $(GROUP) $(quickmlstatedir) chmod 750 $(quickmlstatedir) quickml.ja.html: quickml.ja.rd rd2 $(RDOPT) \ --html-title="quickmlサーバ: 超お手軽なメーリングリストシステム"\ quickml.ja.rd | reformat-rd2html > quickml.ja.html html-noarchive quickml.ja.html quickml.en.html: quickml.en.rd rd2 $(RDOPT) \ --html-title="quickml server: An easy-to-use mailing list system"\ quickml.en.rd | reformat-rd2html > quickml.en.html html-noarchive quickml.en.html with-mta.ja.html: with-mta.ja.rd rd2 $(RDOPT) \ --html-title="quickmlサーバ: 他のMTAと共存させる方法"\ with-mta.ja.rd | reformat-rd2html > with-mta.ja.html html-noarchive with-mta.ja.html ml-usage.en.html: ml-usage.en.rd rd2 $(RDOPT) \ --html-title="quickml server: How to Use Mailing List Service"\ ml-usage.en.rd | reformat-rd2html > ml-usage.en.html html-noarchive ml-usage.en.html html: $(HTML) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: quickml-0.7/configure0000755000076400007640000025456210061040661010435 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="quickml.in" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot LN_S RUBY USER GROUP PIDFILE LOGFILE rubydir MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-user=USER quickml runs as USER [root] --with-group=GROUP quickml runs as GROUP [root] --with-pidfile=FILE PID is stored in FILE [/var/run/quickml.pid] --with-logfile=FILE Log is recorded in FILE [/var/log/quickml.log] --with-rubydir=DIR Ruby library files go to DIR [guessed] _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.8" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # Keeping the `.' argument allows $(mkdir_p) to be used without # argument. Indeed, we sometimes output rules like # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more # expensive solution, as it forces Make to start a sub-shell.) mkdir_p='mkdir -p -- .' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=quickml VERSION=0.7 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} AMTAR=${AMTAR-"${am_missing_run}tar"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "ruby", so it can be a program name with args. set dummy ruby; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_RUBY+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $RUBY in [\\/]* | ?:[\\/]*) ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_RUBY" && ac_cv_path_RUBY="no" ;; esac fi RUBY=$ac_cv_path_RUBY if test -n "$RUBY"; then echo "$as_me:$LINENO: result: $RUBY" >&5 echo "${ECHO_T}$RUBY" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "$RUBY" = "no"; then { { echo "$as_me:$LINENO: error: ruby not found" >&5 echo "$as_me: error: ruby not found" >&2;} { (exit 1); exit 1; }; } fi # Check whether --with-user or --without-user was given. if test "${with_user+set}" = set; then withval="$with_user" USER=${withval} else USER='root' fi; # Check whether --with-group or --without-group was given. if test "${with_group+set}" = set; then withval="$with_group" GROUP=${withval} else GROUP='root' fi; # Check whether --with-pidfile or --without-pidfile was given. if test "${with_pidfile+set}" = set; then withval="$with_pidfile" PIDFILE=${withval} else PIDFILE='/var/run/quickml.pid' fi; # Check whether --with-logfile or --without-logfile was given. if test "${with_logfile+set}" = set; then withval="$with_logfile" LOGFILE=${withval} else LOGFILE='/var/log/quickml.log' fi; # Check whether --with-rubydir or --without-rubydir was given. if test "${with_rubydir+set}" = set; then withval="$with_rubydir" case "${withval}" in yes) rubydir= ;; no) { { echo "$as_me:$LINENO: error: rubydir is not available" >&5 echo "$as_me: error: rubydir is not available" >&2;} { (exit 1); exit 1; }; } ;; *) rubydir=${withval} ;; esac else rubydir= fi; echo "$as_me:$LINENO: checking where .rb files should go" >&5 echo $ECHO_N "checking where .rb files should go... $ECHO_C" >&6 if test "x$rubydir" = x; then rubydir=`ruby -rrbconfig -e 'puts Config::CONFIG["sitelibdir"]'` fi echo "$as_me:$LINENO: result: $rubydir" >&5 echo "${ECHO_T}$rubydir" >&6 echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_files="$ac_config_files Makefile lib/Makefile lib/quickml/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "lib/quickml/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/quickml/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@AMTAR@,$AMTAR,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@LN_S@,$LN_S,;t t s,@RUBY@,$RUBY,;t t s,@USER@,$USER,;t t s,@GROUP@,$GROUP,;t t s,@PIDFILE@,$PIDFILE,;t t s,@LOGFILE@,$LOGFILE,;t t s,@rubydir@,$rubydir,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi quickml-0.7/AUTHORS0000644000076400007640000000000010061026162007546 quickml-0.7/COPYING0000644000076400007640000004311010061026162007542 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. quickml-0.7/ChangeLog0000644000076400007640000013377310061417610010302 2004-06-09 Satoru Takabayashi * quickml: Version 0.7 released. * lib/quickml/core.rb (QuickML::QuickML::plain_text_body?): Add a check for Content-Transfer-Encoding field. Reported by Kazuhiro NISHIYAMA [quickml-server:155] 2004-06-08 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::report_too_many_members): Fixed "undefined local variable or method `address'" error. 2004-05-17 Satoru Takabayashi * Makefile.am (update-web): Removed. (html): New rule. 2004-04-01 Satoru Takabayashi * Makefile.am (install-data-local): Added mkdir -p $(quickmlstatedir). Reported by Tatsuhiko Miyagawa 2004-03-28 Satoru Takabayashi * Makefile.am (quickml): Removed the "check-message" rule and integrated it into "quickml" rule. Applied a patch from Fumitoshi UKAI [quickml-server:149]. 2004-03-27 Satoru Takabayashi * lib/quickml/utils.rb (File::safe_unlink): Removed. 2004-03-22 Satoru Takabayashi * lib/quickml/core.rb: Applied a patch by MACHIDA Hideki [quickml-server:143] to use @config.info_url in the X-ML-Info field. * configure.ac: Applied a patch by MACHIDA Hideki [quickml-server:142] to fix the --with-pidfile and --with-logfile bug. 2004-03-06 Satoru Takabayashi * configure.ac (AM_INIT_AUTOMAKE): Bumped version number to 0.7. 2004-02-11 Satoru Takabayashi * quickml: Version 0.6 released. 2004-02-10 Satoru Takabayashi * acinclude.m4: New file. * configure.ac: New file. * NEWS: NEW file. * AUTHORS: New file. * lib/quickml/Makefile.am: New file. * lib/Makefile.am: New file. * Makefile.am: New file. * autogen.sh: New file. * lib/quickml/utils.rb (File::backup_dir): Removed. (DupFile): Removed. (File::safe_open): Simplified. * lib/quickml/config.rb (QuickML::Config::initialize): Removed a field: @backup_dir. 2004-02-04 Satoru Takabayashi * Makefile (quickml-analog): New rule. * quickml-analog.in: New file. * QuickML: Modify the year of copyright notice in all files. 2004-01-28 Satoru Takabayashi * lib/quickml/gettext.rb (main): Remove the unnecesary GetText:: prefix for avoiding an error occurred with Ruby 1.8.x. Reported by Kenshi Muto 2003-12-22 Satoru Takabayashi * quickml.in (be_daemon): Reopen STDIN/STDOUT/STDERR with /dev/null instead of closing them. 2003-09-12 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): New field: @max_ml_mail_length. * lib/quickml/core.rb (QuickML::QuickML::init_ml_config): Use @config.max_ml_mail_length. 2003-09-09 Satoru Takabayashi * quickml (be_daemon): Moved from QuickML::Server. (touch): Ditto. (be_secure): Ditto. (main): Call be_daemon and be_secure in the method. * lib/quickml/config.rb (QuickML::Config::self): Refined. * lib/quickml/server.rb (QuickML::Server::start): Fix @my_hostname bug. Thanks to Fumitoshi UKAI for the report [quickml-server:120] (QuickML::Server::start): Never call be_daemon and be_secure in the method. * lib/quickml/core.rb (QuickML::QuickML::initialize): Remove attr_reader: confirmation_address. (QuickML::Processor::process_recipient): Fix the space before lparen. Thanks to Fumitoshi UKAI for the report [quickml-server:120] 2003-09-08 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::report_rejection): Change the From: address: @config.postmaster -> ml.address. (QuickML::Processor::report_too_many_members): Ditto. 2003-08-28 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::submit): Do nothing if From: address matches ml.exclude? rule. (QuickML::QuickML::exclude?): Be public. 2003-08-27 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::close): Unlink @ml_config_file. 2003-08-25 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Session::content_type): New method. * lib/quickml/core.rb (QuickML::QuickML::report_too_large_mail): New method. (QuickML::QuickML::submit): Check @max_mail_length. (QuickML::QuickML::content_type): Use @message_charset instead of @charset. (QuickML::Processor::report_unsubscription): Use content_type. (QuickML::Processor::content_type): New method. * lib/quickml/utils.rb (Integer::commify): New method. * lib/quickml/server.rb (QuickML::Session::report_too_large_mail): Fix the Content-Type bug. (QuickML::Session::commify): Removed. * lib/quickml/core.rb (QuickML::Processor::report_too_many_members): Fix the Content-Type bug. (QuickML::QuickML::too_many_members?): Renamed from too_many_users. (QuickML::QuickML::initialize): New reader :max_members. (QuickML::Processor::report_too_many_members): New parameter unadded_addresses. (QuickML::Processor::submit_article): Send an error mail to from_address with unadded_addresses info. (QuickML::Processor::report_too_many_members): Messages refined. * lib/quickml/sweeper.rb (QuickML::Sweeper::sweep): Call QuickML#write_ml_config if ml_config_file doesn't exist. (QuickML::Sweeper::start): Add a vlog message. * lib/quickml/core.rb (QuickML::QuickML::ml_config_exist?): New method. * lib/quickml/mail.rb (QuickML::Mail::read): Use Regexp instead of String to do String#split. * lib/quickml/server.rb (QuickML::Session::receive_mail): Use Regexp instead of String to do String#split. * lib/quickml/config.rb (QuickML::Config::initialize): Use class instead of type. * lib/quickml/utils.rb (File::initialize): Removed. * lib/quickml/config.rb (QuickML::Config::load): Simplified. * lib/quickml/core.rb (QuickML::QuickML::init_ml_config): New method. (QuickML::QuickML::write_ml_config): Ditto. (QuickML::QuickML::initialize): New field: @ml_config_file. (QuickML::QuickML::too_many_users?): Use @max_members. (QuickML::QuickML::report_ml_close_soon): Use @ml_life_time. (QuickML::QuickML::inactive?): Ditto. (QuickML::QuickML::need_alert?): Use @ml_alert_time. (QuickML::QuickML::add_error_member): Use @auto_unsubscribe_count. * quickmlrc.sample: Rearrange the order of parameters. 2003-06-25 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::remove_alertedp_file): New method. (QuickML::QuickML::_submit): Call remove_alertedp_file to fix the bug that removes ML without alert a mail if onece it was alerted. Thanks to OTA Takashi for the report [quickml-users:488]. 2003-05-12 Satoru Takabayashi * lib/quickml/utils.rb (File::self): unlink a backup file too. (File::initialize): Call safe_open. * lib/quickml/core.rb (QuickML::QuickML::generate_footer): Add an new parameter: member_list_p (QuickML::QuickML::report_removed_member): Add a member list to the footer. (QuickML::QuickML::report_ml_close_soon): Ditto. (QuickML::QuickML::alerted): New method. (QuickML::QuickML::need_alert): Use alerted. (QuickML::QuickML::initialize): New field: @alertedp_file. (QuickML::QuickML::report_ml_close_soon): Create @alertedp_file. (QuickML::QuickML::close): Remove @alertedp_file. 2003-05-05 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::unsubscribe_requested): Fixe the regex to support 退会|脱退. [quickml-users:394] (QuickML::QuickML::generate_header): Use obfuscate_address. 2003-04-24 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Server::be_secure): Use Etc::getgrnam instead of Etc::getpwnam. - Thanks to Masayoshi Sekimura for the patch. 2003-04-17 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): New field: confirm_ml_creation. * lib/quickml/core.rb (QuickML::Processor::confirmation_required?): New method. 2003-04-16 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): Add config[:backup_dir] handling. * lib/quickml/logger.rb (QuickML::Logger::reopen): Use File.safe_open. (QuickML::Logger::initialize): Ditto. * lib/quickml/utils.rb (DupFile): New class. (File::self.safe_open): Use DupFile if @backup_dir is set. (File::self.backup_dir=): New method. 2003-04-11 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::acceptable_submission?): newly created ML is not acceptable any longer. (QuickML::QuickML::initialize): New field: @waiting_members_file. (QuickML::QuickML::initialize): New field: @waiting_body_file. (QuickML::QuickML::close): Remove @waiting_file. (QuickML::QuickML::confirmation_waiting?): New method. (QuickML::QuickML::initialize): New field: confirmation_address (QuickML::Processor::validate_confirmation): New method. (QuickML::Processor::to_confirmation_address?): New method. (QuickML::QuickML::validate_confirmation): New method. (QuickML::QuickML::initialize) (QuickML::QuickML::accept_confirmation): New method. (QuickML::QuickML::prepare_confirmation): New method. (QuickML::QuickML::save_charset): Do not save charset file if @messasge_charset is nil. * lib/quickml/mail.rb (QuickML::Mail::initialize): New field: bare 2003-04-07 Satoru Takabayashi * lib/quickml/sweeper.rb (QuickML::Sweeper::sweep): Do not pass @messasge_charset to QuickML.new - To fix the bug reported in [quickml-users:387] 2003-03-22 Satoru Takabayashi * Makefile (ALL): Change the order of check-message to the last. 2003-02-05 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::send_mail): Add an assertion for ensuring optional[:recipient] must be a kind of String. * lib/quickml/core.rb (QuickML::QuickML::report_removed_member): s/:recipient/:recipients/ (QuickML::QuickML::report_ml_close_soon): Ditto. (QuickML::Processor::report_unsubscription): Ditto. 2003-01-18 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::MailSender::send): Fix a type of String#sub! argument. - Thanks to Kazuhiro NISHIYAMA for the suggestion. 2003-01-17 Satoru Takabayashi * lib/quickml/utils.rb (Net::NetPrivate::SMTPCommand): Removed. * lib/quickml/mail.rb (QuickML::Mail::send_mail): Use MailSender instead of Net::SMTP. * lib/quickml/server.rb (QuickML::Session::report_too_large_mail): Change the recipient address: @mail.envelope_from => @mail.from * lib/quickml/mail.rb (QuickML::MailSender): New class. * lib/quickml/core.rb (QuickML::Processor::unsubscribe_requested?): Accept unsubscribe commands such as unsubscribe, bye, quit, etc. (QuickML::QuickML::member_added?): Renamed from with_member_list? (QuickML::QuickML::generate_footer): Add unsubscribe information if a member is added. (QuickML::QuickML::unsubscribe_info): New method. 2003-01-16 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::report_rejection): Change the recipient address: @mail.envelope_from => @mail.from (QuickML::Processor::report_invalid_mladdress): Ditto. (QuickML::QuickML::quickml_headers): Add a new field: Precedence: bulk - Thanks to SATOH Fumiyasu for the suggestion. (QuickML::QuickML::quickml_fields): Renamed from quickml_headers. 2003-01-07 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::content_type): Fix Content-Type: text/plain; charset=iso-2022-jp; ... problem. - The cause: use of destructive method String#<< (QuickML::Processor::report_unsubscription): Change From: address. @config.postmaster -> ml.address. 2002-10-29 Satoru Takabayashi * lib/quickml/gettext.rb (QuickML::GetText::GetText::gettext2): New method. * lib/quickml/core.rb (QuickML::QuickML::content_type): New method. (QuickML::Processor::report_invalid_mladdress): Refine Content-Type: handling. (QuickML::Processor::report_invalid_mladdress): Refine messages. (QuickML::QuickML::close): unlink @charset_file. (QuickML::QuickML::report_ml_close_soon): Refine messages. * lib/quickml/config.rb (QuickML::Config::initialize): Don't add charset to content_type. * lib/quickml/core.rb (QuickML::QuickML::init_charset): New method. (QuickML::QuickML::initialize): New field: @charset. (QuickML::QuickML::save_charset): New method. (QuickML::QuickML::_submit): Use save_charset. 2002-10-21 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::require_member_list): Abolished. (QuickML::Processor::submit_article): Don't use QuickML#require_member_list. 2002-10-18 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::with_member_list?): New method. (QuickML::QuickML::generate_footer): Use with_member_list?. (QuickML::QuickML::reset_error_member): Be private. (QuickML::QuickML::initialize): New field: @member_list_required_p. (QuickML::QuickML::require_member_list): New method. 2002-10-17 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::ml_address_in_to?): New method. (QuickML::Processor::submit_article): Use ml_address_in_to? to add members only if the ml address is in To: field. (QuickML::Processor::report_rejection): Preserve original Content-Type: field. (QuickML::Processor::acceptable_submission?): Use ml_address_in_to? to limit the acceptable condition. * lib/quickml/mail.rb (QuickML::Mail::collect_to): New method. (QuickML::Mail::reply_to): Abolished. * lib/quickml/core.rb (QuickML::QuickML::_submit): Rewrite Reply-To: address by force. (QuickML::Processor::create_subml): Abolished. (QuickML::Processor::subml_requested?): Abolished. (QuickML::Processor::process_recipient): Remove subml processing. (QuickML::QuickML::initialize): Remove @keyword_file field. (QuickML::QuickML::init_keyword): Abolished. (QuickML::QuickML::close): Remove @keyword_file handling. (QuickML::QuickML::keyword=): Abolished. (QuickML::Processor::get_keyword): Abolished. (QuickML::Processor::acceptable_submission?): Remove keyword handling. (QuickML::Processor::subml_requested?): Abolished. (QuickML::ErrorInfo): Moved out from class QuickML (QuickML::IcaseHash): Ditto. (QuickML::IcaseArray): Ditto. (QuickML::Processor::report_rejection): Preserve the original message for rejection reporting. * Makefile (LOCALSTATEDIR): $(PREFIX)/var/lib/quickml => $(PREFIX)/var/quickml * lib/quickml/core.rb (QuickML::QuickML::IcaseArray: New class. (QuickML::QuickML::IcaseHash): New class. (QuickML::QuickML::init_members): Use IcaseArray and IcaseHash for member management. 2002-10-16 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): New parameter: @info_url. (QuickML::Config::initialize): Abolish @advertisement. * lib/quickml/core.rb (QuickML::Processor::generate_footer): Use @config.info_url. (QuickML::QuickML::generate_footer): Ditto. * quickmlrc.sample.in (info_url): New config parameter. * lib/quickml/core.rb (QuickML::QuickML::rewrite_body): Refine multipart handling. * lib/quickml/mail.rb (QuickML::Mail::parts): New method. (QuickML::Mail::initialize): New field: @content_type. (QuickML::Mail::get_content_type): New method. (QuickML::Mail::to_s): New method. (QuickML::Mail::join_parts): New method. * lib/quickml/core.rb (QuickML::Processor::process_recipient): Call QuickML.new with @message_charset. (QuickML::Processor::create_subml): Ditto. (QuickML::ErrorMailHandler::initialize): New field: @message_charset. * lib/quickml/sweeper.rb (QuickML::Sweeper::initialize): New field: @message_charset. (QuickML::Sweeper::sweep): Call QuickML.new with @message_charset. * lib/quickml/core.rb (QuickML::QuickML::initialize): New field: @message_charset. (QuickML::Processor::initialize): New field: @message_charset. * lib/quickml/server.rb (QuickML::Session::initialize): New field: @message_charset. (QuickML::Session::data): Set @message_charset to mail.charset. * lib/quickml/gettext.rb (QuickML::GetText::GetText::gettext): Check @message_charset. * lib/quickml/mail.rb (QuickML::Mail::get_charset): New method. (QuickML::Mail::read): Use get_charset. (QuickML::Mail::initialize): New field: @charset. * quickmlrc.sample.in: Introduce @USER@ and @GROUP@ substitutions. - by applying a patch by "Akinori MUSHA" * lib/quickml/gettext.rb (QuickML::GetText::GetText::codeconv): Fix a bug occurred when @catalog is nil. - by applying a patch by "Akinori MUSHA" * Makefile: Refine install: rule. - by applying a patch by "Akinori MUSHA" 2002-10-09 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::empty_body?): Support Japanese zenkaku-space. 2002-08-26 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::init_members): Remove a redundant temporary variable. (QuickML::QuickML::error_member?): Removed. (QuickML::QuickML::reset_error_member): New method. (QuickML::QuickML::submit): Call reset_error_member(mail.from). 2002-08-07 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::plain_text?): New method. (QuickML::QuickML::rewrite_body): Rewrite a single part body only if the body is a text/plain message. 2002-07-10 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::mail_log): Add logging for bare From: and Cc:. * lib/quickml/mail.rb (QuickML::Mail::collect_address): Allow a double-quoted address. 2002-07-08 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::add_recipient): New method. (QuickML::Mail::clear_recipients): New method. * lib/quickml/server.rb (QuickML::Session::rset): Use Mail#clear_recipients. (QuickML::Session::rcpt): Use Mail#add_recipient * lib/quickml/mail.rb (QuickML::Mail::normalize_address): Remove double quotations. "foobar"@example.com -> foobar@example.com (QuickML::Mail::remove_comment_in_field): Don't remove double-quoted string like "Satoru Takabayashi" 2002-06-28 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): New field: @allowable_error_interval. * lib/quickml/core.rb (QuickML::QuickML::obfuscate_address): Renamed from ambiguate_address. (QuickML::QuickML::ErrorInfo): New class. (QuickML::QuickML::init_members): Change error member handling. (QuickML::QuickML::save_member_file): Ditto. (QuickML::QuickML::error_count): Ditto. (QuickML::QuickML::inc_error_count): Ditto. (QuickML::QuickML::add_error_member): Ditto. (QuickML::QuickML::allowable_error_interval?): New method. 2002-06-27 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Session::end_of_data?): New method. (QuickML::Session::discard_data): Use end_of_data? (QuickML::Session::read_mail): Ditto. * lib/quickml/mail.rb (QuickML::Mail::send_mail): Take a new parameter smtp_port. * lib/quickml/config.rb (QuickML::Config::initialize): Add new field: @smtp_port. Patch by Kenshi Muto * lib/quickml/mail.rb (QuickML::Mail::initialize): Abolish @max_length and @length fields. (QuickML::Mail::push_body): Abolished. * lib/quickml/server.rb (QuickML::Session::read_mail): Optimized. Avoid use of String#<< in while loop. Instead, use Arrray#<< to collect lines. I don't know why this change improves performance, but it does. (QuickML::Session::process): Call cleanup_connection for TooLargeMail. (QuickML::Session::cleanup_connection): Send 221 Bye instead of 554. (QuickML::Session::read_mail): Check @config.max_mail_length in this method.. * lib/quickml/mail.rb (Net::BufferedSocket#write_pendstr): Rewriten for optimization by Fumitoshi UKAI . * lib/quickml/utils.rb (String::xchomp!): Optimized. Don't use gsub! anymore. (String::xchomp): Ditto. (String::normalize_eol): New method. * lib/quickml/mail.rb (QuickML::Mail::read): Optimized. (QuickML::Mail::push_body): Simplified. * quickmlrc.sample: Change :max_mail_length to 1024 * 1024 (1MB) 2002-06-24 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::encode_field): Refine the regular expression to avoid "mojibake" of 1-length Japanese char. 2002-05-01 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::_submit): Don't change "To:" and "From:" address. * messages.ja: Add messages. * lib/quickml/core.rb (QuickML::Processor::report_rejection): Add messages. 2002-04-28 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Session::initialize): New field: @my_hostname. (QuickML::Session::helo): Use @my_hostname. (QuickML::Session::ehlo): Ditto. (QuickML::Session::received_field): Ditto. (QuickML::Session::connect): Ditto. (QuickML::Server::start): Ditto. * with-mta.ja.rd: Update documantation. - applying a patch by Naoto Morishima * lib/quickml/server.rb (QuickML::Server::initialize): Use @config.bind_address. - applying a patch by Naoto Morishima * lib/quickml/config.rb (QuickML::Config::initialize): New field: bind_address. - applying a patch by Naoto Morishima 2002-04-25 Satoru Takabayashi * lib/quickml/core.rb (QuickML::Processor::generate_footer): New method. (QuickML::Processor::report_invalid_mladdress): Use generate_footer. (QuickML::Processor::report_too_many_members): Ditto. (QuickML::Processor::report_unsubscription): Ditto. (QuickML::Processor::report_rejection): Ditto. 2002-04-09 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::collect_address): Add "?" and "/" to support an address like . 2002-04-05 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Session::read_mail): Substitute ".." in the beginning of line to ".". 2002-04-04 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::encode_field): Use toeuc. 2002-03-20 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::report_removed_member): Change From: Address. Use ML address instead of postmaster. (QuickML::QuickML::report_ml_close_soon): Ditto. 2002-03-18 Satoru Takabayashi * lib/quickml/mail.rb (QuickML::Mail::encode_field): Refined. 2002-03-12 Satoru Takabayashi * Makefile (VERSION): Bumped version number to 0.6. * lib/quickml/core.rb (QuickML::QuickML::generate_header): New method. (QuickML::QuickML::rewrite_body): Use generate_header. (QuickML::QuickML::add_member): Update @add_members. 2002-03-10 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::add_error_member): Do nothing unless @active_members.include?(address). 2002-03-09 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::initialize): Fix the config[:verbose_mode] handling. 2002-03-08 Satoru Takabayashi * with-mta.ja.rd: Fix the description for Postfix. Suggested by akira yamada . 2002-03-07 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::generate_footer): Use codeconv for @config.advertisement. * lib/quickml/gettext.rb (QuickML::GetText::GetText::codeconv): New method. (QuickML::GetText::GetText::gettext): Use codeconv. 2002-03-04 Satoru Takabayashi * quickml: Version 0.5 released. * Makefile (VERSION): Bumped version number to 0.5. * lib/quickml/utils.rb (Time::rfc2822): Abolished. Use time.rb instead. * lib/quickml/server.rb (QuickML::Session::read_mail): Mark @data_finished in the method instead of `data' method. (QuickML::Session::discard_data): New method. (QuickML::Session::cleanup_connection): Use discard_data. Call quit. (QuickML::Session::process): Call quit when TooLargeMail. require 'time' to use Time#rfc2822 2002-03-01 Satoru Takabayashi * lib/quickml/core.rb (QuickML::QuickML::report_ml_close_soon): Change the log message. (QuickML::QuickML::report_removed_member): Ditto. (QuickML::Processor::sender_knows_an_active_member?): Use Enumerable#find not Enumerable#each. * quickml: Version 0.4 released. * lib/quickml/core.rb (QuickML::QuickML::generate_footer): New method. (QuickML::QuickML::rewrite_body): Use generate_footer. (QuickML::QuickML::report_ml_close_soon): Ditto. (QuickML::QuickML::report_removed_member): Ditto. * lib/quickml/core.rb (QuickML::QuickML::generate_return_address): Generate a return address for qmail's VERP if @config.use_qmail_verp. * quickmlrc.sample.in: Add :use_qmail_verp => false. * lib/quickml/config.rb (QuickML::Config::use_qmail_verp): New field. 2002-02-28 Satoru Takabayashi * lib/quickml/config.rb (QuickML::Config::log_file): New field. * lib/quickml/server.rb (be_secure): New method. (QuickML::Server::start): Call be_secure. (touch): New method. * quickml.in (be_secure): Abolished. * lib/quickml/utils.rb (QuickML::Utils): Abolished. * lib/quickml/mail.rb (QuickML::Mail::send_mail): Moved fomr QuickML::Utils. (QuickML::Mail::address_of_domain?): Ditto. (QuickML::Mail::encode_field): Ditto. (QuickML::Mail::clean_subject): Ditto. (QuickML::Mail::rewrite_subject): Ditto. * lib/quickml/server.rb (QuickML::Session::cleanup_connection): Check @data_finished and discard all data if not finished. * quickml.in (be_secure): New method. * lib/quickml/server.rb (QuickML::Server::be_secure): Abolished. 2002-02-26 Satoru Takabayashi * lib/quickml/server.rb (QuickML::Server::initialize): Use Dir.chroot for security. (QuickML::Server::initialize): Use Process.uid= for security. (QuickML::Server::initialize): Use Process.gid= for security. (QuickML::Server::be_secure): New method. (QuickML::Session::ehlo): Return "localhost" if port != 25. * lib/quickml/config.rb (QuickML::Config::data_dir): Be attr_accessor. * quickmlrc.sample.in: Add New fields. * lib/quickml/config.rb (QuickML::Config::port): New field. * lib/quickml/config.rb (QuickML::Config::user): Ditto. * lib/quickml/config.rb (QuickML::Config::group): Ditto. * lib/quickml/server.rb (QuickML::Server::initialize): Use @config.port. * lib/quickml.rb: New file. lib/quickml/config.rb: New file. lib/quickml/core.rb: New file. lib/quickml/gettext.rb: New file. lib/quickml/logger.rb: New file. lib/quickml/mail.rb: New file. lib/quickml/server.rb: New file. lib/quickml/sweeper.rb: New file. lib/quickml/utils.rb: New file. lib/quickml/version.rb: New file. * QuickML: Separate library files. * quickml.in (QuickML::QuickML::_submit): Don't modify Content-Type. (QuickML::QuickML::rewrite_body): Use \A to match Content-Type. (QuickML::QuickMLProcessor::report_rejection): Send a mail to @mail.envelope_from. (QuickML::QuickMLProcessor::report_invalid_mladdress): Ditto. (QuickML::QuickMLSession::report_too_large_mail): Ditto. (QuickML::QuickUtil::normalize_address): Support domainless address. (QuickML::QuickML::exclude?): New method. (QuickML::QuickML::add_member): Use exclude? (String::xchomp!): New method. (String::xchomp): New method. (QuickML::QuickUtil::xchomp): Abolished. (QuickML::QuickUtil::xchomp!): Ditto. (QuickML::QuickMLSession::receive_mail): Use String#xchomp! (QuickML::QuickMLSession::cleanup_connection): Ditto. (QuickML::QuickMLSession::read_mail): Use QuickMail#read (QuickML::QuickMail::read): New method. (QuickML::QuickMail::unshift_field): New method. 2002-02-25 Satoru Takabayashi * quickml.in (Net::NetPrivate::SMTPCommand::mailfrom): Check not fromaddr.empty? to use XVERP. * Makefile (VERSION): Bumped version number to 0.4. * quickml.in (QuickML::QuickML::report_removed_member): Set :envelope_from => ''. (QuickML::QuickML::report_ml_close_soon): Ditto. (QuickML::QuickMLProcessor::report_rejection): Ditto. (QuickML::QuickMLProcessor::report_unsubscription): Ditto. (QuickML::QuickMLProcessor::report_too_many_members): Ditto. (QuickML::QuickMLProcessor::report_invalid_mladdress): Ditto. (QuickML::QuickMLSession::report_too_large_mail): Ditto. (QuickML::QuickUtil::encode_field): Renamed from encode_subject. (QuickML::QuickML::report_removed_member): Use _() for subject. (QuickML::QuickML::report_ml_close_soon): Ditto. (QuickML::QuickMLProcessor::report_rejection): Ditto. (QuickML::QuickMLProcessor::report_unsubscription): Ditto. (QuickML::QuickMLProcessor::report_too_many_members): Ditto. (QuickML::QuickMLProcessor::report_invalid_mladdress): Ditto. (QuickML::QuickMLSession::report_too_large_mail): Ditto. 2002-02-19 Satoru Takabayashi * quickml: Version 0.3 released. * ml-usage.en.rd: New file. * quickml.en.rd: New file. * Makefile (quickml.en.html): Add the rule for quickml.en.html * quickml.in: Gettextized using SimpleGetText! (SimpleGetText::GetText): New module. (SimpleGetText::Catalog::initialize): New class. (QuickML::QuickML::report_ml_close_soon): Send mail to @address. (QuickML::QuickML::report_removed_member): Ditto. (QuickML::QuickML::init_members): Use Hash for @error_members. (QuickML::QuickMLConfig::auto_unsubscribe_count): Renamed from max_error_mails. * quickml.in (QuickML::QuickMLConfig::catalog): New field. (QuickML::QuickMLConfig::content_type): New field. * checkmsg.rb: New file. * messages.ja: New file. * Makefile: Install messages.ja 2002-02-18 Satoru Takabayashi * quickml.in (Net::NetPrivate::SMTPCommand::mailfrom): Use XVERP=-= instead of XVERP=+= because some mail servers reject MAIL FROM: address including '+'. (QuickML::QuickML::return_address): Renamed from owner_address. (QuickML::QuickML::generate_return_address): New method. (QuickML::QuickMLErrorMailHandler::handle): Change the regex. (QuickML::QuickML::send_alert): Use @config.postmaster for From: address. (QuickML::QuickMLProcessor::report_rejection): Ditto. (QuickML::QuickMLProcessor::report_unsubscription): Ditto. (QuickML::QuickMLProcessor::report_too_many_members): Ditto. (QuickML::QuickML::init_members): Handle @error_members. (QuickML::QuickML::save_member_file): Ditto. (QuickML::QuickML::remove_member): Dttio. (QuickML::error_member?): New method. (QuickML::QuickML::add_error_member): New method. (QuickML::QuickML::report_ml_close_soon): Renamed from send_alert. (QuickML::QuickML::report_removed_member): New method. (QuickML::QuickMLConfig::max_error_mails): New field. (QuickML::QuickML::remove_error_member): New method. (QuickML::QuickML::error_count): New method. (QuickML::QuickML::inc_error_count): New method. * quickmlrc.sample.in: Add :max_error_mails. 2002-02-16 Satoru Takabayashi * quickml.in (File.safe_open): Brushed up by applying a patch by Kazuhiro NISHIYAMA (QuickML::QuickUtil::clean_subject): Ditto. (QuickML::QuickMail::collect_address): Ditto. (QuickML::QuickMail::remove_comment_in_field): Ditto. (QuickML::QuickMail::multipart?): Ditto. (QuickML::QuickMail::boundary): Ditto. (QuickML::QuickMLProcessor::get_keyword): Ditto. (QuickML::QuickMLSession::initialize): Ditto. (QuickMLException): Ditto. (QuickML::TooLargeMail): Ditto. (QuickML::TooManyMembers): Ditto. (QuickML::InvalidMLName): Ditto. (Net::NetPrivate::SMTPCommand::ehlo): Mixin for using XVERP. (Net::NetPrivate::SMTPCommand::mailfrom): Ditto. (QuickML::QuickMLErrorMailHandler): New class. (QuickML::QuickMLProcessor::get_ml_mutex): Abolished. (QuickML::QuickMLConfig): Renamed from QuickConfig. (QuickML::QuickMLConfig::ml_mutex): New method. (QuickML::QuickMLSweeper::sweep): Use @config.ml_mutex. (QuickML::QuickMLProcessor::process_recipient): Ditto. (QuickML::QuickML::save_member_file): Ditto. (QuickML::QuickML::remove_member): Ditto. 2002-02-14 Satoru Takabayashi * quickml.in (QuickML::QuickUtil::send_mail): Remove a meaningless line. try = 0. (QuickML::QuickUtil::normalize_address): New method. (QuickML::QuickMail::collect_cc): Use normalize_address. (QuickML::QuickMail::reply_to): Ditto. (QuickML::QuickMail::from): Ditto. (QuickML::QuickMail::remove_comment_in_field): Be private. (QuickML::QuickMail::collect_address): New method. (QuickML::QuickMail::collect_cc): Rewritten using collect_address. (QuickML::QuickMail::reply_to): Ditto. (QuickML::QuickMail::from): Ditto. * Makefile (VERSION): Bumped version number to 0.3. 2002-02-12 Satoru Takabayashi * quickml: Version 0.2 released. * Makefile (VERSION): Bumped version number to 0.2. * quickmlrc.sample.in: Change @DATADIR@ to @LOCALSTATEDIR@. Suggested by akira yamada . * quickml.in (QuickML::QuickMLServer::be_daemon): Use exit!(0) to tell the server is successfully invoked. Suggested by akira yamada . (main): trap(:HUP) to reopen the logfile. (QuickML::QuickLogger::reopen): New method. Patch by akira yamada . * Makefile (quickmlrc.sample): Remove unneccesary chmod +x. Suggested by akira yamada . * quickml: Version 0.1 released. * quickml.in: require 'nkf' instead of 'kconv' 2002-02-09 Satoru Takabayashi * quickml.in (QuickML::QuickMLSession::receive_mail): Return 502 error for unknown commands. 2002-02-07 Satoru Takabayashi * quickml (QuickLogger): New class. (QuickUtil::load_config): New method. 2002-02-06 Satoru Takabayashi * quickml (QuickMail::collect_cc): Renamed from collect_recipients (QuickMLProcessor::unsubscribe_self): New method. (QuickMLProcessor::unsubscribe_other): New method. (QuickMLProcessor::unsubscribe): Use unsubscribe_self and unsubscribe_other. (QuickMLProcessor::report_unsubscription): Support 3rd party unsubscription. 2002-02-04 Satoru Takabayashi * quickml (QuickMail::remove_comment_in_field): Renamed from remove_comment_in_from. (QuickMail::collect_recipients): Use remove_comment_in_field. 2002-01-25 Satoru Takabayashi * quickml (QuickMLSession::ehlo): Add PIPELINING support. (QuickMLSession::rcpt): Add error handling. (QuickMLSession::mail): Ditto. (QuickMLSession::data): Ditto. (QuickUtil::puts_log): 2002-01-25 02:51:05 -> 2002-01-25T02:51:05 To be compliant with ISO 8601 and XML Schema Part 2: Datatypes 2002-01-24 Satoru Takabayashi * quickml (QuickMLSession::rcpt): Return 554 if a requested RCPT address is unacceptable. 2002-01-23 Satoru Takabayashi * quickml (QuickML::_submit): New method. (QuickML::submit): Record a time to send a mail to the log file. (QuickMLServer::process_session): Record backtrace to the log file. (QuickMLSweeper::start): Ditto. (QuickMLSession::process): Create QuickMail object in the method. To handle TooLargeMail and TooLongLine exceptions. (QuickMLSession::receive_mail): Don't create QuickMail object. (QuickMLSession::report_too_large_mail): Refine messaeges. (QuickUtil::commify): New method. (QuickMLProcessor::report_invalid_mladdress): Renamed from report_invalid_mlname. 2002-01-22 Satoru Takabayashi * quickml (QuickML::quickml_headers): Put @name to X-ML-Name: instead of @short_name. (QuickML::unlimited?): New method. (QuickML::too_many_users?): New method. (QuickML::add_member): Use too_many_users?. (QuickMail::remove_comment_in_from): New method. (QuickMail::from): Use remove_comment_in_from. (QuickMLSession::_start): New method. (QuickMLSession::start): Record an elapsed time to the log file. 2002-01-21 Satoru Takabayashi * quickml (QuickMLSession::connect): redefine @socket#puts to output CR/LF. To handle mail from hotomail.com. 2002-01-15 Satoru Takabayashi * quickml (QuickML::rewrite_body): Insert ML address. (QuickML::ambiguate_address): New method. (QuickMLSession::connect): make @socket use CRLF. (QuickMLSession::mail): Allow whitespaces before "<...>". (QuickMLSession::rcpt): Allow whitespaces before "<...>". (QuickMLServer::read_pidfile): New method. (QuickMLServer::remove_pidfile): Remove pidfile only if it equals to Process.pid. (QuickUtil::xchomp!): Moved from QuickMLSession. (QuickUtil::xchomp): New method. (QuickMLSession::connect): Speak ESMTP. (QuickUtil::puts_log): Change time format. (QuickMLSession::rcpt): Allow omitting < >. To handle mail from docomo.ne.jp. (QuickMLSession::mail): Ditto. (QuickMail::collect_recipients): New method. (QuickMail::collect_cc): Abolished. (QuickMLProcessor::sender_knows_an_active_member?): Use QuickMail#collect_recipients. (QuickMLProcessor::submit_article): Ditto. 2002-01-08 Satoru Takabayashi * quickml (QuickMLSession::process): New method. (QuickMLSession::close): New method. (QuickConfig::timeout): New field. (QuickML::get_name): raise InvalidMLName if two or more "@". (QuickMLServer::shutdown): Call BasicSocket#shutdown. 2002-01-06 Satoru Takabayashi * quickml (QuickConfig::max_threads): New field. (QuickMLServer::accept): Control the number of working threads using ThreadWait#next_wait. (QuickML::inc_count): Be private. (QuickML::flock_sync): Abolished. (QuickMLSweeper::start): Call sleep first. (QuickConfig::ml_mutexes): New field. (QuickMLProcessor::get_ml_mutex): New method. (QuickMLProcessor::process_recipient): Use ml_mutex for synchronization. 2002-01-05 Satoru Takabayashi * quickml (File::safe_open): Renamed from eopen. (QuickML::rewrite_body): New method. (QuickConfig::advertisement): New field. (QuickMail::multipart?): New method. (QuickMail::boundary): New method. (QuickML::member_list): New method. (QuickML::add_member): Set @member_added_p to true. 2001-12-24 Satoru Takabayashi * quickml (QuickUtil::clean_subject): Remove "New ML!" handling. (QuickUtil::rewrite_subject): Remove "New ML!" handling. (QuickUtil::rewrite_subject): Take `name' and `count' parameters. (QuickML::submit): Pass @short_name and @count to rewrite_subject. (QuickML::send_alert): Send an alert mail to the ML creator only. (QuickMLServer::initialize): @status: New instance variable. (QuickMLServer::remove_pidfile): New method. (QuickMLServer::shutdown): Change @status to :shutdown. (QuickMLServer::accept): Set socket.sync = true. (QuickMLServer::shutdown): Call @server.close. (QuickMLServer::accept): Refined. (QuickMLServer::process_session): New method. (QuickMLServer::accept): Manage sessions with Thread#join. (QuickMLSweeper::initialize): New instance variable: @status (QuickMLSweeper::sweep): Use @status for safe shutdown. (QuickMLSweeper::shutdown): New method. (main): Call sweeper.shutdown when trap signals for safe shutdown. 2001-12-22 Satoru Takabayashi * quickml (QuickMLProcessor::process_recipient): return instead of next 2001-12-21 Satoru Takabayashi * quickml (QuickMLServer::shutdown): Renamed from cleanup. (main): trap :TERM and :INT. 2001-12-17 Satoru Takabayashi * quickml (QuickML::valid_name?): New class method. (QuickML::last_article_time): New method. (QuickML::inactive?): New method. (QuickML::need_alert?): New method. (QuickML::send_alert): New method. (QuickMLSweeper): New class. (QuickML::close): New method. (QuickMLSession::rcpt): Exclude unacceptable RCPT TO: address. (InvalidMLName): New exception class. (QuickMLProcessor::process_recipient): New method. (main): Create a sweeper and run the sweeper in a thread. (QuickML::initialize): Validate the ML name using valid_name?. (QuickML::initialize): Use "," instead of "." for additional files. (QuickML::close_ml): Removed. (QuickML::permanent?): New method. (QuickMLProcessor::report_invalid_mlname): New method. (QuickML::quickml_headers): New method. (QuickUtil::decode_subject): New method. (QuickUtil::rewrite_subject): New method. (QuickUtil::clean_subject): New method. (QuickUtil::encode_subject): New method. (QuickML::send_alert): New method. (QuickML::submit): New method. (QuickMLProcessor::send_ml_mail): Removed. (QuickMLProcessor::decode_subject): Removed. (QuickMLProcessor::rewrite_subject): Removed. (QuickMLProcessor::clean_subject): Removed. (QuickMLProcessor::encode_subject): Removed. (QuickMLSweeper::start): Rescue all exceptions. (QuickMLServer::accept): Rescue all exceptions. 2001-12-11 Satoru Takabayashi * quickml (QuickMLProcessor::encode_subject): Use space instead of TAB for concatinating adjacent lines. 2001-12-09 Satoru Takabayashi * quickml (QuickMail::empty_body): Fix the regex pattern. \s+ -> \s* 2001-12-05 Satoru Takabayashi * quickml (QuickMLSession::report_too_large_mail): Refined. (QuickMLProcessor::report_too_many_members): Refined. (QuickMLProcessor::report_unsubscription): Refined. (QuickMLProcessor::report_rejection): Refined. (QuickMLProcessor::send_ml_mail): Refined. (QuickConfig::max_members): New field. (QuickConfig::max_mail_length): New field. (QuickMLSession::initialize): Remove @max_mail_length. (QuickML::initialize): Remove @max_members. (QuickMLProcessor::submit_article): Renamed from submit_article_successfully. (IO::safe_gets): Simplified. 2001-12-04 Satoru Takabayashi * quickml (QuickConfig): New class. (QuickMLServer::initialize): Change parameter. Use config. (QuickMLSession::initialize): Change parameter. Use config. (QuickMLProcessor::initialize): Change parameter. Use config. (QuickML::initialize): Change parameter. Use config. (QuickML::close_ml): Add checks. (QuickMail::initialize): Make @body be String. (QuickMail::push_body): Renamed from body_push (QuickMail::white_line): Simplified. (QuickMail::empty_body): Simplified. (QuickMLProcessor::to_owner): Simplified. (QuickMLProcessor::unsubscribe_requested): Simplified. (QuickConfig::initialize): Remove @wildcard_mx. (QuickMLSession::receive_mail): Add error messaging. (File::safe_unlink): New method. (QuickMLServer::cleanup): Use File.safe_unlink. (QuickML::close_ml): Use File.safe_unlink. (QuickUtil::send_mail): Refined. (QuickConfig::postmaster): New field. 2001-12-01 Satoru Takabayashi * quickml (QuickMLSession::initialize): New instance variables: @peer_hostname and @peer_address. (QuickMLSession::received_field): Use @peer_hostname and @peer_address (QuickMLServer::accept): Add exception handling. (QuickMLSession::receive_mail): Call QuickMail.new in the method. (QuickMLSession::start): Loop for multiple mails at the one connection (QuickMLSession::quit): Call Scoket#close. (QuickMLSession::report_too_large_mail): Use . (QuickMLProcessor): New class. 2001-11-30 Satoru Takabayashi * quickml (QuickML::forward?): New method. (QuickMLSession::accept_submission): Check ml.forward? (QuickMLSession::accept_submission): Remove collision handling. (QuickMLSession::collision_occur?): Removed. (QuickML::uniq_new): Removed. (QuickML::next_name): Removed. (QuickML::get_name): Be instance method. (QuickMail::[]=): Removed. (QuickMail::push_field): New method. (QuickMail::concat_field): New method. (QuickMLSession::read_mail): Use QuickMail#push_field. (QuickMLSession::read_mail): Use QuickMail#concat_field. (TCPSocket::address): New method. (TCPSocket::hostname): New method. (QuickMLSession::connect): Use Socket#address and Socket#hostname. (QuickMLSession::send_mail): Use received_field. (QuickMLSession::received_field): New method. (QuickMLSession::helo): Set @hello_host. (QuickMLSession::ehlo): Set @protocol. 2001-11-29 Satoru Takabayashi * quickml (QuickMail::reply_to): New method. (QuickMLSession::unsubscribe_requested?): New method. (QuickMLSession::error_mail?): New method. (QuickMLSession::create_subml): New method. (QuickMLSession::subml_requeseted?): New method. (QuickMLSession::clean_subject): New method. (QuickMLSession::get_keyword): New method. (QuickML::init_keyword): New method. (QuickML::keyword=): New method. (QuickMLSession::send_ml_mail): Use mail.reply_to if nonnil. (QuickMLSession::acceptable_submission?): Add a new condition. 2001-11-26 Satoru Takabayashi * quickml (QuickML::parse_address): New method. (QuickMLSession::submit_article_successfully): New method. (QuickML::uniq_new): New class method. (QuickML::next_name): New class method. (QuickML::get_name): New class method. (QuickMLSession::rewrite_subject): Indicate "New ML!". (QuickML::short_name): New field. (QuickMLSession::collision_occur): New method. (QuickML::get_name): Simplified. (QuickML::add_member): Use @domain to exclude an address. (QuickML::close_ml): Be public. (QuickMLSession::submit_article_successfully): Send mail only if not active_members.empty? 2001-11-25 Satoru Takabayashi * quickml: Set $KCODE to "e". (QuickMLSession::rewrite_subject): Be case-insensitive to allow RE: 2001-11-24 Satoru Takabayashi * quickml (QuickMLSession::rewrite_subject): Refined. (QuickMLSession::encode_subject): New method. (QuickMLSession::decode_subject): New method. (QuickMail::white_line): New method. (QuickMail::empty_body): New method. (QuickMLSession::sender_knows_an_active_member): New method. (QuickMLSession::acceptable_submission): New method. (QuickMLSession::handle_mail): New method. (TooManyMembers): New exception. (QuickML::add_member): Check @max_members exceeded? (QuickMLSession::add_member): New method. (QuickMail::body_push): New method. (QuickMail::initialize): Fix @max_length size. (puts_log): Synchronize logging processing using Mutex. (QuickMail::looping): New method. (QuickMLSession::handle_mail): Detect looping mail. (QuickMLSession::cleanup_connection): New method. 2001-11-22 Satoru Takabayashi * quickml-ctl: New file. * quickml (QuickMail::initialize): Fix @addrexx_regex bug. /([\w_\-]+\@(([\w_\-]+)\.)*([\w_\-]+))/ doesn't match correctly. (QuickMLServer::be_daemon): New method. (QuickMLServer::write_pidfile): New method. (QuickMLServer::cleanup): New method. (QuickMLServer::start): New method. quickml-0.7/INSTALL0000644000076400007640000002202410061026162007541 Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. quickml-0.7/NEWS0000644000076400007640000000127710061026162007216 Overview of Changes in QuickML 0.6 - 2004-02-11 * quickml-analog is now included. * Ruby 1.8 is now supported. * Per-ML limitation is now supported. * Autotoolized. * Bugs in Sweeper are fixed. Overview of Changes in QuickML 0.5 - 2002-03-04 * Some bugs are fixed. Overview of Changes in QuickML 0.4 - 2002-03-01 * Working with other MTAs is now supported. * qmail's verp is now supported. * Working as a non-root user is now supported. Overview of Changes in QuickML 0.3 - 2002-02-19 * Automatic error mail handling is now supported. * Gettextized. Overview of Changes in QuickML 0.2 - 2002-02-12 * Some bugs are fixed. Overview of Changes in QuickML 0.1 - 2002-02-12 * The initial release. quickml-0.7/install-sh0000755000076400007640000002177010061040657010530 #!/bin/sh # install - install a program, script, or datafile scriptversion=2004-02-15.20 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename= transform_arg= instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= usage="Usage: $0 [OPTION]... SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 -d DIRECTORIES... In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. In the second, create the directory path DIR. Options: -b=TRANSFORMBASENAME -c copy source (using $cpprog) instead of moving (using $mvprog). -d create directories instead of installing files. -g GROUP $chgrp installed files to GROUP. -m MODE $chmod installed files to MODE. -o USER $chown installed files to USER. -s strip installed files (using $stripprog). -t=TRANSFORM --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. test -n "$dir_arg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then instcmd=: chmodcmd= else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" || lasterr=$? # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $instcmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else # If we're going to rename the final executable, determine the name now. if test -z "$transformarg"; then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename \ | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename. test -z "$dstfile" && dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now remove or move aside any old file at destination location. We # try this two ways since rm can't unlink itself on some systems and # the destination file might be busy for other reasons. In this case, # the final cleanup might fail but the new file should still install # successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: quickml-0.7/missing0000755000076400007640000002466610061040657010132 #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2003-09-02.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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. # 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: quickml-0.7/quickml.en.rd0000644000076400007640000001341310061420156011110 =begin index:Ej = quickml server: An easy-to-use mailing list system Last Modified: 2004-06-09 (Since: 2002-02-12) -- quickml server is a very-easy-to-use mailing list system. quickml server provides very-easy-to-use mailing list service. The latest version is available at (()). == What's New * 2004-06-09: quickml 0.7 released! * Some bugs were fixed. * 2004-02-11: quickml 0.6 released! * Ruby 1.8 is now supported. * Autotoolized. * Some bugs were fixed. * 2002-03-04: quickml 0.5 released! * Fix the bug of handling a large mail. * Require Ruby 1.6.7 (for using time.rb) * 2002-03-01: quickml 0.4 released! * Work with other MTAs. (quickmlrc: :port) * Discard root privilege after binding port 25 (quickmlrc: :user, :group) * Support qmail's VERP (quickmlrc: :use_qmail_verp = true/false) * Separate library files. * Some bugs were fixed. * 2002-02-19: quickml 0.3 released! * Introduce automatic error mail handling. * Introduce selection mechanism for the language of messages. * Some bugs were fixed. * 2002-02-12: quickml 0.2 released! * Fix a fatal bug (String.toeuc raises NameError) * Some bugs were fixed. * 2002-02-12: quickml 0.1 released! == Characteristics * You can create mailing lists of any names you like very easily. * You can create mailing lists with any subdomains you like. * quickml server runs as a stand-alone SMTP server. * quickml server delegates mail delivery to another mail server. * quickml server is simply written in Ruby. == Download quickml server is a free software with ABSOLUTELY NO WARRANTY under the terms of the GNU General Public License version 2. * (()) * (()) == Supported Systems quickml server should work on most Unix platforms. quickml server is tested on Red Hat Linux 7.2 and NetBSD 1.5.1. == Requirements * (()) 1.6.7 or later. * Ruby 1.8.x is recommended. == Installation For standard installation, the following commands will do. % ./configure && make # make install # with root privilege You can give parameters to configure if necessary. --with-user=USER quickml runs as USER [root] --with-group=GROUP quickml runs as GROUP [root] --with-pidfile=FILE PID is stored in FILE [/var/run/quickml.pid] --with-logfile=FILE Log is recorded in FILE [/var/log/quickml.log] --with-rubydir=DIR Ruby library files go to DIR [guessed] == Configurations The configuration file locates at /usr/local/etc/quickmlrc by default. Although there are many parameters, all that you have to change are the only three following parameters. === :smtp_host Set the mail server for mail delivery. === :domain Set the domain name of mailing lists. i.e.. a part of a mail address after `@' mark. === :postmaster Set the From: address for sending error mails. == How to Use quickml Server Since quickml server uses SMTP (25) port, quickml server should be invoked with the root privilege. === Start # quickml-ctl start === Stop # quickml-ctl stop === Restart # quickml-ctl restart == How to Use Mailing List Service See (()). == Automatic Error Mail Handling Automatic error mail handling works if you are using (()) or (()) supporting XVERP extension as a mail server for delivery. quickml server automatically removes a mail address when error mail returns five times from the mail server for delivery. You can change the threshold :auto_unsubscribe_count by editing quickmlrc file. If you are using qmail, set :use_qmail_verp = true in the quickmlrc file. If you are using Postfix, no additional configuration is needed. == Subdomain Handling You can create mailing lists with any subudomains you like by employing DNS's wildcard MX feature. To enable the subdomain handling, all mails to any subdomains should be delivered to quickml server. DNS's wildcard MX RR (Resource Record) allows such a delivery. The following illustrates a sample configuration for BIND. In this example, quickml server runs at ml.pitecan.com (192.168.0.1). $ORIGIN pitecan.com. @ IN MX 10 ml ; 1 * IN MX 10 ml ; 2 ml IN A 192.168.0.1 ; 3 IN MX 10 ml ; 4 === Notes (1) All mails to @pitecan.com are delivered to ml.pitecan.com. (2) All mails to any subdomains at pitecan.com are delivered to ml.ptiecan.com. (3) IP address of ml.pitecan.com (4) MX RR == Mailing List Data Files Mailing list data files locate at /usr/local/var/lib/quickml by default. The following are basic files. * foo: Member list * foo,count: Serial Number * foo,keyword: Keyword for a sub mailing list === Special Files You can create special mailing lists by creating the following empty files. * foo,permanent: Permanent mailing list * foo,forward: Anyone-can-post mailing list * foo,unlimited: Mailing list with unlimited number of members. * foo,config: Configurations such as Number of members and Max size of mail. == quickml-analog quickml-analog is a tool to analyze quickml's log and generate charts. gnuplot, ImageMagick, and ghostscript are required. % quickml-analog -i -o output-dir quickml.log == QuickML History Idea of QuickML emerged from a discussion by (()) and (()). quickml server has been implemented in Ruby by Takabayashi based on the prototype in Perl by Masui. subdomain support was helped by (()). -- - (()) - =end quickml-0.7/ml-usage.en.rd0000644000076400007640000000565310061026162011163 =begin = quickml server: How to Use Mailing List Service Last Modified: 2002-02-19 (Since: 2002-02-19) -- == Creating a Mailing List To create a mailing list, you can send a mail to quickml server with an address of the mailing list you want to create. Subject: Party! To: party@quickml.com <- Address of ML you want to create From: satoru@example.com <- Your address Cc: masui@example.com <- Address of Other members I just created a mailing list <- Body for our party. == Submitting a Mail To submit a mail, you can send a mail to the address of the mailing list as usual. Subject: How about today? To: party@quickml.com <- Address of ML From: satoru@example.com <- Your address How about today? <- Body == Adding a Member To add a member, you can send a mail to the mailing list with Cc: including the address of the new member. Subject: Add Komatsu To: party@quickml.com <- Address of ML From: satoru@example.com <- Your address Cc: komatsu@example.com <- Address of a new member I just invited Mr. Komatsu <- Body to our party. == Joining in a Mailing List To join in a mailing list, you can send a mail to the mailing list with Cc: including the member of the mailing list. Subject: Let me join To: party@quickml.com <- Address of ML From: tsuka@example.com <- Your address Cc: masui@example.com <- Address of a member Don't forget me! <- Body == Unsubscribe To unsubscribe from a mailing list, you can send a mail to the mailing list with an empty message. Subject: Bye! To: party@quickml.com <- Address of ML From: satoru@example.com <- Your address <- Empty body == Removing a Member To remove a member from a mailing list (usually unreachable address), you can send a mail to the mailing list with an empty message and Cc: including the address of the member. Subject: Remove an unreachable member To: party@quickml.com <- Address of ML From: satoru@example.com <- Your address Cc: fugo-masui@example..com <- Address to remove <- Empty body == Returning to a Mailing List To return to a mailing list, you can send a mail to the mailing list as usual. Subject: I'm back! To: party@quickml.com <- Address of ML From: satoru@example.com <- Your address I'm back! <- Body == Deleting a Mailing List A mailing list automatically closed when all members unsubscribe. == Automatic Deletion of a Mailing List A mailing list automatically closes if there is no mails submitted in 31 days. -- - (()) - =end quickml-0.7/quickml.ja.rd0000644000076400007640000001400710061420053011074 =begin index:eJ = quickmlサーバ: 超お手軽なメーリングリストシステム 最終更新日: 2004-06-09 (公開日: 2002-02-12) -- quickmlサーバは超お手軽なメーリングリストシステムです。 quickmlサーバを利用すれば、超お手軽なメーリングリストサービスを提供できます。 最新版は (()) から入手可能です。 == 新着情報 * 2004-06-09: quickml 0.7 を公開 * 細かいバグ修正をいくつか行いました。 * 2004-02-11: quickml 0.6 を公開 * Ruby 1.8 に対応しました * autotool 化しました * その他細かい修正をいくつか * 2002-03-04: quickml 0.5 を公開 * 巨大なメールに対するエラー処理を修正 * Ruby 1.6.7を必要とする (time.rbを使うため) * 2002-03-01: quickml 0.4 を公開 * 他の MTA と共存できるようにした (()) * ポート25番バインド後に root 権限を捨てるようにした (quickmlrc: :user, :group) * qmail の VERP に対応 (quickmlrc: :use_qmail_verp = true/false) * ライブラリを複数のファイルに分割 * その他細かい修正をいくつか * 2002-02-19: quickml 0.3 を公開 * エラーメールの自動処理の機能を導入 * メッセージの言語を切り替える仕組みを導入 * その他細かい修正をいくつか * 2002-02-12: quickml 0.2 を公開 * 致命的なバグを修正 (String.toeuc でエラーが起きる) * その他細かい修正をいくつか * 2002-02-12: quickml 0.1 を公開 == 特長 * 好きなアドレスのメーリングリストを超お手軽に作れる * 好きなサブドメインつきのメーリングリストを作れる * SMTPを喋るサーバとして動作する * メールの配送は別のメールサーバに任せる * Ruby によるシンプルな実装 == ダウンロード GNU General Public License version 2 に従ったフリーソフトウェ アとして公開します。完全に無保証です。 * (()) * (()) == 動作環境 ほとんどの Unixシステムで動作すると思います。Red Hat Linux 7.2 と NetBSD 1.5.1 で動作を確認しています。 == 必要なもの * (()) 1.6.7以上 * Ruby 1.8.x を推奨 == インストール方法 標準のインストールなら % ./configure && make # make install # rootになってから で完了です。必要に応じて configure に設定を与えます。 --with-user=USER quickml runs as USER [root] --with-group=GROUP quickml runs as GROUP [root] --with-pidfile=FILE PID is stored in FILE [/var/run/quickml.pid] --with-logfile=FILE Log is recorded in FILE [/var/log/quickml.log] --with-rubydir=DIR Ruby library files go to DIR [guessed] == 設定 標準のインストールでは、設定ファイルは /usr/local/etc/quickmlrc.sample にあります。設定項目はたくさんあり ますが、変更の必要があるのは次の 3つくらいです。 === :smtp_host メールの配送を任せるメールサーバを指定します。 === :domain メーリングリストのアドレスの @マークの右側を指定します。 === :postmaster エラーメールを送るときの From: のアドレスを指定します。 == サーバの使い方 quickmlサーバは SMTPポート (25番) を利用するため root 権限で 実行する必要があります。 === 起動 # quickml-ctl start === 停止 # quickml-ctl stop === 再起動 # quickml-ctl restart == メーリングリストの使い方 (()) と (()) のページ を、 quickml.comの部分を自分のドメイン名に置き換えて読んでく ださい。 == エラーメールの自動処理 配送用メールサーバとして (()) またはXVERP に対応した (()) を使っている場合は、 エラーメールの自動処理の機能が有効になります。配送用メールサー バからエラーメールが 5通返ってきたアドレスをメーリングリスト から自動的に削除します。 この値は quickmlrc の :auto_unsubscribe_count で変更可能です。 qmail の場合は quickmlrc で :use_qmail_verp = true と設定し てください。Postfix の場合は設定不要です。 == サブドメイン機能 quickml は DNSの wildcard MX を利用して、好きなサブドメイン つきのメーリングリストを作る機能があります。quickml のサブド メイン機能を有効にするためには、あらゆるサブドメイン宛のメー ルを、quickml サーバの動いているホストに配送する必要がありま す。これには DNS の wildcard MX RR (Resource Record) を利用 します。 BIND の設定例を次に紹介します。quickmlサーバは、 ml.pitecan.com (192.168.0.1) で動いているものとします。 $ORIGIN pitecan.com. @ IN MX 10 ml ; 1 * IN MX 10 ml ; 2 ml IN A 192.168.0.1 ; 3 IN MX 10 ml ; 4 === 注釈 (1) @pitecan.com 宛のメールを ml.pitecan.com に向ける (2) 任意の pitecan.com サブドメイン宛のメールを ml.pitecan.com に向ける (3) ml.pitecan.com の IPアドレスの定義 (4) MX RR を定義 == メーリングリストの管理ファイル 標準のインストールでは /usr/local/var/lib/quickml に各メーリ ングリストの管理ファイルが置かれます。基本的には次の 3つのファ イルから構成されます。 * foo: メーリングリストのメンバーリスト * foo,count: メーリングリストのシリアル番号 * foo,keyword: サブメーリングリストのキーワード === 特殊な管理ファイル これらの空ファイルを作成すると、特殊なメーリングリストを作る ことができます。 * foo,permanent: 消滅しないメーリングリスト * foo,forward: 誰でも投稿できるメーリングリスト * foo,unlimited: メンバー数に制限のないメーリングリスト * foo,config: メンバー数やメールサイズなどの制限を設定 == quickml-analog quickml-analog は quickml のログを解析してグラフを作成するツー ルです。gnuplot, ImageMagick, ghostscript が必要です。次のよ うに実行して使います。 % quickml-analog -i -o output-dir quickml.log == quickmlサーバのメーリングリスト quickmlサーバの ((<メーリングリスト|URL:http://namazu.org/~satoru/archives/quickml-server/>)) を作りました。 興味のある方はどうぞ。次のようなメールを送ると参加できます。 Subject: 参加します To: quickml-server@quickml.com Cc: satoru@namazu.org 本文に一言 == QuickMLの誕生 QuickML のアイディアは ((<高林哲|URL:http://namazu.org/~satoru//>))と ((<増井俊之|URL:http://pitecan.com/>)) の雑談から生まれました。quickmlサーバは増井のPerlによるプロ トタイプを高林が Rubyで書き直したものです。サブドメイン機能 の実現方法については ((<竹内奏吾氏|URL:http://www.csl.sony.co.jp/person/sohgo/>)) から助言をもらいました。 -- - (()) - =end quickml-0.7/with-mta.ja.rd0000644000076400007640000000207210061026162011163 =begin = quickmlサーバ: 他のMTAと共存させる方法 最終更新日: 2002-04-28 (公開日: 2002-04-28) == quickmlサーバの設定 1. quickmlサーバを動かす Unixホストにユーザ quickml とグルー プ quickml を作成する。 2. quickmlrc の設定を次のように設定する。 Config = { :user => 'quickml', :group => 'quickml', :port => 10025, :bind_address => "127.0.0.1", == DNSの設定 動かしたいドメイン (例: foobar.com) の MX を quickml サーバ が動いているホストに向ける。 == MTA の設定 === qmail の場合 1. /var/qmail/control/rcpthosts に foobar.com を追加する。 2. /var/qmail/control/smtproutes に foobar.com:localhost:10025 を追加する。 === Postfix の場合 1. /etc/postfix/transport に foobar.com smtp:[localhost:10025] を追加する。 2. /etc/postfix/main.cf に transport_maps = hash:/etc/transport を追加し、次のコマンドを実行する。 # postmap transport # postfix reload == 謝辞 この文書は ((<工藤拓氏|URL:http://cl.aist-nara.ac.jp/~taku-ku/>)) からいただいた情報を元にしています。 -- - (()) - =end quickml-0.7/messages.ja0000644000076400007640000000605110061026162010635 # -*- mode: ruby -*- Messages = { "<%s> was removed from the mailing list:\n<%s>\n" => "<%s> は\nメーリングリスト <%s> から削除されました。\n", "because the address was unreachable.\n" => "メールが届かないためです。\n", "ML will be closed if no article is posted for %d days.\n\n" => "このメーリングリストは %d日以内に投稿がないと消滅します。\n\n", "Time to close: %s.\n\n" => "消滅予定日時: %s\n\n", "%Y-%m-%d %H:%M" => "%Y年%m月%d日 %H時%M分", "You are not a member of the mailing list:\n<%s>\n" => "あなたは <%s> メーリングリストのメンバーではありません。\n", "You are removed from the mailing list:\n<%s>\n" => "あなたは <%s> メーリングリストから削除されました。\n", "by the request of <%s>.\n" => "<%s> が削除をお願いしたためです。\n", "You have unsubscribed from the mailing list:\n<%s>.\n" => "あなたは <%s> メーリングリストから退会しました。", "The following addresses cannot be added because <%s> mailing list reaches the max number of members (%d persons)\n\n" => "<%s> メーリングリストはメンバーの最大人数 (%d人)\nに達したので以下のアドレスは追加できませんでした。\n\n", "Invalid mailing list name: <%s>\n" => "<%s> は正しくないメーリングリスト名です。\n", "You can only use 0-9, a-z, A-Z, `.', `-', and `_' for mailing list name\n" => "メーリングリスト名には 0-9, a-z, A-Z, 「.」「-」「_」だけが使えます。\n", "Sorry, your mail exceeds the limitation of the length.\n" => "申し訳ありません。あなたのメールのサイズは制限を超えました。\n", "The max length is %s bytes.\n\n" => "メールのサイズの制限は %s バイトです。\n\n", "[%s] Unsubscribe: %s" => "[%s] 退会: %s", "[%s] ML will be closed soon" => "[%s] メーリングリスト停止のご案内", "[%s] Removed: <%s>" => "[%s] メンバー削除: <%s>", "Members of <%s>:\n" => "<%s> のメンバー:\n", "How to unsubscribe from the ML:\n" => "このMLを退会する方法:\n", "- Just send an empty message to <%s>.\n" => "- 本文が空のメールを <%s> に送ってください\n", "- Or, if you cannot send an empty message for some reason,\n" => "- 本文が空のメールを送れない場合は、\n", " please send a message just saying 'unsubscribe' to <%s>.\n" => " 本文に「退会」とだけ書いたメールを <%s> に送ってください\n", " (e.g., hotmail's advertisement, signature, etc.)\n" => " (署名やhotmailの広告などがついて空メールを送れない場合など)\n", "[QuickML] Error: %s" => "[QuickML] エラー: %s", "New Member: %s\n" => "新メンバー: %s\n", "Did you send a mail with a different address from the address registered in the mailing list?\n" => "メーリングリストに登録したメールアドレスと異なるアドレスからメールを送信していませんか?\n", "Please check your 'From:' address.\n" => "差出人のメールアドレスを確認してください。\n", "Info: %s\n" => "使い方: %s\n", "----- Original Message -----\n" => "----- 元のメッセージ -----\n", "[%s] Confirmation: %s" => "[%s] 確認: %s", "Please simply reply this mail to create ML <%s>.\n" => "このメールに返信すると <%s> メーリングリストが作られます。\n", } Charset = "iso-2022-jp" CodeconvMethod = :tojis quickml-0.7/quickml.in0000644000076400007640000000356410061026162010515 #! %RUBY% # -*- mode: ruby -*- # # quickml - an easy-to-use mailing list server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # $KCODE = "e" require 'quickml' def error (msg) STDERR.puts "#{$0}: #{msg}" exit(1) end def show_usage puts "Usage: quickml " end def check_directory (dir) error("#{dir}: No such directory") unless File.directory?(dir) error("#{dir}: is not writable") unless File.writable?(dir) end def be_daemon exit!(0) if fork Process::setsid exit!(0) if fork Dir::chdir("/") File::umask(022) STDIN.reopen("/dev/null", "r+") STDOUT.reopen("/dev/null", "r+") STDERR.reopen("/dev/null", "r+") end def touch (filename) File.safe_open(filename, "a").close end def be_secure (config) return unless Process.uid == 0 uid = Etc::getpwnam(config.user).uid gid = Etc::getgrnam(config.group).gid touch(config.pid_file) touch(config.log_file) File.chown(uid, gid, config.data_dir) File.chown(uid, gid, config.pid_file) File.chown(uid, gid, config.log_file) Process.uid = uid Process.gid = gid Process.euid = uid end def main (argv) config_file = if argv.length == 1 then argv.first else File.join("%SYSCONFDIR%", "quickmlrc") end config = QuickML::Config::load(config_file) check_directory(config.data_dir) be_daemon be_secure(config) server = QuickML::Server.new(config) sweeper = QuickML::Sweeper.new(config) trap(:TERM) { server.shutdown; sweeper.shutdown } trap(:INT) { server.shutdown; sweeper.shutdown } trap(:HUP) { config.logger.reopen } t = Thread.new { sweeper.start } t.abort_on_exception = true server.start end main(ARGV) quickml-0.7/quickml-ctl.in0000644000076400007640000000051110061026162011262 #! /bin/sh start() { echo -n "Starting QuickML services: " %SBINDIR%/quickml echo } stop() { echo -n "Stopping QuickML services: " kill `cat %PIDFILE%` echo } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; *) echo "Usage: quickml-ctl {start|stop|restart}" exit 1 esac exit 0 quickml-0.7/quickmlrc.sample.in0000644000076400007640000000150210061026162012310 # -*- mode: ruby -*- Config = { :user => "%USER%", :group => "%GROUP%", :port => 25, :bind_address => "0.0.0.0", :smtp_host => 'mail.example.net', :smtp_port => 25, :domain => 'example.net', :postmaster => "postmaster@example.net", :info_url => "http://QuickML.com/", :data_dir => '%LOCALSTATEDIR%', :pid_file => '%PIDFILE%', :log_file => '%LOGFILE%', :verbose_mode => true, :max_members => 100, :max_mail_length => 100 * 1024, :ml_life_time => 86400 * 31, :ml_alert_time => 86400 * 30, :auto_unsubscribe_count => 5, :sweep_interval => 3600, :max_threads => 10, :timeout => 120, :use_qmail_verp => false, :confirm_ml_creation => false, # for confirming ML creation. (experimental) # :message_catalog => nil # for English messages :message_catalog => '%DATADIR%/messages.ja', } quickml-0.7/quickml-analog.in0000644000076400007640000005633510061026163011761 #! %RUBY% # -*- mode: ruby -*- # # quickml-analog - a tool to analyze quickml's log file. # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # require 'getoptlong' require 'ftools' require 'time' require 'cgi' class Array def tail (n) self[length - n, n] end end class SimpleHtmlGenerator def method_missing (symbol, *args) element = symbol.to_s if block_given? if args.empty? "<#{element}\n>" + yield + "" else "<#{element} " + args.first.map {|key, value| sprintf('%s="%s"', key.to_s, CGI.escapeHTML(value.to_s)) }.join(" ") + "\n>" + yield + "" end else if args.empty? "<#{element} /\n>" else "<#{element} " + args.first.map {|key, value| sprintf('%s="%s"', key.to_s, CGI.escapeHTML(value.to_s)) }.join(" ") + " /\n>" end end end end module QuickMLStatFiles def init_stat_file_names (output_dir) @stat_ml_file = File.join(output_dir, "stat.ml") @stat_user_file = File.join(output_dir, "stat.user") @stat_submit_file = File.join(output_dir, "stat.submit") @stat_ktai_file = File.join(output_dir, "stat.ktai") @stat_mdist_file = File.join(output_dir, "stat.mdist") @stat_mdist2_file = File.join(output_dir, "stat.mdist2") @stat_ldist_file = File.join(output_dir, "stat.ldist") @stat_ldist2_file = File.join(output_dir, "stat.ldist2") end end class QuickMLStat include QuickMLStatFiles def initialize (log_file, cache_file, output_dir) File.mkpath(output_dir) @log_file = log_file @cache_file = cache_file init_stat_file_names(output_dir) @pos = 0 @ml_members = Hash.new @stat_ml = Hash.new @closed_ml_stat = Hash.new @created_ml_stat = Hash.new @stat_submit = Hash.new @stat_user = Hash.new @stat_user_uniq = Hash.new @stat_ktai = Hash.new @stat_ktai[:all] = Hash.new @stat_mdist = [] @stat_ldist = [] @created_time = Hash.new @ml_count = 0 @closed_ml_count = 0 @stat_submit_count = 0 @users_count = 0 @users_count_uniq = 0 @users_uniq_mark = Hash.new @ktai_count = Hash.new @ktai_count.default = 0 end def parse_line (line) if /^(\d\d(\d\d)-(\d\d)-(\d\d)T(\d\d)):\d\d:\d\d: (.*)/ =~ line time = Time.parse($1) timestr = $2 + $3 + $4 + $5 msg = $6 return time, timestr, msg else return nil, nil end end def parse_msg (msg) if /^\[(.*?)\]: (Add|Remove|New ML|ML Closed|Send)(?:: (.*))?/ =~ msg return $1, $2, $3 else return nil, nil, nil end end def drop_hour (date) /(\d\d\d\d\d\d)\d\d/ =~ date return $1 end def stat_of_ndays (stat, ndays) the_day = Time.at(Time.now - 86400 * ndays).strftime("%y%m%d") ndays_stat = Hash.new stat.keys.sort.reverse.each {|date| x = drop_hour(date) if x > the_day ndays_stat[date] = stat[date] else break end } ndays_stat end def write_stat (filename, stat) File.open(filename, "w") {|f| stat.keys.sort.each {|date| f.puts "#{date} #{stat[date]}" } } end def write_stat_ml monthly_stat = stat_of_ndays(@stat_ml, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_ml_file, @stat_ml) write_stat(@stat_ml_file + ".month", monthly_stat) write_stat(@stat_ml_file + ".week", weekly_stat) end def write_stat_ml_closed monthly_stat = stat_of_ndays(@closed_ml_stat, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_ml_file + ".closed", @closed_ml_stat) write_stat(@stat_ml_file + ".month.closed", monthly_stat) write_stat(@stat_ml_file + ".week.closed", weekly_stat) end def write_stat_ml_created monthly_stat = stat_of_ndays(@created_ml_stat, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_ml_file + ".created", @created_ml_stat) write_stat(@stat_ml_file + ".month.created", monthly_stat) write_stat(@stat_ml_file + ".week.created", weekly_stat) end def write_stat_user monthly_stat = stat_of_ndays(@stat_user, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_user_file, @stat_user) write_stat(@stat_user_file + ".month", monthly_stat) write_stat(@stat_user_file + ".week", weekly_stat) end def write_stat_user_uniq monthly_stat = stat_of_ndays(@stat_user_uniq, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_user_file + ".uniq", @stat_user_uniq) write_stat(@stat_user_file + ".month.uniq", monthly_stat) write_stat(@stat_user_file + ".week.uniq", weekly_stat) end def write_stat_submit monthly_stat = stat_of_ndays(@stat_submit, 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_submit_file, @stat_submit) write_stat(@stat_submit_file + ".month", monthly_stat) write_stat(@stat_submit_file + ".week", weekly_stat) end def write_stat_ktai [:docomo, :au, :vodafone, :tuka, :h, :all].each {|carrier| next unless @stat_ktai[carrier] monthly_stat = stat_of_ndays(@stat_ktai[carrier], 31) weekly_stat = stat_of_ndays(monthly_stat, 7) write_stat(@stat_ktai_file + "." + carrier.to_s, @stat_ktai[carrier]) write_stat(@stat_ktai_file + ".month" + "." + carrier.to_s, monthly_stat) write_stat(@stat_ktai_file + ".week" + "." + carrier.to_s, weekly_stat) } end def update_stat_mdist (mlname, stat_mdist = @stat_mdist) return if @ml_members[mlname].nil? nmembers = @ml_members[mlname].length stat_mdist[nmembers] = 0 if stat_mdist[nmembers].nil? stat_mdist[nmembers] += 1 end def write_stat_mdist stat_mdist2 = [] # active ml only @ml_members.keys.each {|mlname| update_stat_mdist(mlname) update_stat_mdist(mlname, stat_mdist2) } [ [@stat_mdist_file, @stat_mdist], [@stat_mdist2_file, stat_mdist2]].each {|stat_mdist_file, stat_mdist| File.open(stat_mdist_file, "w") {|f| stat_mdist.each_with_index {|x, i| next unless i >= 1 && i <= 100 if i and x f.printf "%d %d\n", i, x end } } } end def write_stat_ldist f1 = File.open(@stat_ldist_file, "w") f2 = File.open(@stat_ldist2_file, "w") # To start X axis with one in ldist2, don't write it to f2. f1.puts "0 0" @stat_ldist.each_with_index {|x, i| if i and x f1.printf "%d %d\n", i, x f2.printf "%d %d\n", i, x end } f1.close f2.close end def update_stat_ktai (address, x) if /@docomo\.ne\.jp$/ =~ address @ktai_count[:docomo] += x elsif /[a-z]\d\.ezweb\.ne\.jp$/ =~ address @ktai_count[:tuka] += x elsif /@ezweb\.ne\.jp$/ =~ address @ktai_count[:au] += x elsif /@(jp-[a-z]\.ne\.jp|.\.vodafone\.ne\.jp)$/ =~ address @ktai_count[:vodafone] += x elsif /[.@]pdx\.ne\.jp$/ =~ address @ktai_count[:h] += x end end def add (mlname, address) @ml_members[mlname] = [] if @ml_members[mlname].nil? return if @ml_members[mlname].include?(address) @ml_members[mlname].push(address) @users_count += 1 if @users_uniq_mark[address] @users_uniq_mark[address] += 1 else @users_uniq_mark[address].nil? or @users_uniq_mark[address] <= 0 @users_uniq_mark[address] = 1 @users_count_uniq += 1 update_stat_ktai(address, +1) end end def remove (mlname, address) @ml_members[mlname].delete(address) if @ml_members[mlname] @users_count -= 1 return if @users_uniq_mark[address].nil? @users_uniq_mark[address] -= 1 if @users_uniq_mark[address] > 0 if @users_uniq_mark[address] == 0 @users_count_uniq -= 1 update_stat_ktai(address, -1) end end def update_stat_ldist (mlname, time) return if @ml_members[mlname].nil? return if @created_time[mlname].nil? ndays = ((time - @created_time[mlname]) / 86400).to_i nmonths = ndays / 32 + 1 @stat_ldist[nmonths] = 0 if @stat_ldist[nmonths].nil? @stat_ldist[nmonths] += 1 end def update_stat (time, timestr, mlname, command, address) case command when "Add" add(mlname, address) when "Remove" remove(mlname, address) when "New ML" @ml_members[mlname] = [] @ml_count += 1 @created_time[mlname] = time when "ML Closed" update_stat_mdist(mlname) update_stat_ldist(mlname, time) if @ml_members[mlname] @ml_members[mlname].each {|address| remove(mlname, address) } end @ml_members.delete(mlname) @ml_count -= 1 @closed_ml_count += 1 when "Send" @stat_submit_count += 1 @stat_submit[timestr] = @stat_submit_count end @stat_user[timestr] = @users_count @stat_user_uniq[timestr] = @users_count_uniq @stat_ml[timestr] = @ml_count @closed_ml_stat[timestr] = @closed_ml_count @created_ml_stat[timestr] = @stat_ml[timestr] + @closed_ml_stat[timestr] ktai_all = 0 [:docomo, :au, :vodafone, :tuka, :h].each {|carrier| @stat_ktai[carrier] = Hash.new unless @stat_ktai[carrier] @stat_ktai[carrier][timestr] = @ktai_count[carrier] ktai_all += @ktai_count[carrier] } @stat_ktai[:all][timestr] = ktai_all end def dump Marshal::dump(self, File.open(@cache_file, "w")) end def refresh (log_file, cache_file, output_dir) @log_file = log_file @cache_file = cache_file init_stat_file_names(output_dir) end def process STDERR.puts "Analyzing the log file..." f = File.new(@log_file) f.seek(@pos) prev = nil while line = f.gets time, timestr, msg, address = parse_line(line) if timestr and msg STDERR.puts time if prev and prev.day < time.day prev = time mlname, command, address = parse_msg(msg) if mlname and command update_stat(time, timestr, mlname, command, address) end end end STDERR.puts "Writing statistics files..." write_stat_ml write_stat_ml_closed write_stat_ml_created write_stat_user write_stat_user_uniq write_stat_submit write_stat_ktai write_stat_mdist write_stat_ldist @pos = f.pos dump end end class QuickMLPlot include QuickMLStatFiles def initialize (output_dir, generate_png_p) @output_dir = output_dir @generate_png_p = generate_png_p init_stat_file_names(output_dir) @gnuplot_file = File.join(output_dir, "quickml-analog.gp") property = Struct.new("Property", :size, :font_size, :infix, :format, :xlabel) @large = property.new(2.40, 40, "", "%y/%m", nil) @small = property.new(0.72, 20, ".s", "%m", nil) @languages = [:en, :ja] end def add_basic (f) f.print ' set grid set timefmt "%y%m%d%H" set xdata time set size ratio 0.76 set linestyle 1 linetype 1 linewidth 5 set linestyle 2 linetype 3 linewidth 5 set linestyle 3 linetype 2 linewidth 5 set linestyle 4 linetype 4 linewidth 5 set linestyle 5 linetype 5 linewidth 5 set linestyle 6 linetype 7 linewidth 5 '.gsub(/^ /, "") end def add_chart (f, default, lang, chart_prefix, stat_files, type, options = {}) stat_files.each {|file, title| file = File.join(@output_dir, file) return unless File.exists?(file) return if File.size(file) == 0 } f.printf(%Q(set size %f\n), default.size) unless options[:size] f.printf(%Q(set terminal postscript eps color "Helvetica" %d\n), default.font_size) unless options[:font_size] f.printf(%Q(set format x "%s"\n), default.format) unless options[:format] options.each {|key, value| if value.kind_of?(String) f.printf(%Q(set %s "%s"\n), key.to_s, value) elsif value.kind_of?(Integer) f.printf(%Q(set %s %d\n), key.to_s, value) elsif value.kind_of?(Symbol) f.printf(%Q(set %s %s\n), key.to_s, value.to_s) elsif value == nil f.printf(%Q(set %s\n), key.to_s) end } f.printf(%Q(set output "%s/%s%s.eps"\n), lang, chart_prefix, default.infix) f.printf("plot ") i = 0 f.print stat_files.map {|file, title| i += 1 sprintf(%Q("%s" using 1:2 title "%s" with %s ls %d), file, title, type, i) }.join(",\\\n ") + "\n" f.puts end def add_stat_common (f, chart_prefix, infix, stat_files_table, title_table) small = @small.clone large = @large.clone xlabel_table = Hash.new xlabel_table[:md] = { :en => "Month/Day", :ja => "$B7n(B/$BF|(B" } xlabel_table[:d] = { :en => "Day", :ja => "$BF|(B" } xlabel_table[:m] = { :en => "Month", :ja => "$B7n(B" } xlabel_table[:ym] = { :en => "Year/Month", :ja => "$BG/(B/$B7n(B" } [:en, :ja].each {|lang| if infix == ".month" small.format = large.format = "%m/%d" small.xlabel = large.xlabel = xlabel_table[:md][lang] elsif infix == ".week" small.format = "%d" large.format = "%m/%d" small.xlabel = xlabel_table[:d][lang] large.xlabel = xlabel_table[:md][lang] else small.format = "%m" large.format = "%y/%m" small.xlabel = xlabel_table[:m][lang] large.xlabel = xlabel_table[:ym][lang] end stat_files = stat_files_table[lang] [small, large].each {|default| add_chart(f, default, lang, chart_prefix, stat_files, "lines", :title => title_table[lang], :xlabel => default.xlabel) } } end def add_stat_ml (f) ["", ".month", ".week"].each {|infix| basename = File.basename(@stat_ml_file) title_table = { :en => "Number of Mailing Lists", :ja => "$B%a!<%j%s%0%j%9%H$N?t(B" } stat_files_table = { :en => [ ["#{basename}#{infix}.created", "Created ML"], ["#{basename}#{infix}", "Active ML"], ["#{basename}#{infix}.closed", "Closed ML"]], :ja => [ ["#{basename}#{infix}.created", "$B3+@_(BML"], ["#{basename}#{infix}", "$B3hH/(BML"], ["#{basename}#{infix}.closed", "$BJD:?(BML"]] } add_stat_common(f, "#{basename}#{infix}", infix, stat_files_table, title_table) } end def add_stat_user (f) ["", ".month", ".week"].each {|infix| basename = File.basename(@stat_user_file) title_table = { :en => "Number of Users", :ja => "$B%f!<%6?t(B" } stat_files_table = { :en => [ ["#{basename}#{infix}", "Number of users"], ["#{basename}#{infix}.uniq", "Number of users (unique)"]], :ja => [ ["#{basename}#{infix}", "$B%f!<%6(B"], ["#{basename}#{infix}.uniq", "$B=EJ#$J$7%f!<%6(B"]] } add_stat_common(f, "#{basename}#{infix}", infix, stat_files_table, title_table) } end def add_stat_ktai (f) ["", ".month", ".week"].each {|infix| basename = File.basename(@stat_ktai_file) title_table = { :en => "Number of Mobile Phone Users", :ja => "$B7HBSEEOC$N%f!<%6?t(B" } stat_files_table = { :en => [ ["#{basename}#{infix}.docomo", "DoCoMo"], ["#{basename}#{infix}.vodafone", "vodafone"], ["#{basename}#{infix}.au", "au"], ["#{basename}#{infix}.h", "DDI POCKET"], ["#{basename}#{infix}.tuka", "TUKA"], ["#{basename}#{infix}.all", "Mobile phones (total)"]], :ja => [ ["#{basename}#{infix}.docomo", "DoCoMo"], ["#{basename}#{infix}.vodafone", "vodafone"], ["#{basename}#{infix}.au", "au"], ["#{basename}#{infix}.h", "DDI POCKET"], ["#{basename}#{infix}.tuka", "TUKA"], ["#{basename}#{infix}.all", "$B7HBSEEOC(B($B9g7W(B)"]] } add_stat_common(f, "#{basename}#{infix}", infix, stat_files_table, title_table) } end def add_stat_submit (f) ["", ".month", ".week"].each {|infix| basename = File.basename(@stat_submit_file) title_table = { :en => "Number of Submissions", :ja => "$BEj9F?t(B" } stat_files_table = { :en => [ ["#{basename}#{infix}", "Number of submissions"]], :ja => [ ["#{basename}#{infix}", "$BEj9F?t(B"]], } add_stat_common(f, "#{basename}#{infix}", infix, stat_files_table, title_table) } end def add_stat_ldist (f) [ @stat_ldist_file, @stat_ldist2_file].each {|stat_file| basename = File.basename(stat_file) stat_files = [[basename, ""]] title_table = { :en => "Distribution of Lifetime of Mailing Lists", :ja => "$B "Number of mailing lists", :ja => "$B%a!<%j%s%0%j%9%H?t(B" } xlabel_table = { :en => "ML lifetime (months)", :ja => "$B 1, :small => 5} if basename == "stat.ldist" type = "boxes" logscale_p = false else type = "lines" logscale_p = true end [:en, :ja].each {|lang| [:small, :large].each {|size| default = if size == :large then @large else @small end options = { :title => title_table[lang], :xtics => xtics_table[size], :xdata => nil, "format x".intern => nil, :ylabel => ylabel_table[lang], :xlabel => xlabel_table[lang] } options[:logscale] = :y if logscale_p add_chart(f, default, lang, basename, stat_files, type, options) } } } end def add_stat_mdist (f) [@stat_mdist_file, @stat_mdist2_file].each {|stat_file| basename = File.basename(stat_file) stat_files = [[basename, ""]] title_table = { :en => "Distribution of Number of Members", :ja => "$B%a%s%P! "Number of mailing lists", :ja => "$B%a!<%j%s%0%j%9%H?t(B" } xlabel_table = { :en => "Number of members", :ja => "$B%a%s%P! nil, # to cancel the setting set before :title => title_table[lang], :xtics => 10, :xdata => nil, "format x".intern => nil, :ylabel => ylabel_table[lang], :xlabel => xlabel_table[lang] } add_chart(f, default, lang, basename, stat_files, type, options) } } } end def image_link (g, image_prefix) g.a(:href => image_prefix + ".png") { g.img(:src => image_prefix + ".s.png", :alt=> "[chart]") } end def generate_index_html title = "QuickML Log Analysis" g = SimpleHtmlGenerator.new g.html { g.head { g.title { title } } + g.body { g.h1 { title } + g.hr + g.h2 { "Number of Mailing Lists" } + g.p { ["", ".month", ".week"].map {|infix| image_prefix = File.basename(@stat_ml_file + infix) image_link(g, image_prefix) }.join('') } + g.h2 { "Number of Users" } + g.p { ["", ".month", ".week"].map {|infix| image_prefix = File.basename(@stat_user_file + infix) image_link(g, image_prefix) }.join('') } + g.h2 { "Number of Mobile Phone Users" } + g.p { ["", ".month", ".week"].map {|infix| image_prefix = File.basename(@stat_ktai_file + infix) image_link(g, image_prefix) }.join('') } + g.h2 { "Number of Submissions" } + g.p { ["", ".month", ".week"].map {|infix| image_prefix = File.basename(@stat_submit_file + infix) image_link(g, image_prefix) }.join('') } + g.h2 { "Lifetime of Mailing Lists" } + g.p { image_prefix1 = File.basename(@stat_ldist_file) image_prefix2 = File.basename(@stat_ldist2_file) image_link(g, image_prefix1) + image_link(g, image_prefix2) } + g.h2 { "Distribution of Number of Members" } + g.p { image_prefix1 = File.basename(@stat_mdist_file) image_prefix2 = File.basename(@stat_mdist2_file) image_link(g, image_prefix1) + image_link(g, image_prefix2) } + g.hr + g.p { "Generated on " + Time.now.to_s } } } end def process @languages.each {|lang| File.mkpath(File.join(@output_dir, lang.to_s)) } STDERR.puts "Generating a gnuplot script..." File.open(@gnuplot_file, "w") {|f| add_basic(f) add_stat_ml(f) add_stat_user(f) add_stat_ktai(f) add_stat_submit(f) add_stat_ldist(f) add_stat_mdist(f) } STDERR.puts "Generating EPS files using gnuplot..." Dir.chdir(@output_dir) file = File.basename(@gnuplot_file) system("gnuplot #{file}") if @generate_png_p html = generate_index_html @languages.each {|lang| STDERR.puts "Generating PNG files using ImageMagick for #{lang}..." Dir.chdir(lang.to_s) system("for i in *.eps; do convert $i `basename $i .eps`.png; done") File.new("index.html", "w").write(html) Dir.chdir("..") } end end end def show_help puts "Usage: quickml-analog [OPTION...] FILE" puts " -o, --output-dir=DIR output files to DIR" puts " -g, --gnuplot draw charts in EPS using gnuplot" puts " -i, --imagemagick generate charts in PNG using ImageMagick" puts " -f, --force force analyzing (don't reuse cache data)" exit end def parse_options options = Hash.new parser = GetoptLong.new parser.set_options(['--output-dir', '-o', GetoptLong::REQUIRED_ARGUMENT], ['--gnuplot', '-g', GetoptLong::NO_ARGUMENT], ['--help', '-h', GetoptLong::NO_ARGUMENT], ['--imagemagick', '-i', GetoptLong::NO_ARGUMENT], ['--force', '-f', GetoptLong::NO_ARGUMENT]) parser.each_option {|name, arg| name.sub!(/^--/, "") options[name] = arg } return options end def main options = parse_options output_dir = (options['output-dir'] or ".") show_help if ARGV.empty? or options['help'] log_file = ARGV.first cache_file = File.join(output_dir, "quickml-analog.dump") if File.exist?(cache_file) and !options['force'] STDERR.puts "Loading the cache file..." stat = Marshal::load(File.new(cache_file)) stat.refresh(log_file, cache_file, output_dir) else stat = QuickMLStat.new(log_file, cache_file, output_dir) end stat.process if options['gnuplot'] or options['imagemagick'] plot = QuickMLPlot.new(output_dir, options['imagemagick']) plot.process end end main quickml-0.7/lib/0000777000076400007640000000000010061420670007344 5quickml-0.7/lib/Makefile.am0000644000076400007640000000014110061026163011307 SUBDIRS = quickml rubylibdir = $(rubydir) rubylib_DATA = quickml.rb EXTRA_DIST = $(rubylib_DATA) quickml-0.7/lib/Makefile.in0000644000076400007640000003225110061040660011325 # Makefile.in generated by automake 1.8.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(mkdir_p) CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive am__installdirs = "$(DESTDIR)$(rubylibdir)" rubylibDATA_INSTALL = $(INSTALL_DATA) DATA = $(rubylib_DATA) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ GROUP = @GROUP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LOGFILE = @LOGFILE@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PIDFILE = @PIDFILE@ RUBY = @RUBY@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USER = @USER@ VERSION = @VERSION@ ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ rubydir = @rubydir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = quickml rubylibdir = $(rubydir) rubylib_DATA = quickml.rb EXTRA_DIST = $(rubylib_DATA) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-rubylibDATA: $(rubylib_DATA) @$(NORMAL_INSTALL) test -z "$(rubylibdir)" || $(mkdir_p) "$(DESTDIR)$(rubylibdir)" @list='$(rubylib_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(rubylibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(rubylibdir)/$$f'"; \ $(rubylibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(rubylibdir)/$$f"; \ done uninstall-rubylibDATA: @$(NORMAL_UNINSTALL) @list='$(rubylib_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f '$(DESTDIR)$(rubylibdir)/$$f'"; \ rm -f "$(DESTDIR)$(rubylibdir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="../$(top_distdir)" \ distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(rubylibdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-rubylibDATA install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-rubylibDATA uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-recursive ctags ctags-recursive \ distclean distclean-generic distclean-recursive distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-rubylibDATA install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am uninstall-rubylibDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: quickml-0.7/lib/quickml.rb0000644000076400007640000000033710061026163011254 require 'quickml/utils' require 'quickml/config' require 'quickml/core' require 'quickml/gettext' require 'quickml/logger' require 'quickml/mail' require 'quickml/server' require 'quickml/sweeper' require 'quickml/version' quickml-0.7/lib/quickml/0000777000076400007640000000000010061420670011011 5quickml-0.7/lib/quickml/Makefile.am0000644000076400007640000000055410061026163012764 rubylib_files = config.rb gettext.rb mail.rb sweeper.rb \ core.rb logger.rb server.rb utils.rb rubylibdir = $(rubydir)/quickml rubylib_DATA = $(rubylib_files) version.rb EXTRA_DIST = $(rubylib_files) version.rb.in CLEANFILES = version.rb version.rb: version.rb.in rm -f version.rb sed -e 's!%VERSION%!$(VERSION)!g' \ version.rb.in > version.rb quickml-0.7/lib/quickml/Makefile.in0000644000076400007640000002103310061040660012766 # Makefile.in generated by automake 1.8.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = lib/quickml DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(mkdir_p) CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__installdirs = "$(DESTDIR)$(rubylibdir)" rubylibDATA_INSTALL = $(INSTALL_DATA) DATA = $(rubylib_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ GROUP = @GROUP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LOGFILE = @LOGFILE@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PIDFILE = @PIDFILE@ RUBY = @RUBY@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USER = @USER@ VERSION = @VERSION@ ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ rubydir = @rubydir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ rubylib_files = config.rb gettext.rb mail.rb sweeper.rb \ core.rb logger.rb server.rb utils.rb rubylibdir = $(rubydir)/quickml rubylib_DATA = $(rubylib_files) version.rb EXTRA_DIST = $(rubylib_files) version.rb.in CLEANFILES = version.rb all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/quickml/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/quickml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-rubylibDATA: $(rubylib_DATA) @$(NORMAL_INSTALL) test -z "$(rubylibdir)" || $(mkdir_p) "$(DESTDIR)$(rubylibdir)" @list='$(rubylib_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(rubylibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(rubylibdir)/$$f'"; \ $(rubylibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(rubylibdir)/$$f"; \ done uninstall-rubylibDATA: @$(NORMAL_UNINSTALL) @list='$(rubylib_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f '$(DESTDIR)$(rubylibdir)/$$f'"; \ rm -f "$(DESTDIR)$(rubylibdir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(rubylibdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-rubylibDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-rubylibDATA .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-rubylibDATA install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-info-am uninstall-rubylibDATA version.rb: version.rb.in rm -f version.rb sed -e 's!%VERSION%!$(VERSION)!g' \ version.rb.in > version.rb # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: quickml-0.7/lib/quickml/config.rb0000644000076400007640000000501210061026163012514 # # quickml/config - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # require 'quickml/utils' require 'quickml/logger' require 'quickml/gettext' module QuickML class Config def initialize (config = {}) @data_dir = config[:data_dir] @smtp_host = config[:smtp_host] @domain = config[:domain] raise ArgumentError if @data_dir.nil? raise ArgumentError if @smtp_host.nil? raise ArgumentError if @domain.nil? @smtp_port = (config[:smtp_port] or 25) @postmaster = (config[:postmaster] or "postmaster@#{domain}") @info_url = (config[:info_url] or "http://QuickML.com/") @pid_file = (config[:pid_file] or "/var/run/quickml.pid") @max_members = (config[:max_members] or 100) @max_mail_length = (config[:max_mail_length] or 100 * 1024) # 100KB @max_ml_mail_length = @max_mail_length @ml_life_time = (config[:ml_life_time] or 86400 * 30) @ml_alert_time = (config[:ml_alert_time] or 86400 * 29) @sweep_interval = (config[:sweep_interval] or 3600) @allowable_error_interval = (config[:allowable_error_interval] or 8600) @max_threads = (config[:max_threads] or 10) # number of working threads @timeout = (config[:timeout] or 120) @auto_unsubscribe_count = (config[:auto_unsubscribe_count] or 5) @log_file = (config[:log_file] or "/var/log/quickml-log") verbose_mode = config[:verbose_mode] @logger = Logger.new(@log_file, verbose_mode) @ml_mutexes = Hash.new @catalog = if config[:message_catalog] GetText::Catalog.new(config[:message_catalog]) else nil end @port = (config[:port] or 25) @bind_address = (config[:bind_address] or "0.0.0.0") @user = (config[:user] or "root") @group = (config[:group] or "root") @use_qmail_verp = (config[:use_qmail_verp] or false) charset = @catalog.charset if @catalog @content_type = "text/plain" @confirm_ml_creation = (config[:confirm_ml_creation] or false) instance_variables.each {|name| self.class.class_eval { attr_reader name.delete('@') } } end def ml_mutex (address) @ml_mutexes.fetch(address) {|x| @ml_mutexes[x] = Mutex.new } end def self.load (filename) self.new(eval(File.safe_open(filename).read)) end end end quickml-0.7/lib/quickml/gettext.rb0000644000076400007640000000557410061026163012750 # # quickml/gettext - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # module QuickML module GetText module GetText def codeconv (text) if @catalog && @catalog.codeconv_method text.send(@catalog.codeconv_method) else text end end def gettext (text, *args) unless @catalog && @catalog.charset == @message_charset return sprintf(text, *args) end translated_message = @catalog.messages[text] if translated_message codeconv(sprintf(translated_message, *args)) else sprintf(text, *args) end end def gettext2 (text) unless @catalog && @catalog.charset == @message_charset return text end translated_message = @catalog.messages[text] if translated_message codeconv(translated_message) else text end end alias :_ :gettext alias :__ :gettext2 end class Catalog def initialize (filename) load(filename) @messages = Messages @codeconv_method = CodeconvMethod @charset = Charset end attr_reader :messages attr_reader :codeconv_method attr_reader :charset end class MessageValidator def initialize (catalog, source_filename) @catalog = catalog @source_filename = source_filename @has_error = false end def read_file_with_numbering (filename) content = '' File.open(filename).each_with_index {|line, idx| lineno = idx + 1 content << line.gsub(/\b_\(/, "_[#{lineno}](") } content end def collect_messages (content) messages = [] while content.sub!(/\b_\[(\d+)\]\((".*?").*?\)/m, "") lineno = $1.to_i message = eval($2) messages.push([lineno, message]) end messages end def validate @catalog or return content = read_file_with_numbering(@source_filename) messages = collect_messages(content) messages.each {|lineno, message| translated_message = @catalog.messages[message] if not translated_message printf "%s:%d: %s\n", @source_filename, lineno, message.inspect @has_error = true elsif message.count("%") != translated_message.count("%") printf "%s:%d: %s => # of %% mismatch.\n", @source_filename, lineno, message.inspect, translated_message @has_error = true end } end def ok? not @has_error end end end end if __FILE__ == $0 include QuickML::GetText if ARGV.length < 2 puts "usage: ruby gettext.rb " exit end catalog_file = ARGV.shift catalog = Catalog.new(catalog_file) ok = true ARGV.each {|source_file| validator = MessageValidator.new(catalog, source_file) validator.validate ok = (ok and validator.ok?) } if ok then exit else exit(1) end end quickml-0.7/lib/quickml/mail.rb0000644000076400007640000001642110061026163012177 # # quickml/mail - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # require 'kconv' module QuickML class MailSender def initialize (smtp_host, smtp_port, use_xverp = false) @smtp_port = smtp_port @smtp_host = smtp_host @use_xverp = use_xverp @xverp_available = false end def send (message, mail_from, recipients) recipients = [recipients] if recipients.kind_of?(String) s = TCPSocket.open(@smtp_host, @smtp_port) send_command(s, nil, 220) send_command(s, "EHLO #{Socket.gethostname}", 250) if @use_xverp and @xverp_available and (not mail_from.empty?) send_command(s, "MAIL FROM: <#{mail_from}> XVERP===", 250) else send_command(s, "MAIL FROM: <#{mail_from}>", 250) end recipients.each {|recipient| send_command(s, "RCPT TO: <#{recipient}>", 250) } send_command(s, "DATA", 354) message.each_line {|line| line.sub!(/\r?\n/, '') line.sub!(/^\./, "..") line << "\r\n" s.print(line) } send_command(s, ".", 250) send_command(s, "QUIT", 221) s.close end private def send_command (s, command, code) s.print(command + "\r\n") if command begin line = s.gets @xverp_available = true if /^250-XVERP/.match(line) end while line[3] == ?- return_code = line[0,3].to_i if return_code == code line else raise "smtp-error: #{command} => #{line}" end end end class Mail def initialize @mail_from = nil @recipients = [] @header = [] @body = "" @charset = nil @content_type = nil @bare = nil end attr_reader :recipients attr_reader :charset attr_reader :content_type attr_accessor :mail_from attr_accessor :body attr_accessor :bare private def get_content_type if %r!([-\w]+/[-\w]+)! =~ self["Content-Type"] $1.downcase else nil end end def get_charset if /charset=("?)([-\w]+)\1/ =~ self["Content-Type"] $2.downcase else nil end end def remove_comment_in_field (field) field = field.toeuc true while field.sub!(/\([^()]*?\)/, "") field end # foo@QuickML.CoM => foo@quickml.com # "foo"@example.com => foo@example.com def normalize_address (address) name, domain = address.split('@') name.gsub!(/^"(.*)"$/, '\1') if domain name + "@" + domain.downcase else address end end def collect_address (field) address_regex = /(("?)[-0-9a-zA-Z_.+?\/]+\2@[-0-9a-zA-Z]+\.[-0-9a-zA-Z.]+)/ #/ addresses = [] parts = remove_comment_in_field(field).split(',') parts.each {|part| if (/<(.*?)>/ =~ part) or (address_regex =~ part) addresses.push(normalize_address($1)) end } addresses.uniq end public def to_s str = "" each_field {|key, value| str << sprintf("%s: %s\n", key, value) } str << "\n" str << @body str end def parts parts = @body.split(/^--#{Regexp.escape(self.boundary)}\n/) parts.shift # Remove the first empty string. parts end def add_recipient (address) @recipients.push(normalize_address(address)) end def clear_recipients @recipients = [] end def [] (key) field = @header.find {|field| key.downcase == field.first.downcase} if field then field.last else "" end end def unshift_field (key, value) field = [key, value] # Use Array for preserving order of the header @header.unshift(field) end def push_field (key, value) field = [key, value] # Use Array for preserving order of the header @header.push(field) end def concat_field (value) lastfield = @header.last @header.pop push_field(lastfield.first, lastfield.last + "\n" + value) end def each_field @header.each {|field| yield(field.first, field.last) } end def looping? !self["X-QuickML"].empty? end def from address = if not self["From"].empty? collect_address(self["From"]).first else @mail_from end address = "unknown" if address.nil? or address.empty? normalize_address(address) end def collect_cc if self["Cc"] collect_address(self["Cc"]) else [] end end def collect_to if self["To"] collect_address(self["To"]) else [] end end def valid? (not @recipients.empty?) and @mail_from end def empty_body? return false if @body.length > 100 /\A[\s ]*\Z/ =~ @body.toeuc # including Japanese zenkaku-space. end def multipart? %r!^multipart/mixed;\s*boundary=("?)(.*)\1!i =~ self["Content-Type"] #" end def boundary if %r!^multipart/mixed;\s*boundary=("?)(.*)\1!i =~ self["Content-Type"]#" $2 else nil end end def read (string) header, body = string.split(/\n\n/, 2) attr = nil header.split("\n").each {|line| line.xchomp! if /^(\S+):\s*(.*)/=~ line attr = $1 push_field(attr, $2) elsif attr concat_field(line) end } @bare = string @charset = get_charset @content_type = get_content_type @body = (body or "") end class << self def send_mail (smtp_host, smtp_port, logger, optional = {}) mail_from = optional[:mail_from] recipients = optional[:recipients] header = optional[:header] body = optional[:body] if optional[:recipient] raise unless optional[:recipient].kind_of?(String) recipients = [optional[:recipient]] end raise if mail_from.nil? or recipients.nil? or body.nil? or header.nil? contents = "" header.each {|field| key = field.first; value = field.last contents << "#{key}: #{value}\n" if key.kind_of?(String) } contents << "\n" contents << body begin sender = MailSender.new(smtp_host, smtp_port, true) sender.send(contents, mail_from, recipients) rescue => e logger.log "Error: Unable to send mail: #{e.class}: #{e.message}" end end def address_of_domain? (address, domain) domainpat = Regexp.new('[.@]' + Regexp.quote(domain) + '$', #' Regexp::IGNORECASE) if domainpat =~ address then true else false end end def encode_field (field) field.toeuc.gsub(/[ -瑤]\S*\s*/) {|x| x.scan(/.{1,10}/).map {|y| "=?iso-2022-jp?B?" + y.tojis.to_a.pack('m').chomp + "?=" }.join("\n ") } end def decode_subject (subject) NKF.nkf("-e", subject.gsub(/\n\s*/, " ")) end def clean_subject (subject) subject = Mail.decode_subject(subject) subject.gsub!(/(?:\[[^\]]+:\d+\])/, "") subject.sub!(/(?:Re:\s*)+/i, "Re: ") return subject end def rewrite_subject (subject, name, count) subject = Mail.clean_subject(subject) subject = "[#{name}:#{count}] " + subject Mail.encode_field(subject) end def join_parts (parts, boundary) body = "" body << sprintf("--%s\n", boundary) body << parts.join("--#{boundary}\n") body end end end end quickml-0.7/lib/quickml/sweeper.rb0000644000076400007640000000343710061026163012732 # # quickml/sweeper - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # module QuickML class Sweeper def initialize (config) @config = config @status = :safe @logger = @config.logger end private def mlname (filename) File.basename(filename) end def mladdress (name) address = name address += if name.include?("@") then "." else "@" end address += @config.domain end def ml_file? (filename) File.file?(filename) && QuickML.valid_name?(mlname(filename)) end def sweep_ml (ml) if ml.inactive? @logger.log "[#{ml.name}]: Inactive" ml.close elsif ml.need_alert? ml.report_ml_close_soon end end def sweep @status = :sweeping @logger.vlog "Sweeper runs" Dir.new(@config.data_dir).each {|filename| filename = File.join(@config.data_dir, filename) if ml_file?(filename) address = mladdress(mlname(filename)) @config.ml_mutex(address).synchronize { ml = QuickML.new(@config, address) ml.write_ml_config unless ml.ml_config_exist? sweep_ml(ml) } end } @logger.vlog "Sweeper finished" @status = :safe end public def start @logger.vlog "Sweeper started" loop do sleep(@config.sweep_interval) begin sweep rescue Exception => e @logger.log "Unknown Sweep Error: #{e.class}: #{e.message}" @logger.log e.backtrace end end end def shutdown until @status == :safe sleep(0.5) end @logger.vlog "Sweeper shutdown" end end end quickml-0.7/lib/quickml/core.rb0000644000076400007640000007011410061417117012207 # # quickml/core - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # $KCODE='e' require 'quickml/utils' require 'quickml/gettext' module QuickML class QuickMLException < StandardError; end class TooLargeMail < QuickMLException; end class TooManyMembers < QuickMLException; end class InvalidMLName < QuickMLException; end # It preserves case information. but it accepts an # address case-insensitively for member management. class IcaseArray < Array def include? (item) if self.find {|x| x.downcase == item.downcase } true else false end end def delete (item) self.replace(self.find_all {|x| x.downcase != item.downcase }) end end class IcaseHash < Hash def include? (key) super(key.downcase) end def delete (key) super(key.downcase) end def [] (key) super(key.downcase) end def []= (key, value) super(key.downcase, value) end end class ErrorInfo def initialize (count = 0, last_error_time = Time.at(0)) @count = count @last_error_time = last_error_time end attr_reader :count attr_reader :last_error_time def inc_count @count += 1 @last_error_time = Time.now end end class QuickML include GetText::GetText def initialize (config, address, creator = nil, message_charset = nil) @config = config @address = address @name = get_name(@address) raise InvalidMLName unless QuickML.valid_name?(@name) @short_name = @name.split("@").first @return_address = generate_return_address @members_file = File.join(@config.data_dir, @name) @count_file = File.join(@config.data_dir, @name + ",count") @forwardp_file = File.join(@config.data_dir, @name + ",forward") @alertedp_file = File.join(@config.data_dir, @name + ",alerted") @permanentp_file = File.join(@config.data_dir, @name + ",permanent") @unlimitedp_file = File.join(@config.data_dir, @name + ",unlimited") @charset_file = File.join(@config.data_dir, @name + ",charset") @ml_config_file = File.join(@config.data_dir, @name + ",config") @waiting_members_file = File.join(@config.data_dir, @name + ",waiting-members") @waiting_message_file = File.join(@config.data_dir, @name + ",waiting-message") @member_added_p = false @added_members = [] @logger = @config.logger @catalog = @config.catalog init_ml_config init_members init_count init_charset @message_charset = (message_charset or @charset) @logger.log "[#{@name}]: New ML by #{creator}" if newly_created? end attr_reader :name attr_reader :short_name attr_reader :active_members attr_reader :former_members attr_reader :address attr_reader :return_address attr_reader :count attr_reader :charset attr_reader :max_members def self.valid_name? (name) /^([0-9a-zA-Z_.-]+)(@[0-9a-zA-Z_.-]+)?$/ =~ name end private def init_ml_config ml_config = Hash.new begin eval(File.open(@ml_config_file).read).each {|key, value| ml_config[key] = value } rescue Exception end @max_members = (ml_config[:max_members] or @config.max_members) @max_mail_length = (ml_config[:max_mail_length] or @config.max_ml_mail_length or @config.max_mail_length) @ml_life_time = (ml_config[:ml_life_time] or @config.ml_life_time) @ml_alert_time = (ml_config[:ml_alert_time] or @config.ml_alert_time) @auto_unsubscribe_count = (ml_config[:auto_unsubscribe_count] or @config.auto_unsubscribe_count) write_ml_config end def confirmation_address sprintf("confirm+%d+%s", File.mtime(@waiting_message_file).to_i, @address) end def generate_return_address raise unless @address raise unless @short_name domain_part = @address.split("@").last if @config.use_qmail_verp # e.g. @short_name + "=return=" + "@" + domain_part + "-@[]" else # e.g. @short_name + "=return" + "@" + domain_part end end def last_article_time if File.file?(@count_file) then File.mtime(@count_file) else Time.now end end def get_name (address) raise InvalidMLName if /@.*@/ =~ address name, host = address.split("@") if host.nil? return name else fqdn = host.downcase domainpat = Regexp.new('^(.*)' + Regexp.quote("." + @config.domain) + '$') #' if domainpat =~ fqdn subdomain = $1 return name + "@" + subdomain else return name end end end def init_count @count = 0 return unless File.exist?(@count_file) File.safe_open(@count_file, "r") {|f| @count = f.gets.chomp.to_i } end def inc_count @count += 1 File.safe_open(@count_file, "w") {|f| f.puts @count } end def init_charset @charset = nil return unless File.exist?(@charset_file) File.safe_open(@charset_file, "r") {|f| @charset = f.gets.chomp } end def save_charset return if @message_charset.nil? File.safe_open(@charset_file, "w") {|f| f.puts @message_charset } end def init_members @active_members = IcaseArray.new @former_members = IcaseArray.new @error_members = IcaseHash.new return unless File.exist?(@members_file) File.safe_open(@members_file, "r") {|f| f.each {|line| line.chomp! if /^# (.*)/ =~ line # removed address @former_members.push($1) unless @former_members.include?($1) elsif /^; (.*?) (\d+)(?: (\d+))?/ =~ line address = $1 count= $2.to_i last_error_time = if $3 then Time.at($3.to_i) else Time.at(0) end @error_members[address]= ErrorInfo.new(count, last_error_time) else @active_members.push(line) unless @active_members.include?(line) end } } end def save_member_file File.safe_open(@members_file, "w") {|f| @active_members.each {|address| f.puts address} @former_members.each {|address| f.puts "# " + address} @error_members.each {|address, error_info| f.printf("; %s %d %d\n", address, error_info.count, error_info.last_error_time.to_i) } } end # satoru@namazu.org => satoru@n... def obfuscate_address (address) address.sub(/(@.).*/, '\1...') end def member_list _("Members of <%s>:\n", @address) + @active_members.map {|x| obfuscate_address(x)}.join("\n") + "\n" end def unsubscribe_info "\n" + _("How to unsubscribe from the ML:\n") + _("- Just send an empty message to <%s>.\n", @address) + _("- Or, if you cannot send an empty message for some reason,\n") + _(" please send a message just saying 'unsubscribe' to <%s>.\n", @address) + _(" (e.g., hotmail's advertisement, signature, etc.)\n") end def generate_header header = sprintf("ML: %s\n", @address) @added_members.each {|address| header << _("New Member: %s\n", obfuscate_address(address)) } header << "\n" header end def member_added? @member_added_p end def generate_footer (member_list_p = false) footer = "\n--\n" + "ML: #{@address}\n" + _("Info: %s\n", @config.info_url) footer << unsubscribe_info if member_added? footer << "\n" + member_list if member_added? or member_list_p footer end def plain_text_body? (mail) (mail["Content-Type"] == "" or %r!\btext/plain\b!i =~ mail["Content-Type"]) and (mail["Content-Transfer-Encoding"] == "" or /^[78]bit$/i =~ mail["Content-Transfer-Encoding"]) end def rewrite_body (mail) header = generate_header if @member_added_p footer = generate_footer if mail.multipart? parts = mail.parts sub_mail = Mail.new sub_mail.read(parts.first) if sub_mail.content_type == "text/plain" sub_mail.body = header + sub_mail.body if header sub_mail.body = sub_mail.body + footer end parts[0] = sub_mail.to_s mail.body = Mail.join_parts(parts, mail.boundary) elsif plain_text_body?(mail) mail.body = header + mail.body if header mail.body += footer else mail.body end end def remove_alertedp_file File.safe_unlink(@alertedp_file) end def _submit (mail) inc_count save_charset remove_alertedp_file subject = Mail.rewrite_subject(mail["Subject"], @short_name, @count) body = rewrite_body(mail) header = [] mail.each_field {|key, value| k = key.downcase next if k == "subject" or k == "reply-to" header.push([key, value]) } header.push(["Subject", subject], ["Reply-To", @address], ["X-Mail-Count",@count]) header.concat(quickml_fields) Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => @return_address, :recipients => @active_members, :header => header, :body => body) end def quickml_fields [ ["Precedence", "bulk"], ["X-ML-Address", @address], ["X-ML-Name", @name], ["X-ML-Info", @config.info_url], ["X-QuickML", "true"]] end def remove_error_member (address) @error_members.delete(address) end def error_count (address) if @error_members.include?(address) @error_members[address].count else 0 end end def allowable_error_interval? (time) now = Time.now past = now - @config.allowable_error_interval past < time && time <= now end def inc_error_count (address) unless @error_members.include?(address) @error_members[address] = ErrorInfo.new end unless allowable_error_interval?(@error_members[address].last_error_time) @error_members[address].inc_count end @error_members[address].count end def reset_error_member (address) return unless @error_members.include?(address) @error_members.delete(address) @logger.log "[#{@name}]: ResetError: #{address}" save_member_file end def content_type if @message_charset @config.content_type + "; charset=#{@message_charset}" else @config.content_type end end public def exclude? (address) name, domain = address.split("@") Mail.address_of_domain?(address, @config.domain) or domain.nil? end def ml_config_exist? File.exist?(@ml_config_file) end def write_ml_config File.safe_open(@ml_config_file, "w") {|f| f.puts "{" f.printf(" :%s => %d,\n", :max_members, @max_members) f.printf(" :%s => %d,\n", :max_mail_length, @max_mail_length) f.printf(" :%s => %d,\n", :ml_life_time, @ml_life_time) f.printf(" :%s => %d,\n", :ml_alert_time, @ml_alert_time) f.printf(" :%s => %d,\n", :auto_unsubscribe_count, @auto_unsubscribe_count) f.puts "}" } end def send_confirmation (creator_address) header = [] subject = Mail.encode_field(_("[%s] Confirmation: %s", @short_name, @address)) header.push(["To", creator_address], ["From", confirmation_address], ["Subject", subject], ["Content-Type", content_type]) body = _("Please simply reply this mail to create ML <%s>.\n", @address) Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => creator_address, :header => header, :body => body) @logger.log "[#{@name}]: Send confirmation: #{confirmation_address} #{creator_address}" end def submit (mail) return if @active_members.empty? if mail.body.length > @max_mail_length report_too_large_mail(mail) @logger.log "[#{@name}]: Too Large Mail: #{mail.from}" else reset_error_member(mail.from) start_time = Time.now _submit(mail) elapsed = Time.now - start_time @logger.log "[#{@name}:#{@count}]: Send: #{@config.smtp_host} #{elapsed} sec." end end def inactive? return false if forward? or permanent? last_article_time + @ml_life_time < Time.now end def need_alert? return false if forward? or permanent? alert_time = last_article_time + @ml_alert_time now = Time.now alert_time <= now && !alerted? end # FIXME: too similar to report_too_large_mail in server.rb def report_too_large_mail (mail) header = [] subject = Mail.encode_field(_("[QuickML] Error: %s", mail["Subject"])) header.push(["To", mail.from], ["From", @address], ["Subject", subject], ["Content-Type", content_type]) max = @max_mail_length.commify body = _("Sorry, your mail exceeds the limitation of the length.\n") body << _("The max length is %s bytes.\n\n", max) orig_subject = codeconv(Mail.decode_subject(mail['Subject'])) body << "Subject: #{orig_subject}\n" body << "To: #{mail['To']}\n" body << "From: #{mail['From']}\n" body << "Date: #{mail['Date']}\n" Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => mail.from, :header => header, :body => body) end def report_removed_member (error_address) return if @active_members.empty? subject = Mail.encode_field(_("[%s] Removed: <%s>", @short_name, error_address)) header = [] header.push(["To", @address], ["From", @address], ["Subject", subject], ["Reply-To", @address], ["Content-Type", content_type]) header.concat(quickml_fields) body = _("<%s> was removed from the mailing list:\n<%s>\n", error_address, @address) body << _("because the address was unreachable.\n") body << generate_footer(true) Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipients => @active_members, :header => header, :body => body) @logger.log "[#{@name}]: Notify: Remove #{error_address}" end def report_ml_close_soon return if @active_members.empty? subject = Mail.encode_field(_("[%s] ML will be closed soon", @short_name)) header = [] header.push(["To", @address], ["From", @address], ["Subject", subject], ["Reply-To", @address], ["Content-Type", content_type]) header.concat(quickml_fields) time_to_close = last_article_time + @ml_life_time ndays = ((time_to_close - Time.now) / 86400.0).ceil datefmt = __("%Y-%m-%d %H:%M") body = _("ML will be closed if no article is posted for %d days.\n\n", ndays) body << _("Time to close: %s.\n\n", time_to_close.strftime(datefmt)) body << generate_footer(true) Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipients => @active_members, :header => header, :body => body) @logger.log "[#{@name}]: Alert: ML will be closed soon" File.safe_open(@alertedp_file, "w").close end def close File.safe_unlink(@members_file) File.safe_unlink(@count_file) File.safe_unlink(@charset_file) File.safe_unlink(@alertedp_file) File.safe_unlink(@waiting_members_file) File.safe_unlink(@waiting_message_file) File.safe_unlink(@ml_config_file) @logger.log "[#{@name}]: ML Closed" end def forward? File.exist?(@forwardp_file) end def permanent? File.exist?(@permanentp_file) end def unlimited? File.exist?(@unlimitedp_file) end def newly_created? !File.exist?(@members_file) end def confirmation_waiting? File.exist?(@waiting_members_file) end def alerted? File.exist?(@alertedp_file) end def validate_confirmation (time) File.exist?(@waiting_message_file) and File.mtime(@waiting_message_file).to_i == time.to_i end def prepare_confirmation (mail) save_member_file # to create empty ML files. File.safe_open(@waiting_message_file, "w") {|f| f.print(mail.bare) } add_waiting_member(mail.from) mail.collect_cc.each {|address| add_waiting_member(address) } send_confirmation(mail.from) end def accept_confirmation waiting_members = File.safe_open(@waiting_members_file).readlines.map {|line| line.chomp } waiting_message = File.safe_open(@waiting_message_file).read mail = Mail.new mail.read(waiting_message) waiting_members.each {|address| begin add_member(address) rescue TooManyMembers end } submit(mail) File.safe_unlink(@waiting_members_file) File.safe_unlink(@waiting_message_file) @logger.log "[#{@name}]: Accept confirmation: #{@addressconfirmation_address} #{@address}" end def add_waiting_member (address) File.safe_open(@waiting_members_file, "a") {|f| f.puts address } end def too_many_members? (not unlimited?) and (@active_members.length >= @max_members) end def remove_member (address) return unless @active_members.include?(address) @active_members.delete(address) @former_members.push(address) remove_error_member(address) save_member_file @logger.log "[#{@name}]: Remove: #{address}" close if @active_members.empty? end def add_member (address) if exclude?(address) @logger.vlog "Excluded: #{address}" return end return if @active_members.include?(address) raise TooManyMembers if too_many_members? @former_members.delete(address) @active_members.push(address) save_member_file @logger.log "[#{@name}]: Add: #{address}" @added_members.push(address) @member_added_p = true end def add_error_member (address) return unless @active_members.include?(address) prev_count = error_count(address) count = inc_error_count(address) if prev_count == count @logger.log "[#{@name}]: AddError: #{address} (not counted)" else @logger.log "[#{@name}]: AddError: #{address} #{count}" end save_member_file if error_count(address) >= @auto_unsubscribe_count remove_member(address) report_removed_member(address) end end end class ErrorMailHandler def initialize (config, message_charset) @config = config @logger = config.logger @message_charset = message_charset end private def handle_error (ml, error_address) @logger.log "ErrorMail: [#{ml.name}] #{error_address}" ml.add_error_member(error_address) end public def handle (mail) if /^(.*)=return=(.*?)@(.*?)$/ =~ mail.recipients.first mladdress = $1 + '@' + $3 error_address = $2.sub(/=/, "@") @config.ml_mutex(mladdress).synchronize { ml = QuickML.new(@config, mladdress, nil, @message_charset) handle_error(ml, error_address) } else @logger.vlog "Error: Use Postfix with XVERP to handle an error mail!" end end end class Processor include GetText::GetText def initialize (config, mail) @config = config @mail = mail @logger = @config.logger @catalog = @config.catalog if mail.multipart? sub_mail = Mail.new sub_mail.read(mail.parts.first) @message_charset = sub_mail.charset else @message_charset = mail.charset end end private # FIXME: this is the same method of QuickML#content_type def content_type if @message_charset @config.content_type + "; charset=#{@message_charset}" else @config.content_type end end def generate_footer "\n--\n" + _("Info: %s\n", @config.info_url) end def report_rejection (ml) header = [] subject = Mail.encode_field(_("[QuickML] Error: %s", @mail["Subject"])) header.push(["To", @mail.from], ["From", ml.address], ["Subject", subject]) body = _("You are not a member of the mailing list:\n<%s>\n", ml.address) body << "\n" body << _("Did you send a mail with a different address from the address registered in the mailing list?\n") body << _("Please check your 'From:' address.\n") body << generate_footer body << "\n" body << _("----- Original Message -----\n") orig_subject = codeconv(Mail.decode_subject(@mail['Subject'])) body << "Subject: #{orig_subject}\n" body << "To: #{@mail['To']}\n" body << "From: #{@mail['From']}\n" body << "Date: #{@mail['Date']}\n" body << "\n" if @mail.multipart? ["Content-Type", "Mime-Version", "Content-Transfer-Encoding"].each {|key| header.push([key, @mail[key]]) unless @mail[key].empty? } sub_mail = Mail.new parts = @mail.parts sub_mail.read(parts.first) body << sub_mail.body sub_mail.body = body parts[0] = sub_mail.to_s body = Mail.join_parts(parts, @mail.boundary) else unless @mail["Content-type"].empty? header.push(["Content-Type", @mail["Content-type"]]) end body << @mail.body end Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => @mail.from, :header => header, :body => body) @logger.log "[#{ml.name}]: Reject: #{@mail.from}" end def report_unsubscription (ml, member, requested_by = nil) header = [] subject = Mail.encode_field(_("[%s] Unsubscribe: %s", ml.short_name, ml.address)) header.push(["To", member], ["From", ml.address], ["Subject", subject], ["Content-type", content_type]) if requested_by body = _("You are removed from the mailing list:\n<%s>\n", ml.address) body << _("by the request of <%s>.\n", requested_by) else body = _("You have unsubscribed from the mailing list:\n<%s>.\n", ml.address) end body << generate_footer Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipients => member, :header => header, :body => body) @logger.log "[#{ml.name}]: Unsubscribe: #{member}" end def report_too_many_members (ml, unadded_addresses) header = [] subject = Mail.encode_field(_("[QuickML] Error: %s", @mail["Subject"])) header.push(["To", @mail.from], ["From", ml.address], ["Subject", subject], ["Content-type", content_type]) body = _("The following addresses cannot be added because <%s> mailing list reaches the max number of members (%d persons)\n\n", ml.address, ml.max_members) unadded_addresses.each {|address| body << sprintf("<%s>\n", address) } body << generate_footer Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => @mail.from, :header => header, :body => body) @logger.log "[#{ml.name}]: Too Many Members: #{address}" end def report_invalid_mladdress (mladdress) header = [] subject = Mail.encode_field(_("[QuickML] Error: %s", @mail["Subject"])) header.push(["To", @mail.from], ["From", @config.postmaster], ["Subject", subject], ["Content-type", content_type]) body = _("Invalid mailing list name: <%s>\n", mladdress) body << _("You can only use 0-9, a-z, A-Z, `.', `-', and `_' for mailing list name\n") body << generate_footer Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => @mail.from, :header => header, :body => body) @logger.log "Invalid ML Address: #{mladdress}" end def mail_log @logger.vlog "MAIL FROM:<#{@mail.mail_from}>" @mail.recipients.each {|recipient| @logger.vlog "RCPT TO:<#{recipient}>" } @logger.vlog "From: " + @mail.from @logger.vlog "Cc: " + @mail.collect_cc.join(", ") @logger.vlog "bare From: " + @mail['From'] @logger.vlog "bare Cc: " + @mail['Cc'] end def sender_knows_an_active_member? (ml) @mail.collect_cc.find {|address| ml.active_members.include?(address) } end def add_member (ml, address) begin ml.add_member(address) rescue TooManyMembers @unadded_addresses.push(address) end end def ml_address_in_to? (ml) @mail.collect_to.find {|address| address == ml.address } end def submit_article (ml) @unadded_addresses = [] if ml_address_in_to?(ml) add_member(ml, @mail.from) @mail.collect_cc.each {|address| add_member(ml, address) } end unless @unadded_addresses.empty? report_too_many_members(ml, @unadded_addresses) end ml.submit(@mail) end def to_return_address? (recipient) # "return=" for XVERP, "return@" for without XVERP. /^[^=]*=return[=@]/ =~ recipient end def unsubscribe_requested? @mail.empty_body? || (@mail.body.length < 500 && /\A\s*(unsubscribe|bye|#\s*bye|quit|退会|脱退)\s*$/.match(@mail.body.toeuc)) end def unsubscribe_self (ml) if ml.active_members.include?(@mail.from) ml.remove_member(@mail.from) report_unsubscription(ml, @mail.from) else report_rejection(ml) end end def unsubscribe_other (ml, cc) if ml.active_members.include?(@mail.from) cc.each {|other| if ml.active_members.include?(other) ml.remove_member(other) report_unsubscription(ml, other, @mail.from) end } else @logger.vlog "rejected" end end def unsubscribe (ml) cc = @mail.collect_cc if cc.empty? unsubscribe_self(ml) else unsubscribe_other(ml, cc) end end def acceptable_submission? (ml) ml.newly_created? or ml.active_members.include?(@mail.from) or ml.former_members.include?(@mail.from) or sender_knows_an_active_member?(ml) end def confirmation_required? (ml) @config.confirm_ml_creation and ml.newly_created? end def submit (ml) if ml.exclude?(@mail.from) @logger.log "Invalid From Address: #{@mail.from}" elsif ml.forward? @logger.log "Forward Address: #{ml.address}" ml.submit(@mail) elsif confirmation_required?(ml) ml.prepare_confirmation(@mail) elsif acceptable_submission?(ml) submit_article(ml) else report_rejection(ml) end end def validate_confirmation (confirmation_address) m = /^confirm\+(\d+)\+(.*)/.match(confirmation_address) time = m[1] mladdress = m[2] ml = QuickML.new(@config, mladdress) if ml.confirmation_waiting? and ml.validate_confirmation(time) ml.accept_confirmation end end def to_confirmation_address? (address) /^confirm\+/.match(address) end def process_recipient (recipient) mladdress = recipient if to_return_address?(mladdress) handler = ErrorMailHandler.new(@config, @message_charset) handler.handle(@mail) elsif @config.confirm_ml_creation and to_confirmation_address?(mladdress) validate_confirmation(mladdress) else begin @config.ml_mutex(mladdress).synchronize { ml = QuickML.new(@config, mladdress, @mail.from, @message_charset) @message_charset = (@message_charset or ml.charset) (unsubscribe(ml); return) if unsubscribe_requested? submit(ml) } rescue InvalidMLName report_invalid_mladdress(mladdress) end end end public def process mail_log if @mail.looping? @logger.log "Looping Mail: from #{@mail.from}" return end @mail.recipients.each {|recipient| process_recipient(recipient) } end end end quickml-0.7/lib/quickml/logger.rb0000644000076400007640000000202210061026163012524 # # quickml/logger - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # require 'quickml/utils' require 'thread' module QuickML class Logger def initialize (log_filename, verbose_mode = nil) @mutex = Mutex.new @log_file = File.safe_open(log_filename, "a") @log_file.sync = true @verbose_mode = verbose_mode end private def puts_log (msg) @mutex.synchronize { time = Time.now.strftime("%Y-%m-%dT%H:%M:%S") @log_file.puts "#{time}: #{msg}" } end public def log (msg) puts_log(msg) end def vlog (msg) puts_log(msg) if @verbose_mode end def reopen @mutex.synchronize { log_filename = @log_file.path @log_file.close @log_file = File.safe_open(log_filename, "a") } end end end quickml-0.7/lib/quickml/server.rb0000644000076400007640000002043110061026163012557 # # quickml/server - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # require 'etc' require 'socket' require 'net/smtp' require 'thread' require 'thwait' require 'timeout' require 'quickml/gettext' require 'quickml/utils' require 'time' module QuickML class Session include GetText::GetText def initialize (config, socket) @socket = socket @config = config @command_table = [:helo, :ehlo, :noop, :quit, :rset, :rcpt, :mail, :data] @hello_host = "hello.host.invalid" @protocol = nil @peer_hostname = @socket.hostname @peer_address = @socket.address @remote_host = (@peer_hostname or @peer_address) @logger = @config.logger @catalog = @config.catalog @data_finished = false @my_hostname = if @config.port == 25 then Socket.gethostname else "localhost" end @message_charset = nil end private def helo (mail, arg) @hello_host = arg.split.first @socket.puts "250 #{@my_hostname}" @protocol = "SMTP" end def ehlo (mail, arg) @hello_host = arg.split.first @socket.puts "250-#{@my_hostname}" @socket.puts "250 PIPELINING" @protocol = "ESMTP" end def noop (mail, arg) @socket.puts "250 ok" end def quit (mail, arg) @socket.puts "221 Bye" close end def rset (mail, arg) mail.mail_from = nil mail.clear_recipients @socket.puts "250 ok" end def mail (mail, arg) if @protocol.nil? @socket.puts "503 Error: send HELO/EHLO first" elsif /^From:\s*<(.*)>/i =~ arg or /^From:\s*(.*)/i =~ arg mail.mail_from = $1 @socket.puts "250 ok" else @socket.puts "501 Syntax: MAIL FROM:
" end end def rcpt (mail, arg) if mail.mail_from.nil? @socket.puts "503 Error: need MAIL command" elsif /^To:\s*<(.*)>/i =~ arg or /^To:\s*(.*)/i =~ arg address = $1 if Mail.address_of_domain?(address, @config.domain) mail.add_recipient(address) @socket.puts "250 ok" else @socket.puts "554 <#{address}>: Recipient address rejected" @logger.vlog "Unacceptable RCPT TO:<#{address}>" end else @socket.puts "501 Syntax: RCPT TO:
" end end def received_field sprintf("from %s (%s [%s])\n" + " by %s (QuickML) with %s;\n" + " %s", @hello_host, @peer_hostname, @peer_address, @my_hostname, @protocol, Time.now.rfc2822) end def end_of_data? (line) # line.xchomp == "." line == ".\r\n" end def read_mail (mail) len = 0 lines = [] while line = @socket.safe_gets break if end_of_data?(line) len += line.length if len > @config.max_mail_length mail.read(lines.join('')) # Generate a header for an error report. raise TooLargeMail end line.sub!(/^\.\./, ".") # unescape line.normalize_eol! lines << line # I don't know why but constructing mail_string with # String#<< here is very slow. # mail_string << line end mail_string = lines.join('') @data_finished = true mail.read(mail_string) mail.unshift_field("Received", received_field) end def data (mail, arg) if mail.recipients.empty? @socket.puts "503 Error: need RCPT command" else @socket.puts "354 send the mail data, end with ."; begin read_mail(mail) ensure @message_charset = mail.charset end @socket.puts "250 ok" end end def connect def @socket.puts(*objs) objs.each {|x| begin self.print x.xchomp, "\r\n" rescue Errno::EPIPE end } end @socket.puts "220 #{@my_hostname} ESMTP QuickML" @logger.vlog "Connect: #{@remote_host}" end def discard_data begin while line = @socket.safe_gets break if end_of_data?(line) end rescue TooLongLine retry end end def cleanup_connection unless @data_finished discard_data end @socket.puts "221 Bye" close end # FIXME: this is the same method of QuickML#content_type def content_type if @message_charset @config.content_type + "; charset=#{@message_charset}" else @config.content_type end end def report_too_large_mail (mail) header = [] subject = Mail.encode_field(_("[QuickML] Error: %s", mail["Subject"])) header.push(["To", mail.from], ["From", @config.postmaster], ["Subject", subject], ["Content-Type", content_type]) max = @config.max_mail_length.commify body = _("Sorry, your mail exceeds the limitation of the length.\n") body << _("The max length is %s bytes.\n\n", max) orig_subject = codeconv(Mail.decode_subject(mail['Subject'])) body << "Subject: #{orig_subject}\n" body << "To: #{mail['To']}\n" body << "From: #{mail['From']}\n" body << "Date: #{mail['Date']}\n" Mail.send_mail(@config.smtp_host, @config.smtp_port, @logger, :mail_from => '', :recipient => mail.from, :header => header, :body => body) end def close return if @socket.closed? @socket.close @logger.vlog "Closed: #{@remote_host}" end def receive_mail (mail) while line = @socket.safe_gets line.xchomp! command, arg = line.split(/\s+/, 2) command = command.downcase.intern # "HELO" => :helo if @command_table.include?(command) @logger.vlog "Command: #{line}" send(command, mail, arg) else @logger.vlog "Unknown SMTP Command: #{command} #{arg}" @socket.puts "502 Error: command not implemented" end break if command == :quit or command == :data end end def process until @socket.closed? begin mail = Mail.new receive_mail(mail) if mail.valid? processor = Processor.new(@config, mail) processor.process end rescue TooLargeMail cleanup_connection report_too_large_mail(mail) if mail.valid? @logger.log "Too Large Mail: #{mail.from}" rescue TooLongLine cleanup_connection @logger.log "Too Long Line: #{mail.from}" end end end def _start begin connect timeout(@config.timeout) { process } rescue TimeoutError @logger.vlog "Timeout: #{@remote_host}" ensure close end end public def start start_time = Time.now _start elapsed = Time.now - start_time @logger.vlog "Session finished: #{elapsed} sec." end end class Server def initialize (config) @config = config @status = :stop @logger = @config.logger @server = TCPServer.new(@config.bind_address, @config.port) end def accept running_sessions = [] @status = :running while @status == :running begin t = Thread.new(@server.accept) {|s| process_session(s) } t.abort_on_exception = true running_sessions.push(t) rescue Errno::ECONNABORTED # caused by @server.shutdown rescue Errno::EINVAL end running_sessions.delete_if {|t| t.status == false } if running_sessions.length >= @config.max_threads ThreadsWait.new(running_sessions).next_wait end end running_sessions.each {|t| t.join } end def process_session (socket) begin session = Session.new(@config, socket) session.start rescue Exception => e @logger.log "Unknown Session Error: #{e.class}: #{e.message}" @logger.log e.backtrace end end def write_pid_file File.safe_open(@config.pid_file, "w") {|f| f.puts Process.pid } end def read_pid_file pid = nil File.safe_open(@config.pid_file, "r") {|f| pid = f.gets.chomp.to_i } pid end def remove_pid_file File.safe_unlink(@config.pid_file) if Process.pid == read_pid_file end public def shutdown @server.shutdown @status = :shutdown end def start raise "server already started" if @status != :stop write_pid_file @logger.log sprintf("Server started at %s:%d [%d]", "localhost", @config.port, Process.pid) accept @logger.log "Server exited [#{Process.pid}]" remove_pid_file end end end quickml-0.7/lib/quickml/utils.rb0000644000076400007640000000257410061026163012421 # # quickml/utils - a part of quickml server # # Copyright (C) 2002-2004 Satoru Takabayashi # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # $KCODE = 'e' require 'kconv' require 'net/smtp' require 'ftools' class TooLongLine < Exception; end class IO def safe_gets (max_length = 1024) s = "" until self.eof? c = self.read(1) s << c if s.length > max_length raise TooLongLine end if c == "\n" return s end end if s.empty? then nil else s end end end class String def xchomp! self.chomp!("\n") self.chomp!("\r") end def normalize_eol! self.xchomp! self << "\n" end def xchomp self.chomp("\n").chomp("\r") end end class TCPSocket def address peeraddr[3] end def hostname peeraddr[2] end end class File def self.safe_open (filename, mode = "r") begin f = File.open(filename, mode) if block_given? yield(f) f.close else return f end rescue => e STDERR.printf "%s: %s\n", $0, e.message exit(1) end end end class Integer # commify(12345) => "12,345" def commify numstr = self.to_s true while numstr.sub!(/^([-+]?\d+)(\d{3})/, '\1,\2') return numstr end end quickml-0.7/lib/quickml/version.rb.in0000644000076400007640000000005410061026163013342 module QuickML VERSION = "%VERSION%" end