rush-1.8/0000755000175000017500000000000012773666037012356 5ustar00matsmats00000000000000rush-1.8/configure.ac0000644000175000017500000000525112773663607014647 0ustar00matsmats00000000000000# This file is part of GNU Rush. -*- Autoconf -*- # Copyright (C) 2008-2011, 2013-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AC_PREREQ(2.63) AC_INIT([GNU rush], [1.8], [bug-rush@gnu.org]) AC_CONFIG_SRCDIR([src/rush.c]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([1.11.1 gnits tar-ustar dist-bzip2 dist-xz std-options]) # Enable silent rules by default: AM_SILENT_RULES([yes]) # Checks for programs. AC_PROG_CC gl_EARLY AC_PROG_INSTALL AC_PROG_RANLIB # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_HEADER_TIME AC_CHECK_HEADERS([stdlib.h string.h socket.h sys/socket.h syslog.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_UID_T AC_TYPE_MODE_T AC_TYPE_SIZE_T AC_CHECK_TYPE(socklen_t, , AC_DEFINE(socklen_t, int, [Define to int if does not]), [ #if HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif #ifdef HAVE_SOCKET_H # include #endif ]) # Checks for library functions. AC_FUNC_GETGROUPS AC_FUNC_MALLOC AC_FUNC_MEMCMP AC_FUNC_REALLOC AC_FUNC_STAT AC_FUNC_ALLOCA AC_CHECK_FUNCS([strdup strerror strrchr strtoul sysconf getdtablesize \ flock ftruncate]) gl_INIT # Gettext. AM_ICONV AM_GNU_GETTEXT([external], [need-formatstring-macros]) AM_GNU_GETTEXT_VERSION([0.18]) IMPRIMATUR_INIT(doc/imprimatur) AC_ARG_WITH([default-config], AC_HELP_STRING([--with-default-config=FILE], [read the default configuration from FILE]), [dir=`AS_DIRNAME(["$withval"])` if test -d $dir; then dir=`cd $dir; pwd` else AC_MSG_ERROR([No such directory: $dir]) fi name=`expr x"$withval" : '.*/\(.*\)'` AC_SUBST(RUSH_DEFAULT_CONFIG, $dir/$name)]) # Initialize the test suite. AC_CONFIG_TESTDIR(tests) AC_CONFIG_FILES([tests/Makefile tests/atlocal]) AM_MISSING_PROG([AUTOM4TE], [autom4te]) AC_CONFIG_FILES([Makefile gnu/Makefile lib/Makefile src/Makefile etc/Makefile doc/Makefile po/Makefile.in]) AC_OUTPUT rush-1.8/tests/0000755000175000017500000000000012773666037013520 5ustar00matsmats00000000000000rush-1.8/tests/umask.at0000644000175000017500000000147012755764036015166 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([umask]) AT_KEYWORDS([umask]) AT_RUSH_TEST([ rule umask 017 ], [umask], [command], [0], [{ "umask":017 } ], []) AT_CLEANUP rush-1.8/tests/myid.c0000644000175000017500000000063712755767264014640 0ustar00matsmats00000000000000#include #include #include #include #include int main(int argc, char **argv) { struct passwd *pw; struct group *gr; pw = getpwuid(getuid()); assert(pw!=NULL); gr = getgrgid(pw->pw_gid); assert(gr!=NULL); printf("%s %lu %s %lu\n", pw->pw_name, (unsigned long) pw->pw_uid, gr->gr_name, (unsigned long) gr->gr_gid); return 0; } rush-1.8/tests/transform.at0000644000175000017500000000336312755764036016064 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([transform]) AT_KEYWORDS([transform]) AT_RUSH_TEST([ rule transform s/^[^[:space:]]+/& -t/ ], [cmdline,argv,prog], [svnserve], [0], [{ "cmdline":"svnserve -t", "argv":[[ "svnserve", "-t" ]], "prog":null } ], []) AT_RUSH_TEST([ rule transform "\${command} end" s/[[:space:]]+-[^[:space:]]+//g ], [cmdline,argv,prog], [echo -c -t foo -n bar], [0], [{ "cmdline":"echo foo bar end", "argv":[[ "echo", "foo", "bar", "end" ]], "prog":null } ], []) AT_RUSH_TEST([ rule transform[0] s|^[^/]|/usr/bin/&| ], [cmdline,argv,prog], [echo foo], [0], [{ "cmdline":"/usr/bin/echo foo", "argv":[[ "/usr/bin/echo", "foo" ]], "prog":null } ], [], [/bin/echo foo], [0], [{ "cmdline":"/bin/echo foo", "argv":[[ "/bin/echo", "foo" ]], "prog":null } ], []) AT_RUSH_TEST([ rule transform[0] \${^} s,.*/,-, ], [cmdline,argv,prog], [/bin/sh], [0], [{ "cmdline":"-sh", "argv":[[ "-sh" ]], "prog":null } ], []) AT_CLEANUP rush-1.8/tests/argc.at0000644000175000017500000000214712773663353014764 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([argc]) AT_KEYWORDS([argc]) AT_RUSH_TEST([ rule argc 2 ], [cmdline,argv,prog,interactive,fork,acct], [/usr/bin/echo foo], [0], [{ "cmdline":"/usr/bin/echo foo", "argv":[[ "/usr/bin/echo", "foo" ]], "prog":null, "interactive":0, "fork":-1, "acct":-1 } ], [], [/usr/bin/echo foo bar], [1], [], [rush: Error: no matching rule for "/usr/bin/echo foo bar", user $MY_USER ]) AT_CLEANUP rush-1.8/tests/env.at0000644000175000017500000000620212773663353014634 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([env]) AT_KEYWORDS([env]) AT_RUSH_TEST([ rule env - ], [environ], [command], [0], [{ "environ":[[]] } ], []) m4_pushdef([RUSH_ENVIRON],[-i HOME=$PWD USER=$MY_USER LOGIN=$MY_USER]) AT_RUSH_TEST([ rule env -LOGIN ], [environ], [command], [0], [{ "environ":[[ "HOME=$TESTDIR", "USER=$MY_USER" ]] } ], []) AT_RUSH_TEST([ rule env -LOGIN=$MY_USER ], [environ], [command], [0], [{ "environ":[[ "HOME=$TESTDIR", "USER=$MY_USER" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i HOME=$PWD USER=$MY_USER LOGIN=NO_$MY_USER]) AT_RUSH_TEST([ rule env -LOGIN=$MY_USER ], [environ], [command], [0], [{ "environ":[[ "HOME=$TESTDIR", "LOGIN=NO_$MY_USER", "USER=$MY_USER" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i HOME=$PWD USER=$MY_USER LOGIN=NO_$MY_USER PATH=$PATH]) AT_RUSH_TEST([ rule env - HOME USER ], [environ], [command], [0], [{ "environ":[[ "HOME=$TESTDIR", "USER=$MY_USER" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i HOME=$PWD USER=$MY_USER]) AT_RUSH_TEST([ rule env NEWVAR=foo ], [environ], [command], [0], [{ "environ":[[ "HOME=$TESTDIR", "NEWVAR=foo", "USER=$MY_USER" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i]) AT_RUSH_TEST([ rule env MYPATH+=:/usr/local/bin ], [environ], [command], [0], [{ "environ":[[ "MYPATH=/usr/local/bin" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i MYPATH=/bin:/usr/bin]) AT_RUSH_TEST([ rule env MYPATH+=:/usr/local/bin ], [environ], [command], [0], [{ "environ":[[ "MYPATH=/bin:/usr/bin:/usr/local/bin" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i]) AT_RUSH_TEST([ rule env MYPATH=+/usr/local/bin: ], [environ], [command], [0], [{ "environ":[[ "MYPATH=/usr/local/bin" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i MYPATH=/bin:/usr/bin]) AT_RUSH_TEST([ rule env MYPATH=+/usr/local/bin: ], [environ], [command], [0], [{ "environ":[[ "MYPATH=/usr/local/bin:/bin:/usr/bin" ]] } ], []) m4_popdef([RUSH_ENVIRON]) m4_pushdef([RUSH_ENVIRON],[-i MYPATH=/bin:/usr/bin]) AT_RUSH_TEST([ rule env MYPATH=/usr/local/bin:\$MYPATH ], [environ], [command], [0], [{ "environ":[[ "MYPATH=/usr/local/bin:/bin:/usr/bin" ]] } ], []) m4_popdef([RUSH_ENVIRON]) AT_CLEANUP rush-1.8/tests/matchprog.at0000644000175000017500000000204712773663353016033 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([match program name]) AT_KEYWORDS([matchprog]) AT_RUSH_TEST([ rule match[^] /usr/bin/.* ], [cmdline,argv,prog], [/usr/bin/echo foo], [0], [{ "cmdline":"/usr/bin/echo foo", "argv":[[ "/usr/bin/echo", "foo" ]], "prog":null } ], [], [echo foo], [1], [], [rush: Error: no matching rule for "echo foo", user $MY_USER ]) AT_CLEANUP rush-1.8/tests/newgrp.at0000644000175000017500000000146312755764036015352 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([newgrp]) AT_KEYWORDS([newgrp]) AT_RUSH_TEST([ rule newgrp 0 ], [gid], [command], [0], [{ "gid":0 } ], []) AT_CLEANUP rush-1.8/tests/command.at0000644000175000017500000000220312773663353015457 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([command]) AT_KEYWORDS([command]) AT_RUSH_TEST([ rule command echo[[:space:]]+foo$ ], [cmdline,argv,prog,interactive,fork,acct], [/usr/bin/echo foo], [0], [{ "cmdline":"/usr/bin/echo foo", "argv":[[ "/usr/bin/echo", "foo" ]], "prog":null, "interactive":0, "fork":-1, "acct":-1 } ], [], [/usr/bin/echo foo bar], [1], [], [rush: Error: no matching rule for "/usr/bin/echo foo bar", user $MY_USER ]) AT_CLEANUP rush-1.8/tests/testsuite0000755000175000017500000031667412773664023015511 0ustar00matsmats00000000000000#! /bin/sh # Generated from testsuite.at by GNU Autoconf 2.69. # # Copyright (C) 2009-2012 Free Software Foundation, Inc. # # This test suite is free software; the Free Software Foundation gives # unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 IFS=$as_save_IFS ;; 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; 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 as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # 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 sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # 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'" SHELL=${CONFIG_SHELL-/bin/sh} # How were we run? at_cli_args="$@" # Not all shells have the 'times' builtin; the subshell is needed to make # sure we discard the 'times: not found' message from the shell. at_times_p=false (times) >/dev/null 2>&1 && at_times_p=: # CLI Arguments to pass to the debugging scripts. at_debug_args= # -e sets to true at_errexit_p=false # Shall we be verbose? ':' means no, empty means yes. at_verbose=: at_quiet= # Running several jobs in parallel, 0 means as many as test groups. at_jobs=1 at_traceon=: at_trace_echo=: at_check_filter_trace=: # Shall we keep the debug scripts? Must be `:' when the suite is # run by a debug script, so that the script doesn't remove itself. at_debug_p=false # Display help message? at_help_p=false # Display the version message? at_version_p=false # List test groups? at_list_p=false # --clean at_clean=false # Test groups to run at_groups= # Whether to rerun failed tests. at_recheck= # Whether a write failure occurred at_write_fail=0 # The directory we run the suite in. Default to . if no -C option. at_dir=`pwd` # An absolute reference to this testsuite script. case $as_myself in [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;; * ) at_myself=$at_dir/$as_myself ;; esac # Whether -C is in effect. at_change_dir=false # Whether to enable colored test results. at_color=no # List of the tested programs. at_tested='rush' # As many question marks as there are digits in the last test group number. # Used to normalize the test group numbers so that `ls' lists them in # numerical order. at_format='??' # Description of all the test groups. at_help_all="1;argc.at:17;argc;argc; 2;command.at:17;command;command; 3;match.at:17;match;match; 4;matchprog.at:17;match program name;matchprog; 5;uid.at:17;uid;uid; 6;gid.at:17;gid;gid; 7;set.at:17;set;set; 8;delete.at:17;delete;delete; 9;transform.at:17;transform;transform; 10;map.at:17;map;map; 11;umask.at:17;umask;umask; 12;newgrp.at:17;newgrp;newgrp; 13;chdir.at:17;chdir;chdir; 14;env.at:17;env;env; 15;interactive.at:17;interactive;interactive; 16;fallthrough.at:17;fall-through;fallthrough fall-through; 17;error.at:17;error;error; " # List of the all the test groups. at_groups_all=`$as_echo "$at_help_all" | sed 's/;.*//'` # at_fn_validate_ranges NAME... # ----------------------------- # Validate and normalize the test group number contained in each variable # NAME. Leading zeroes are treated as decimal. at_fn_validate_ranges () { for at_grp do eval at_value=\$$at_grp if test $at_value -lt 1 || test $at_value -gt 17; then $as_echo "invalid test group: $at_value" >&2 exit 1 fi case $at_value in 0*) # We want to treat leading 0 as decimal, like expr and test, but # AS_VAR_ARITH treats it as octal if it uses $(( )). # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the # expr fork, but it is not worth the effort to determine if the # shell supports XSI when the user can just avoid leading 0. eval $at_grp='`expr $at_value + 0`' ;; esac done } at_prev= for at_option do # If the previous option needs an argument, assign it. if test -n "$at_prev"; then at_option=$at_prev=$at_option at_prev= fi case $at_option in *=?*) at_optarg=`expr "X$at_option" : '[^=]*=\(.*\)'` ;; *) at_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $at_option in --help | -h ) at_help_p=: ;; --list | -l ) at_list_p=: ;; --version | -V ) at_version_p=: ;; --clean | -c ) at_clean=: ;; --color ) at_color=always ;; --color=* ) case $at_optarg in no | never | none) at_color=never ;; auto | tty | if-tty) at_color=auto ;; always | yes | force) at_color=always ;; *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'` as_fn_error $? "unrecognized argument to $at_optname: $at_optarg" ;; esac ;; --debug | -d ) at_debug_p=: ;; --errexit | -e ) at_debug_p=: at_errexit_p=: ;; --verbose | -v ) at_verbose=; at_quiet=: ;; --trace | -x ) at_traceon='set -x' at_trace_echo=echo at_check_filter_trace=at_fn_filter_trace ;; [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]) at_fn_validate_ranges at_option as_fn_append at_groups "$at_option$as_nl" ;; # Ranges [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-) at_range_start=`echo $at_option |tr -d X-` at_fn_validate_ranges at_range_start at_range=`$as_echo "$at_groups_all" | \ sed -ne '/^'$at_range_start'$/,$p'` as_fn_append at_groups "$at_range$as_nl" ;; -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]) at_range_end=`echo $at_option |tr -d X-` at_fn_validate_ranges at_range_end at_range=`$as_echo "$at_groups_all" | \ sed -ne '1,/^'$at_range_end'$/p'` as_fn_append at_groups "$at_range$as_nl" ;; [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \ [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \ [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \ [0-9][0-9][0-9]-[0-9][0-9][0-9] | \ [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \ [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] ) at_range_start=`expr $at_option : '\(.*\)-'` at_range_end=`expr $at_option : '.*-\(.*\)'` if test $at_range_start -gt $at_range_end; then at_tmp=$at_range_end at_range_end=$at_range_start at_range_start=$at_tmp fi at_fn_validate_ranges at_range_start at_range_end at_range=`$as_echo "$at_groups_all" | \ sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'` as_fn_append at_groups "$at_range$as_nl" ;; # Directory selection. --directory | -C ) at_prev=--directory ;; --directory=* ) at_change_dir=: at_dir=$at_optarg if test x- = "x$at_dir" ; then at_dir=./- fi ;; # Parallel execution. --jobs | -j ) at_jobs=0 ;; --jobs=* | -j[0-9]* ) if test -n "$at_optarg"; then at_jobs=$at_optarg else at_jobs=`expr X$at_option : 'X-j\(.*\)'` fi case $at_jobs in *[!0-9]*) at_optname=`echo " $at_option" | sed 's/^ //; s/[0-9=].*//'` as_fn_error $? "non-numeric argument to $at_optname: $at_jobs" ;; esac ;; # Keywords. --keywords | -k ) at_prev=--keywords ;; --keywords=* ) at_groups_selected=$at_help_all at_save_IFS=$IFS IFS=, set X $at_optarg shift IFS=$at_save_IFS for at_keyword do at_invert= case $at_keyword in '!'*) at_invert="-v" at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'` ;; esac # It is on purpose that we match the test group titles too. at_groups_selected=`$as_echo "$at_groups_selected" | grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"` done # Smash the keywords. at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//'` as_fn_append at_groups "$at_groups_selected$as_nl" ;; --recheck) at_recheck=: ;; *=*) at_envvar=`expr "x$at_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $at_envvar in '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$at_envvar'" ;; esac at_value=`$as_echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"` # Export now, but save eval for later and for debug scripts. export $at_envvar as_fn_append at_debug_args " $at_envvar='$at_value'" ;; *) $as_echo "$as_me: invalid option: $at_option" >&2 $as_echo "Try \`$0 --help' for more information." >&2 exit 1 ;; esac done # Verify our last option didn't require an argument if test -n "$at_prev"; then : as_fn_error $? "\`$at_prev' requires an argument" fi # The file containing the suite. at_suite_log=$at_dir/$as_me.log # Selected test groups. if test -z "$at_groups$at_recheck"; then at_groups=$at_groups_all else if test -n "$at_recheck" && test -r "$at_suite_log"; then at_oldfails=`sed -n ' /^Failed tests:$/,/^Skipped tests:$/{ s/^[ ]*\([1-9][0-9]*\):.*/\1/p } /^Unexpected passes:$/,/^## Detailed failed tests/{ s/^[ ]*\([1-9][0-9]*\):.*/\1/p } /^## Detailed failed tests/q ' "$at_suite_log"` as_fn_append at_groups "$at_oldfails$as_nl" fi # Sort the tests, removing duplicates. at_groups=`$as_echo "$at_groups" | sort -nu | sed '/^$/d'` fi if test x"$at_color" = xalways \ || { test x"$at_color" = xauto && test -t 1; }; then at_red=`printf '\033[0;31m'` at_grn=`printf '\033[0;32m'` at_lgn=`printf '\033[1;32m'` at_blu=`printf '\033[1;34m'` at_std=`printf '\033[m'` else at_red= at_grn= at_lgn= at_blu= at_std= fi # Help message. if $at_help_p; then cat <<_ATEOF || at_write_fail=1 Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS] Run all the tests, or the selected TESTS, given by numeric ranges, and save a detailed log file. Upon failure, create debugging scripts. Do not change environment variables directly. Instead, set them via command line arguments. Set \`AUTOTEST_PATH' to select the executables to exercise. Each relative directory is expanded as build and source directories relative to the top level of this distribution. E.g., from within the build directory /tmp/foo-1.0, invoking this: $ $0 AUTOTEST_PATH=bin is equivalent to the following, assuming the source directory is /src/foo-1.0: PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $0 _ATEOF cat <<_ATEOF || at_write_fail=1 Operation modes: -h, --help print the help message, then exit -V, --version print version number, then exit -c, --clean remove all the files this test suite might create and exit -l, --list describes all the tests, or the selected TESTS _ATEOF cat <<_ATEOF || at_write_fail=1 Execution tuning: -C, --directory=DIR change to directory DIR before starting --color[=never|auto|always] enable colored test results on terminal, or always -j, --jobs[=N] Allow N jobs at once; infinite jobs with no arg (default 1) -k, --keywords=KEYWORDS select the tests matching all the comma-separated KEYWORDS multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD --recheck select all tests that failed or passed unexpectedly last time -e, --errexit abort as soon as a test fails; implies --debug -v, --verbose force more detailed output default for debugging scripts -d, --debug inhibit clean up and top-level logging default for debugging scripts -x, --trace enable tests shell tracing _ATEOF cat <<_ATEOF || at_write_fail=1 Report bugs to . General help using GNU software: . _ATEOF exit $at_write_fail fi # List of tests. if $at_list_p; then cat <<_ATEOF || at_write_fail=1 GNU rush 1.8 test suite test groups: NUM: FILE-NAME:LINE TEST-GROUP-NAME KEYWORDS _ATEOF # Pass an empty line as separator between selected groups and help. $as_echo "$at_groups$as_nl$as_nl$at_help_all" | awk 'NF == 1 && FS != ";" { selected[$ 1] = 1 next } /^$/ { FS = ";" } NF > 0 { if (selected[$ 1]) { printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3 if ($ 4) { lmax = 79 indent = " " line = indent len = length (line) n = split ($ 4, a, " ") for (i = 1; i <= n; i++) { l = length (a[i]) + 1 if (i > 1 && len + l > lmax) { print line line = indent " " a[i] len = length (line) } else { line = line " " a[i] len += l } } if (n) print line } } }' || at_write_fail=1 exit $at_write_fail fi if $at_version_p; then $as_echo "$as_me (GNU rush 1.8)" && cat <<\_ATEOF || at_write_fail=1 Copyright (C) 2012 Free Software Foundation, Inc. This test suite is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ATEOF exit $at_write_fail fi # Should we print banners? Yes if more than one test is run. case $at_groups in #( *$as_nl* ) at_print_banners=: ;; #( * ) at_print_banners=false ;; esac # Text for banner N, set to a single space once printed. # Banner 1. testsuite.at:58 # Category starts at test group 1. at_banner_text_1="Conditionals" # Banner 2. testsuite.at:66 # Category starts at test group 7. at_banner_text_2="Transformations" # Banner 3. testsuite.at:72 # Category starts at test group 11. at_banner_text_3="Actions" # Banner 4. testsuite.at:79 # Category starts at test group 15. at_banner_text_4="Features" # Take any -C into account. if $at_change_dir ; then test x != "x$at_dir" && cd "$at_dir" \ || as_fn_error $? "unable to change directory" at_dir=`pwd` fi # Load the config files for any default variable assignments. for at_file in atconfig atlocal do test -r $at_file || continue . ./$at_file || as_fn_error $? "invalid content: $at_file" done # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix: : "${at_top_build_prefix=$at_top_builddir}" # Perform any assignments requested during argument parsing. eval "$at_debug_args" # atconfig delivers names relative to the directory the test suite is # in, but the groups themselves are run in testsuite-dir/group-dir. if test -n "$at_top_srcdir"; then builddir=../.. for at_dir_var in srcdir top_srcdir top_build_prefix do eval at_val=\$at_$at_dir_var case $at_val in [\\/$]* | ?:[\\/]* ) at_prefix= ;; *) at_prefix=../../ ;; esac eval "$at_dir_var=\$at_prefix\$at_val" done fi ## -------------------- ## ## Directory structure. ## ## -------------------- ## # This is the set of directories and files used by this script # (non-literals are capitalized): # # TESTSUITE - the testsuite # TESTSUITE.log - summarizes the complete testsuite run # TESTSUITE.dir/ - created during a run, remains after -d or failed test # + at-groups/ - during a run: status of all groups in run # | + NNN/ - during a run: meta-data about test group NNN # | | + check-line - location (source file and line) of current AT_CHECK # | | + status - exit status of current AT_CHECK # | | + stdout - stdout of current AT_CHECK # | | + stder1 - stderr, including trace # | | + stderr - stderr, with trace filtered out # | | + test-source - portion of testsuite that defines group # | | + times - timestamps for computing duration # | | + pass - created if group passed # | | + xpass - created if group xpassed # | | + fail - created if group failed # | | + xfail - created if group xfailed # | | + skip - created if group skipped # + at-stop - during a run: end the run if this file exists # + at-source-lines - during a run: cache of TESTSUITE line numbers for extraction # + 0..NNN/ - created for each group NNN, remains after -d or failed test # | + TESTSUITE.log - summarizes the group results # | + ... - files created during the group # The directory the whole suite works in. # Should be absolute to let the user `cd' at will. at_suite_dir=$at_dir/$as_me.dir # The file containing the suite ($at_dir might have changed since earlier). at_suite_log=$at_dir/$as_me.log # The directory containing helper files per test group. at_helper_dir=$at_suite_dir/at-groups # Stop file: if it exists, do not start new jobs. at_stop_file=$at_suite_dir/at-stop # The fifo used for the job dispatcher. at_job_fifo=$at_suite_dir/at-job-fifo if $at_clean; then test -d "$at_suite_dir" && find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \; rm -f -r "$at_suite_dir" "$at_suite_log" exit $? fi # Don't take risks: use only absolute directories in PATH. # # For stand-alone test suites (ie. atconfig was not found), # AUTOTEST_PATH is relative to `.'. # # For embedded test suites, AUTOTEST_PATH is relative to the top level # of the package. Then expand it into build/src parts, since users # may create executables in both places. AUTOTEST_PATH=`$as_echo "$AUTOTEST_PATH" | sed "s|:|$PATH_SEPARATOR|g"` at_path= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $AUTOTEST_PATH $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -n "$at_path" && as_fn_append at_path $PATH_SEPARATOR case $as_dir in [\\/]* | ?:[\\/]* ) as_fn_append at_path "$as_dir" ;; * ) if test -z "$at_top_build_prefix"; then # Stand-alone test suite. as_fn_append at_path "$as_dir" else # Embedded test suite. as_fn_append at_path "$at_top_build_prefix$as_dir$PATH_SEPARATOR" as_fn_append at_path "$at_top_srcdir/$as_dir" fi ;; esac done IFS=$as_save_IFS # Now build and simplify PATH. # # There might be directories that don't exist, but don't redirect # builtins' (eg., cd) stderr directly: Ultrix's sh hates that. at_new_path= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $at_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -d "$as_dir" || continue case $as_dir in [\\/]* | ?:[\\/]* ) ;; * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;; esac case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;; $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;; *) as_fn_append at_new_path "$PATH_SEPARATOR$as_dir" ;; esac done IFS=$as_save_IFS PATH=$at_new_path export PATH # Setting up the FDs. # 5 is the log file. Not to be overwritten if `-d'. if $at_debug_p; then at_suite_log=/dev/null else : >"$at_suite_log" fi exec 5>>"$at_suite_log" # Banners and logs. $as_echo "## ------------------------ ## ## GNU rush 1.8 test suite. ## ## ------------------------ ##" { $as_echo "## ------------------------ ## ## GNU rush 1.8 test suite. ## ## ------------------------ ##" echo $as_echo "$as_me: command line was:" $as_echo " \$ $0 $at_cli_args" echo # If ChangeLog exists, list a few lines in case it might help determining # the exact version. if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then $as_echo "## ---------- ## ## ChangeLog. ## ## ---------- ##" echo sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog" echo fi { 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` /usr/bin/hostinfo = `(/usr/bin/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=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } echo # Contents of the config files. for at_file in atconfig atlocal do test -r $at_file || continue $as_echo "$as_me: $at_file:" sed 's/^/| /' $at_file echo done } >&5 ## ------------------------- ## ## Autotest shell functions. ## ## ------------------------- ## # at_fn_banner NUMBER # ------------------- # Output banner NUMBER, provided the testsuite is running multiple groups and # this particular banner has not yet been printed. at_fn_banner () { $at_print_banners || return 0 eval at_banner_text=\$at_banner_text_$1 test "x$at_banner_text" = "x " && return 0 eval "at_banner_text_$1=\" \"" if test -z "$at_banner_text"; then $at_first || echo else $as_echo "$as_nl$at_banner_text$as_nl" fi } # at_fn_banner # at_fn_check_prepare_notrace REASON LINE # --------------------------------------- # Perform AT_CHECK preparations for the command at LINE for an untraceable # command; REASON is the reason for disabling tracing. at_fn_check_prepare_notrace () { $at_trace_echo "Not enabling shell tracing (command contains $1)" $as_echo "$2" >"$at_check_line_file" at_check_trace=: at_check_filter=: : >"$at_stdout"; : >"$at_stderr" } # at_fn_check_prepare_trace LINE # ------------------------------ # Perform AT_CHECK preparations for the command at LINE for a traceable # command. at_fn_check_prepare_trace () { $as_echo "$1" >"$at_check_line_file" at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace : >"$at_stdout"; : >"$at_stderr" } # at_fn_check_prepare_dynamic COMMAND LINE # ---------------------------------------- # Decide if COMMAND at LINE is traceable at runtime, and call the appropriate # preparation function. at_fn_check_prepare_dynamic () { case $1 in *$as_nl*) at_fn_check_prepare_notrace 'an embedded newline' "$2" ;; *) at_fn_check_prepare_trace "$2" ;; esac } # at_fn_filter_trace # ------------------ # Remove the lines in the file "$at_stderr" generated by "set -x" and print # them to stderr. at_fn_filter_trace () { mv "$at_stderr" "$at_stder1" grep '^ *+' "$at_stder1" >&2 grep -v '^ *+' "$at_stder1" >"$at_stderr" } # at_fn_log_failure FILE-LIST # --------------------------- # Copy the files in the list on stdout with a "> " prefix, and exit the shell # with a failure exit code. at_fn_log_failure () { for file do $as_echo "$file:"; sed 's/^/> /' "$file"; done echo 1 > "$at_status_file" exit 1 } # at_fn_check_skip EXIT-CODE LINE # ------------------------------- # Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit # the test group subshell with that same exit code. Use LINE in any report # about test failure. at_fn_check_skip () { case $1 in 99) echo 99 > "$at_status_file"; at_failed=: $as_echo "$2: hard failure"; exit 99;; 77) echo 77 > "$at_status_file"; exit 77;; esac } # at_fn_check_status EXPECTED EXIT-CODE LINE # ------------------------------------------ # Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing. # Otherwise, if it is 77 or 99, exit the test group subshell with that same # exit code; if it is anything else print an error message referring to LINE, # and fail the test. at_fn_check_status () { case $2 in $1 ) ;; 77) echo 77 > "$at_status_file"; exit 77;; 99) echo 99 > "$at_status_file"; at_failed=: $as_echo "$3: hard failure"; exit 99;; *) $as_echo "$3: exit code was $2, expected $1" at_failed=:;; esac } # at_fn_diff_devnull FILE # ----------------------- # Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless diff # invocations. at_fn_diff_devnull () { test -s "$1" || return 0 $at_diff "$at_devnull" "$1" } # at_fn_test NUMBER # ----------------- # Parse out test NUMBER from the tail of this file. at_fn_test () { eval at_sed=\$at_sed$1 sed "$at_sed" "$at_myself" > "$at_test_source" } # at_fn_create_debugging_script # ----------------------------- # Create the debugging script $at_group_dir/run which will reproduce the # current test group. at_fn_create_debugging_script () { { echo "#! /bin/sh" && echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\''' && $as_echo "cd '$at_dir'" && $as_echo "exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d $at_debug_args $at_group \${1+\"\$@\"}" && echo 'exit 1' } >"$at_group_dir/run" && chmod +x "$at_group_dir/run" } ## -------------------------------- ## ## End of autotest shell functions. ## ## -------------------------------- ## { $as_echo "## ---------------- ## ## Tested programs. ## ## ---------------- ##" echo } >&5 # Report what programs are being tested. for at_program in : $at_tested do test "$at_program" = : && continue case $at_program in [\\/]* | ?:[\\/]* ) $at_program_=$at_program ;; * ) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -f "$as_dir/$at_program" && break done IFS=$as_save_IFS at_program_=$as_dir/$at_program ;; esac if test -f "$at_program_"; then { $as_echo "$at_srcdir/testsuite.at:54: $at_program_ --version" "$at_program_" --version &5 2>&1 else as_fn_error $? "cannot find $at_program" "$LINENO" 5 fi done { $as_echo "## ------------------ ## ## Running the tests. ## ## ------------------ ##" } >&5 at_start_date=`date` at_start_time=`date +%s 2>/dev/null` $as_echo "$as_me: starting at: $at_start_date" >&5 # Create the master directory if it doesn't already exist. as_dir="$at_suite_dir"; as_fn_mkdir_p || as_fn_error $? "cannot create \`$at_suite_dir'" "$LINENO" 5 # Can we diff with `/dev/null'? DU 5.0 refuses. if diff /dev/null /dev/null >/dev/null 2>&1; then at_devnull=/dev/null else at_devnull=$at_suite_dir/devnull >"$at_devnull" fi # Use `diff -u' when possible. if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff" then at_diff='diff -u' else at_diff=diff fi # Get the last needed group. for at_group in : $at_groups; do :; done # Extract the start and end lines of each test group at the tail # of this file awk ' BEGIN { FS="" } /^#AT_START_/ { start = NR } /^#AT_STOP_/ { test = substr ($ 0, 10) print "at_sed" test "=\"1," start "d;" (NR-1) "q\"" if (test == "'"$at_group"'") exit }' "$at_myself" > "$at_suite_dir/at-source-lines" && . "$at_suite_dir/at-source-lines" || as_fn_error $? "cannot create test line number cache" "$LINENO" 5 rm -f "$at_suite_dir/at-source-lines" # Set number of jobs for `-j'; avoid more jobs than test groups. set X $at_groups; shift; at_max_jobs=$# if test $at_max_jobs -eq 0; then at_jobs=1 fi if test $at_jobs -ne 1 && { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then at_jobs=$at_max_jobs fi # If parallel mode, don't output banners, don't split summary lines. if test $at_jobs -ne 1; then at_print_banners=false at_quiet=: fi # Set up helper dirs. rm -rf "$at_helper_dir" && mkdir "$at_helper_dir" && cd "$at_helper_dir" && { test -z "$at_groups" || mkdir $at_groups; } || as_fn_error $? "testsuite directory setup failed" "$LINENO" 5 # Functions for running a test group. We leave the actual # test group execution outside of a shell function in order # to avoid hitting zsh 4.x exit status bugs. # at_fn_group_prepare # ------------------- # Prepare for running a test group. at_fn_group_prepare () { # The directory for additional per-group helper files. at_job_dir=$at_helper_dir/$at_group # The file containing the location of the last AT_CHECK. at_check_line_file=$at_job_dir/check-line # The file containing the exit status of the last command. at_status_file=$at_job_dir/status # The files containing the output of the tested commands. at_stdout=$at_job_dir/stdout at_stder1=$at_job_dir/stder1 at_stderr=$at_job_dir/stderr # The file containing the code for a test group. at_test_source=$at_job_dir/test-source # The file containing dates. at_times_file=$at_job_dir/times # Be sure to come back to the top test directory. cd "$at_suite_dir" # Clearly separate the test groups when verbose. $at_first || $at_verbose echo at_group_normalized=$at_group eval 'while :; do case $at_group_normalized in #( '"$at_format"'*) break;; esac at_group_normalized=0$at_group_normalized done' # Create a fresh directory for the next test group, and enter. # If one already exists, the user may have invoked ./run from # within that directory; we remove the contents, but not the # directory itself, so that we aren't pulling the rug out from # under the shell's notion of the current directory. at_group_dir=$at_suite_dir/$at_group_normalized at_group_log=$at_group_dir/$as_me.log if test -d "$at_group_dir"; then find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx {} \; rm -fr "$at_group_dir"/* "$at_group_dir"/.[!.] "$at_group_dir"/.??* fi || { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: test directory for $at_group_normalized could not be cleaned" >&5 $as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned" >&2;} # Be tolerant if the above `rm' was not able to remove the directory. as_dir="$at_group_dir"; as_fn_mkdir_p echo 0 > "$at_status_file" # In verbose mode, append to the log file *and* show on # the standard output; in quiet mode only write to the log. if test -z "$at_verbose"; then at_tee_pipe='tee -a "$at_group_log"' else at_tee_pipe='cat >> "$at_group_log"' fi } # at_fn_group_banner ORDINAL LINE DESC PAD [BANNER] # ------------------------------------------------- # Declare the test group ORDINAL, located at LINE with group description DESC, # and residing under BANNER. Use PAD to align the status column. at_fn_group_banner () { at_setup_line="$2" test -n "$5" && at_fn_banner $5 at_desc="$3" case $1 in [0-9]) at_desc_line=" $1: ";; [0-9][0-9]) at_desc_line=" $1: " ;; *) at_desc_line="$1: " ;; esac as_fn_append at_desc_line "$3$4" $at_quiet $as_echo_n "$at_desc_line" echo "# -*- compilation -*-" >> "$at_group_log" } # at_fn_group_postprocess # ----------------------- # Perform cleanup after running a test group. at_fn_group_postprocess () { # Be sure to come back to the suite directory, in particular # since below we might `rm' the group directory we are in currently. cd "$at_suite_dir" if test ! -f "$at_check_line_file"; then sed "s/^ */$as_me: WARNING: /" <<_ATEOF A failure happened in a test group before any test could be run. This means that test suite is improperly designed. Please report this failure to . _ATEOF $as_echo "$at_setup_line" >"$at_check_line_file" at_status=99 fi $at_verbose $as_echo_n "$at_group. $at_setup_line: " $as_echo_n "$at_group. $at_setup_line: " >> "$at_group_log" case $at_xfail:$at_status in yes:0) at_msg="UNEXPECTED PASS" at_res=xpass at_errexit=$at_errexit_p at_color=$at_red ;; no:0) at_msg="ok" at_res=pass at_errexit=false at_color=$at_grn ;; *:77) at_msg='skipped ('`cat "$at_check_line_file"`')' at_res=skip at_errexit=false at_color=$at_blu ;; no:* | *:99) at_msg='FAILED ('`cat "$at_check_line_file"`')' at_res=fail at_errexit=$at_errexit_p at_color=$at_red ;; yes:*) at_msg='expected failure ('`cat "$at_check_line_file"`')' at_res=xfail at_errexit=false at_color=$at_lgn ;; esac echo "$at_res" > "$at_job_dir/$at_res" # In parallel mode, output the summary line only afterwards. if test $at_jobs -ne 1 && test -n "$at_verbose"; then $as_echo "$at_desc_line $at_color$at_msg$at_std" else # Make sure there is a separator even with long titles. $as_echo " $at_color$at_msg$at_std" fi at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg" case $at_status in 0|77) # $at_times_file is only available if the group succeeded. # We're not including the group log, so the success message # is written in the global log separately. But we also # write to the group log in case they're using -d. if test -f "$at_times_file"; then at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')' rm -f "$at_times_file" fi $as_echo "$at_log_msg" >> "$at_group_log" $as_echo "$at_log_msg" >&5 # Cleanup the group directory, unless the user wants the files # or the success was unexpected. if $at_debug_p || test $at_res = xpass; then at_fn_create_debugging_script if test $at_res = xpass && $at_errexit; then echo stop > "$at_stop_file" fi else if test -d "$at_group_dir"; then find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \; rm -fr "$at_group_dir" fi rm -f "$at_test_source" fi ;; *) # Upon failure, include the log into the testsuite's global # log. The failure message is written in the group log. It # is later included in the global log. $as_echo "$at_log_msg" >> "$at_group_log" # Upon failure, keep the group directory for autopsy, and create # the debugging script. With -e, do not start any further tests. at_fn_create_debugging_script if $at_errexit; then echo stop > "$at_stop_file" fi ;; esac } ## ------------ ## ## Driver loop. ## ## ------------ ## if (set -m && set +m && set +b) >/dev/null 2>&1; then set +b at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=- else at_job_control_on=: at_job_control_off=: at_job_group= fi for at_signal in 1 2 15; do trap 'set +x; set +e $at_job_control_off at_signal='"$at_signal"' echo stop > "$at_stop_file" trap "" $at_signal at_pgids= for at_pgid in `jobs -p 2>/dev/null`; do at_pgids="$at_pgids $at_job_group$at_pgid" done test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null wait if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then echo >&2 fi at_signame=`kill -l $at_signal 2>&1 || echo $at_signal` set x $at_signame test 0 -gt 2 && at_signame=$at_signal { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: caught signal $at_signame, bailing out" >&5 $as_echo "$as_me: WARNING: caught signal $at_signame, bailing out" >&2;} as_fn_arith 128 + $at_signal && exit_status=$as_val as_fn_exit $exit_status' $at_signal done rm -f "$at_stop_file" at_first=: if test $at_jobs -ne 1 && rm -f "$at_job_fifo" && test -n "$at_job_group" && ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null then # FIFO job dispatcher. trap 'at_pids= for at_pid in `jobs -p`; do at_pids="$at_pids $at_job_group$at_pid" done if test -n "$at_pids"; then at_sig=TSTP test "${TMOUT+set}" = set && at_sig=STOP kill -$at_sig $at_pids 2>/dev/null fi kill -STOP $$ test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP echo # Turn jobs into a list of numbers, starting from 1. at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p` set X $at_joblist shift for at_group in $at_groups; do $at_job_control_on 2>/dev/null ( # Start one test group. $at_job_control_off if $at_first; then exec 7>"$at_job_fifo" else exec 6<&- fi trap 'set +x; set +e trap "" PIPE echo stop > "$at_stop_file" echo >&7 as_fn_exit 141' PIPE at_fn_group_prepare if cd "$at_group_dir" && at_fn_test $at_group && . "$at_test_source" then :; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;} at_failed=: fi at_fn_group_postprocess echo >&7 ) & $at_job_control_off if $at_first; then at_first=false exec 6<"$at_job_fifo" 7>"$at_job_fifo" fi shift # Consume one token. if test $# -gt 0; then :; else read at_token <&6 || break set x $* fi test -f "$at_stop_file" && break done exec 7>&- # Read back the remaining ($at_jobs - 1) tokens. set X $at_joblist shift if test $# -gt 0; then shift for at_job do read at_token done <&6 fi exec 6<&- wait else # Run serially, avoid forks and other potential surprises. for at_group in $at_groups; do at_fn_group_prepare if cd "$at_group_dir" && at_fn_test $at_group && . "$at_test_source"; then :; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;} at_failed=: fi at_fn_group_postprocess test -f "$at_stop_file" && break at_first=false done fi # Wrap up the test suite with summary statistics. cd "$at_helper_dir" # Use ?..???? when the list must remain sorted, the faster * otherwise. at_pass_list=`for f in */pass; do echo $f; done | sed '/\*/d; s,/pass,,'` at_skip_list=`for f in */skip; do echo $f; done | sed '/\*/d; s,/skip,,'` at_xfail_list=`for f in */xfail; do echo $f; done | sed '/\*/d; s,/xfail,,'` at_xpass_list=`for f in ?/xpass ??/xpass ???/xpass ????/xpass; do echo $f; done | sed '/?/d; s,/xpass,,'` at_fail_list=`for f in ?/fail ??/fail ???/fail ????/fail; do echo $f; done | sed '/?/d; s,/fail,,'` set X $at_pass_list $at_xpass_list $at_xfail_list $at_fail_list $at_skip_list shift; at_group_count=$# set X $at_xpass_list; shift; at_xpass_count=$#; at_xpass_list=$* set X $at_xfail_list; shift; at_xfail_count=$# set X $at_fail_list; shift; at_fail_count=$#; at_fail_list=$* set X $at_skip_list; shift; at_skip_count=$# as_fn_arith $at_group_count - $at_skip_count && at_run_count=$as_val as_fn_arith $at_xpass_count + $at_fail_count && at_unexpected_count=$as_val as_fn_arith $at_xfail_count + $at_fail_count && at_total_fail_count=$as_val # Back to the top directory. cd "$at_dir" rm -rf "$at_helper_dir" # Compute the duration of the suite. at_stop_date=`date` at_stop_time=`date +%s 2>/dev/null` $as_echo "$as_me: ending at: $at_stop_date" >&5 case $at_start_time,$at_stop_time in [0-9]*,[0-9]*) as_fn_arith $at_stop_time - $at_start_time && at_duration_s=$as_val as_fn_arith $at_duration_s / 60 && at_duration_m=$as_val as_fn_arith $at_duration_m / 60 && at_duration_h=$as_val as_fn_arith $at_duration_s % 60 && at_duration_s=$as_val as_fn_arith $at_duration_m % 60 && at_duration_m=$as_val at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s" $as_echo "$as_me: test suite duration: $at_duration" >&5 ;; esac echo $as_echo "## ------------- ## ## Test results. ## ## ------------- ##" echo { echo $as_echo "## ------------- ## ## Test results. ## ## ------------- ##" echo } >&5 if test $at_run_count = 1; then at_result="1 test" at_were=was else at_result="$at_run_count tests" at_were=were fi if $at_errexit_p && test $at_unexpected_count != 0; then if test $at_xpass_count = 1; then at_result="$at_result $at_were run, one passed" else at_result="$at_result $at_were run, one failed" fi at_result="$at_result unexpectedly and inhibited subsequent tests." at_color=$at_red else # Don't you just love exponential explosion of the number of cases? at_color=$at_red case $at_xpass_count:$at_fail_count:$at_xfail_count in # So far, so good. 0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;; 0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;; # Some unexpected failures 0:*:0) at_result="$at_result $at_were run, $at_fail_count failed unexpectedly." ;; # Some failures, both expected and unexpected 0:*:1) at_result="$at_result $at_were run, $at_total_fail_count failed ($at_xfail_count expected failure)." ;; 0:*:*) at_result="$at_result $at_were run, $at_total_fail_count failed ($at_xfail_count expected failures)." ;; # No unexpected failures, but some xpasses *:0:*) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly." ;; # No expected failures, but failures and xpasses *:1:0) at_result="$at_result $at_were run, $at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;; *:*:0) at_result="$at_result $at_were run, $at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;; # All of them. *:*:1) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly, $at_total_fail_count failed ($at_xfail_count expected failure)." ;; *:*:*) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly, $at_total_fail_count failed ($at_xfail_count expected failures)." ;; esac if test $at_skip_count = 0 && test $at_run_count -gt 1; then at_result="All $at_result" fi fi # Now put skips in the mix. case $at_skip_count in 0) ;; 1) at_result="$at_result 1 test was skipped." ;; *) at_result="$at_result $at_skip_count tests were skipped." ;; esac if test $at_unexpected_count = 0; then echo "$at_color$at_result$at_std" echo "$at_result" >&5 else echo "${at_color}ERROR: $at_result$at_std" >&2 echo "ERROR: $at_result" >&5 { echo $as_echo "## ------------------------ ## ## Summary of the failures. ## ## ------------------------ ##" # Summary of failed and skipped tests. if test $at_fail_count != 0; then echo "Failed tests:" $SHELL "$at_myself" $at_fail_list --list echo fi if test $at_skip_count != 0; then echo "Skipped tests:" $SHELL "$at_myself" $at_skip_list --list echo fi if test $at_xpass_count != 0; then echo "Unexpected passes:" $SHELL "$at_myself" $at_xpass_list --list echo fi if test $at_fail_count != 0; then $as_echo "## ---------------------- ## ## Detailed failed tests. ## ## ---------------------- ##" echo for at_group in $at_fail_list do at_group_normalized=$at_group eval 'while :; do case $at_group_normalized in #( '"$at_format"'*) break;; esac at_group_normalized=0$at_group_normalized done' cat "$at_suite_dir/$at_group_normalized/$as_me.log" echo done echo fi if test -n "$at_top_srcdir"; then sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## ${at_top_build_prefix}config.log ## _ASBOX sed 's/^/| /' ${at_top_build_prefix}config.log echo fi } >&5 sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## $as_me.log was created. ## _ASBOX echo if $at_debug_p; then at_msg='per-test log files' else at_msg="\`${at_testdir+${at_testdir}/}$as_me.log'" fi $as_echo "Please send $at_msg and all information you think might help: To: Subject: [GNU rush 1.8] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly} You may investigate any problem if you feel able to do so, in which case the test suite provides a good starting point. Its output may be found below \`${at_testdir+${at_testdir}/}$as_me.dir'. " exit 1 fi exit 0 ## ------------- ## ## Actual tests. ## ## ------------- ## #AT_START_1 at_fn_group_banner 1 'argc.at:17' \ "argc" " " 1 at_xfail=no ( $as_echo "1. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/argc.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c \"/usr/bin/echo foo\" test.conf echo \"# \$?\" echo \"# /usr/bin/echo foo bar\" echo \"# /usr/bin/echo foo bar\" >&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c \"/usr/bin/echo foo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "argc.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c "/usr/bin/echo foo" test.conf echo "# $?" echo "# /usr/bin/echo foo bar" echo "# /usr/bin/echo foo bar" >&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c "/usr/bin/echo foo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# /usr/bin/echo foo # /usr/bin/echo foo bar rush: Error: no matching rule for \"/usr/bin/echo foo bar\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# /usr/bin/echo foo { \"cmdline\":\"/usr/bin/echo foo\", \"argv\":[ \"/usr/bin/echo\", \"foo\" ], \"prog\":null, \"interactive\":0, \"fork\":-1, \"acct\":-1 } # 0 # /usr/bin/echo foo bar # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/argc.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_1 #AT_START_2 at_fn_group_banner 2 'command.at:17' \ "command" " " 1 at_xfail=no ( $as_echo "2. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/command.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c \"/usr/bin/echo foo\" test.conf echo \"# \$?\" echo \"# /usr/bin/echo foo bar\" echo \"# /usr/bin/echo foo bar\" >&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c \"/usr/bin/echo foo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "command.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c "/usr/bin/echo foo" test.conf echo "# $?" echo "# /usr/bin/echo foo bar" echo "# /usr/bin/echo foo bar" >&2 rush -C none -Dcmdline,argv,prog,interactive,fork,acct -c "/usr/bin/echo foo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# /usr/bin/echo foo # /usr/bin/echo foo bar rush: Error: no matching rule for \"/usr/bin/echo foo bar\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# /usr/bin/echo foo { \"cmdline\":\"/usr/bin/echo foo\", \"argv\":[ \"/usr/bin/echo\", \"foo\" ], \"prog\":null, \"interactive\":0, \"fork\":-1, \"acct\":-1 } # 0 # /usr/bin/echo foo bar # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/command.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_2 #AT_START_3 at_fn_group_banner 3 'match.at:17' \ "match" " " 1 at_xfail=no ( $as_echo "3. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/match.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"/usr/bin/echo foo\" test.conf echo \"# \$?\" echo \"# /usr/bin/echo bar\" echo \"# /usr/bin/echo bar\" >&2 rush -C none -Dcmdline,argv,prog -c \"/usr/bin/echo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "match.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "/usr/bin/echo foo" test.conf echo "# $?" echo "# /usr/bin/echo bar" echo "# /usr/bin/echo bar" >&2 rush -C none -Dcmdline,argv,prog -c "/usr/bin/echo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# /usr/bin/echo foo # /usr/bin/echo bar rush: Error: no matching rule for \"/usr/bin/echo bar\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# /usr/bin/echo foo { \"cmdline\":\"/usr/bin/echo foo\", \"argv\":[ \"/usr/bin/echo\", \"foo\" ], \"prog\":null } # 0 # /usr/bin/echo bar # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/match.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_3 #AT_START_4 at_fn_group_banner 4 'matchprog.at:17' \ "match program name" " " 1 at_xfail=no ( $as_echo "4. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/matchprog.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"/usr/bin/echo foo\" test.conf echo \"# \$?\" echo \"# echo foo\" echo \"# echo foo\" >&2 rush -C none -Dcmdline,argv,prog -c \"echo foo\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "matchprog.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "/usr/bin/echo foo" test.conf echo "# $?" echo "# echo foo" echo "# echo foo" >&2 rush -C none -Dcmdline,argv,prog -c "echo foo" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# /usr/bin/echo foo # echo foo rush: Error: no matching rule for \"echo foo\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# /usr/bin/echo foo { \"cmdline\":\"/usr/bin/echo foo\", \"argv\":[ \"/usr/bin/echo\", \"foo\" ], \"prog\":null } # 0 # echo foo # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/matchprog.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_4 #AT_START_5 at_fn_group_banner 5 'uid.at:17' \ "uid" " " 1 at_xfail=no ( $as_echo "5. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/uid.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "uid.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"ls /\", \"argv\":[ \"ls\", \"/\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/uid.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/uid.at:38: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "uid.at:38" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / rush: Error: no matching rule for \"ls /\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/uid.at:38" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_5 #AT_START_6 at_fn_group_banner 6 'gid.at:17' \ "gid" " " 1 at_xfail=no ( $as_echo "6. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/gid.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "gid.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"ls /\", \"argv\":[ \"ls\", \"/\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/gid.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/gid.at:38: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "gid.at:38" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / rush: Error: no matching rule for \"ls /\", user $MY_USER " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/gid.at:38" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_6 #AT_START_7 at_fn_group_banner 7 'set.at:17' \ "set" " " 2 at_xfail=no ( $as_echo "7. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/set.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "set.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo { \"cmdline\":\"ls /\", \"argv\":[ \"ls\", \"/\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/set.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/set.at:38: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "set.at:38" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"/usr/bin/ls /\", \"argv\":[ \"/usr/bin/ls\", \"/\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/set.at:38" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/set.at:56: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'a ${...} parameter expansion' "set.at:56" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"ls /chroot/\", \"argv\":[ \"ls\", \"/chroot/\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/set.at:56" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/set.at:74: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "set.at:74" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"ls /\", \"argv\":[ \"ls\", \"/\" ], \"prog\":\"/usr/bin/ls\" } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/set.at:74" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/set.at:92: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"ls /\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "set.at:92" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "ls /" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# ls / " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# ls / { \"cmdline\":\"ls /tmp\", \"argv\":[ \"ls\", \"/tmp\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/set.at:92" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_7 #AT_START_8 at_fn_group_banner 8 'delete.at:17' \ "delete" " " 2 at_xfail=no ( $as_echo "8. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/delete.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo foo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "delete.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo foo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo foo bar " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo foo bar { \"cmdline\":\"echo bar\", \"argv\":[ \"echo\", \"bar\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/delete.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/delete.at:38: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo foo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "delete.at:38" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo foo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo foo bar " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo foo bar { \"cmdline\":\"echo foo\", \"argv\":[ \"echo\", \"foo\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/delete.at:38" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/delete.at:56: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo foo bar baz quux wum\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "delete.at:56" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo foo bar baz quux wum" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo foo bar baz quux wum " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo foo bar baz quux wum { \"cmdline\":\"echo foo wum\", \"argv\":[ \"echo\", \"foo\", \"wum\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/delete.at:56" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/delete.at:75: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo foo bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "delete.at:75" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo foo bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo foo bar rush: Error: Deleting argv[0] is prohibited " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo foo bar # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/delete.at:75" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_8 #AT_START_9 at_fn_group_banner 9 'transform.at:17' \ "transform" " " 2 at_xfail=no ( $as_echo "9. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/transform.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"svnserve\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "transform.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "svnserve" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# svnserve " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# svnserve { \"cmdline\":\"svnserve -t\", \"argv\":[ \"svnserve\", \"-t\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/transform.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/transform.at:38: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo -c -t foo -n bar\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'a ${...} parameter expansion' "transform.at:38" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo -c -t foo -n bar" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo -c -t foo -n bar " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo -c -t foo -n bar { \"cmdline\":\"echo foo bar end\", \"argv\":[ \"echo\", \"foo\", \"bar\", \"end\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/transform.at:38" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/transform.at:58: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"echo foo\" test.conf echo \"# \$?\" echo \"# /bin/echo foo\" echo \"# /bin/echo foo\" >&2 rush -C none -Dcmdline,argv,prog -c \"/bin/echo foo\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "transform.at:58" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "echo foo" test.conf echo "# $?" echo "# /bin/echo foo" echo "# /bin/echo foo" >&2 rush -C none -Dcmdline,argv,prog -c "/bin/echo foo" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# echo foo # /bin/echo foo " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# echo foo { \"cmdline\":\"/usr/bin/echo foo\", \"argv\":[ \"/usr/bin/echo\", \"foo\" ], \"prog\":null } # 0 # /bin/echo foo { \"cmdline\":\"/bin/echo foo\", \"argv\":[ \"/bin/echo\", \"foo\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/transform.at:58" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/transform.at:89: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c \"/bin/sh\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'a ${...} parameter expansion' "transform.at:89" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog -c "/bin/sh" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# /bin/sh " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# /bin/sh { \"cmdline\":\"-sh\", \"argv\":[ \"-sh\" ], \"prog\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/transform.at:89" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_9 #AT_START_10 at_fn_group_banner 10 'map.at:17' \ "map" " " 2 at_xfail=no ( $as_echo "10. $at_setup_line: testing $at_desc ..." $at_traceon { set +x $as_echo "$at_srcdir/map.at:20: myvars cat > passwd.rush < test.conf < passwd.rush rush -C none -Dcmdline,argv,prog -c 'command arg' test.conf echo No match, no default cat > test.conf < passwd.rush < test.conf < passwd.rush rush -C none -Dcmdline,argv,prog -c 'command arg' test.conf echo No match, no default cat > test.conf <>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "Matching map { \"cmdline\":\"/rush_special_shell arg\", \"argv\":[ \"/rush_special_shell\", \"arg\" ], \"prog\":null } No match, return default { \"cmdline\":\"/nologin arg\", \"argv\":[ \"/nologin\", \"arg\" ], \"prog\":null } No match, no default { \"cmdline\":\"command arg\", \"argv\":[ \"command\", \"arg\" ], \"prog\":null } " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/map.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_10 #AT_START_11 at_fn_group_banner 11 'umask.at:17' \ "umask" " " 3 at_xfail=no ( $as_echo "11. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/umask.at:20: cat > test.conf <&2 rush -C none -Dumask -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "umask.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dumask -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"umask\":017 } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/umask.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_11 #AT_START_12 at_fn_group_banner 12 'newgrp.at:17' \ "newgrp" " " 3 at_xfail=no ( $as_echo "12. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/newgrp.at:20: cat > test.conf <&2 rush -C none -Dgid -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "newgrp.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dgid -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"gid\":0 } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/newgrp.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_12 #AT_START_13 at_fn_group_banner 13 'chdir.at:17' \ "chdir" " " 3 at_xfail=no ( $as_echo "13. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/chdir.at:20: cat > test.conf <&2 rush -C none -Dhome_dir -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "chdir.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dhome_dir -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"home_dir\":\"$TESTDIR\" } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/chdir.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_13 #AT_START_14 at_fn_group_banner 14 'env.at:17' \ "env" " " 3 at_xfail=no ( $as_echo "14. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/env.at:20: cat > test.conf <&2 rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:34: cat > test.conf <&2 env -i HOME=\$PWD USER=\$MY_USER LOGIN=\$MY_USER \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:34" ( $at_check_trace; cat > test.conf <&2 env -i HOME=$PWD USER=$MY_USER LOGIN=$MY_USER $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"HOME=$TESTDIR\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:34" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:50: cat > test.conf <&2 env -i HOME=\$PWD USER=\$MY_USER LOGIN=\$MY_USER \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:50" ( $at_check_trace; cat > test.conf <&2 env -i HOME=$PWD USER=$MY_USER LOGIN=$MY_USER $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"HOME=$TESTDIR\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:50" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:68: cat > test.conf <&2 env -i HOME=\$PWD USER=\$MY_USER LOGIN=NO_\$MY_USER \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:68" ( $at_check_trace; cat > test.conf <&2 env -i HOME=$PWD USER=$MY_USER LOGIN=NO_$MY_USER $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"HOME=$TESTDIR\", \"LOGIN=NO_$MY_USER\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:68" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:87: cat > test.conf <&2 env -i HOME=\$PWD USER=\$MY_USER LOGIN=NO_\$MY_USER PATH=\$PATH \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:87" ( $at_check_trace; cat > test.conf <&2 env -i HOME=$PWD USER=$MY_USER LOGIN=NO_$MY_USER PATH=$PATH $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"HOME=$TESTDIR\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:87" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:105: cat > test.conf <&2 env -i HOME=\$PWD USER=\$MY_USER \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:105" ( $at_check_trace; cat > test.conf <&2 env -i HOME=$PWD USER=$MY_USER $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"HOME=$TESTDIR\", \"NEWVAR=foo\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:105" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:124: cat > test.conf <&2 env -i \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:124" ( $at_check_trace; cat > test.conf <&2 env -i $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"MYPATH=/usr/local/bin\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:124" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:141: cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:141" ( $at_check_trace; cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"MYPATH=/bin:/usr/bin:/usr/local/bin\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:141" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:158: cat > test.conf <&2 env -i \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:158" ( $at_check_trace; cat > test.conf <&2 env -i $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"MYPATH=/usr/local/bin\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:158" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:175: cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:175" ( $at_check_trace; cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"MYPATH=/usr/local/bin:/bin:/usr/bin\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:175" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/env.at:192: cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin \$RUSHDIR/rush -C none -Denviron -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "env.at:192" ( $at_check_trace; cat > test.conf <&2 env -i MYPATH=/bin:/usr/bin $RUSHDIR/rush -C none -Denviron -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"environ\":[ \"MYPATH=/usr/local/bin:/bin:/usr/bin\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/env.at:192" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_14 #AT_START_15 at_fn_group_banner 15 'interactive.at:17' \ "interactive" " " 4 at_xfail=no ( $as_echo "15. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/interactive.at:20: cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive -i test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "interactive.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,argv,prog,interactive -i test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# interactive " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# interactive { \"cmdline\":\"/bin/sh\", \"argv\":[ \"/bin/sh\" ], \"prog\":null, \"interactive\":1 } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/interactive.at:20" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_15 #AT_START_16 at_fn_group_banner 16 'fallthrough.at:17' \ "fall-through" " " 4 at_xfail=no ( $as_echo "16. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/fallthrough.at:20: cat > test.conf <&2 rush -C none -Dcmdline,environ -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "fallthrough.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,environ -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command { \"cmdline\":\"newcommand\", \"environ\":[ \"STATUS=Fall-through working\", \"USER=$MY_USER\" ] } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/fallthrough.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/fallthrough.at:41: cat > test.conf <&2 rush -C none -Dcmdline,interactive,home_dir -i test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "fallthrough.at:41" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline,interactive,home_dir -i test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# interactive " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# interactive { \"cmdline\":\"newcommand\", \"interactive\":1, \"home_dir\":null } # 0 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/fallthrough.at:41" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_16 #AT_START_17 at_fn_group_banner 17 'error.at:17' \ "error" " " 4 at_xfail=no ( $as_echo "17. $at_setup_line: testing $at_desc ..." $at_traceon myvars { set +x $as_echo "$at_srcdir/error.at:20: cat > test.conf <&2 rush -C none -Dcmdline -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "error.at:20" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command \"Forced error\" " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/error.at:20" $at_failed && at_fn_log_failure $at_traceon; } myvars { set +x $as_echo "$at_srcdir/error.at:31: cat > test.conf <&2 rush -C none -Dcmdline -c \"command\" test.conf echo \"# \$?\" " at_fn_check_prepare_notrace 'an embedded newline' "error.at:31" ( $at_check_trace; cat > test.conf <&2 rush -C none -Dcmdline -c "command" test.conf echo "# $?" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo >>"$at_stderr"; $as_echo "# command " | \ $at_diff - "$at_stderr" || at_failed=: echo >>"$at_stdout"; $as_echo "# command \"Forced error\" # 1 " | \ $at_diff - "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/error.at:31" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_17 rush-1.8/tests/set.at0000644000175000017500000000316212755764036014641 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([set]) AT_KEYWORDS([set]) AT_RUSH_TEST([ rule set ls / ], [cmdline,argv,prog], [echo], [0], [{ "cmdline":"ls /", "argv":[[ "ls", "/" ]], "prog":null } ], []) AT_RUSH_TEST([ rule set[0] /usr/bin/\$0 ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"/usr/bin/ls /", "argv":[[ "/usr/bin/ls", "/" ]], "prog":null } ], []) AT_RUSH_TEST([ rule set[1] /chroot\${1} ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"ls /chroot/", "argv":[[ "ls", "/chroot/" ]], "prog":null } ], []) AT_RUSH_TEST([ rule set[^] /usr/bin/ls ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"ls /", "argv":[[ "ls", "/" ]], "prog":"/usr/bin/ls" } ], []) AT_RUSH_TEST([ rule set[$] /tmp ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"ls /tmp", "argv":[[ "ls", "/tmp" ]], "prog":null } ], []) AT_CLEANUP rush-1.8/tests/uid.at0000644000175000017500000000202712773663353014626 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([uid]) AT_KEYWORDS([uid]) AT_RUSH_TEST([ rule uid $MY_USER ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"ls /", "argv":[[ "ls", "/" ]], "prog":null } ], []) AT_RUSH_TEST([ rule uid != $MY_USER ], [cmdline,argv,prog], [ls /], [1], [], [rush: Error: no matching rule for "ls /", user $MY_USER ]) AT_CLEANUP rush-1.8/tests/Makefile.in0000644000175000017500000012707012773663660015573 0ustar00matsmats00000000000000# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ # This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = myid$(EXEEXT) subdir = tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/atlocal.in $(top_srcdir)/build-aux/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/doc/imprimatur/imprimatur.m4 \ $(top_srcdir)/m4/00gnulib.m4 \ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/configmake.m4 $(top_srcdir)/m4/dirname.m4 \ $(top_srcdir)/m4/double-slash-root.m4 \ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \ $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/flexmember.m4 $(top_srcdir)/m4/float_h.m4 \ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getline.m4 \ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gettimeofday.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gnulib-common.m4 \ $(top_srcdir)/m4/gnulib-comp.m4 \ $(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/include_next.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/locale-fr.m4 \ $(top_srcdir)/m4/locale-ja.m4 $(top_srcdir)/m4/locale-zh.m4 \ $(top_srcdir)/m4/locale_h.m4 $(top_srcdir)/m4/localeconv.m4 \ $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \ $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbtowc.m4 \ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mktime.m4 \ $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/msvc-inval.m4 \ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/obstack.m4 \ $(top_srcdir)/m4/off_t.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/printf.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \ $(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/size_max.m4 \ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \ $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdint.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/stdio_h.m4 \ $(top_srcdir)/m4/stdlib_h.m4 $(top_srcdir)/m4/strerror.m4 \ $(top_srcdir)/m4/strftime.m4 $(top_srcdir)/m4/string_h.m4 \ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ $(top_srcdir)/m4/sys_socket_h.m4 \ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sys_types_h.m4 \ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/time_rz.m4 \ $(top_srcdir)/m4/timegm.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/vasnprintf.m4 \ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/warn-on-use.m4 \ $(top_srcdir)/m4/wchar_h.m4 $(top_srcdir)/m4/wchar_t.m4 \ $(top_srcdir)/m4/wcrtomb.m4 $(top_srcdir)/m4/wctype_h.m4 \ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrndup.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = atlocal CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) myid_SOURCES = myid.c myid_OBJECTS = myid.$(OBJEXT) myid_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = myid.c DIST_SOURCES = myid.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibexecdir = @pkglibexecdir@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOM4TE = @AUTOM4TE@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FLOAT_H = @FLOAT_H@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_QSORT_R = @GNULIB_QSORT_R@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TIME_RZ = @GNULIB_TIME_RZ@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCTRANS = @GNULIB_WCTRANS@ GNULIB_WCTYPE = @GNULIB_WCTYPE@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ IMPRIMATUR_MAKEINFOFLAGS = @IMPRIMATUR_MAKEINFOFLAGS@ IMPRIMATUR_MODULE_DIR = @IMPRIMATUR_MODULE_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMULTITHREAD = @LIBMULTITHREAD@ LIBOBJS = @LIBOBJS@ LIBPTH = @LIBPTH@ LIBPTH_PREFIX = @LIBPTH_PREFIX@ LIBS = @LIBS@ LIBTHREAD = @LIBTHREAD@ LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ LOCALE_FR = @LOCALE_FR@ LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ LOCALE_JA = @LOCALE_JA@ LOCALE_ZH_CN = @LOCALE_ZH_CN@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ LTLIBOBJS = @LTLIBOBJS@ LTLIBPTH = @LTLIBPTH@ LTLIBTHREAD = @LTLIBTHREAD@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ RENDITION = @RENDITION@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_QSORT_R = @REPLACE_QSORT_R@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_READLINKAT = @REPLACE_READLINKAT@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ RUSH_DEFAULT_CONFIG = @RUSH_DEFAULT_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 DISTCLEANFILES = atconfig $(check_SCRIPTS) MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) # TESTSUITE_AT = \ argc.at\ chdir.at\ command.at\ delete.at\ env.at\ error.at\ fallthrough.at\ interactive.at\ gid.at\ map.at\ match.at\ matchprog.at\ newgrp.at\ set.at\ testsuite.at\ transform.at\ uid.at\ umask.at TESTSUITE = $(srcdir)/testsuite M4 = m4 AUTOTEST = $(AUTOM4TE) --language=autotest all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits tests/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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) myid$(EXEEXT): $(myid_OBJECTS) $(myid_DEPENDENCIES) $(EXTRA_myid_DEPENDENCIES) @rm -f myid$(EXEEXT) $(AM_V_CCLD)$(LINK) $(myid_OBJECTS) $(myid_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/myid.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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 $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am all-am: Makefile $(PROGRAMS) installdirs: 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-local clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \ clean-generic clean-local clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am $(srcdir)/package.m4: $(top_srcdir)/configure.ac $(AM_V_GEN){ \ echo '# Signature of the current package.'; \ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \ } >$(srcdir)/package.m4 $(TESTSUITE): package.m4 $(TESTSUITE_AT) $(AM_V_GEN)$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp $(AM_V_at)mv $@.tmp $@ atconfig: $(top_builddir)/config.status cd $(top_builddir) && ./config.status tests/$@ clean-local: @test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean check-local: atconfig atlocal $(TESTSUITE) @$(SHELL) $(TESTSUITE) # 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: rush-1.8/tests/delete.at0000644000175000017500000000265612755764036015317 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([delete]) AT_KEYWORDS([delete]) AT_RUSH_TEST([ rule delete[1] ], [cmdline,argv,prog], [echo foo bar], [0], [{ "cmdline":"echo bar", "argv":[[ "echo", "bar" ]], "prog":null } ], []) AT_RUSH_TEST([ rule delete[$] ], [cmdline,argv,prog], [echo foo bar], [0], [{ "cmdline":"echo foo", "argv":[[ "echo", "foo" ]], "prog":null } ], []) AT_RUSH_TEST([ rule delete 2 4 ], [cmdline,argv,prog], [echo foo bar baz quux wum], [0], [{ "cmdline":"echo foo wum", "argv":[[ "echo", "foo", "wum" ]], "prog":null } ], []) AT_RUSH_TEST([ rule delete[0] ], [cmdline,argv,prog], [echo foo bar], [1], [], [rush: Error: Deleting argv[[0]] is prohibited ]) AT_CLEANUP rush-1.8/tests/atlocal.in0000644000175000017500000000057712773663353015476 0ustar00matsmats00000000000000# @configure_input@ -*- shell-script -*- # Configurable variable values for GNU rush test suite. # Copyright (C) 2016 Sergey Poznyakoff PATH=@abs_builddir@:@abs_top_builddir@/src:$top_srcdir:$srcdir:$PATH RUSHDIR=@abs_top_builddir@/src myvars() { set -- $(myid) MY_USER=$1 MY_UID=$2 MY_GROUP=$3 MY_GID=$4 TESTDIR=$(pwd) } rush-1.8/tests/package.m40000644000175000017500000000041512773664023015346 0ustar00matsmats00000000000000# Signature of the current package. m4_define([AT_PACKAGE_NAME], [GNU rush]) m4_define([AT_PACKAGE_TARNAME], [rush]) m4_define([AT_PACKAGE_VERSION], [1.8]) m4_define([AT_PACKAGE_STRING], [GNU rush 1.8]) m4_define([AT_PACKAGE_BUGREPORT], [bug-rush@gnu.org]) rush-1.8/tests/testsuite.at0000644000175000017500000000423612773663353016102 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . m4_version_prereq([2.52g]) dnl m4_run_rush([KW], [CMD],[EC],[STDOUT],[STDERR],...) m4_define([m4_run_rush],[m4_ifval([$2],[dnl echo "# $2" echo "# $2" >&2 m4_ifset([RUSH_ENVIRON],[env RUSH_ENVIRON $RUSHDIR/])rush -C none -D$1 dnl m4_if([$2],[interactive],[-i],[-c "$2"]) test.conf echo "# $?" $0([$1],m4_shiftn(5, $@))])]) dnl m4_fmt_out([CMD],[EC],[STDOUT],[STDERR],...) m4_define([m4_fmt_out],[m4_ifval([$1],[dnl # $1 $3[]dnl # $2 $0(m4_shift(m4_shift3($@)))])]) dnl m4_fmt_err([CMD],[EC],[STDOUT],[STDERR],...) m4_define([m4_fmt_err],[m4_ifval([$1],[dnl # $1 $4[]dnl $0(m4_shift(m4_shift3($@)))])]) dnl AT_RUSH_TEST([CONFIG],[KW], [CMD],[EC],[STDOUT],[STDERR]) m4_define([AT_RUSH_TEST],[ myvars AT_CHECK_UNQUOTED([ cat > test.conf <. AT_SETUP([chdir]) AT_KEYWORDS([chdir]) AT_RUSH_TEST([ rule chdir $PWD ], [home_dir], [command], [0], [{ "home_dir":"$TESTDIR" } ], []) AT_CLEANUP rush-1.8/tests/error.at0000644000175000017500000000164412755764036015202 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([error]) AT_KEYWORDS([error]) AT_RUSH_TEST([ rule exit "Forced error" ], [cmdline], [command], [1], [], ["Forced error" ]) AT_RUSH_TEST([ rule exit 1 "Forced error" ], [cmdline], [command], [1], ["Forced error" ], []) AT_CLEANUP rush-1.8/tests/match.at0000644000175000017500000000203712773663353015142 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([match]) AT_KEYWORDS([match]) AT_RUSH_TEST([ rule match[1] fo+ ], [cmdline,argv,prog], [/usr/bin/echo foo], [0], [{ "cmdline":"/usr/bin/echo foo", "argv":[[ "/usr/bin/echo", "foo" ]], "prog":null } ], [], [/usr/bin/echo bar], [1], [], [rush: Error: no matching rule for "/usr/bin/echo bar", user $MY_USER ]) AT_CLEANUP rush-1.8/tests/fallthrough.at0000644000175000017500000000241612773663353016366 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([fall-through]) AT_KEYWORDS([fallthrough fall-through]) AT_RUSH_TEST([ rule env - USER=$MY_USER STATUS='Fall-through working' fall-through rule set[0] newcommand ], [cmdline,environ], [command], [0], [{ "cmdline":"newcommand", "environ":[[ "STATUS=Fall-through working", "USER=$MY_USER" ]] } ], []) AT_RUSH_TEST([ rule chdir /tmp fall-through rule set[0] newcommand interactive ], [cmdline,interactive,home_dir], [interactive], [0], [{ "cmdline":"newcommand", "interactive":1, "home_dir":null } ], []) AT_CLEANUP rush-1.8/tests/map.at0000644000175000017500000000332512773663353014624 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([map]) AT_KEYWORDS([map]) AT_CHECK([ myvars cat > passwd.rush < test.conf < passwd.rush rush -C none -Dcmdline,argv,prog -c 'command arg' test.conf echo No match, no default cat > test.conf <. EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 DISTCLEANFILES = atconfig $(check_SCRIPTS) MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) ## ------------ ## ## package.m4. ## ## ------------ ## $(srcdir)/package.m4: $(top_srcdir)/configure.ac $(AM_V_GEN){ \ echo '# Signature of the current package.'; \ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \ } >$(srcdir)/package.m4 # ## ------------ ## ## Test suite. ## ## ------------ ## TESTSUITE_AT = \ argc.at\ chdir.at\ command.at\ delete.at\ env.at\ error.at\ fallthrough.at\ interactive.at\ gid.at\ map.at\ match.at\ matchprog.at\ newgrp.at\ set.at\ testsuite.at\ transform.at\ uid.at\ umask.at TESTSUITE = $(srcdir)/testsuite M4=m4 AUTOTEST = $(AUTOM4TE) --language=autotest $(TESTSUITE): package.m4 $(TESTSUITE_AT) $(AM_V_GEN)$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp $(AM_V_at)mv $@.tmp $@ atconfig: $(top_builddir)/config.status cd $(top_builddir) && ./config.status tests/$@ clean-local: @test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean check-local: atconfig atlocal $(TESTSUITE) @$(SHELL) $(TESTSUITE) noinst_PROGRAMS=myid rush-1.8/tests/interactive.at0000644000175000017500000000167212755764036016367 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([interactive]) AT_KEYWORDS([interactive]) AT_RUSH_TEST([ rule interactive ], [cmdline,argv,prog,interactive], [interactive], [0], [{ "cmdline":"/bin/sh", "argv":[[ "/bin/sh" ]], "prog":null, "interactive":1 } ], []) AT_CLEANUP rush-1.8/tests/gid.at0000644000175000017500000000203112773663353014603 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . AT_SETUP([gid]) AT_KEYWORDS([gid]) AT_RUSH_TEST([ rule gid $MY_GROUP ], [cmdline,argv,prog], [ls /], [0], [{ "cmdline":"ls /", "argv":[[ "ls", "/" ]], "prog":null } ], []) AT_RUSH_TEST([ rule gid != $MY_GROUP ], [cmdline,argv,prog], [ls /], [1], [], [rush: Error: no matching rule for "ls /", user $MY_USER ]) AT_CLEANUP rush-1.8/AUTHORS0000644000175000017500000000004212340706302013376 0ustar00matsmats00000000000000Sergey Poznyakoff gray@gnu.org.ua rush-1.8/NEWS0000644000175000017500000002113312773665761013060 0ustar00matsmats00000000000000GNU Rush NEWS -- history of user-visible changes. 2016-10-01 Copyright (C) 2008-2011, 2014, 2016 Sergey Poznyakoff See the end of file for copying conditions. Please send bug reports to Version 1.8, 2016-10-01 * rushlast and rushwho Select the most suitable time representation for the duration field, depending on the requested width. * chroot handling If chroot is requested, re-read the password database after chrooting. * Supplementary user groups Set supplementary groups when switching to user privileges. * Change provisions for interactive shell usage Interactive rules are marked with the keyword "interactive". Only such rules are considered when rush is invoked without the -c option. The support of the old (global) "interactive" keyword is discontinued. * The env statement The env statement can contain references to the unmodified environment variables. E.g. this is now valid: env PATH=/sbin:$PATH * Testsuite is provided * Minor fix in TXPMUX code. * Fix CVE-2013-6889 * Manpages are provided Version 1.7, 2010-07-07 * New configuration statements `acct-umask', `acct-dir-mode', `acct-file-mode' These statements set the value of umask used when accessing accounting database files, and permissions for the accounting directory and database files, correspondingly. * Conditions `uid' and `gid' accept symbolic user/group names as argument. Both conditions now accept symbolic as well as numeric arguments, e.g.: uid 1300 uid smith uid < smith gid != 500 * The `newgrp' command The `newgrp' command changes the current group ID to the one given as its argument, which must be either a numeric GID or a name of an existing group. * Default regex flags affect the `transfer' statement. * New translations Dutch, by Koen Torfs. Vietnamese, by Clytie Siddall. * Bugfixes ** Fix memory allocation in make_file_name (puszcza#127). ** Fix handling of numeric options in `rushlast'. ** A single fall-through rule caused infinite loop (puszcza#127#comment7). ** Accounting mode is off by default, as described in the documentation. Version 1.6, 2009-02-10 * Patterns in `transform' statement The syntax of the `transform' statement has been extended to allow for specifying transformation argument string: transform STRING REGEX or transform[N] STRING REGEX STRING may contain meta-variables, which are expanded before performing the transformation. The following meta-variables are defined: ${user} User name ${group} Name of the user's principal group ${uid} UID ${gid} GID ${home} User's home directory ${gecos} User's GECOS field ${program} Program name ${command} Full command line $0 to $9 The value of the Nth command line argument ${N} Same as above, useful if N > 9 or N < 0 (see "Negative argument indexes", below). Thus, for example: transform[0] s,.*/,/bin/, is equivalent to: transform[0] $0 s,.*/,/bin/, * The `map' statement. This statement sets a command line argument using a map file. map[N] FILE DELIM KEY K V [DEFAULT] Each line in a map file FILE contains fields, separated by delimiter DELIM. The `map' statement looks for the record whose Kth field has the value of KEY. If such a record is found, its Vth field becomes a new value of the Nth command line argument. Othervise, if DEFAULT is given, it is used as a new value. Otherwise, the argument retains its old value. KEY may contain meta-variables described above (see "Patterns in `transform' statement"). * The `set' statement. The `set' statement replaces entire command line with the new value: rule foo set /bin/scp -t /upload In indexed form, it replaces the given argument: set[0] /bin/scp The argument to `set' may contain meta-variables (see "Patterns in `transform' statement"). * The `delete' statement. This statement deletes the given argument, or range of arguments, from the command line. It has two forms: 1. Delete the Nth argument: delete[N] 2. Delete all arguments between indexes N and M, inclusive: delete N M * Modifying program name To modify the program name (as opposed to argv[0]), use ^ pseudo-index, e.g.: set[^] /bin/scp By default (unless [^] form is used) argv[0] is used as the program name. * Negative argument indexes Negative argument indexes refer to arguments numbered from the end of the command line. E.g.: transform[-1] is the same as transform[$] transform[-2] will transform the last but one argument * New statement `interactive' This statement provides a replacement command line for interactive use of rush. By default, such use is prohibited. However, using `interactive' statement you can allow some users a limited interactive access. For example: interactive *shell* rule login command \*shell\* group rshell map[^] /usr/local/etc/rush.shell : ${user} 1 2 none transform[0] ${program} s,^.*/,-r, * Use of predefined error messages in `exit' statement. Predefined error messages can be used in `exit' statements. E.g., the statement: exit @nologin-message will retrieve the text of the `nologin-message' and send it to the remote party before exiting. If the message text must begin with a `@' sign, duplicate it: exit @@special error message Version 1.5, 2009-01-14 * Post-process notification After completing a rule, Rush can send a notification over a TCP/IP or UNIX socket. * Include statement The include statement allows to inlcude contents of a file into the main rush configuration file. * Safety checks. Before parsing, rush checks permissions and ownership of its configuration file. The file is rejected if: - It is not owned by root. - It is group or world writable - It resides in a group or world writable directory - It is a symbolic link to a file residing in a group or world writable directory The same checks are performed for any included file. The safety checks for included files can be changed using the global statement `include-security'. * Default configuration Default configuration file can be built into the rush binary. See `Default Configuration' in README file. * Internationalization Version 1.4, 2008-10-20 * RUSHWHO_FORMAT and RUSHLAST_FORMAT environment variables. These variables can be used to supply customized formats to rushwho and rushlast utilities. * Bugfixes in format parsing code. Version 1.3, 2008-10-14 * Implement accounting mode. * New programs: rushwho and rushlast These utilities display information from the Rush accounting database. Version 1.2, 2008-09-06 * Test mode Rush can be run from the command line to test its configuration file. Examples: 1. Test default configuration file: rush --test 2. Test configuration file `sample.rc': rush --test sample.rc 3. Test the configuration file and emulate execution of the command `cvs server'. Set debugging level 2: rush --test --debug=2 -c "cvs server" Version 1.1, 2008-08-30 * A condition can be negated. Placing ! between the keyword and conditional expression indicates its negation, e.g.: command ! ^cvs matches any command line that does not begin with `cvs' * New action `exit' The `exit' statement instructs rush to write a supplied error message to specified file descriptor and exit immediately. If file descriptor is not given, 2 (standard error) is used. Exit actions are useful for writing ``trap rules'', i.e. rules that are intended to trap incorrect or prohibited command lines and to return customized reply messages in such cases. * New statement `regexp' Configures the style of regular expressions used in subsequent `cmdline' and `match' clauses. For example: regex +icase +extended sets case-insensitive extended regular expressions. Version 1.0, 2008-08-26 Initial version. ========================================================================= Copyright information: Copyright (C) 2008-2011, 2014, 2016 Sergey Poznyakoff Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. Local variables: mode: outline paragraph-separate: "[ ]*$" eval: (add-hook 'write-file-hooks 'time-stamp) time-stamp-start: "changes. " time-stamp-format: "%:y-%02m-%02d" time-stamp-end: "\n" end: rush-1.8/src/0000755000175000017500000000000012773666037013145 5ustar00matsmats00000000000000rush-1.8/src/rushopt.h0000644000175000017500000004203212755767332015023 0ustar00matsmats00000000000000/* -*- buffer-read-only: t -*- vi: set ro: THIS FILE IS GENERATED AUTOMATICALLY. PLEASE DO NOT EDIT. */ #line 1 "rushopt.opt" /* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include #line 19 "rushopt.opt" #line 19 void print_help(void); #line 19 void print_usage(void); #line 88 "rushopt.opt" #line 88 /* Option codes */ #line 88 enum { #line 88 _OPTION_INIT=255, #line 88 #line 32 "rushopt.opt" #line 32 OPTION_LINT, #line 77 "rushopt.opt" #line 77 OPTION_SHOW_DEFAULT, #line 88 "rushopt.opt" #line 88 OPTION_USAGE, #line 88 "rushopt.opt" #line 88 OPTION_VERSION, #line 88 "rushopt.opt" MAX_OPTION #line 88 }; #line 88 static struct option long_options[] = { #line 88 #line 23 "rushopt.opt" #line 23 { "debug", required_argument, 0, 'd' }, #line 30 "rushopt.opt" #line 30 { "test", no_argument, 0, 't' }, #line 32 "rushopt.opt" #line 32 { "lint", no_argument, 0, OPTION_LINT }, #line 37 "rushopt.opt" #line 37 { "user", required_argument, 0, 'u' }, #line 62 "rushopt.opt" #line 62 { "dump", required_argument, 0, 'D' }, #line 69 "rushopt.opt" #line 69 { "security-check", required_argument, 0, 'C' }, #line 77 "rushopt.opt" #line 77 { "show-default", no_argument, 0, OPTION_SHOW_DEFAULT }, #line 88 "rushopt.opt" #line 88 { "help", no_argument, 0, 'h' }, #line 88 "rushopt.opt" #line 88 { "usage", no_argument, 0, OPTION_USAGE }, #line 88 "rushopt.opt" #line 88 { "version", no_argument, 0, OPTION_VERSION }, #line 88 "rushopt.opt" {0, 0, 0, 0} #line 88 }; #line 88 static struct opthelp { #line 88 const char *opt; #line 88 const char *arg; #line 88 int is_optional; #line 88 const char *descr; #line 88 } opthelp[] = { #line 88 #line 25 "rushopt.opt" #line 25 { "-d, --debug", N_("NUMBER"), 0, N_("Set debugging level.") }, #line 33 "rushopt.opt" #line 33 { "-t, --test, --lint", NULL, 0, N_("Run in test mode.") }, #line 39 "rushopt.opt" #line 39 { "-u, --user", N_("NAME"), 0, N_("Supply user name in test mode.") }, #line 51 "rushopt.opt" #line 51 { "-c", N_("COMMAND"), 0, N_("Execute COMMAND.") }, #line 57 "rushopt.opt" #line 57 { "-i", NULL, 0, N_("Force interactive shell.") }, #line 64 "rushopt.opt" #line 64 { "-D, --dump", N_("KEYWORDS"), 0, N_("Dump final request in test mode.") }, #line 71 "rushopt.opt" #line 71 { "-C, --security-check", N_("CHECK"), 0, N_("Add or remove configuration security check.") }, #line 79 "rushopt.opt" #line 79 { "--show-default", NULL, 0, N_("Show default configuration.") }, #line 88 "rushopt.opt" #line 88 { NULL, NULL, 0, N_("Other options") }, #line 88 "rushopt.opt" #line 88 { "-h, --help", NULL, 0, N_("Give this help list") }, #line 88 "rushopt.opt" #line 88 { "--usage", NULL, 0, N_("Give a short usage message") }, #line 88 "rushopt.opt" #line 88 { "--version", NULL, 0, N_("Print program version") }, #line 88 "rushopt.opt" }; #line 19 "rushopt.opt" #line 19 const char *program_version = "rush" " (" PACKAGE_STRING ")"; #line 19 static char doc[] = N_("rush - a restricted user shell."); #line 19 static char args_doc[] = N_("[FILE]"); #line 19 const char *program_bug_address = "<" PACKAGE_BUGREPORT ">"; #line 19 #line 19 #define DESCRCOLUMN 30 #line 19 #define RMARGIN 79 #line 19 #define GROUPCOLUMN 2 #line 19 #define USAGECOLUMN 13 #line 19 #line 19 static void #line 19 indent (size_t start, size_t col) #line 19 { #line 19 for (; start < col; start++) #line 19 putchar (' '); #line 19 } #line 19 #line 19 static void #line 19 print_option_descr (const char *descr, size_t lmargin, size_t rmargin) #line 19 { #line 19 while (*descr) #line 19 { #line 19 int s = 0; #line 19 int i; #line 19 size_t width = rmargin - lmargin; #line 19 #line 19 for (i = 0; ; i++) #line 19 { #line 19 if (descr[i] == 0 || isspace (descr[i])) #line 19 { #line 19 if (i > width) #line 19 break; #line 19 s = i; #line 19 if (descr[i] == 0) #line 19 break; #line 19 } #line 19 } #line 19 printf ("%*.*s\n", s, s, descr); #line 19 descr += s; #line 19 if (*descr) #line 19 { #line 19 indent (0, lmargin); #line 19 descr++; #line 19 } #line 19 } #line 19 } #line 19 #line 19 void #line 19 print_help(void) #line 19 { #line 19 unsigned i; #line 19 #line 19 printf ("%s %s [%s]...", _("Usage:"), "rush", _("OPTION")); #line 19 if (args_doc[0]) #line 19 printf(" %s", gettext(args_doc)); #line 19 printf("\n"); #line 19 if (doc[0]) #line 19 print_option_descr(gettext (doc), 0, RMARGIN); #line 19 putchar ('\n'); #line 19 #line 19 for (i = 0; i < sizeof (opthelp) / sizeof (opthelp[0]); i++) #line 19 { #line 19 unsigned n; #line 19 if (opthelp[i].opt) #line 19 { #line 19 n = printf (" %s", opthelp[i].opt); #line 19 if (opthelp[i].arg) #line 19 { #line 19 char *cb, *ce; #line 19 if (strlen (opthelp[i].opt) == 2) #line 19 { #line 19 if (!opthelp[i].is_optional) #line 19 { #line 19 putchar (' '); #line 19 n++; #line 19 } #line 19 } #line 19 else #line 19 { #line 19 putchar ('='); #line 19 n++; #line 19 } #line 19 if (opthelp[i].is_optional) #line 19 { #line 19 cb = "["; #line 19 ce = "]"; #line 19 } #line 19 else #line 19 cb = ce = ""; #line 19 n += printf ("%s%s%s", cb, gettext (opthelp[i].arg), ce); #line 19 } #line 19 if (n >= DESCRCOLUMN) #line 19 { #line 19 putchar ('\n'); #line 19 n = 0; #line 19 } #line 19 indent (n, DESCRCOLUMN); #line 19 print_option_descr (gettext (opthelp[i].descr), DESCRCOLUMN, RMARGIN); #line 19 } #line 19 else #line 19 { #line 19 if (i) #line 19 putchar ('\n'); #line 19 indent (0, GROUPCOLUMN); #line 19 print_option_descr (gettext (opthelp[i].descr), #line 19 GROUPCOLUMN, RMARGIN); #line 19 putchar ('\n'); #line 19 } #line 19 } #line 19 #line 19 putchar ('\n'); #line 19 print_option_descr (_("Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options."), 0, RMARGIN); #line 19 putchar ('\n'); #line 19 printf (_("Report bugs to %s.\n"), program_bug_address); #line 19 } #line 19 #line 19 static int #line 19 cmpidx_short(const void *a, const void *b) #line 19 { #line 19 struct opthelp const **opta = (struct opthelp const **)a; #line 19 struct opthelp const **optb = (struct opthelp const **)b; #line 19 #line 19 return (*opta)->opt[1] - (*optb)->opt[1]; #line 19 } #line 19 #line 19 static int #line 19 cmpidx_long(const void *a, const void *b) #line 19 { #line 19 struct opthelp const **ap = (struct opthelp const **)a; #line 19 struct opthelp const **bp = (struct opthelp const **)b; #line 19 char const *opta, *optb; #line 19 size_t lena, lenb; #line 19 #line 19 if ((*ap)->opt[1] == '-') #line 19 opta = (*ap)->opt; #line 19 else #line 19 opta = (*ap)->opt + 4; #line 19 lena = strcspn(opta, ","); #line 19 #line 19 if ((*bp)->opt[1] == '-') #line 19 optb = (*bp)->opt; #line 19 else #line 19 optb = (*bp)->opt + 4; #line 19 lenb = strcspn(optb, ","); #line 19 return strncmp(opta, optb, lena > lenb ? lenb : lena); #line 19 } #line 19 #line 19 void #line 19 print_usage(void) #line 19 { #line 19 unsigned i; #line 19 unsigned n; #line 19 char *buf; #line 19 size_t bufsize; #line 19 unsigned nidx; #line 19 struct opthelp **optidx; #line 19 size_t optcount = sizeof(opthelp) / sizeof(opthelp[0]); #line 19 #line 19 #define FLUSH do { buf[n] = 0; printf("%s\n", buf); n = USAGECOLUMN; memset(buf, ' ', n); } while (0) #line 19 #define ADDC(c) do { if (n == RMARGIN) FLUSH; buf[n++] = c; } while (0) #line 19 #line 19 optidx = calloc(optcount, sizeof(optidx[0])); #line 19 if (!optidx) #line 19 abort(); #line 19 bufsize = RMARGIN + 1; #line 19 buf = malloc(bufsize); #line 19 if (!buf) #line 19 abort(); #line 19 #line 19 n = snprintf(buf, bufsize, "%s %s ", _("Usage:"), "rush"); #line 19 #line 19 /* Print a list of short options without arguments. */ #line 19 for (i = nidx = 0; i < optcount; i++) #line 19 if (opthelp[i].opt && #line 19 opthelp[i].descr && #line 19 opthelp[i].opt[1] != '-' && #line 19 opthelp[i].arg == NULL) #line 19 optidx[nidx++] = opthelp + i; #line 19 #line 19 if (nidx) { #line 19 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_short); #line 19 #line 19 ADDC('['); #line 19 ADDC('-'); #line 19 for (i = 0; i < nidx; i++) { #line 19 ADDC(optidx[i]->opt[1]); #line 19 } #line 19 ADDC(']'); #line 19 } #line 19 #line 19 /* Print a list of short options with arguments. */ #line 19 for (i = nidx = 0; i < optcount; i++) { #line 19 if (opthelp[i].opt && #line 19 opthelp[i].descr && #line 19 opthelp[i].opt[1] != '-' && #line 19 opthelp[i].arg) #line 19 optidx[nidx++] = opthelp + i; #line 19 } #line 19 #line 19 if (nidx) { #line 19 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_short); #line 19 #line 19 for (i = 0; i < nidx; i++) { #line 19 struct opthelp *opt = optidx[i]; #line 19 size_t len = 5 + strlen(opt->arg) #line 19 + (opt->is_optional ? 2 : 1); #line 19 #line 19 if (n + len > RMARGIN) #line 19 FLUSH; #line 19 buf[n++] = ' '; #line 19 buf[n++] = '['; #line 19 buf[n++] = '-'; #line 19 buf[n++] = opt->opt[1]; #line 19 if (opt->is_optional) { #line 19 buf[n++] = '['; #line 19 strcpy(&buf[n], opt->arg); #line 19 n += strlen(opt->arg); #line 19 buf[n++] = ']'; #line 19 } else { #line 19 buf[n++] = ' '; #line 19 strcpy(&buf[n], opt->arg); #line 19 n += strlen(opt->arg); #line 19 } #line 19 buf[n++] = ']'; #line 19 } #line 19 } #line 19 #line 19 /* Print a list of long options */ #line 19 for (i = nidx = 0; i < optcount; i++) { #line 19 if (opthelp[i].opt && opthelp[i].descr #line 19 && (opthelp[i].opt[1] == '-' || opthelp[i].opt[2] == ',')) #line 19 optidx[nidx++] = opthelp + i; #line 19 } #line 19 #line 19 if (nidx) { #line 19 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_long); #line 19 #line 19 for (i = 0; i < nidx; i++) { #line 19 struct opthelp *opt = optidx[i]; #line 19 size_t len; #line 19 const char *longopt; #line 19 #line 19 if (opt->opt[1] == '-') #line 19 longopt = opt->opt; #line 19 else if (opt->opt[2] == ',') #line 19 longopt = opt->opt + 4; #line 19 else #line 19 continue; #line 19 #line 19 len = 3 + strlen(longopt) #line 19 + (opt->arg ? 1 + strlen(opt->arg) #line 19 + (opt->is_optional ? 2 : 0) : 0); #line 19 if (n + len > RMARGIN) { #line 19 FLUSH; #line 19 /* Make sure we have enough buffer space if the string cannot be split */ #line 19 if (n + len > bufsize) { #line 19 bufsize = n + len; #line 19 buf = realloc(buf, bufsize); #line 19 if (!buf) #line 19 abort(); #line 19 } #line 19 } #line 19 buf[n++] = ' '; #line 19 buf[n++] = '['; #line 19 strcpy(&buf[n], longopt); #line 19 n += strlen(longopt); #line 19 if (opt->arg) { #line 19 buf[n++] = '='; #line 19 if (opt->is_optional) { #line 19 buf[n++] = '['; #line 19 strcpy(&buf[n], opt->arg); #line 19 n += strlen(opt->arg); #line 19 buf[n++] = ']'; #line 19 } else { #line 19 strcpy(&buf[n], opt->arg); #line 19 n += strlen(opt->arg); #line 19 } #line 19 } #line 19 buf[n++] = ']'; #line 19 } #line 19 } #line 19 #line 19 /* Print argument list */ #line 19 if (args_doc[0]) { #line 19 char const *docstr = gettext(args_doc); #line 19 size_t len = strlen(docstr) + 1; #line 19 if (n + len <= RMARGIN) { #line 19 buf[n++] = ' '; #line 19 strcpy(buf + n, docstr); #line 19 n += len; #line 19 } else { #line 19 struct wordsplit ws; #line 19 #line 19 if (wordsplit(docstr, &ws, #line 19 WRDSF_SHOWERR | #line 19 WRDSF_NOVAR | #line 19 WRDSF_NOCMD | #line 19 WRDSF_QUOTE | #line 19 WRDSF_SQUEEZE_DELIMS)) #line 19 abort(); #line 19 #line 19 for (i = 0; i < ws.ws_wordc; i++) { #line 19 len = strlen(ws.ws_wordv[i]) + 1; #line 19 if (n + len > RMARGIN) { #line 19 FLUSH; #line 19 /* Make sure we have enough buffer space if the string cannot be split */ #line 19 if (n + len > bufsize) { #line 19 bufsize = n + len; #line 19 buf = realloc(buf, bufsize); #line 19 if (!buf) #line 19 abort(); #line 19 } #line 19 } #line 19 buf[n++] = ' '; #line 19 strcpy(buf + n, ws.ws_wordv[i]); #line 19 n += len; #line 19 } #line 19 } #line 19 } #line 19 #line 19 FLUSH; #line 19 #line 19 free(optidx); #line 19 free(buf); #line 19 } #line 19 #line 19 const char version_etc_copyright[] = #line 19 /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ #line 19 "Copyright %s 2008-2016 Sergey Poznyakoff"; #line 19 #line 19 void #line 19 print_version_only(const char *program_version, FILE *stream) #line 19 { #line 19 fprintf (stream, "%s\n", program_version); #line 19 /* TRANSLATORS: Translate "(C)" to the copyright symbol (C-in-a-circle), if this symbol is available in the user's locale. Otherwise, do not translate "(C)"; leave it as-is. */ #line 19 fprintf (stream, version_etc_copyright, _("(C)")); #line 19 fputc ('\n', stream); #line 19 } #line 19 #line 19 void #line 19 print_version(const char *program_version, FILE *stream) #line 19 { #line 19 print_version_only(program_version, stream); #line 19 #line 19 fputs (_("License GPLv3+: GNU GPL version 3 or later \nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\n"), #line 19 stream); #line 19 #line 19 } #line 19 #line 88 "rushopt.opt" #line 88 void get_options(int argc, char *argv[]) { #line 93 { #line 93 int optchar; #line 93 #line 93 #line 93 while ((optchar = getopt_long(argc, argv, "d:tu:c:iD:C:h", #line 93 long_options, NULL)) != EOF) #line 93 { #line 93 switch (optchar) #line 93 { #line 93 default: #line 93 exit(1); #line 93 #line 93 #line 25 "rushopt.opt" case 'd': #line 25 { #line 25 debug_level = atoi(optarg); debug_option = 1; #line 28 break; #line 28 } #line 33 "rushopt.opt" case 't': case OPTION_LINT: #line 33 { #line 33 lint_option = 1; #line 35 break; #line 35 } #line 39 "rushopt.opt" case 'u': #line 39 { #line 39 lint_option = 1; if (getuid()) die(usage_error, NULL, _("the --user option is allowed " "for the superuser only")); test_user_name = optarg; #line 47 break; #line 47 } #line 51 "rushopt.opt" case 'c': #line 51 { #line 51 command = optarg; #line 53 break; #line 53 } #line 57 "rushopt.opt" case 'i': #line 57 { #line 57 lint_option = 1; interactive = 1; #line 60 break; #line 60 } #line 64 "rushopt.opt" case 'D': #line 64 { #line 64 dump_option = optarg; lint_option = 1; #line 67 break; #line 67 } #line 71 "rushopt.opt" case 'C': #line 71 { #line 71 if (cfck_keyword(optarg)) die(usage_error, NULL, _("unknown keyword: %s"), optarg); #line 75 break; #line 75 } #line 79 "rushopt.opt" case OPTION_SHOW_DEFAULT: #line 79 { #line 79 #ifdef RUSH_DEFAULT_CONFIG printf("%s\n", RUSH_DEFAULT_CONFIG); exit(0); #else error(1, 0, _("No default configuration")); #endif #line 86 break; #line 86 } #line 88 "rushopt.opt" case 'h': #line 88 { #line 88 #line 88 print_help (); #line 88 exit (0); #line 88 #line 88 break; #line 88 } #line 88 "rushopt.opt" case OPTION_USAGE: #line 88 { #line 88 #line 88 print_usage (); #line 88 exit (0); #line 88 #line 88 break; #line 88 } #line 88 "rushopt.opt" case OPTION_VERSION: #line 88 { #line 88 #line 88 /* Give version */ #line 88 print_version(program_version, stdout); #line 88 exit (0); #line 88 #line 88 break; #line 88 } #line 93 "rushopt.opt" } #line 93 } #line 93 } #line 93 } rush-1.8/src/rush-po.awk0000644000175000017500000000340512755375137015246 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2009-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush 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 GNU Rush. If not, see . BEGIN { print "# SOME DESCRIPTIVE TITLE." print "#, fuzzy" print "msgid \"\"" print "msgstr \"\"" print "\"Project-Id-Version: rush-config ADDITIONAL-DATA \\n\"" print "\"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n\"" print "\"Last-Translator: FULL NAME \\n\"" print "\"Language-Team: LANGUAGE \\n\"" print "\"MIME-Version: 1.0\\n\"" print "\"Content-Type: text/plain; charset=CHARSET\\n\"" print "\"Content-Transfer-Encoding: 8bit\\n\"" print "" } { if (!text) start_line = NR } /\\$/ { text = text substr($0,1,length($0)-1); next } { if (text) $0 = text $0; text = "" } $1 == "exit" { gsub(/^[ \t]*exit[ \t][0-9]*[ \t]*/,"") if (gsub(/^@/, "")) { if (match($0, /^[^@].*/)) next } printf("#: %s:%d\n", FILENAME, start_line) printf("msgid \"%s\"\n", $0) printf("msgstr \"\"\n\n") next } $1 == "usage-error" \ || $1 == "nologin-error" \ || $1 == "config-error" \ || $1 == "system-error" { gsub(/^[ \t]*[a-z][a-z]*-error[ \t][ \t]*/,"") printf("#: %s:%d\n", FILENAME, start_line) printf("msgid \"%s\"\n", $0) printf("msgstr \"\"\n\n") } rush-1.8/src/defines.h0000644000175000017500000000020112773663675014731 0ustar00matsmats00000000000000#define CANONICAL_PROGRAM_NAME "/usr/local/sbin/rush" #define SYSCONFDIR "/usr/local/etc" #define LOCALSTATEDIR "/usr/local/var" rush-1.8/src/rwopt.h0000644000175000017500000003574012755767332014502 0ustar00matsmats00000000000000/* -*- buffer-read-only: t -*- vi: set ro: THIS FILE IS GENERATED AUTOMATICALLY. PLEASE DO NOT EDIT. */ #line 1 "rwopt.opt" /* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #line 17 "rwopt.opt" #line 17 void print_help(void); #line 17 void print_usage(void); #line 38 "rwopt.opt" #line 38 /* Option codes */ #line 38 enum { #line 38 _OPTION_INIT=255, #line 38 #line 38 "rwopt.opt" #line 38 OPTION_USAGE, #line 38 "rwopt.opt" #line 38 OPTION_VERSION, #line 38 "rwopt.opt" MAX_OPTION #line 38 }; #line 38 static struct option long_options[] = { #line 38 #line 20 "rwopt.opt" #line 20 { "format", required_argument, 0, 'F' }, #line 26 "rwopt.opt" #line 26 { "file", required_argument, 0, 'f' }, #line 32 "rwopt.opt" #line 32 { "no-header", no_argument, 0, 'H' }, #line 38 "rwopt.opt" #line 38 { "help", no_argument, 0, 'h' }, #line 38 "rwopt.opt" #line 38 { "usage", no_argument, 0, OPTION_USAGE }, #line 38 "rwopt.opt" #line 38 { "version", no_argument, 0, OPTION_VERSION }, #line 38 "rwopt.opt" {0, 0, 0, 0} #line 38 }; #line 38 static struct opthelp { #line 38 const char *opt; #line 38 const char *arg; #line 38 int is_optional; #line 38 const char *descr; #line 38 } opthelp[] = { #line 38 #line 22 "rwopt.opt" #line 22 { "-F, --format", N_("STRING"), 0, N_("Use STRING instead of the default format.") }, #line 28 "rwopt.opt" #line 28 { "-f, --file", N_("DIR"), 0, N_("Look for database files in DIR.") }, #line 34 "rwopt.opt" #line 34 { "-H, --no-header", NULL, 0, N_("Do not display header line.") }, #line 38 "rwopt.opt" #line 38 { NULL, NULL, 0, N_("Other options") }, #line 38 "rwopt.opt" #line 38 { "-h, --help", NULL, 0, N_("Give this help list") }, #line 38 "rwopt.opt" #line 38 { "--usage", NULL, 0, N_("Give a short usage message") }, #line 38 "rwopt.opt" #line 38 { "--version", NULL, 0, N_("Print program version") }, #line 38 "rwopt.opt" }; #line 17 "rwopt.opt" #line 17 const char *program_version = "rushwho" " (" PACKAGE_STRING ")"; #line 17 static char doc[] = N_("rushwho - show listing of online Rush users."); #line 17 static char args_doc[] = N_(""); #line 17 const char *program_bug_address = "<" PACKAGE_BUGREPORT ">"; #line 17 #line 17 #define DESCRCOLUMN 30 #line 17 #define RMARGIN 79 #line 17 #define GROUPCOLUMN 2 #line 17 #define USAGECOLUMN 13 #line 17 #line 17 static void #line 17 indent (size_t start, size_t col) #line 17 { #line 17 for (; start < col; start++) #line 17 putchar (' '); #line 17 } #line 17 #line 17 static void #line 17 print_option_descr (const char *descr, size_t lmargin, size_t rmargin) #line 17 { #line 17 while (*descr) #line 17 { #line 17 int s = 0; #line 17 int i; #line 17 size_t width = rmargin - lmargin; #line 17 #line 17 for (i = 0; ; i++) #line 17 { #line 17 if (descr[i] == 0 || isspace (descr[i])) #line 17 { #line 17 if (i > width) #line 17 break; #line 17 s = i; #line 17 if (descr[i] == 0) #line 17 break; #line 17 } #line 17 } #line 17 printf ("%*.*s\n", s, s, descr); #line 17 descr += s; #line 17 if (*descr) #line 17 { #line 17 indent (0, lmargin); #line 17 descr++; #line 17 } #line 17 } #line 17 } #line 17 #line 17 void #line 17 print_help(void) #line 17 { #line 17 unsigned i; #line 17 #line 17 printf ("%s %s [%s]...", _("Usage:"), "rushwho", _("OPTION")); #line 17 if (args_doc[0]) #line 17 printf(" %s", gettext(args_doc)); #line 17 printf("\n"); #line 17 if (doc[0]) #line 17 print_option_descr(gettext (doc), 0, RMARGIN); #line 17 putchar ('\n'); #line 17 #line 17 for (i = 0; i < sizeof (opthelp) / sizeof (opthelp[0]); i++) #line 17 { #line 17 unsigned n; #line 17 if (opthelp[i].opt) #line 17 { #line 17 n = printf (" %s", opthelp[i].opt); #line 17 if (opthelp[i].arg) #line 17 { #line 17 char *cb, *ce; #line 17 if (strlen (opthelp[i].opt) == 2) #line 17 { #line 17 if (!opthelp[i].is_optional) #line 17 { #line 17 putchar (' '); #line 17 n++; #line 17 } #line 17 } #line 17 else #line 17 { #line 17 putchar ('='); #line 17 n++; #line 17 } #line 17 if (opthelp[i].is_optional) #line 17 { #line 17 cb = "["; #line 17 ce = "]"; #line 17 } #line 17 else #line 17 cb = ce = ""; #line 17 n += printf ("%s%s%s", cb, gettext (opthelp[i].arg), ce); #line 17 } #line 17 if (n >= DESCRCOLUMN) #line 17 { #line 17 putchar ('\n'); #line 17 n = 0; #line 17 } #line 17 indent (n, DESCRCOLUMN); #line 17 print_option_descr (gettext (opthelp[i].descr), DESCRCOLUMN, RMARGIN); #line 17 } #line 17 else #line 17 { #line 17 if (i) #line 17 putchar ('\n'); #line 17 indent (0, GROUPCOLUMN); #line 17 print_option_descr (gettext (opthelp[i].descr), #line 17 GROUPCOLUMN, RMARGIN); #line 17 putchar ('\n'); #line 17 } #line 17 } #line 17 #line 17 putchar ('\n'); #line 17 print_option_descr (_("Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options."), 0, RMARGIN); #line 17 putchar ('\n'); #line 17 printf (_("Report bugs to %s.\n"), program_bug_address); #line 17 } #line 17 #line 17 static int #line 17 cmpidx_short(const void *a, const void *b) #line 17 { #line 17 struct opthelp const **opta = (struct opthelp const **)a; #line 17 struct opthelp const **optb = (struct opthelp const **)b; #line 17 #line 17 return (*opta)->opt[1] - (*optb)->opt[1]; #line 17 } #line 17 #line 17 static int #line 17 cmpidx_long(const void *a, const void *b) #line 17 { #line 17 struct opthelp const **ap = (struct opthelp const **)a; #line 17 struct opthelp const **bp = (struct opthelp const **)b; #line 17 char const *opta, *optb; #line 17 size_t lena, lenb; #line 17 #line 17 if ((*ap)->opt[1] == '-') #line 17 opta = (*ap)->opt; #line 17 else #line 17 opta = (*ap)->opt + 4; #line 17 lena = strcspn(opta, ","); #line 17 #line 17 if ((*bp)->opt[1] == '-') #line 17 optb = (*bp)->opt; #line 17 else #line 17 optb = (*bp)->opt + 4; #line 17 lenb = strcspn(optb, ","); #line 17 return strncmp(opta, optb, lena > lenb ? lenb : lena); #line 17 } #line 17 #line 17 void #line 17 print_usage(void) #line 17 { #line 17 unsigned i; #line 17 unsigned n; #line 17 char *buf; #line 17 size_t bufsize; #line 17 unsigned nidx; #line 17 struct opthelp **optidx; #line 17 size_t optcount = sizeof(opthelp) / sizeof(opthelp[0]); #line 17 #line 17 #define FLUSH do { buf[n] = 0; printf("%s\n", buf); n = USAGECOLUMN; memset(buf, ' ', n); } while (0) #line 17 #define ADDC(c) do { if (n == RMARGIN) FLUSH; buf[n++] = c; } while (0) #line 17 #line 17 optidx = calloc(optcount, sizeof(optidx[0])); #line 17 if (!optidx) #line 17 abort(); #line 17 bufsize = RMARGIN + 1; #line 17 buf = malloc(bufsize); #line 17 if (!buf) #line 17 abort(); #line 17 #line 17 n = snprintf(buf, bufsize, "%s %s ", _("Usage:"), "rushwho"); #line 17 #line 17 /* Print a list of short options without arguments. */ #line 17 for (i = nidx = 0; i < optcount; i++) #line 17 if (opthelp[i].opt && #line 17 opthelp[i].descr && #line 17 opthelp[i].opt[1] != '-' && #line 17 opthelp[i].arg == NULL) #line 17 optidx[nidx++] = opthelp + i; #line 17 #line 17 if (nidx) { #line 17 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_short); #line 17 #line 17 ADDC('['); #line 17 ADDC('-'); #line 17 for (i = 0; i < nidx; i++) { #line 17 ADDC(optidx[i]->opt[1]); #line 17 } #line 17 ADDC(']'); #line 17 } #line 17 #line 17 /* Print a list of short options with arguments. */ #line 17 for (i = nidx = 0; i < optcount; i++) { #line 17 if (opthelp[i].opt && #line 17 opthelp[i].descr && #line 17 opthelp[i].opt[1] != '-' && #line 17 opthelp[i].arg) #line 17 optidx[nidx++] = opthelp + i; #line 17 } #line 17 #line 17 if (nidx) { #line 17 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_short); #line 17 #line 17 for (i = 0; i < nidx; i++) { #line 17 struct opthelp *opt = optidx[i]; #line 17 size_t len = 5 + strlen(opt->arg) #line 17 + (opt->is_optional ? 2 : 1); #line 17 #line 17 if (n + len > RMARGIN) #line 17 FLUSH; #line 17 buf[n++] = ' '; #line 17 buf[n++] = '['; #line 17 buf[n++] = '-'; #line 17 buf[n++] = opt->opt[1]; #line 17 if (opt->is_optional) { #line 17 buf[n++] = '['; #line 17 strcpy(&buf[n], opt->arg); #line 17 n += strlen(opt->arg); #line 17 buf[n++] = ']'; #line 17 } else { #line 17 buf[n++] = ' '; #line 17 strcpy(&buf[n], opt->arg); #line 17 n += strlen(opt->arg); #line 17 } #line 17 buf[n++] = ']'; #line 17 } #line 17 } #line 17 #line 17 /* Print a list of long options */ #line 17 for (i = nidx = 0; i < optcount; i++) { #line 17 if (opthelp[i].opt && opthelp[i].descr #line 17 && (opthelp[i].opt[1] == '-' || opthelp[i].opt[2] == ',')) #line 17 optidx[nidx++] = opthelp + i; #line 17 } #line 17 #line 17 if (nidx) { #line 17 qsort(optidx, nidx, sizeof(optidx[0]), cmpidx_long); #line 17 #line 17 for (i = 0; i < nidx; i++) { #line 17 struct opthelp *opt = optidx[i]; #line 17 size_t len; #line 17 const char *longopt; #line 17 #line 17 if (opt->opt[1] == '-') #line 17 longopt = opt->opt; #line 17 else if (opt->opt[2] == ',') #line 17 longopt = opt->opt + 4; #line 17 else #line 17 continue; #line 17 #line 17 len = 3 + strlen(longopt) #line 17 + (opt->arg ? 1 + strlen(opt->arg) #line 17 + (opt->is_optional ? 2 : 0) : 0); #line 17 if (n + len > RMARGIN) { #line 17 FLUSH; #line 17 /* Make sure we have enough buffer space if the string cannot be split */ #line 17 if (n + len > bufsize) { #line 17 bufsize = n + len; #line 17 buf = realloc(buf, bufsize); #line 17 if (!buf) #line 17 abort(); #line 17 } #line 17 } #line 17 buf[n++] = ' '; #line 17 buf[n++] = '['; #line 17 strcpy(&buf[n], longopt); #line 17 n += strlen(longopt); #line 17 if (opt->arg) { #line 17 buf[n++] = '='; #line 17 if (opt->is_optional) { #line 17 buf[n++] = '['; #line 17 strcpy(&buf[n], opt->arg); #line 17 n += strlen(opt->arg); #line 17 buf[n++] = ']'; #line 17 } else { #line 17 strcpy(&buf[n], opt->arg); #line 17 n += strlen(opt->arg); #line 17 } #line 17 } #line 17 buf[n++] = ']'; #line 17 } #line 17 } #line 17 #line 17 /* Print argument list */ #line 17 if (args_doc[0]) { #line 17 char const *docstr = gettext(args_doc); #line 17 size_t len = strlen(docstr) + 1; #line 17 if (n + len <= RMARGIN) { #line 17 buf[n++] = ' '; #line 17 strcpy(buf + n, docstr); #line 17 n += len; #line 17 } else { #line 17 struct wordsplit ws; #line 17 #line 17 if (wordsplit(docstr, &ws, #line 17 WRDSF_SHOWERR | #line 17 WRDSF_NOVAR | #line 17 WRDSF_NOCMD | #line 17 WRDSF_QUOTE | #line 17 WRDSF_SQUEEZE_DELIMS)) #line 17 abort(); #line 17 #line 17 for (i = 0; i < ws.ws_wordc; i++) { #line 17 len = strlen(ws.ws_wordv[i]) + 1; #line 17 if (n + len > RMARGIN) { #line 17 FLUSH; #line 17 /* Make sure we have enough buffer space if the string cannot be split */ #line 17 if (n + len > bufsize) { #line 17 bufsize = n + len; #line 17 buf = realloc(buf, bufsize); #line 17 if (!buf) #line 17 abort(); #line 17 } #line 17 } #line 17 buf[n++] = ' '; #line 17 strcpy(buf + n, ws.ws_wordv[i]); #line 17 n += len; #line 17 } #line 17 } #line 17 } #line 17 #line 17 FLUSH; #line 17 #line 17 free(optidx); #line 17 free(buf); #line 17 } #line 17 #line 17 const char version_etc_copyright[] = #line 17 /* Do *not* mark this string for translation. %s is a copyright symbol suitable for this locale, and %d is the copyright year. */ #line 17 "Copyright %s 2008-2016 Sergey Poznyakoff"; #line 17 #line 17 void #line 17 print_version_only(const char *program_version, FILE *stream) #line 17 { #line 17 fprintf (stream, "%s\n", program_version); #line 17 /* TRANSLATORS: Translate "(C)" to the copyright symbol (C-in-a-circle), if this symbol is available in the user's locale. Otherwise, do not translate "(C)"; leave it as-is. */ #line 17 fprintf (stream, version_etc_copyright, _("(C)")); #line 17 fputc ('\n', stream); #line 17 } #line 17 #line 17 void #line 17 print_version(const char *program_version, FILE *stream) #line 17 { #line 17 print_version_only(program_version, stream); #line 17 #line 17 fputs (_("License GPLv3+: GNU GPL version 3 or later \nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\n"), #line 17 stream); #line 17 #line 17 } #line 17 #line 38 "rwopt.opt" #line 38 void get_options(int argc, char *argv[]) { #line 43 { #line 43 int optchar; #line 43 #line 43 #line 43 while ((optchar = getopt_long(argc, argv, "F:f:Hh", #line 43 long_options, NULL)) != EOF) #line 43 { #line 43 switch (optchar) #line 43 { #line 43 default: #line 43 exit(1); #line 43 #line 43 #line 22 "rwopt.opt" case 'F': #line 22 { #line 22 format = optarg; #line 24 break; #line 24 } #line 28 "rwopt.opt" case 'f': #line 28 { #line 28 base_name = optarg; #line 30 break; #line 30 } #line 34 "rwopt.opt" case 'H': #line 34 { #line 34 display_header = 0; #line 36 break; #line 36 } #line 38 "rwopt.opt" case 'h': #line 38 { #line 38 #line 38 print_help (); #line 38 exit (0); #line 38 #line 38 break; #line 38 } #line 38 "rwopt.opt" case OPTION_USAGE: #line 38 { #line 38 #line 38 print_usage (); #line 38 exit (0); #line 38 #line 38 break; #line 38 } #line 38 "rwopt.opt" case OPTION_VERSION: #line 38 { #line 38 #line 38 /* Give version */ #line 38 print_version(program_version, stdout); #line 38 exit (0); #line 38 #line 38 break; #line 38 } #line 43 "rwopt.opt" } #line 43 } #line 43 } #line 43 ; } rush-1.8/src/rlopt.opt0000644000175000017500000000344712755375137015037 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ static int numeric_option; define([],[]) OPTIONS_BEGIN(gnu, "rushlast", [], [<[user [user...]]>]) OPTION(format,F,STRING, []) BEGIN OPTSETUP; format = optarg; END OPTION(file,f,DIR, []) BEGIN OPTSETUP; base_name = optarg; END OPTION(forward,,, []) BEGIN OPTSETUP; forward = 1; END OPTION(no-header,H,, []) BEGIN OPTSETUP; display_header = 0; END OPTION(count,n,NUMBER, []) BEGIN char *p; OPTSETUP; count = strtoul(optarg, &p, 10); if (*p) error(1, 0, _("invalid number (%s)"), optarg); END OPTION(,0,,) ALIAS(,1) ALIAS(,2) ALIAS(,3) ALIAS(,4) ALIAS(,5) ALIAS(,6) ALIAS(,7) ALIAS(,8) ALIAS(,9) BEGIN if (!numeric_option) { count = 0; numeric_option = 1; } count = count * 10 + optchar - '0'; END OPTIONS_END void get_options(int argc, char *argv[]) { GETOPT(argc, argv); } rush-1.8/src/transform.c0000644000175000017500000003030212755375137015320 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2006-2016 Sergey Poznyakoff. (using my implementation for the GNU tar). GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include enum transform_type { transform_first, transform_global }; enum replace_segm_type { segm_literal, /* Literal segment */ segm_backref, /* Back-reference segment */ segm_case_ctl /* Case control segment (GNU extension) */ }; enum case_ctl_type { ctl_stop, /* Stop case conversion */ ctl_upcase_next,/* Turn the next character to uppercase */ ctl_locase_next,/* Turn the next character to lowercase */ ctl_upcase, /* Turn the replacement to uppercase until ctl_stop */ ctl_locase /* Turn the replacement to lowercase until ctl_stop */ }; struct replace_segm { struct replace_segm *next; enum replace_segm_type type; union { struct { char *ptr; size_t size; } literal; /* type == segm_literal */ size_t ref; /* type == segm_backref */ enum case_ctl_type ctl; /* type == segm_case_ctl */ } v; }; struct transform { struct transform *next; enum transform_type transform_type; unsigned match_number; regex_t regex; /* Compiled replacement expression */ struct replace_segm *repl_head, *repl_tail; size_t segm_count; /* Number of elements in the above list */ }; struct transform_list { struct transform *head, *tail; }; static struct transform * new_transform (struct transform_list *tlist) { struct transform *p = xzalloc (sizeof *p); if (tlist->tail) tlist->tail->next = p; else tlist->head = p; tlist->tail = p; return p; } static struct replace_segm * add_segment (struct transform *tf) { struct replace_segm *segm = xmalloc (sizeof *segm); segm->next = NULL; if (tf->repl_tail) tf->repl_tail->next = segm; else tf->repl_head = segm; tf->repl_tail = segm; tf->segm_count++; return segm; } static void add_literal_segment (struct transform *tf, char *str, char *end) { size_t len = end - str; if (len) { struct replace_segm *segm = add_segment (tf); segm->type = segm_literal; segm->v.literal.ptr = xmalloc (len + 1); memcpy (segm->v.literal.ptr, str, len); segm->v.literal.ptr[len] = 0; segm->v.literal.size = len; } } static void add_char_segment (struct transform *tf, int chr) { struct replace_segm *segm = add_segment (tf); segm->type = segm_literal; segm->v.literal.ptr = xmalloc (2); segm->v.literal.ptr[0] = chr; segm->v.literal.ptr[1] = 0; segm->v.literal.size = 1; } static void add_backref_segment (struct transform *tf, size_t ref) { struct replace_segm *segm = add_segment (tf); segm->type = segm_backref; segm->v.ref = ref; } static void add_case_ctl_segment (struct transform *tf, enum case_ctl_type ctl) { struct replace_segm *segm = add_segment (tf); segm->type = segm_case_ctl; segm->v.ctl = ctl; } static const char * parse_transform_expr (struct transform_list *tlist, const char *expr, int cflags) { int delim; int i, j, rc; char *str, *beg, *cur; const char *p; struct transform *tf = new_transform (tlist); if (expr[0] != 's') die(usage_error, NULL, _("Invalid transform expression: %s"), expr); delim = expr[1]; /* Scan regular expression */ for (i = 2; expr[i] && expr[i] != delim; i++) if (expr[i] == '\\' && expr[i+1]) i++; if (expr[i] != delim) die(usage_error, NULL, _("Missing 2nd delimiter in position %d of expression %s"), i, expr); /* Scan replacement expression */ for (j = i + 1; expr[j] && expr[j] != delim; j++) if (expr[j] == '\\' && expr[j+1]) j++; if (expr[j] != delim) die(usage_error, NULL, _("Missing trailing delimiter in position %d of expression %s"), j, expr); /* Check flags */ tf->transform_type = transform_first; for (p = expr + j + 1; *p && *p != ';'; p++) switch (*p) { case 'g': tf->transform_type = transform_global; break; case 'i': cflags |= REG_ICASE; break; case 'x': cflags |= REG_EXTENDED; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tf->match_number = strtoul (p, (char**) &p, 0); p--; break; default: die(usage_error, NULL, _("Unknown flag in transform expression: %c"), *p); } if (*p == ';') p++; /* Extract and compile regex */ str = xmalloc (i - 1); memcpy (str, expr + 2, i - 2); str[i - 2] = 0; rc = regcomp (&tf->regex, str, cflags); if (rc) { char errbuf[512]; regerror (rc, &tf->regex, errbuf, sizeof (errbuf)); die(usage_error, NULL, _("Invalid transform expression: %s"), errbuf); } if (str[0] == '^' || str[strlen (str) - 1] == '$') tf->transform_type = transform_first; free (str); /* Extract and compile replacement expr */ i++; str = xmalloc (j - i + 1); memcpy (str, expr + i, j - i); str[j - i] = 0; for (cur = beg = str; *cur;) { if (*cur == '\\') { size_t n; add_literal_segment (tf, beg, cur); switch (*++cur) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = strtoul (cur, &cur, 10); if (n > tf->regex.re_nsub) die(usage_error, NULL, _("Invalid transform replacement: " "back reference out of range")); add_backref_segment (tf, n); break; case '\\': add_char_segment (tf, '\\'); cur++; break; case 'a': add_char_segment (tf, '\a'); cur++; break; case 'b': add_char_segment (tf, '\b'); cur++; break; case 'f': add_char_segment (tf, '\f'); cur++; break; case 'n': add_char_segment (tf, '\n'); cur++; break; case 'r': add_char_segment (tf, '\r'); cur++; break; case 't': add_char_segment (tf, '\t'); cur++; break; case 'v': add_char_segment (tf, '\v'); cur++; break; case '&': add_char_segment (tf, '&'); cur++; break; case 'L': /* Turn the replacement to lowercase until a `\U' or `\E' is found, */ add_case_ctl_segment (tf, ctl_locase); cur++; break; case 'l': /* Turn the next character to lowercase, */ add_case_ctl_segment (tf, ctl_locase_next); cur++; break; case 'U': /* Turn the replacement to uppercase until a `\L' or `\E' is found, */ add_case_ctl_segment (tf, ctl_upcase); cur++; break; case 'u': /* Turn the next character to uppercase, */ add_case_ctl_segment (tf, ctl_upcase_next); cur++; break; case 'E': /* Stop case conversion started by `\L' or `\U'. */ add_case_ctl_segment (tf, ctl_stop); cur++; break; default: /* Try to be nice */ { char buf[2]; buf[0] = '\\'; buf[1] = *cur; add_literal_segment (tf, buf, buf + 2); } cur++; break; } beg = cur; } else if (*cur == '&') { add_literal_segment (tf, beg, cur); add_backref_segment (tf, 0); beg = ++cur; } else cur++; } add_literal_segment (tf, beg, cur); return p; } transform_t compile_transform_expr (const char *expr, int cflags) { struct transform_list tlist = { NULL, NULL }; while (*expr) expr = parse_transform_expr (&tlist, expr, cflags); return tlist.head; } /* Run case conversion specified by CASE_CTL on array PTR of SIZE characters. Returns pointer to statically allocated storage. */ static const char * run_case_conv (enum case_ctl_type case_ctl, const char *ptr, size_t size) { static char *case_ctl_buffer; static size_t case_ctl_bufsize; char *p; if (case_ctl_bufsize < size) { case_ctl_bufsize = size; case_ctl_buffer = xrealloc (case_ctl_buffer, case_ctl_bufsize); } memcpy (case_ctl_buffer, ptr, size); switch (case_ctl) { case ctl_upcase_next: case_ctl_buffer[0] = c_toupper (case_ctl_buffer[0]); break; case ctl_locase_next: case_ctl_buffer[0] = c_tolower (case_ctl_buffer[0]); break; case ctl_upcase: for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++) *p = c_toupper (*p); break; case ctl_locase: for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++) *p = c_tolower (*p); break; case ctl_stop: break; } return case_ctl_buffer; } void _single_transform_name_to_slist (struct transform *tf, slist_t slist, const char *input) { regmatch_t *rmp; int rc; size_t nmatches = 0; enum case_ctl_type case_ctl = ctl_stop, /* Current case conversion op */ save_ctl = ctl_stop; /* Saved case_ctl for \u and \l */ /* Reset case conversion after a single-char operation */ #define CASE_CTL_RESET() if (case_ctl == ctl_upcase_next \ || case_ctl == ctl_locase_next) \ { \ case_ctl = save_ctl; \ save_ctl = ctl_stop; \ } rmp = xmalloc ((tf->regex.re_nsub + 1) * sizeof (*rmp)); while (*input) { size_t disp; const char *ptr; rc = regexec (&tf->regex, input, tf->regex.re_nsub + 1, rmp, 0); if (rc == 0) { struct replace_segm *segm; disp = rmp[0].rm_eo; if (rmp[0].rm_so) slist_append (slist, input, rmp[0].rm_so); nmatches++; if (tf->match_number && nmatches < tf->match_number) { slist_append (slist, input, disp); input += disp; continue; } for (segm = tf->repl_head; segm; segm = segm->next) { switch (segm->type) { case segm_literal: /* Literal segment */ if (case_ctl == ctl_stop) ptr = segm->v.literal.ptr; else { ptr = run_case_conv (case_ctl, segm->v.literal.ptr, segm->v.literal.size); CASE_CTL_RESET(); } slist_append (slist, ptr, segm->v.literal.size); break; case segm_backref: /* Back-reference segment */ if (rmp[segm->v.ref].rm_so != -1 && rmp[segm->v.ref].rm_eo != -1) { size_t size = rmp[segm->v.ref].rm_eo - rmp[segm->v.ref].rm_so; ptr = input + rmp[segm->v.ref].rm_so; if (case_ctl != ctl_stop) { ptr = run_case_conv (case_ctl, ptr, size); CASE_CTL_RESET(); } slist_append (slist, ptr, size); } break; case segm_case_ctl: switch (segm->v.ctl) { case ctl_upcase_next: case ctl_locase_next: switch (save_ctl) { case ctl_stop: case ctl_upcase: case ctl_locase: save_ctl = case_ctl; default: break; } /*FALL THROUGH*/ case ctl_upcase: case ctl_locase: case ctl_stop: case_ctl = segm->v.ctl; } } } } else { disp = strlen (input); slist_append (slist, input, disp); } input += disp; if (tf->transform_type == transform_first) { slist_append (slist, input, strlen (input)); break; } } free (rmp); } char * transform_string (transform_t tf, const char *input) { if (tf) { slist_t slist = slist_create (); char *buf = NULL; size_t size = 0; for (; tf; tf = tf->next) { _single_transform_name_to_slist (tf, slist, input); input = slist_reduce (slist, &buf, &size); } slist_free(slist); } return xstrdup (input); } rush-1.8/src/rushopt.opt0000644000175000017500000000403112755375137015371 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include OPTIONS_BEGIN(gnu, "rush", [], [<[FILE]>]) OPTION(debug,d,NUMBER, []) BEGIN debug_level = atoi(optarg); debug_option = 1; END OPTION(test,t,, []) ALIAS(lint) BEGIN lint_option = 1; END OPTION(user,u,NAME, []) BEGIN lint_option = 1; if (getuid()) die(usage_error, NULL, _("the --user option is allowed " "for the superuser only")); test_user_name = optarg; END OPTION(,c,COMMAND, []) BEGIN command = optarg; END OPTION(,i,, []) BEGIN lint_option = 1; interactive = 1; END OPTION(dump,D,KEYWORDS, []) BEGIN dump_option = optarg; lint_option = 1; END OPTION(security-check,C,CHECK, []) BEGIN if (cfck_keyword(optarg)) die(usage_error, NULL, _("unknown keyword: %s"), optarg); END OPTION(show-default,,, []) BEGIN #ifdef RUSH_DEFAULT_CONFIG printf("%s\n", RUSH_DEFAULT_CONFIG); exit(0); #else error(1, 0, _("No default configuration")); #endif END OPTIONS_END void get_options(int argc, char *argv[]) { GETOPT(argc, argv) } rush-1.8/src/rwopt.opt0000644000175000017500000000224312755375137015043 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ OPTIONS_BEGIN(gnu, "rushwho", []) OPTION(format,F,STRING, []) BEGIN format = optarg; END OPTION(file,f,DIR, []) BEGIN base_name = optarg; END OPTION(no-header,H,, []) BEGIN display_header = 0; END OPTIONS_END void get_options(int argc, char *argv[]) { GETOPT(argc, argv); } rush-1.8/src/socket.c0000644000175000017500000000345312755375137014604 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include int post_socket_send(const struct rush_sockaddr *sockaddr, const struct rush_rule *rule, const struct rush_request *req) { int domain; int fd; FILE *fp; char buf[128]; char *p; switch (sockaddr->sa->sa_family) { case AF_UNIX: domain = PF_UNIX; break; case AF_INET: domain = PF_INET; break; default: /* should not happen */ abort(); } fd = socket(domain, SOCK_STREAM, 0); if (fd == -1) { logmsg(LOG_ERR, "socket: %s", strerror(errno)); return 1; } if (connect(fd, sockaddr->sa, sockaddr->len)) { logmsg(LOG_ERR, "connect: %s", strerror(errno)); return 1; } fp = fdopen(fd, "a+"); /* Communication takes place in accordance with TCPMUX protocol (RFC 1078). The rule tag is used as service name. */ fprintf(fp, "%s\r\n", rule->tag); p = fgets(buf, sizeof(buf), fp); if (!p) logmsg(LOG_ERR, _("%s: TCPMUX did not respond"), rule->tag); else if (*p == '+') fprintf(fp, "%s %s\r\n", req->pw->pw_name, req->cmdline); else logmsg(LOG_ERR, _("%s: TCPMUX returned %s"), rule->tag, p); fflush(fp); fclose(fp); return 0; } rush-1.8/src/dump.c0000644000175000017500000001470212755764036014260 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include struct json_dumper { FILE *fp; int indent; int level; int first; }; static void dumper_init(struct json_dumper *dmp, FILE *fp, int indent) { dmp->fp = fp; dmp->indent = indent; dmp->level = 1; dmp->first = 1; } static void dumper_copy(struct json_dumper *dst, struct json_dumper *src) { dst->fp = src->fp; dst->indent = src->indent; dst->level = src->level + 1; dst->first = 1; } static void dump_indent(struct json_dumper *dmp) { int i; for (i = 0; i < dmp->indent * dmp->level; i++) fputc(' ', dmp->fp); } static void dump_separator(struct json_dumper *dmp) { if (dmp->indent) { fputc('\n', dmp->fp); dump_indent(dmp); } else fputc(' ', dmp->fp); } static void dump_delim(struct json_dumper *dmp) { fputc(',', dmp->fp); dump_separator(dmp); } static void dump_id(char const *id, struct json_dumper *dmp) { if (dmp->first) dmp->first = 0; else dump_delim(dmp); fprintf(dmp->fp, "\"%s\":", id); } static void dump_null(char const *id, struct json_dumper *dmp) { dump_id(id, dmp); fputs("null", dmp->fp); } static void dump_string_data(char const *string, struct json_dumper *dmp) { if (!string) { fputs("null", dmp->fp); return; } fputc('\"', dmp->fp); for (;*string; string++) { if (*string == '\\' || *string == '\"') fputc('\\', dmp->fp); fputc(*string, dmp->fp); } fputc('\"', dmp->fp); } static void dump_string(char const *string, char const *id, struct json_dumper *dmp) { dump_id(id, dmp); dump_string_data(string, dmp); } static void dump_raw_argv(char **argv, struct json_dumper *dmp) { size_t i; for (i = 0; argv[i]; i++) { if (i) dump_delim(dmp); dump_string_data(argv[i], dmp); } } static int cmp_ptr(const void *a, const void *b) { char ** const aptr = (char ** const) a; char ** const bptr = (char ** const) b; return strcmp (*aptr, *bptr); } static void dump_argv(char **argv, char const *id, int sort, struct json_dumper *dmp) { size_t i; struct json_dumper nest_dmp; dump_id(id, dmp); if (!argv) { fputs("null", dmp->fp); return; } fputc('[', dmp->fp); if (!argv[0]) { fputc(']', dmp->fp); return; } if (dmp->indent) fputc('\n', dmp->fp); dumper_copy(&nest_dmp, dmp); dump_indent(&nest_dmp); if (sort) { char **newargv; for (i = 0; argv[i]; i++) ; newargv = xcalloc(i+1, sizeof(newargv[0])); for (i = 0; (newargv[i] = argv[i]) != NULL; i++) ; qsort(newargv, i, sizeof(newargv[0]), cmp_ptr); dump_raw_argv(newargv, &nest_dmp); free(newargv); } else { dump_raw_argv(argv, &nest_dmp); } dump_separator(dmp); fputc(']', dmp->fp); } static void dump_umax(uintmax_t val, char const *id, struct json_dumper *dmp) { char buf[INT_BUFSIZE_BOUND(uintmax_t)]; dump_id(id, dmp); fputs(umaxtostr(val, buf), dmp->fp); } static void dump_octal(unsigned val, char const *id, struct json_dumper *dmp) { dump_id(id, dmp); fprintf(dmp->fp, "%03o", val); } static void dump_int(int val, char const *id, struct json_dumper *dmp) { dump_id(id, dmp); fprintf(dmp->fp, "%d", val); } struct dump_var { char const *name; size_t off; void (*dumper) (struct rush_request *, const char *id, struct json_dumper *); }; static char allkw[] = "cmdline," "argv," "prog," "interactive," "pw_name," "pw_uid," "pw_gid," "pw_dir," "umask," "chroot_dir," "home_dir," "gid," "fork," "acct," "text_domain," "localedir," "locale," "environ"; void dump_request(struct rush_request *req, FILE *fp) { size_t i; struct json_dumper dmp; struct wordsplit ws; ws.ws_delim = ","; if (strcmp(dump_option, "all") == 0) dump_option = allkw; if (wordsplit(dump_option, &ws, WRDSF_DELIM |WRDSF_WS|WRDSF_SQUEEZE_DELIMS |WRDSF_NOVAR|WRDSF_NOCMD|WRDSF_SHOWERR)) abort(); dumper_init(&dmp, fp, 4); fputc('{', fp); dump_separator(&dmp); for (i = 0; i < ws.ws_wordc; i++) { if (strcmp(ws.ws_wordv[i], "cmdline") == 0) dump_string(req->cmdline, "cmdline", &dmp); else if (strcmp(ws.ws_wordv[i], "argv") == 0) dump_argv(req->argv, "argv", 0, &dmp); else if (strcmp(ws.ws_wordv[i], "prog") == 0) dump_string(req->prog, "prog", &dmp); else if (strcmp(ws.ws_wordv[i], "interactive") == 0) dump_int(req->interactive, "interactive", &dmp); else if (strcmp(ws.ws_wordv[i], "pw_name") == 0) dump_string(req->pw->pw_name, "pw_name", &dmp); else if (strcmp(ws.ws_wordv[i], "pw_uid") == 0) dump_umax(req->pw->pw_uid, "pw_uid", &dmp); else if (strcmp(ws.ws_wordv[i], "pw_gid") == 0) dump_umax(req->pw->pw_gid, "pw_gid", &dmp); else if (strcmp(ws.ws_wordv[i], "pw_dir") == 0) dump_string(req->pw->pw_dir, "pw_dir", &dmp); else if (strcmp(ws.ws_wordv[i], "umask") == 0) dump_octal(req->umask, "umask", &dmp); else if (strcmp(ws.ws_wordv[i], "chroot_dir") == 0) dump_string(req->chroot_dir, "chroot_dir", &dmp); else if (strcmp(ws.ws_wordv[i], "home_dir") == 0) dump_string(req->home_dir, "home_dir", &dmp); else if (strcmp(ws.ws_wordv[i], "gid") == 0) { if (req->gid == NO_GID) dump_null("gid", &dmp); else dump_umax(req->gid, "gid", &dmp); } else if (strcmp(ws.ws_wordv[i], "fork") == 0) dump_int(req->fork, "fork", &dmp); else if (strcmp(ws.ws_wordv[i], "acct") == 0) dump_int(req->acct, "acct", &dmp); //FIXME: socket else if (strcmp(ws.ws_wordv[i], "text_domain") == 0) dump_string(req->i18n.text_domain, "text_domain", &dmp); else if (strcmp(ws.ws_wordv[i], "localedir") == 0) dump_string(req->i18n.localedir, "localedir", &dmp); else if (strcmp(ws.ws_wordv[i], "locale") == 0) dump_string(req->i18n.locale, "locale", &dmp); else if (strcmp(ws.ws_wordv[i], "environ") == 0) dump_argv(environ, "environ", 1, &dmp); else logmsg(LOG_ERR, _("unknown keyword: %s"), ws.ws_wordv[i]); } if (dmp.indent) fputc('\n', fp); fputc('}', fp); fputc('\n', fp); wordsplit_free(&ws); } rush-1.8/src/Makefile.in0000644000175000017500000015054212773663660015220 0ustar00matsmats00000000000000# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ # This file is part of GNU Rush. # Copyright (C) 2008-2016 Sergey Poznyakoff # # GNU Rush is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Rush is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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 = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = rush$(EXEEXT) bin_PROGRAMS = rushlast$(EXEEXT) rushwho$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/build-aux/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/doc/imprimatur/imprimatur.m4 \ $(top_srcdir)/m4/00gnulib.m4 \ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/configmake.m4 $(top_srcdir)/m4/dirname.m4 \ $(top_srcdir)/m4/double-slash-root.m4 \ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \ $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fcntl-o.m4 \ $(top_srcdir)/m4/flexmember.m4 $(top_srcdir)/m4/float_h.m4 \ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getline.m4 \ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gettimeofday.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gnulib-common.m4 \ $(top_srcdir)/m4/gnulib-comp.m4 \ $(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/include_next.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/locale-fr.m4 \ $(top_srcdir)/m4/locale-ja.m4 $(top_srcdir)/m4/locale-zh.m4 \ $(top_srcdir)/m4/locale_h.m4 $(top_srcdir)/m4/localeconv.m4 \ $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \ $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbtowc.m4 \ $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mktime.m4 \ $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/msvc-inval.m4 \ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/obstack.m4 \ $(top_srcdir)/m4/off_t.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/printf.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \ $(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/size_max.m4 \ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \ $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdint.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/stdio_h.m4 \ $(top_srcdir)/m4/stdlib_h.m4 $(top_srcdir)/m4/strerror.m4 \ $(top_srcdir)/m4/strftime.m4 $(top_srcdir)/m4/string_h.m4 \ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ $(top_srcdir)/m4/sys_socket_h.m4 \ $(top_srcdir)/m4/sys_time_h.m4 $(top_srcdir)/m4/sys_types_h.m4 \ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/time_rz.m4 \ $(top_srcdir)/m4/timegm.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/vasnprintf.m4 \ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/warn-on-use.m4 \ $(top_srcdir)/m4/wchar_h.m4 $(top_srcdir)/m4/wchar_t.m4 \ $(top_srcdir)/m4/wcrtomb.m4 $(top_srcdir)/m4/wctype_h.m4 \ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrndup.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" \ "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) $(sbin_PROGRAMS) am_rush_OBJECTS = cfck.$(OBJEXT) config.$(OBJEXT) dump.$(OBJEXT) \ limits.$(OBJEXT) map.$(OBJEXT) rush.$(OBJEXT) socket.$(OBJEXT) \ transform.$(OBJEXT) rush_OBJECTS = $(am_rush_OBJECTS) rush_LDADD = $(LDADD) rush_DEPENDENCIES = ../lib/librush.a ../gnu/libgnu.a am_rushlast_OBJECTS = rushlast.$(OBJEXT) rushlast_OBJECTS = $(am_rushlast_OBJECTS) rushlast_LDADD = $(LDADD) rushlast_DEPENDENCIES = ../lib/librush.a ../gnu/libgnu.a am_rushwho_OBJECTS = rushwho.$(OBJEXT) rushwho_OBJECTS = $(am_rushwho_OBJECTS) rushwho_LDADD = $(LDADD) rushwho_DEPENDENCIES = ../lib/librush.a ../gnu/libgnu.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rush_SOURCES) $(rushlast_SOURCES) $(rushwho_SOURCES) DIST_SOURCES = $(rush_SOURCES) $(rushlast_SOURCES) $(rushwho_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibexecdir = @pkglibexecdir@ ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOM4TE = @AUTOM4TE@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ EXEEXT = @EXEEXT@ FLOAT_H = @FLOAT_H@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIB_ATOLL = @GNULIB_ATOLL@ GNULIB_BTOWC = @GNULIB_BTOWC@ GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ GNULIB_CHDIR = @GNULIB_CHDIR@ GNULIB_CHOWN = @GNULIB_CHOWN@ GNULIB_CLOSE = @GNULIB_CLOSE@ GNULIB_DPRINTF = @GNULIB_DPRINTF@ GNULIB_DUP = @GNULIB_DUP@ GNULIB_DUP2 = @GNULIB_DUP2@ GNULIB_DUP3 = @GNULIB_DUP3@ GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@ GNULIB_ENVIRON = @GNULIB_ENVIRON@ GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ GNULIB_FCHDIR = @GNULIB_FCHDIR@ GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ GNULIB_FCLOSE = @GNULIB_FCLOSE@ GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ GNULIB_FDOPEN = @GNULIB_FDOPEN@ GNULIB_FFLUSH = @GNULIB_FFLUSH@ GNULIB_FFSL = @GNULIB_FFSL@ GNULIB_FFSLL = @GNULIB_FFSLL@ GNULIB_FGETC = @GNULIB_FGETC@ GNULIB_FGETS = @GNULIB_FGETS@ GNULIB_FOPEN = @GNULIB_FOPEN@ GNULIB_FPRINTF = @GNULIB_FPRINTF@ GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ GNULIB_FPURGE = @GNULIB_FPURGE@ GNULIB_FPUTC = @GNULIB_FPUTC@ GNULIB_FPUTS = @GNULIB_FPUTS@ GNULIB_FREAD = @GNULIB_FREAD@ GNULIB_FREOPEN = @GNULIB_FREOPEN@ GNULIB_FSCANF = @GNULIB_FSCANF@ GNULIB_FSEEK = @GNULIB_FSEEK@ GNULIB_FSEEKO = @GNULIB_FSEEKO@ GNULIB_FSYNC = @GNULIB_FSYNC@ GNULIB_FTELL = @GNULIB_FTELL@ GNULIB_FTELLO = @GNULIB_FTELLO@ GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ GNULIB_FWRITE = @GNULIB_FWRITE@ GNULIB_GETC = @GNULIB_GETC@ GNULIB_GETCHAR = @GNULIB_GETCHAR@ GNULIB_GETCWD = @GNULIB_GETCWD@ GNULIB_GETDELIM = @GNULIB_GETDELIM@ GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ GNULIB_GETLINE = @GNULIB_GETLINE@ GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@ GNULIB_GRANTPT = @GNULIB_GRANTPT@ GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ GNULIB_ISATTY = @GNULIB_ISATTY@ GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ GNULIB_LCHOWN = @GNULIB_LCHOWN@ GNULIB_LINK = @GNULIB_LINK@ GNULIB_LINKAT = @GNULIB_LINKAT@ GNULIB_LOCALECONV = @GNULIB_LOCALECONV@ GNULIB_LSEEK = @GNULIB_LSEEK@ GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ GNULIB_MBRLEN = @GNULIB_MBRLEN@ GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ GNULIB_MBSCHR = @GNULIB_MBSCHR@ GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ GNULIB_MBSINIT = @GNULIB_MBSINIT@ GNULIB_MBSLEN = @GNULIB_MBSLEN@ GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ GNULIB_MBSSEP = @GNULIB_MBSSEP@ GNULIB_MBSSPN = @GNULIB_MBSSPN@ GNULIB_MBSSTR = @GNULIB_MBSSTR@ GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ GNULIB_MBTOWC = @GNULIB_MBTOWC@ GNULIB_MEMCHR = @GNULIB_MEMCHR@ GNULIB_MEMMEM = @GNULIB_MEMMEM@ GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ GNULIB_MKTIME = @GNULIB_MKTIME@ GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@ GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ GNULIB_PCLOSE = @GNULIB_PCLOSE@ GNULIB_PERROR = @GNULIB_PERROR@ GNULIB_PIPE = @GNULIB_PIPE@ GNULIB_PIPE2 = @GNULIB_PIPE2@ GNULIB_POPEN = @GNULIB_POPEN@ GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ GNULIB_PREAD = @GNULIB_PREAD@ GNULIB_PRINTF = @GNULIB_PRINTF@ GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ GNULIB_PTSNAME = @GNULIB_PTSNAME@ GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ GNULIB_PUTC = @GNULIB_PUTC@ GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ GNULIB_PUTENV = @GNULIB_PUTENV@ GNULIB_PUTS = @GNULIB_PUTS@ GNULIB_PWRITE = @GNULIB_PWRITE@ GNULIB_QSORT_R = @GNULIB_QSORT_R@ GNULIB_RANDOM = @GNULIB_RANDOM@ GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ GNULIB_READ = @GNULIB_READ@ GNULIB_READLINK = @GNULIB_READLINK@ GNULIB_READLINKAT = @GNULIB_READLINKAT@ GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ GNULIB_REALPATH = @GNULIB_REALPATH@ GNULIB_REMOVE = @GNULIB_REMOVE@ GNULIB_RENAME = @GNULIB_RENAME@ GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ GNULIB_RMDIR = @GNULIB_RMDIR@ GNULIB_RPMATCH = @GNULIB_RPMATCH@ GNULIB_SCANF = @GNULIB_SCANF@ GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@ GNULIB_SETENV = @GNULIB_SETENV@ GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ GNULIB_SETLOCALE = @GNULIB_SETLOCALE@ GNULIB_SLEEP = @GNULIB_SLEEP@ GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ GNULIB_STPCPY = @GNULIB_STPCPY@ GNULIB_STPNCPY = @GNULIB_STPNCPY@ GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ GNULIB_STRDUP = @GNULIB_STRDUP@ GNULIB_STRERROR = @GNULIB_STRERROR@ GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ GNULIB_STRNCAT = @GNULIB_STRNCAT@ GNULIB_STRNDUP = @GNULIB_STRNDUP@ GNULIB_STRNLEN = @GNULIB_STRNLEN@ GNULIB_STRPBRK = @GNULIB_STRPBRK@ GNULIB_STRPTIME = @GNULIB_STRPTIME@ GNULIB_STRSEP = @GNULIB_STRSEP@ GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ GNULIB_STRSTR = @GNULIB_STRSTR@ GNULIB_STRTOD = @GNULIB_STRTOD@ GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ GNULIB_STRTOLL = @GNULIB_STRTOLL@ GNULIB_STRTOULL = @GNULIB_STRTOULL@ GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ GNULIB_SYMLINK = @GNULIB_SYMLINK@ GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ GNULIB_TIMEGM = @GNULIB_TIMEGM@ GNULIB_TIME_R = @GNULIB_TIME_R@ GNULIB_TIME_RZ = @GNULIB_TIME_RZ@ GNULIB_TMPFILE = @GNULIB_TMPFILE@ GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ GNULIB_UNLINK = @GNULIB_UNLINK@ GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ GNULIB_UNSETENV = @GNULIB_UNSETENV@ GNULIB_USLEEP = @GNULIB_USLEEP@ GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ GNULIB_VFSCANF = @GNULIB_VFSCANF@ GNULIB_VPRINTF = @GNULIB_VPRINTF@ GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ GNULIB_VSCANF = @GNULIB_VSCANF@ GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ GNULIB_WCPCPY = @GNULIB_WCPCPY@ GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ GNULIB_WCSCAT = @GNULIB_WCSCAT@ GNULIB_WCSCHR = @GNULIB_WCSCHR@ GNULIB_WCSCMP = @GNULIB_WCSCMP@ GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ GNULIB_WCSCPY = @GNULIB_WCSCPY@ GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ GNULIB_WCSDUP = @GNULIB_WCSDUP@ GNULIB_WCSLEN = @GNULIB_WCSLEN@ GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ GNULIB_WCSSPN = @GNULIB_WCSSPN@ GNULIB_WCSSTR = @GNULIB_WCSSTR@ GNULIB_WCSTOK = @GNULIB_WCSTOK@ GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ GNULIB_WCTOB = @GNULIB_WCTOB@ GNULIB_WCTOMB = @GNULIB_WCTOMB@ GNULIB_WCTRANS = @GNULIB_WCTRANS@ GNULIB_WCTYPE = @GNULIB_WCTYPE@ GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ GNULIB_WMEMSET = @GNULIB_WMEMSET@ GNULIB_WRITE = @GNULIB_WRITE@ GNULIB__EXIT = @GNULIB__EXIT@ GREP = @GREP@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP2 = @HAVE_DUP2@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MEMCHR = @HAVE_MEMCHR@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ IMPRIMATUR_MAKEINFOFLAGS = @IMPRIMATUR_MAKEINFOFLAGS@ IMPRIMATUR_MODULE_DIR = @IMPRIMATUR_MODULE_DIR@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMULTITHREAD = @LIBMULTITHREAD@ LIBOBJS = @LIBOBJS@ LIBPTH = @LIBPTH@ LIBPTH_PREFIX = @LIBPTH_PREFIX@ LIBS = @LIBS@ LIBTHREAD = @LIBTHREAD@ LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ LOCALE_FR = @LOCALE_FR@ LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ LOCALE_JA = @LOCALE_JA@ LOCALE_ZH_CN = @LOCALE_ZH_CN@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ LTLIBOBJS = @LTLIBOBJS@ LTLIBPTH = @LTLIBPTH@ LTLIBTHREAD = @LTLIBTHREAD@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ RANLIB = @RANLIB@ RENDITION = @RENDITION@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC = @REPLACE_CALLOC@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_MALLOC = @REPLACE_MALLOC@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_QSORT_R = @REPLACE_QSORT_R@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_READLINKAT = @REPLACE_READLINKAT@ REPLACE_REALLOC = @REPLACE_REALLOC@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ RUSH_DEFAULT_CONFIG = @RUSH_DEFAULT_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgdata_DATA = rush-po.awk rush_SOURCES = \ cfck.c\ config.c\ defines.h\ dump.c\ limits.c\ map.c\ rush.c\ rush.h\ rushopt.h\ socket.c\ transform.c rushlast_SOURCES = rushlast.c rlopt.h rushwho_SOURCES = rushwho.c rwopt.h EXTRA_DIST = rush-po.awk rushopt.opt rlopt.opt rwopt.opt getopt.m4 defconf.sed AM_CPPFLAGS = -I$(top_srcdir)/gnu -I$(top_builddir)/gnu -I$(top_srcdir)/lib LDADD = ../lib/librush.a ../gnu/libgnu.a @LTLIBINTL@ BUILT_SOURCES = defines.h rushopt.h rwopt.h rlopt.h CLEANFILES = defines.h MAINTAINER_CLEANFILES = rushopt.h rwopt.h rlopt.h SUFFIXES = .opt .c .h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .opt .c .h .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnits src/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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) installcheck-sbinPROGRAMS: $(sbin_PROGRAMS) bad=0; pid=$$$$; list="$(sbin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(sbindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad rush$(EXEEXT): $(rush_OBJECTS) $(rush_DEPENDENCIES) $(EXTRA_rush_DEPENDENCIES) @rm -f rush$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rush_OBJECTS) $(rush_LDADD) $(LIBS) rushlast$(EXEEXT): $(rushlast_OBJECTS) $(rushlast_DEPENDENCIES) $(EXTRA_rushlast_DEPENDENCIES) @rm -f rushlast$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rushlast_OBJECTS) $(rushlast_LDADD) $(LIBS) rushwho$(EXEEXT): $(rushwho_OBJECTS) $(rushwho_DEPENDENCIES) $(EXTRA_rushwho_DEPENDENCIES) @rm -f rushwho$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rushwho_OBJECTS) $(rushwho_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfck.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rush.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rushlast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rushwho.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files 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)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-sbinPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-sbinPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: installcheck-binPROGRAMS installcheck-sbinPROGRAMS maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA \ uninstall-sbinPROGRAMS .MAKE: all check install install-am install-exec-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-sbinPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-hook install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgdataDATA install-ps \ install-ps-am install-sbinPROGRAMS install-strip installcheck \ installcheck-am installcheck-binPROGRAMS \ installcheck-sbinPROGRAMS installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA \ uninstall-sbinPROGRAMS rushlast.c: rlopt.h rushwho.c: rwopt.h change-suid-mode: @proglist='$(sbin_PROGRAMS)'; \ for prog in $$proglist; do \ prog=$(DESTDIR)$(sbindir)/`echo $$prog | sed '$(transform)'`; \ if chown 0:0 $$prog && chmod u+s $$prog; then :; else \ echo "Cannot change $$prog to setuid root"; \ fi;\ done install-exec-hook: change-suid-mode defines.h: Makefile $(AM_V_GEN)p=`echo rush | sed 's/$(EXEEXT)$$//'`; \ f=`echo "$$p" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'` ; \ echo "#define CANONICAL_PROGRAM_NAME \"$(sbindir)/$$f\"" | tr -s / > $@-t; \ echo "#define SYSCONFDIR \"$(sysconfdir)\"" >> $@-t; \ echo "#define LOCALSTATEDIR \"$(localstatedir)\"" >> $@-t; \ if test -n "$(RUSH_DEFAULT_CONFIG)" && \ test -f "$(RUSH_DEFAULT_CONFIG)"; then \ echo "#define RUSH_DEFAULT_CONFIG \\" >> $@-t; \ sed -f $(srcdir)/defconf.sed "$(RUSH_DEFAULT_CONFIG)" >> $@-t; \ fi; \ mv $@-t $@ .opt.h: $(AM_V_GEN)m4 -s $(srcdir)/getopt.m4 $< | sed '1d' > $@ # 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: rush-1.8/src/defconf.sed0000644000175000017500000000075412755375137015252 0ustar00matsmats00000000000000# This file is part of GNU Rush. # Copyright (C) 2009-2016 Sergey Poznyakoff # Distributed under the terms of the GNU General Public License, either # version 3, or (at your option) any later version. See file COPYING # for the text of the license. # Provide leading quote 1i\ "\\ # Provide trailing quote $a\ " # Remove empty lines and comments / *#/d /^ *$/d # Escape quotes and backslashes s/["\]/\\&/g # Add newline and continuation character at the end of each line s/$/\\n\\/ # End rush-1.8/src/limits.c0000644000175000017500000002542112755767374014624 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include #define SET_LIMIT_AS 0x0001 #define SET_LIMIT_CPU 0x0002 #define SET_LIMIT_DATA 0x0004 #define SET_LIMIT_FSIZE 0x0008 #define SET_LIMIT_NPROC 0x0010 #define SET_LIMIT_CORE 0x0020 #define SET_LIMIT_MEMLOCK 0x0040 #define SET_LIMIT_NOFILE 0x0080 #define SET_LIMIT_RSS 0x0100 #define SET_LIMIT_STACK 0x0200 #define SET_LIMIT_LOGINS 0x0400 #define SET_LIMIT_PRIO 0x0800 struct limits_rec { unsigned set; rlim_t limit_as; rlim_t limit_cpu; rlim_t limit_data; rlim_t limit_fsize; rlim_t limit_nproc; rlim_t limit_core; rlim_t limit_memlock; rlim_t limit_nofile; rlim_t limit_rss; rlim_t limit_stack; size_t limit_logins; int limit_prio; }; int do_set_limit(int rlimit, rlim_t limit) { struct rlimit rlim; debug(2, _("Setting limit %d to %lu"), rlimit, (unsigned long) limit); rlim.rlim_cur = limit; rlim.rlim_max = limit; if (setrlimit(rlimit, &rlim)) { logmsg(LOG_NOTICE, _("error setting limit: %s"), strerror(errno)); return 1; } return 0; } static int set_prio(int prio) { debug(2, _("Setting priority to %d"), prio); if (setpriority(PRIO_PROCESS, 0, prio)) { logmsg(LOG_NOTICE, _("error setting priority: %s"), strerror(errno)); return 1; } return 0; } /* Counts the number of user logins and check against the limit */ static int check_logins(const char *name, size_t limit) { size_t count = 0; struct rush_wtmp *wtmp = 0; int status; if (limit == 0) /* maximum 0 logins ? */ { debug(2, _("No logins allowed for `%s'"), name); logmsg(LOG_ERR, _("No logins allowed for `%s'"), name); return 1; } debug(3, _("counting logins for %s"), name); switch (rushdb_open(RUSH_DB, 0)) { case rushdb_result_ok: break; case rushdb_result_eof: debug(3, "%s", _("acct database is empty")); return 0; case rushdb_result_fail: logmsg(LOG_ERR, _("Cannot open database %s: %s"), RUSH_DB, rushdb_error_string); return 0; } while (rush_utmp_read(RUSH_STATUS_MAP_BIT(RUSH_STATUS_INUSE), &status, &wtmp) == 0) { if (strcmp (wtmp->user, name) == 0) { if (++count >= limit) break; } free(wtmp); wtmp = NULL; } free(wtmp); rushdb_close(); debug(3, _("counted %zu/%zu logins for %s"), count, limit, name); /* * This is called after setutmp(), so the number of logins counted * includes the user who is currently trying to log in. */ if (count >= limit) { debug(2, _("Too many logins (max %zu) for %s"), limit, name); logmsg(LOG_ERR, _("Too many logins (max %zu) for %s"), limit, name); return 1; } return 0; } int set_user_limits(const char *name, struct limits_rec *lrec) { int rc = 0; if (!lrec) return 0; debug(2, _("Setting limits for %s"), name); #if defined(RLIMIT_AS) if (lrec->set & SET_LIMIT_AS) rc |= do_set_limit(RLIMIT_AS, lrec->limit_as); #endif #if defined(RLIMIT_CPU) if (lrec->set & SET_LIMIT_CPU) rc |= do_set_limit(RLIMIT_CPU, lrec->limit_cpu); #endif #if defined(RLIMIT_DATA) if (lrec->set & SET_LIMIT_DATA) rc |= do_set_limit(RLIMIT_DATA, lrec->limit_data); #endif #if defined(RLIMIT_FSIZE) if (lrec->set & SET_LIMIT_FSIZE) rc |= do_set_limit(RLIMIT_FSIZE, lrec->limit_fsize); #endif #if defined(RLIMIT_NPROC) if (lrec->set & SET_LIMIT_NPROC) rc |= do_set_limit(RLIMIT_NPROC, lrec->limit_nproc); #endif #if defined(RLIMIT_CORE) if (lrec->set & SET_LIMIT_CORE) rc |= do_set_limit(RLIMIT_CORE, lrec->limit_core); #endif #if defined(RLIMIT_MEMLOCK) if (lrec->set & SET_LIMIT_MEMLOCK) rc |= do_set_limit(RLIMIT_MEMLOCK, lrec->limit_memlock); #endif #if defined(RLIMIT_NOFILE) if (lrec->set & SET_LIMIT_NOFILE) rc |= do_set_limit(RLIMIT_NOFILE, lrec->limit_nofile); #endif #if defined(RLIMIT_RSS) if (lrec->set & SET_LIMIT_RSS) rc |= do_set_limit(RLIMIT_RSS, lrec->limit_rss); #endif #if defined(RLIMIT_STACK) if (lrec->set & SET_LIMIT_STACK) rc |= do_set_limit(RLIMIT_STACK, lrec->limit_stack); #endif if (lrec->set & SET_LIMIT_LOGINS) rc |= check_logins(name, lrec->limit_logins); if (lrec->set & SET_LIMIT_PRIO) rc |= set_prio(lrec->limit_prio); return rc; } int getlimit(char **ptr, rlim_t *rlim, int mul) { unsigned long val; val = strtoul(*ptr, ptr, 10); if (val == 0) return 1; *rlim = val * mul; return 0; } /* Parse limits string and fill appropriate fields in lrec. The string consists of _commands_, optionally separated by any amount of whitespace. A command has the following form: [AaCcDdFfMmNnRrSsTtUuLlPp][0-9]+ i.e. a letter followed by number, and is interpreted as follows: Command ulimit setrlimit() The limit it sets option arg ------------------------------------------------------------- [Aa] a RLIMIT_AS max address space (KB) [Cc] c RLIMIT_CORE max core file size (KB) [Dd] d RLIMIT_DATA max data size (KB) [Ff] f RLIMIT_FSIZE Maximum filesize (KB) [Mm] m RLIMIT_MEMLOCK max locked-in-memory address space (KB) [Nn] n RLIMIT_NOFILE max number of open files [Rr] r RLIMIT_RSS max resident set size (KB) [Ss] s RLIMIT_STACK max stack size (KB) [Tt] t RLIMIT_CPU max CPU time (MIN) [Uu] u RLIMIT_NPROC max number of processes [Ll] l (none) max number of logins for this user [Pp] p (none) process priority -20..20 (negative = high priority) */ int parse_limits(limits_record_t *plrec, char *str, char **endp) { int c; struct limits_rec *lrec = xmalloc (sizeof (*lrec)); *plrec = lrec; lrec->set = 0; while ((c = *str++)) { if (ISWS(c)) continue; switch (c) { case 'a': case 'A': /* RLIMIT_AS - max address space (KB) */ if (!getlimit(&str, &lrec->limit_as, 1024)) lrec->set |= SET_LIMIT_AS; break; case 't': case 'T': /* RLIMIT_CPU - max CPU time (MIN) */ if (!getlimit(&str, &lrec->limit_cpu, 60)) lrec->set |= SET_LIMIT_CPU; break; case 'd': case 'D': /* RLIMIT_DATA - max data size (KB) */ if (!getlimit(&str, &lrec->limit_data, 1024)) lrec->set |= SET_LIMIT_DATA; break; case 'f': case 'F': /* RLIMIT_FSIZE - Maximum filesize (KB) */ if (!getlimit(&str, &lrec->limit_fsize, 1024)) lrec->set |= SET_LIMIT_FSIZE; break; case 'u': case 'U': /* RLIMIT_NPROC - max number of processes */ if (!getlimit(&str, &lrec->limit_nproc, 1)) lrec->set |= SET_LIMIT_NPROC; break; case 'c': case 'C': /* RLIMIT_CORE - max core file size (KB) */ if (!getlimit(&str, &lrec->limit_core, 1024)) lrec->set |= SET_LIMIT_CORE; break; case 'm': case 'M': /* RLIMIT_MEMLOCK - max locked-in-memory * address space (KB) */ if (!getlimit(&str, &lrec->limit_memlock, 1024)) lrec->set |= SET_LIMIT_MEMLOCK; break; case 'n': case 'N': /* RLIMIT_NOFILE - max number of open files */ if (!getlimit(&str, &lrec->limit_nofile, 1)) lrec->set |= SET_LIMIT_NOFILE; break; case 'r': case 'R': /* RLIMIT_RSS - max resident set size (KB) */ if (!getlimit(&str, &lrec->limit_rss, 1024)) lrec->set |= SET_LIMIT_RSS; break; case 's': case 'S': /* RLIMIT_STACK - max stack size (KB) */ if (!getlimit(&str, &lrec->limit_stack, 1024)) lrec->set |= SET_LIMIT_STACK; break; case 'l': case 'L': lrec->limit_logins = strtoul(str, &str, 10); lrec->set |= SET_LIMIT_LOGINS; break; case 'p': case 'P': lrec->limit_prio = strtol(str, &str, 10); if (lrec->limit_prio > 0) lrec->set |= SET_LIMIT_PRIO; break; default: *endp = str-1; return 1; } } return 0; } rush-1.8/src/rush.c0000644000175000017500000007167612755766225014313 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include extern char **environ; char *rush_config_file = CONFIG_FILE; int lint_option = 0; unsigned sleep_time = 5; unsigned debug_level; int debug_option; char *dump_option; struct rush_rule *rule_head, *rule_tail; struct passwd *rush_pw; #define STDOUT_FILENO 1 #define STDERR_FILENO 2 struct error_msg { char *text; /* Message text */ int custom; /* True, if the message was customized */ }; struct error_msg error_msg[] = { /* usage_error */ { N_("You are not permitted to execute this command.\n" "Contact the systems administrator for further assistance.\n"), }, /* nologin_error */ { N_("You do not have interactive login access to this machine.\n" "Contact the systems administrator for further assistance.\n") }, /* config_error */ { N_("Local configuration error occurred.\n" "Contact the systems administrator for further assistance.\n") }, /* system_error */ { N_("A system error occurred while attempting to execute command.\n" "Contact the systems administrator for further assistance.\n") } }; void set_error_msg(enum error_type type, char *text) { error_msg[type].text = text; error_msg[type].custom = 1; } int string_to_error_index(const char *name) { static const char *error_msg_name[] = { [usage_error] = "usage-error", [nologin_error] = "nologin-error", [config_error] = "config-error", [system_error] = "system-error", NULL }; int i; for (i = 0; error_msg_name[i]; i++) if (strcmp(error_msg_name[i], name) == 0) return i; return -1; } void send_msg(const char *msg, size_t len) { if (write(STDERR_FILENO, msg, len) < 0) write(STDOUT_FILENO, msg, len); } void vlogmsg(int prio, const char *fmt, va_list ap) { if (lint_option) { fprintf(stderr, "%s: ", program_name); switch (prio) { case LOG_DEBUG: fprintf(stderr, _("Debug: ")); break; case LOG_INFO: case LOG_NOTICE: fprintf(stderr, _("Info: ")); break; case LOG_WARNING: fprintf(stderr, _("Warning: ")); break; case LOG_ERR: case LOG_CRIT: case LOG_ALERT: case LOG_EMERG: fprintf(stderr, _("Error: ")); } vfprintf(stderr, fmt, ap); fputs("\n", stderr); } else vsyslog(prio, fmt, ap); } void logmsg(int prio, const char *fmt, ...) { va_list ap; va_start(ap, fmt); vlogmsg(prio, fmt, ap); va_end(ap); } void die(enum error_type type, struct rush_i18n *i18n, const char *fmt, ...) { va_list ap; va_start(ap, fmt); vlogmsg(LOG_ERR, fmt, ap); va_end(ap); if (!lint_option) { const char *msg = error_msg[type].text; if (error_msg[type].custom) { /* If it is a customized version, translate it via user-supplied i18n */ if (i18n) msg = user_gettext(i18n->locale, i18n->text_domain, i18n->localedir, msg); } else msg = gettext(msg); send_msg(msg, strlen(msg)); sleep(sleep_time); } exit(1); } void xalloc_die() { die(system_error, NULL, _("Not enough memory")); } int is_prefix(const char *pref, const char *str) { int len = strlen(pref); int slen = strlen(str); if (slen < len) return 0; if (memcmp(str, pref, len)) return 0; if (str[len] != '/') return 0; return 1; } int is_suffix(const char *suf, const char *str) { int len = strlen(suf); int slen = strlen(str); if (slen < len) return 0; if (memcmp(str + slen - len, suf, len)) return 0; if (slen > len && str[slen - len - 1] != '/') return 0; return 1; } int test_request_cmdline(struct test_node *node, struct rush_request *req) { return regexec(&node->v.regex, req->cmdline, 0, NULL, 0); } #define ARG_NO(n,argc) (((n) < 0) ? (argc) + (n) : (n)) int test_request_arg(struct test_node *node, struct rush_request *req) { int n = ARG_NO(node->v.arg.arg_no, req->argc); if (n < 0 || n >= req->argc) return 1; return regexec(&node->v.arg.regex, req->argv[n], 0, NULL, 0); } int test_num_p(struct test_numeric_node *node, unsigned long val) { switch (node->op) { case cmp_eq: return val == node->val; case cmp_ne: return val != node->val; case cmp_lt: return val < node->val; case cmp_le: return val <= node->val; case cmp_gt: return val > node->val; case cmp_ge: return val >= node->val; } return 0; } int test_request_argc(struct test_node *node, struct rush_request *req) { return !test_num_p(&node->v.num, req->argc); } int test_request_uid(struct test_node *node, struct rush_request *req) { return !test_num_p(&node->v.num, req->pw->pw_uid); } int test_request_gid(struct test_node *node, struct rush_request *req) { return !test_num_p(&node->v.num, req->pw->pw_gid); } int groupcmp(char *gname, struct passwd *pw) { struct group *grp; grp = getgrnam(gname); if (grp) { char **p; if (pw->pw_gid == grp->gr_gid) return 0; for (p = grp->gr_mem; *p; p++) { if (strcmp(*p, pw->pw_name) == 0) return 0; } } return 1; } int test_request_group(struct test_node *node, struct rush_request *req) { char **p; for (p = node->v.strv; *p; p++) if (groupcmp(*p, req->pw) == 0) return 0; return 1; } int test_request_user(struct test_node *node, struct rush_request *req) { char **p; for (p = node->v.strv; *p; p++) if (strcmp(*p, req->pw->pw_name) == 0) return 0; return 1; } int (*test_request[])(struct test_node *, struct rush_request *) = { [test_cmdline] = test_request_cmdline, [test_arg] = test_request_arg, [test_argc] = test_request_argc, [test_uid] = test_request_uid, [test_gid] = test_request_gid, [test_user] = test_request_user, [test_group] = test_request_group, }; int run_tests(struct rush_rule *rule, struct rush_request *req) { struct test_node *node; for (node = rule->test_head; node; node = node->next) { int res; if (node->type >= sizeof(test_request)/sizeof(test_request[0])) die(system_error, &req->i18n, _("%s:%d: INTERNAL ERROR: node type out of range"), __FILE__, __LINE__); res = test_request[node->type](node, req); if (node->negate) res = !res; if (res) return 1; } return 0; } char * make_file_name(const char *dir, const char *name) { size_t dlen = strlen(dir); size_t len = dlen + strlen(name) + 1; char *res = xmalloc(len + 1); strcpy(res, dir); if (dlen > 0 && res[dlen-1] != '/') res[dlen++] = '/'; strcpy(res + dlen, name); return res; } char * expand_tilde(const char *dir, const char *home) { char *res; if (dir[0] == '~') { if (dir[1] == '/') { size_t hlen = strlen(home); size_t len = hlen + strlen(dir + 1); res = xmalloc(len + 1); strcpy(res, home); if (hlen > 0 && res[hlen-1] != '/') res[hlen++] = '/'; strcpy(res + hlen, dir + 2); } else res = xstrdup(home); } else res = xstrdup(dir); return res; } /* Find variable NAME in environment ENV. On success, store the index of the ENV slot in *IDX, the offset of the value (position right past '=') in *VALOFF, and return 0 (IDX and/or VALOFF can be NULL, if that info is not needed). Return -1 if NAME was not found. */ static int find_env_pos(char **env, char *name, int *idx, int *valoff) { int nlen = strcspn(name, "+="); int i; for (i = 0; env[i]; i++) { size_t elen = strcspn(env[i], "="); if (elen == nlen && memcmp(name, env[i], nlen) == 0) { if (idx) *idx = i; if (valoff) *valoff = elen + 1; return 0; } } return -1; } /* Find variable NAME in environment ENV. On success, return pointer to the variable assignment (if VAL is 0), or to the value (if VAL is 1). Return NULL if NAME is not present in ENV. */ static char * find_env_ptr(char **env, char *name, int val) { int i, j; if (find_env_pos(env, name, &i, &j)) return NULL; return val ? env[i] + j : env[i]; } /* Return 1 if ENV contains a matching unset statement for variable NAME. */ static int var_is_unset(char **env, const char *name) { volatile int i; int nlen = strcspn(name, "="); for (i = 0; env[i]; i++) { if (env[i][0] == '-') { size_t elen = strcspn(env[i] + 1, "="); if (elen == nlen && memcmp(name, env[i] + 1, nlen) == 0) { if (env[i][nlen + 1]) return strcmp(name + nlen, env[i] + 1 + nlen) == 0; else return 1; } } } return 0; } static char * env_concat(char *name, size_t namelen, char *a, char *b) { char *res; size_t len; if (a && b) { res = xmalloc(namelen + 1 + strlen(a) + strlen(b) + 1); strcpy(res + namelen + 1, a); strcat(res + namelen + 1, b); } else if (a) { len = strlen(a); if (c_ispunct(a[len-1])) len--; res = xmalloc(namelen + 1 + len + 1); memcpy(res + namelen + 1, a, len); res[namelen + 1 + len] = 0; } else /* if (a == NULL) */ { if (c_ispunct(b[0])) b++; len = strlen(b); res = xmalloc(namelen + 1 + len + 1); strcpy(res + namelen + 1, b); } memcpy(res, name, namelen); res[namelen] = '='; return res; } static char ** env_setup(char **env) { char **old_env = environ; char **new_env; int count, i, j, n; if (!env) return old_env; if (strcmp(env[0], "-") == 0) { old_env = NULL; env++; } /* Count new environment size */ count = 0; if (old_env) for (i = 0; old_env[i]; i++) count++; for (i = 0; env[i]; i++) count++; /* Allocate the new environment. */ new_env = xcalloc(count + 1, sizeof new_env[0]); /* Populate the environment. */ n = 0; if (old_env) for (i = 0; old_env[i]; i++) { if (!var_is_unset(env, old_env[i])) new_env[n++] = old_env[i]; } for (i = 0; env[i]; i++) { char *p; if (env[i][0] == '-') /* Skip unset directives. */ continue; /* Find the slot for the variable. Use next available slot if there's no such variable in new_env */ if (find_env_pos(new_env, env[i], &j, NULL)) j = n; if ((p = strchr(env[i], '='))) { if (p == env[i]) continue; /* Ignore erroneous entry */ if (p[-1] == '+') { new_env[j] = env_concat(env[i], p - env[i] - 1, find_env_ptr(environ, env[i], 1), p + 1); } else if (p[1] == '+') { new_env[j] = env_concat(env[i], p - env[i], p + 2, find_env_ptr(environ, env[i], 1)); } else new_env[j] = env[i]; } else if ((p = find_env_ptr(environ, env[i], 0))) new_env[j] = p; else continue; /* Adjust environment size */ if (j == n) ++n; } new_env[n] = NULL; return new_env; } void reparse_cmdline(struct rush_request *req) { struct wordsplit ws; argcv_free(req->argc, req->argv); if (wordsplit(req->cmdline, &ws, WRDSF_DEFFLAGS)) die(system_error, &req->i18n, _("wordsplit(%s) failed: %s"), req->cmdline, wordsplit_strerror(&ws)); wordsplit_getwords(&ws, &req->argc, &req->argv); wordsplit_free(&ws); free(req->prog); req->prog = NULL; } void rebuild_cmdline(struct rush_request *req) { free(req->cmdline); req->cmdline = argcv_string(req->argc, req->argv); } static int get_arg_no(int index, struct rush_request *req) { int arg_no = ARG_NO(index, req->argc); if (arg_no < 0 || arg_no >= req->argc) die(config_error, &req->i18n, _("no argument at index %d in command: %s"), index, req->cmdline); return arg_no; } static void assign_string(char **pstr, char *val) { debug(2, _("Transform: \"%s\" -> \"%s\""), *pstr ? *pstr : "", val); free(*pstr); *pstr = val; } static int transform_cmdline_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { char *p; debug(2, "%s", _("Transforming command line")); if (node->pattern) { char *val = rush_expand_string(node->pattern, req); p = transform_string(node->v.trans, val); free(val); } else p = transform_string(node->v.trans, req->cmdline); assign_string(&req->cmdline, p); debug(2, _("Command line: %s"), req->cmdline); return 0; } int transform_setcmd_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { debug(2, "%s", _("Setting command line")); assign_string(&req->cmdline, xstrdup(val)); debug(2, _("Command line: %s"), req->cmdline); return 0; } int transform_arg_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { char *p = transform_string(node->v.trans, val); assign_string(return_val, p); return 1; } int transform_map_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { char *p; debug(2, _("Transformation map: %s, %s, %s, %u, %u, %s"), node->v.map.file, node->v.map.delim, node->v.map.key, node->v.map.key_field, node->v.map.val_field, node->v.map.defval); p = map_string(&node->v.map, req); if (p) { assign_string(return_val, p); return 1; } return 0; } int transform_delarg_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { int i, arg_no, arg_end; arg_no = get_arg_no(node->arg_no, req); arg_end = get_arg_no(node->v.arg_end, req); if (arg_end < arg_no) { int x = arg_end; arg_end = arg_no; arg_no = x; } debug(2, _("Deleting arguments %d-%d"), arg_no, arg_end); if (arg_no == 0 || arg_end == 0) die(config_error, &req->i18n, _("Deleting argv[0] is prohibited")); for (i = arg_no; i <= arg_end; i++) free(req->argv[i]); i = arg_end - arg_no + 1; memmove(req->argv + arg_no, req->argv + arg_end + 1, (req->argc - i) * sizeof(req->argv[0])); req->argc -= i; return 1; } int transform_setarg_fun(struct rush_request *req, struct transform_node *node, char *val, char **return_val) { assign_string(return_val, xstrdup(val)); return 1; } /* Transform flags */ #define XFORM_DFL 0x00 /* Default: nothing */ #define XFORM_CMDLINE 0x01 /* Function operates on entire command line */ #define XFORM_VALUE 0x02 /* Function needs value */ #define XFORM_CHARGV 0x04 /* Function can change argv */ struct transform_function { int flags; int (*func)(struct rush_request *req, struct transform_node *node, char *val, char **return_val); }; static struct transform_function transform_funtab[] = { [transform_cmdline] = { XFORM_CMDLINE, transform_cmdline_fun }, [transform_setcmd] = { XFORM_CMDLINE|XFORM_VALUE, transform_setcmd_fun }, [transform_arg] = { XFORM_VALUE, transform_arg_fun }, [transform_map] = { XFORM_VALUE, transform_map_fun }, [transform_delarg] = { XFORM_CHARGV, transform_delarg_fun }, [transform_setarg] = { XFORM_VALUE, transform_setarg_fun } }; static int transform_count = sizeof(transform_funtab)/sizeof(transform_funtab[0]); void run_transforms(struct rush_rule *rule, struct rush_request *req) { struct transform_node *node; char *val, **target; char *mem = NULL; int args_transformed = 0; int res; int flags; for (node = rule->transform_head; node; node = node->next) { if (node->type < 0 || node->type >= transform_count) die(system_error, &req->i18n, _("%s:%d: internal error"), __FILE__, __LINE__); val = NULL; target = NULL; flags = transform_funtab[node->type].flags; if ((flags & XFORM_CMDLINE) && args_transformed) { rebuild_cmdline(req); args_transformed = 0; } if (flags & XFORM_VALUE) { if (node->progmod) { target = &req->prog; val = PROGFILE(req); debug(2, _("Modifying program name (%s)"), val); flags &= ~XFORM_CHARGV; } else { int arg_no = get_arg_no(node->arg_no, req); target = &req->argv[arg_no]; val = *target; flags |= XFORM_CHARGV; debug(2, _("Modifying argv[%d]"), arg_no); } if (node->pattern) { mem = rush_expand_string(node->pattern, req); val = mem; } else { mem = NULL; } } res = transform_funtab[node->type].func(req, node, val, target); if (flags & XFORM_CHARGV) args_transformed = res; if (flags & XFORM_CMDLINE) reparse_cmdline(req); if (mem) { free(mem); mem = NULL; } } if (args_transformed) rebuild_cmdline(req); if (__debug_p(2)) { int i; logmsg(LOG_DEBUG, _("Program name: %s"), PROGFILE(req)); logmsg(LOG_DEBUG, _("Final arguments:")); for (i = 0; i < req->argc; i++) logmsg(LOG_DEBUG, "% 4d: %s", i, req->argv[i]); } } void acct_on(struct rush_rule *rule, struct rush_request *req, pid_t pid) { struct rush_wtmp wtmp; wtmp.pid = pid; wtmp.user = req->pw->pw_name; wtmp.rule = rule->tag; wtmp.command = req->cmdline; if (rushdb_start(&wtmp)) die(system_error, &req->i18n, _("error writing to database %s: %s"), RUSH_DB, strerror(errno)); } void acct_off(void) { if (rushdb_stop()) logmsg(LOG_ERR, _("error writing stop to database file %s: %s"), RUSH_DB, strerror(errno)); rushdb_close(); } void fork_process(struct rush_rule *rule, struct rush_request *req) { int status; pid_t pid; signal(SIGCHLD, SIG_DFL); pid = fork(); if (pid == 0) { return; } if (pid == -1) die(system_error, &req->i18n, _("%s:%d: %s: cannot fork: %s"), rule->file, rule->line, rule->tag, strerror(errno)); close(0); close(1); close(2); if (req->acct == rush_true) acct_on(rule, req, pid); debug(2, _("Forked process %lu"), (unsigned long) pid); waitpid(pid, &status, 0); if (WIFEXITED(status)) { status = WEXITSTATUS(status); debug(2, _("%s: subprocess exited with code %d"), rule->tag, status); } else if (WIFSIGNALED(status)) { logmsg(LOG_NOTICE, _("%s: subprocess terminated on signal %d"), rule->tag, WTERMSIG(status)); } else logmsg(LOG_NOTICE, _("%s: subprocess terminated"), rule->tag); if (req->acct == rush_true) acct_off(); if (req->post_sockaddr) post_socket_send(req->post_sockaddr, rule, req); exit(0); } static int membergid(gid_t gid, size_t gc, gid_t *gv) { int i; for (i = 0; i < gc; i++) if (gv[i] == gid) return 1; return 0; } static void get_user_groups(struct rush_request *req, size_t *pgidc, gid_t **pgidv) { size_t gidc = 0, n = 0; gid_t *gidv = NULL; struct group *gr; n = 32; gidv = xcalloc(n, sizeof(gidv[0])); gidv[0] = req->gid == NO_GID ? req->pw->pw_gid : req->gid; gidc = 1; setgrent(); while ((gr = getgrent())) { char **p; for (p = gr->gr_mem; *p; p++) if (strcmp(*p, req->pw->pw_name) == 0) { if (n == gidc) { n += 32; gidv = xrealloc(gidv, n * sizeof(gidv[0])); } if (!membergid(gr->gr_gid, gidc, gidv)) gidv[gidc++] = gr->gr_gid; } } endgrent(); *pgidc = gidc; *pgidv = gidv; } static void setowner(struct rush_request *req) { size_t gidc; gid_t *gidv; get_user_groups(req, &gidc, &gidv); if (setgroups(gidc, gidv) < 0) die(system_error, &req->i18n, "setgroups: %s", strerror(errno)); if (setgid(gidv[0])) die(system_error, &req->i18n, _("cannot enforce gid %lu: %s"), (unsigned long) gidv[0], strerror(errno)); free(gidv); if (setuid(req->pw->pw_uid)) die(system_error, &req->i18n, _("cannot enforce uid %lu: %s"), (unsigned long) req->pw->pw_uid, strerror(errno)); if (req->pw->pw_uid && setuid(0) == 0) die(system_error, &req->i18n, _("seteuid(0) succeeded when it should not")); } void run_rule(struct rush_rule *rule, struct rush_request *req) { char **new_env; debug(2, _("Rule %s at %s:%d matched"), rule->tag, rule->file, rule->line); new_env = env_setup(rule->env); if (__debug_p(2)) { int i; logmsg(LOG_DEBUG, _("Final environment:")); for (i = 0; new_env[i]; i++) logmsg(LOG_DEBUG, "% 4d: %s", i, new_env[i]); } environ = new_env; if (rule->i18n.text_domain) req->i18n.text_domain = rule->i18n.text_domain; if (rule->i18n.localedir) req->i18n.localedir = rule->i18n.localedir; if (rule->i18n.locale) req->i18n.locale = rule->i18n.locale; if (rule->error_msg) { const char *msg = rule->error_msg; int custom = 1; debug(2, _("Error message: %s"), msg); if (msg[0] == '@') { int n; if (msg[1] == '@') msg++; else if ((n = string_to_error_index(msg + 1)) == -1) logmsg(LOG_NOTICE, _("Unknown message reference: %s\n"), msg); else { msg = error_msg[n].text; custom = error_msg[n].custom; } } if (custom) msg = user_gettext(rule->i18n.locale, rule->i18n.text_domain, rule->i18n.localedir, msg); else msg = gettext(msg); if (write(rule->error_fd, msg, strlen(msg)) < 0) die(system_error, &req->i18n, _("Error sending diagnostic message to descriptor %d: %s"), rule->error_fd, strerror(errno)); exit(1); } if (set_user_limits (req->pw->pw_name, rule->limits)) die(usage_error, &req->i18n, _("cannot set limits for %s"), req->pw->pw_name); run_transforms(rule, req); if (rule->chroot_dir) { char *dir = expand_tilde(rule->chroot_dir, req->pw->pw_dir); debug(2, _("Chroot dir: %s"), dir); free(req->chroot_dir); req->chroot_dir = dir; } if (rule->gid != NO_GID) { req->gid = rule->gid; debug(2, _("GID: %lu"), (unsigned long) req->gid); } if (rule->post_sockaddr.len) req->post_sockaddr = &rule->post_sockaddr; if (rule->acct != rush_undefined) req->acct = rule->acct; if (req->acct == rush_true) req->fork = rush_true; else if (rule->post_sockaddr.len) req->fork = rush_true; else if (rule->fork != rush_undefined) req->fork = rule->fork; if (rule->mask != NO_UMASK) req->umask = rule->mask; if (rule->fall_through) return; if (req->acct == rush_true && rushdb_open(RUSH_DB, 1) != rushdb_result_ok) die(system_error, &req->i18n, _("cannot open database %s: %s"), RUSH_DB, rushdb_error_string); if (req->chroot_dir) { uid_t uid; struct passwd *pw; if (chroot(req->chroot_dir)) die(system_error, &req->i18n, _("cannot chroot to %s: %s"), req->chroot_dir, strerror(errno)); uid = req->pw->pw_uid; pw = getpwuid(uid); if (!pw) die(req->interactive ? nologin_error : usage_error, NULL, _("invalid uid %lu"), (unsigned long) uid); req->pw = pw; } if (rule->home_dir) { free(req->home_dir); req->home_dir = expand_tilde(rule->home_dir, req->pw->pw_dir); debug(2, _("Home dir: %s"), req->home_dir); if (chdir(req->home_dir)) die(system_error, &req->i18n, _("cannot change to dir %s: %s"), req->home_dir, strerror(errno)); } debug(2, _("Executing %s, %s"), PROGFILE(req), req->cmdline); if (lint_option) { if (dump_option) dump_request(req, stdout); exit(0); } if (req->fork == rush_true) fork_process(rule, req); setowner (req); umask(req->umask); execve(PROGFILE(req), req->argv, new_env); die(system_error, &req->i18n, _("%s:%d: %s: cannot execute %s: %s"), rule->file, rule->line, rule->tag, req->cmdline, strerror(errno)); } static char *command = NULL; static char *test_user_name = NULL; static int interactive; #include "rushopt.h" int main(int argc, char **argv) { uid_t uid; struct rush_rule *rule; struct rush_request req; struct wordsplit ws; rush_set_program_name(argv[0]); rush_i18n_init(); umask(~(mode_t)0); openlog(program_name, LOG_NDELAY|LOG_PID, LOG_AUTHPRIV); get_options(argc, argv); if (argc == optind + 1) { if (lint_option) rush_config_file = argv[optind]; else die(usage_error, NULL, _("invalid command line")); } else if (argc > optind) die(usage_error, NULL, _("invalid command line")); /* Relinquish root privileges in test mode */ if (lint_option) setuid(getuid()); if (test_user_name) { struct passwd *pw = getpwnam(test_user_name); if (!pw) die(usage_error, NULL, _("invalid user name")); setreuid(pw->pw_uid, 0); } uid = getuid(); if ((rush_pw = getpwuid(uid)) == NULL) die(system_error, NULL, _("invalid uid %lu"), (unsigned long) uid); debug(2, _("user %s, uid %lu"), rush_pw->pw_name, (unsigned long) rush_pw->pw_uid); parse_config(); if (!command) { if (lint_option && !interactive) exit(0); } if (__debug_p(2)) { int i; logmsg(LOG_DEBUG, _("Command line:")); for (i = 0; i < argc; i++) logmsg(LOG_DEBUG, "% 4d: %s", i, argv[i]); logmsg(LOG_DEBUG, _("Environment:")); for (i = 0; environ[i]; i++) logmsg(LOG_DEBUG, "% 4d %s", i, environ[i]); } memset(&req, 0, sizeof(req)); if (!command) { req.interactive = 1; command = "/bin/sh"; } req.cmdline = xstrdup(command); if (wordsplit(req.cmdline, &ws, WRDSF_DEFFLAGS)) die(system_error, NULL, _("wordsplit(%s) failed: %s"), req.cmdline, wordsplit_strerror(&ws)); wordsplit_getwords(&ws, &req.argc, &req.argv); wordsplit_free(&ws); req.pw = rush_pw; req.umask = 022; req.chroot_dir = NULL; req.home_dir = NULL; req.gid = NO_GID; req.fork = rush_undefined; req.acct = rush_undefined; for (rule = rule_head; rule; rule = rule->next) { if (req.interactive != rule->interactive) continue; if (run_tests(rule, &req)) continue; if (!rule) break; if (debug_level) { if (req.interactive) logmsg(LOG_NOTICE, _("Serving interactive shell request for %s by rule %s"), req.pw->pw_name, rule->tag); else logmsg(LOG_NOTICE, _("Serving request \"%s\" for %s by rule %s"), command, req.pw->pw_name, rule->tag); } run_rule(rule, &req); } die(req.interactive ? nologin_error : usage_error, &req.i18n, _("no matching rule for \"%s\", user %s"), req.cmdline, req.pw->pw_name); return 0; } rush-1.8/src/rush.h0000644000175000017500000001576412755767264014320 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef SYSCONFDIR # define SYSCONFDIR "/usr/local/etc" #endif #define CONFIG_FILE SYSCONFDIR "/rush.rc" #ifndef CANONICAL_PROGRAM_NAME # define CANONICAL_PROGRAM_NAME "/usr/local/sbin/rush" #endif #define RUSH_DB LOCALSTATEDIR "/rush" #if defined HAVE_SYSCONF && defined _SC_OPEN_MAX # define getmaxfd() sysconf(_SC_OPEN_MAX) #elif defined (HAVE_GETDTABLESIZE) # define getmaxfd() getdtablesize() #else # define getmaxfd() 256 #endif #ifndef LOG_AUTHPRIV # define LOG_AUTHPRIV LOG_AUTH #endif #define ISWS(c) ((c) == ' ' || (c) == '\t') enum error_type { usage_error, nologin_error, config_error, system_error }; typedef struct limits_rec *limits_record_t; typedef struct transform *transform_t; struct rush_map { char *file; char *delim; char *key; unsigned key_field; unsigned val_field; char *defval; }; enum transform_node_type { transform_cmdline, transform_arg, transform_map, transform_delarg, transform_setcmd, transform_setarg }; struct transform_node { struct transform_node *next; enum transform_node_type type; int arg_no; int progmod; char *pattern; union { transform_t trans; struct rush_map map; int arg_end; } v; }; /* Comparison operator */ enum cmp_op { cmp_eq, cmp_ne, cmp_lt, cmp_le, cmp_gt, cmp_ge }; enum test_type { test_cmdline, test_arg, test_argc, test_uid, test_gid, test_user, test_group, }; struct test_numeric_node { enum cmp_op op; unsigned long val; /* FIXME: Should be uintmax_t? */ }; struct test_arg_node { int arg_no; regex_t regex; }; struct test_node { struct test_node *next; enum test_type type; int negate; union { regex_t regex; struct test_arg_node arg; struct test_numeric_node num; char **strv; } v; }; struct rush_sockaddr { socklen_t len; struct sockaddr *sa; }; enum rush_three_state { rush_undefined = -1, rush_false, rush_true }; struct rush_i18n { char *text_domain; /* Gettext domain, if any */ char *localedir; /* Locale directory, if any */ char *locale; }; struct rush_rule { struct rush_rule *next; /* Next config in the list */ char *tag; int fall_through; int interactive; /* Source location */ const char *file; /* Configuration file name */ int line; /* and line number. */ /* Match parameters */ struct test_node *test_head, *test_tail; /* Transformation parameters: */ struct transform_node *transform_head, *transform_tail; /* Environment modification: */ char **env; /* If not NULL, print this message on ERROR_FD and exit */ char *error_msg; int error_fd; struct rush_i18n i18n; mode_t mask; /* umask */ char *chroot_dir; /* chroot directory */ char *home_dir; /* home directory */ gid_t gid; /* primary group ID */ limits_record_t limits; /* resource limits */ enum rush_three_state fork; /* Fork a subprocess */ enum rush_three_state acct; /* Run accounting */ struct rush_sockaddr post_sockaddr; }; struct rush_request { char *cmdline; /* Command line */ size_t argc; /* Number of elements in argv */ char **argv; /* Command line in parsed form */ int interactive; /* Request for interactive shell */ char *prog; /* Program file name, if different from argv[0] */ struct passwd *pw; /* User passwd entry */ unsigned umask; char *chroot_dir; char *home_dir; gid_t gid; enum rush_three_state fork; enum rush_three_state acct; const struct rush_sockaddr *post_sockaddr; struct rush_i18n i18n; }; #define PROGFILE(req) ((req)->prog ? (req)->prog : (req)->argv[0]) #define NO_UMASK ((mode_t)-1) #define NO_GID ((gid_t)-1) extern char *rush_config_file; extern int lint_option; extern unsigned sleep_time; extern struct rush_rule *rule_head, *rule_tail; extern unsigned debug_level; extern char *dump_option; extern int debug_option; extern struct passwd *rush_pw; #define __debug_p(x) ((x) <= debug_level) #define debug(lev,fmt,...) \ do { \ if (__debug_p(lev)) \ logmsg(LOG_DEBUG, fmt, __VA_ARGS__); \ } while(0) void die(enum error_type type, struct rush_i18n *i18n, const char *fmt, ...) RUSH_NORETURN RUSH_PRINTFLIKE(3,4); void logmsg(int prio, const char *fmt, ...) RUSH_PRINTFLIKE(2,3); int parse_limits(limits_record_t *plrec, char *str, char **endp); int set_user_limits(const char *name, struct limits_rec *lrec); void parse_config(void); void set_error_msg(enum error_type type, char *text); int string_to_error_index(const char *name); transform_t compile_transform_expr (const char *expr, int cflags); char *transform_string (struct transform *tf, const char *input); int post_socket_send(const struct rush_sockaddr *sockaddr, const struct rush_rule *rule, const struct rush_request *req); char *make_file_name(const char *dir, const char *name); char *expand_tilde(const char *dir, const char *home); /* cfck.c */ #define RUSH_CHK_OWNER 0x0001 #define RUSH_CHK_IWGRP 0x0002 #define RUSH_CHK_IWOTH 0x0004 #define RUSH_CHK_LINK 0x0008 #define RUSH_CHK_DIR_IWGRP 0x0010 #define RUSH_CHK_DIR_IWOTH 0x0020 #define RUSH_CHK_ALL \ (RUSH_CHK_OWNER|RUSH_CHK_IWGRP|RUSH_CHK_IWOTH|\ RUSH_CHK_LINK|RUSH_CHK_DIR_IWGRP|RUSH_CHK_DIR_IWOTH) #ifndef RUSH_CHK_DEFAULT # define RUSH_CHK_DEFAULT RUSH_CHK_ALL #endif int check_config_permissions(const char *filename, struct stat *st); int cfck_keyword(const char *name); /* map.c */ char *map_string(struct rush_map *map, struct rush_request *req); char *rush_expand_string(const char *string, struct rush_request *req); /* dump.c */ void dump_request(struct rush_request *req, FILE *fp); rush-1.8/src/rushlast.c0000644000175000017500000000546612755375137015167 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include #include "error.h" char *base_name = RUSH_DB; int display_header = 1; /* Display header line */ int forward = 0; char *format; unsigned long count = 0; #include void xalloc_die() { error(1, 0, _("not enough memory")); abort(); } char *default_format = "(user 10 Login) " "(rule 8 Rule) " "(start-time 0 Start) " "(stop-time 0 Stop) " "(duration 7 Time) " "(command 32 Command)"; int want_record(struct rush_wtmp *wtmp, int argc, char **argv) { int i; if (argc == 0) return 1; for (i = 0; i < argc; i++) if (strcmp(argv[i], wtmp->user) == 0) return 1; return 0; } int main(int argc, char **argv) { struct rush_wtmp *wtmp = NULL; rushdb_format_t form; unsigned long i; rush_set_program_name(argv[0]); rush_i18n_init(); format = getenv("RUSHLAST_FORMAT"); if (!format) format = default_format; get_options(argc, argv); argc -= optind; argv += optind; if (format[0] == '@') format = rush_read_format(format + 1); form = rushdb_compile_format(format); if (!form) error(1, 0, _("invalid format: %s"), rushdb_error_string); switch (rushdb_open(base_name, 0)) { case rushdb_result_ok: break; case rushdb_result_eof: exit(0); case rushdb_result_fail: error(1, errno, _("cannot open database file %s"), base_name); } if (display_header) rushdb_print_header(form); if (!forward) rushdb_backward_direction(); i = 0; while (rush_wtmp_read(&wtmp) == 0) { if (want_record(wtmp, argc, argv)) { rushdb_print(form, wtmp, 1); if (count && ++i == count) break; } free(wtmp); } rushdb_close(); exit(0); } rush-1.8/src/map.c0000644000175000017500000001357012755764036014072 0ustar00matsmats00000000000000/* This file is part of GNU Rush. Copyright (C) 2008-2016 Sergey Poznyakoff GNU Rush is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Rush 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 GNU Rush. If not, see . */ #include #define obstack_chunk_alloc malloc #define obstack_chunk_free free #include struct metadef { char *kw; char *value; const char *(*expand)(struct metadef *, struct rush_request *); int static_p; void *storage; }; static const char * meta_expand(struct metadef *def, struct rush_request *req) { if (!def->value) { if (def->expand) return def->expand(def, req); def->value = "INTERNAL ERROR: NONEXPANDABLE DATA"; def->static_p = 1; } return def->value; } static const char * find_expansion_char(int c, struct metadef *def, struct rush_request *req) { for (; def->kw; def++) if (def->kw[1] == 0 && def->kw[0] == c) return meta_expand(def, req); return NULL; } static const char * find_expansion_word(const char *kw, size_t len, struct metadef *def, struct rush_request *req) { for (; def->kw; def++) if (strlen(def->kw) == len && memcmp(def->kw, kw, len) == 0) return meta_expand(def, req); return NULL; } char * meta_expand_string(const char *string, struct metadef *def, struct rush_request *req) { const char *p, *s; char *res; struct obstack stk; if (!string) return NULL; obstack_init(&stk); for (p = string; *p; ) { char *e; size_t len = strcspn(p, "$"); obstack_grow(&stk, p, len); p += len; if (*p == '$') { switch (*++p) { case '$': obstack_grow(&stk, p, 1); p++; break; case '{': e = strchr(p + 1, '}'); if (e && (s = find_expansion_word(p + 1, e - p - 1, def, req))) { obstack_grow(&stk, s, strlen(s)); p = e + 1; } else { char *q; unsigned n = strtoul(p + 1, &q, 10); if (q == e && n < req->argc) { s = req->argv[n]; len = strlen(req->argv[n]); p = e + 1; } else { s = p - 1; len = 1; p++; } obstack_grow(&stk, s, len); } break; default: s = p - 1; len = 1; if (c_isdigit(*p)) { unsigned n = *p - '0'; if (n < req->argc) { s = req->argv[n]; len = strlen(req->argv[n]); } } else if ((s = find_expansion_char(*p, def, req)) != NULL) len = strlen(s); obstack_grow(&stk, s, len); p++; } } else obstack_grow(&stk, p, 1); } obstack_1grow(&stk, 0); res = xstrdup(obstack_finish(&stk)); obstack_free(&stk, NULL); return res; } const char * meta_uid(struct metadef *def, struct rush_request *req) { char buf[INT_BUFSIZE_BOUND(uintmax_t)]; return def->storage = xstrdup(umaxtostr(req->pw->pw_uid, buf)); } const char * meta_user(struct metadef *def, struct rush_request *req) { return req->pw->pw_name; } const char * meta_gid(struct metadef *def, struct rush_request *req) { char buf[INT_BUFSIZE_BOUND(uintmax_t)]; return def->storage = xstrdup(umaxtostr(req->pw->pw_gid, buf)); } const char * meta_group(struct metadef *def, struct rush_request *req) { struct group *grp = getgrgid(req->pw->pw_gid); return grp ? grp->gr_name : meta_gid(def, req); } const char * meta_home(struct metadef *def, struct rush_request *req) { return req->pw->pw_dir; } const char * meta_gecos(struct metadef *def, struct rush_request *req) { return req->pw->pw_gecos; } const char * meta_program(struct metadef *def, struct rush_request *req) { return PROGFILE(req); } const char * meta_command(struct metadef *def, struct rush_request *req) { return req->cmdline; } static struct metadef mapdef[] = { { "user", NULL, meta_user }, { "group", NULL, meta_group }, { "uid", NULL, meta_uid }, { "gid", NULL, meta_gid }, { "home", NULL, meta_home }, { "gecos", NULL, meta_gecos }, { "program", NULL, meta_program }, { "^", NULL, meta_program }, { "command", NULL, meta_command }, { NULL } }; char * rush_expand_string(const char *string, struct rush_request *req) { return meta_expand_string(string, mapdef, req); } char * map_string(struct rush_map *map, struct rush_request *req) { char *file; FILE *fp; struct stat st; char *buf = NULL; size_t size = 0; size_t line = 0; char *key; char *ret = NULL; file = expand_tilde(map->file, req->pw->pw_dir); if (stat(file, &st)) { die(system_error, &req->i18n, _("cannot stat file %s: %s"), file, strerror(errno)); } if (check_config_permissions(file, &st)) die(config_error, &req->i18n, _("%s: file is not safe"), file); fp = fopen(file, "r"); if (!fp) die(system_error, &req->i18n, _("%s: cannot open map file"), file); key = meta_expand_string(map->key, mapdef, req); while (getline(&buf, &size, fp) != -1) { size_t len; struct wordsplit ws; line++; len = strlen(buf); while (len > 0 && buf[len-1] == '\n') buf[--len] = 0; ws.ws_delim = map->delim; if (wordsplit(buf, &ws, WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM)) die(system_error, &req->i18n, _("%s:%lu: failed to parse line: %s"), file, (unsigned long)line, wordsplit_strerror(&ws)); if (map->key_field <= ws.ws_wordc && map->val_field <= ws.ws_wordc && strcmp(ws.ws_wordv[map->key_field - 1], key) == 0) ret = xstrdup(ws.ws_wordv[map->val_field - 1]); wordsplit_free(&ws); if (ret) break; } fclose(fp); free(key); free(file); if (!ret && map->defval) ret = xstrdup(map->defval); return ret; } rush-1.8/src/getopt.m40000644000175000017500000003613612755767265014727 0ustar00matsmats00000000000000dnl This file is part of GNU Rush. dnl Copyright (C) 2007-2010, 2013-2014, 2016 Sergey Poznyakoff. dnl dnl GNU Rush is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3, or (at your option) dnl any later version. dnl dnl GNU Rush is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with GNU Rush. If not, see . divert(-1) changequote([<,>]) changecom(/*,*/) dnl upcase(ARGS...) dnl Concatenate and convert ARGS to upper case. dnl define([], [], [], [])>]) dnl concat(ARGS...) dnl Concatenate arguments, inserting ", " between each of pair of them. dnl define([],[],1,[<$1>],[<$1, concat(shift($@))>])>]) dnl flushleft(ARGS...) dnl Concatenate ARGS and remove any leading whitespace dnl define([], [], [<^[ ]+>])>]) dnl chop(ARGS...) dnl Concatenate ARGS and remove any trailing whitespace dnl define([], [], [<[ ]+$>])>]) dnl escape(ARGS...) dnl Concatenate ARGS and escape any occurrences of double-quotes with dnl backslashes. dnl define([], [],[<[\"]>],[<\\\&>])>]) dnl prep(ARG) dnl Prepare ARG for including in C strings: replace newlines with any amount dnl of preceding and following whitespace by a single space character, remove dnl leading whitespace, and escape double-quotes. dnl define([], [],[<[ ]* +[ ]*>],[< >])))>]) dnl SHORT_OPTS dnl Accumulator for the 3rd argument of getopt_long dnl define([],[<>]) dnl GROUP(STRING) dnl Begin a named group of options dnl define([],[])") }, divert(-1)>]) define([<__GATHER_OPTIONS>],[< define([],ifelse([<$2>],,[]upcase(patsubst($1,-,_)),'$2')) ifelse([<$2>],,[< divert(1) KEY, divert(-1) >]) define([],ifdef([],SELECTOR) case KEY:) ifelse([<$1>],,,[< divert(2) { "$1", ARGTYPE, 0, KEY }, divert(-1)>]) dnl define([],SHORT_OPTS[<>]dnl ifelse([<$2>],,,$2[<>]ifelse(ARGTYPE,[],,ARGTYPE,[],:,ARGTYPE,[],::))) dnl ifelse([<$1>],,,dnl [],ifelse(LONG_TAG,,[<--$1>],[]))>]) ifelse([<$2>],,,dnl [],ifelse(SHORT_TAG,,[<-$2>],[]))>]) >]) dnl OPTION(long-opt, short-opt, [arg], [descr]) dnl Introduce a command line option. Arguments: dnl long-opt Long option. dnl short-opt Short option (a single char) dnl (At least one of long-opt or short-opt must be present) dnl dnl Optional arguments: dnl arg Option argument. dnl descr Option description dnl dnl If arg is absent, the option does not take any arguments. If arg is dnl enclosed in square brackets, the option takes an optional argument. dnl Otherwise, the argument is required. dnl dnl If descr is not given the option will not appear in the --help and dnl --usage outputs. dnl define([