diff -urP qstat-2.11/a2s.c qstat-2.11-20080912svn311/a2s.c --- qstat-2.11/a2s.c 2006-05-28 07:48:38.000000000 -0400 +++ qstat-2.11-20080912svn311/a2s.c 2008-09-12 14:52:23.000000000 -0400 @@ -44,12 +44,14 @@ unsigned char type; }; -void send_a2s_request_packet(struct qserver *server) +int send_a2s_request_packet(struct qserver *server) { struct a2s_status* status = (struct a2s_status*)server->master_query_tag; if(qserver_send_initial(server, A2S_INFO, sizeof(A2S_INFO)) == -1) - goto error; + { + return DONE_FORCE; + } status->sent_info = 1; status->type = 0; @@ -57,28 +59,27 @@ if(get_server_rules || get_player_info) server->next_rule = ""; // trigger calling send_a2s_rule_request_packet - return; - -error: - cleanup_qserver(server, 1); + return 0; } -void send_a2s_rule_request_packet(struct qserver *server) +int send_a2s_rule_request_packet(struct qserver *server) { struct a2s_status* status = (struct a2s_status*)server->master_query_tag; if(!get_server_rules && !get_player_info) { - goto error; + return DONE_FORCE; } - do + while( 1 ) { if(!status->have_challenge) { debug(3, "sending challenge"); - if(qserver_send_initial(server, A2S_GETCHALLENGE, sizeof(A2S_GETCHALLENGE)-1) == -1) - goto error; + if( SOCKET_ERROR == qserver_send_initial(server, A2S_GETCHALLENGE, sizeof(A2S_GETCHALLENGE)-1) ) + { + return SOCKET_ERROR; + } status->sent_challenge = 1; break; } @@ -87,8 +88,10 @@ char buf[sizeof(A2S_RULES)-1+4] = A2S_RULES; memcpy(buf+sizeof(A2S_RULES)-1, &status->challenge, 4); debug(3, "sending rule query"); - if(qserver_send_initial(server, buf, sizeof(buf)) == -1) - goto error; + if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) ) + { + return SOCKET_ERROR; + } status->sent_rules = 1; break; } @@ -97,8 +100,10 @@ char buf[sizeof(A2S_PLAYER)-1+4] = A2S_PLAYER; memcpy(buf+sizeof(A2S_PLAYER)-1, &status->challenge, 4); debug(3, "sending player query"); - if(qserver_send_initial(server, buf, sizeof(buf)) == -1) - goto error; + if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) ) + { + return SOCKET_ERROR; + } status->sent_player = 1; break; } @@ -109,15 +114,12 @@ status->have_challenge = 0; status->have_rules = 0; } - } while(1); - - return; + } -error: - cleanup_qserver(server, 1); + return INPROGRESS; } -void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen) +int deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen) { struct a2s_status* status = (struct a2s_status*)server->master_query_tag; char* pkt = rawpkt; @@ -159,12 +161,12 @@ // packetId if ( 1 == status->type ) { - // HL2 format + // HL1 format // The lower four bits represent the number of packets (2 to 15) and // the upper four bits represent the current packet starting with 0 pkt_max = ((unsigned char)*pkt) & 15; pkt_index = ((unsigned char)*pkt) >> 4; - debug( 3, "packetid: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max ); + debug( 3, "packetid[1]: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max ); pkt++; pktlen -= 9; } @@ -172,20 +174,20 @@ { // HL2 format // The next two bytes are: - // 1. the max packets sent - // 2. the index of this packet starting from 0 + // 1. the max packets sent ( byte ) + // 2. the index of this packet starting from 0 ( byte ) + // 3. Size of the split ( short ) if(pktlen < 10) goto out_too_short; pkt_max = ((unsigned char)*pkt); pkt_index = ((unsigned char)*(pkt+1)); - debug( 3, "packetid: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max ); - pkt+=2; - pktlen -= 10; + debug( 3, "packetid[2]: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max ); + pkt+=4; + pktlen -= 12; } else { malformed_packet( server, "Unable to determine packet format" ); - cleanup_qserver( server, 1 ); - return; + return PKT_ERROR; } // pkt_max is the total number of packets expected @@ -210,25 +212,24 @@ if ( NULL == sdata->data ) { malformed_packet(server, "Out of memory"); - cleanup_qserver( server, 1 ); - return; + return MEM_ERROR; } memcpy( sdata->data, pkt, sdata->datalen); // combine_packets will call us recursively - combine_packets( server ); - return; + return combine_packets( server ); } else if( 0 != memcmp(pkt, "\xFF\xFF\xFF\xFF", 4) ) { malformed_packet(server, "invalid packet header"); - goto out_error; + return PKT_ERROR; } pkt += 4; pktlen -= 4; pktlen -= 1; + debug( 2, "A2S type = %hhd", *pkt ); switch(*pkt++) { case A2S_CHALLENGERESPONSE: @@ -438,6 +439,9 @@ server->num_players = (unsigned char)pkt[2]; server->max_players = (unsigned char)pkt[3]; // pkt[4] number of bots + sprintf( buf, "%hhu", pkt[4] ); + add_rule( server, "bots", buf, 0 ); + add_rule(server, "dedicated", pkt[5]?"1":"0", 0); if(pkt[6] == 'l') { @@ -582,7 +586,7 @@ default: malformed_packet(server, "invalid packet id %hhx", *--pkt); - goto out_error; + return PKT_ERROR; } if( @@ -593,14 +597,11 @@ server->next_rule = NULL; } - cleanup_qserver(server, 0); - return; + return DONE_AUTO; out_too_short: malformed_packet(server, "packet too short"); - -out_error: - cleanup_qserver(server, 1); + return PKT_ERROR; } -// vim: sw=4 ts=8 noet +// vim: sw=4 ts=4 noet diff -urP qstat-2.11/a2s.h qstat-2.11-20080912svn311/a2s.h --- qstat-2.11/a2s.h 2005-06-12 00:47:35.000000000 -0400 +++ qstat-2.11-20080912svn311/a2s.h 2008-09-12 14:52:23.000000000 -0400 @@ -12,8 +12,8 @@ #include "qserver.h" -void send_a2s_request_packet(struct qserver *server); -void send_a2s_rule_request_packet(struct qserver *server); -void deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen); +int send_a2s_request_packet(struct qserver *server); +int send_a2s_rule_request_packet(struct qserver *server); +int deal_with_a2s_packet(struct qserver *server, char *rawpkt, int pktlen); #endif diff -urP qstat-2.11/aclocal.m4 qstat-2.11-20080912svn311/aclocal.m4 --- qstat-2.11/aclocal.m4 2006-10-28 08:37:22.000000000 -0400 +++ qstat-2.11-20080912svn311/aclocal.m4 2008-09-12 15:00:24.000000000 -0400 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.7.9 -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,32 +11,358 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_PREREQ([2.52]) + +# serial 6 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 10 + +AC_PREREQ([2.54]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) + [AM_AUTOMAKE_VERSION([1.7.9])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) -# AM_AUX_DIR_EXPAND -*- Autoconf -*- +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to @@ -76,55 +402,131 @@ # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) -# AM_CONDITIONAL -*- Autoconf -*- +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright 2001 Free Software Foundation, Inc. -# serial 7 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) -if $2; then - $1_TRUE= - $1_FALSE='#' +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. else - $1_TRUE='#' - $1_FALSE= + am__leading_dot=_ fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) +# serial 5 -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. -# serial 8 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -133,6 +535,7 @@ # CC etc. in the Makefile, will ask for an AC_PROG_CC use... + # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. @@ -191,9 +594,7 @@ : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf @@ -221,14 +622,9 @@ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi @@ -262,8 +658,8 @@ # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -272,16 +668,26 @@ AC_SUBST([AMDEPBACKSLASH]) ]) -# Generate code to set up dependency tracking. -*- Autoconf -*- +# Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. -#serial 3 +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ @@ -300,21 +706,27 @@ else continue fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue @@ -340,177 +752,27 @@ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 +# Check to see how 'make' treats includes. -*- Autoconf -*- -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 12 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -]) -]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $1 | $1:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # serial 2 -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -553,310 +815,47 @@ rm -f confinc confmf ]) -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) -AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +# AM_CONDITIONAL -*- Autoconf -*- -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. -# Check to make sure that the build environment is sane. -*- Autoconf -*- +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. -# serial 4 +# serial 5 -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi +AC_PREREQ(2.52) - test "$[2]" = conftest.file - ) -then - # Ok. - : +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) + $1_TRUE='#' + $1_FALSE= fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar <conftest.tar]) - grep GrepMe conftest.dir/file >/dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) diff -urP qstat-2.11/autogen.sh qstat-2.11-20080912svn311/autogen.sh --- qstat-2.11/autogen.sh 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/autogen.sh 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,72 @@ +#!/bin/sh + +# Global variables... +AUTOCONF="autoconf" +AUTOHEADER="autoheader" +AUTOM4TE="autom4te" +AUTOMAKE="automake" +ACLOCAL="aclocal" + +# Please add higher versions first. The last version number is the minimum +# needed to compile KDE. Do not forget to include the name/version # +# separator if one is present, e.g. -1.2 where - is the separator. +AUTOCONF_VERS="-2.61 261 -2.59 259 -2.58 258 -2.57 257 -2.54 254 -2.53 253" +AUTOMAKE_VERS="-1.9 19 -1.8 18 -1.7 17 -1.6 16 -1.5 15" + +# We don't use variable here for remembering the type ... strings. Local +# variables are not that portable, but we fear namespace issues with our +# includer. +check_autoconf() +{ + echo "Checking autoconf version..." + for ver in $AUTOCONF_VERS; do + if test -x "`$WHICH $AUTOCONF$ver 2>/dev/null`"; then + AUTOCONF="`$WHICH $AUTOCONF$ver`" + AUTOHEADER="`$WHICH $AUTOHEADER$ver`" + AUTOM4TE="`$WHICH $AUTOM4TE$ver`" + break + fi + done +} + +check_automake() +{ + echo "Checking automake version..." + for ver in $AUTOMAKE_VERS; do + if test -x "`$WHICH $AUTOMAKE$ver 2>/dev/null`"; then + AUTOMAKE="`$WHICH $AUTOMAKE$ver`" + ACLOCAL="`$WHICH $ACLOCAL$ver`" + break + fi + done + + if test -n "$UNSERMAKE"; then + AUTOMAKE="$UNSERMAKE" + fi +} + +check_which() +{ + WHICH="" + for i in "type -p" "which" "type" ; do + T=`$i sh 2> /dev/null` + test -x "$T" && WHICH="$i" && break + done +} + +check_which +check_autoconf +check_automake + +export AUTOCONF AUTOHEADER AUTOM4TE AUTOMAKE ACLOCAL + +set -e + +echo "Running aclocal..." +$ACLOCAL +echo "Running autoconf..." +$AUTOCONF +echo "Running autoheader..." +$AUTOHEADER +echo "Running automake..." +$AUTOMAKE -a --foreign diff -urP qstat-2.11/autom4te.cache/output.0 qstat-2.11-20080912svn311/autom4te.cache/output.0 --- qstat-2.11/autom4te.cache/output.0 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/autom4te.cache/output.0 2008-09-12 15:00:24.000000000 -0400 @@ -0,0 +1,5808 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.62 for qstat 2.12. +@%:@ +@%:@ Report bugs to <qstat-users@yahoogroups.com>. +@%:@ +@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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'" + + + +exec 7<&0 </dev/null 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='qstat' +PACKAGE_TARNAME='qstat' +PACKAGE_VERSION='2.12' +PACKAGE_STRING='qstat 2.12' +PACKAGE_BUGREPORT='qstat-users@yahoogroups.com' + +ac_unique_file="qstat.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +AMTAR +install_sh +STRIP +INSTALL_STRIP_PROGRAM +AWK +SET_MAKE +am__leading_dot +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +DEPDIR +am__include +am__quote +AMDEP_TRUE +AMDEP_FALSE +AMDEPBACKSLASH +CCDEPMODE +am__fastdepCC_TRUE +am__fastdepCC_FALSE +CPP +GREP +EGREP +LIB@&t@OBJS +LTLIBOBJS' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_optimize +enable_debug +enable_dump +with_efence +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures qstat 2.12 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/qstat@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of qstat 2.12:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors + --disable-optimize turn off optimization + --disable-debug turn off debugging code + --enable-dump enable packet dumps + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-efence=<path> Use electric fence for malloc debugging. + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <qstat-users@yahoogroups.com>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +qstat configure 2.12 +generated by GNU Autoconf 2.62 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by qstat $as_me 2.12, which was +generated by GNU Autoconf 2.62. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +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 + +} >&5 + +cat >&5 <<_ACEOF + + +@%:@@%:@ ----------- @%:@@%:@ +@%:@@%:@ Core tests. @%:@@%:@ +@%:@@%:@ ----------- @%:@@%:@ + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +@%:@@%:@ ---------------- @%:@@%:@ +@%:@@%:@ Cache variables. @%:@@%:@ +@%:@@%:@ ---------------- @%:@@%:@ +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +@%:@@%:@ ----------------- @%:@@%:@ +@%:@@%:@ Output variables. @%:@@%:@ +@%:@@%:@ ----------------- @%:@@%:@ +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +@%:@@%:@ ------------------- @%:@@%:@ +@%:@@%:@ File substitutions. @%:@@%:@ +@%:@@%:@ ------------------- @%:@@%:@ +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +@%:@@%:@ ----------- @%:@@%:@ +@%:@@%:@ confdefs.h. @%:@@%:@ +@%:@@%:@ ----------- @%:@@%:@ +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers gnuconfig.h" + + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +am__api_version="1.7" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + + # test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='qstat' + VERSION='2.12' + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + : > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include <limits.h> +@%:@else +@%:@ include <assert.h> +@%:@endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +@%:@include <ac_nonexistent.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include <limits.h> +@%:@else +@%:@ include <assert.h> +@%:@endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +@%:@include <ac_nonexistent.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +@%:@define STDC_HEADERS 1 +_ACEOF + +fi + + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +@%:@include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` = yes; then + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "${ac_cv_header_sys_mman_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for sys/mman.h" >&5 +$as_echo_n "checking for sys/mman.h... " >&6; } +if test "${ac_cv_header_sys_mman_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 +$as_echo "$ac_cv_header_sys_mman_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking sys/mman.h usability" >&5 +$as_echo_n "checking sys/mman.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +@%:@include <sys/mman.h> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking sys/mman.h presence" >&5 +$as_echo_n "checking sys/mman.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +@%:@include <sys/mman.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +@%:@@%:@ ------------------------------------------ @%:@@%:@ +@%:@@%:@ Report this to qstat-users@yahoogroups.com @%:@@%:@ +@%:@@%:@ ------------------------------------------ @%:@@%:@ +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for sys/mman.h" >&5 +$as_echo_n "checking for sys/mman.h... " >&6; } +if test "${ac_cv_header_sys_mman_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_sys_mman_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 +$as_echo "$ac_cv_header_sys_mman_h" >&6; } + +fi +if test $ac_cv_header_sys_mman_h = yes; then + have_mman_h=yes +fi + + + +case $host in + *mingw32*) + { $as_echo "$as_me:$LINENO: compiling for $host, adding -lwsock32" >&5 +$as_echo "$as_me: compiling for $host, adding -lwsock32" >&6;} + LIBS="$LIBS -lwsock32" + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking whether to enable optimization" >&5 +$as_echo_n "checking whether to enable optimization... " >&6; } +@%:@ Check whether --enable-optimize was given. +if test "${enable_optimize+set}" = set; then + enableval=$enable_optimize; +fi + +if test x$enable_optimize != xno; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + CPPFLAGS="" + CFLAGS="-ggdb" + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking whether to enable debug output" >&5 +$as_echo_n "checking whether to enable debug output... " >&6; } +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then + enableval=$enable_debug; +fi + +if test x$enable_debug != xno; then + CPPFLAGS="$CPPFLAGS -DDEBUG" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking whether to enable packet dumps" >&5 +$as_echo_n "checking whether to enable packet dumps... " >&6; } +@%:@ Check whether --enable-dump was given. +if test "${enable_dump+set}" = set; then + enableval=$enable_dump; +fi + +if test x$enable_dump != xno; then + if test x$have_mman_h = xyes; then + CPPFLAGS="$CPPFLAGS -DENABLE_DUMP" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no, sys/mman.h missing" >&5 +$as_echo "no, sys/mman.h missing" >&6; } + fi +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +@%:@ Check whether --with-efence was given. +if test "${with_efence+set}" = set; then + withval=$with_efence; if test x$withval != xyes ; then + LDFLAGS="${LDFLAGS} -L$withval" + fi + +{ $as_echo "$as_me:$LINENO: checking for malloc in -lefence" >&5 +$as_echo_n "checking for malloc in -lefence... " >&6; } +if test "${ac_cv_lib_efence_malloc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lefence $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char malloc (); +int +main () +{ +return malloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_efence_malloc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_efence_malloc=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_efence_malloc" >&5 +$as_echo "$ac_cv_lib_efence_malloc" >&6; } +if test $ac_cv_lib_efence_malloc = yes; then + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBEFENCE 1 +_ACEOF + + LIBS="-lefence $LIBS" + +fi + + +fi + + +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi + +ac_config_files="$ac_config_files Makefile template/Makefile info/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## 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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by qstat $as_me 2.12, which was +generated by GNU Autoconf 2.62. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="`echo $ac_config_files`" +config_headers="`echo $ac_config_headers`" +config_commands="`echo $ac_config_commands`" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <bug-autoconf@gnu.org>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +qstat config.status 2.12 +configured by $0, generated by GNU Autoconf 2.62, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "gnuconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS gnuconfig.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "template/Makefile") CONFIG_FILES="$CONFIG_FILES template/Makefile" ;; + "info/Makefile") CONFIG_FILES="$CONFIG_FILES info/Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\).*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\).*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$ac_file_inputs '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + grep '^DEP_FILES *= *[^ @%:@]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff -urP qstat-2.11/autom4te.cache/requests qstat-2.11-20080912svn311/autom4te.cache/requests --- qstat-2.11/autom4te.cache/requests 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/autom4te.cache/requests 2008-09-12 15:00:26.000000000 -0400 @@ -0,0 +1,67 @@ +# This file was generated. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.ac' + ], + { + '_LT_AC_TAGCONFIG' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AC_INIT' => 1, + 'm4_pattern_forbid' => 1, + '_AM_COND_IF' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_SUBST' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'AC_CONFIG_LINKS' => 1, + 'm4_sinclude' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + '_m4_warn' => 1, + 'AM_PROG_CXX_C_O' => 1, + '_AM_COND_ENDIF' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AC_CONFIG_FILES' => 1, + 'include' => 1, + 'LT_INIT' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AC_FC_FREEFORM' => 1, + 'AH_OUTPUT' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'sinclude' => 1, + 'm4_pattern_allow' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'm4_include' => 1, + '_AM_COND_ELSE' => 1, + 'AC_SUBST_TRACE' => 1 + } + ], 'Autom4te::Request' ) + ); + diff -urP qstat-2.11/autom4te.cache/traces.0 qstat-2.11-20080912svn311/autom4te.cache/traces.0 --- qstat-2.11/autom4te.cache/traces.0 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/autom4te.cache/traces.0 2008-09-12 15:00:24.000000000 -0400 @@ -0,0 +1,373 @@ +m4trace:aclocal.m4:69: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:1: -1- AC_INIT([qstat], [2.12], [qstat-users@yahoogroups.com]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:1: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:1: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:1: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:1: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:1: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:1: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +#undef PACKAGE_NAME]) +m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME]) +m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +#undef PACKAGE_VERSION]) +m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING]) +m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:1: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:1: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:1: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:1: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:1: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:1: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:1: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:1: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:3: -1- _m4_warn([obsolete], [The macro `AM_CONFIG_HEADER' is obsolete. +You should run autoupdate.], [aclocal.m4:38: AM_CONFIG_HEADER is expanded from... +configure.ac:3: the top level]) +m4trace:configure.ac:3: -1- AC_CONFIG_HEADERS([gnuconfig.h]) +m4trace:configure.ac:6: -1- AC_CANONICAL_HOST +m4trace:configure.ac:6: -1- AC_CANONICAL_BUILD +m4trace:configure.ac:6: -1- AC_REQUIRE_AUX_FILE([config.sub]) +m4trace:configure.ac:6: -1- AC_REQUIRE_AUX_FILE([config.guess]) +m4trace:configure.ac:6: -1- AC_SUBST([build], [$ac_cv_build]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:6: -1- AC_SUBST([build_cpu], [$[1]]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build_cpu]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:6: -1- AC_SUBST([build_vendor], [$[2]]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build_vendor]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:6: -1- AC_SUBST([build_os]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([build_os]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:6: -1- AC_SUBST([host], [$ac_cv_host]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:6: -1- AC_SUBST([host_cpu], [$[1]]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host_cpu]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:6: -1- AC_SUBST([host_vendor], [$[2]]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host_vendor]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:6: -1- AC_SUBST([host_os]) +m4trace:configure.ac:6: -1- AC_SUBST_TRACE([host_os]) +m4trace:configure.ac:6: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:7: -1- AM_INIT_AUTOMAKE([1.6 foreign]) +m4trace:configure.ac:7: -1- AM_AUTOMAKE_VERSION([1.7.9]) +m4trace:configure.ac:7: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:7: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:7: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:7: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:7: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:7: -1- _m4_warn([obsolete], [The macro `AC_FOREACH' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:196: AC_FOREACH is expanded from... +aclocal.m4:229: _AM_SET_OPTIONS is expanded from... +aclocal.m4:82: AM_INIT_AUTOMAKE is expanded from... +configure.ac:7: the top level]) +m4trace:configure.ac:7: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:7: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:7: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:7: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +#undef PACKAGE]) +m4trace:configure.ac:7: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:7: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +#undef VERSION]) +m4trace:configure.ac:7: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:7: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:7: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:7: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:7: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:7: -1- AC_SUBST([AMTAR]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:7: -1- AC_SUBST([install_sh]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:7: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:7: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:7: -1- AC_SUBST([AWK]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:7: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:7: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.ac:7: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.ac:7: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:10: -1- AC_SUBST([CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([CFLAGS]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:10: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:10: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:10: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:10: -1- AC_SUBST([CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:10: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:10: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:10: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:10: -1- AC_SUBST([am__include]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:10: -1- AC_SUBST([am__quote]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([am__quote]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:10: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:10: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:10: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:10: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:10: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:10: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:10: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:10: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.ac:10: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.ac:10: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:13: -1- AC_SUBST([CPP]) +m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:13: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:13: -1- AC_SUBST([CPP]) +m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:13: -1- AC_SUBST([GREP]) +m4trace:configure.ac:13: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:13: -1- AC_SUBST([EGREP]) +m4trace:configure.ac:13: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:13: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:13: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:13: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H]) +m4trace:configure.ac:15: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H]) +m4trace:configure.ac:63: -2- AH_OUTPUT([HAVE_LIBEFENCE], [/* Define to 1 if you have the `efence\' library (-lefence). */ +#undef HAVE_LIBEFENCE]) +m4trace:configure.ac:63: -2- AC_DEFINE_TRACE_LITERAL([HAVE_LIBEFENCE]) +m4trace:configure.ac:63: -2- m4_pattern_allow([^HAVE_LIBEFENCE$]) +m4trace:configure.ac:76: -1- AC_CONFIG_FILES([ + Makefile + template/Makefile + info/Makefile +]) +m4trace:configure.ac:81: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.ac:81: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:81: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.ac:81: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.ac:81: -1- AC_SUBST_TRACE([INSTALL]) diff -urP qstat-2.11/config.guess qstat-2.11-20080912svn311/config.guess --- qstat-2.11/config.guess 2006-04-22 20:59:37.000000000 -0400 +++ qstat-2.11-20080912svn311/config.guess 2007-09-18 10:10:46.000000000 -0400 @@ -1,9 +1,9 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2005-07-08' +timestamp='2003-10-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -17,15 +17,13 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. - # Originally written by Per Bothner <per@bothner.com>. # Please send patches to <config-patches@gnu.org>. Submit a context # diff and a properly formatted ChangeLog entry. @@ -55,7 +53,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -68,11 +66,11 @@ while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; + echo "$timestamp" ; exit 0 ;; --version | -v ) - echo "$version" ; exit ;; + echo "$version" ; exit 0 ;; --help | --h* | -h ) - echo "$usage"; exit ;; + echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -125,7 +123,7 @@ ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) @@ -138,16 +136,6 @@ UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "${UNAME_MACHINE}" in - i?86) - test -z "$VENDOR" && VENDOR=pc - ;; - *) - test -z "$VENDOR" && VENDOR=unknown - ;; -esac -test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse - # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -208,29 +196,50 @@ # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" - exit ;; + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerppc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) + if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac + fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU @@ -268,49 +277,42 @@ "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac - # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha*:OpenVMS:*:*) + echo alpha-hp-vms + exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix - exit ;; + exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 - exit ;; + exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 - exit ;; + exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp - exit ;; + exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then @@ -318,32 +320,32 @@ else echo pyramid-pyramid-bsd fi - exit ;; + exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 - exit ;; + exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; + sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) @@ -352,10 +354,10 @@ esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; + exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 @@ -367,10 +369,10 @@ echo sparc-sun-sunos${UNAME_RELEASE} ;; esac - exit ;; + exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -381,40 +383,37 @@ # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 - exit ;; + exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -438,33 +437,32 @@ exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 echo mips-mips-riscos${UNAME_RELEASE} - exit ;; + exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax - exit ;; + exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax - exit ;; + exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax - exit ;; + exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix - exit ;; + exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 - exit ;; + exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 - exit ;; + exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 - exit ;; + exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` @@ -480,29 +478,29 @@ else echo i586-dg-dgux${UNAME_RELEASE} fi - exit ;; + exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 - exit ;; + exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 - exit ;; + exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 - exit ;; + exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd - exit ;; + exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix - exit ;; + exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` @@ -510,7 +508,7 @@ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build @@ -525,18 +523,14 @@ exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi - exit ;; + exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then @@ -550,28 +544,28 @@ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix - exit ;; + exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 - exit ;; + exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx - exit ;; + exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 - exit ;; + exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd - exit ;; + exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 - exit ;; + exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in @@ -633,19 +627,9 @@ esac if [ ${HP_ARCH} = "hppa2.0w" ] then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else @@ -653,11 +637,11 @@ fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} - exit ;; + exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -685,166 +669,153 @@ exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 - exit ;; + exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd - exit ;; + exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd - exit ;; + exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix - exit ;; + exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf - exit ;; + exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf - exit ;; + exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi - exit ;; + exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites - exit ;; + exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit ;; + exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit ;; + exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit ;; + exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit ;; + exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + exit 0 ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + exit 0 ;; + *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + # GNU/FreeBSD systems have a "k" prefix to indicate we are using + # FreeBSD's kernel, but not the complete OS. + case ${LIBC} in gnu) kernel_only='k' ;; esac + echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; + exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 - exit ;; + exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' - exit ;; + exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks - exit ;; + exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix - exit ;; + exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; + exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin - exit ;; + exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + exit 0 ;; *:GNU:*:*) - # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; + exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix - exit ;; + exit 0 ;; arm*:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; cris:Linux:*:*) - echo cris-axis-linux - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux - exit ;; - frv:Linux:*:*) - echo frv-${VENDOR}-linux - exit ;; + echo cris-axis-linux-gnu + exit 0 ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -862,7 +833,7 @@ #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && { echo "${CPU}-${VENDOR}-linux"; exit; } + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build @@ -881,14 +852,14 @@ #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && { echo "${CPU}-${VENDOR}-linux"; exit; } + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) - echo powerpc-${VENDOR}-linux - exit ;; + echo powerpc-unknown-linux-gnu + exit 0 ;; ppc64:Linux:*:*) - echo powerpc64-${VENDOR}-linux - exit ;; + echo powerpc64-unknown-linux-gnu + exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; @@ -901,34 +872,34 @@ esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-${VENDOR}-linux${LIBC} - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-${VENDOR}-linux ;; - PA8*) echo hppa2.0-${VENDOR}-linux ;; - *) echo hppa-${VENDOR}-linux ;; + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; esac - exit ;; + exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-${VENDOR}-linux - exit ;; + echo hppa64-unknown-linux-gnu + exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux - exit ;; + exit 0 ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-${VENDOR}-linux - exit ;; + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; x86_64:Linux:*:*) - echo x86_64-${VENDOR}-linux - exit ;; + echo x86_64-unknown-linux-gnu + exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent @@ -942,19 +913,19 @@ p'` case "$ld_supported_targets" in elf32-i386) - TENTATIVE="${UNAME_MACHINE}-${VENDOR}-linux" + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) - echo "${UNAME_MACHINE}-${VENDOR}-linuxaout" - exit ;; + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; coff-i386) - echo "${UNAME_MACHINE}-${VENDOR}-linuxcoff" - exit ;; + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; "") - # Either a pre-BFD a.out linker (linuxoldld) or + # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. - echo "${UNAME_MACHINE}-${VENDOR}-linuxoldld" - exit ;; + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build @@ -982,18 +953,15 @@ #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}" | sed 's/linux-gnu/linux/' - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 - exit ;; + exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... @@ -1001,27 +969,24 @@ # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; + exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; + exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop - exit ;; + exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; + exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; + exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then @@ -1029,16 +994,15 @@ else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. + exit 0 ;; + i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; + exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` @@ -1056,73 +1020,73 @@ else echo ${UNAME_MACHINE}-pc-sysv32 fi - exit ;; + exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp - exit ;; + exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 - exit ;; + exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 - exit ;; + exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi - exit ;; + exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv - exit ;; + exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv - exit ;; + exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; + && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 - exit ;; + exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 - exit ;; + exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 - exit ;; + exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` @@ -1130,73 +1094,68 @@ else echo ns32k-sni-sysv fi - exit ;; + exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says <Richard.M.Bartel@ccMail.Census.GOV> echo i586-unisys-sysv4 - exit ;; + exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes <hewes@openmarket.com>. # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 - exit ;; + exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; + exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos - exit ;; + exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 - exit ;; + exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi - exit ;; + exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos - exit ;; + exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos - exit ;; + exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos - exit ;; + exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in + case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; - unknown) UNAME_PROCESSOR=powerpc ;; + powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then @@ -1204,25 +1163,22 @@ UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) + exit 0 ;; + NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux - exit ;; + exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv - exit ;; + exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 @@ -1233,44 +1189,28 @@ UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 - exit ;; + exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex - exit ;; + exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 - exit ;; + exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 - exit ;; + exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 - exit ;; + exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its - exit ;; + exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; + exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1302,7 +1242,7 @@ #endif #if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); + printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) @@ -1391,12 +1331,11 @@ } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) @@ -1405,22 +1344,22 @@ case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd - exit ;; + exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit 0 ;; c34*) echo c34-convex-bsd - exit ;; + exit 0 ;; c38*) echo c38-convex-bsd - exit ;; + exit 0 ;; c4*) echo c4-convex-bsd - exit ;; + exit 0 ;; esac fi @@ -1431,9 +1370,7 @@ the operating system you are using. It is advised that you download the most up to date version of the config scripts from - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess -and - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub + ftp://ftp.gnu.org/pub/gnu/config/ If the version you run ($0) is already up to date, please send the following data and any information you think might be diff -urP qstat-2.11/config.sub qstat-2.11-20080912svn311/config.sub --- qstat-2.11/config.sub 2006-04-22 20:59:37.000000000 -0400 +++ qstat-2.11-20080912svn311/config.sub 2007-09-18 10:10:46.000000000 -0400 @@ -1,9 +1,9 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2005-07-08' +timestamp='2003-08-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -21,15 +21,14 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. - # Please send patches to <config-patches@gnu.org>. Submit a context # diff and a properly formatted ChangeLog entry. # @@ -71,7 +70,7 @@ version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -84,11 +83,11 @@ while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; + echo "$timestamp" ; exit 0 ;; --version | -v ) - echo "$version" ; exit ;; + echo "$version" ; exit 0 ;; --help | --h* | -h ) - echo "$usage"; exit ;; + echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -100,7 +99,7 @@ *local*) # First pass through any local machine types. echo $1 - exit ;; + exit 0;; * ) break ;; @@ -119,8 +118,7 @@ # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ - kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + nto-qnx* | linux-gnu* | linux-dietlibc | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -146,7 +144,7 @@ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) + -apple | -axis) os= basic_machine=$1 ;; @@ -232,14 +230,13 @@ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -248,7 +245,6 @@ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ @@ -257,28 +253,23 @@ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ - | ms1 \ | msp430 \ | ns16k | ns32k \ - | or32 \ + | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ - | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; - m32c) - basic_machine=$basic_machine-unknown - ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown @@ -306,9 +297,9 @@ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ - | bfin-* | bs2000-* \ + | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ + | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ @@ -316,9 +307,9 @@ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ - | m32r-* | m32rle-* \ + | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ + | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -327,7 +318,6 @@ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ @@ -335,32 +325,27 @@ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | ms1-* \ | msp430-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ | ymp-* \ | z8k-*) ;; - m32c-*) - ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) @@ -377,9 +362,6 @@ basic_machine=a29k-amd os=-udi ;; - abacus) - basic_machine=abacus-unknown - ;; adobe68k) basic_machine=m68010-adobe os=-scout @@ -397,9 +379,6 @@ amd64) basic_machine=x86_64-pc ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; amdahl) basic_machine=580-amdahl os=-sysv @@ -459,27 +438,12 @@ basic_machine=j90-cray os=-unicos ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16c) - basic_machine=cr16c-unknown - os=-elf - ;; crds | unos) basic_machine=m68k-crds ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; da30 | da30-*) basic_machine=m68k-da30 ;; @@ -502,10 +466,6 @@ basic_machine=m88k-motorola os=-sysv3 ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx @@ -684,6 +644,10 @@ mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; monitor) basic_machine=m68k-rom68k os=-coff @@ -764,6 +728,10 @@ np1) basic_machine=np1-gould ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; nsr-tandem) basic_machine=nsr-tandem ;; @@ -771,12 +739,9 @@ basic_machine=hppa1.1-oki os=-proelf ;; - openrisc | openrisc-*) + or32 | or32-*) basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 + os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson @@ -998,10 +963,6 @@ tower | tower-32) basic_machine=m68k-ncr ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; udi29k) basic_machine=a29k-amd os=-udi @@ -1045,10 +1006,6 @@ basic_machine=hppa1.1-winbond os=-proelf ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; xps | xps100) basic_machine=xps100-honeywell ;; @@ -1079,9 +1036,6 @@ romp) basic_machine=romp-ibm ;; - mmix) - basic_machine=mmix-knuth - ;; rs6000) basic_machine=rs6000-ibm ;; @@ -1098,10 +1052,13 @@ we32k) basic_machine=we32k-att ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv8 | sparcv9 | sparcv9b) + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) @@ -1174,21 +1131,19 @@ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku*) + | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1206,7 +1161,7 @@ os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) @@ -1215,6 +1170,9 @@ -linux-dietlibc) os=-linux-dietlibc ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; @@ -1224,9 +1182,6 @@ -opened*) os=-openedition ;; - -os400*) - os=-os400 - ;; -wince*) os=-wince ;; @@ -1248,9 +1203,6 @@ -atheos*) os=-atheos ;; - -syllable*) - os=-syllable - ;; -386bsd) os=-bsd ;; @@ -1273,9 +1225,6 @@ -sinix*) os=-sysv4 ;; - -tpf*) - os=-tpf - ;; -triton*) os=-sysv3 ;; @@ -1312,9 +1261,6 @@ -kaos*) os=-kaos ;; - -zvmoe) - os=-zvmoe - ;; -none) ;; *) @@ -1392,15 +1338,9 @@ *-be) os=-beos ;; - *-haiku) - os=-haiku - ;; *-ibm) os=-aix ;; - *-knuth) - os=-mmixware - ;; *-wec) os=-proelf ;; @@ -1533,15 +1473,9 @@ -mvs* | -opened*) vendor=ibm ;; - -os400*) - vendor=ibm - ;; -ptx*) vendor=sequent ;; - -tpf*) - vendor=ibm - ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; @@ -1566,7 +1500,7 @@ esac echo $basic_machine$os -exit +exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff -urP qstat-2.11/configure qstat-2.11-20080912svn311/configure --- qstat-2.11/configure 2006-10-28 08:37:24.000000000 -0400 +++ qstat-2.11-20080912svn311/configure 2008-09-12 15:00:25.000000000 -0400 @@ -1,27 +1,84 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for qstat 2.11. +# Generated by GNU Autoconf 2.62 for qstat 2.12. # # Report bugs to <qstat-users@yahoogroups.com>. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## -# Be Bourne compatible +# 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=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# 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_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 +if (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 -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -31,33 +88,60 @@ 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. +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); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +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 +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -65,157 +149,391 @@ # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` +# CDPATH. +$as_unset CDPATH -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no fi + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -if expr a : '\(a\)' >/dev/null 2>&1; then +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +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=: @@ -224,7 +542,28 @@ as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # 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'" @@ -233,90 +572,180 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH +exec 7<&0 </dev/null 6>&1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - # Identity of this package. PACKAGE_NAME='qstat' PACKAGE_TARNAME='qstat' -PACKAGE_VERSION='2.11' -PACKAGE_STRING='qstat 2.11' +PACKAGE_VERSION='2.12' +PACKAGE_STRING='qstat 2.12' PACKAGE_BUGREPORT='qstat-users@yahoogroups.com' ac_unique_file="qstat.c" # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif -#if STDC_HEADERS +#ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else -# if HAVE_STDLIB_H +# ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif -#if HAVE_STRINGS_H +#ifdef HAVE_STRINGS_H # include <strings.h> #endif -#if HAVE_INTTYPES_H +#ifdef HAVE_INTTYPES_H # include <inttypes.h> -#else -# if HAVE_STDINT_H -# include <stdint.h> -# endif #endif -#if HAVE_UNISTD_H +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H # include <unistd.h> #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +AMTAR +install_sh +STRIP +INSTALL_STRIP_PROGRAM +AWK +SET_MAKE +am__leading_dot +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +DEPDIR +am__include +am__quote +AMDEP_TRUE +AMDEP_FALSE +AMDEPBACKSLASH +CCDEPMODE +am__fastdepCC_TRUE +am__fastdepCC_FALSE +CPP +GREP +EGREP +LIBOBJS +LTLIBOBJS' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_optimize +enable_debug +enable_dump +with_efence +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + # Initialize some variables set by options. ac_init_help= ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null @@ -339,34 +768,48 @@ # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -388,33 +831,61 @@ --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -441,6 +912,12 @@ -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -465,13 +942,16 @@ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -536,6 +1016,16 @@ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -586,26 +1076,38 @@ ac_init_version=: ;; -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -625,7 +1127,7 @@ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { echo "$as_me: error: unrecognized option: $ac_option + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; @@ -634,17 +1136,16 @@ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; @@ -653,31 +1154,39 @@ if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;; esac -done +fi -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var + # Remove trailing slashes. case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -691,7 +1200,7 @@ if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes @@ -704,74 +1213,76 @@ test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } - fi fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done # # Report the --help message. @@ -780,7 +1291,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures qstat 2.11 to adapt to many kinds of systems. +\`configure' configures qstat 2.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -800,14 +1311,11 @@ -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -817,18 +1325,25 @@ For better control, use the options below. Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/qstat] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -846,25 +1361,33 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of qstat 2.11:";; + short | recursive ) echo "Configuration of qstat 2.12:";; esac cat <<\_ACEOF Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors + --disable-optimize turn off optimization --disable-debug turn off debugging code --enable-dump enable packet dumps +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-efence=<path> Use electric fence for malloc debugging. + Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> - CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have - headers in a nonstandard directory <include dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -872,120 +1395,88 @@ Report bugs to <qstat-users@yahoogroups.com>. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -qstat configure 2.11 -generated by GNU Autoconf 2.59 +qstat configure 2.12 +generated by GNU Autoconf 2.62 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF +cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by qstat $as_me 2.11, which was -generated by GNU Autoconf 2.59. Invocation command line was +It was created by qstat $as_me 2.12, which was +generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -1004,7 +1495,7 @@ /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/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` @@ -1016,8 +1507,9 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" + $as_echo "PATH: $as_dir" done +IFS=$as_save_IFS } >&5 @@ -1039,7 +1531,6 @@ ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1050,8 +1541,8 @@ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; @@ -1072,9 +1563,7 @@ -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done @@ -1085,8 +1574,8 @@ # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1099,20 +1588,35 @@ _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1123,22 +1627,28 @@ echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1150,26 +1660,24 @@ ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h # Predefined preprocessor variables. @@ -1199,18 +1707,24 @@ # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -for ac_site_file in $CONFIG_SITE; do +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi @@ -1220,54 +1734,61 @@ # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -1277,19 +1798,13 @@ fi done if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - @@ -1314,93 +1829,133 @@ +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_config_headers="$ac_config_headers gnuconfig.h" +ac_config_headers="$ac_config_headers gnuconfig.h" ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break - elif test -f $ac_dir/install.sh; then + elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break - elif test -f $ac_dir/shtool; then + elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } +fi fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -am__api_version="1.9" +am__api_version="1.7" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -1414,11 +1969,12 @@ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -1437,7 +1993,7 @@ # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1447,30 +2003,43 @@ # program-specific install script used by HP pwplus--don't use. : else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi fi fi done done ;; esac + done +IFS=$as_save_IFS +rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1480,8 +2049,8 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file @@ -1504,9 +2073,9 @@ # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi @@ -1517,26 +2086,24 @@ # Ok. : else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! +$as_echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. # By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` @@ -1547,51 +2114,18 @@ am_missing_run="$MISSING --run " else am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -1602,54 +2136,58 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1662,11 +2200,11 @@ fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured + # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi @@ -1682,7 +2220,7 @@ # Define the identity of the package. PACKAGE='qstat' - VERSION='2.11' + VERSION='2.12' cat >>confdefs.h <<_ACEOF @@ -1710,6 +2248,9 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +AMTAR=${AMTAR-"${am_missing_run}tar"} + install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user @@ -1720,10 +2261,10 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. @@ -1734,34 +2275,36 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. @@ -1772,27 +2315,41 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -1802,13 +2359,6 @@ # We need awk for the "check" target. The system "awk" is bad on # some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - @@ -1821,10 +2371,10 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1835,34 +2385,36 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -1873,38 +2425,53 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1915,76 +2482,36 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi + fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1996,17 +2523,18 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -2024,24 +2552,25 @@ fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2052,38 +2581,40 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -2094,58 +2625,92 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 - (eval $ac_compiler --version </dev/null >&5) 2>&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 - (eval $ac_compiler -v </dev/null >&5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 - (eval $ac_compiler -V </dev/null >&5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF @@ -2164,111 +2729,146 @@ } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else - echo "$as_me: failed program was:" >&5 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables +$as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. + { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. +$as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will @@ -2277,32 +2877,31 @@ for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link + { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2320,39 +2919,46 @@ } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2373,50 +2979,54 @@ } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2432,38 +3042,121 @@ } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2479,12 +3172,12 @@ CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2518,12 +3211,17 @@ /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2538,205 +3236,58 @@ return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include <stdlib.h> -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2744,7 +3295,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" - ac_config_commands="$ac_config_commands depfiles" +ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} @@ -2754,8 +3305,8 @@ .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none @@ -2782,15 +3333,15 @@ fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } rm -f confinc confmf -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +# Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" + enableval=$enable_dependency_tracking; +fi -fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -2810,10 +3361,10 @@ depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -2849,9 +3400,7 @@ : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf @@ -2879,14 +3428,9 @@ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi @@ -2900,8 +3444,8 @@ fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -2924,15 +3468,15 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" @@ -2959,35 +3503,35 @@ #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2997,34 +3541,34 @@ /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -3042,8 +3586,8 @@ else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -3066,35 +3610,35 @@ #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -3104,34 +3648,34 @@ /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -3140,9 +3684,9 @@ if $ac_preproc_ok; then : else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check + { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -3154,25 +3698,144 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -3194,35 +3857,32 @@ } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. @@ -3278,6 +3938,7 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <ctype.h> +#include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -3297,36 +3958,50 @@ for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF @@ -3349,11 +4024,11 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -3366,41 +4041,41 @@ #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` = yes; then cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -3409,17 +4084,17 @@ if test "${ac_cv_header_sys_mman_h+set}" = set; then - echo "$as_me:$LINENO: checking for sys/mman.h" >&5 -echo $ECHO_N "checking for sys/mman.h... $ECHO_C" >&6 + { $as_echo "$as_me:$LINENO: checking for sys/mman.h" >&5 +$as_echo_n "checking for sys/mman.h... " >&6; } if test "${ac_cv_header_sys_mman_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 fi -echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 -echo "${ECHO_T}$ac_cv_header_sys_mman_h" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 +$as_echo "$ac_cv_header_sys_mman_h" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking sys/mman.h usability" >&5 -echo $ECHO_N "checking sys/mman.h usability... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking sys/mman.h usability" >&5 +$as_echo_n "checking sys/mman.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -3430,41 +4105,38 @@ #include <sys/mman.h> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking sys/mman.h presence" >&5 -echo $ECHO_N "checking sys/mman.h presence... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking sys/mman.h presence" >&5 +$as_echo_n "checking sys/mman.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -3473,76 +4145,74 @@ /* end confdefs.h. */ #include <sys/mman.h> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) - { echo "$as_me:$LINENO: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: sys/mman.h: proceeding with the compiler's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) - { echo "$as_me:$LINENO: WARNING: sys/mman.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: sys/mman.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: sys/mman.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: sys/mman.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: sys/mman.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to qstat-users@yahoogroups.com ## ## ------------------------------------------ ## _ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac -echo "$as_me:$LINENO: checking for sys/mman.h" >&5 -echo $ECHO_N "checking for sys/mman.h... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for sys/mman.h" >&5 +$as_echo_n "checking for sys/mman.h... " >&6; } if test "${ac_cv_header_sys_mman_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else ac_cv_header_sys_mman_h=$ac_header_preproc fi -echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 -echo "${ECHO_T}$ac_cv_header_sys_mman_h" >&6 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_mman_h" >&5 +$as_echo "$ac_cv_header_sys_mman_h" >&6; } fi if test $ac_cv_header_sys_mman_h = yes; then @@ -3553,49 +4223,151 @@ case $host in *mingw32*) - { echo "$as_me:$LINENO: compiling for $host, adding -lwsock32" >&5 -echo "$as_me: compiling for $host, adding -lwsock32" >&6;} + { $as_echo "$as_me:$LINENO: compiling for $host, adding -lwsock32" >&5 +$as_echo "$as_me: compiling for $host, adding -lwsock32" >&6;} LIBS="$LIBS -lwsock32" ;; esac -echo "$as_me:$LINENO: checking whether to enable debug output" >&5 -echo $ECHO_N "checking whether to enable debug output... $ECHO_C" >&6 -# Check whether --enable-debug or --disable-debug was given. +{ $as_echo "$as_me:$LINENO: checking whether to enable optimization" >&5 +$as_echo_n "checking whether to enable optimization... " >&6; } +# Check whether --enable-optimize was given. +if test "${enable_optimize+set}" = set; then + enableval=$enable_optimize; +fi + +if test x$enable_optimize != xno; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + CPPFLAGS="" + CFLAGS="-ggdb" + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking whether to enable debug output" >&5 +$as_echo_n "checking whether to enable debug output... " >&6; } +# Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then - enableval="$enable_debug" + enableval=$enable_debug; +fi -fi; if test x$enable_debug != xno; then CPPFLAGS="$CPPFLAGS -DDEBUG" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi -echo "$as_me:$LINENO: checking whether to enable packet dumps" >&5 -echo $ECHO_N "checking whether to enable packet dumps... $ECHO_C" >&6 -# Check whether --enable-dump or --disable-dump was given. +{ $as_echo "$as_me:$LINENO: checking whether to enable packet dumps" >&5 +$as_echo_n "checking whether to enable packet dumps... " >&6; } +# Check whether --enable-dump was given. if test "${enable_dump+set}" = set; then - enableval="$enable_dump" + enableval=$enable_dump; +fi -fi; if test x$enable_dump != xno; then if test x$have_mman_h = xyes; then CPPFLAGS="$CPPFLAGS -DENABLE_DUMP" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no, sys/mman.h missing" >&5 -echo "${ECHO_T}no, sys/mman.h missing" >&6 + { $as_echo "$as_me:$LINENO: result: no, sys/mman.h missing" >&5 +$as_echo "no, sys/mman.h missing" >&6; } + fi +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check whether --with-efence was given. +if test "${with_efence+set}" = set; then + withval=$with_efence; if test x$withval != xyes ; then + LDFLAGS="${LDFLAGS} -L$withval" fi + +{ $as_echo "$as_me:$LINENO: checking for malloc in -lefence" >&5 +$as_echo_n "checking for malloc in -lefence... " >&6; } +if test "${ac_cv_lib_efence_malloc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lefence $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char malloc (); +int +main () +{ +return malloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_efence_malloc=yes else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_efence_malloc=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_efence_malloc" >&5 +$as_echo "$ac_cv_lib_efence_malloc" >&6; } +if test $ac_cv_lib_efence_malloc = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBEFENCE 1 +_ACEOF + + LIBS="-lefence $LIBS" + +fi + + fi + if test "x$GCC" = "xyes"; then case " $CFLAGS " in *[\ \ ]-Wall[\ \ ]*) ;; @@ -3603,7 +4375,7 @@ esac fi - ac_config_files="$ac_config_files Makefile template/Makefile info/Makefile" +ac_config_files="$ac_config_files Makefile template/Makefile info/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -3623,39 +4395,59 @@ # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -3664,32 +4456,18 @@ # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -3697,26 +4475,27 @@ if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} +ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -3729,22 +4508,78 @@ SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## -# Be Bourne compatible +# 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=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# 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_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 +if (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 -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -3754,33 +4589,60 @@ 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. +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); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +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 +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -3788,159 +4650,122 @@ # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` +# CDPATH. +$as_unset CDPATH -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -if expr a : '\(a\)' >/dev/null 2>&1; then +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +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=: @@ -3949,7 +4774,28 @@ as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # 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'" @@ -3958,31 +4804,14 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by qstat $as_me 2.11, which was -generated by GNU Autoconf 2.59. Invocation command line was +# values after options handling. +ac_log=" +This file was extended by qstat $as_me 2.12, which was +generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -3990,30 +4819,20 @@ CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi +config_files="`echo $ac_config_files`" +config_headers="`echo $ac_config_headers`" +config_commands="`echo $ac_config_commands`" -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. @@ -4021,14 +4840,14 @@ Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit - -V, --version print version number, then exit + -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + instantiate the configuration header FILE Configuration files: $config_files @@ -4040,83 +4859,83 @@ $config_commands Report bugs to <bug-autoconf@gnu.org>." -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -qstat config.status 2.11 -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +qstat config.status 2.12 +configured by $0, generated by GNU Autoconf 2.62, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; esac shift @@ -4130,41 +4949,55 @@ fi _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "template/Makefile" ) CONFIG_FILES="$CONFIG_FILES template/Makefile" ;; - "info/Makefile" ) CONFIG_FILES="$CONFIG_FILES info/Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "gnuconfig.h" ) CONFIG_HEADERS="$CONFIG_HEADERS gnuconfig.h" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + case $ac_config_target in + "gnuconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS gnuconfig.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "template/Makefile") CONFIG_FILES="$CONFIG_FILES template/Makefile" ;; + "info/Makefile") CONFIG_FILES="$CONFIG_FILES info/Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -4176,722 +5009,634 @@ fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") } || { - echo "$me: cannot create a temporary directory in ." >&2 + $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -# -# CONFIG_FILES section. -# +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@CPP@,$CPP,;t t -s,@EGREP@,$EGREP,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\).*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\).*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$ac_file_inputs '$ac_f'" + done - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + 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 || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + 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 ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac +_ACEOF - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub $extrasub _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_HEADER section. -# +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + rm -f "$tmp/stdin" case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in + ;; + :H) + # + # CONFIG_HEADER + # if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else - cat $tmp/config.h - rm -f $tmp/config.h + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi -# Compute $ac_file's index in $config_headers. +# Compute "$ac_file"'s index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $ac_file | $ac_file:* ) + "$ac_file" | "$ac_file":* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$ac_file : 'X\(//\)[^/]' \| \ - X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. @@ -4901,92 +5646,140 @@ # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` else continue fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + 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 || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + 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 ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. @@ -5008,4 +5801,8 @@ # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;} +fi diff -urP qstat-2.11/configure.ac qstat-2.11-20080912svn311/configure.ac --- qstat-2.11/configure.ac 2006-10-28 08:36:47.000000000 -0400 +++ qstat-2.11-20080912svn311/configure.ac 2008-09-12 14:52:23.000000000 -0400 @@ -1,4 +1,4 @@ -AC_INIT([qstat],[2.11],[qstat-users@yahoogroups.com]) +AC_INIT([qstat],[2.12],[qstat-users@yahoogroups.com]) AC_CONFIG_SRCDIR([qstat.c]) AM_CONFIG_HEADER([gnuconfig.h]) @@ -22,6 +22,17 @@ esac dnl check if user wants debug +AC_MSG_CHECKING([whether to enable optimization]) +AC_ARG_ENABLE(optimize,[ --disable-optimize turn off optimization]) +if test x$enable_optimize != xno; then + AC_MSG_RESULT([yes]) +else + CPPFLAGS="" + CFLAGS="-ggdb" + AC_MSG_RESULT([no]) +fi + +dnl check if user wants debug AC_MSG_CHECKING([whether to enable debug output]) AC_ARG_ENABLE(debug,[ --disable-debug turn off debugging code]) if test x$enable_debug != xno; then @@ -44,6 +55,14 @@ AC_MSG_RESULT([no]) fi +AC_ARG_WITH(efence, +[ --with-efence=<path> Use electric fence for malloc debugging.], + if test x$withval != xyes ; then + LDFLAGS="${LDFLAGS} -L$withval" + fi + AC_CHECK_LIB(efence,malloc) +) + dnl Use -Wall if we have gcc. changequote(,)dnl if test "x$GCC" = "xyes"; then diff -urP qstat-2.11/.cvsignore qstat-2.11-20080912svn311/.cvsignore --- qstat-2.11/.cvsignore 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/.cvsignore 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,16 @@ +Makefile +Makefile.in +configure +gnuconfig.h +gnuconfig.h.in +INSTALL +aclocal.m4 +install-sh +missing +depcomp +autom4te.cache +stamp-h1 +config.log +config.status +.deps +qstat diff -urP qstat-2.11/debug.c qstat-2.11-20080912svn311/debug.c --- qstat-2.11/debug.c 2006-05-24 10:26:00.000000000 -0400 +++ qstat-2.11-20080912svn311/debug.c 2008-09-12 14:52:23.000000000 -0400 @@ -15,6 +15,8 @@ #ifndef _WIN32 #include <unistd.h> #include <sys/param.h> +#else +#include <stdarg.h> #endif #include <sys/types.h> #include <sys/stat.h> @@ -25,14 +27,14 @@ #include <stdarg.h> #ifdef DEBUG + void _debug(const char* file, int line, const char* function, int level, const char* fmt, ...) { va_list ap; char buf[9]; - time_t now; + time_t now = time( NULL ); - now = time(NULL); - strftime(buf,9,"%T",localtime(&now)); + strftime(buf,9,"%H:%M:%S", localtime( &now ) ); fprintf(stderr, "debug(%d) %s %s:%d %s() - ", level, buf, file, line, function); @@ -107,7 +109,13 @@ } void -print_packet( struct qserver *server, const char *buf, int buflen) +print_packet( struct qserver *server, const char *buf, int buflen ) +{ + output_packet( server, buf, buflen, 0 ); +} + +void +output_packet( struct qserver *server, const char *buf, int buflen, int to ) { static char *hex= "0123456789abcdef"; unsigned char *p= (unsigned char*)buf; @@ -115,27 +123,40 @@ char line[256]; if ( server != NULL) - fprintf( stderr, "FROM %s len %d\n", server->arg, buflen ); - - for ( i= buflen; i ; offset+= 16) { - memset( line, ' ', 256); - h= 0; - h+= sprintf( line, "%5d:", offset); - a= astart = h + 16*2 + 16/4 + 2; - for ( b=16; b && i; b--, i--, p++) { - if ( (b & 3) == 0) - line[h++]= ' '; - line[h++]= hex[*p >> 4]; - line[h++]= hex[*p & 0xf]; - if ( isprint( *p)) - line[a++]= *p; - else - line[a++]= '.'; - if((a-astart)==8) line[a++] = ' '; + { + fprintf( stderr, "%s %s len %d\n", ( to ) ? "TO" : "FROM", server->arg, buflen ); } - line[a]= '\0'; - fputs( line, stderr); - fputs( "\n", stderr); + + for ( i= buflen; i ; offset+= 16) + { + memset( line, ' ', 256); + h= 0; + h+= sprintf( line, "%5d:", offset); + a= astart = h + 16*2 + 16/4 + 2; + for ( b=16; b && i; b--, i--, p++) + { + if ( (b & 3) == 0) + { + line[h++]= ' '; + } + line[h++]= hex[*p >> 4]; + line[h++]= hex[*p & 0xf]; + if ( isprint( *p)) + { + line[a++]= *p; + } + else + { + line[a++]= '.'; + } + if((a-astart)==8) + { + line[a++] = ' '; + } + } + line[a]= '\0'; + fputs( line, stderr); + fputs( "\n", stderr); } fputs( "\n", stderr); } diff -urP qstat-2.11/debug.h qstat-2.11-20080912svn311/debug.h --- qstat-2.11/debug.h 2006-05-24 10:26:00.000000000 -0400 +++ qstat-2.11-20080912svn311/debug.h 2008-09-12 14:52:23.000000000 -0400 @@ -12,21 +12,24 @@ #include "qstat.h" -// NOTE: Windows doesn't support debugging ATM -#ifdef _WIN32 - #define debug 0 && -#else - #ifdef DEBUG - #include <stdarg.h> + +#ifdef DEBUG + #include <stdarg.h> + #ifdef _WIN32 + void _debug(const char* file, int line, const char* function, int level, const char* fmt, ...); + #define debug(level,fmt,...) \ + if( level <= get_debug_level() ) \ + _debug(__FILE__,__LINE__,__FUNCTION__,level,fmt,__VA_ARGS__) + #else void _debug(const char* file, int line, const char* function, int level, const char* fmt, ...) - GCC_FORMAT_PRINTF(5, 6); + GCC_FORMAT_PRINTF(5, 6); #define debug(level,fmt,rem...) \ - if( level <= get_debug_level() ) \ - _debug(__FILE__,__LINE__,__FUNCTION__,level,fmt,##rem) - #else - #define debug(...) - #endif -#endif + if( level <= get_debug_level() ) \ + _debug(__FILE__,__LINE__,__FUNCTION__,level,fmt,##rem) + #endif // _WIN32 +#else + #define debug(...) +#endif // DEBUG void dump_packet(const char* buf, int buflen); @@ -37,5 +40,6 @@ void set_debug_level (int level); void print_packet( struct qserver *server, const char *buf, int buflen ); +void output_packet( struct qserver *server, const char *buf, int buflen, int to ); #endif diff -urP qstat-2.11/depcomp qstat-2.11-20080912svn311/depcomp --- qstat-2.11/depcomp 2006-04-22 20:59:37.000000000 -0400 +++ qstat-2.11-20080912svn311/depcomp 2007-09-18 10:10:46.000000000 -0400 @@ -1,9 +1,7 @@ #! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2005-07-09.11 -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# depcomp - compile a program generating dependencies as side-effects +# Copyright 1999, 2000, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -27,45 +25,22 @@ # Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to <bug-automake@gnu.org>. -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" @@ -287,43 +262,27 @@ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + else + tmpdepfile="$tmpdepfile2" + fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. @@ -467,8 +426,7 @@ done "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" @@ -519,12 +477,3 @@ esac exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff -urP qstat-2.11/doom3.c qstat-2.11-20080912svn311/doom3.c --- qstat-2.11/doom3.c 2006-07-11 20:28:49.000000000 -0400 +++ qstat-2.11-20080912svn311/doom3.c 2008-09-12 14:52:23.000000000 -0400 @@ -131,7 +131,7 @@ return buf; } -void send_doom3master_request_packet( struct qserver *server) +int send_doom3master_request_packet( struct qserver *server) { int rc = 0; int packet_len = -1; @@ -146,7 +146,7 @@ rc= send( server->fd, packet, packet_len, 0); if ( rc == SOCKET_ERROR) { - perror( "send"); + return send_error( server, rc ); } if ( server->retry1 == n_retries) @@ -160,9 +160,11 @@ } server->retry1--; server->n_packets++; + + return 1; } -void send_quake4master_request_packet( struct qserver *server) +int send_quake4master_request_packet( struct qserver *server) { int rc = 0; int packet_len = -1; @@ -177,7 +179,7 @@ rc= send( server->fd, packet, packet_len, 0); if ( rc == SOCKET_ERROR) { - perror( "send"); + return send_error( server, rc ); } if ( server->retry1 == n_retries) @@ -191,17 +193,17 @@ } server->retry1--; server->n_packets++; + + return 1; } static const char doom3_masterresponse[] = "\xFF\xFFservers"; -void -deal_with_doom3master_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_doom3master_packet( struct qserver *server, char *rawpkt, int pktlen) { char* pkt, *dest; int len; - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); + server->ping_total+= time_delta( &packet_recv_time, &server->packet_time1); if ( pktlen < sizeof(doom3_masterresponse) + 6 // at least one server || (pktlen - sizeof(doom3_masterresponse)) % 6 @@ -210,8 +212,7 @@ server->server_name= SERVERERROR; server->master_pkt_len = 0; malformed_packet(server, "too short or invalid response"); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } server->retry1 = 0; // received at least one packet so no need to retry @@ -239,16 +240,22 @@ server->n_servers= server->master_pkt_len / 6; debug(2, "%d servers added", server->n_servers); + + return 0; } static const char doom3_inforesponse[] = "\xFF\xFFinfoResponse"; static unsigned MAX_DOOM3_ASYNC_CLIENTS = 32; -static void _deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen, unsigned version ) +static int _deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen, unsigned version ) { char *ptr = rawpkt; char *end = rawpkt + pktlen; int type = 0; + int size = 0; + int tail_size = 4; + int viewers = 0; + int tv = 0; unsigned num_players = 0; unsigned challenge = 0; unsigned protocolver = 0; @@ -269,11 +276,18 @@ memcmp( doom3_inforesponse, ptr, sizeof(doom3_inforesponse)) != 0 ) { malformed_packet(server, "too short or invalid response"); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } ptr += sizeof(doom3_inforesponse); + if ( 5 == version ) + { + // TaskID + ptr += 4; + // osmask + ranked + tail_size++; + } + challenge = swap_long_from_little(ptr); ptr += 4; @@ -283,20 +297,28 @@ snprintf(tmp, sizeof(tmp), "%u.%u", protocolver >> 16, protocolver & 0xFFFF); debug(2, "challenge: 0x%08X, protocol: %s (0x%X)", challenge, tmp, protocolver); + server->protocol_version = protocolver; + add_rule( server, "protocol", tmp, NO_FLAGS ); + + + if ( 5 == version ) + { + // Size Long + size = swap_long_from_little(ptr); + debug( 2, "Size = %d", size ); + ptr += 4; + } + // Commented out until we have a better way to specify the expected version // This is due to prey demo requiring version 4 yet prey retail version 3 /* if( protocolver >> 16 != version ) { malformed_packet(server, "protocol version %u, expected %u", protocolver >> 16, version ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } */ - server->protocol_version = protocolver; - add_rule( server, "protocol", tmp, NO_FLAGS ); - while ( ptr < end ) { // server info: @@ -310,8 +332,7 @@ if ( !ptr ) { malformed_packet( server, "no rule key" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } keylen = ptr - key; @@ -320,19 +341,19 @@ if ( !ptr ) { malformed_packet( server, "no rule value" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } vallen = ptr - val; ++ptr; - debug( 2, "key:%s=%s:", key, val); - if(keylen == 0 && vallen == 0) + if( keylen == 0 && vallen == 0 ) { type = 1; break; // end } + debug( 2, "key:%s=%s:", key, val); + // Lets see what we've got if ( 0 == strcasecmp( key, "si_name" ) ) { @@ -346,18 +367,46 @@ else if( 0 == strcasecmp( key, "si_version" ) ) { // format: +x // DOOM 1.0.1262.win-x86 Jul 8 2004 16:46:37 server->protocol_version = atoi( val+1 ); } #endif else if( 0 == strcasecmp( key, "si_map" ) ) { + if ( 5 == version ) + { + // ET:QW reports maps/<mapname>.entities + // so we strip that here if it exists + char *tmpp = strstr( val, ".entities" ); + if ( NULL != tmpp ) + { + *tmpp = '\0'; + } + + if ( 0 == strncmp( val, "maps/", 5 ) ) + { + val += 5; + } + } server->map_name = strdup( val ); } - else if( 0 == strcasecmp( key, "si_maxplayers" ) ) + else if ( 0 == strcasecmp( key, "si_maxplayers" ) ) { server->max_players = atoi( val ); } + else if ( 0 == strcasecmp( key, "ri_maxViewers" ) ) + { + char max[20]; + sprintf( max, "%d", server->max_players ); + add_rule( server, "si_maxplayers", max, NO_FLAGS ); + server->max_players = atoi( val ); + } + else if ( 0 == strcasecmp( key, "ri_numViewers" ) ) + { + viewers = atoi( val ); + tv = 1; + } add_rule( server, key, val, NO_FLAGS ); } @@ -367,68 +416,77 @@ // no more info should be player headers here as we // requested it malformed_packet( server, "player info missing" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } // now each player details - while( ptr < end ) + while( ptr < end - tail_size ) { struct player *player; char *val; unsigned char player_id = *ptr++; - short prediction = 0; + short ping = 0; unsigned rate = 0; - if(player_id == MAX_DOOM3_ASYNC_CLIENTS) - break; - - /* id's are not steady - if(player_id != num_players) + if( MAX_DOOM3_ASYNC_CLIENTS == player_id ) { - malformed_packet(server, "unexpected player id"); - cleanup_qserver( server, 1); - return; + break; } - */ + debug( 2, "ID = %d\n", player_id ); - if ( ptr + 7 > end ) // 2 pred + 4 rate + empty player name ('\0') + // Note: id's are not steady + if ( ptr + 7 > end ) // 2 ping + 4 rate + empty player name ('\0') { // run off the end and shouldnt have malformed_packet( server, "player info too short" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } player = add_player( server, player_id ); + if(!player) + { + malformed_packet( server, "duplicate player id" ); + return PKT_ERROR; + } + // doesnt support score so set a sensible default player->score = 0; player->frags = 0; - prediction = swap_short_from_little(ptr); + // Ping + ping = swap_short_from_little(ptr); + player->ping = ping; ptr += 2; - player->ping = prediction; // seems to be ping - - rate = swap_long_from_little(ptr); - ptr += 4; + if ( 5 != version || 0xa0013 < protocolver ) + { + // Rate + rate = swap_long_from_little(ptr); + { + char buf[16]; + snprintf(buf, sizeof(buf), "%u", rate); + player_add_info(player, "rate", buf, NO_FLAGS); + } + ptr += 4; + } + if ( 5 == version && ( ( 0xd0009 == protocolver || 0xd000a == protocolver ) && 0 != num_players ) ) // v13.9 or v13.10 { - char buf[16]; - snprintf(buf, sizeof(buf), "%u", rate); - player_add_info(player, "rate", buf, NO_FLAGS); + // Fix the packet offset due to the single bit used for bot + // which realigns at the byte boundary for the player name + ptr++; } + // Name val = ptr; ptr = memchr(ptr, '\0', end-ptr); if ( !ptr ) { malformed_packet( server, "player name not null terminated" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } - ++ptr; player->name = strdup( val ); + ptr++; if( 2 == version ) { @@ -437,25 +495,134 @@ if ( !ptr ) { malformed_packet( server, "player clan not null terminated" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } - ++ptr; player->tribe_tag = strdup( val ); + ptr++; + debug( 2, "Player[%d] = %s, ping %hu, rate %u, id %hhu, clan %s", + num_players, player->name, ping, rate, player_id, player->tribe_tag); } + else if ( 5 == version ) + { + if ( 0xa0011 <= protocolver ) // clan tag since 10.17 + { + // clantag position + ptr++; + + // clantag + val = ptr; + ptr = memchr(ptr, '\0', end-ptr); + if ( !ptr ) + { + malformed_packet( server, "player clan not null terminated" ); + return PKT_ERROR; + } + player->tribe_tag = strdup( val ); + ptr++; + } - debug( 2, "Player[%d] = %s, prediction %hu, rate %u, id %hhu, clan %s", - num_players, player->name, prediction, rate, player_id, player->tribe_tag); + // Bot flag + if ( 0xd0009 == protocolver || 0xd000a == protocolver ) // v13.9 or v13.10 + { + // Bot flag is a single bit so need to realign everything from here on in :( + int i; + unsigned char *tp = (unsigned char*)ptr; + player->type_flag = (*tp)<<7; + + // alignment is reset at the end + for( i = 0; i < 8 && tp < (unsigned char*)end; i++ ) + { + *tp = (*tp)>>1 | *(tp+1)<<7; + tp++; + } + } + else + { + player->type_flag = *ptr++; + } + + if ( 0xa0011 <= protocolver ) // clan tag since 10.17 + { + debug( 2, "Player[%d] = %s, ping %hu, rate %u, id %hhu, bot %hhu, clan %s", + num_players, player->name, ping, rate, player_id, player->type_flag, player->tribe_tag); + } + else + { + debug( 2, "Player[%d] = %s, ping %hu, rate %u, id %hhu, bot %hhu", + num_players, player->name, ping, rate, player_id, player->type_flag ); + } + } + else + { + debug( 2, "Player[%d] = %s, ping %hu, rate %u, id %hhu", + num_players, player->name, ping, rate, player_id ); + } ++num_players; } - if(end - ptr >= 4) + if( end - ptr >= 4 ) { + // OS Mask snprintf(tmp, sizeof(tmp), "0x%X", swap_long_from_little(ptr)); add_rule( server, "osmask", tmp, NO_FLAGS ); debug( 2, "osmask %s", tmp); ptr += 4; + + if ( 5 == version && end - ptr >= 1 ) + { + // Ranked flag + snprintf( tmp, sizeof(tmp), "%hhu", *ptr++ ); + add_rule( server, "ranked", tmp, NO_FLAGS ); + + if ( end - ptr >= 5 ) + { + // Time Left + snprintf( tmp, sizeof(tmp), "%d", swap_long_from_little( ptr ) ); + add_rule( server, "timeleft", tmp, NO_FLAGS ); + ptr += 4; + + // Game State + snprintf( tmp, sizeof(tmp), "%hhu", *ptr++ ); + add_rule( server, "gamestate", tmp, NO_FLAGS ); + + if ( end - ptr >= 1 ) + { + // Server Type + unsigned char servertype = *ptr++; + snprintf( tmp, sizeof(tmp), "%hhu", servertype ); + add_rule( server, "servertype", tmp, NO_FLAGS ); + + switch ( servertype ) + { + case 0: // Regular Server + // Interested Clients + snprintf( tmp, sizeof(tmp), "%hhu", *ptr++ ); + add_rule( server, "interested_clients", tmp, NO_FLAGS ); + break; + + case 1: // TV Server + // Connected Clients + snprintf( tmp, sizeof(tmp), "%d", swap_long_from_little( ptr ) ); + ptr+=4; + add_rule( server, "interested_clients", tmp, NO_FLAGS ); + + // Max Clients + snprintf( tmp, sizeof(tmp), "%d", swap_long_from_little( ptr ) ); + ptr+=4; + add_rule( server, "interested_clients", tmp, NO_FLAGS ); + break; + + default: + // Unknown + if ( show_errors ) + { + fprintf( stderr, "Unknown server type %d\n", servertype ); + } + } + } + } + } } else { @@ -469,28 +636,40 @@ } #endif - server->num_players = num_players; + if ( 0 == tv ) + { + debug( 2, "Num players = %d", num_players ); + server->num_players = num_players; + } + else + { + server->num_players = viewers; + } + + return DONE_FORCE; +} - cleanup_qserver( server, 1 ); - return; +int deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen) +{ + return _deal_with_doom3_packet( server, rawpkt, pktlen, 1 ); } -void deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_quake4_packet( struct qserver *server, char *rawpkt, int pktlen) { - _deal_with_doom3_packet( server, rawpkt, pktlen, 1 ); + return _deal_with_doom3_packet( server, rawpkt, pktlen, 2 ); } -void deal_with_quake4_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_prey_demo_packet( struct qserver *server, char *rawpkt, int pktlen ) { - _deal_with_doom3_packet( server, rawpkt, pktlen, 2 ); + return _deal_with_doom3_packet( server, rawpkt, pktlen, 4 ); } -void deal_with_prey_demo_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_prey_packet( struct qserver *server, char *rawpkt, int pktlen ) { - _deal_with_doom3_packet( server, rawpkt, pktlen, 4 ); + return _deal_with_doom3_packet( server, rawpkt, pktlen, 3 ); } -void deal_with_prey_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_etqw_packet( struct qserver *server, char *rawpkt, int pktlen ) { - _deal_with_doom3_packet( server, rawpkt, pktlen, 3 ); + return _deal_with_doom3_packet( server, rawpkt, pktlen, 5 ); } diff -urP qstat-2.11/doom3.h qstat-2.11-20080912svn311/doom3.h --- qstat-2.11/doom3.h 2006-06-22 07:13:51.000000000 -0400 +++ qstat-2.11-20080912svn311/doom3.h 2008-09-12 14:52:23.000000000 -0400 @@ -21,12 +21,16 @@ #define PREY_DEFAULT_PORT 27719 #define PREY_MASTER_DEFAULT_PORT 27655 -void send_doom3master_request_packet( struct qserver *server); -void deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen); +#define ETQW_DEFAULT_PORT 27733 -void send_quake4master_request_packet( struct qserver *server); -void deal_with_quake4_packet( struct qserver *server, char *rawpkt, int pktlen); +int send_doom3master_request_packet( struct qserver *server); +int deal_with_doom3_packet( struct qserver *server, char *rawpkt, int pktlen); -void deal_with_prey_packet( struct qserver *server, char *rawpkt, int pktlen); +int send_quake4master_request_packet( struct qserver *server); +int deal_with_quake4_packet( struct qserver *server, char *rawpkt, int pktlen); + +int deal_with_prey_packet( struct qserver *server, char *rawpkt, int pktlen); + +int deal_with_etqw_packet( struct qserver *server, char *rawpkt, int pktlen); #endif diff -urP qstat-2.11/fl.c qstat-2.11-20080912svn311/fl.c --- qstat-2.11/fl.c 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/fl.c 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,512 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * Frontlines-Fuel of War protocol + * Copyright 2008 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + * + */ + +#include <sys/types.h> +#ifndef _WIN32 +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#else +#include <winsock.h> +#endif + +#include <stdlib.h> +#include <stdio.h> + +#include "debug.h" +#include "qstat.h" +#include "packet_manip.h" + +#define FL_GETCHALLENGE "\xFF\xFF\xFF\xFF\x57" +#define FL_CHALLENGERESPONSE 0x41 +#define FL_INFO "\xFF\xFF\xFF\xFF\x46LSQ" +#define FL_INFORESPONSE 0x49 +#define FL_PLAYER "\xFF\xFF\xFF\xFF\x55" +#define FL_PLAYERRESPONSE 0x44 +#define FL_RULES "\xFF\xFF\xFF\xFF\x56" +#define FL_RULESRESPONSE 0x45 + +struct fl_status +{ + unsigned sent_challenge : 1; + unsigned have_challenge : 1; + unsigned sent_info : 1; + unsigned have_info : 1; + unsigned sent_player : 1; + unsigned have_player : 1; + unsigned sent_rules : 1; + unsigned have_rules : 1; + unsigned challenge; + unsigned char type; +}; + +int send_fl_request_packet(struct qserver *server) +{ + struct fl_status* status = (struct fl_status*)server->master_query_tag; + + if( SOCKET_ERROR == qserver_send_initial(server, FL_INFO, sizeof(FL_INFO) - 1) ) + { + return SOCKET_ERROR; + } + + status->sent_info = 1; + status->type = 0; + + return 0; +} + +int send_fl_rule_request_packet(struct qserver *server) +{ + struct fl_status* status = (struct fl_status*)server->master_query_tag; + + if ( 1 >= status->type ) + { + // Not supported + return PKT_ERROR; + } + + if(!get_server_rules && !get_player_info) + { + return DONE_FORCE; + } + + do + { + if(!status->have_challenge) + { + debug(3, "sending challenge"); + if( SOCKET_ERROR == qserver_send_initial(server, FL_GETCHALLENGE, sizeof(FL_GETCHALLENGE)-1) ) + { + return SOCKET_ERROR; + } + status->sent_challenge = 1; + break; + } + else if(get_server_rules && !status->have_rules) + { + char buf[sizeof(FL_RULES)-1+4] = FL_RULES; + memcpy(buf+sizeof(FL_RULES)-1, &status->challenge, 4); + debug(3, "sending rule query"); + if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) ) + { + return SOCKET_ERROR; + } + status->sent_rules = 1; + break; + } + else if(get_player_info && !status->have_player) + { + char buf[sizeof(FL_PLAYER)-1+4] = FL_PLAYER; + memcpy(buf+sizeof(FL_PLAYER)-1, &status->challenge, 4); + debug(3, "sending player query"); + if( SOCKET_ERROR == qserver_send_initial(server, buf, sizeof(buf)) ) + { + return SOCKET_ERROR; + } + status->sent_player = 1; + break; + } + else + { + debug(3, "timeout"); + // we are probably called due to timeout, restart. + status->have_challenge = 0; + status->have_rules = 0; + } + } while(1); + + return 0; +} + +int deal_with_fl_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + struct fl_status* status = (struct fl_status*)server->master_query_tag; + char* pkt = rawpkt; + char buf[16]; + char* str; + unsigned cnt; + unsigned short tmp_short; + + if(server->server_name == NULL) + { + server->ping_total += time_delta( &packet_recv_time, &server->packet_time1); + server->n_requests++; + } + + if(pktlen < 5) goto out_too_short; + + if( 0 == memcmp(pkt, "\xFF\xFF\xFF\xFE", 4) ) + { + // fragmented packet + unsigned char pkt_index, pkt_max; + unsigned int pkt_id; + SavedData *sdata; + + if(pktlen < 9) goto out_too_short; + + // format: + // int Header + // int RequestId + // byte PacketNumber + // byte NumPackets + // Short SizeOfPacketSplits + + // Header + pkt += 4; + + // RequestId + pkt_id = ntohl( *(long *)pkt ); + debug( 3, "RequestID: %d", pkt_id ); + pkt += 4; + + // The next two bytes are: + // 1. the max packets sent ( byte ) + // 2. the index of this packet starting from 0 ( byte ) + // 3. Size of the split ( short ) + if(pktlen < 10) goto out_too_short; + + // PacketNumber + pkt_index = ((unsigned char)*pkt); + + // NumPackates + pkt_max = ((unsigned char)*(pkt+1)); + + // SizeOfPacketSplits + debug( 3, "packetid[2]: 0x%hhx => idx: %hhu, max: %hhu", *pkt, pkt_index, pkt_max ); + pkt+=4; + pktlen -= 12; + + // pkt_max is the total number of packets expected + // pkt_index is a bit mask of the packets received. + if ( server->saved_data.data == NULL ) + { + sdata = &server->saved_data; + } + else + { + sdata = (SavedData*) calloc( 1, sizeof(SavedData)); + sdata->next = server->saved_data.next; + server->saved_data.next = sdata; + } + + sdata->pkt_index = pkt_index; + sdata->pkt_max = pkt_max; + sdata->pkt_id = pkt_id; + sdata->datalen = pktlen; + sdata->data= (char*)malloc( pktlen ); + if ( NULL == sdata->data ) + { + malformed_packet(server, "Out of memory"); + return MEM_ERROR; + } + + memcpy( sdata->data, pkt, sdata->datalen ); + + // combine_packets will call us recursively + return combine_packets( server ); + } + else if ( 0 != memcmp(pkt, "\xFF\xFF\xFF\xFF", 4) ) + { + malformed_packet(server, "invalid packet header"); + return PKT_ERROR; + } + + pkt += 4; + pktlen -= 4; + + pktlen -= 1; + debug( 2, "FL type = 0x%x", *pkt ); + switch(*pkt++) + { + case FL_CHALLENGERESPONSE: + if(pktlen < 4) goto out_too_short; + memcpy(&status->challenge, pkt, 4); + // do not count challenge as retry + if(!status->have_challenge && server->retry1 != n_retries) + { + ++server->retry1; + if(server->n_retries) + { + --server->n_retries; + } + } + status->have_challenge = 1; + debug(3, "challenge %x", status->challenge); + break; + + case FL_INFORESPONSE: + if(pktlen < 1) goto out_too_short; + status->type = *pkt; + if ( *pkt > 1 && ( get_server_rules || get_player_info ) ) + { + server->next_rule = ""; // trigger calling send_fl_rule_request_packet + } + snprintf(buf, sizeof(buf), "%hhX", *pkt); + add_rule(server, "protocol", buf, 0); + pktlen--; + pkt++; + + // ServerName + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + server->server_name = strdup(pkt); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + // MapName + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + server->map_name = strdup(pkt); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + // ModName + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + server->game = strdup(pkt); + add_rule(server, "modname", pkt, 0); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + // GameMode + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + add_rule(server, "gamemode", pkt, 0); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + // GameDescription + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + add_rule(server, "gamedescription", pkt, 0); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + // GameVersion + str = memchr(pkt, '\0', pktlen); + if(!str) goto out_too_short; + add_rule(server, "gameversion", pkt, 0); + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + if( pktlen < 13 ) + { + goto out_too_short; + } + + // GamePort + tmp_short = ((unsigned short)pkt[0] <<8 ) | ((unsigned short)pkt[1]); + change_server_port( server, tmp_short, 0 ); + pkt += 2; + + // Num Players + server->num_players = (unsigned char)*pkt++; + + // Max Players + server->max_players = (unsigned char)*pkt++; + + // Dedicated + add_rule(server, "dedicated", ( 'd' == *pkt++) ? "1" : "0", 0); + + // OS + switch( *pkt ) + { + case 'l': + add_rule(server, "sv_os", "linux", 0); + break; + + case 'w': + add_rule(server, "sv_os", "windows", 0); + break; + + default: + buf[0] = *pkt; + buf[1] = '\0'; + add_rule(server, "sv_os", buf, 0); + break; + } + pkt++; + + // Passworded + add_rule(server, "passworded", ( *pkt++ ) ? "1" : "0" , 0); + + // Anticheat + add_rule(server, "passworded", ( *pkt++ ) ? "1" : "0" , 0); + + // FrameTime + sprintf( buf, "%hhu", *pkt++ ); + add_rule(server, "frametime", buf , 0); + + // Round + sprintf( buf, "%hhu", *pkt++ ); + add_rule(server, "round", buf , 0); + + // RoundMax + sprintf( buf, "%hhu", *pkt++ ); + add_rule(server, "roundmax", buf , 0); + + // RoundSeconds + tmp_short = ((unsigned short)pkt[0] <<8 ) | ((unsigned short)pkt[1]); + sprintf( buf, "%hhu", tmp_short ); + add_rule(server, "roundseconds", buf , 0); + pkt += 2; + + status->have_info = 1; + + server->retry1 = n_retries; + + server->next_player_info = server->num_players; + + break; + + case FL_RULESRESPONSE: + if(pktlen < 2) goto out_too_short; + + cnt = ((unsigned char)pkt[0] << 8 ) + ((unsigned char)pkt[1]); + pktlen -= 2; + pkt += 2; + + debug(3, "num_rules: %d", cnt); + + for(;cnt && pktlen > 0; --cnt) + { + char* key, *value; + str = memchr(pkt, '\0', pktlen); + if(!str) break; + key = pkt; + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + str = memchr(pkt, '\0', pktlen); + if(!str) break; + value = pkt; + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + add_rule(server, key, value, NO_FLAGS); + } + + if(cnt) + { + malformed_packet(server, "packet contains too few rules, missing %d", cnt); + server->missing_rules = 1; + } + if(pktlen) + malformed_packet(server, "garbage at end of rules, %d bytes left", pktlen); + + status->have_rules = 1; + + server->retry1 = n_retries; + + break; + + case FL_PLAYERRESPONSE: + + if(pktlen < 1) goto out_too_short; + + cnt = (unsigned char)pkt[0]; + pktlen -= 1; + pkt += 1; + + debug(3, "num_players: %d", cnt); + + for(;cnt && pktlen > 0; --cnt) + { + unsigned idx; + const char* name; + struct player* p; + + // Index + idx = *pkt++; + --pktlen; + + // PlayerName + str = memchr(pkt, '\0', pktlen); + if(!str) break; + name = pkt; + pktlen -= str-pkt+1; + pkt += str-pkt+1; + + if(pktlen < 8) goto out_too_short; + + debug(3, "player index %d", idx); + p = add_player(server, server->n_player_info); + if(p) + { + union + { + int i; + float fl; + } temp; + + p->name = strdup(name); + + // Score + p->frags = ntohl( *(unsigned int *)pkt ); + + // TimeConnected + temp.i = ntohl( *(unsigned int *)(pkt+4) ); + p->connect_time = temp.fl; + + // Ping + p->ping = 0; + p->ping = ntohs( *(unsigned int *)(pkt+8) ); + //((unsigned char*)&p->ping)[0] = pkt[9]; + //((unsigned char*)&p->ping)[1] = pkt[8]; + + // ProfileId + //p->profileid = ntohl( *(unsigned int *)pkt+10 ); + + // Team + p->team = *(pkt+14); +//fprintf( stderr, "Player: '%s', Frags: %u, Time: %u, Ping: %hu, Team: %d\n", p->name, p->frags, p->connect_time, p->ping, p->team ); + } + pktlen -= 15; + pkt += 15; + } + +#if 0 // seems to be a rather normal condition + if(cnt) + { + malformed_packet(server, "packet contains too few players, missing %d", cnt); + } +#endif + if(pktlen) + malformed_packet(server, "garbage at end of player info, %d bytes left", pktlen); + + status->have_player = 1; + + server->retry1 = n_retries; + + break; + + default: + malformed_packet(server, "invalid packet id %hhx", *--pkt); + return PKT_ERROR; + } + + if( + (!get_player_info || (get_player_info && status->have_player)) && + (!get_server_rules || (get_server_rules && status->have_rules)) + ) + { + server->next_rule = NULL; + } + + return DONE_AUTO; + +out_too_short: + malformed_packet(server, "packet too short"); + + return PKT_ERROR; +} + +// vim: sw=4 ts=4 noet diff -urP qstat-2.11/fl.h qstat-2.11-20080912svn311/fl.h --- qstat-2.11/fl.h 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/fl.h 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,19 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * Frontlines-Fuel of War protocol + * Copyright 2008 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + */ +#ifndef QSTAT_FL_H +#define QSTAT_FL_H + +#include "qserver.h" + +int send_fl_request_packet(struct qserver *server); +int send_fl_rule_request_packet(struct qserver *server); +int deal_with_fl_packet(struct qserver *server, char *rawpkt, int pktlen); + +#endif diff -urP qstat-2.11/gitmktar qstat-2.11-20080912svn311/gitmktar --- qstat-2.11/gitmktar 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/gitmktar 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,11 @@ +#!/bin/sh + +# make snapshot tar archive from git-svn repo +# +NAME=qstat +VERSION=2.11 +LAST_COMMIT=(`git-rev-list --timestamp HEAD^..HEAD`) +DATE=`date +%Y%m%d%H%M -d "1970-01-01 00:00 UTC $LAST_COMMIT seconds"` +fn=$NAME-${VERSION}_$DATE.tar.bz2 +git archive --prefix=$NAME-${VERSION}_$DATE/ HEAD | bzip2 > $fn +echo "version ${VERSION}_$DATE -> $fn" diff -urP qstat-2.11/gnuconfig.h.in qstat-2.11-20080912svn311/gnuconfig.h.in --- qstat-2.11/gnuconfig.h.in 2006-10-28 08:37:30.000000000 -0400 +++ qstat-2.11-20080912svn311/gnuconfig.h.in 2008-09-12 15:00:25.000000000 -0400 @@ -3,6 +3,9 @@ /* Define to 1 if you have the <inttypes.h> header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the `efence' library (-lefence). */ +#undef HAVE_LIBEFENCE + /* Define to 1 if you have the <memory.h> header file. */ #undef HAVE_MEMORY_H diff -urP qstat-2.11/gps.c qstat-2.11-20080912svn311/gps.c --- qstat-2.11/gps.c 2006-06-09 11:30:11.000000000 -0400 +++ qstat-2.11-20080912svn311/gps.c 2008-09-12 14:52:23.000000000 -0400 @@ -59,13 +59,13 @@ return 0; } -void send_gps_request_packet( struct qserver *server ) +int send_gps_request_packet( struct qserver *server ) { - send_packet( server, server->type->status_packet, server->type->status_len ); + return send_packet( server, server->type->status_packet, server->type->status_len ); } -void deal_with_gps_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_gps_packet( struct qserver *server, char *rawpkt, int pktlen ) { char *s, *key, *value, *end; struct player *player = NULL; @@ -465,6 +465,8 @@ ( server->num_players < 0 && id_minor >= 3) ) { - cleanup_qserver( server, 1); + return DONE_FORCE; } + + return INPROGRESS; } diff -urP qstat-2.11/gps.h qstat-2.11-20080912svn311/gps.h --- qstat-2.11/gps.h 2005-06-20 08:43:46.000000000 -0400 +++ qstat-2.11-20080912svn311/gps.h 2008-09-12 14:52:23.000000000 -0400 @@ -13,8 +13,8 @@ #include "qserver.h" // Packet processing methods -void deal_with_gps_packet( struct qserver *server, char *pkt, int pktlen ); -void send_gps_request_packet( struct qserver *server ); +int deal_with_gps_packet( struct qserver *server, char *pkt, int pktlen ); +int send_gps_request_packet( struct qserver *server ); #endif diff -urP qstat-2.11/gs2.c qstat-2.11-20080912svn311/gs2.c --- qstat-2.11/gs2.c 2006-08-24 14:52:25.000000000 -0400 +++ qstat-2.11-20080912svn311/gs2.c 2008-09-12 14:52:23.000000000 -0400 @@ -20,7 +20,7 @@ #include "qstat.h" #include "packet_manip.h" -void send_gs2_request_packet( struct qserver *server ) +int send_gs2_request_packet( struct qserver *server ) { // The below should work but seems to make no difference to what some // servers send @@ -35,13 +35,13 @@ server->type->status_packet[9] = 0x00; } - send_packet( server, server->type->status_packet, server->type->status_len ); + return send_packet( server, server->type->status_packet, server->type->status_len ); } // See the following for protocol details: // http://dev.kquery.com/index.php?article=42 -void deal_with_gs2_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_gs2_packet( struct qserver *server, char *rawpkt, int pktlen ) { char *ptr = rawpkt; char *end = rawpkt + pktlen; @@ -57,8 +57,7 @@ if ( pktlen < 15 ) { // invalid packet? - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } server->n_servers++; @@ -95,8 +94,7 @@ { malformed_packet( server, "no player headers" ); } - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } ptr += var_len + 1; @@ -125,6 +123,11 @@ { server->map_name = strdup( val ); } + else if( 0 == strcmp( var, "map" ) ) + { + // For BF2MC compatibility + server->map_name = strdup( val ); + } else if( 0 == strcmp( var, "maxplayers" ) ) { server->max_players = atoi( val ); @@ -154,8 +157,7 @@ // no more info should be player headers here as we // requested it malformed_packet( server, "no player headers" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } // player info header @@ -169,8 +171,7 @@ if ( ptr >= end ) { malformed_packet( server, "no player headers" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } while ( 1 == type && ptr < end ) @@ -188,8 +189,7 @@ { free( headers ); } - cleanup_qserver( server, 1); - return; + return MEM_ERROR; } headers = tmpp; @@ -211,8 +211,7 @@ // no more info should be player info here as we // requested it malformed_packet( server, "no players" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } while( 2 == type && ptr < end ) @@ -225,8 +224,7 @@ if ( 0 != no_players ) { malformed_packet( server, "no players" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } } else @@ -242,8 +240,7 @@ if ( ptr >= end ) { malformed_packet( server, "short player detail" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } val = ptr; val_len = strlen( val ); @@ -292,8 +289,7 @@ if ( total_players > no_players ) { malformed_packet( server, "to many players %d > %d", total_players, no_players ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } // check for end of player info @@ -302,8 +298,7 @@ if ( total_players != no_players ) { malformed_packet( server, "bad number of players %d != %d", total_players, no_players ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } type = 3; ptr++; @@ -315,8 +310,7 @@ // no more info should be team info here as we // requested it malformed_packet( server, "no teams" ); - cleanup_qserver( server, 1 ); - return; + return PKT_ERROR; } no_teams = (unsigned char)*ptr; @@ -340,8 +334,7 @@ { free( headers ); } - cleanup_qserver( server, 1); - return; + return MEM_ERROR; } headers = tmpp; @@ -362,8 +355,7 @@ // no more info should be team info here as we // requested it malformed_packet( server, "no teams" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } while( 4 == type && ptr < end ) @@ -378,8 +370,7 @@ if ( ptr >= end ) { malformed_packet( server, "short team detail" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } val = ptr; val_len = strlen( val ); @@ -398,11 +389,9 @@ if ( total_teams > no_teams ) { malformed_packet( server, "to many teams" ); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } } - cleanup_qserver( server, 1); - return; + return DONE_FORCE; } diff -urP qstat-2.11/gs2.h qstat-2.11-20080912svn311/gs2.h --- qstat-2.11/gs2.h 2005-06-12 08:41:52.000000000 -0400 +++ qstat-2.11-20080912svn311/gs2.h 2008-09-12 14:52:23.000000000 -0400 @@ -13,8 +13,8 @@ #include "qserver.h" // Packet processing methods -void deal_with_gs2_packet( struct qserver *server, char *pkt, int pktlen ); -void send_gs2_request_packet( struct qserver *server ); +int deal_with_gs2_packet( struct qserver *server, char *pkt, int pktlen ); +int send_gs2_request_packet( struct qserver *server ); #endif diff -urP qstat-2.11/gs3.c qstat-2.11-20080912svn311/gs3.c --- qstat-2.11/gs3.c 2006-08-15 15:38:38.000000000 -0400 +++ qstat-2.11-20080912svn311/gs3.c 2008-09-12 14:52:23.000000000 -0400 @@ -51,7 +51,7 @@ // query: [0xFE][0xFD][0x00][0x.. 4-byte-instance][0xb3412b5a "-1287574694"] // -void deal_with_gs3_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_gs3_packet( struct qserver *server, char *rawpkt, int pktlen ) { char *ptr = rawpkt; unsigned int pkt_id; @@ -59,14 +59,48 @@ unsigned char flag; unsigned int pkti, final; - debug( 2, "packet..." ); + debug( 2, "packet n_requests %d, retry1 %d, n_retries %d, delta %d", server->n_requests, server->retry1, n_retries, time_delta( &packet_recv_time, &server->packet_time1 ) ); + server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + + if ( 7 == pktlen && 0x09 == *ptr ) + { + // gs4 query sent to a gs3 server + // switch protocols and try again + + // Correct the stats due to two phase protocol + int i; + server_type *gs3_type = &builtin_types[49]; + debug( 3, "Attempting gs3 fallback from gs4" ); + server->retry1++; + if ( GAMESPY3_PROTOCOL_SERVER != gs3_type->id ) + { + // Static coding failure do it the hard way + debug( 1, "gs3 static lookup failure, using dynamic lookup" ); + for( i = 0; i < GAMESPY3_PROTOCOL_SERVER; i++ ) + { + if ( GAMESPY3_PROTOCOL_SERVER == builtin_types[i].id ) + { + // found it + gs3_type = &builtin_types[i]; + i = GAMESPY3_PROTOCOL_SERVER; + } + } + + if ( GAMESPY3_PROTOCOL_SERVER != gs3_type->id ) + { + malformed_packet( server, "GS3 protocol not found" ); + return PKT_ERROR; + } + } + server->type = gs3_type; + return send_gs3_request_packet( server ); + } if ( pktlen < 12 ) { // invalid packet? malformed_packet( server, "too short" ); - cleanup_qserver( server, 1 ); - return; + return PKT_ERROR; } if ( 0x09 == *ptr ) @@ -78,39 +112,19 @@ memcpy( &pkt_id, ptr, 4 ); ptr += 4; server->challenge = atoi( ptr ); - - // Correct the stats due to two phase protocol server->retry1++; - server->n_packets--; - if ( server->retry1 == n_retries || server->flags & FLAG_BROADCAST ) - { - server->n_requests--; - } - else - { - server->n_retries--; - } - send_gs3_request_packet( server ); - return; + + return send_gs3_request_packet( server ); } if ( 0x00 != *ptr ) { malformed_packet( server, "bad initial byte '%hhx'", *ptr ); - cleanup_qserver( server, 1 ); - return; + return PKT_ERROR; } ptr++; server->n_servers++; - if ( server->server_name == NULL ) - { - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); - } - else - { - gettimeofday( &server->packet_time1, NULL); - } // Could check the header here should // match the 4 byte id sent @@ -123,14 +137,12 @@ if ( server->flags & TF_STATUS_QUERY ) { // we have the status response - deal_with_gs3_status( server, ptr, pktlen - ( ptr - rawpkt ) ); - return; + return deal_with_gs3_status( server, ptr, pktlen - ( ptr - rawpkt ) ); } else { malformed_packet( server, "missing splitnum" ); - cleanup_qserver( server, 1 ); - return; + return PKT_ERROR; } } ptr += 9; @@ -167,20 +179,18 @@ if ( ! add_packet( server, pkt_id, pkt_index, pkt_max, pktlen, rawpkt, 1 ) ) { // fatal error e.g. out of memory - return; + return MEM_ERROR; } // combine_packets will call us recursively - combine_packets( server ); - return; + return combine_packets( server ); } // if we get here we have what should be a full packet - process_gs3_packet( server ); - return; + return process_gs3_packet( server ); } -void deal_with_gs3_status( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_gs3_status( struct qserver *server, char *rawpkt, int pktlen ) { char *pkt = rawpkt; debug( 1, "status packet" ); @@ -194,8 +204,90 @@ pkt += strlen( pkt ) + 1; // map - server->map_name = strdup( pkt ); - pkt += strlen( pkt ) + 1; + // UT3 retail compatibility + if ( 0 == strncmp( pkt, "OwningPlayerId", 13 ) ) + { + char *end = pkt + strlen( pkt ) + 1; + char *var = pkt; + while ( NULL != var ) + { + char *next; + char *val = strstr( var, "=" ); + *val = '\0'; + val++; + next = strstr( val, "," ); + if ( NULL != next ) + { + *next = '\0'; + next++; + } + + if ( 0 == strcmp( var, "mapname" ) ) + { + if ( server->map_name ) + { + free( server->map_name ); + } + server->map_name = strdup( val ); + } + else if ( 0 == strcmp( var, "p1073741825" ) ) + { + if ( server->map_name ) + { + free( server->map_name ); + } + server->map_name = strdup( val ); + } + else if ( 0 == strcmp( var, "p1073741826" ) ) + { + add_rule( server, "gametype", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p268435705" ) ) + { + add_rule( server, "timelimit", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p1073741827" ) ) + { + add_rule( server, "description", val, OVERWITE_DUPLICATES ); +#ifndef UT3_PATCHED + if ( 0 != strlen( val ) ) + { + if ( server->server_name ) + { + char *name = (char*)realloc( server->server_name, strlen( server->server_name ) + strlen( val ) + 3 ); + if ( name ) + { + strcat( name, ": " ); + strcat( name, val ); + server->server_name = name; + } + } + server->server_name = strdup( val ); + } +#endif + } + else if ( 0 == strcmp( var, "p268435704" ) ) + { + add_rule( server, "goalscore", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "s32779" ) ) + { + add_rule( server, "gamemode", val, OVERWITE_DUPLICATES ); + } + else + { + add_rule( server, var, val, OVERWITE_DUPLICATES ); + } + + var = next; + } + pkt = end; + } + else + { + server->map_name = strdup( pkt ); + pkt += strlen( pkt ) + 1; + } // num players server->num_players = atoi( pkt ); @@ -209,7 +301,7 @@ change_server_port( server, atoi( pkt ), 0 ); pkt += strlen( pkt ) + 1; - cleanup_qserver( server, 1 ); + return DONE_FORCE; } int process_gs3_packet( struct qserver *server ) @@ -236,8 +328,7 @@ { // invalid packet? malformed_packet( server, "too short" ); - cleanup_qserver( server, 1 ); - return 0; + return PKT_ERROR; } // skip over the header @@ -267,8 +358,7 @@ if ( ptr + 1 > end ) { malformed_packet( server, "no rule value" ); - cleanup_qserver( server, 1); - return 0; + return PKT_ERROR; } val = ptr; @@ -294,6 +384,89 @@ } else if( 0 == strcmp( var, "mapname" ) ) { + // UT3 retail compatibility + if ( 0 == strncmp( val, "OwningPlayerId", 13 ) ) + { + var = val; + while ( NULL != var ) + { + char *next; + char *val = strstr( var, "=" ); + *val = '\0'; + val++; + next = strstr( val, "," ); + if ( NULL != next ) + { + *next = '\0'; + next++; + } + + if ( 0 == strcmp( var, "mapname" ) ) + { + if ( server->map_name ) + { + free( server->map_name ); + } + server->map_name = strdup( val ); + } + else if ( 0 == strcmp( var, "p1073741825" ) ) + { + if ( server->map_name ) + { + free( server->map_name ); + } + server->map_name = strdup( val ); + } + else if ( 0 == strcmp( var, "p1073741826" ) ) + { + add_rule( server, "gametype", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p268435705" ) ) + { + add_rule( server, "timelimit", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p1073741827" ) ) + { +#ifndef UT3_PATCHED + if ( 0 != strlen( val ) ) + { + if ( server->server_name ) + { + char *name = (char*)realloc( server->server_name, strlen( server->server_name ) + strlen( val ) + 3 ); + if ( name ) + { + strcat( name, ": " ); + strcat( name, val ); + server->server_name = name; + } + } + server->server_name = strdup( val ); + } +#endif + } + else if ( 0 == strcmp( var, "p268435704" ) ) + { + add_rule( server, "goalscore", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "s32779" ) ) + { + add_rule( server, "gamemode", val, OVERWITE_DUPLICATES ); + } + else + { + add_rule( server, var, val, OVERWITE_DUPLICATES ); + } + var = next; + } + } + else + { + server->map_name = strdup( val ); + } + } + else if( 0 == strcmp( var, "map" ) ) + { + // BF2MC compatibility server->map_name = strdup( val ); } else if( 0 == strcmp( var, "maxplayers" ) ) @@ -308,11 +481,60 @@ else if( 0 == strcmp( var, "hostport" ) ) { change_server_port( server, atoi( val ), 0 ); - add_rule( server, var, val, NO_FLAGS ); + } + else if ( 0 == strcmp( var, "p1073741825" ) ) + { + // UT3 demo compatibility + if ( server->map_name ) + { + free( server->map_name ); + } + server->map_name = strdup( val ); + } + else if ( 0 == strcmp( var, "p1073741826" ) ) + { + // UT3 demo compatibility + add_rule( server, "gametype", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p268435705" ) ) + { + // UT3 demo compatibility + add_rule( server, "timelimit", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "p1073741827" ) ) + { + // UT3 demo compatibility + add_rule( server, "description", val, OVERWITE_DUPLICATES ); +#ifndef UT3_PATCHED + if ( 0 != strlen( val ) ) + { + if ( server->server_name ) + { + char *name = (char*)realloc( server->server_name, strlen( server->server_name ) + strlen( val ) + 3 ); + if ( name ) + { + strcat( name, ": " ); + strcat( name, val ); + server->server_name = name; + } + } + server->server_name = strdup( val ); + } +#endif + } + else if ( 0 == strcmp( var, "p268435704" ) ) + { + // UT3 demo compatibility + add_rule( server, "goalscore", val, OVERWITE_DUPLICATES ); + } + else if ( 0 == strcmp( var, "s32779" ) ) + { + // UT3 demo compatibility + add_rule( server, "gamemode", val, OVERWITE_DUPLICATES ); } else { - add_rule( server, var, val, NO_FLAGS ); + add_rule( server, var, val, OVERWITE_DUPLICATES ); } } @@ -328,8 +550,7 @@ { // no more info debug( 3, "All done" ); - cleanup_qserver( server, 1 ); - return 1; + return DONE_FORCE; } debug( 2, "player header '%s'", header ); @@ -337,14 +558,13 @@ if ( ptr > end ) { malformed_packet( server, "no details for header '%s'", header ); - cleanup_qserver( server, 1 ); - return 0; + return PKT_ERROR; } // the next byte is the starting number total_players = *ptr++; - if ( 0 == strcmp( header, "player_" ) ) + if ( 0 == strcmp( header, "player_" ) || 0 == strcmp( header, "name_" ) ) { header_type = PLAYER_NAME_HEADER; } @@ -406,8 +626,7 @@ if ( ptr >= end ) { malformed_packet( server, "short player detail" ); - cleanup_qserver( server, 1); - return 0; + return PKT_ERROR; } val = ptr; val_len = strlen( val ); @@ -462,8 +681,7 @@ if ( total_players > no_players ) { malformed_packet( server, "to many players %d > %d", total_players, no_players ); - cleanup_qserver( server, 1 ); - return 0; + return PKT_ERROR; } } } @@ -489,8 +707,7 @@ { // no more info debug( 3, "All done" ); - cleanup_qserver( server, 1 ); - return 1; + return DONE_FORCE; } debug( 2, "team header '%s'", header ); @@ -516,8 +733,7 @@ if ( ptr >= end ) { malformed_packet( server, "short team detail" ); - cleanup_qserver( server, 1); - return 0; + return PKT_ERROR; } val = ptr; val_len = strlen( val ); @@ -552,11 +768,10 @@ } } - cleanup_qserver( server, 1 ); - return 1; + return DONE_FORCE; } -void send_gs3_request_packet( struct qserver *server ) +int send_gs3_request_packet( struct qserver *server ) { char *packet; char query_buf[128]; @@ -615,5 +830,5 @@ } } - send_packet( server, packet, len ); + return send_packet( server, packet, len ); } diff -urP qstat-2.11/gs3.h qstat-2.11-20080912svn311/gs3.h --- qstat-2.11/gs3.h 2005-07-16 23:45:08.000000000 -0400 +++ qstat-2.11-20080912svn311/gs3.h 2008-09-12 14:52:23.000000000 -0400 @@ -13,8 +13,8 @@ #include "qserver.h" // Packet processing methods -void deal_with_gs3_packet( struct qserver *server, char *pkt, int pktlen ); -void deal_with_gs3_status( struct qserver *server, char *rawpkt, int pktlen ); -void send_gs3_request_packet( struct qserver *server ); +int deal_with_gs3_packet( struct qserver *server, char *pkt, int pktlen ); +int deal_with_gs3_status( struct qserver *server, char *rawpkt, int pktlen ); +int send_gs3_request_packet( struct qserver *server ); #endif diff -urP qstat-2.11/haze.c qstat-2.11-20080912svn311/haze.c --- qstat-2.11/haze.c 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/haze.c 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,628 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * New Haze query protocol + * Copyright 2005 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + * + */ + +#include <sys/types.h> +#ifndef _WIN32 +#include <netinet/in.h> +#include <sys/socket.h> +#endif +#include <stdlib.h> +#include <stdio.h> + +#include "debug.h" +#include "qstat.h" +#include "packet_manip.h" + + +// Format: +// 1 - 8: Challenge Request / Response +char haze_challenge[] = { + 'f', 'r', 'd', 'c', '_', '_', '_', '_' +}; + +int process_haze_packet( struct qserver *server ); + +// Player headers +#define PLAYER_NAME_HEADER 1 +#define PLAYER_SCORE_HEADER 2 +#define PLAYER_DEATHS_HEADER 3 +#define PLAYER_PING_HEADER 4 +#define PLAYER_KILLS_HEADER 5 +#define PLAYER_TEAM_HEADER 6 +#define PLAYER_OTHER_HEADER 7 + +// Team headers +#define TEAM_NAME_HEADER 1 +#define TEAM_OTHER_HEADER 2 + +// Challenge response algorithum +// Before sending a qr2 query (type 0x00) the client must first send a +// challenge request (type 0x09). The host will respond with the same +// packet type containing a string signed integer. +// +// Once the challenge is received the client should convert the string to a +// network byte order integer and embed it in the keys query. +// +// Example: +// +// challenge request: [0xFE][0xFD][0x09][0x.. 4-byte-instance] +// challenge response: [0x09][0x.. 4-byte-instance]["-1287574694"] +// query: [0xFE][0xFD][0x00][0x.. 4-byte-instance][0xb3412b5a "-1287574694"] +// + +int deal_with_haze_packet( struct qserver *server, char *rawpkt, int pktlen ) +{ + char *ptr = rawpkt; + unsigned int pkt_id; + unsigned short len; + unsigned char pkt_max, pkt_index; + + debug( 2, "packet..." ); + + if ( pktlen < 8 ) + { + // invalid packet + malformed_packet( server, "too short" ); + return PKT_ERROR; + } + + if ( 0 == strncmp( ptr, "frdcr", 5 ) ) + { + // challenge response + ptr += 8; + server->challenge = 1; + + // Correct the stats due to two phase protocol + server->retry1++; + server->n_packets--; + if ( server->retry1 == n_retries || server->flags & FLAG_BROADCAST ) + { + //server->n_requests--; + } + else + { + server->n_retries--; + } + return send_haze_request_packet( server ); + } + + if ( pktlen < 12 ) + { + // invalid packet + malformed_packet( server, "too short" ); + return PKT_ERROR; + } + + server->n_servers++; + if ( server->server_name == NULL ) + { + server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + } + else + { + gettimeofday( &server->packet_time1, NULL); + } + + // Query version ID + ptr += 4; + + // Could check the header here should + // match the 4 byte id sent + memcpy( &pkt_id, ptr, 4 ); + ptr += 4; + + + // Max plackets + pkt_max = ((unsigned char)*ptr); + ptr++; + + // Packet ID + pkt_index = ((unsigned char)*ptr); + ptr++; + + // Query Length + //len = (unsigned short)ptr[0] | ((unsigned short)ptr[1] << 8); + //len = swap_short_from_little( ptr ); + debug( 1, "%04hx, %04hx", (unsigned short)ptr[0], ((unsigned short)ptr[1] << 8) ); + //len = (unsigned short)(unsigned short)ptr[0] | ((unsigned short)ptr[1] << 8); + // TODO: fix this crap + memcpy( &len, ptr+1, 1 ); + //memcpy( &len+1, ptr, 1 ); + //memcpy( &len, ptr, 2 ); + ptr += 2; + + debug( 1, "pkt_index = %d, pkt_max = %d, len = %d", pkt_index, pkt_max, len ); + if ( 0 != pkt_max ) + { + // not a single packet response or callback + debug( 2, "pkt_max %d", pkt_max ); + + if ( 0 == pkt_index ) + { + // to prevent reprocessing when we get the call back + // override the packet flag so it looks like a single + // packet response + rawpkt[8] = '\0'; + } + + // add the packet recalcing maxes + if ( ! add_packet( server, pkt_id, pkt_index, pkt_max, pktlen, rawpkt, 1 ) ) + { + // fatal error e.g. out of memory + return MEM_ERROR; + } + + // combine_packets will call us recursively + return combine_packets( server ); + } + + // if we get here we have what should be a full packet + return process_haze_packet( server ); +} + +int deal_with_haze_status( struct qserver *server, char *rawpkt, int pktlen ) +{ + char *pkt = rawpkt; + int len; + debug( 1, "status packet" ); + + + // Server name + server->server_name = strdup( pkt ); + pkt += strlen( pkt ) + 1; + + // gametype + add_rule( server, "gametype", pkt, NO_FLAGS ); + pkt += strlen( pkt ) + 1; + + // map + len = strlen( pkt ); + // remove .res from map names + if ( 0 == strncmp( pkt + len - 4, ".res", 4 ) ) + { + *(pkt + len - 4) = '\0'; + } + server->map_name = strdup( pkt ); + pkt += len + 1; + + // num players + server->num_players = atoi( pkt ); + pkt += strlen( pkt ) + 1; + + // max_players + server->max_players = atoi( pkt ); + pkt += strlen( pkt ) + 1; + + // hostport + change_server_port( server, atoi( pkt ), 0 ); + pkt += strlen( pkt ) + 1; + + return DONE_FORCE; +} + +int process_haze_packet( struct qserver *server ) +{ + unsigned char state = 0; + unsigned char no_players = 0; + unsigned char total_players = 0; + unsigned char no_teams = 0; + unsigned char total_teams = 0; + int pkt_index = 0; + SavedData *fragment; + + debug( 2, "processing packet..." ); + + while ( NULL != ( fragment = get_packet_fragment( pkt_index++ ) ) ) + { + int pktlen = fragment->datalen; + char *ptr = fragment->data; + char *end = ptr + pktlen; + debug( 2, "processing fragment[%d]...", fragment->pkt_index ); + + // check we have a full header + if ( pktlen < 12 ) + { + // invalid packet + malformed_packet( server, "too short" ); + return PKT_ERROR; + } + + // skip over the header + //server->protocol_version = atoi( val+1 ); + ptr += 12; + + // 4 * null's signifies the end of a section + + // Basic Info + while ( 0 == state && ptr < end ) + { + // name value pairs null seperated + char *var, *val; + int var_len, val_len; + + if ( ptr+4 <= end && 0x00 == ptr[0] && 0x00 == ptr[1] && 0x00 == ptr[2] && 0x00 == ptr[3] ) + { + // end of rules + state++; + ptr += 4; + break; + } + + var = ptr; + var_len = strlen( var ); + ptr += var_len + 1; + + if ( ptr + 1 > end ) + { + malformed_packet( server, "no basic value" ); + return PKT_ERROR; + } + + val = ptr; + val_len = strlen( val ); + ptr += val_len + 1; + debug( 2, "var:%s (%d)=%s (%d)\n", var, var_len, val, val_len ); + + // Lets see what we've got + if ( 0 == strcmp( var, "serverName" ) ) + { + server->server_name = strdup( val ); + } + else if( 0 == strcmp( var, "map" ) ) + { + // remove .res from map names + if ( 0 == strncmp( val + val_len - 4, ".res", 4 ) ) + { + *(val + val_len - 4) = '\0'; + } + server->map_name = strdup( val ); + } + else if( 0 == strcmp( var, "maxPlayers" ) ) + { + server->max_players = atoi( val ); + + } + else if( 0 == strcmp( var, "currentPlayers" ) ) + { + server->num_players = no_players = atoi( val ); + } + else + { + add_rule( server, var, val, NO_FLAGS ); + } + } + + // rules + while ( 1 == state && ptr < end ) + { + // name value pairs null seperated + char *var, *val; + int var_len, val_len; + + if ( ptr+4 <= end && 0x00 == ptr[0] && 0x00 == ptr[1] && 0x00 == ptr[2] && 0x00 == ptr[3] ) + { + // end of basic + state++; + ptr += 4; + break; + } + var = ptr; + var_len = strlen( var ); + ptr += var_len + 1; + + if ( ptr + 1 > end ) + { + malformed_packet( server, "no basic value" ); + return PKT_ERROR; + } + + val = ptr; + val_len = strlen( val ); + ptr += val_len + 1; + debug( 2, "var:%s (%d)=%s (%d)\n", var, var_len, val, val_len ); + + // add the rule + add_rule( server, var, val, NO_FLAGS ); + } + + // players + while ( 2 == state && ptr < end ) + { + // first we have the header + char *header = ptr; + int head_len = strlen( header ); + ptr += head_len + 1; + + if ( ptr+2 <= end && 0x00 == ptr[0] && 0x00 == ptr[1] ) + { + // end of player headers + state++; + ptr += 2; + break; + } + + if ( 0 == head_len ) + { + // no more info + debug( 3, "All done" ); + return DONE_FORCE; + } + + debug( 2, "player header '%s'", header ); + + if ( ptr > end ) + { + malformed_packet( server, "no details for header '%s'", header ); + return PKT_ERROR; + } + + } + + while ( 3 == state && ptr < end ) + { + char *header = ptr; + int head_len = strlen( header ); + int header_type; + // the next byte is the starting number + total_players = *ptr++; + + if ( 0 == strcmp( header, "player_" ) || 0 == strcmp( header, "name_" ) ) + { + header_type = PLAYER_NAME_HEADER; + } + else if ( 0 == strcmp( header, "score_" ) ) + { + header_type = PLAYER_SCORE_HEADER; + } + else if ( 0 == strcmp( header, "deaths_" ) ) + { + header_type = PLAYER_DEATHS_HEADER; + } + else if ( 0 == strcmp( header, "ping_" ) ) + { + header_type = PLAYER_PING_HEADER; + } + else if ( 0 == strcmp( header, "kills_" ) ) + { + header_type = PLAYER_KILLS_HEADER; + } + else if ( 0 == strcmp( header, "team_" ) ) + { + header_type = PLAYER_TEAM_HEADER; + } + else + { + header_type = PLAYER_OTHER_HEADER; + } + + while( ptr < end ) + { + // now each player details + // add the player + struct player *player; + char *val; + int val_len; + + // check for end of this headers player info + if ( 0x00 == *ptr ) + { + debug( 3, "end of '%s' detail", header ); + ptr++; + // Note: can't check ( total_players != no_players ) here as we may have more packets + if ( ptr < end && 0x00 == *ptr ) + { + debug( 3, "end of players" ); + // end of all player headers / detail + state = 2; + ptr++; + } + break; + } + + player = get_player_by_number( server, total_players ); + if ( NULL == player ) + { + player = add_player( server, total_players ); + } + + if ( ptr >= end ) + { + malformed_packet( server, "short player detail" ); + return PKT_ERROR; + } + val = ptr; + val_len = strlen( val ); + ptr += val_len + 1; + + debug( 2, "Player[%d][%s]=%s\n", total_players, header, val ); + + // lets see what we got + switch( header_type ) + { + case PLAYER_NAME_HEADER: + player->name = strdup( val ); + break; + + case PLAYER_SCORE_HEADER: + player->score = atoi( val ); + break; + + case PLAYER_DEATHS_HEADER: + player->deaths = atoi( val ); + break; + + case PLAYER_PING_HEADER: + player->ping = atoi( val ); + break; + + case PLAYER_KILLS_HEADER: + player->frags = atoi( val ); + break; + + case PLAYER_TEAM_HEADER: + player->team = atoi( val ); + break; + + case PLAYER_OTHER_HEADER: + default: + if ( '_' == header[head_len-1] ) + { + header[head_len-1] = '\0'; + player_add_info( player, header, val, NO_FLAGS ); + header[head_len-1] = '_'; + } + else + { + player_add_info( player, header, val, NO_FLAGS ); + } + break; + } + + total_players++; + + if ( total_players > no_players ) + { + malformed_packet( server, "to many players %d > %d", total_players, no_players ); + return PKT_ERROR; + } + } + } + + if ( 3 == state ) + { + no_teams = (unsigned char)*ptr; + ptr++; + + debug( 2, "No teams:%d\n", no_teams ); + state = 3; + } + + while ( 4 == state && ptr < end ) + { + // first we have the header + char *header = ptr; + int head_len = strlen( header ); + int header_type; + ptr += head_len + 1; + + if ( 0 == head_len ) + { + // no more info + debug( 3, "All done" ); + return DONE_FORCE; + } + + debug( 2, "team header '%s'", header ); + if ( 0 == strcmp( header, "team_t" ) ) + { + header_type = TEAM_NAME_HEADER; + } + else + { + header_type = TEAM_OTHER_HEADER; + } + + // the next byte is the starting number + total_teams = *ptr++; + + while( ptr < end ) + { + // now each teams details + char *val; + int val_len; + char rule[512]; + + if ( ptr >= end ) + { + malformed_packet( server, "short team detail" ); + return PKT_ERROR; + } + val = ptr; + val_len = strlen( val ); + ptr += val_len + 1; + + debug( 2, "Team[%d][%s]=%s\n", total_teams, header, val ); + + // lets see what we got + switch ( header_type ) + { + case TEAM_NAME_HEADER: + // BF being stupid again teams 1 based instead of 0 + players_set_teamname( server, total_teams + 1, val ); + // N.B. yes no break + + case TEAM_OTHER_HEADER: + default: + // add as a server rule + sprintf( rule, "%s%d", header, total_teams ); + add_rule( server, rule, val, NO_FLAGS ); + break; + } + + total_teams++; + if ( 0x00 == *ptr ) + { + // end of this headers teams + ptr++; + break; + } + } + } + } + + return DONE_FORCE; +} + +int send_haze_request_packet( struct qserver *server ) +{ + char *packet; + char query_buf[128]; + size_t len; + unsigned char required = HAZE_BASIC_INFO; + + if ( get_server_rules ) + { + required |= HAZE_GAME_RULES; + server->flags |= TF_PLAYER_QUERY; + } + + if ( get_player_info ) + { + required |= HAZE_PLAYER_INFO; + required |= HAZE_TEAM_INFO; + server->flags |= TF_RULES_QUERY; + } + + server->flags |= TF_STATUS_QUERY; + + if ( server->challenge ) + { + // we've recieved a challenge response, send the query + challenge id + len = sprintf( + query_buf, + "frdquery%c%c%c%c%c", + (unsigned char)(server->challenge >> 24), + (unsigned char)(server->challenge >> 16), + (unsigned char)(server->challenge >> 8), + (unsigned char)(server->challenge >> 0), + required + ); + packet = query_buf; + } + else + { + // Either basic v3 protocol or challenge request + packet = haze_challenge; + len = sizeof( haze_challenge ); + } + + return send_packet( server, packet, len ); +} diff -urP qstat-2.11/haze.h qstat-2.11-20080912svn311/haze.h --- qstat-2.11/haze.h 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/haze.h 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,27 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * New Haze query protocol + * Copyright 2007 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + */ +#ifndef QSTAT_HAZE_H +#define QSTAT_HAZE_H + + +#include "qserver.h" + +#define HAZE_BASIC_INFO 0x01 +#define HAZE_GAME_RULES 0x02 +#define HAZE_PLAYER_INFO 0x04 +#define HAZE_TEAM_INFO 0x08 + +// Packet processing methods +int deal_with_haze_packet( struct qserver *server, char *pkt, int pktlen ); +int deal_with_haze_status( struct qserver *server, char *rawpkt, int pktlen ); +int send_haze_request_packet( struct qserver *server ); + + +#endif diff -urP qstat-2.11/info/.cvsignore qstat-2.11-20080912svn311/info/.cvsignore --- qstat-2.11/info/.cvsignore 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/info/.cvsignore 2008-09-12 14:52:21.000000000 -0400 @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff -urP qstat-2.11/info/Makefile.in qstat-2.11-20080912svn311/info/Makefile.in --- qstat-2.11/info/Makefile.in 2006-11-04 07:59:01.000000000 -0500 +++ qstat-2.11-20080912svn311/info/Makefile.in 2008-09-12 15:00:26.000000000 -0400 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.7.9 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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. @@ -13,6 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -20,6 +21,7 @@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 @@ -33,20 +35,7 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -subdir = info -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/gnuconfig.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ @@ -68,6 +57,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -90,14 +80,11 @@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ 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@ @@ -105,60 +92,49 @@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ -mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ EXTRA_DIST = $(wildcard *.txt) +subdir = info +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/gnuconfig.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = $(srcdir)/Makefile.in Makefile.am all: all-am .SUFFIXES: -$(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 \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign info/Makefile'; \ +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign info/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 +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: tags: TAGS TAGS: @@ -166,6 +142,10 @@ ctags: CTAGS CTAGS: +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ @@ -179,7 +159,7 @@ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ @@ -197,6 +177,7 @@ check-am: all-am check: check-am all-am: Makefile + installdirs: install: install-am install-exec: install-exec-am @@ -217,7 +198,7 @@ clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -234,8 +215,6 @@ dvi-am: -html: html-am - info: info-am info-am: @@ -269,8 +248,8 @@ uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ diff -urP qstat-2.11/install-sh qstat-2.11-20080912svn311/install-sh --- qstat-2.11/install-sh 2006-04-22 20:59:37.000000000 -0400 +++ qstat-2.11-20080912svn311/install-sh 2007-09-18 10:10:46.000000000 -0400 @@ -1,8 +1,7 @@ #!/bin/sh +# # install - install a program, script, or datafile - -scriptversion=2005-05-14.22 - +# # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. @@ -42,11 +41,13 @@ # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. + # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" + # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" @@ -58,266 +59,236 @@ rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" +transformbasename="" +transform_arg="" +instcmd="$mvprog" chmodcmd="$chmodprog 0755" -chowncmd= -chgrpcmd= -stripcmd= +chowncmd="" +chgrpcmd="" +stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" -src= -dst= -dir_arg= -dstarg= -no_target_directory= - -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: --c (ignored) --d create directories instead of installing files. --g GROUP $chgrpprog installed files to GROUP. --m MODE $chmodprog installed files to MODE. --o USER $chownprog installed files to USER. --s $stripprog installed files. --t DIRECTORY install into DIRECTORY. --T report an error if DSTFILE is a directory. ---help display this help and exit. ---version display version info and exit. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" - -while test -n "$1"; do - case $1 in - -c) shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - --help) echo "$usage"; exit $?;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -s) stripcmd=$stripprog - shift - continue;; +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done - -t) dstarg=$2 - shift - shift - continue;; +if [ x"$src" = x ] +then + echo "$0: no input file specified" >&2 + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d "$dst" ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f "$src" ] || [ -d "$src" ] + then + : + else + echo "$0: $src does not exist" >&2 + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "$0: no destination specified" >&2 + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d "$dst" ] + then + dst=$dst/`basename "$src"` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-$defaultIFS}" + +oIFS=$IFS +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS=$oIFS - -T) no_target_directory=true +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp=$pathcomp$1 shift - continue;; - --version) echo "$0 $scriptversion"; exit $?;; + if [ ! -d "$pathcomp" ] ; + then + $mkdirprog "$pathcomp" + else + : + fi - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done - break;; - esac + pathcomp=$pathcomp/ done - -if test -z "$1"; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 fi -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src ;; - esac - - if test -n "$dir_arg"; then - dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi - else - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dstarg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dstarg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac +if [ x"$dir_arg" != x ] +then + $doit $instcmd "$dst" && - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dstarg: Is a directory" >&2 - exit 1 - fi - dst=$dst/`basename "$src"` - fi - fi - - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` - - # Make sure that the destination directory exists. - - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" - - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS - - pathcomp= - - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 - shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit - fi - pathcomp=$pathcomp/ - done - fi - - if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - - else - dstfile=`basename "$dst"` - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 - - # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && - - # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ - || { - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ - || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 - (exit 1); exit 1 - } - else - : - fi - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" - } - } - fi || { (exit 1); exit 1; } -done + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename "$dst"` + else + : + fi + +# Make a couple of temp file names in the proper directory. + + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + +# Trap to clean up temp files at exit. + + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + +# Move or copy the file name to the temp name + + $doit $instcmd "$src" "$dsttmp" && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && + +# Now remove or move aside any old file at destination location. We try this +# two ways since rm can't unlink itself on some systems and the destination +# file might be busy for other reasons. In this case, the final cleanup +# might fail but the new file should still install successfully. + +{ + if [ -f "$dstdir/$dstfile" ] + then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || + $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || + { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi +} && + +# Now rename the file to the real destination. + + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + +fi && # The final little trick to "correctly" pass the exit status to the exit trap. + { - (exit 0); exit 0 + (exit 0); exit } - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff -urP qstat-2.11/LICENSE.txt qstat-2.11-20080912svn311/LICENSE.txt --- qstat-2.11/LICENSE.txt 2002-11-13 21:33:54.000000000 -0500 +++ qstat-2.11-20080912svn311/LICENSE.txt 2008-09-12 14:52:23.000000000 -0400 @@ -1,130 +1,201 @@ -The Artistic License + The Artistic License 2.0 + + Copyright (c) 2000-2006, The Perl Foundation. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. Preamble - The intent of this document is to state the conditions - under which a Package may be copied, such that the - Copyright Holder maintains some semblance of artistic - control over the development of the package, while - giving the users of the package the right to use and - distribute the Package in a more-or-less customary - fashion, plus the right to make reasonable modifications. - -Definitions: - "Package" refers to the collection of files - distributed by the Copyright Holder, and derivatives - of that collection of files created through textual - modification. - - "Standard Version" refers to such a Package if it has - not been modified, or has been modified in accordance - with the wishes of the Copyright Holder. - - "Copyright Holder" is whoever is named in the - copyright or copyrights for the package. - - "You" is you, if you're thinking about copying or - distributing this Package. - - "Reasonable copying fee" is whatever you can justify - on the basis of media cost, duplication charges, time - of people involved, and so on. (You will not be - required to justify it to the Copyright Holder, but - only to the computing community at large as a market - that must bear the fee.) - - "Freely Available" means that no fee is charged for - the item itself, though there may be fees involved in - handling the item. It also means that recipients of - the item may redistribute it under the same conditions - they received it. - - 1. You may make and give away verbatim copies of the - source form of the Standard Version of this Package - without restriction, provided that you duplicate all of - the original copyright notices and associated - disclaimers. - - 2. You may apply bug fixes, portability fixes and other - modifications derived from the Public Domain or from the - Copyright Holder. A Package modified in such a way shall - still be considered the Standard Version. - - 3. You may otherwise modify your copy of this Package in - any way, provided that you insert a prominent notice in - each changed file stating how and when you changed that - file, and provided that you do at least ONE of the - following: - - a) place your modifications in the Public Domain or - otherwise make them Freely Available, such as by - posting said modifications to Usenet or an equivalent - medium, or placing the modifications on a major - archive site such as ftp.uu.net, or by allowing the - Copyright Holder to include your modifications in the - Standard Version of the Package. - - b) use the modified Package only within your - corporation or organization. - - c) rename any non-standard executables so the names do - not conflict with standard executables, which must - also be provided, and provide a separate manual page - for each non-standard executable that clearly - documents how it differs from the Standard Version. - - d) make other distribution arrangements with the - Copyright Holder. - - 4. You may distribute the programs of this Package in - object code or executable form, provided that you do at - least ONE of the following: - - a) distribute a Standard Version of the executables - and library files, together with instructions (in the - manual page or equivalent) on where to get the - Standard Version. - - b) accompany the distribution with the - machine-readable source of the Package with your - modifications. - - c) accompany any non-standard executables with their - corresponding Standard Version executables, giving the - non-standard executables non-standard names, and - clearly documenting the differences in manual pages - (or equivalent), together with instructions on where - to get the Standard Version. - - d) make other distribution arrangements with the - Copyright Holder. - - 5. You may charge a reasonable copying fee for any - distribution of this Package. You may charge any fee you - choose for support of this Package. You may not charge a - fee for this Package itself. However, you may distribute - this Package in aggregate with other (possibly - commercial) programs as part of a larger (possibly - commercial) software distribution provided that you do - not advertise this Package as a product of your own. - - 6. The scripts and library files supplied as input to or - produced as output from the programs of this Package do - not automatically fall under the copyright of this - Package, but belong to whomever generated them, and may - be sold commercially, and may be aggregated with this - Package. - - 7. C subroutines supplied by you and linked into - this Package shall not be considered part of this - Package. - - 8. The name of the Copyright Holder may not be used to - endorse or promote products derived from this software - without specific prior written permission. - - 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT - LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY - AND FITNESS FOR A PARTICULAR PURPOSE. - The End +This license establishes the terms under which a given free software +Package may be copied, modified, distributed, and/or redistributed. +The intent is that the Copyright Holder maintains some artistic +control over the development of that Package while still keeping the +Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this +license directly with the Copyright Holder of a given Package. If the +terms of this license do not permit the full use that you propose to +make of the Package, you should contact the Copyright Holder and seek +a different licensing arrangement. + +Definitions + + "Copyright Holder" means the individual(s) or organization(s) + named in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other + material to the Package, in accordance with the Copyright Holder's + procedures. + + "You" and "your" means any person who would like to copy, + distribute, or modify the Package. + + "Package" means the collection of files distributed by the + Copyright Holder, and derivatives of that collection and/or of + those files. A given Package may consist of either the Standard + Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it + accessible to anyone else, or in the case of a company or + organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing + this Package or providing support for this Package to another + party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been + modified, or has been modified only in ways explicitly requested + by the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and + such changes were not explicitly requested by the Copyright + Holder. + + "Original License" means this Artistic License as Distributed with + the Standard Version of the Package, in its current version or as + it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and + configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, + or any other form resulting from mechanical transformation or + translation of the Source form. + + +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use +Modified Versions for any purpose without restriction, provided that +you do not Distribute the Modified Version. + + +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the +Standard Version of this Package in any medium without restriction, +either gratis or for a Distributor Fee, provided that you duplicate +all of the original copyright notices and associated disclaimers. At +your discretion, such verbatim copies may or may not include a +Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other +modifications made available from the Copyright Holder. The resulting +Package will still be considered the Standard Version, and as such +will be subject to the Original License. + + +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis +or for a Distributor Fee, and with or without a Compiled form of the +Modified Version) provided that you clearly document how it differs +from the Standard Version, including, but not limited to, documenting +any non-standard features, executables, or modules, and provided that +you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder + of the Standard Version, under the Original License, so that the + Copyright Holder may include your modifications in the Standard + Version. + + (b) ensure that installation of your Modified Version does not + prevent the user installing or running the Standard Version. In + addition, the Modified Version must bear a name that is different + from the name of the Standard Version. + + (c) allow anyone who receives a copy of the Modified Version to + make the Source form of the Modified Version available to others + under + + (i) the Original License or + + (ii) a license that permits the licensee to freely copy, + modify and redistribute the Modified Version using the same + licensing terms that apply to the copy that the licensee + received, and requires that the Source form of the Modified + Version, and of any works derived from it, be made freely + available in that license fees are prohibited but Distributor + Fees are allowed. + + +Distribution of Compiled Forms of the Standard Version +or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without +the Source, provided that you include complete instructions on how to +get the Source of the Standard Version. Such instructions must be +valid at the time of your distribution. If these instructions, at any +time while you are carrying out such distribution, become invalid, you +must provide new instructions on demand or cease further distribution. +If you provide valid instructions or cease distribution within thirty +days after you become aware that the instructions are invalid, then +you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without +the Source, provided that you comply with Section 4 with respect to +the Source of the Modified Version. + + +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or +Modified Version) with other packages and Distribute the resulting +aggregation provided that you do not charge a licensing fee for the +Package. Distributor Fees are permitted, and licensing fees for other +components in the aggregation are permitted. The terms of this license +apply to the use and Distribution of the Standard or Modified Versions +as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with +other works, to embed the Package in a larger work of your own, or to +build stand-alone binary or bytecode versions of applications that +include the Package, and Distribute the result without restriction, +provided the result does not expose a direct interface to the Package. + + +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that +merely extend or make use of the Package, do not, by themselves, cause +the Package to be a Modified Version. In addition, such works are not +considered parts of the Package itself, and are not subject to the +terms of this license. + + +General Provisions + +(10) Any use, modification, and distribution of the Standard or +Modified Versions is governed by this Artistic License. By using, +modifying or distributing the Package, you accept this license. Do not +use, modify, or distribute the Package, if you do not accept this +license. + +(11) If your Modified Version has been derived from a Modified +Version made by someone other than you, you are nevertheless required +to ensure that your Modified Version complies with the requirements of +this license. + +(12) This license does not grant you the right to use any trademark, +service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, +free-of-charge patent license to make, have made, use, offer to sell, +sell, import and otherwise transfer the Package with respect to any +patent claims licensable by the Copyright Holder that are necessarily +infringed by the Package. If you institute patent litigation +(including a cross-claim or counterclaim) against any party alleging +that the Package constitutes direct or contributory patent +infringement, then this Artistic License to you shall terminate on the +date that such litigation is filed. + +(14) Disclaimer of Warranty: +THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS +IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL +LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -urP qstat-2.11/Makefile.am qstat-2.11-20080912svn311/Makefile.am --- qstat-2.11/Makefile.am 2006-08-04 16:42:09.000000000 -0400 +++ qstat-2.11-20080912svn311/Makefile.am 2008-09-12 14:52:23.000000000 -0400 @@ -20,7 +20,11 @@ gs2.c gs2.h \ gs3.c gs3.h \ ts2.c ts2.h \ - tm.c tm.h + tm.c tm.h \ + haze.c haze.h \ + ottd.c ottd.h \ + wic.c wic.h \ + fl.c fl.h dist_configfiles_DATA = qstat.cfg configfilesdir = $(sysconfdir) @@ -33,4 +37,4 @@ cl: cvs2cl.pl --utc --no-wrap --separate-header --no-times -f ChangeLog.cvs - rm -f ChangeLog.cvs.bak + rm -f ChangeLog.cvs.bak qstat.core diff -urP qstat-2.11/Makefile.in qstat-2.11-20080912svn311/Makefile.in --- qstat-2.11/Makefile.in 2006-11-04 07:59:01.000000000 -0500 +++ qstat-2.11-20080912svn311/Makefile.in 2008-09-12 15:00:26.000000000 -0400 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.7.9 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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. @@ -14,7 +14,6 @@ @SET_MAKE@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -22,6 +21,7 @@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 @@ -35,70 +35,7 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = qstat$(EXEEXT) -DIST_COMMON = $(am__configure_deps) $(dist_configfiles_DATA) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/gnuconfig.h.in $(top_srcdir)/configure ChangeLog \ - config.guess config.sub depcomp install-sh missing -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = gnuconfig.h -CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(configfilesdir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_qstat_OBJECTS = config.$(OBJEXT) debug.$(OBJEXT) hcache.$(OBJEXT) \ - md5.$(OBJEXT) qserver.$(OBJEXT) qstat.$(OBJEXT) \ - template.$(OBJEXT) a2s.$(OBJEXT) packet_manip.$(OBJEXT) \ - ut2004.$(OBJEXT) doom3.$(OBJEXT) gps.$(OBJEXT) gs2.$(OBJEXT) \ - gs3.$(OBJEXT) ts2.$(OBJEXT) tm.$(OBJEXT) -qstat_OBJECTS = $(am_qstat_OBJECTS) -qstat_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I. -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(qstat_SOURCES) -DIST_SOURCES = $(qstat_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive -am__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 = `echo $$p | sed -e 's|^.*/||'`; -dist_configfilesDATA_INSTALL = $(INSTALL_DATA) -DATA = $(dist_configfiles_DATA) -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ @@ -111,6 +48,7 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ + CPPFLAGS = -Dsysconfdir=\"$(sysconfdir)\" @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ @@ -120,6 +58,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -142,14 +81,11 @@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ 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@ @@ -157,28 +93,37 @@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ -mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = template info + +bin_PROGRAMS = qstat + qstat_SOURCES = \ config.c config.h \ debug.c debug.h \ @@ -195,53 +140,94 @@ gs2.c gs2.h \ gs3.c gs3.h \ ts2.c ts2.h \ - tm.c tm.h + tm.c tm.h \ + haze.c haze.h \ + ottd.c ottd.h \ + wic.c wic.h \ + fl.c fl.h + dist_configfiles_DATA = qstat.cfg configfilesdir = $(sysconfdir) + EXTRA_DIST = CHANGES.txt COMPILE.txt LICENSE.txt \ Makefile.noauto \ ChangeLog \ qstatdoc.html \ contrib.cfg +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = gnuconfig.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = qstat$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +am_qstat_OBJECTS = config.$(OBJEXT) debug.$(OBJEXT) hcache.$(OBJEXT) \ + md5.$(OBJEXT) qserver.$(OBJEXT) qstat.$(OBJEXT) \ + template.$(OBJEXT) a2s.$(OBJEXT) packet_manip.$(OBJEXT) \ + ut2004.$(OBJEXT) doom3.$(OBJEXT) gps.$(OBJEXT) gs2.$(OBJEXT) \ + gs3.$(OBJEXT) ts2.$(OBJEXT) tm.$(OBJEXT) haze.$(OBJEXT) \ + ottd.$(OBJEXT) wic.$(OBJEXT) fl.$(OBJEXT) +qstat_OBJECTS = $(am_qstat_OBJECTS) +qstat_LDADD = $(LDADD) +qstat_DEPENDENCIES = +qstat_LDFLAGS = + +DEFAULT_INCLUDES = -I. -I$(srcdir) -I. +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/a2s.Po ./$(DEPDIR)/config.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/debug.Po ./$(DEPDIR)/doom3.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/fl.Po ./$(DEPDIR)/gps.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/gs2.Po ./$(DEPDIR)/gs3.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/haze.Po ./$(DEPDIR)/hcache.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/md5.Po ./$(DEPDIR)/ottd.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/packet_manip.Po ./$(DEPDIR)/qserver.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/qstat.Po ./$(DEPDIR)/template.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/tm.Po ./$(DEPDIR)/ts2.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ut2004.Po ./$(DEPDIR)/wic.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DIST_SOURCES = $(qstat_SOURCES) +DATA = $(dist_configfiles_DATA) + + +RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ + ps-recursive install-info-recursive uninstall-info-recursive \ + all-recursive install-data-recursive install-exec-recursive \ + installdirs-recursive install-recursive uninstall-recursive \ + check-recursive installcheck-recursive +DIST_COMMON = $(dist_configfiles_DATA) $(srcdir)/Makefile.in \ + $(srcdir)/configure ChangeLog Makefile.am aclocal.m4 \ + config.guess config.sub configure configure.ac depcomp \ + gnuconfig.h.in install-sh missing mkinstalldirs +DIST_SUBDIRS = $(SUBDIRS) +SOURCES = $(qstat_SOURCES) + all: gnuconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe) -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) +$(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) + +$(ACLOCAL_M4): configure.ac cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) gnuconfig.h: stamp-h1 @@ -253,23 +239,24 @@ stamp-h1: $(srcdir)/gnuconfig.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status gnuconfig.h -$(srcdir)/gnuconfig.h.in: $(am__configure_deps) + +$(srcdir)/gnuconfig.h.in: $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h1 - touch $@ + touch $(srcdir)/gnuconfig.h.in distclean-hdr: -rm -f gnuconfig.h stamp-h1 +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ else :; fi; \ done @@ -277,8 +264,8 @@ @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ done clean-binPROGRAMS: @@ -288,7 +275,7 @@ $(LINK) $(qstat_LDFLAGS) $(qstat_OBJECTS) $(qstat_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) + -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @@ -297,11 +284,14 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/doom3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gs2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gs3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haze.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ottd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet_manip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qstat.Po@am__quote@ @@ -309,37 +299,47 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ut2004.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wic.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: +dist_configfilesDATA_INSTALL = $(INSTALL_DATA) install-dist_configfilesDATA: $(dist_configfiles_DATA) @$(NORMAL_INSTALL) - test -z "$(configfilesdir)" || $(mkdir_p) "$(DESTDIR)$(configfilesdir)" + $(mkinstalldirs) $(DESTDIR)$(configfilesdir) @list='$(dist_configfiles_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(dist_configfilesDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(configfilesdir)/$$f'"; \ - $(dist_configfilesDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(configfilesdir)/$$f"; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(dist_configfilesDATA_INSTALL) $$d$$p $(DESTDIR)$(configfilesdir)/$$f"; \ + $(dist_configfilesDATA_INSTALL) $$d$$p $(DESTDIR)$(configfilesdir)/$$f; \ done uninstall-dist_configfilesDATA: @$(NORMAL_UNINSTALL) @list='$(dist_configfiles_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(configfilesdir)/$$f'"; \ - rm -f "$(DESTDIR)$(configfilesdir)/$$f"; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f $(DESTDIR)$(configfilesdir)/$$f"; \ + rm -f $(DESTDIR)$(configfilesdir)/$$f; \ done # This directory's subdirectories are mostly independent; you can cd @@ -349,13 +349,7 @@ # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -367,7 +361,7 @@ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ @@ -375,13 +369,7 @@ mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ @@ -402,7 +390,7 @@ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -413,6 +401,14 @@ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +tags: TAGS + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -421,22 +417,19 @@ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique -tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) gnuconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ - empty_fix=.; \ else \ include_option=--include; \ - empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ + test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ @@ -446,11 +439,10 @@ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) gnuconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) @@ -473,6 +465,19 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = . +distdir = $(PACKAGE)-$(VERSION) + +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } + +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print distdir: $(DISTFILES) $(am__remove_distdir) @@ -488,7 +493,7 @@ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ @@ -503,17 +508,15 @@ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ @@ -524,46 +527,19 @@ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac + $(am__remove_distdir) + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst @@ -583,20 +559,19 @@ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + (cd ../.. && $(mkinstalldirs) "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \ + && rm -f $(distdir).tar.gz \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + @echo "$(distdir).tar.gz is ready for distribution" | \ + sed 'h;s/./=/g;p;x;p;x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ @@ -620,9 +595,8 @@ all-am: Makefile $(PROGRAMS) $(DATA) gnuconfig.h installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(configfilesdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done + $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(configfilesdir) + install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -642,7 +616,7 @@ clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -655,15 +629,13 @@ -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-tags +distclean-am: clean-am distclean-compile distclean-generic distclean-hdr \ + distclean-tags dvi: dvi-recursive dvi-am: -html: html-recursive - info: info-recursive info-am: @@ -702,28 +674,30 @@ uninstall-info: uninstall-info-recursive -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ - check-am clean clean-binPROGRAMS clean-generic clean-recursive \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-shar dist-tarZ dist-zip distcheck distclean \ +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-recursive ctags \ + ctags-recursive dist dist-all dist-gzip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-recursive distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-data \ - install-data-am install-dist_configfilesDATA install-exec \ - install-exec-am install-info install-info-am install-man \ + distuninstallcheck dvi dvi-am dvi-recursive info info-am \ + info-recursive install install-am install-binPROGRAMS \ + install-data install-data-am install-data-recursive \ + install-dist_configfilesDATA install-exec install-exec-am \ + install-exec-recursive install-info install-info-am \ + install-info-recursive install-man install-recursive \ install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-dist_configfilesDATA \ - uninstall-info-am + installdirs-am installdirs-recursive maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-recursive \ + pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \ + tags-recursive uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-dist_configfilesDATA uninstall-info-am \ + uninstall-info-recursive uninstall-recursive cl: cvs2cl.pl --utc --no-wrap --separate-header --no-times -f ChangeLog.cvs - rm -f ChangeLog.cvs.bak + rm -f ChangeLog.cvs.bak qstat.core # 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: diff -urP qstat-2.11/Makefile.noauto qstat-2.11-20080912svn311/Makefile.noauto --- qstat-2.11/Makefile.noauto 2006-10-28 08:36:58.000000000 -0400 +++ qstat-2.11-20080912svn311/Makefile.noauto 2008-09-12 14:52:23.000000000 -0400 @@ -10,12 +10,12 @@ ## NOTE: if you get errors when linking qstat (missing symbols or ## libraries), then modify LDFLAGS or LDLIBS -SRC = config.c debug.c hcache.c md5.c qserver.c qstat.c template.c ut2004.c a2s.c packet_manip.c gs3.c gs2.c gps.c ts2.c doom3.c tm.c +SRC = config.c debug.c hcache.c md5.c qserver.c qstat.c template.c ut2004.c a2s.c packet_manip.c gs3.c gs2.c gps.c ts2.c doom3.c tm.c haze.c wic.c ottd.c fl.c OBJ = $(SRC:.c=.obj) O = $(SRC:.c=.o) SOLARIS_LIBS = -lsocket -lnsl -WINDOWS_LIBS = /ML wsock32.lib +WINDOWS_LIBS = wsock32.lib OS2_LIBS = so32dll.lib tcp32dll.lib EMX_LIBS = -lsocket @@ -39,7 +39,7 @@ windows_debug: $(SRC) rm -f *.pdb - $(CC) $(CFLAGS) /Zi /ML $(SRC) /Feqstat.exe wsock32.lib /link /fixed:no /incremental:no + $(CC) $(CFLAGS) /Zi $(SRC) /Feqstat.exe $(WINDOWS_LIBS) /link /fixed:no /incremental:no os2: $(SRC) $(CC) /Q /W0 /C+ $(SRC) diff -urP qstat-2.11/md5.c qstat-2.11-20080912svn311/md5.c --- qstat-2.11/md5.c 2004-10-17 16:41:52.000000000 -0400 +++ qstat-2.11-20080912svn311/md5.c 2008-09-12 14:52:23.000000000 -0400 @@ -21,7 +21,7 @@ ghost@aladdin.com */ -/* $Id: md5.c,v 1.1 2004/10/17 20:41:52 l-n Exp $ */ +/* $Id: md5.c 73 2004-10-17 20:41:53Z l-n $ */ /* Independent implementation of MD5 (RFC 1321). diff -urP qstat-2.11/md5.h qstat-2.11-20080912svn311/md5.h --- qstat-2.11/md5.h 2004-10-17 16:41:53.000000000 -0400 +++ qstat-2.11-20080912svn311/md5.h 2008-09-12 14:52:23.000000000 -0400 @@ -21,7 +21,7 @@ ghost@aladdin.com */ -/* $Id: md5.h,v 1.1 2004/10/17 20:41:53 l-n Exp $ */ +/* $Id: md5.h 73 2004-10-17 20:41:53Z l-n $ */ /* Independent implementation of MD5 (RFC 1321). diff -urP qstat-2.11/missing qstat-2.11-20080912svn311/missing --- qstat-2.11/missing 2006-04-22 20:59:37.000000000 -0400 +++ qstat-2.11-20080912svn311/missing 2007-09-18 10:10:46.000000000 -0400 @@ -1,10 +1,6 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. - -scriptversion=2005-06-08.21 - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # This program is free software; you can redistribute it and/or modify @@ -19,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -42,24 +38,18 @@ configure_ac=configure.in fi -msg="missing on your system" - case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in -h|--h|--he|--hel|--help) echo "\ @@ -84,15 +74,11 @@ lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Send bug reports to <bug-automake@gnu.org>." - exit $? + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? + echo "missing 0.4 - GNU automake" ;; -*) @@ -101,44 +87,14 @@ exit 1 ;; -esac - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). -case "$1" in - lex|yacc) - # Not GNU programs, they don't have --version. - ;; - - tar) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) + aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 fi - ;; -esac -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case "$1" in - aclocal*) echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." @@ -146,8 +102,13 @@ ;; autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." @@ -155,8 +116,13 @@ ;; autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." @@ -174,8 +140,13 @@ ;; automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." @@ -185,9 +156,14 @@ ;; autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." @@ -209,7 +185,7 @@ bison|yacc) echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." @@ -239,7 +215,7 @@ lex|flex) echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." @@ -261,8 +237,13 @@ ;; help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." @@ -281,30 +262,32 @@ ;; makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if +WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi touch $file ;; tar) shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error @@ -340,8 +323,8 @@ *) echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case @@ -351,10 +334,3 @@ esac exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff -urP qstat-2.11/mkinstalldirs qstat-2.11-20080912svn311/mkinstalldirs --- qstat-2.11/mkinstalldirs 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/mkinstalldirs 2007-09-18 10:10:46.000000000 -0400 @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff -urP qstat-2.11/ottd.c qstat-2.11-20080912svn311/ottd.c --- qstat-2.11/ottd.c 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/ottd.c 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,358 @@ +/* + * qstat 2.11 + * + * opentTTD protocol + * Copyright 2007 Ludwig Nussel + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + */ + +#include <sys/types.h> +#ifndef _WIN32 +#include <sys/socket.h> +#endif +#include <stdio.h> +#include <stdlib.h> + +#include "qstat.h" +#include "qserver.h" +#include "debug.h" + +enum { MAX_VEHICLE_TYPES = 5, MAX_STATION_TYPES = 5 }; + +static const char* vehicle_types[] = { + "num_trains", + "num_trucks", + "num_busses", + "num_aircrafts", + "num_ships", +}; + +static const char* station_types[] = { + "num_stations", + "num_truckbays", + "num_busstations", + "num_airports", + "num_docks", +}; + +int deal_with_ottdmaster_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + const char* reason = "invalid packet"; + int ok = 1; + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + server->server_name = MASTER; + + if(swap_short_from_little(rawpkt) != pktlen) + { + reason = "invalid packet length"; + ok = 0; + } + if(rawpkt[2] != 7) + { + reason = "invalid packet type"; + ok = 0; + } + + if(rawpkt[3] != 1) + { + reason = "invalid packet version"; + ok = 0; + } + + if(ok) + { + unsigned num = swap_short_from_little(&rawpkt[4]); + rawpkt += 6; + pktlen -= 6; + if(num && num*6 <= pktlen) + { + unsigned i; + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len + pktlen ); + memset(server->master_pkt + server->master_pkt_len, 0, pktlen ); + server->master_pkt_len += pktlen; + for(i=0; i < num*6; i+=6) + { + memcpy(&server->master_pkt[i], &rawpkt[i], 4); + server->master_pkt[i+4] = rawpkt[i+5]; + server->master_pkt[i+5] = rawpkt[i+4]; + } + server->n_servers += num; + ok = 1; + } + else + { + ok = 0; + } + } + + if(!ok) + { + malformed_packet(server, reason); + return DONE_FORCE; + } + + bind_sockets(); + + return DONE_AUTO; +} + +#define xstr(s) str(s) +#define str(s) #s + +#define GET_STRING do { \ + str = (char*)ptr; \ + ptr = memchr(ptr, '\0', end-ptr); \ + if ( !ptr ) \ + { \ + reason = __FILE__ ":" xstr(__LINE__) " invalid packet"; \ + goto out; \ + } \ + ++ptr; \ + } while(0) + +#define FAIL_IF(cond, msg) \ + if((cond)) { \ + reason = __FILE__ ":" xstr(__LINE__) " " msg; \ + goto out; \ + } + +#define INVALID_IF(cond) \ + FAIL_IF(cond, "invalid packet") + +int deal_with_ottd_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + const char* reason = NULL; + unsigned char *ptr = (unsigned char*)rawpkt; + unsigned char *end = (unsigned char*)(rawpkt + pktlen); + unsigned char type; + char* str; + char buf[32]; + + unsigned ver; + + server->n_servers++; + if ( server->server_name == NULL) + { + server->ping_total += time_delta( &packet_recv_time, &server->packet_time1); + server->n_requests++; + } + else + { + gettimeofday( &server->packet_time1, NULL); + } + + FAIL_IF(pktlen < 4 || swap_short_from_little(rawpkt) > pktlen, "invalid packet"); + + type = ptr[2]; + ver = ptr[3]; + ptr += 4; + + debug(3, "len %hu type %hhu ver %hhu", swap_short_from_little(rawpkt), type, ver); + + FAIL_IF(ver != 4, "only version 4 servers are supported"); + + if(type == 1) // info packet + { + unsigned numgrf = *ptr; + FAIL_IF(ptr + numgrf * 20 + 1 > end, "invalid newgrf number"); + ptr += numgrf * 20 + 1; + + snprintf(buf, sizeof(buf), "%u", swap_long_from_little(ptr)); + add_rule(server, "date_days", buf, NO_FLAGS); + ptr += 4; + + snprintf(buf, sizeof(buf), "%u", swap_long_from_little(ptr)); + add_rule(server, "startdate_days", buf, NO_FLAGS); + ptr += 4; + + FAIL_IF(ptr + 3 > end, "invalid packet"); + + snprintf(buf, sizeof(buf), "%hhu", ptr[0]); + add_rule(server, "maxcompanies", buf, NO_FLAGS); + snprintf(buf, sizeof(buf), "%hhu", ptr[1]); + add_rule(server, "numcompanies", buf, NO_FLAGS); + server->max_spectators = ptr[2]; + ptr += 3; + + GET_STRING; + server->server_name = strdup(str); + + GET_STRING; + add_rule(server, "version", str, NO_FLAGS); + + FAIL_IF(ptr + 7 > end, "invalid packet"); + + { + static const char* langs[] = { + "any", + "English", + "German", + "French" + }; + unsigned i = *ptr++; + if(i > 3) i = 0; + add_rule(server, "language", (char*)langs[i], NO_FLAGS); + } + + add_rule(server, "password", *ptr++ ? "1" : "0", NO_FLAGS); + + server->max_players = *ptr++; + server->num_players = *ptr++; + server->num_spectators = *ptr++; + + GET_STRING; + + server->map_name = strdup(str); + + snprintf(buf, sizeof(buf), "%hu", swap_short_from_little(ptr)); + add_rule(server, "map_width", buf, NO_FLAGS); + snprintf(buf, sizeof(buf), "%hu", swap_short_from_little(ptr)); + add_rule(server, "map_height", buf, NO_FLAGS); + + { + static const char* sets[] = { + "temperate", + "arctic", + "desert", + "toyland" + }; + unsigned i = *ptr++; + if(i > 3) i = 0; + add_rule(server, "map_set", (char*)sets[i], NO_FLAGS); + } + + add_rule(server, "dedicated", *ptr++ ? "1" : "0", NO_FLAGS); + } + else if(type == 3) // player packet + { + unsigned i, j; + INVALID_IF(ptr + 2 > end); + + server->num_players = *ptr++; + + for(i = 0; i < server->num_players; ++i) + { + unsigned long long lli; + struct player* player; + unsigned char nr; + + nr = *ptr++; + + debug(3, "player number %d", nr); + player = add_player(server, i); + FAIL_IF(!player, "can't allocate player"); + + GET_STRING; + player->name = strdup(str); + debug(3, "name %s", str); + player->frags = 0; + + INVALID_IF(ptr + 4 + 3*8 + 2 + 1 + 2*MAX_VEHICLE_TYPES + 2*MAX_STATION_TYPES > end); + + snprintf(buf, sizeof(buf), "%u", swap_long_from_little(ptr)); + player_add_info(player, "startdate", buf, 0); + ptr += 4; + + lli = swap_long_from_little(ptr+4); + lli <<= 32; + lli += swap_long_from_little(ptr); + snprintf(buf, sizeof(buf), "%lld", lli); + player_add_info(player, "value", buf, 0); + ptr += 8; + + lli = swap_long_from_little(ptr+4); + lli <<= 32; + lli = swap_long_from_little(ptr); + snprintf(buf, sizeof(buf), "%lld", lli); + player_add_info(player, "money", buf, 0); + ptr += 8; + + lli = swap_long_from_little(ptr+4); + lli <<= 32; + lli += swap_long_from_little(ptr); + snprintf(buf, sizeof(buf), "%lld", lli); + player_add_info(player, "income", buf, 0); + ptr += 8; + + snprintf(buf, sizeof(buf), "%hu", swap_short_from_little(ptr)); + player_add_info(player, "performance", buf, 0); + ptr += 2; + + player_add_info(player, "password", *ptr?"1":"0", 0); + ++ptr; + + for (j = 0; j < MAX_VEHICLE_TYPES; ++j) + { + snprintf(buf, sizeof(buf), "%hu", swap_short_from_little(ptr)); + player_add_info(player, (char*)vehicle_types[j], buf, 0); + ptr += 2; + } + for (j = 0; j < MAX_STATION_TYPES; ++j) + { + snprintf(buf, sizeof(buf), "%hu", swap_short_from_little(ptr)); + player_add_info(player, (char*)station_types[j], buf, 0); + ptr += 2; + } + + // connections + while(ptr + 1 < end && *ptr) + { + ++ptr; + GET_STRING; // client name + debug(3, "%s played by %s", str, player->name); + GET_STRING; // id + INVALID_IF(ptr + 4 > end); + ptr += 4; + } + + ++ptr; // record terminated by zero byte + } + + // spectators + while(ptr + 1 < end && *ptr) + { + ++ptr; + GET_STRING; // client name + debug(3, "spectator %s", str); + GET_STRING; // id + INVALID_IF(ptr + 4 > end); + ptr += 4; + } + ++ptr; // record terminated by zero byte + + server->next_rule = NO_SERVER_RULES; // we're done + server->next_player_info = server->num_players; // we're done + } + else + { + reason = "invalid type"; + } + +out: + if(reason) + { + malformed_packet(server, reason); + } + + server->retry1 = n_retries; // we're done with this packet, reset retry counter + + return reason ? DONE_FORCE : DONE_AUTO; +} + +int send_ottdmaster_request_packet(struct qserver *server) +{ + return qserver_send_initial(server, server->type->master_packet, server->type->master_len); +} + +int send_ottd_request_packet(struct qserver *server) +{ + qserver_send_initial(server, server->type->status_packet, server->type->status_len); + + if(get_server_rules || get_player_info) + { + server->next_rule = ""; // trigger calling send_a2s_rule_request_packet + } + + return 1; +} diff -urP qstat-2.11/ottd.h qstat-2.11-20080912svn311/ottd.h --- qstat-2.11/ottd.h 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/ottd.h 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,20 @@ +/* + * qstat 2.11 + * + * opentTTD protocol + * Copyright 2007 Ludwig Nussel + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + */ +#ifndef QSTAT_OTTD_H +#define QSTAT_OTTD_H + +#include "qstat.h" + +int send_ottdmaster_request_packet(struct qserver *server); +int deal_with_ottdmaster_packet(struct qserver *server, char *rawpkt, int pktlen); + +int send_ottd_request_packet(struct qserver *server); +int deal_with_ottd_packet(struct qserver *server, char *rawpkt, int pktlen); + +#endif diff -urP qstat-2.11/packet_manip.c qstat-2.11-20080912svn311/packet_manip.c --- qstat-2.11/packet_manip.c 2006-08-14 05:51:21.000000000 -0400 +++ qstat-2.11-20080912svn311/packet_manip.c 2008-09-12 14:52:23.000000000 -0400 @@ -29,7 +29,7 @@ int maxes[MAX_PACKETS]; int lengths[MAX_PACKETS]; SavedData *sdata = &server->saved_data; - int i, p, done = 0; + int i, p, ret = INPROGRESS; n_ids = 0; memset( &segments[0][0], 0, sizeof(segments) ); @@ -116,7 +116,7 @@ // reset to be unusable pkt_id_index = -1; free( combined ); - return 0; + return INPROGRESS; } memcpy( combined + datalen, segments[pkt_id_index][p]->data, segments[pkt_id_index][p]->datalen ); datalen += segments[pkt_id_index][p]->datalen; @@ -134,12 +134,12 @@ print_packet( server, combined, datalen ); } // Call the server's packet processing method - done = ( (int (*)()) server->type->packet_func)( server, combined, datalen ); + ret = ( (int (*)()) server->type->packet_func)( server, combined, datalen ); free( combined ); // Note: this is currently invalid as packet processing methods // are void not int - if ( done || server->saved_data.data == NULL) + if ( INPROGRESS != ret || NULL == server->saved_data.data ) { break; } @@ -147,7 +147,7 @@ // reset to be unusable pkt_id_index = -1; - return done; + return ret; } int add_packet( struct qserver *server, unsigned int pkt_id, int pkt_index, int pkt_max, int datalen, char *data, int calc_max ) @@ -196,7 +196,6 @@ if ( NULL == sdata->data ) { fprintf( stderr, "Out of memory\n" ); - cleanup_qserver( server, 1 ); return 0; } diff -urP qstat-2.11/qserver.c qstat-2.11-20080912svn311/qserver.c --- qstat-2.11/qserver.c 2006-05-24 10:39:41.000000000 -0400 +++ qstat-2.11-20080912svn311/qserver.c 2008-09-12 14:52:23.000000000 -0400 @@ -20,30 +20,41 @@ #include <stdlib.h> #include <sys/types.h> +// TODO: get rid of this and use send_packet instead, remove n_requests hack from a2s int qserver_send_initial(struct qserver* server, const char* data, size_t len) { int ret = 0; - if(data) + if( data ) { - if ( server->flags & FLAG_BROADCAST) - ret = send_broadcast(server, data, len); - else - ret = send( server->fd, data, len, 0); + debug( 2, "[%s] send", server->type->type_prefix ); + if( 4 <= get_debug_level() ) + { + output_packet( server, data, len, 1 ); + } - if ( ret == SOCKET_ERROR) - { - perror( "send"); - } + if ( server->flags & FLAG_BROADCAST) + { + ret = send_broadcast(server, data, len); + } + else + { + ret = send( server->fd, data, len, 0); + } + + if ( ret == SOCKET_ERROR) + { + send_error( server, ret ); + } } if ( server->retry1 == n_retries || server->flags & FLAG_BROADCAST) { - gettimeofday( &server->packet_time1, NULL); + gettimeofday( &server->packet_time1, NULL); } else { - server->n_retries++; + server->n_retries++; } server->retry1--; @@ -58,15 +69,19 @@ if(data) { - if ( server->flags & FLAG_BROADCAST) - ret = send_broadcast(server, data, len); - else - ret = send( server->fd, data, len, 0); + if ( server->flags & FLAG_BROADCAST) + { + ret = send_broadcast(server, data, len); + } + else + { + ret = send( server->fd, data, len, 0); + } - if ( ret == SOCKET_ERROR) - { - perror( "send"); - } + if ( ret == SOCKET_ERROR) + { + send_error( server, ret ); + } } server->retry1 = n_retries; @@ -78,22 +93,25 @@ } -int -send_broadcast( struct qserver *server, const char *pkt, size_t pktlen) +int send_broadcast( struct qserver *server, const char *pkt, size_t pktlen) { struct sockaddr_in addr; addr.sin_family= AF_INET; if ( no_port_offset || server->flags & TF_NO_PORT_OFFSET) + { addr.sin_port= htons(server->port); + } else + { addr.sin_port= htons((unsigned short)( server->port + server->type->port_offset )); + } addr.sin_addr.s_addr= server->ipaddr; memset( &(addr.sin_zero), 0, sizeof(addr.sin_zero)); - return sendto( server->fd, (const char*) pkt, pktlen, 0, - (struct sockaddr *) &addr, sizeof(addr)); + + return sendto( server->fd, (const char*) pkt, pktlen, 0, (struct sockaddr *) &addr, sizeof(addr)); } -void register_send( struct qserver *server ) +int register_send( struct qserver *server ) { if ( server->retry1 == n_retries || server->flags & FLAG_BROADCAST ) { @@ -109,6 +127,8 @@ gettimeofday( &server->packet_time1, NULL); server->retry1--; server->n_packets++; + + return INPROGRESS; } int send_packet( struct qserver* server, const char* data, size_t len ) @@ -118,8 +138,9 @@ debug( 2, "[%s] send", server->type->type_prefix ); if( 4 <= get_debug_level() ) { - print_packet( server, data, len ); + output_packet( server, data, len, 1 ); } + if( data ) { if ( server->flags & FLAG_BROADCAST ) @@ -133,18 +154,24 @@ if ( ret == SOCKET_ERROR ) { - unsigned int ipaddr = ntohl(server->ipaddr) ; - fprintf( stderr, "Error on %d.%d.%d.%d\n", - (ipaddr>>24)&0xff, - (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, - ipaddr&0xff - ); - perror( "send" ); + return send_error( server, ret ); } } register_send( server ); - return ret; + return INPROGRESS; +} + +int send_error( struct qserver *server, int rc ) +{ + unsigned int ipaddr = ntohl(server->ipaddr); + fprintf(stderr, "Error on %d.%d.%d.%d, skipping ...\n", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff + ); + perror("send"); + return rc; } diff -urP qstat-2.11/qserver.h qstat-2.11-20080912svn311/qserver.h --- qstat-2.11/qserver.h 2006-05-24 10:26:00.000000000 -0400 +++ qstat-2.11-20080912svn311/qserver.h 2008-09-12 14:52:23.000000000 -0400 @@ -39,6 +39,7 @@ struct query_param *params; unsigned long challenge; unsigned short port; + unsigned short orig_port; // This port is always constant from creation where as port can be updated based on the query results unsigned short query_port; /** \brief number of retries _left_ for status query or rule query. * @@ -103,6 +104,8 @@ int max_players; int num_players; int protocol_version; + int max_spectators; + int num_spectators; SavedData saved_data; @@ -185,7 +188,7 @@ * * This updates n_requests, n_packets, packet_time1 and decrements n_retries */ -void register_send( struct qserver *server ); +int register_send( struct qserver *server ); /** * Sends a packet to the server either direct or via broadcast. @@ -194,4 +197,9 @@ */ int send_packet( struct qserver* server, const char* data, size_t len ); +/** + * Logs the error from a socket send + */ +int send_error( struct qserver *server, int rc ); + #endif diff -urP qstat-2.11/qstat.c qstat-2.11-20080912svn311/qstat.c --- qstat-2.11/qstat.c 2006-10-28 08:37:18.000000000 -0400 +++ qstat-2.11-20080912svn311/qstat.c 2008-09-12 14:52:23.000000000 -0400 @@ -18,18 +18,20 @@ */ #ifdef HAVE_CONFIG_H -# include "gnuconfig.h" + #include "gnuconfig.h" #else -# ifndef VERSION -# define VERSION "2.11" -# endif + #ifndef VERSION + #define VERSION "2.12" + #endif #endif -char *qstat_version= VERSION; +#define RECV_BUF 204800 + +char *qstat_version = VERSION; /* OS/2 defines */ #ifdef __OS2__ -#define BSD_SELECT + #define BSD_SELECT #endif #include <stdio.h> @@ -48,112 +50,113 @@ #ifndef _WIN32 -#include <signal.h> -#include <unistd.h> -#include <sys/socket.h> -#ifndef VMS -#include <sys/param.h> -#endif -#include <sys/time.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <netdb.h> -#include <arpa/inet.h> - -#ifndef F_SETFL -#include <fcntl.h> -#endif - -#ifdef __hpux -extern int h_errno; -#define STATIC static -#else -#define STATIC -#endif - -#define INVALID_SOCKET -1 -#ifndef INADDR_NONE -#define INADDR_NONE ~0 -#endif -#define sockerr() errno + #include <signal.h> + #include <unistd.h> + #include <sys/socket.h> + #ifndef VMS + #include <sys/param.h> + #endif + #include <sys/time.h> + #include <netinet/in.h> + #include <netinet/tcp.h> + #include <netdb.h> + #include <arpa/inet.h> + + #ifndef F_SETFL + #include <fcntl.h> + #endif + + #ifdef __hpux + extern int h_errno; + #define STATIC static + #else + #define STATIC + #endif + + #define INVALID_SOCKET -1 + #ifndef INADDR_NONE + #define INADDR_NONE ~0 + #endif + #define sockerr() errno #endif /* _WIN32 */ #ifdef __OS2__ -#include <sys/socket.h> -#include <sys/select.h> -#include <sys/time.h> -#include <netinet/in.h> -#include <netdb.h> -#include <utils.h> - -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 -#define close(a) soclose(a) + #include <sys/socket.h> + #include <sys/select.h> + #include <sys/time.h> + #include <netinet/in.h> + #include <netdb.h> + #include <utils.h> + + #define INVALID_SOCKET -1 + #define SOCKET_ERROR -1 + #define close(a) soclose(a) #endif /* __OS2__ */ + #ifndef FD_SETSIZE -#define FD_SETSIZE 64 + #define FD_SETSIZE 64 #endif /* Figure out whether to use poll() or select() -*/ + */ #ifndef USE_POLL -#ifndef USE_SELECT + #ifndef USE_SELECT -#ifdef sun -#define USE_POLL -#endif -#ifdef linux -#define USE_POLL -#include <poll.h> -#endif -#ifdef __linux__ -#define USE_POLL -#include <poll.h> -#endif -#ifdef __linux -#define USE_POLL -#include <poll.h> -#endif -#ifdef __hpux -#define USE_POLL -#include <sys/poll.h> -#endif -#ifdef __OpenBSD__ -#define USE_POLL -#include <sys/poll.h> -#endif -#ifdef _AIX -#define USE_POLL -#include <poll.h> -#endif -#ifdef _WIN32 -#define USE_SELECT -#endif -#ifdef __EMX__ -#define USE_SELECT -#endif + #ifdef sun + #define USE_POLL + #endif + #ifdef linux + #define USE_POLL + #include <poll.h> + #endif + #ifdef __linux__ + #define USE_POLL + #include <poll.h> + #endif + #ifdef __linux + #define USE_POLL + #include <poll.h> + #endif + #ifdef __hpux + #define USE_POLL + #include <sys/poll.h> + #endif + #ifdef __OpenBSD__ + #define USE_POLL + #include <sys/poll.h> + #endif + #ifdef _AIX + #define USE_POLL + #include <poll.h> + #endif + #ifdef _WIN32 + #define USE_SELECT + #endif + #ifdef __EMX__ + #define USE_SELECT + #endif -#endif /* USE_SELECT */ + #endif /* USE_SELECT */ #endif /* USE_POLL */ /* If did not chose, then use select() -*/ + */ #ifndef USE_POLL -#ifndef USE_SELECT -#define USE_SELECT -#endif + #ifndef USE_SELECT + #define USE_SELECT + #endif #endif #ifdef ENABLE_DUMP -#ifndef _WIN32 -#include <sys/mman.h> -#include <unistd.h> -#endif -#include <sys/types.h> -#include <sys/stat.h> -static int do_dump; + #ifndef _WIN32 + #include <sys/mman.h> + #include <unistd.h> + #endif + #include <sys/types.h> + #include <sys/stat.h> + static int do_dump; #endif #include "debug.h" @@ -166,92 +169,99 @@ */ -int hostname_lookup= 0; /* set if -H was specified */ -int new_style= 1; /* unset if -old was specified */ -int n_retries= DEFAULT_RETRIES; -int retry_interval= DEFAULT_RETRY_INTERVAL; -int master_retry_interval= DEFAULT_RETRY_INTERVAL*4; -int get_player_info= 0; -int get_server_rules= 0; -int up_servers_only= 0; -int no_full_servers= 0; -int no_empty_servers= 0; -int no_header_display= 0; -int raw_display= 0; -char *raw_delimiter= "\t"; +int hostname_lookup = 0; /* set if -H was specified */ +int new_style = 1; /* unset if -old was specified */ +int n_retries = DEFAULT_RETRIES; +int retry_interval = DEFAULT_RETRY_INTERVAL; +int master_retry_interval = DEFAULT_RETRY_INTERVAL * 4; +int get_player_info = 0; +int get_server_rules = 0; +int up_servers_only = 0; +int no_full_servers = 0; +int no_empty_servers = 0; +int no_header_display = 0; +int raw_display = 0; +char *raw_delimiter = "\t"; char *multi_delimiter = "|"; -int player_address= 0; -int hex_player_names= 0; -int hex_server_names= 0; -int name_xforms= 1; -int strip_carets= 1; -int max_simultaneous= MAXFD_DEFAULT; +int player_address = 0; +int hex_player_names = 0; +int hex_server_names = 0; +int name_xforms = 1; +int strip_carets = 1; +int max_simultaneous = MAXFD_DEFAULT; int sendinterval = 5; -int html_names= -1; +int html_names = -1; extern int html_mode; -int raw_arg= 0; -int show_game_in_raw= 0; -int progress= 0; -int num_servers_total= 0; -int num_players_total= 0; -int max_players_total= 0; -int num_servers_returned= 0; -int num_servers_timed_out= 0; -int num_servers_down= 0; -server_type* default_server_type= NULL; -FILE *OF; /* output file */ -unsigned int source_ip= INADDR_ANY; -unsigned short source_port_low= 0; -unsigned short source_port_high= 0; -unsigned short source_port= 0; +int raw_arg = 0; +int show_game_in_raw = 0; +int progress = 0; +int num_servers_total = 0; +int num_players_total = 0; +int max_players_total = 0; +int num_servers_returned = 0; +int num_servers_timed_out = 0; +int num_servers_down = 0; +server_type *default_server_type = NULL; +FILE *OF; /* output file */ +unsigned int source_ip = INADDR_ANY; +unsigned short source_port_low = 0; +unsigned short source_port_high = 0; +unsigned short source_port = 0; int show_game_port = 0; int no_port_offset = 0; -#define ENCODING_LATIN_1 1 -#define ENCODING_UTF_8 8 -int xml_display= 0; -int xml_encoding= ENCODING_LATIN_1; +#define ENCODING_LATIN_1 1 +#define ENCODING_UTF_8 8 +#define UTF8BYTESWAPNOTACHAR 0xFFFE +#define UTF8NOTACHAR 0xFFFF +#define UTF8MAXFROMUCS4 0x10FFFF + +int output_bom = 0; +int xml_display = 0; +int xml_encoding = ENCODING_LATIN_1; #define SUPPORTED_SERVER_SORT "pgihn" #define SUPPORTED_PLAYER_SORT "PFTNS" #define SUPPORTED_SORT_KEYS "l" SUPPORTED_SERVER_SORT SUPPORTED_PLAYER_SORT char sort_keys[32]; -int player_sort= 0; -int server_sort= 0; +int player_sort = 0; +int server_sort = 0; -void quicksort( void **array, int i, int j, int (*compare)(void*,void*)); -int qpartition( void **array, int i, int j, int (*compare)(void*,void*)); -void sort_servers( struct qserver **array, int size); -void sort_players( struct qserver *server); -int server_compare( struct qserver *one, struct qserver *two); -int player_compare( struct player *one, struct player *two); -int type_option_compare( server_type *one, server_type *two ); -int type_string_compare( server_type *one, server_type *two ); -STATIC int u2xmp_html_color( short color, char *dest, int *font_tag ); -STATIC int ut2k4_html_color( const unsigned char *color, char *dest, int *font_tag ); +void quicksort(void **array, int i, int j, int(*compare)(void *, void*)); +int qpartition(void **array, int i, int j, int(*compare)(void *, void*)); +void sort_servers(struct qserver **array, int size); +void sort_players(struct qserver *server); +int server_compare(struct qserver *one, struct qserver *two); +int player_compare(struct player *one, struct player *two); +int type_option_compare(server_type *one, server_type *two); +int type_string_compare(server_type *one, server_type *two); +int proccess_func_ret( struct qserver *server, int ret ); +int connection_inprogress(); +STATIC int u2xmp_html_color(short color, char *dest, int *font_tag); +STATIC int ut2k4_html_color(const unsigned char *color, char *dest, int *font_tag); -int show_errors= 0; +int show_errors = 0; static int noserverdups = 1; #define DEFAULT_COLOR_NAMES_RAW 0 #define DEFAULT_COLOR_NAMES_DISPLAY 1 -int color_names= -1; +int color_names = -1; #define SECONDS 0 #define CLOCK_TIME 1 #define STOPWATCH_TIME 2 #define DEFAULT_TIME_FMT_RAW SECONDS #define DEFAULT_TIME_FMT_DISPLAY CLOCK_TIME -int time_format= -1; +int time_format = -1; -struct qserver *servers= NULL; -struct qserver **last_server= &servers; -struct qserver **connmap= NULL; +struct qserver *servers = NULL; +struct qserver **last_server = &servers; +struct qserver **connmap = NULL; int max_connmap; -struct qserver *last_server_bind= NULL; -struct qserver *first_server_bind= NULL; -int connected= 0; -time_t run_timeout= 0; +struct qserver *last_server_bind = NULL; +struct qserver *first_server_bind = NULL; +int connected = 0; +time_t run_timeout = 0; time_t start_time; int waiting_for_masters; @@ -260,8080 +270,9086 @@ static struct qserver **server_hash[ADDRESS_HASH_LENGTH]; static unsigned int server_hash_len[ADDRESS_HASH_LENGTH]; static void free_server_hash(); -static void xml_display_player_info_info(struct player* player); +static void xml_display_player_info_info(struct player *player); -char *DOWN= "DOWN"; -char *SYSERROR= "SYSERROR"; -char *TIMEOUT= "TIMEOUT"; -char *MASTER= "MASTER"; -char *SERVERERROR= "ERROR"; -char *HOSTNOTFOUND= "HOSTNOTFOUND"; -char *BFRIS_SERVER_NAME= "BFRIS Server"; -char *GAMESPY_MASTER_NAME= "Gamespy Master"; +char *DOWN = "DOWN"; +char *SYSERROR = "SYSERROR"; +char *TIMEOUT = "TIMEOUT"; +char *MASTER = "MASTER"; +char *SERVERERROR = "ERROR"; +char *HOSTNOTFOUND = "HOSTNOTFOUND"; +char *BFRIS_SERVER_NAME = "BFRIS Server"; +char *GAMESPY_MASTER_NAME = "Gamespy Master"; -int display_prefix= 0; +int display_prefix = 0; char *current_filename; int current_fileline; -int count_bits( int n); +int count_bits(int n); -static int qserver_get_timeout(struct qserver* server, struct timeval* now); -static int wait_for_timeout( unsigned int ms); +static int qserver_get_timeout(struct qserver *server, struct timeval *now); +static int wait_for_timeout(unsigned int ms); static void finish_output(); -static void decode_stefmaster_packet( struct qserver *server, char *pkt, int pktlen); -static void decode_q3master_packet( struct qserver *server, char *pkt, int pktlen); +static int decode_stefmaster_packet(struct qserver *server, char *pkt, int pktlen); +static int decode_q3master_packet(struct qserver *server, char *ikt, int pktlen); -char * ut2003_strdup( const char *string, const char *end, char **next ); -int html_entity( const char c, char *dest ); +char *ut2003_strdup(const char *string, const char *end, char **next); +int html_entity(const char c, char *dest); -static const char * unreal_colors[] = { - "AliceBlue", - "AntiqueWhite", - "Aqua", - "Aquamarine", - "Azure", - "Beige", - "Bisque", - "Black", - "BlanchedAlmond", - "Blue", - "BlueViolet", - "Brown", - "BurlyWood", - "CadetBlue", - "Chartreuse", - "Chocolate", - "Coral", - "CornflowerBlue", - "Cornsilk", - "Crimson", - "Cyan", - "DarkBlue", - "DarkCyan", - "DarkGoldenrod", - "DarkGray", - "DarkGreen", - "DarkKhaki", - "DarkMagenta", - "DarkOliveGreen", - "DarkOrange", - "DarkOrchid", - "DarkRed", - "DarkSalmon", - "DarkSeaGreen", - "DarkSlateBlue", - "DarkSlateGray", - "DarkTurquoise", - "DarkViolet", - "DeepPink", - "DeepSkyBlue", - "DimGray", - "DodgerBlue", - "FireBrick", - "FloralWhite", - "ForestGreen", - "Fuchsia", - "Gainsboro", - "GhostWhite", - "Gold", - "Goldenrod", - "Gray", - "Green", - "GreenYellow", - "Honeydew", - "HotPink", - "IndianRed", - "Indigo", - "Ivory", - "Khaki", - "Lavender", - "LavenderBlush", - "LawnGreen", - "LemonChiffon", - "LightBlue", - "LightCoral", - "LightCyan", - "LightGoldenrodYellow", - "LightGreen", - "LightGrey", - "LightPink", - "LightSalmon", - "LightSeaGreen", - "LightSkyBlue", - "LightSlateGray", - "LightSteelBlue", - "LightYellow", - "Lime", - "LimeGreen", - "Linen", - "Magenta", - "Maroon", - "MediumAquamarine", - "MediumBlue", - "MediumOrchid", - "MediumPurple", - "MediumSeaGreen", - "MediumSlateBlue", - "MediumSpringGreen", - "MediumTurquoise", - "MediumVioletRed", - "MidnightBlue", - "MintCream", - "MistyRose", - "Moccasin", - "NavajoWhite", - "Navy", - "OldLace", - "Olive", - "OliveDrab", - "Orange", - "OrangeRed", - "Orchid", - "PaleGoldenrod", - "PaleGreen", - "PaleTurquoise", - "PaleVioletRed", - "PapayaWhip", - "PeachPuff", - "Peru", - "Pink", - "Plum", - "PowderBlue", - "Purple", - "Red", - "RosyBrown", - "RoyalBlue", - "SaddleBrown", - "Salmon", - "SandyBrown", - "SeaGreen", - "Seashell", - "Sienna", - "Silver", - "SkyBlue", - "SlateBlue", - "SlateGray", - "Snow", - "SpringGreen", - "SteelBlue", - "Tan", - "Teal", - "Thistle", - "Tomato", - "Turquoise", - "Violet", - "Wheat", - "White", - "WhiteSmoke", - "Yellow", - "YellowGreen", +static const char *unreal_colors[] = +{ + "AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "Black", "BlanchedAlmond", "Blue", "BlueViolet", + "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", + "DarkBlue", "DarkCyan", "DarkGoldenrod", "DarkGray", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", + "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkTurquoise", "DarkViolet", + "DeepPink", "DeepSkyBlue", "DimGray", "DodgerBlue", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", + "GhostWhite", "Gold", "Goldenrod", "Gray", "Green", "GreenYellow", "Honeydew", "HotPink", "IndianRed", "Indigo", "Ivory", + "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", + "LightGoldenrodYellow", "LightGreen", "LightGrey", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", + "LightSlateGray", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquamarine", + "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", + "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", + "Orange", "OrangeRed", "Orchid", "PaleGoldenrod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", + "Peru", "Pink", "Plum", "PowderBlue", "Purple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", + "SeaGreen", "Seashell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "Snow", "SpringGreen", "SteelBlue", "Tan", + "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen", }; -static const char *unreal_rgb_colors[] = { - "#F0F8FF", - "#FAEBD7", - "#00FFFF", - "#7FFFD4", - "#F0FFFF", - "#F5F5DC", - "#FFE4C4", - "#000000", - "#FFEBCD", - "#0000FF", - "#8A2BE2", - "#A52A2A", - "#DEB887", - "#5F9EA0", - "#7FFF00", - "#D2691E", - "#FF7F50", - "#6495ED", - "#FFF8DC", - "#DC143C", - "#00FFFF", - "#00008B", - "#008B8B", - "#B8860B", - "#A9A9A9", - "#006400", - "#BDB76B", - "#8B008B", - "#556B2F", - "#FF8C00", - "#9932CC", - "#8B0000", - "#E9967A", - "#8FBC8F", - "#483D8B", - "#2F4F4F", - "#00CED1", - "#9400D3", - "#FF1493", - "#00BFFF", - "#696969", - "#1E90FF", - "#B22222", - "#FFFAF0", - "#228B22", - "#FF00FF", - "#DCDCDC", - "#F8F8FF", - "#FFD700", - "#DAA520", - "#808080", - "#008000", - "#ADFF2F", - "#F0FFF0", - "#FF69B4", - "#CD5C5C", - "#4B0082", - "#FFFFF0", - "#F0E68C", - "#E6E6FA", - "#FFF0F5", - "#7CFC00", - "#FFFACD", - "#ADD8E6", - "#F08080", - "#E0FFFF", - "#FAFAD2", - "#90EE90", - "#D3D3D3", - "#FFB6C1", - "#FFA07A", - "#20B2AA", - "#87CEFA", - "#778899", - "#B0C4DE", - "#FFFFE0", - "#00FF00", - "#32CD32", - "#FAF0E6", - "#FF00FF", - "#800000", - "#66CDAA", - "#0000CD", - "#BA55D3", - "#9370DB", - "#3CB371", - "#7B68EE", - "#00FA9A", - "#48D1CC", - "#C71585", - "#191970", - "#F5FFFA", - "#FFE4E1", - "#FFE4B5", - "#FFDEAD", - "#000080", - "#FDF5E6", - "#808000", - "#6B8E23", - "#FFA500", - "#FF4500", - "#DA70D6", - "#EEE8AA", - "#98FB98", - "#AFEEEE", - "#DB7093", - "#FFEFD5", - "#FFDAB9", - "#CD853F", - "#FFC0CB", - "#DDA0DD", - "#B0E0E6", - "#800080", - "#FF0000", - "#BC8F8F", - "#4169E1", - "#8B4513", - "#FA8072", - "#F4A460", - "#2E8B57", - "#FFF5EE", - "#A0522D", - "#C0C0C0", - "#87CEEB", - "#6A5ACD", - "#708090", - "#FFFAFA", - "#00FF7F", - "#4682B4", - "#D2B48C", - "#008080", - "#D8BFD8", - "#FF6347", - "#40E0D0", - "#EE82EE", - "#F5DEB3", - "#FFFFFF", - "#F5F5F5", - "#FFFF00", - "#9ACD32", +static const char *unreal_rgb_colors[] = +{ + "#F0F8FF", "#FAEBD7", "#00FFFF", "#7FFFD4", "#F0FFFF", "#F5F5DC", "#FFE4C4", "#000000", "#FFEBCD", "#0000FF", "#8A2BE2", "#A52A2A", + "#DEB887", "#5F9EA0", "#7FFF00", "#D2691E", "#FF7F50", "#6495ED", "#FFF8DC", "#DC143C", "#00FFFF", "#00008B", "#008B8B", + "#B8860B", "#A9A9A9", "#006400", "#BDB76B", "#8B008B", "#556B2F", "#FF8C00", "#9932CC", "#8B0000", "#E9967A", "#8FBC8F", + "#483D8B", "#2F4F4F", "#00CED1", "#9400D3", "#FF1493", "#00BFFF", "#696969", "#1E90FF", "#B22222", "#FFFAF0", "#228B22", + "#FF00FF", "#DCDCDC", "#F8F8FF", "#FFD700", "#DAA520", "#808080", "#008000", "#ADFF2F", "#F0FFF0", "#FF69B4", "#CD5C5C", + "#4B0082", "#FFFFF0", "#F0E68C", "#E6E6FA", "#FFF0F5", "#7CFC00", "#FFFACD", "#ADD8E6", "#F08080", "#E0FFFF", "#FAFAD2", + "#90EE90", "#D3D3D3", "#FFB6C1", "#FFA07A", "#20B2AA", "#87CEFA", "#778899", "#B0C4DE", "#FFFFE0", "#00FF00", "#32CD32", + "#FAF0E6", "#FF00FF", "#800000", "#66CDAA", "#0000CD", "#BA55D3", "#9370DB", "#3CB371", "#7B68EE", "#00FA9A", "#48D1CC", + "#C71585", "#191970", "#F5FFFA", "#FFE4E1", "#FFE4B5", "#FFDEAD", "#000080", "#FDF5E6", "#808000", "#6B8E23", "#FFA500", + "#FF4500", "#DA70D6", "#EEE8AA", "#98FB98", "#AFEEEE", "#DB7093", "#FFEFD5", "#FFDAB9", "#CD853F", "#FFC0CB", "#DDA0DD", + "#B0E0E6", "#800080", "#FF0000", "#BC8F8F", "#4169E1", "#8B4513", "#FA8072", "#F4A460", "#2E8B57", "#FFF5EE", "#A0522D", + "#C0C0C0", "#87CEEB", "#6A5ACD", "#708090", "#FFFAFA", "#00FF7F", "#4682B4", "#D2B48C", "#008080", "#D8BFD8", "#FF6347", + "#40E0D0", "#EE82EE", "#F5DEB3", "#FFFFFF", "#F5F5F5", "#FFFF00", "#9ACD32", + }; -void free_server( struct qserver *server); -void free_player( struct player *player); -void free_rule( struct rule *rule); -void standard_display_server( struct qserver *server); +void free_server(struct qserver *server); +void free_player(struct player *player); +void free_rule(struct rule *rule); +void standard_display_server(struct qserver *server); /* MODIFY HERE * Change these functions to display however you want */ -void -display_server( struct qserver *server) +void display_server(struct qserver *server) { - if ( player_sort) - sort_players( server); - - if ( raw_display) - raw_display_server( server); - else if ( xml_display) - xml_display_server( server); - else if ( have_server_template()) - template_display_server( server); - else - standard_display_server( server); - - free_server( server); -} - -void -standard_display_server( struct qserver *server) -{ - char prefix[64]; - if ( display_prefix) - sprintf( prefix, "%-4s ", server->type->type_prefix); - else - prefix[0]='\0'; - - if ( server->server_name == DOWN) { - if ( ! up_servers_only) - fprintf( OF, "%s%-16s %10s\n", prefix, - (hostname_lookup) ? server->host_name : server->arg, DOWN); - return; - } - if ( server->server_name == TIMEOUT) { - if ( server->flags & FLAG_BROADCAST && server->n_servers) - fprintf( OF, "%s%-16s %d servers\n", prefix, - server->arg, server->n_servers); - else if ( ! up_servers_only) - fprintf( OF, "%s%-16s no response\n", prefix, - (hostname_lookup) ? server->host_name : server->arg); - return; - } - - if ( server->type->master) { - display_qwmaster(server); - return; - } - - if ( no_full_servers && server->num_players >= server->max_players) - return; - - if ( no_empty_servers && server->num_players == 0) - return; - - if ( server->error != NULL) { - fprintf( OF, "%s%-21s ERROR <%s>\n", - prefix, - (hostname_lookup) ? server->host_name : server->arg, - server->error); - return; - } - - if ( new_style) { - char *game= get_qw_game( server); - int map_name_width= 8, game_width=0; - switch( server->type->id) { - case QW_SERVER: case Q2_SERVER: case Q3_SERVER: - game_width= 9; break; - case TRIBES2_SERVER: - map_name_width= 14; game_width= 8; break; - case GHOSTRECON_SERVER: - map_name_width= 15; game_width= 15; break; - case HL_SERVER: - map_name_width= 12; break; - default: - break; + if (player_sort) + { + sort_players(server); } - fprintf( OF, "%s%-21s %2d/%2d %*s %6d / %1d %*s %s\n", - prefix, - (hostname_lookup) ? server->host_name : server->arg, - server->num_players, server->max_players, - map_name_width, (server->map_name) ? server->map_name : "?", - server->n_requests ? server->ping_total/server->n_requests : 999, - server->n_retries, - game_width, game, - xform_name(server->server_name, server)); - if ( get_server_rules) - server->type->display_rule_func( server); - if ( get_player_info) - server->type->display_player_func( server); - } - else { - char name[512]; - sprintf( name, "\"%s\"", server->server_name); - fprintf( OF, "%-16s %10s map %s at %22s %d/%d players %d ms\n", - (hostname_lookup) ? server->host_name : server->arg, - name, server->map_name, - server->address, server->num_players, server->max_players, - server->n_requests ? server->ping_total/server->n_requests : 999); - } -} - -void -display_qwmaster( struct qserver *server) -{ - char *prefix; - prefix= server->type->type_prefix; - - if ( server->error != NULL) - fprintf( OF, "%s %-17s ERROR <%s>\n", prefix, - (hostname_lookup) ? server->host_name : server->arg, - server->error); - else - fprintf( OF, "%s %-17s %d servers %6d / %1d\n", prefix, - (hostname_lookup) ? server->host_name : server->arg, - server->n_servers, - server->n_requests ? server->ping_total/server->n_requests : 999, - server->n_retries); -} - -void -display_header() -{ - if ( ! no_header_display) - fprintf( OF, "%-16s %8s %8s %15s %s\n", "ADDRESS", "PLAYERS", "MAP", - "RESPONSE TIME", "NAME"); -} - -void -display_server_rules( struct qserver *server) -{ - struct rule *rule; - int printed= 0; - rule= server->rules; - for ( ; rule != NULL; rule= rule->next) { - if ( (server->type->id != Q_SERVER && - server->type->id != H2_SERVER) || ! is_default_rule( rule)) { - fprintf( OF, "%c%s=%s", (printed)?',':'\t', rule->name, rule->value); - printed++; - } - } - if ( printed) - fputs( "\n", OF); -} - -void -display_q_player_info( struct qserver *server) -{ - char fmt[128]; - struct player *player; - - strcpy( fmt, "\t#%-2d %3d frags %9s "); - - if ( color_names) - strcat( fmt, "%9s:%-9s "); - else - strcat( fmt, "%2s:%-2s "); - if ( player_address) - strcat( fmt, "%22s "); - else - strcat( fmt, "%s"); - strcat( fmt, "%s\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - player->number, - player->frags, - play_time(player->connect_time,1), - quake_color(player->shirt_color), - quake_color(player->pants_color), - (player_address)?player->address:"", - xform_name( player->name, server)); - } -} - -void -display_qw_player_info( struct qserver *server) -{ - char fmt[128]; - struct player *player; - - strcpy( fmt, "\t#%-6d %3d frags %6s@%-5s %8s"); - - if ( color_names) - strcat( fmt, "%9s:%-9s "); - else - strcat( fmt, "%2s:%-2s "); - strcat( fmt, "%s\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - player->number, - player->frags, - play_time(player->connect_time,0), - ping_time(player->ping), - player->skin ? player->skin : "", - quake_color(player->shirt_color), - quake_color(player->pants_color), - xform_name( player->name, server)); - } -} - -void -display_q2_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( server->flags & FLAG_PLAYER_TEAMS) - fprintf( OF, "\t%3d frags team#%d %8s %s\n", - player->frags, - player->team, - ping_time(player->ping), - xform_name( player->name, server)); - else - fprintf( OF, "\t%3d frags %8s %s\n", - player->frags, - ping_time(player->ping), - xform_name( player->name, server)); - } -} - - -void -display_unreal_player_info( struct qserver *server) -{ - struct player *player; - static const char * fmt_team_number= "\t%3d frags team#%-3d %7s %s\n"; - static const char * fmt_team_name= "\t%3d frags %8s %7s %s\n"; - static const char * fmt_no_team= "\t%3d frags %8s %s\n"; - player= server->players; - for ( ; player != NULL; player= player->next) + if (raw_display) { - if ( server->flags & FLAG_PLAYER_TEAMS) - { - // we use (player->score) ? player->score : player->frags, - // so we get details from halo - if ( player->team_name) - { - fprintf( OF, fmt_team_name, - (player->score && NA_INT != player->score ) ? player->score : player->frags, - player->team_name, - ping_time(player->ping), - xform_name( player->name, server) - ); - } - else - { - fprintf( OF, fmt_team_number, - (player->score && NA_INT != player->score ) ? player->score : player->frags, - player->team, - ping_time(player->ping), - xform_name( player->name, server) - ); - } - } - else - { - fprintf( OF, fmt_no_team, - player->frags, - ping_time(player->ping), - xform_name( player->name, server) - ); - } + raw_display_server(server); + } + else if (xml_display) + { + xml_display_server(server); + } + else if (have_server_template()) + { + template_display_server(server); + } + else + { + standard_display_server(server); } -} - -void -display_shogo_player_info( struct qserver *server) -{ - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t%3d frags %8s %s\n", - player->frags, - ping_time(player->ping), - xform_name( player->name, server)); - } -} - -void -display_halflife_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t%3d frags %8s %s\n", - player->frags, - play_time( player->connect_time,1), - xform_name( player->name, server)); - } -} - -void -display_tribes_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t%4d score team#%d %8s %s\n", - player->frags, - player->team, - ping_time( player->ping), - xform_name( player->name, server)); - } -} - -void -display_tribes2_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\tscore %4d %14s %s\n", - player->frags, - player->team_name ? player->team_name : (player->number == TRIBES_TEAM ? "TEAM" : "?"), - xform_name( player->name, server)); - } -} - -void -display_bfris_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\ttid: %d, ship: %d, team: %s, ping: %d, score: %d, kills: %d, name: %s\n", - player->number, - player->ship, - player->team_name, - player->ping, - player->score, - player->frags, - xform_name( player->name, server)); - } -} - -void -display_descent3_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t%3d frags %3d deaths team#%-3d %7s %s\n", - player->frags, - player->deaths, - player->team, - ping_time(player->ping), - xform_name( player->name, server)); - } -} - -void -display_ghostrecon_player_info( struct qserver *server) -{ - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\tdead=%3d team#%-3d %s\n", - player->deaths, - player->team, - xform_name( player->name, server)); - } -} - -void -display_eye_player_info( struct qserver *server) -{ - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->team_name) - fprintf( OF, "\tscore %4d %6s team %12s %s\n", - player->score, - ping_time(player->ping), - player->team_name, - xform_name( player->name, server)); - else - fprintf( OF, "\tscore %4d %6s team#%d %s\n", - player->score, - ping_time(player->ping), - player->team, - xform_name( player->name, server)); - } + free_server(server); } -int -calculate_armyops_score( struct player *player) +void standard_display_server(struct qserver *server) { - /* Calculates a player's score for ArmyOps from the basic components */ - - int score = 0; - int kill_score = 0; - struct info *info; + char prefix[64]; + if (display_prefix) + { + sprintf(prefix, "%-4s ", server->type->type_prefix); + } + else + { + prefix[0] = '\0'; + } - for ( info = player->info; info; info = info->next ) + if (server->server_name == DOWN) { - if ( 0 == strcmp( info->name, "leader") || 0 == strcmp( info->name, "goal") || 0 == strcmp( info->name, "roe") ) - score += atoi( info->value ); - else if ( 0 == strcmp( info->name, "kia") || 0 == strcmp( info->name, "enemy") ) - kill_score += atoi( info->value ); + if (!up_servers_only) + { + fprintf(OF, "%s%-16s %10s\n", prefix, (hostname_lookup) ? server->host_name: server->arg, DOWN); + } + return ; } - if ( kill_score > 0 ) - score += kill_score; + if (server->server_name == TIMEOUT) + { + if (server->flags &FLAG_BROADCAST && server->n_servers) + { + fprintf(OF, "%s%-16s %d servers\n", prefix, server->arg, server->n_servers); + } + else if (!up_servers_only) + { + fprintf(OF, "%s%-16s no response\n", prefix, (hostname_lookup) ? server->host_name: server->arg); + } + return ; + } - return score; -} + if (server->type->master) + { + display_qwmaster(server); + return ; + } -void -display_gs2_player_info( struct qserver *server) -{ - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->team_name) - fprintf( OF, "\tscore %4d %6s team %12s %s\n", - player->score, - ping_time(player->ping), - player->team_name, - xform_name( player->name, server)); - else - fprintf( OF, "\tscore %4d %6s team#%d %s\n", - player->score, - ping_time(player->ping), - player->team, - xform_name( player->name, server)); - } -} - -void -display_armyops_player_info( struct qserver *server) -{ - struct player *player; + if (no_full_servers && server->num_players >= server->max_players) + { + return ; + } - player= server->players; - for ( ; player != NULL; player= player->next) { - player->score = calculate_armyops_score( player ); + if (no_empty_servers && server->num_players == 0) + { + return ; } - display_gs2_player_info(server); -} + if (server->error != NULL) + { + fprintf(OF, "%s%-21s ERROR <%s>\n", prefix, (hostname_lookup) ? server->host_name: server->arg, server->error); + return ; + } -void -display_ts2_player_info( struct qserver *server) -{ - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) - { - fprintf( OF, "\t%6s %s\n", - ping_time(player->ping), - xform_name( player->name, server) + if (new_style) + { + char *game = get_qw_game(server); + int map_name_width = 8, game_width = 0; + switch (server->type->id) + { + case QW_SERVER: + case Q2_SERVER: + case Q3_SERVER: + game_width = 9; + break; + case TRIBES2_SERVER: + map_name_width = 14; + game_width = 8; + break; + case GHOSTRECON_SERVER: + map_name_width = 15; + game_width = 15; + break; + case HL_SERVER: + map_name_width = 12; + break; + default: + break; + } + fprintf(OF, + "%s%-21s %2d/%-2d %2d/%-2d %*s %6d / %1d %*s %s\n", + prefix, + (hostname_lookup) ? server->host_name: server->arg, + server->num_players, + server->max_players, + server->num_spectators, + server->max_spectators, + map_name_width, + (server->map_name) ? server->map_name: "?", + server->n_requests ? server->ping_total / server->n_requests: 999, + server->n_retries, + game_width, + game, + xform_name(server->server_name, server) + ); + if (get_server_rules) + { + server->type->display_rule_func(server); + } + if (get_player_info) + { + server->type->display_player_func(server); + } + } + else + { + char name[512]; + sprintf(name, "\"%s\"", server->server_name); + fprintf(OF, + "%-16s %10s map %s at %22s %d/%d players %d ms\n", + (hostname_lookup) ? server->host_name: server->arg, + name, + server->map_name, + server->address, + server->num_players, + server->max_players, + server->n_requests ? server->ping_total / server->n_requests: 999 ); - } + } } -void -display_tm_player_info( struct qserver *server) +void display_qwmaster(struct qserver *server) { - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) - { - fprintf( OF, "\t%6s %s\n", - ping_time(player->ping), - xform_name( player->name, server) + char *prefix; + prefix = server->type->type_prefix; + + if (server->error != NULL) + { + fprintf(OF, + "%s %-17s ERROR <%s>\n", + prefix, + (hostname_lookup) ? server->host_name: server->arg, + server->error + ); + } + else + { + fprintf(OF, + "%s %-17s %d servers %6d / %1d\n", + prefix, + (hostname_lookup) ? server->host_name: server->arg, + server->n_servers, + server->n_requests ? server->ping_total / server->n_requests: 999, + server->n_retries ); - } + } } -void -display_doom3_player_info( struct qserver *server) +void display_header() { - struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->tribe_tag) - fprintf( OF, "\t#%-4d score %4d %6s team %12s %s\n", - player->number, - player->score, - ping_time(player->ping), - player->tribe_tag, - xform_name( player->name, server)); - else - fprintf( OF, "\t#%-4d score %4d %6s team#%d %s\n", - player->number, - player->score, - ping_time(player->ping), - player->team, - xform_name( player->name, server)); - } + if (!no_header_display) + { + fprintf(OF, "%-16s %8s %8s %15s %s\n", "ADDRESS", "PLAYERS", "MAP", "RESPONSE TIME", "NAME"); + } } -void -display_hl2_player_info( struct qserver *server ) +void display_server_rules(struct qserver *server) { - // ATM this looks like halflife player info - display_halflife_player_info( server ); + struct rule *rule; + int printed = 0; + rule = server->rules; + for (; rule != NULL; rule = rule->next) + { + if ((server->type->id != Q_SERVER && server->type->id != H2_SERVER) || !is_default_rule(rule)) + { + fprintf(OF, "%c%s=%s", (printed) ? ',' : '\t', rule->name, rule->value); + printed++; + } + } + if (printed) + { + fputs("\n", OF); + } } -void -display_ravenshield_player_info( struct qserver *server) +void display_q_player_info(struct qserver *server) { - struct player *player = server->players; - for ( ; player != NULL; player = player->next ) - { - fprintf( OF, "\t%3d frags %8s %s\n", - player->frags, - play_time( player->connect_time,1), - xform_name( player->name, server)); - } -} + char fmt[128]; + struct player *player; + strcpy(fmt, "\t#%-2d %3d frags %9s "); -void -display_savage_player_info( struct qserver *server) -{ - struct player *player = server->players; - for ( ; player != NULL; player = player->next ) + if (color_names) + { + strcat(fmt, "%9s:%-9s "); + } + else + { + strcat(fmt, "%2s:%-2s "); + } + if (player_address) { - fprintf( OF, "\t%3d frags %8s %s\n", + strcat(fmt, "%22s "); + } + else + { + strcat(fmt, "%s"); + } + strcat(fmt, "%s\n"); + + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, + player->number, player->frags, - play_time( player->connect_time,1), - xform_name( player->name, server)); - } + play_time(player->connect_time, 1), + quake_color(player->shirt_color), + quake_color(player->pants_color), + (player_address) ? player->address: "", + xform_name(player->name, server) + ); + } } - -void -display_farcry_player_info( struct qserver *server) +void display_qw_player_info(struct qserver *server) { - struct player *player = server->players; - for ( ; player != NULL; player = player->next ) + char fmt[128]; + struct player *player; + + strcpy(fmt, "\t#%-6d %5d frags %6s@%-5s %8s"); + + if (color_names) + { + strcat(fmt, "%9s:%-9s "); + } + else + { + strcat(fmt, "%2s:%-2s "); + } + strcat(fmt, "%12s %s\n"); + + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t%3d frags %8s %s\n", + fprintf(OF, fmt, + player->number, player->frags, - play_time( player->connect_time,1), - xform_name( player->name, server)); - } + play_time(player->connect_time, 0), + ping_time(player->ping), + player->skin ? player->skin: "", + quake_color(player->shirt_color), + quake_color(player->pants_color), + xform_name(player->name, server), + xform_name(player->team_name, server) + ); + } } -char * -get_qw_game( struct qserver *server) +void display_q2_player_info(struct qserver *server) { - struct rule *rule; - if ( server->type->game_rule == NULL || *server->type->game_rule == '\0') - { - return ""; - } - rule = server->rules; - for ( ; rule != NULL; rule = rule->next) + struct player *player; + + player = server->players; + for (; player != NULL; player = player->next) { - if ( strcmp( rule->name, server->type->game_rule) == 0) + if (server->flags &FLAG_PLAYER_TEAMS) { - if ( server->type->id == Q3_SERVER && strcmp( rule->value, "baseq3") == 0) - { - return ""; - } - return rule->value; + fprintf(OF,"\t%3d frags team#%d %8s %s\n", player->frags, player->team, ping_time(player->ping), xform_name(player->name, server)); } - } - rule= server->rules; - for ( ; rule != NULL; rule = rule->next) - { - if ( strcmp( rule->name, "game" ) == 0) + else { - return rule->value; + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, ping_time(player->ping), xform_name(player->name, server)); } } - return ""; } -/* Raw output for web master types - */ -#define RD raw_delimiter -void -raw_display_server( struct qserver *server) +void display_unreal_player_info(struct qserver *server) { - char *prefix; - int ping_time; - prefix= server->type->type_prefix; - - if ( server->n_requests) - ping_time= server->ping_total/server->n_requests; - else - ping_time= 999; - - if ( server->server_name == DOWN) { - if ( ! up_servers_only) - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s\n\n", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup)?server->host_name:server->arg, - RD, DOWN); - return; - } - if ( server->server_name == TIMEOUT) { - if ( server->flags & FLAG_BROADCAST && server->n_servers) - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%d\n", prefix, - raw_arg, RD, raw_arg, server->arg, - RD, server->arg, - RD, server->n_servers); - else if ( ! up_servers_only) - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s\n\n", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup)?server->host_name:server->arg, - RD, TIMEOUT); - return; - } - - if ( server->error != NULL) { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s" "%s%s", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, "ERROR", - RD, server->error); - } - else if ( server->type->flags & TF_RAW_STYLE_QUAKE) { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s" "%s%s" "%s%d" "%s%s" "%s%d" "%s%d" "%s%d" "%s%d" "%s%s", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, xform_name( server->server_name, server), - RD, server->address, - RD, server->protocol_version, - RD, server->map_name, - RD, server->max_players, - RD, server->num_players, - RD, ping_time, - RD, server->n_retries, - show_game_in_raw ? RD : "", show_game_in_raw ? get_qw_game(server) : "" - ); - } - else if ( server->type->flags & TF_RAW_STYLE_TRIBES) { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s" "%s%s" "%s%d" "%s%d", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, xform_name( server->server_name, server), - RD, (server->map_name) ? server->map_name : "?", - RD, server->num_players, - RD, server->max_players - ); - } - else if ( server->type->flags & TF_RAW_STYLE_GHOSTRECON) { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s" "%s%s" "%s%d" "%s%d", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, xform_name( server->server_name, server), - RD, (server->map_name) ? server->map_name : "?", - RD, server->num_players, - RD, server->max_players - ); - } - else if ( server->type->master) { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%d", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, server->n_servers - ); - } - else { - fprintf( OF, "%s" "%.*s%.*s" "%s%s" "%s%s" "%s%s" "%s%d" "%s%d" "%s%d" "%s%d" "%s%s", - prefix, - raw_arg, RD, raw_arg, server->arg, - RD, (hostname_lookup) ? server->host_name : server->arg, - RD, xform_name( server->server_name, server), - RD, (server->map_name) ? server->map_name : "?", - RD, server->max_players, - RD, server->num_players, - RD, ping_time, - RD, server->n_retries, - show_game_in_raw ? RD : "", show_game_in_raw ? get_qw_game(server) : "" - ); - } - fputs( "\n", OF); - - if ( server->type->master || server->error != NULL) { - fputs( "\n", OF); - return; - } - - if ( get_server_rules) - server->type->display_raw_rule_func( server); - if ( get_player_info) - server->type->display_raw_player_func( server); - fputs( "\n", OF); -} - -void -raw_display_server_rules( struct qserver *server) -{ - struct rule *rule; - int printed= 0; - rule= server->rules; - for ( ; rule != NULL; rule= rule->next) { - if ( server->type->id == TRIBES2_SERVER) { - char *v; - for ( v= rule->value; *v; v++) - if ( *v == '\n') *v= ' '; - } - fprintf( OF, "%s%s=%s", (printed)?RD:"", rule->name, rule->value); - printed++; - } - if ( server->missing_rules) - fprintf( OF, "%s?", (printed)?RD:""); - fputs( "\n", OF); -} - -void -raw_display_q_player_info( struct qserver *server) -{ - char fmt[] = "%d" "%s%s" "%s%s" "%s%d" "%s%s" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - player->number, - RD, xform_name( player->name, server), - RD, player->address, - RD, player->frags, - RD, play_time(player->connect_time,1), - RD, quake_color(player->shirt_color), - RD, quake_color(player->pants_color) - ); - fputs( "\n", OF); - } -} + struct player *player; + static const char *fmt_team_number = "\t%3d frags team#%-3d %7s %s\n"; + static const char *fmt_team_name = "\t%3d frags %8s %7s %s\n"; + static const char *fmt_no_team = "\t%3d frags %8s %s\n"; -void -raw_display_qw_player_info( struct qserver *server) -{ - char fmt[128]; - struct player *player; - - strcpy( fmt, "%d" "%s%s" "%s%d" "%s%s" "%s%s" "%s%s"); - strcat( fmt, "%s%d" "%s%s"); - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - player->number, - RD, xform_name( player->name, server), - RD, player->frags, - RD, play_time(player->connect_time,1), - RD, quake_color(player->shirt_color), - RD, quake_color(player->pants_color), - RD, player->ping, - RD, player->skin ? player->skin : "" - ); - fputs( "\n", OF); - } + player = server->players; + for (; player != NULL; player = player->next) + { + if (server->flags &FLAG_PLAYER_TEAMS) + { + // we use (player->score) ? player->score : player->frags, + // so we get details from halo + if (player->team_name) + { + fprintf(OF, fmt_team_name, + (player->score && NA_INT != player->score) ? player->score: player->frags, + player->team_name, + ping_time(player->ping), + xform_name(player->name, server) + ); + } + else + { + fprintf(OF, fmt_team_number, + (player->score && NA_INT != player->score) ? player->score: player->frags, + player->team, + ping_time(player->ping), + xform_name(player->name, server) + ); + } + } + else + { + fprintf(OF, fmt_no_team, player->frags, ping_time(player->ping), xform_name(player->name, server)); + } + } } -void -raw_display_q2_player_info( struct qserver *server) +void display_shogo_player_info(struct qserver *server) { - static const char *fmt = "%s" "%s%d" "%s%d"; - static const char *fmt_team = "%s" "%s%d" "%s%d" "%s%d"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( server->flags & FLAG_PLAYER_TEAMS) - fprintf( OF, fmt_team, - xform_name( player->name, server), - RD, player->frags, - RD, player->ping, - RD, player->team - ); - else - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, player->ping - ); - fputs( "\n", OF); - } -} - -void -raw_display_unreal_player_info( struct qserver *server) -{ - static const char *fmt= "%s" "%s%d" "%s%d" "%s%d" "%s%s" "%s%s" "%s%s"; - static const char *fmt_team_name= "%s" "%s%d" "%s%d" "%s%s" "%s%s" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->team_name) - fprintf( OF, fmt_team_name, - xform_name( player->name, server), - RD, player->frags, - RD, player->ping, - RD, player->team_name, - RD, player->skin ? player->skin : "", - RD, player->mesh ? player->mesh : "", - RD, player->face ? player->face : "" - ); - else - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, player->ping, - RD, player->team, - RD, player->skin ? player->skin : "", - RD, player->mesh ? player->mesh : "", - RD, player->face ? player->face : "" - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_halflife_player_info( struct qserver *server) -{ - static char fmt[24]= "%s" "%s%d" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, play_time( player->connect_time,1) - ); - fputs( "\n", OF); - } + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, ping_time(player->ping), xform_name(player->name, server)); + } } -void -raw_display_tribes_player_info( struct qserver *server) +void display_halflife_player_info(struct qserver *server) { - static char fmt[24]= "%s" "%s%d" "%s%d" "%s%d" "%s%d"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, player->ping, - RD, player->team, - RD, player->packet_loss - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_tribes2_player_info( struct qserver *server) -{ - static char fmt[]= "%s" "%s%d" "%s%d" "%s%s" "%s%s" "%s%s"; - struct player *player; - char *type; - - player= server->players; - for ( ; player != NULL; player= player->next) { - switch( player->type_flag) { - case PLAYER_TYPE_BOT: type= "Bot"; break; - case PLAYER_TYPE_ALIAS: type= "Alias"; break; - default: type= ""; break; - } - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, player->team, - RD, player->team_name ? player->team_name : "TEAM", - RD, type, - RD, player->tribe_tag ? xform_name(player->tribe_tag,server) : "" - ); - fputs( "\n", OF); - } + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, play_time(player->connect_time, 1), xform_name(player->name, server)); + } } -void -raw_display_bfris_player_info( struct qserver *server) +void display_fl_player_info(struct qserver *server) { - static char fmt[] = "%d" "%s%d" "%s%s" "%s%d" "%s%d" "%s%d" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - player->number, - RD, player->ship, - RD, player->team_name, - RD, player->ping, - RD, player->score, - RD, player->frags, - RD, xform_name( player->name, server) - ); - fputs( "\n", OF); - } -} - -void -raw_display_descent3_player_info( struct qserver *server) -{ - static char fmt[]= "%s" "%s%d" "%s%d" "%s%d" "%s%d"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, player->deaths, - RD, player->ping, - RD, player->team - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_ghostrecon_player_info( struct qserver *server) -{ - static char fmt[28]= "%s" "%s%d" "%s%d"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->deaths, - RD, player->team - ); - fputs( "\n", OF); - } + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%3d frags %8s %8s %s\n", player->frags, ping_time(player->ping), play_time(player->connect_time, 1), xform_name(player->name, server)); + } } -void -raw_display_eye_player_info( struct qserver *server) +void display_tribes_player_info(struct qserver *server) { - static const char *fmt= "%s" "%s%d" "%s%d" "%s%d" "%s%s" "%s%s"; - static const char *fmt_team_name= "%s" "%s%d" "%s%d" "%s%s" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->team_name) - fprintf( OF, fmt_team_name, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->team_name, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time,1) - ); - else - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->team, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time,1) - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_doom3_player_info( struct qserver *server) -{ - static const char *fmt= "%s" "%s%d" "%s%d" "%s%d" "%s%u"; - static const char *fmt_team_name= "%s" "%s%d" "%s%d" "%s%s" "%s%u"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->tribe_tag) - fprintf( OF, fmt_team_name, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->tribe_tag, - RD, player->number - ); - else - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->team, - RD, player->number + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%4d score team#%d %8s %s\n", player->frags, player->team, ping_time(player->ping), xform_name(player->name, server) ); - fputs( "\n", OF); - } + } } -void -raw_display_hl2_player_info( struct qserver *server ) +void display_tribes2_player_info(struct qserver *server) { - // ATM this looks like halflife player info - raw_display_halflife_player_info( server ); -} + struct player *player; -void -raw_display_gs2_player_info( struct qserver *server) -{ - static const char *fmt= "%s" "%s%d" "%s%d" "%s%d" "%s%s" "%s%s"; - static const char *fmt_team_name= "%s" "%s%d" "%s%d" "%s%s" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) { - if ( player->team_name) - fprintf( OF, fmt_team_name, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->team_name, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time,1) - ); - else - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->score, - RD, player->ping, - RD, player->team, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time,1) - ); - fputs( "\n", OF); - } + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\tscore %4d %14s %s\n", + player->frags, + player->team_name ? player->team_name: (player->number == TRIBES_TEAM ? "TEAM" : "?"), + xform_name(player->name, server) + ); + } } -void -raw_display_armyops_player_info( struct qserver *server) +void display_bfris_player_info(struct qserver *server) { struct player *player; - player= server->players; - for ( ; player != NULL; player= player->next) { - player->score = calculate_armyops_score( player ); - } - - raw_display_gs2_player_info(server); -} - -void -raw_display_ts2_player_info( struct qserver *server) -{ - static const char *fmt= "%s" "%s%d" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) - { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->ping, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time, 1 ) + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\ttid: %d, ship: %d, team: %s, ping: %d, score: %d, kills: %d, name: %s\n", + player->number, + player->ship, + player->team_name, + player->ping, + player->score, + player->frags, + xform_name(player->name, server) ); - fputs( "\n", OF); - } + } } -void -raw_display_tm_player_info( struct qserver *server) +void display_descent3_player_info(struct qserver *server) { - static const char *fmt= "%s" "%s%d" "%s%s" "%s%s"; - struct player *player; - - player= server->players; - for ( ; player != NULL; player= player->next) - { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->ping, - RD, player->skin ? player->skin : "", - RD, play_time( player->connect_time, 1 ) - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_ravenshield_player_info( struct qserver *server) -{ - static char fmt[24]= "%s" "%s%d" "%s%s"; - struct player *player = server->players; - for ( ; player != NULL; player= player->next ) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, play_time( player->connect_time,1) + fprintf(OF, "\t%3d frags %3d deaths team#%-3d %7s %s\n", + player->frags, + player->deaths, + player->team, + ping_time(player->ping), + xform_name(player->name, server) ); - fputs( "\n", OF); - } + } } -void -raw_display_savage_player_info( struct qserver *server) +void display_ghostrecon_player_info(struct qserver *server) { - static char fmt[24]= "%s" "%s%d" "%s%s"; - struct player *player = server->players; - for ( ; player != NULL; player= player->next ) - { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, play_time( player->connect_time,1) - ); - fputs( "\n", OF); - } -} + struct player *player; -void -raw_display_farcry_player_info( struct qserver *server) -{ - static char fmt[24]= "%s" "%s%d" "%s%s"; - struct player *player = server->players; - for ( ; player != NULL; player= player->next ) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, fmt, - xform_name( player->name, server), - RD, player->frags, - RD, play_time( player->connect_time,1) - ); - fputs( "\n", OF); - } + fprintf(OF, "\tdead=%3d team#%-3d %s\n", player->deaths, player->team, xform_name(player->name, server)); + } } -/* XML output - * Contributed by <sgarner@gameplanet.co.nz> :-) - */ - -void -xml_display_server( struct qserver *server) +void display_eye_player_info(struct qserver *server) { - char *prefix; - prefix= server->type->type_prefix; - - if ( server->server_name == DOWN) + struct player *player; + player = server->players; + for (; player != NULL; player = player->next) { - if ( ! up_servers_only) + if (player->team_name) + { + fprintf(OF, "\tscore %4d %6s team %12s %s\n", + player->score, + ping_time(player->ping), + player->team_name, + xform_name(player->name,server) + ); + } + else { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", - xml_escape(prefix), xml_escape(server->arg), xml_escape(DOWN)); - fprintf( OF, "\t\t<hostname>%s</hostname>\n", - xml_escape((hostname_lookup)?server->host_name:server->arg)); - fprintf( OF, "\t</server>\n"); + fprintf(OF, "\tscore %4d %6s team#%d %s\n", + player->score, + ping_time(player->ping), + player->team, + xform_name(player->name,server) + ); } - return; } - if ( server->server_name == TIMEOUT) +} + +int calculate_armyops_score(struct player *player) +{ + /* Calculates a player's score for ArmyOps from the basic components */ + + int score = 0; + int kill_score = 0; + struct info *info; + + for (info = player->info; info; info = info->next) { - if ( server->flags & FLAG_BROADCAST && server->n_servers) + if (0 == strcmp(info->name, "leader") || 0 == strcmp(info->name, "goal") || 0 == strcmp(info->name, "roe")) { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\" servers=\"%d\">\n", - xml_escape(prefix), xml_escape(server->arg), - xml_escape(TIMEOUT), server->n_servers); - fprintf( OF, "\t</server>\n"); + score += atoi(info->value); } - else if ( ! up_servers_only) + else if (0 == strcmp(info->name, "kia") || 0 == strcmp(info->name, "enemy")) { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", - xml_escape(prefix), xml_escape(server->arg), xml_escape(TIMEOUT)); - fprintf( OF, "\t\t<hostname>%s</hostname>\n", - xml_escape((hostname_lookup)?server->host_name:server->arg)); - fprintf( OF, "\t</server>\n"); + kill_score += atoi(info->value); } - return; - } - - if ( server->error != NULL) - { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", - xml_escape(prefix), xml_escape(server->arg), "ERROR"); - fprintf( OF, "\t\t<hostname>%s</hostname>\n", - xml_escape((hostname_lookup)?server->host_name:server->arg)); - fprintf( OF, "\t\t<error>%s</error>\n", - xml_escape(server->error)); } - else if ( server->type->master) + + if (kill_score > 0) { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\" servers=\"%d\">\n", - xml_escape(prefix), xml_escape(server->arg), "UP", server->n_servers); + score += kill_score; } - else { - fprintf( OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", - xml_escape(prefix), xml_escape(server->arg), "UP"); - fprintf( OF, "\t\t<hostname>%s</hostname>\n", - xml_escape((hostname_lookup)?server->host_name:server->arg)); - fprintf( OF, "\t\t<name>%s</name>\n", - xml_escape(xform_name( server->server_name, server))); - fprintf( OF, "\t\t<gametype>%s</gametype>\n", - xml_escape(get_qw_game(server))); - fprintf( OF, "\t\t<map>%s</map>\n", - xml_escape(server->map_name)); - fprintf( OF, "\t\t<numplayers>%d</numplayers>\n", - server->num_players); - fprintf( OF, "\t\t<maxplayers>%d</maxplayers>\n", - server->max_players); - if ( !(server->type->flags & TF_RAW_STYLE_TRIBES)) + return score; +} + +void display_haze_player_info(struct qserver *server) +{ + // ATM this looks like gs2 player info + display_gs2_player_info(server); +} + +void display_gs2_player_info(struct qserver *server) +{ + struct player *player; + player = server->players; + for (; player != NULL; player = player->next) + { + if (player->team_name) { - fprintf( OF, "\t\t<ping>%d</ping>\n", - server->n_requests ? server->ping_total/server->n_requests : 999); - fprintf( OF, "\t\t<retries>%d</retries>\n", - server->n_retries); + fprintf(OF, "\tscore %4d %6s team %12s %s\n", + player->score, + ping_time(player->ping), + player->team_name, + xform_name(player->name,server) + ); } - - if ( server->type->flags & TF_RAW_STYLE_QUAKE) + else { - fprintf( OF, "\t\t<address>%s</address>\n", - xml_escape(server->address)); - fprintf( OF, "\t\t<protocolversion>%d</protocolversion>\n", - server->protocol_version); + fprintf(OF, "\tscore %4d %6s team#%d %s\n", + player->score, + ping_time(player->ping), + player->team, + xform_name(player->name, server) + ); } } +} + +void display_armyops_player_info(struct qserver *server) +{ + struct player *player; - if ( ! server->type->master && server->error == NULL) + player = server->players; + for (; player != NULL; player = player->next) { - if ( get_server_rules) - server->type->display_xml_rule_func( server); - if ( get_player_info) - server->type->display_xml_player_func( server); + player->score = calculate_armyops_score(player); } - fprintf( OF, "\t</server>\n"); + display_gs2_player_info(server); } -void -xml_header() +void display_ts2_player_info(struct qserver *server) { - fprintf( OF, "<?xml version=\"1.0\" encoding=\"%s\"?>\n<qstat>\n", - xml_encoding == ENCODING_LATIN_1 ? "iso-8859-1" : "UTF-8"); + struct player *player; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%6s %s\n", ping_time(player->ping), xform_name(player->name, server)); + } } -void -xml_footer() +void display_wic_player_info(struct qserver *server) { - fprintf( OF, "</qstat>\n"); + struct player *player; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t#%-4d score %4d team %12s role %12s %s\n", + player->number, + player->score, + player->team_name, + player->tribe_tag ? player->tribe_tag : "", + xform_name(player->name, server) + ); + } } -void -xml_display_server_rules( struct qserver *server) +void display_tm_player_info(struct qserver *server) { - struct rule *rule; - rule= server->rules; - - fprintf( OF, "\t\t<rules>\n"); - for ( ; rule != NULL; rule= rule->next) + struct player *player; + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<rule name=\"%s\">%s</rule>\n", - xml_escape(rule->name), xml_escape(rule->value)); - } - fprintf( OF, "\t\t</rules>\n"); + fprintf(OF, "\t%6s %s\n", ping_time(player->ping), xform_name(player->name, server)); + } } -void -xml_display_q_player_info( struct qserver *server) +void display_doom3_player_info(struct qserver *server) { struct player *player; - - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player number=\"%d\">\n", - player->number); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<address>%s</address>\n", - xml_escape(player->address)); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time(player->connect_time,1))); - - if ( color_names) + if (player->tribe_tag) { - fprintf( OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", - xml_escape(quake_color(player->shirt_color))); - fprintf( OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", - xml_escape(quake_color(player->pants_color))); + fprintf(OF, "\t#%-4d score %4d %6s team %12s %s\n", + player->number, + player->score, + ping_time(player->ping), + player->tribe_tag, + xform_name(player->name, server) + ); } else { - fprintf( OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", - quake_color(player->shirt_color)); - fprintf( OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", - quake_color(player->pants_color)); + fprintf(OF, "\t#%-4d score %4d %6s team#%d %s\n", + player->number, + player->score, + ping_time(player->ping), + player->team, + xform_name(player->name, server) + ); } - - fprintf( OF, "\t\t\t</player>\n"); } +} - fprintf( OF, "\t\t</players>\n"); +void display_hl2_player_info(struct qserver *server) +{ + // ATM this looks like halflife player info + display_halflife_player_info(server); } -void -xml_display_qw_player_info( struct qserver *server) +void display_ravenshield_player_info(struct qserver *server) { - struct player *player; + struct player *player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, play_time(player->connect_time, 1), xform_name(player->name, server)); + } +} - fprintf( OF, "\t\t<players>\n"); - player= server->players; - for ( ; player != NULL; player= player->next) +void display_savage_player_info(struct qserver *server) +{ + struct player *player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player number=\"%d\">\n", - player->number); + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, play_time(player->connect_time, 1), xform_name(player->name, server)); + } +} - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time(player->connect_time,1))); - if ( color_names) +void display_farcry_player_info(struct qserver *server) +{ + struct player *player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t%3d frags %8s %s\n", player->frags, play_time(player->connect_time, 1), xform_name(player->name, server)); + } +} + +char *get_qw_game(struct qserver *server) +{ + struct rule *rule; + char *game_rule = server->type->game_rule; + if (game_rule == NULL || *game_rule == '\0') + { + return ""; + } rule = server->rules; + for (; rule != NULL; rule = rule->next) + { + if (strcmp(rule->name, game_rule) == 0) { - fprintf( OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", - xml_escape(quake_color(player->shirt_color))); - fprintf( OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", - xml_escape(quake_color(player->pants_color))); + if (server->type->id == Q3_SERVER && strcmp(rule->value, "baseq3") == 0) + { + return ""; + } + return rule->value; } - else + } + rule = server->rules; + for (; rule != NULL; rule = rule->next) + { + if (0 == strcmp(rule->name, "game") || 0 == strcmp(rule->name, "fs_game")) { - fprintf( OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", - quake_color(player->shirt_color)); - fprintf( OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", - quake_color(player->pants_color)); + return rule->value; } - - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - fprintf( OF, "\t\t\t\t<skin>%s</skin>\n", - player->skin ? xml_escape(player->skin) : ""); - - fprintf( OF, "\t\t\t</player>\n"); } - - fprintf( OF, "\t\t</players>\n"); + return ""; } -void -xml_display_q2_player_info( struct qserver *server) +/* Raw output for web master types + */ + +#define RD raw_delimiter + +void raw_display_server(struct qserver *server) { - struct player *player; + char *prefix; + int ping_time; + prefix = server->type->type_prefix; + + if (server->n_requests) + { + ping_time = server->ping_total / server->n_requests; + } + else + { + ping_time = 999; + } - fprintf( OF, "\t\t<players>\n"); + if (server->server_name == DOWN) + { + if (!up_servers_only) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s\n\n", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name : server->arg, RD, + DOWN + ); + } + return ; + } - player= server->players; - for ( ; player != NULL; player= player->next) + if (server->server_name == TIMEOUT) { - fprintf( OF, "\t\t\t<player>\n"); + if (server->flags &FLAG_BROADCAST && server->n_servers) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%d\n", prefix, raw_arg, RD, raw_arg, server->arg, RD, server->arg, RD, server->n_servers); + } + else if (!up_servers_only) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s\n\n", prefix, raw_arg, RD, raw_arg, server->arg, RD, (hostname_lookup) ? server->host_name : server->arg, RD, TIMEOUT); + } + return ; + } - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", player->frags); - if ( server->flags & FLAG_PLAYER_TEAMS) - fprintf( OF, "\t\t\t\t<team>%d</team>\n", player->team); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); + if (server->error != NULL) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s""%s%s", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + "ERROR", RD, + server->error + ); + } + else if (server->type->flags &TF_RAW_STYLE_QUAKE) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s""%s%s""%s%d""%s%s""%s%d""%s%d""%s%d""%s%d""%s%d""%s%d""%s%s", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + xform_name(server->server_name, server), RD, + server->address, RD, + server->protocol_version, RD, + server->map_name, RD, + server->max_players, RD, + server->num_players, RD, + server->max_spectators, RD, + server->num_spectators, RD, + ping_time, RD, + server->n_retries, + show_game_in_raw ? RD : "", + show_game_in_raw ? get_qw_game(server): "" + ); + } + else if (server->type->flags &TF_RAW_STYLE_TRIBES) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s""%s%s""%s%d""%s%d", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + xform_name(server->server_name, server), RD, + (server->map_name) ? server->map_name: "?", RD, + server->num_players, RD, + server->max_players + ); + } + else if (server->type->flags &TF_RAW_STYLE_GHOSTRECON) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s""%s%s""%s%d""%s%d", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + xform_name(server->server_name, server), RD, + (server->map_name) ? server->map_name: "?", RD, + server->num_players, RD, + server->max_players + ); + } + else if (server->type->master) + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%d", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + server->n_servers + ); + } + else + { + fprintf(OF, "%s""%.*s%.*s""%s%s""%s%s""%s%s""%s%d""%s%d""%s%d""%s%d""%s%s", + prefix, + raw_arg, RD, + raw_arg, + server->arg, RD, + (hostname_lookup) ? server->host_name: server->arg, RD, + xform_name(server->server_name, server), RD, + (server->map_name) ? server->map_name: "?", RD, + server->max_players, RD, + server->num_players, RD, + ping_time, RD, + server->n_retries, + show_game_in_raw ? RD : "", + show_game_in_raw ? get_qw_game(server): "" + ); + } + fputs("\n", OF); - fprintf( OF, "\t\t\t</player>\n"); + if (server->type->master || server->error != NULL) + { + fputs("\n", OF); + return ; } - fprintf( OF, "\t\t</players>\n"); + if (get_server_rules) + { + server->type->display_raw_rule_func(server); + } + if (get_player_info) + { + server->type->display_raw_player_func(server); + } + fputs("\n", OF); } -void xml_display_player_info_info(struct player* player) +void raw_display_server_rules(struct qserver *server) { - struct info *info; - - for (info = player->info; info; info = info->next ) + struct rule *rule; + int printed = 0; + rule = server->rules; + for (; rule != NULL; rule = rule->next) { - if ( info->name ) + if (server->type->id == TRIBES2_SERVER) { - char *name = xml_escape( info->name ); - char *value = xml_escape( info->value ); - fprintf( OF, "\t\t\t\t<%s>%s</%s>\n", name, value, name ); + char *v; + for (v = rule->value; *v; v++) + if (*v == '\n') + { + *v = ' '; + } } + + fprintf(OF, "%s%s=%s", (printed) ? RD : "", rule->name, rule->value); + printed++; + } + if (server->missing_rules) + { + fprintf(OF, "%s?", (printed) ? RD : ""); + } + fputs("\n", OF); +} + +void raw_display_q_player_info(struct qserver *server) +{ + char fmt[] = "%d""%s%s""%s%s""%s%d""%s%s""%s%s""%s%s"; + struct player *player; + + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, + player->number, RD, + xform_name(player->name, server), RD, + player->address, RD, + player->frags, RD, + play_time(player->connect_time, 1), RD, + quake_color(player->shirt_color), RD, + quake_color(player->pants_color) + ); + fputs("\n", OF); } } -void -xml_display_unreal_player_info( struct qserver *server) +void raw_display_qw_player_info(struct qserver *server) { + char fmt[128]; struct player *player; - fprintf( OF, "\t\t<players>\n"); + strcpy(fmt, "%d""%s%s""%s%d""%s%s""%s%s""%s%s"); + strcat(fmt, "%s%d""%s%s""%s%s"); - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf(OF, fmt, + player->number, RD, + xform_name(player->name, server), RD, + player->frags, RD, + play_time(player->connect_time, 1), RD, + quake_color(player->shirt_color), RD, + quake_color(player->pants_color), RD, + player->ping, RD, + player->skin ? player->skin: "", RD, + player->team_name ? player->team_name: "" + ); + fputs("\n", OF); + } +} - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - if ( -999 != player->deaths ) - { - fprintf( OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); - } - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); +void raw_display_q2_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%d"; + static const char *fmt_team = "%s""%s%d""%s%d""%s%d"; + struct player *player; - if ( player->team_name) + player = server->players; + for (; player != NULL; player = player->next) + { + if (server->flags &FLAG_PLAYER_TEAMS) { - fprintf( OF, "\t\t\t\t<team>%s</team>\n", - xml_escape(player->team_name)); + fprintf(OF, fmt_team, xform_name(player->name, server), RD, player->frags, RD, player->ping, RD, player->team); } - else if ( -1 != player->team ) + else { - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, player->ping); } + fputs("\n", OF); + } +} - // Some games dont provide - // so only display if they do - if ( player->skin ) - { - fprintf( OF, "\t\t\t\t<skin>%s</skin>\n", - player->skin ? xml_escape(player->skin) : ""); - } - if ( player->mesh ) +void raw_display_unreal_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%d""%s%d""%s%s""%s%s""%s%s"; + static const char *fmt_team_name = "%s""%s%d""%s%d""%s%s""%s%s""%s%s""%s%s"; + struct player *player; + + player = server->players; + for (; player != NULL; player = player->next) + { + if (player->team_name) { - fprintf( OF, "\t\t\t\t<mesh>%s</mesh>\n", - player->mesh ? xml_escape(player->mesh) : ""); + fprintf(OF, fmt_team_name, + xform_name(player->name,server), RD, + player->frags, RD, + player->ping, RD, + player->team_name, RD, + player->skin ? player->skin: "", RD, + player->mesh ? player->mesh: "", RD, + player->face ? player->face: "" + ); } - if ( player->face ) + else { - fprintf( OF, "\t\t\t\t<face>%s</face>\n", - player->face ? xml_escape(player->face) : ""); + fprintf(OF, fmt, + xform_name(player->name, server), RD, + player->frags, RD, + player->ping, RD, + player->team, RD, + player->skin ? player->skin: "", RD, + player->mesh ? player->mesh: "", RD, + player->face ? player->face: "" + ); } - - xml_display_player_info_info(player); - fprintf( OF, "\t\t\t</player>\n"); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } -void -xml_display_halflife_player_info( struct qserver *server) +void raw_display_halflife_player_info(struct qserver *server) { + static char fmt[24] = "%s""%s%d""%s%s"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); - - fprintf( OF, "\t\t\t</player>\n"); + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, play_time(player->connect_time, 1)); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } -void -xml_display_tribes_player_info( struct qserver *server) +void raw_display_fl_player_info(struct qserver *server) { + static char fmt[24] = "%s""%s%d""%s%s""%s%d""%s%d"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf( + OF, fmt, + xform_name(player->name, server), RD, + player->frags, RD, + play_time(player->connect_time, 1), RD, + player->ping, RD, + player->team + ); + fputs("\n", OF); + } +} - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - fprintf( OF, "\t\t\t\t<packetloss>%d</packetloss>\n", - player->packet_loss); +void raw_display_tribes_player_info(struct qserver *server) +{ + static char fmt[24] = "%s""%s%d""%s%d""%s%d""%s%d"; + struct player *player; - fprintf( OF, "\t\t\t</player>\n"); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, player->ping, RD, player->team, RD, player->packet_loss); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } -void -xml_display_tribes2_player_info( struct qserver *server) +void raw_display_tribes2_player_info(struct qserver *server) { + static char fmt[] = "%s""%s%d""%s%d""%s%s""%s%s""%s%s"; struct player *player; char *type; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - if ( player->team_name) + switch (player->type_flag) { - switch( player->type_flag) - { - case PLAYER_TYPE_BOT: - type= "Bot"; - break; - case PLAYER_TYPE_ALIAS: - type= "Alias"; - break; - default: - type= ""; - break; - } - - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<team number=\"%d\">%s</team>\n", - player->team, xml_escape(player->team_name)); - fprintf( OF, "\t\t\t\t<type>%s</type>\n", - xml_escape(type)); - fprintf( OF, "\t\t\t\t<clan>%s</clan>\n", - player->tribe_tag ? xml_escape(xform_name(player->tribe_tag,server)) : ""); - - fprintf( OF, "\t\t\t</player>\n"); + case PLAYER_TYPE_BOT: + type = "Bot"; + break; + case PLAYER_TYPE_ALIAS: + type = "Alias"; + break; + default: + type = ""; + break; } - } - - fprintf( OF, "\t\t</players>\n"); + fprintf(OF, fmt, + xform_name(player->name, server), RD, + player->frags, RD, + player->team, RD, + player->team_name ? player->team_name : "TEAM", RD, + type, RD, + player->tribe_tag ? xform_name(player->tribe_tag, server): "" + ); + fputs("\n", OF); + } } -void -xml_display_bfris_player_info( struct qserver *server) +void raw_display_bfris_player_info(struct qserver *server) { + static char fmt[] = "%d""%s%d""%s%s""%s%d""%s%d""%s%d""%s%s"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player number=\"%d\">\n", - player->number); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score type=\"score\">%d</score>\n", - player->score); - fprintf( OF, "\t\t\t\t<score type=\"frags\">%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<team>%s</team>\n", - xml_escape(player->team_name)); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - fprintf( OF, "\t\t\t\t<ship>%d</ship>\n", - player->ship); - - fprintf( OF, "\t\t\t</player>\n"); + fprintf(OF, fmt, + player->number, RD, + player->ship, RD, + player->team_name, RD, + player->ping, RD, + player->score, RD, + player->frags, RD, + xform_name(player->name, server) + ); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } -void -xml_display_descent3_player_info( struct qserver *server) +void raw_display_descent3_player_info(struct qserver *server) { + static char fmt[] = "%s""%s%d""%s%d""%s%d""%s%d"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<deaths>%d</deaths>\n", - player->deaths); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); - - fprintf( OF, "\t\t\t</player>\n"); + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, player->deaths, RD, player->ping, RD, player->team); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } -void -xml_display_ravenshield_player_info( struct qserver *server) +void raw_display_ghostrecon_player_info(struct qserver *server) { + static char fmt[28] = "%s""%s%d""%s%d"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); - - fprintf( OF, "\t\t\t</player>\n"); + fprintf(OF, fmt, xform_name(player->name, server), RD, player->deaths, RD, player->team); + fputs("\n", OF); } - - fprintf( OF, "\t\t</players>\n"); } - -void -xml_display_ghostrecon_player_info( struct qserver *server) +void raw_display_eye_player_info(struct qserver *server) { + static const char *fmt = "%s""%s%d""%s%d""%s%d""%s%s""%s%s"; + static const char *fmt_team_name = "%s""%s%d""%s%d""%s%s""%s%s""%s%s"; struct player *player; - fprintf( OF, "\t\t<players>\n"); - - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<deaths>%d</deaths>\n", - player->deaths); - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); - - fprintf( OF, "\t\t\t</player>\n"); + if (player->team_name) + { + fprintf(OF, fmt_team_name, + xform_name(player->name,server), RD, + player->score, RD, + player->ping, RD, + player->team_name, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time,1) + ); + } + else + { + fprintf(OF, fmt, + xform_name(player->name, server), RD, + player->score, RD, + player->ping, RD, + player->team, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time, 1) + ); + } + fputs("\n", OF); } +} + +void raw_display_doom3_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%d""%s%d""%s%u"; + static const char *fmt_team_name = "%s""%s%d""%s%d""%s%s""%s%u"; + struct player *player; - fprintf( OF, "\t\t</players>\n"); + player = server->players; + for (; player != NULL; player = player->next) + { + if (player->tribe_tag) + { + fprintf(OF, fmt_team_name, xform_name(player->name, server), RD, player->score, RD, player->ping, RD, player->tribe_tag, RD, player->number); + } + else + { + fprintf(OF, fmt, xform_name(player->name, server), RD, player->score, RD, player->ping, RD, player->team, RD, player->number); + } + fputs("\n", OF); + } } -void -xml_display_eye_player_info( struct qserver *server) +void raw_display_hl2_player_info(struct qserver *server) { - struct player *player; + // ATM this looks like halflife player info + raw_display_halflife_player_info(server); +} - fprintf( OF, "\t\t<players>\n"); +void raw_display_haze_player_info(struct qserver *server) +{ + // ATM this looks like gs2 player info + raw_display_gs2_player_info(server); +} - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t\t\t<player>\n"); +void raw_display_gs2_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%d""%s%d""%s%s""%s%s"; + static const char *fmt_team_name = "%s""%s%d""%s%d""%s%s""%s%s""%s%s"; + struct player *player; - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->score); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - if ( player->team_name) - fprintf( OF, "\t\t\t\t<team>%s</team>\n", - xml_escape(player->team_name)); + player = server->players; + for (; player != NULL; player = player->next) + { + if (player->team_name) + { + fprintf(OF, fmt_team_name, xform_name(player->name, server), RD, + player->score, RD, + player->ping, RD, + player->team_name, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time,1) + ); + } else - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); - if ( player->skin) - fprintf( OF, "\t\t\t\t<skin>%s</skin>\n", - xml_escape(player->skin)); - if ( player->connect_time) - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); + { + fprintf(OF, fmt, + xform_name(player->name,server), RD, + player->score, RD, + player->ping, RD, + player->team, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time,1) + ); + } + fputs("\n", OF); + } +} + +void raw_display_armyops_player_info(struct qserver *server) +{ + struct player *player; - fprintf( OF, "\t\t\t</player>\n"); - } + player = server->players; + for (; player != NULL; player = player->next) + { + player->score = calculate_armyops_score(player); + } - fprintf( OF, "\t\t</players>\n"); + raw_display_gs2_player_info(server); } -void -xml_display_doom3_player_info( struct qserver *server) +void raw_display_ts2_player_info(struct qserver *server) { - struct player *player; + static const char *fmt = "%s""%s%d""%s%s""%s%s"; + struct player *player; - fprintf( OF, "\t\t<players>\n"); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, + xform_name(player->name,server), RD, + player->ping, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time, 1) + ); + fputs("\n", OF); + } +} - player= server->players; - for ( ; player != NULL; player= player->next) { - fprintf( OF, "\t\t\t<player>\n"); +void raw_display_wic_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%s""%s%s"; + struct player *player; - fprintf( OF, "\t\t\t\t<number>%u</number>\n", - player->number); - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->score); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", - player->ping); - if ( player->tribe_tag) - fprintf( OF, "\t\t\t\t<clan>%s</clan>\n", - player->tribe_tag ? xml_escape(xform_name(player->tribe_tag,server)) : ""); - else - fprintf( OF, "\t\t\t\t<team>%d</team>\n", - player->team); - if ( player->skin) - fprintf( OF, "\t\t\t\t<skin>%s</skin>\n", - xml_escape(player->skin)); - if ( player->connect_time) - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, + xform_name(player->name,server), RD, + player->score, RD, + player->team_name, RD, + player->tribe_tag ? player->tribe_tag : "" + ); + fputs("\n", OF); + } +} - xml_display_player_info_info(player); +void raw_display_tm_player_info(struct qserver *server) +{ + static const char *fmt = "%s""%s%d""%s%s""%s%s"; + struct player *player; - fprintf( OF, "\t\t\t</player>\n"); - } + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, + xform_name(player->name,server), RD, + player->ping, RD, + player->skin ? player->skin: "", RD, + play_time(player->connect_time,1) + ); + fputs("\n", OF); + } +} - fprintf( OF, "\t\t</players>\n"); +void raw_display_ravenshield_player_info(struct qserver *server) +{ + static char fmt[24] = "%s""%s%d""%s%s"; + struct player *player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, play_time(player->connect_time, 1)); + fputs("\n", OF); + } } -void -xml_display_hl2_player_info( struct qserver *server ) +void raw_display_savage_player_info(struct qserver *server) { - // ATM this looks like halflife player info - xml_display_halflife_player_info( server ); + static char fmt[24] = "%s""%s%d""%s%s"; + struct player *player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, play_time(player->connect_time, 1)); + fputs("\n", OF); + } } -void -xml_display_gs2_player_info( struct qserver *server) +void raw_display_farcry_player_info(struct qserver *server) { - struct player *player; + static char fmt[24] = "%s""%s%d""%s%s"; + struct player *player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, fmt, xform_name(player->name, server), RD, player->frags, RD, play_time(player->connect_time, 1)); + fputs("\n", OF); + } +} + +/* XML output + * Contributed by <sgarner@gameplanet.co.nz> :-) + */ - fprintf( OF, "\t\t<players>\n"); +void xml_display_server(struct qserver *server) +{ + char *prefix; + prefix = server->type->type_prefix; - player= server->players; - for ( ; player != NULL; player= player->next) + if (server->server_name == DOWN) { - fprintf( OF, "\t\t\t<player>\n"); - - fprintf( OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); - if ( NA_INT != player->score ) + if (!up_servers_only) { - fprintf( OF, "\t\t\t\t<score>%d</score>\n", player->score); - } - if ( NA_INT != player->deaths ) + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", xml_escape(prefix), xml_escape(server->arg), xml_escape(DOWN)); + fprintf(OF, "\t\t<hostname>%s</hostname>\n", xml_escape((hostname_lookup) ? server->host_name: server->arg)); + fprintf(OF, "\t</server>\n"); + } return ; + } + if (server->server_name == TIMEOUT) + { + if (server->flags &FLAG_BROADCAST && server->n_servers) { - fprintf( OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\" servers=\"%d\">\n", + xml_escape(prefix), + xml_escape(server->arg), + xml_escape(TIMEOUT), + server->n_servers + ); + fprintf(OF, "\t</server>\n"); } - if ( NA_INT != player->frags ) + else if (!up_servers_only) { - fprintf( OF, "\t\t\t\t<frags>%d</frags>\n", player->frags); + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", xml_escape(prefix), xml_escape(server->arg), xml_escape(TIMEOUT)); + fprintf(OF, "\t\t<hostname>%s</hostname>\n", xml_escape((hostname_lookup) ? server->host_name: server->arg)); + fprintf(OF, "\t</server>\n"); } - if ( player->team_name ) + return ; + } + + if (server->error != NULL) + { + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", xml_escape(prefix), xml_escape(server->arg), "ERROR"); + fprintf(OF, "\t\t<hostname>%s</hostname>\n", xml_escape((hostname_lookup) ? server->host_name: server->arg)); + fprintf(OF, "\t\t<error>%s</error>\n", xml_escape(server->error)); + } + else if (server->type->master) + { + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\" servers=\"%d\">\n", xml_escape(prefix), xml_escape(server->arg), "UP", server->n_servers); + } + else + { + fprintf(OF, "\t<server type=\"%s\" address=\"%s\" status=\"%s\">\n", xml_escape(prefix), xml_escape(server->arg), "UP"); + fprintf(OF, "\t\t<hostname>%s</hostname>\n", xml_escape((hostname_lookup) ? server->host_name: server->arg)); + fprintf(OF, "\t\t<name>%s</name>\n", xml_escape(xform_name(server->server_name, server))); + fprintf(OF, "\t\t<gametype>%s</gametype>\n", xml_escape(get_qw_game(server))); + fprintf(OF, "\t\t<map>%s</map>\n", xml_escape(server->map_name)); + fprintf(OF, "\t\t<numplayers>%d</numplayers>\n", server->num_players); + fprintf(OF, "\t\t<maxplayers>%d</maxplayers>\n", server->max_players); + fprintf(OF, "\t\t<numspectators>%d</numspectators>\n", server->num_spectators); + fprintf(OF, "\t\t<maxspectators>%d</maxspectators>\n", server->max_spectators); + + if (!(server->type->flags &TF_RAW_STYLE_TRIBES)) { - fprintf( OF, "\t\t\t\t<team>%s</team>\n", xml_escape(player->team_name)); + fprintf(OF, "\t\t<ping>%d</ping>\n", server->n_requests ? server->ping_total / server->n_requests: 999); + fprintf(OF, "\t\t<retries>%d</retries>\n", server->n_retries); } - else + + if (server->type->flags &TF_RAW_STYLE_QUAKE) { - fprintf( OF, "\t\t\t\t<team>%d</team>\n",player->team); + fprintf(OF, "\t\t<address>%s</address>\n", xml_escape(server->address)); + fprintf(OF, "\t\t<protocolversion>%d</protocolversion>\n", server->protocol_version); } + } - if ( player->skin) + if (!server->type->master && server->error == NULL) + { + if (get_server_rules) { - fprintf( OF, "\t\t\t\t<skin>%s</skin>\n", xml_escape(player->skin)); + server->type->display_xml_rule_func(server); } - - if ( player->connect_time) + if (get_player_info) { - fprintf( OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time( player->connect_time,1))); + server->type->display_xml_player_func(server); } + } - xml_display_player_info_info(player); + fprintf(OF, "\t</server>\n"); +} - fprintf( OF, "\t\t\t</player>\n"); - } +void xml_header() +{ + if (xml_encoding == ENCODING_LATIN_1) + { + fprintf(OF, "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<qstat>\n"); + } + else if (output_bom) + { + fprintf(OF, "%c%c%c<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<qstat>\n", 0xEF, 0xBB, 0xBF); + } + else + { + fprintf(OF, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<qstat>\n"); + } +} - fprintf( OF, "\t\t</players>\n"); +void xml_footer() +{ + fprintf(OF, "</qstat>\n"); } -void -xml_display_armyops_player_info( struct qserver *server) +void xml_display_server_rules(struct qserver *server) { - struct player *player; + struct rule *rule; + rule = server->rules; - player= server->players; - for ( ; player != NULL; player= player->next) + fprintf(OF, "\t\t<rules>\n"); + for (; rule != NULL; rule = rule->next) { - player->score = calculate_armyops_score( player ); + fprintf(OF, "\t\t\t<rule name=\"%s\">%s</rule>\n", xml_escape(rule->name), xml_escape(rule->value)); } - - xml_display_gs2_player_info(server); + fprintf(OF, "\t\t</rules>\n"); } -void -xml_display_ts2_player_info( struct qserver *server) +void xml_display_q_player_info(struct qserver *server) { - struct player *player; + struct player *player; - fprintf( OF, "\t\t<players>\n"); + fprintf(OF, "\t\t<players>\n"); - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf(OF, "\t\t\t<player number=\"%d\">\n", player->number); - fprintf( OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<address>%s</address>\n", xml_escape(player->address)); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); - if ( player->connect_time ) + if (color_names) { - fprintf( OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time( player->connect_time,1))); + fprintf(OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", xml_escape(quake_color(player->shirt_color))); + fprintf(OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", xml_escape(quake_color(player->pants_color))); + } + else + { + fprintf(OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", quake_color(player->shirt_color)); + fprintf(OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", quake_color(player->pants_color)); } - xml_display_player_info_info(player); - fprintf( OF, "\t\t\t</player>\n"); - } + fprintf(OF, "\t\t\t</player>\n"); + } - fprintf( OF, "\t\t</players>\n"); + fprintf(OF, "\t\t</players>\n"); } -void -xml_display_tm_player_info( struct qserver *server) +void xml_display_qw_player_info(struct qserver *server) { - struct player *player; + struct player *player; - fprintf( OF, "\t\t<players>\n"); + fprintf(OF, "\t\t<players>\n"); - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf(OF, "\t\t\t<player number=\"%d\">\n", player->number); - fprintf( OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); - if ( player->connect_time ) + if (color_names) + { + fprintf(OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", xml_escape(quake_color(player->shirt_color))); + fprintf(OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", xml_escape(quake_color(player->pants_color))); + } + else { - fprintf( OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time( player->connect_time,1))); + fprintf(OF, "\t\t\t\t<color for=\"shirt\">%s</color>\n", quake_color(player->shirt_color)); + fprintf(OF, "\t\t\t\t<color for=\"pants\">%s</color>\n", quake_color(player->pants_color)); } - xml_display_player_info_info(player); - fprintf( OF, "\t\t\t</player>\n"); - } + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<skin>%s</skin>\n", player->skin ? xml_escape(player->skin): ""); + fprintf(OF, "\t\t\t\t<team>%s</team>\n", player->team_name ? xml_escape(player->team_name): ""); - fprintf( OF, "\t\t</players>\n"); -} + fprintf(OF, "\t\t\t</player>\n"); + } + + fprintf(OF, "\t\t</players>\n"); +} -void -xml_display_savage_player_info( struct qserver *server) +void xml_display_q2_player_info(struct qserver *server) { struct player *player; - fprintf( OF, "\t\t<players>\n"); + fprintf(OF, "\t\t<players>\n"); - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf(OF, "\t\t\t<player>\n"); - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + if (server->flags &FLAG_PLAYER_TEAMS) + { + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + } + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); - fprintf( OF, "\t\t\t</player>\n"); + fprintf(OF, "\t\t\t</player>\n"); } - fprintf( OF, "\t\t</players>\n"); + fprintf(OF, "\t\t</players>\n"); } -void -xml_display_farcry_player_info( struct qserver *server) +void xml_display_player_info_info(struct player *player) +{ + struct info *info; + + for (info = player->info; info; info = info->next) + { + if (info->name) + { + char *name = xml_escape(info->name); + char *value = xml_escape(info->value); + fprintf(OF, "\t\t\t\t<%s>%s</%s>\n", name, value, name); + } + } +} + +void xml_display_unreal_player_info(struct qserver *server) { struct player *player; - fprintf( OF, "\t\t<players>\n"); + fprintf(OF, "\t\t<players>\n"); - player= server->players; - for ( ; player != NULL; player= player->next) + player = server->players; + for (; player != NULL; player = player->next) { - fprintf( OF, "\t\t\t<player>\n"); + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + if ( - 999 != player->deaths) + { + fprintf(OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); + } fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + + if (player->team_name) + { + fprintf(OF, "\t\t\t\t<team>%s</team>\n", xml_escape(player->team_name)); + } + else if ( - 1 != player->team) + { + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + } - fprintf( OF, "\t\t\t\t<name>%s</name>\n", - xml_escape(xform_name( player->name, server))); - fprintf( OF, "\t\t\t\t<score>%d</score>\n", - player->frags); - fprintf( OF, "\t\t\t\t<time>%s</time>\n", - xml_escape(play_time( player->connect_time,1))); + // Some games dont provide + // so only display if they do + if (player->skin) + { + fprintf(OF, "\t\t\t\t<skin>%s</skin>\n", player->skin ? xml_escape(player->skin): ""); + } + if (player->mesh) + { + fprintf(OF, "\t\t\t\t<mesh>%s</mesh>\n", player->mesh ? xml_escape(player->mesh): ""); + } + if (player->face) + { + fprintf(OF, "\t\t\t\t<face>%s</face>\n", player->face ? xml_escape(player->face): ""); + } - fprintf( OF, "\t\t\t</player>\n"); + xml_display_player_info_info(player); + fprintf(OF, "\t\t\t</player>\n"); } - fprintf( OF, "\t\t</players>\n"); + fprintf(OF, "\t\t</players>\n"); } - -void -display_progress() +void xml_display_halflife_player_info(struct qserver *server) { - static struct timeval rate_start= {0,0}; - char rate[32]; - struct timeval now; + struct player *player; - gettimeofday( &now, NULL); + fprintf(OF, "\t\t<players>\n"); - if ( ! rate_start.tv_sec) - { - rate_start= now; - rate[0]='\0'; - } - else + player = server->players; + for (; player != NULL; player = player->next) { - int delta= time_delta( &now, &rate_start); - if ( delta > 1500 ) - sprintf( rate, " %d servers/sec ", (num_servers_returned+num_servers_timed_out)*1000 / delta); - else - rate[0]='\0'; - } + fprintf(OF, "\t\t\t<player>\n"); - // only print out every 'progress' number of servers. - if ( - 0 != num_servers_returned+num_servers_timed_out && - ( progress == 1 || - (num_servers_returned+num_servers_timed_out) % progress == 0 ) - ) - { - fprintf( stderr, "\r%d/%d (%d timed out, %d down)%s", - num_servers_returned+num_servers_timed_out, - num_servers_total, - num_servers_timed_out, - num_servers_down, - rate - ); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); + + fprintf(OF, "\t\t\t</player>\n"); } + + fprintf(OF, "\t\t</players>\n"); } -/* ----- END MODIFICATION ----- Don't need to change anything below here. */ +void xml_display_fl_player_info(struct qserver *server) +{ + struct player *player; + fprintf(OF, "\t\t<players>\n"); -void set_non_blocking( int fd); -int set_fds( fd_set *fds); -void get_next_timeout( struct timeval *timeout); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); -void set_file_descriptors(); -int wait_for_file_descriptors( struct timeval *timeout); -struct qserver * get_next_ready_server(); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); + fprintf(OF, "\t\t\t</player>\n"); + } -/* Misc flags - */ + fprintf(OF, "\t\t</players>\n"); +} -struct timeval packet_recv_time; -int one_server_type_id= ~ MASTER_SERVER; -static int one= 1; -static int little_endian; -static int big_endian; -unsigned int swap_long( void *); -unsigned short swap_short( void *); -float swap_float_from_little( void *f); -char * strndup( const char *string, size_t len); -#define FORCE 1 +void xml_display_tribes_player_info(struct qserver *server) +{ + struct player *player; -/* Print an error message and the program usage notes - */ + fprintf(OF, "\t\t<players>\n"); -void -usage( char *msg, char **argv, char *a1) -{ - int i; - server_type *type; - server_type **sorted_types; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); - if ( msg) - fprintf( stderr, msg, a1); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<packetloss>%d</packetloss>\n", player->packet_loss); - printf( "Usage: %s [options ...]\n", argv[0]); - printf( "\t[-default server-type] [-cfg file] [-f file] [host[:port]] ...\n"); - printf( "Where host is an IP address or host name\n"); + fprintf(OF, "\t\t\t</player>\n"); + } - sorted_types = (server_type **) malloc( sizeof(server_type *) * n_server_types ); - type = &types[0]; - for ( i = 0; type->id != Q_UNKNOWN_TYPE; type++, i++ ) + fprintf(OF, "\t\t</players>\n"); +} + +void xml_display_tribes2_player_info(struct qserver *server) +{ + struct player *player; + char *type; + + fprintf(OF, "\t\t<players>\n"); + + player = server->players; + for (; player != NULL; player = player->next) { - sorted_types[i] = type; - } - quicksort( (void**)sorted_types, 0, n_server_types-1, (int (*)(void*,void*)) type_option_compare ); + if (player->team_name) + { + switch (player->type_flag) + { + case PLAYER_TYPE_BOT: + type = "Bot"; + break; + case PLAYER_TYPE_ALIAS: + type = "Alias"; + break; + default: + type = ""; + break; + } + fprintf(OF, "\t\t\t<player>\n"); - for ( i = 0; i < n_server_types; i++ ) - { - type = sorted_types[i]; - printf( "%s\t\tquery %s server\n", type->type_option, type->game_name ); - } - - quicksort( (void**)sorted_types, 0, n_server_types-1, (int (*)(void*,void*)) type_string_compare ); - printf( "-default\tset default server type:"); - for ( i = 0; i < n_server_types; type++, i++ ) - { - type = sorted_types[i]; - printf( " %s", type->type_string ); - } - puts(""); - printf( "-nocfg\t\tIgnore qstat configuration loaded from any default location. Must be the first option on the command-line.\n" ); - printf( "-cfg\t\tread the extended types from given file not the default one\n"); - printf( "-f\t\tread hosts from file\n"); - printf( "-R\t\tfetch and display server rules\n"); - printf( "-P\t\tfetch and display player info\n"); - printf( "-sort\t\tsort servers and/or players\n"); - printf( "-u\t\tonly display servers that are up\n"); - printf( "-nf\t\tdo not display full servers\n"); - printf( "-ne\t\tdo not display empty servers\n"); - printf( "-nh\t\tdo not display header line.\n" ); - printf( "-cn\t\tdisplay color names instead of numbers\n"); - printf( "-ncn\t\tdisplay color numbers instead of names\n"); - printf( "-hc\t\tdisplay colors in #rrggbb format\n"); - printf( "-tc\t\tdisplay time in clock format (DhDDmDDs)\n"); - printf( "-tsw\t\tdisplay time in stop-watch format (DD:DD:DD)\n"); - printf( "-ts\t\tdisplay time in seconds\n"); - printf( "-pa\t\tdisplay player address\n"); - printf( "-hpn\t\tdisplay player names in hex\n"); - printf( "-hsn\t\tdisplay server names in hex\n"); - printf( "-nh\t\tdo not display header\n"); - printf( "-old\t\told style display\n"); - printf( "-progress\tdisplay progress meter (text only)\n"); - printf( "-retry\t\tnumber of retries, default is %d\n", DEFAULT_RETRIES); - printf( "-interval\tinterval between retries, default is %.2f seconds\n", - DEFAULT_RETRY_INTERVAL / 1000.0); - printf( "-mi\t\tinterval between master server retries, default is %.2f seconds\n", - (DEFAULT_RETRY_INTERVAL*4) / 1000.0); - printf( "-timeout\ttotal time in seconds before giving up\n"); - printf( "-maxsim\t\tset maximum simultaneous queries\n"); - printf( "-sendinterval\t\tset time in ms between sending packets, default %u\n", sendinterval); - printf( "-errors\t\tdisplay errors\n"); - printf( "-allowserverdups\t\tallow adding multiple servers with same ip:port (needed for ts2)\n"); - printf( "-of\t\toutput file\n"); - printf( "-af\t\tLike -of, but append to the file\n" ); - printf( "-raw <delim>\toutput in raw format using <delim> as delimiter\n"); - printf( "-mdelim <delim>\tFor rules with multi values use <delim> as delimiter\n"); - printf( "-xml\t\toutput status data as an XML document\n"); - printf( "-Th,-Ts,-Tpt\toutput templates: header, server and player\n"); - printf( "-Tr,-Tt\t\toutput templates: rule, and trailer\n"); - printf( "-srcport <range>\tSend packets from these network ports\n"); - printf( "-srcip <IP>\tSend packets using this IP address\n"); - printf( "-H\t\tresolve host names\n"); - printf( "-Hcache\t\thost name cache file\n"); - printf( "-carets\t\tDisplay carets in Quake 3 player names\n" ); - printf( "-d\t\tEnable debug options. Specify multiple times to increase debug level.\n"); -#ifdef ENABLE_DUMP - printf( "-dump\t\twrite received raw packets to dumpNNN files which must not exist before\n"); - printf( "-pkt <file>\tuse file as server reply instead of quering the server. Works only with TF_SINGLE_QUERY servers\n"); -#endif - printf( "-htmlmode\tConvert <, >, and & to the equivalent HTML entities\n" ); - printf( "-htmlnames\tColorize Quake 3 and Tribes 2 player names using html font tags\n" ); - printf( "-nohtmlnames\tDo not colorize Quake 3 and Tribes 2 player names even if $HTML is used in an output template.\n" ); - printf( "-showgameport\tAlways display the game port in QStat output.\n" ); - printf( "-noportoffset\tDont use builtin status port offsets ( assume query port was specified ).\n" ); - printf( "-raw-arg\tWhen used with -raw, always display the server address as it appeared in a file or on the command-line.\n" ); - printf( "-utf8\t\tUse the UTF-8 character encoding for XML output.\n" ); -#ifdef _WIN32 - printf( "-noconsole\t\tFree the console\n" ); -#endif - printf( "\n"); - printf( "Sort keys:\n"); - printf( " servers: p=by-ping, g=by-game, i=by-IP-address, h=by-hostname, n=by-#-players, l=by-list-order\n"); - printf( " players: P=by-ping, F=by-frags, T=by-team, N=by-name\n"); - printf( "\nqstat version %s\n", VERSION); - exit(0); -} + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<team number=\"%d\">%s</team>\n", player->team, xml_escape(player->team_name)); + fprintf(OF, "\t\t\t\t<type>%s</type>\n", xml_escape(type)); + fprintf(OF, "\t\t\t\t<clan>%s</clan>\n", player->tribe_tag ? xml_escape(xform_name(player->tribe_tag, server)): ""); -struct server_arg { - int type_id; - server_type *type; - char *arg; - char *outfilename; - char *query_arg; -}; + fprintf(OF, "\t\t\t</player>\n"); + } + } -server_type* -find_server_type_id( int type_id) -{ - server_type *type= &types[0]; - for ( ; type->id != Q_UNKNOWN_TYPE; type++) - if ( type->id == type_id) - return type; - return NULL; + fprintf(OF, "\t\t</players>\n"); } -server_type* -find_server_type_string( char* type_string) +void xml_display_bfris_player_info(struct qserver *server) { - server_type *type= &types[0]; - char *t= type_string; - for ( ; *t; t++) *t= tolower( *t); + struct player *player; + + fprintf(OF, "\t\t<players>\n"); - for ( ; type->id != Q_UNKNOWN_TYPE; type++) - if ( strcmp( type->type_string, type_string) == 0) - return type; - return NULL; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player number=\"%d\">\n", player->number); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score type=\"score\">%d</score>\n", player->score); + fprintf(OF, "\t\t\t\t<score type=\"frags\">%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<team>%s</team>\n", xml_escape(player->team_name)); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<ship>%d</ship>\n", player->ship); + + fprintf(OF, "\t\t\t</player>\n"); + } + + fprintf(OF, "\t\t</players>\n"); } -server_type* -find_server_type_option( char* option) +void xml_display_descent3_player_info(struct qserver *server) { - server_type *type= &types[0]; - for ( ; type->id != Q_UNKNOWN_TYPE; type++) - if ( strcmp( type->type_option, option) == 0) - return type; - return NULL; + struct player *player; + + fprintf(OF, "\t\t<players>\n"); + + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + + fprintf(OF, "\t\t\t</player>\n"); + } + + fprintf(OF, "\t\t</players>\n"); } -server_type* -parse_server_type_option( char* option, int *outfile, char **query_arg) +void xml_display_ravenshield_player_info(struct qserver *server) { - server_type *type= &types[0]; - char *comma, *arg; - int len; - - *outfile= 0; - *query_arg= 0; + struct player *player; - comma= strchr( option, ','); - if ( comma) - *comma++= '\0'; + fprintf(OF, "\t\t<players>\n"); - for ( ; type->id != Q_UNKNOWN_TYPE; type++) - if ( strcmp( type->type_option, option) == 0) - break; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); - if ( type->id == Q_UNKNOWN_TYPE) - return NULL; + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); - if ( ! comma) - return type; + fprintf(OF, "\t\t\t</player>\n"); + } - if ( strcmp( comma, "outfile") == 0) { - *outfile= 1; - comma= strchr( comma, ','); - if ( ! comma) - return type; - *comma++= '\0'; - } - - *query_arg= strdup(comma); - arg= comma; - do { - comma= strchr( arg, ','); - if (comma) - len= comma-arg; - else - len= strlen( arg); - if ( strncmp( arg, "outfile", len) == 0) - *outfile= 1; - arg= comma+1; - } while ( comma); - return type; -} - -void -add_server_arg( char *arg, int type, char *outfilename, char *query_arg, - struct server_arg **args, int *n, int *max) -{ - if ( *n == *max) { - if ( *max == 0) { - *max= 4; - *args= (struct server_arg*)malloc(sizeof(struct server_arg) * (*max)); - } - else { - (*max)*= 2; - *args= (struct server_arg*) realloc( *args, - sizeof(struct server_arg) * (*max)); - } - } - (*args)[*n].type_id= type; -/* (*args)[*n].type= find_server_type_id( type); */ - (*args)[*n].type= NULL; - (*args)[*n].arg= arg; - (*args)[*n].outfilename= outfilename; - (*args)[*n].query_arg= query_arg; - (*n)++; -} - - -void -add_query_param( struct qserver *server, char *arg) -{ - char *equal; - struct query_param *param; - - equal= strchr( arg, '='); - *equal++= '\0'; - - param= (struct query_param *) malloc( sizeof(struct query_param)); - param->key= arg; - param->value= equal; - sscanf( equal, "%i", ¶m->i_value); - sscanf( equal, "%i", ¶m->ui_value); - param->next= server->params; - server->params= param; -} - -char * -get_param_value( struct qserver *server, const char *key, char *default_value) -{ - struct query_param *p= server->params; - for ( ; p; p= p->next) - if ( strcasecmp( key, p->key) == 0) - return p->value; - return default_value; -} - -int -get_param_i_value( struct qserver *server, char *key, int default_value) -{ - struct query_param *p= server->params; - for ( ; p; p= p->next) - if ( strcasecmp( key, p->key) == 0) - return p->i_value; - return default_value; -} - -unsigned int -get_param_ui_value( struct qserver *server, char *key, - unsigned int default_value) -{ - struct query_param *p= server->params; - for ( ; p; p= p->next) - if ( strcasecmp( key, p->key) == 0) - return p->ui_value; - return default_value; -} - -int -parse_source_address( char *addr, unsigned int *ip, unsigned short *port) -{ - char *colon; - colon= strchr( addr, ':'); - if ( colon) { - *colon= '\0'; - *port= atoi( colon+1); - if ( colon == addr) - return 0; - } - else - *port= 0; - - *ip= inet_addr( addr); - if ( *ip == INADDR_NONE && !isdigit( (unsigned char)*ip)) - *ip= hcache_lookup_hostname( addr); - if ( *ip == INADDR_NONE) { - fprintf( stderr, "%s: Not an IP address or unknown host name\n", addr); - return -1; - } - *ip= ntohl( *ip); - return 0; -} - -int -parse_source_port( char *port, unsigned short *low, unsigned short *high) -{ - char *dash; - *low= atoi( port); - dash= strchr( port, '-'); - *high= 0; - if ( dash) - *high= atoi( dash+1); - if ( *high == 0) - *high= *low; - - if ( *high < *low) { - fprintf( stderr, "%s: Invalid port range\n", port); - return -1; - } - return 0; -} - -void -add_config_server_types() -{ - int n_config_types, n_builtin_types, i; - server_type **config_types; - server_type *new_types, *type; - config_types= qsc_get_config_server_types( &n_config_types); - - if ( n_config_types == 0) - return; - - n_builtin_types= (sizeof( builtin_types) / sizeof(server_type)) - 1; - new_types= (server_type*) malloc( sizeof(server_type) * (n_builtin_types + - n_config_types + 1)); - - memcpy( new_types, &builtin_types[0], n_builtin_types*sizeof(server_type)); - type= &new_types[n_builtin_types]; - for ( i= n_config_types; i; i--, config_types++, type++) - *type= **config_types; - n_server_types= n_builtin_types + n_config_types; - new_types[n_server_types].id= Q_UNKNOWN_TYPE; - if ( types != &builtin_types[0]) - free( types); - types= new_types; -} - -void -revert_server_types() -{ - if ( types != &builtin_types[0]) - free( types); - n_server_types= (sizeof( builtin_types) / sizeof(server_type)) - 1; - types= &builtin_types[0]; + fprintf(OF, "\t\t</players>\n"); } -#ifdef ENABLE_DUMP -unsigned pkt_dump_pos = 0; -const char* pkt_dumps[64] = {0}; -static void add_pkt_from_file(const char* file) + +void xml_display_ghostrecon_player_info(struct qserver *server) { - if(pkt_dump_pos >= sizeof(pkt_dumps)/sizeof(pkt_dumps[0])) - return; - pkt_dumps[pkt_dump_pos++] = file; + struct player *player; + + fprintf(OF, "\t\t<players>\n"); + + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); + + fprintf(OF, "\t\t\t</player>\n"); + } + + fprintf(OF, "\t\t</players>\n"); } -static void replay_pkt_dumps() +void xml_display_eye_player_info(struct qserver *server) { - struct qserver* server = servers; - char* pkt = NULL; - int fd; - int bytes_read = 0; // should be ssize_t but for ease with win32 - int i; - struct stat statbuf; - gettimeofday( &packet_recv_time, NULL); + struct player *player; + + fprintf(OF, "\t\t<players>\n"); - for ( i = 0; i < pkt_dump_pos; i++ ) + player = server->players; + for (; player != NULL; player = player->next) { - if((fd = open(pkt_dumps[i], O_RDONLY)) == -1) + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->score); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + if (player->team_name) { - goto err; + fprintf(OF, "\t\t\t\t<team>%s</team>\n", xml_escape(player->team_name)); } - if( fstat( fd, &statbuf) == -1 ) + else { - goto err; + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); } - pkt = malloc( statbuf.st_size ); - if ( NULL == pkt ) + if (player->skin) { - goto err; + fprintf(OF, "\t\t\t\t<skin>%s</skin>\n", xml_escape(player->skin)); } - bytes_read = read( fd, pkt, statbuf.st_size ); - if ( bytes_read != statbuf.st_size ) + if (player->connect_time) { - fprintf( stderr, "Failed to read entire packet from disk got %d of %ld bytes\n", bytes_read, (long)statbuf.st_size ); - goto err; + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 1))); } - server->type->packet_func( server, pkt, statbuf.st_size); - close(fd); - fd = 0; + fprintf(OF, "\t\t\t</player>\n"); } - goto out; -err: - perror(__FUNCTION__); - close(fd); -out: - fd = 0; // NOP + fprintf(OF, "\t\t</players>\n"); } -#endif // ENABLE_DUMP - -struct rcv_pkt -{ - struct qserver* server; - struct sockaddr_in addr; - struct timeval recv_time; - char data[PACKET_LEN]; - int len; - int _errno; -}; -void do_work(void) +void xml_display_doom3_player_info(struct qserver *server) { - int pktlen, rc, fd; - char *pkt= NULL; - int bind_retry= 0; - struct timeval timeout; - struct rcv_pkt* buffer; - unsigned buffill = 0, i = 0; - unsigned bufsize = max_simultaneous*2; - - struct timeval t,ts; - gettimeofday(&t, NULL); - ts = t; - - buffer = malloc(sizeof(struct rcv_pkt) * bufsize); + struct player *player; - if(!buffer) return; + fprintf(OF, "\t\t<players>\n"); -#ifdef ENABLE_DUMP - if(pkt_dump_pos) - { - replay_pkt_dumps(); - } - else -#endif + player = server->players; + for (; player != NULL; player = player->next) { - bind_retry = bind_sockets(); - } - - send_packets(); - - debug(2, "connected: %d", connected); + fprintf(OF, "\t\t\t<player>\n"); - while ( connected || (!connected && bind_retry==-2)) - { - if ( ! connected && bind_retry==-2) + fprintf(OF, "\t\t\t\t<number>%u</number>\n", player->number); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->score); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + if (player->tribe_tag) { - rc= wait_for_timeout( 60); - bind_retry= bind_sockets(); - continue; + fprintf(OF, "\t\t\t\t<clan>%s</clan>\n", player->tribe_tag ? xml_escape(xform_name(player->tribe_tag, server)): ""); } - bind_retry= 0; - - set_file_descriptors(); - - if ( progress) - display_progress(); - - get_next_timeout( &timeout); - - rc= wait_for_file_descriptors( &timeout); - - debug(2, "rc %d", rc); - - if ( rc == SOCKET_ERROR) + else { -#ifndef _WIN32 - if ( errno == EINTR) - continue; -#endif - perror("select"); - break; + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); } - - fd= 0; - for ( ; rc && buffill < bufsize; rc--) + if (player->skin) { - int addrlen= sizeof(buffer[buffill].addr); - struct qserver* server= get_next_ready_server(); - if ( server == NULL) - break; - gettimeofday( &buffer[buffill].recv_time, NULL); - - pktlen = recvfrom( server->fd, - buffer[buffill].data, - sizeof(buffer[buffill].data), - 0, - (struct sockaddr*)&buffer[buffill].addr, - (void*)&addrlen); - - if ( pktlen == SOCKET_ERROR) - { - if(errno == EAGAIN) - { - malformed_packet(server, "EAGAIN on UDP socket, probably incorrect checksum"); - } - else if ( connection_refused()) - { - server->server_name= DOWN; - num_servers_down++; - cleanup_qserver( server, 1); - } - continue; - } - - debug(1, "recv %3d %3d %d.%d.%d.%d:%hu\n", - time_delta(&buffer[buffill].recv_time, &ts), - time_delta(&buffer[buffill].recv_time, &t), - server->ipaddr&0xff, - (server->ipaddr>>8)&0xff, - (server->ipaddr>>16)&0xff, - (server->ipaddr>>24)&0xff, - server->port); - - t = buffer[buffill].recv_time; - - buffer[buffill].server = server; - buffer[buffill].len = pktlen; - ++buffill; + fprintf(OF, "\t\t\t\t<skin>%s</skin>\n", xml_escape(player->skin)); } - - for(i = 0; i < buffill; ++i) + if (player->type_flag) { - struct qserver* server = buffer[i].server; - pkt = buffer[i].data; - pktlen = buffer[i].len; - memcpy(&packet_recv_time, &buffer[i].recv_time, sizeof(packet_recv_time)); - - if ( get_debug_level() > 0 ) - print_packet( server, pkt, pktlen); - -#ifdef ENABLE_DUMP - if (do_dump) - dump_packet(pkt, pktlen); -#endif - - if ( server->flags & FLAG_BROADCAST) - { - struct qserver *broadcast= server; - unsigned short port= ntohs(buffer[i].addr.sin_port); - /* create new server and init */ - if ( ! (no_port_offset || server->flags & TF_NO_PORT_OFFSET)) - { - port-= server->type->port_offset; - } - server= add_qserver_byaddr( ntohl(buffer[i].addr.sin_addr.s_addr), port, server->type, NULL); - if ( server == NULL) - { - server= find_server_by_address( buffer[i].addr.sin_addr.s_addr, - ntohs(buffer[i].addr.sin_port)); - if ( server == NULL) - { - continue; - } -/* - if ( show_errors) - { - fprintf(stderr, - "duplicate or invalid packet received from 0x%08x:%hu\n", - ntohl(buffer[i].addr.sin_addr.s_addr), ntohs(buffer[i].addr.sin_port)); - print_packet( NULL, pkt, pktlen); - } - continue; -*/ - } - else - { - server->packet_time1= broadcast->packet_time1; - server->packet_time2= broadcast->packet_time2; - server->ping_total= broadcast->ping_total; - server->n_requests= broadcast->n_requests; - server->n_packets= broadcast->n_packets; - broadcast->n_servers++; - } - } - - debug(2, "connected: %d", connected); - server->type->packet_func( server, pkt, pktlen); - debug(2, "connected: %d", connected); + fprintf(OF, "\t\t\t\t<type>bot</type>\n"); + } + else + { + fprintf(OF, "\t\t\t\t<type>player</type>\n"); } - buffill = 0; - if ( run_timeout && time(0)-start_time >= run_timeout) + if (player->connect_time) { - debug(2, "run timeout reached"); - break; + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); } - send_packets(); - if ( connected < max_simultaneous) - bind_retry= bind_sockets(); + xml_display_player_info_info(player); - debug(2, "connected: %d", connected); + fprintf(OF, "\t\t\t</player>\n"); } - free(buffer); + fprintf(OF, "\t\t</players>\n"); } -#ifndef _WIN32 -void sigpipe( int sig ) + +void xml_display_hl2_player_info(struct qserver *server) { - fprintf( stderr, "SIG: %d\n", sig ); + // ATM this looks like halflife player info + xml_display_halflife_player_info(server); } -#endif -int -main( int argc, char *argv[]) +void xml_display_haze_player_info(struct qserver *server) { - int arg, n_files, i; - char **files, *outfilename, *query_arg; - struct server_arg *server_args= NULL; - int n_server_args= 0, max_server_args= 0; - int default_server_type_id; - -#ifdef _WIN32 - WORD version= MAKEWORD(1,1); - WSADATA wsa_data; - if ( WSAStartup(version,&wsa_data) != 0) { - fprintf( stderr, "Could not open winsock\n"); - exit(1); - } -#else - signal( SIGPIPE, &sigpipe ); -#endif - - types= &builtin_types[0]; - n_server_types= (sizeof( builtin_types) / sizeof(server_type)) - 1; + // ATM this looks like gs2 player info + xml_display_gs2_player_info(server); +} - i= qsc_load_default_config_files(); - if ( i == -1) - return 1; - else if ( i == 0) - add_config_server_types(); +void xml_display_gs2_player_info(struct qserver *server) +{ + struct player *player; - if ( argc == 1) - usage(NULL,argv,NULL); + fprintf(OF, "\t\t<players>\n"); - OF= stdout; + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); - files= (char **) malloc( sizeof(char*) * (argc/2)); - n_files= 0; - - default_server_type_id= Q_SERVER; - little_endian= ((char*)&one)[0]; - big_endian= !little_endian; - - for ( arg= 1; arg < argc; arg++) { - if ( argv[arg][0] != '-') - break; - outfilename= NULL; - if ( strcmp( argv[arg], "-nocfg") == 0 && arg == 1) { - revert_server_types(); - } - else if ( strcmp( argv[arg], "--help") == 0) { - usage(NULL,argv,NULL); - } - else if ( strcmp( argv[arg], "-f") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -f\n", argv,NULL); - files[n_files++]= argv[arg]; - } - else if ( strcmp( argv[arg], "-retry") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -retry\n", argv,NULL); - n_retries= atoi( argv[arg]); - if ( n_retries <= 0) { - fprintf( stderr, "retries must be greater than zero\n"); - exit(1); - } - } - else if ( strcmp( argv[arg], "-interval") == 0) { - double value= 0.0; - arg++; - if ( arg >= argc) - usage( "missing argument for -interval\n", argv,NULL); - sscanf( argv[arg], "%lf", &value); - if ( value < 0.1) { - fprintf( stderr, "retry interval must be greater than 0.1\n"); - exit(1); - } - retry_interval= (int)(value * 1000); - } - else if ( strcmp( argv[arg], "-mi") == 0) { - double value= 0.0; - arg++; - if ( arg >= argc) - usage( "missing argument for -mi\n", argv,NULL); - sscanf( argv[arg], "%lf", &value); - if ( value < 0.1) { - fprintf( stderr, "interval must be greater than 0.1\n"); - exit(1); - } - master_retry_interval= (int)(value * 1000); - } - else if ( strcmp( argv[arg], "-H") == 0) - hostname_lookup= 1; - else if ( strcmp( argv[arg], "-u") == 0) - up_servers_only= 1; - else if ( strcmp( argv[arg], "-nf") == 0) - no_full_servers= 1; - else if ( strcmp( argv[arg], "-ne") == 0) - no_empty_servers= 1; - else if ( strcmp( argv[arg], "-nh") == 0) - no_header_display= 1; - else if ( strcmp( argv[arg], "-old") == 0) - new_style= 0; - else if ( strcmp( argv[arg], "-P") == 0) - get_player_info= 1; - else if ( strcmp( argv[arg], "-R") == 0) - get_server_rules= 1; - else if ( strncmp( argv[arg], "-raw", 4) == 0) { - if ( argv[arg][4] == ',') + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + if (NA_INT != player->score) { - if ( strcmp( &argv[arg][5], "game") == 0) - { - show_game_in_raw= 1; - } - else - { - usage( "Unknown -raw option\n", argv, NULL); - } - } - arg++; - if ( arg >= argc) + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->score); + } if (NA_INT != player->deaths) { - usage( "missing argument for -raw\n", argv,NULL); + fprintf(OF, "\t\t\t\t<deaths>%d</deaths>\n", player->deaths); } - raw_delimiter= argv[arg]; - - // Check the multi rule delimiter isnt the same - // If it is fix to maintain backwards compatibility - if ( 0 == strcmp( raw_delimiter, multi_delimiter ) && - 0 == strcmp( raw_delimiter, "|" ) - ) + if (NA_INT != player->frags) { - multi_delimiter = ":"; + fprintf(OF, "\t\t\t\t<frags>%d</frags>\n", player->frags); } - raw_display= 1; - } - else if ( strcmp( argv[arg], "-mdelim" ) == 0 ) - { - arg++; - if ( arg >= argc) + if (player->team_name) { - usage( "missing argument for -mdelim\n", argv,NULL); + fprintf(OF, "\t\t\t\t<team>%s</team>\n", xml_escape(player->team_name)); } - multi_delimiter = argv[arg]; - } - else if ( strcmp( argv[arg], "-xml") == 0) { - xml_display= 1; - if (raw_display == 1) - usage( "cannot specify both -raw and -xml\n", argv,NULL); - } - else if ( strcmp( argv[arg], "-utf8") == 0) { - xml_encoding= ENCODING_UTF_8; - name_xforms= 0; - } - else if ( strcmp( argv[arg], "-ncn") == 0) { - color_names= 0; - } - else if ( strcmp( argv[arg], "-cn") == 0) { - color_names= 1; - } - else if ( strcmp( argv[arg], "-hc") == 0) { - color_names= 2; - } - else if ( strcmp( argv[arg], "-nx") == 0) { - name_xforms= 1; - } - else if ( strcmp( argv[arg], "-nnx") == 0) { - name_xforms= 0; - } - else if ( strcmp( argv[arg], "-tc") == 0) { - time_format= CLOCK_TIME; - } - else if ( strcmp( argv[arg], "-tsw") == 0) { - time_format= STOPWATCH_TIME; - } - else if ( strcmp( argv[arg], "-ts") == 0) { - time_format= SECONDS; - } - else if ( strcmp( argv[arg], "-pa") == 0) { - player_address= 1; - } - else if ( strcmp( argv[arg], "-hpn") == 0) { - hex_player_names= 1; - } - else if ( strcmp( argv[arg], "-hsn") == 0) { - hex_server_names= 1; - } - else if ( strncmp( argv[arg], "-maxsimultaneous", 7) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -maxsimultaneous\n", argv,NULL); - max_simultaneous= atoi(argv[arg]); - if ( max_simultaneous <= 0) - usage( "value for -maxsimultaneous must be > 0\n", argv,NULL); - if ( max_simultaneous > FD_SETSIZE) - max_simultaneous= FD_SETSIZE; - } - else if ( strcmp( argv[arg], "-sendinterval") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -sendinterval\n", argv,NULL); - sendinterval= atoi(argv[arg]); - if ( sendinterval < 0) - usage( "value for -sendinterval must be >= 0\n", argv,NULL); - } - else if ( strcmp( argv[arg], "-raw-arg") == 0) { - raw_arg= 1000; - } - else if ( strcmp( argv[arg], "-timeout") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -timeout\n", argv,NULL); - run_timeout= atoi( argv[arg]); - if ( run_timeout <= 0) - usage( "value for -timeout must be > 0\n", argv,NULL); - } - else if ( strncmp(argv[arg], "-progress", sizeof("-progress")-1) == 0) { - char *p= argv[arg] + sizeof("-progress")-1; - progress= 1; - if ( *p == ',') - progress= atoi(p+1); - } - else if ( strcmp( argv[arg], "-Hcache") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -Hcache\n", argv,NULL); - if ( hcache_open( argv[arg], 0) == -1) - return 1; - } - else if ( strcmp( argv[arg], "-default") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for -default\n", argv,NULL); - default_server_type= find_server_type_string( argv[arg]); - if ( default_server_type == NULL) { - char opt[256], *o= &opt[0]; - sprintf( opt, "-%s", argv[arg]); - for ( ; *o; o++) *o= tolower(*o); - default_server_type= find_server_type_option( opt); - } - if ( default_server_type == NULL) { - fprintf( stderr, "unknown server type \"%s\"\n", argv[arg]); - usage( NULL, argv,NULL); - } - default_server_type_id= default_server_type->id; - default_server_type= NULL; - } - else if ( strncmp( argv[arg], "-Tserver", 3) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( read_qserver_template( argv[arg]) == -1) - return 1; - } - else if ( strncmp( argv[arg], "-Trule", 3) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( read_rule_template( argv[arg]) == -1) - return 1; - } - else if ( strncmp( argv[arg], "-Theader", 3) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( read_header_template( argv[arg]) == -1) - return 1; - } - else if ( strncmp( argv[arg], "-Ttrailer", 3) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( read_trailer_template( argv[arg]) == -1) - return 1; - } - else if ( strncmp( argv[arg], "-Tplayer", 3) == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( read_player_template( argv[arg]) == -1) - return 1; - } - else if ( strcmp( argv[arg], "-sort") == 0) { - size_t pos; - arg++; - if ( arg >= argc) - usage( "missing argument for -sort\n", argv, NULL); - strncpy( sort_keys, argv[arg], sizeof(sort_keys)-1); - pos= strspn( sort_keys, SUPPORTED_SORT_KEYS); - if ( pos != strlen( sort_keys)) { - fprintf( stderr, "Unknown sort key \"%c\", valid keys are \"%s\"\n", - sort_keys[pos], SUPPORTED_SORT_KEYS); - return 1; - } - server_sort= strpbrk( sort_keys, SUPPORTED_SERVER_SORT) != NULL; - if ( strchr( sort_keys, 'l')) - server_sort= 1; - player_sort= strpbrk( sort_keys, SUPPORTED_PLAYER_SORT) != NULL; - } - else if ( strcmp( argv[arg], "-errors") == 0) { - show_errors++; - } - else if ( strcmp( argv[arg], "-of") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( argv[arg][0] == '-' && argv[arg][1] == '\0') - OF= stdout; - else - OF= fopen( argv[arg], "w"); - if ( OF == NULL) { - perror( argv[arg]); - return 1; - } - } - else if ( strcmp( argv[arg], "-af") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( argv[arg][0] == '-' && argv[arg][1] == '\0') - OF= stdout; - else - OF= fopen( argv[arg], "a"); - if ( OF == NULL) { - perror( argv[arg]); - return 1; - } - } - else if ( strcmp( argv[arg], "-htmlnames") == 0) { - html_names= 1; - } - else if ( strcmp( argv[arg], "-nohtmlnames") == 0) { - html_names= 0; - } - else if ( strcmp( argv[arg], "-htmlmode") == 0) { - html_mode= 1; - } - else if ( strcmp( argv[arg], "-carets") == 0) { - strip_carets= 0; - } - else if ( strcmp( argv[arg], "-d") == 0) { - set_debug_level(get_debug_level() + 1); - } - else if ( strcmp( argv[arg], "-showgameport") == 0) { - show_game_port= 1; - } - else if ( strcmp( argv[arg], "-noportoffset") == 0) { - no_port_offset= 1; - } - else if ( strcmp( argv[arg], "-srcip") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( parse_source_address( argv[arg], &source_ip, &source_port) == -1) - return 1; - if ( source_port) { - source_port_low= source_port; - source_port_high= source_port; - } - } - else if ( strcmp( argv[arg], "-srcport") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( parse_source_port( argv[arg], &source_port_low, &source_port_high) == -1) - return 1; - source_port= source_port_low; - } - else if ( strcmp( argv[arg], "-cfg") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - if ( qsc_load_config_file( argv[arg]) == -1) - return 1; - add_config_server_types(); - } - else if ( strcmp( argv[arg], "-allowserverdups") == 0) { - noserverdups = 0; - } -#ifdef ENABLE_DUMP - else if ( strcmp( argv[arg], "-dump") == 0) { - do_dump = 1; - } - else if ( strcmp( argv[arg], "-pkt") == 0) { - arg++; - if ( arg >= argc) - usage( "missing argument for %s\n", argv, argv[arg-1]); - add_pkt_from_file(argv[arg]); - } -#endif -#ifdef _WIN32 - else if ( strcmp( argv[arg], "-noconsole") == 0) { - FreeConsole(); - } -#endif - else { - int outfile; - server_type *type; - arg++; - if ( arg >= argc) { - fprintf( stderr, "missing argument for \"%s\"\n", argv[arg-1]); - return 1; - } - type= parse_server_type_option( argv[arg-1], &outfile, &query_arg); - if ( type == NULL) { - fprintf( stderr, "unknown option \"%s\"\n", argv[arg-1]); - return 1; - } - outfilename= NULL; - if ( outfile) { - outfilename= strchr( argv[arg], ','); - if ( outfilename == NULL) { - fprintf( stderr, "missing file name for \"%s,outfile\"\n", - argv[arg-1]); - return 1; + else + { + fprintf(OF, "\t\t\t\t<team>%d</team>\n", player->team); } - *outfilename++= '\0'; - } -/* - if ( query_arg && !(type->flags & TF_QUERY_ARG)) { - fprintf( stderr, "option flag \"%s\" not allowed for this server type\n", - query_arg); - return 1; - } -*/ - if ( type->flags & TF_QUERY_ARG_REQUIRED && !query_arg) { - fprintf( stderr, "option flag missing for server type \"%s\"\n", - argv[arg-1]); - return 1; - } - add_server_arg( argv[arg], type->id, outfilename, query_arg, - &server_args, &n_server_args, &max_server_args); - } - } - - start_time= time(0); - default_server_type= find_server_type_id( default_server_type_id); + if (player->skin) + { + fprintf(OF, "\t\t\t\t<skin>%s</skin>\n", xml_escape(player->skin)); + } - for ( i= 0; i < n_files; i++) - add_file( files[i]); + if (player->connect_time) + { + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 1))); + } - for ( ; arg < argc; arg++) - add_qserver( argv[arg], default_server_type, NULL, NULL); + xml_display_player_info_info(player); - for ( i= 0; i < n_server_args; i++) { - server_type *server_type= find_server_type_id( server_args[i].type_id); - add_qserver( server_args[i].arg, server_type, - server_args[i].outfilename, server_args[i].query_arg); + fprintf(OF, "\t\t\t</player>\n"); } - free( server_args); + fprintf(OF, "\t\t</players>\n"); +} - if ( servers == NULL) - exit(1); +void xml_display_armyops_player_info(struct qserver *server) +{ + struct player *player; - max_connmap= max_simultaneous + 10; - connmap= (struct qserver**) calloc( 1, sizeof(struct qserver*) * max_connmap); + player = server->players; + for (; player != NULL; player = player->next) + { + player->score = calculate_armyops_score(player); + } - if ( color_names == -1) - color_names= ( raw_display) ? DEFAULT_COLOR_NAMES_RAW : - DEFAULT_COLOR_NAMES_DISPLAY; + xml_display_gs2_player_info(server); +} - if ( time_format == -1) - time_format= ( raw_display) ? DEFAULT_TIME_FMT_RAW : - DEFAULT_TIME_FMT_DISPLAY; +void xml_display_ts2_player_info(struct qserver *server) +{ + struct player *player; - if ( (one_server_type_id & MASTER_SERVER) || one_server_type_id == 0) - display_prefix= 1; + fprintf(OF, "\t\t<players>\n"); - if ( xml_display) - xml_header(); - else if ( new_style && ! raw_display && ! have_server_template()) - display_header(); - else if ( have_header_template()) - template_display_header(); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); - q_serverinfo.length= htons( q_serverinfo.length); - h2_serverinfo.length= htons( h2_serverinfo.length); - q_player.length= htons( q_player.length); + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); - do_work(); + if (player->connect_time) + { + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); + } - finish_output(); - free_server_hash(); - free(files); - free(connmap); + xml_display_player_info_info(player); + fprintf(OF, "\t\t\t</player>\n"); + } - return 0; + fprintf(OF, "\t\t</players>\n"); } -void -finish_output() +void xml_display_wic_player_info(struct qserver *server) { - int i; - hcache_update_file(); + struct player *player; - if ( progress) { - display_progress(); - fputs( "\n", stderr); - } - - if ( server_sort) { - struct qserver **array, *server, *next_server; - if ( strchr( sort_keys, 'l') && - strpbrk( sort_keys, SUPPORTED_SERVER_SORT) == NULL) { - server= servers; - for ( ; server; server= next_server) { - next_server= server->next; - display_server( server); - } - } - else { - array= (struct qserver **) malloc( sizeof(struct qserver *) * - num_servers_total); - server= servers; - for ( i= 0; server != NULL; i++) { - array[i]= server; - server= server->next; - } - sort_servers( array, num_servers_total); - if ( progress) - fprintf( stderr, "\n"); - for ( i= 0; i < num_servers_total; i++) - display_server( array[i]); - free( array); - } - } - else { - struct qserver *server, *next_server; - server= servers; - for ( ; server; server= next_server) { - next_server= server->next; - if ( server->server_name == HOSTNOTFOUND) - display_server( server); - } - } + fprintf(OF, "\t\t<players>\n"); - if ( xml_display) - xml_footer(); - else if ( have_trailer_template()) - template_display_trailer(); + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); - if ( OF != stdout) - fclose( OF); -} + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->score); + fprintf(OF, "\t\t\t\t<team>%s</team>\n", player->team_name); + fprintf(OF, "\t\t\t\t<bot>%d</bot>\n", player->type_flag ); + if ( player->tribe_tag ) + { + fprintf(OF, "\t\t\t\t<role>%s</role>\n", player->tribe_tag ); + } + + + xml_display_player_info_info(player); + fprintf(OF, "\t\t\t</player>\n"); + } + fprintf(OF, "\t\t</players>\n"); +} -void -add_file( char *filename) +void xml_display_tm_player_info(struct qserver *server) { - FILE *file; - char name[200], *comma, *query_arg = NULL; - server_type* type; + struct player *player; - if ( strcmp( filename, "-") == 0) - { - file= stdin; - current_filename= NULL; - } - else - { - file= fopen( filename, "r"); - current_filename= filename; - } - current_fileline= 1; + fprintf(OF, "\t\t<players>\n"); - if ( file == NULL) - { - perror( filename); - return; - } - for ( ; fscanf( file, "%s", name) == 1; current_fileline++) + player = server->players; + for (; player != NULL; player = player->next) { - comma= strchr( name, ','); - if ( comma) - { - *comma++= '\0'; - query_arg= strdup( comma); - } - type = find_server_type_string( name); - if ( type == NULL) + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<ping>%d</ping>\n", player->ping); + + if (player->connect_time) { - add_qserver( name, default_server_type, NULL, NULL); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); } - else if ( fscanf( file, "%s", name) == 1) - { - if ( type->flags & TF_QUERY_ARG && comma && *query_arg) - { - add_qserver( name, type, NULL, query_arg ); - } - else - { - add_qserver( name, type, NULL, NULL ); - } - } - } - if ( file != stdin) - fclose(file); + xml_display_player_info_info(player); + fprintf(OF, "\t\t\t</player>\n"); + } - current_fileline= 0; + fprintf(OF, "\t\t</players>\n"); } -void -print_file_location() -{ - if ( current_fileline != 0) - fprintf( stderr, "%s:%d: ", current_filename?current_filename:"<stdin>", - current_fileline); -} -void -parse_query_params( struct qserver *server, char *params) +void xml_display_savage_player_info(struct qserver *server) { - char *comma, *arg= params; - do { - comma= strchr(arg,','); - if ( comma) - *comma= '\0'; - if ( strchr( arg, '=')) - add_query_param( server, arg); - else if ( strcmp( arg, "noportoffset") == 0 || strcmp( arg, "qp") == 0) - server->flags |= TF_NO_PORT_OFFSET; - else if ( strcmp( arg, "showgameport") == 0 || strcmp( arg, "gp") == 0) - server->flags |= TF_SHOW_GAME_PORT; - arg= comma+1; - } while ( comma); + struct player *player; + + fprintf(OF, "\t\t<players>\n"); + + player = server->players; + for (; player != NULL; player = player->next) + { + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%s</time>\n", xml_escape(play_time(player->connect_time, 2))); + + fprintf(OF, "\t\t\t</player>\n"); + } + + fprintf(OF, "\t\t</players>\n"); } -int -add_qserver( char *arg, server_type* type, char *outfilename, char *query_arg) +void xml_display_farcry_player_info(struct qserver *server) { - struct qserver *server, *prev_server; - int flags= 0; - char *colon= NULL, *arg_copy, *hostname= NULL; - unsigned int ipaddr; - unsigned short port, port_max; - int portrange = 0; - unsigned colonpos = 0; + struct player *player; - if ( run_timeout && time(0)-start_time >= run_timeout) + fprintf(OF, "\t\t<players>\n"); + + player = server->players; + for (; player != NULL; player = player->next) { - finish_output(); - exit(0); + fprintf(OF, "\t\t\t<player>\n"); + + fprintf(OF, "\t\t\t\t<name>%s</name>\n", xml_escape(xform_name(player->name, server))); + fprintf(OF, "\t\t\t\t<score>%d</score>\n", player->frags); + fprintf(OF, "\t\t\t\t<time>%su</time>\n", xml_escape(play_time(player->connect_time, 2))); + + fprintf(OF, "\t\t\t</player>\n"); } - port = port_max = type->default_port; + fprintf(OF, "\t\t</players>\n"); +} + - if ( outfilename && strcmp( outfilename, "-") != 0) +void display_progress() +{ + static struct timeval rate_start = { - FILE *outfile= fopen( outfilename, "r+"); - if ( outfile == NULL && (errno == EACCES || errno == EISDIR || - errno == ENOSPC || errno == ENOTDIR)) - { - perror( outfilename); - return -1; - } - if ( outfile) - { - fclose(outfile); - } - } + 0, 0 + }; + char rate[32]; + struct timeval now; - arg_copy= strdup(arg); + gettimeofday(&now, NULL); - colon= strchr( arg, ':'); - if ( colon != NULL) - { - if(sscanf( colon+1, "%hu-%hu", &port, &port_max) == 2) + if (!rate_start.tv_sec) + { + rate_start = now; + rate[0] = '\0'; + } + else + { + int delta = time_delta(&now, &rate_start); + if (delta > 1500) { - portrange = 1; + sprintf(rate, " %d servers/sec ", (num_servers_returned + num_servers_timed_out) *1000 / delta); } else { - port_max = port; - } - *colon= '\0'; - colonpos = colon-arg; - } - - if ( *arg == '+') - { - flags|= FLAG_BROADCAST; - arg++; - } - - ipaddr= inet_addr(arg); - if ( ipaddr == INADDR_NONE) - { - if ( strcmp( arg, "255.255.255.255") != 0) - { - ipaddr= htonl( hcache_lookup_hostname(arg)); + rate[0] = '\0'; } - } - else if ( hostname_lookup && !(flags&FLAG_BROADCAST)) - { - hostname= hcache_lookup_ipaddr( ntohl(ipaddr)); } - if ( (ipaddr == INADDR_NONE || ipaddr == 0) && strcmp( arg, "255.255.255.255") != 0) + // only print out every 'progress' number of servers. + if (0 != num_servers_returned + num_servers_timed_out && (progress == 1 || (num_servers_returned + num_servers_timed_out) % progress == 0)) { - print_file_location(); - fprintf( stderr, "%s: %s\n", arg, strherror(h_errno)); - server= (struct qserver *) calloc( 1, sizeof( struct qserver)); - for(;port <= port_max; ++port) - { - init_qserver( server, type); - if(portrange) - { - server->arg = ( port==port_max ) ? arg_copy : strdup(arg_copy); - } - if(portrange) - { - sprintf(server->arg+colonpos+1, "%hu", port); - } - server->server_name= HOSTNOTFOUND; - server->error= strdup( strherror(h_errno)); - server->query_port = server->port= port; - if ( last_server != &servers) - { - prev_server= (struct qserver*) ((char*)last_server - ((char*)&server->next - (char*)server)); - server->prev= prev_server; - } - *last_server= server; - last_server= & server->next; - if ( one_server_type_id == ~MASTER_SERVER) - { - one_server_type_id= type->id; - } - else if ( one_server_type_id != type->id) - { - one_server_type_id= 0; - } - } - return -1; + fprintf(stderr, "\r%d/%d (%d timed out, %d down)%s", num_servers_returned + num_servers_timed_out, num_servers_total, num_servers_timed_out, num_servers_down, rate); } +} - for(; port > 0 && port <= port_max; ++port) - { - if ( noserverdups && find_server_by_address( ipaddr, port) != NULL) - { - continue; - } - - server= (struct qserver *) calloc( 1, sizeof( struct qserver)); - server->arg= port==port_max?arg_copy:strdup(arg_copy); - if(portrange) - { - sprintf(server->arg+colonpos+1, "%hu", port); - } - if ( hostname && colon) - { - server->host_name= (char*)malloc( strlen(hostname) + 5 +2); - sprintf( server->host_name, "%s:%hu", hostname, port); - } - else - { - server->host_name= strdup((hostname)?hostname:arg); - } +/* ----- END MODIFICATION ----- Don't need to change anything below here. */ - server->ipaddr= ipaddr; - server->query_port = server->port = port; - server->type= type; - server->outfilename= outfilename; - server->flags= flags; - if (query_arg) - { - server->query_arg = ( port == port_max ) ? query_arg : strdup(query_arg); - parse_query_params( server, server->query_arg); - } - else - { - server->query_arg = NULL; - } - init_qserver( server, type); - if ( server->type->master) - { - waiting_for_masters++; - } +void set_non_blocking(int fd); +int set_fds(fd_set *fds); +void get_next_timeout(struct timeval *timeout); - if ( num_servers_total % 10 == 0) - { - hcache_update_file(); - } +void set_file_descriptors(); +int wait_for_file_descriptors(struct timeval *timeout); +struct qserver *get_next_ready_server(); - if ( last_server != &servers ) - { - prev_server= (struct qserver*) ((char*)last_server - ((char*)&server->next - (char*)server)); - server->prev= prev_server; - } - *last_server= server; - last_server= &server->next; - add_server_to_hash( server ); +/* Misc flags + */ - if ( one_server_type_id == ~MASTER_SERVER) - { - one_server_type_id= type->id; - } - else if ( one_server_type_id != type->id) - { - one_server_type_id= 0; - } +struct timeval packet_recv_time; +int one_server_type_id = ~MASTER_SERVER; +static int one = 1; +static int little_endian; +static int big_endian; +unsigned int swap_long(void*); +unsigned short swap_short(void*); +float swap_float_from_little(void *f); +char *strndup(const char *string, size_t len); +#define FORCE 1 - ++num_servers; - } - return 0; -} +/* Print an error message and the program usage notes + */ -struct qserver * -add_qserver_byaddr( unsigned int ipaddr, unsigned short port, - server_type* type, int *new_server) +void usage(char *msg, char **argv, char *a1) { - char arg[36]; - struct qserver *server, *prev_server; - char *hostname= NULL; + int i; + server_type *type; + server_type **sorted_types; - if ( run_timeout && time(0)-start_time >= run_timeout) + if (msg) { - finish_output(); - exit(0); + fprintf(stderr, msg, a1); } - if ( new_server) + printf("Usage: %s [options ...]\n", argv[0]); + printf("\t[-default server-type] [-cfg file] [-f file] [host[:port]] ...\n"); + printf("Where host is an IP address or host name\n"); + + sorted_types = (server_type **)malloc(sizeof(server_type*) * n_server_types); + type = &types[0]; + for (i = 0; type->id != Q_UNKNOWN_TYPE; type++, i++) { - *new_server= 0; + sorted_types[i] = type; } - ipaddr= htonl(ipaddr); - if ( ipaddr == 0) + + quicksort((void **)sorted_types, 0, n_server_types - 1, (int(*)(void *, void*))type_option_compare); + + + for (i = 0; i < n_server_types; i++) { - return 0; + type = sorted_types[i]; + printf("%s\t\tquery %s server\n", type->type_option, type->game_name); } - // TODO: this prevents servers with the same ip:port being queried - // and hence breaks virtual servers support e.g. Teamspeak 2 - if ( find_server_by_address( ipaddr, port) != NULL) + quicksort((void **)sorted_types, 0, n_server_types - 1, (int(*)(void *, void*))type_string_compare); + printf("-default\tset default server type:"); + for (i = 0; i < n_server_types; type++, i++) + { + type = sorted_types[i]; + printf(" %s", type->type_string); + } + puts(""); + printf("-nocfg\t\tIgnore qstat configuration loaded from any default location. Must be the first option on the command-line.\n"); + printf("-cfg\t\tread the extended types from given file not the default one\n"); + printf("-f\t\tread hosts from file\n"); + printf("-R\t\tfetch and display server rules\n"); + printf("-P\t\tfetch and display player info\n"); + printf("-sort\t\tsort servers and/or players\n"); + printf("-u\t\tonly display servers that are up\n"); + printf("-nf\t\tdo not display full servers\n"); + printf("-ne\t\tdo not display empty servers\n"); + printf("-nh\t\tdo not display header line.\n"); + printf("-cn\t\tdisplay color names instead of numbers\n"); + printf("-ncn\t\tdisplay color numbers instead of names\n"); + printf("-hc\t\tdisplay colors in #rrggbb format\n"); + printf("-tc\t\tdisplay time in clock format (DhDDmDDs)\n"); + printf("-tsw\t\tdisplay time in stop-watch format (DD:DD:DD)\n"); + printf("-ts\t\tdisplay time in seconds\n"); + printf("-pa\t\tdisplay player address\n"); + printf("-hpn\t\tdisplay player names in hex\n"); + printf("-hsn\t\tdisplay server names in hex\n"); + printf("-nh\t\tdo not display header\n"); + printf("-old\t\told style display\n"); + printf("-progress\tdisplay progress meter (text only)\n"); + printf("-retry\t\tnumber of retries, default is %d\n", DEFAULT_RETRIES); + printf("-interval\tinterval between retries, default is %.2f seconds\n", DEFAULT_RETRY_INTERVAL / 1000.0); + printf("-mi\t\tinterval between master server retries, default is %.2f seconds\n", (DEFAULT_RETRY_INTERVAL *4) / 1000.0); + printf("-timeout\ttotal time in seconds before giving up\n"); + printf("-maxsim\t\tset maximum simultaneous queries\n"); + printf("-sendinterval\t\tset time in ms between sending packets, default %u\n", sendinterval); + printf("-errors\t\tdisplay errors\n"); + printf("-allowserverdups\t\tallow adding multiple servers with same ip:port (needed for ts2)\n"); + printf("-of\t\toutput file\n"); + printf("-af\t\tLike -of, but append to the file\n"); + printf("-raw <delim>\toutput in raw format using <delim> as delimiter\n"); + printf("-mdelim <delim>\tFor rules with multi values use <delim> as delimiter\n"); + printf("-xml\t\toutput status data as an XML document\n"); + printf("-Th,-Ts,-Tpt\toutput templates: header, server and player\n"); + printf("-Tr,-Tt\t\toutput templates: rule, and trailer\n"); + printf("-srcport <range>\tSend packets from these network ports\n"); + printf("-srcip <IP>\tSend packets using this IP address\n"); + printf("-H\t\tresolve host names\n"); + printf("-Hcache\t\thost name cache file\n"); + printf("-carets\t\tDisplay carets in Quake 3 player names\n"); + printf("-d\t\tEnable debug options. Specify multiple times to increase debug level.\n"); +#ifdef ENABLE_DUMP + printf("-dump\t\twrite received raw packets to dumpNNN files which must not exist before\n"); + printf("-pkt <file>\tuse file as server reply instead of quering the server. Works only with TF_SINGLE_QUERY servers\n"); +#endif + printf("-htmlmode\tConvert <, >, and & to the equivalent HTML entities\n"); + printf("-htmlnames\tColorize Quake 3 and Tribes 2 player names using html font tags\n"); + printf("-nohtmlnames\tDo not colorize Quake 3 and Tribes 2 player names even if $HTML is used in an output template.\n"); + printf("-showgameport\tAlways display the game port in QStat output.\n"); + printf("-noportoffset\tDont use builtin status port offsets ( assume query port was specified ).\n"); + printf("-raw-arg\tWhen used with -raw, always display the server address as it appeared in a file or on the command-line.\n"); + printf("-utf8\t\tUse the UTF-8 character encoding for XML output.\n"); + printf("-bom\t\tOutput Byte-Order-Mark for XML output.\n"); +#ifdef _WIN32 + printf("-noconsole\t\tFree the console\n"); +#endif + printf("\n"); + printf("Sort keys:\n"); + printf(" servers: p=by-ping, g=by-game, i=by-IP-address, h=by-hostname, n=by-#-players, l=by-list-order\n"); + printf(" players: P=by-ping, F=by-frags, T=by-team, N=by-name\n"); + printf("\nqstat version %s\n", VERSION); + exit(0); +} + +struct server_arg +{ + int type_id; + server_type *type; + char *arg; + char *outfilename; + char *query_arg; +}; + +server_type *find_server_type_id(int type_id) +{ + server_type *type = &types[0]; + for (; type->id != Q_UNKNOWN_TYPE; type++) + if (type->id == type_id) { - return 0; + return type; } + return NULL; +} - if ( new_server) +server_type *find_server_type_string(char *type_string) +{ + server_type *type = &types[0]; + char *t = type_string; + for (; *t; t++) { - *new_server= 1; + *t = tolower(*t); } - server= (struct qserver *) calloc( 1, sizeof( struct qserver)); - server->ipaddr= ipaddr; - ipaddr= ntohl(ipaddr); - sprintf( arg, "%d.%d.%d.%d:%hu", ipaddr>>24, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, port); - server->arg= strdup(arg); - - if ( hostname_lookup) + for (; type->id != Q_UNKNOWN_TYPE; type++) + if (strcmp(type->type_string, type_string) == 0) { - hostname= hcache_lookup_ipaddr( ipaddr); + return type; } + return NULL; +} - if ( hostname) +server_type *find_server_type_option(char *option) +{ + server_type *type = &types[0]; + for (; type->id != Q_UNKNOWN_TYPE; type++) + if (strcmp(type->type_option, option) == 0) { - server->host_name= (char*)malloc( strlen(hostname) + 6 + 2); - sprintf( server->host_name, "%s:%hu", hostname, port); + return type; } - else + return NULL; +} + +server_type *parse_server_type_option(char *option, int *outfile, char **query_arg) +{ + server_type *type = &types[0]; + char *comma, *arg; + int len; + + *outfile = 0; + *query_arg = 0; + + comma = strchr(option, ','); + if (comma) { - server->host_name= strdup( arg); + *comma++ = '\0'; } - server->query_port = server->port = port; - init_qserver( server, type); - - if ( num_servers_total % 10 == 0) + for (; type->id != Q_UNKNOWN_TYPE; type++) + if (strcmp(type->type_option, option) == 0) { - hcache_update_file(); + break; } - if ( last_server != &servers) + if (type->id == Q_UNKNOWN_TYPE) { - prev_server= (struct qserver*) ((char*)last_server - ((char*)&server->next - (char*)server)); - server->prev= prev_server; + return NULL; } - *last_server= server; - last_server= & server->next; - add_server_to_hash( server); + if (!comma) + { + return type; + } - ++num_servers; + if (strcmp(comma, "outfile") == 0) + { + *outfile = 1; + comma = strchr(comma, ','); + if (!comma) + { + return type; + } + *comma++ = '\0'; + } - return server; + *query_arg = strdup(comma); + arg = comma; + do + { + comma = strchr(arg, ','); + if (comma) + { + len = comma - arg; + } + else + { + len = strlen(arg); + } + if (strncmp(arg, "outfile", len) == 0) + { + *outfile = 1; + } + arg = comma + 1; + } + while (comma); + return type; } -void -add_servers_from_masters() +void add_server_arg(char *arg, int type, char *outfilename, char *query_arg, struct server_arg **args, int *n, int *max) { - struct qserver *server; - unsigned int ipaddr, i; - unsigned short port; - int n_servers, new_server, port_adjust= 0; - char *pkt; - server_type* server_type; - FILE *outfile; - - for ( server= servers; server != NULL; server= server->next) { - if ( !server->type->master || server->master_pkt == NULL) - continue; - pkt= server->master_pkt; - - if ( server->query_arg && server->type->id == GAMESPY_MASTER) { - server_type= find_server_type_string( server->query_arg); - if ( server_type == NULL) - server_type= find_server_type_id( server->type->master); - } - else - server_type= find_server_type_id( server->type->master); - - if ( server->type->id == GAMESPY_MASTER && server_type) { - if ( server_type->id == UN_SERVER) - port_adjust= -1; - else if ( server_type->id == KINGPIN_SERVER) - port_adjust= 10; - } - - outfile= NULL; - if ( server->outfilename) { - if ( strcmp( server->outfilename, "-") == 0) - outfile= stdout; - else - outfile= fopen( server->outfilename, "w"); - if ( outfile == NULL) { - perror( server->outfilename); - continue; - } - } - n_servers= 0; - for ( i= 0; i < server->master_pkt_len; i+= 6) { - memcpy( &ipaddr, &pkt[i], 4); - memcpy( &port, &pkt[i+4], 2); - ipaddr= ntohl( ipaddr); - port= ntohs( port) + port_adjust; - new_server= 1; - if ( outfile) - fprintf( outfile, "%s %d.%d.%d.%d:%hu\n", - server_type ? server_type->type_string : "", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, port); - else if ( server_type == NULL) - fprintf( OF, "%d.%d.%d.%d:%hu\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, port); - else - add_qserver_byaddr( ipaddr, port, server_type, &new_server); - n_servers+= new_server; - } - free( server->master_pkt); - server->master_pkt= NULL; - server->master_pkt_len= 0; - server->n_servers= n_servers; - if ( outfile) - fclose( outfile); - } - if ( hostname_lookup) - hcache_update_file(); - bind_sockets(); + if (*n == *max) + { + if (*max == 0) + { + *max = 4; + *args = (struct server_arg*)malloc(sizeof(struct server_arg)*(*max)); + } + else + { + (*max) *= 2; + *args = (struct server_arg*)realloc(*args, sizeof(struct server_arg)*(*max)); + } + } + (*args)[ *n].type_id = type; + /* (*args)[*n].type= find_server_type_id( type); */ + (*args)[ *n].type = NULL; + (*args)[ *n].arg = arg; + (*args)[ *n].outfilename = outfilename; + (*args)[ *n].query_arg = query_arg; + (*n)++; } -void -init_qserver( struct qserver *server, server_type* type) -{ - server->server_name= NULL; - server->map_name= NULL; - server->game= NULL; - server->num_players= 0; - server->fd= -1; - if ( server->flags & FLAG_BROADCAST) { - server->retry1= 1; - server->retry2= 1; - } - else { - server->retry1= n_retries; - server->retry2= n_retries; - } - server->n_retries= 0; - server->ping_total= 0; - server->n_packets= 0; - server->n_requests= 0; - - server->n_servers= 0; - server->master_pkt_len= 0; - server->master_pkt= NULL; - server->error= NULL; - - server->saved_data.data= NULL; - server->saved_data.datalen= 0; - server->saved_data.pkt_index= -1; - server->saved_data.pkt_max= 0; - server->saved_data.next= NULL; - - server->type = type; - server->next_rule= (get_server_rules) ? "" : NO_SERVER_RULES; - server->next_player_info= (get_player_info && - type->player_packet) ? 0 : NO_PLAYER_INFO; - - server->n_player_info= 0; - server->players= NULL; - server->n_rules= 0; - server->rules= NULL; - server->last_rule= &server->rules; - server->missing_rules= 0; - - num_servers_total++; -} -// ipaddr should be network byte-order -// port should be host byte-order -struct qserver * -find_server_by_address( unsigned int ipaddr, unsigned short port) +void add_query_param(struct qserver *server, char *arg) { - struct qserver **hashed; - unsigned int hash, i; - hash= (ipaddr + port) % ADDRESS_HASH_LENGTH; - - if ( ipaddr == 0) { - for ( hash= 0; hash < ADDRESS_HASH_LENGTH; hash++) - printf( "%3d %d\n", hash, server_hash_len[hash]); - return NULL; - } + char *equal; + struct query_param *param; - hashed = server_hash[hash]; - for ( i= server_hash_len[hash]; i; i--, hashed++) - if ( *hashed && (*hashed)->ipaddr == ipaddr && (*hashed)->port == port) - return *hashed; - return NULL; -} - -void -add_server_to_hash( struct qserver *server) -{ - unsigned int hash; - hash = (server->ipaddr + server->port) % ADDRESS_HASH_LENGTH; + equal = strchr(arg, '='); + *equal++ = '\0'; - if ( server_hash_len[hash] % 16 == 0) - { - server_hash[hash]= (struct qserver**) realloc( server_hash[hash], - sizeof( struct qserver **) * (server_hash_len[hash]+16)); - memset( &server_hash[hash][server_hash_len[hash]], 0, - sizeof( struct qserver **) * 16); - } - server_hash[hash][server_hash_len[hash]]= server; - server_hash_len[hash]++; + param = (struct query_param*)malloc(sizeof(struct query_param)); + param->key = arg; + param->value = equal; + sscanf(equal, "%i", ¶m->i_value); + sscanf(equal, "%i", ¶m->ui_value); + param->next = server->params; + server->params = param; } -void -remove_server_from_hash( struct qserver *server) +char *get_param_value(struct qserver *server, const char *key, char *default_value) { - struct qserver **hashed; - unsigned int hash, i, ipaddr; - unsigned short port; - hash= (server->ipaddr + server->port) % ADDRESS_HASH_LENGTH; - - ipaddr= server->ipaddr; - port= server->port; - hashed= server_hash[hash]; - for ( i= server_hash_len[hash]; i; i--, hashed++) - if ( *hashed && (*hashed)->ipaddr == ipaddr && (*hashed)->port == port) { - *hashed= NULL; - break; - } + struct query_param *p = server->params; + for (; p; p = p->next) + if (strcasecmp(key, p->key) == 0) + { + return p->value; + } return default_value; } -void -free_server_hash() +int get_param_i_value(struct qserver *server, char *key, int default_value) { - int i; - for ( i= 0; i < ADDRESS_HASH_LENGTH; i++) - if ( server_hash[i]) free( server_hash[i]); + struct query_param *p = server->params; + for (; p; p = p->next) + if (strcasecmp(key, p->key) == 0) + { + return p->i_value; + } return default_value; } - -/* Functions for binding sockets to Quake servers - */ -int -bind_qserver( struct qserver *server) +unsigned int get_param_ui_value(struct qserver *server, char *key, unsigned int default_value) { - struct sockaddr_in addr; - static int one= 1; - - if ( server->type->flags & TF_TCP_CONNECT) - server->fd= socket( AF_INET, SOCK_STREAM, 0); - else - server->fd= socket( AF_INET, SOCK_DGRAM, 0); - - if ( server->fd == INVALID_SOCKET) { - if ( sockerr() == EMFILE) { - server->fd= -1; - return -2; - } - perror( "socket" ); - server->server_name= SYSERROR; - return -1; - } - - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl( source_ip); - if ( server->type->id == Q2_MASTER) - addr.sin_port= htons(26500); - else if ( source_port == 0) - addr.sin_port= 0; - else { - addr.sin_port= htons( source_port); - source_port++; - if ( source_port > source_port_high) - source_port= source_port_low; - } - memset( &(addr.sin_zero), 0, sizeof(addr.sin_zero) ); - - if ( bind( server->fd, (struct sockaddr *)&addr, - sizeof(struct sockaddr)) == SOCKET_ERROR) { - if ( sockerr() != EADDRINUSE) { - perror( "bind" ); - server->server_name= SYSERROR; - } - close(server->fd); - server->fd= -1; - return -1; - } - - if ( server->flags & FLAG_BROADCAST) - setsockopt( server->fd, SOL_SOCKET, SO_BROADCAST, (char*)&one, - sizeof(one)); - - if ( server->type->id != Q2_MASTER && - !(server->flags & FLAG_BROADCAST)) { - addr.sin_family= AF_INET; - if ( no_port_offset || server->flags & TF_NO_PORT_OFFSET) - addr.sin_port= htons(server->port); - else - addr.sin_port= htons( (unsigned short)( server->port + server->type->port_offset ) ); - addr.sin_addr.s_addr= server->ipaddr; - memset( &(addr.sin_zero), 0, sizeof(addr.sin_zero) ); - - if ( connect( server->fd, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) { - char error[50]; - if ( server->type->id == UN_MASTER) { - if ( connection_refused()) { - /* server->fd= -2; */ - /* set up for connect retry */ - } - } - sprintf( error, "connect:%s:%u", inet_ntoa( addr.sin_addr ), ntohs( addr.sin_port ) ); - perror( error ); - server->server_name= SYSERROR; - close(server->fd); - server->fd= -1; - return -1; - } - } - - // we need nonblocking always. poll on an udp socket would wake - // up and recv blocks if a packet with incorrect checksum is - // received - set_non_blocking( server->fd); - - if ( server->type->flags & TF_TCP_CONNECT) { - int one= 1; - setsockopt( server->fd, IPPROTO_TCP, TCP_NODELAY, - (char*) &one, sizeof(one)); - } - -#ifndef _WIN32 - if ( server->fd >= max_connmap) { - int old_max= max_connmap; - max_connmap= server->fd + 32; - connmap= (struct qserver **) realloc( connmap, max_connmap * - sizeof( struct qserver *)); - memset( &connmap[old_max], 0, (max_connmap - old_max) * - sizeof( struct qserver *)); - } - connmap[server->fd]= server; -#endif -#ifdef _WIN32 - { int i; - for ( i= 0; i < max_connmap; i++) { - if ( connmap[i] == NULL) { - connmap[i]= server; - break; - } - } - if ( i >= max_connmap) printf( "could not put server in connmap\n"); - } -#endif - - return 0; + struct query_param *p = server->params; + for (; p; p = p->next) + if (strcasecmp(key, p->key) == 0) + { + return p->ui_value; + } return default_value; } -static struct timeval t_lastsend = {0,0}; - -int -bind_sockets() +int parse_source_address(char *addr, unsigned int *ip, unsigned short *port) { - struct qserver *server; - struct timeval now; - int rc, retry_count= 0;; - - gettimeofday(&now, NULL); - if(connected && sendinterval && time_delta(&now, &t_lastsend) < sendinterval) - { - server = NULL; - } - else if ( !waiting_for_masters) + char *colon; + colon = strchr(addr, ':'); + if (colon) { - if ( last_server_bind == NULL) + *colon = '\0'; + *port = atoi(colon + 1); + if (colon == addr) { - last_server_bind= servers; + return 0; } - server= last_server_bind; } else { - server= servers; + *port = 0; } - for ( ; server != NULL && connected < max_simultaneous; server= server->next) + *ip = inet_addr(addr); + if (*ip == INADDR_NONE && !isdigit((unsigned char) *ip)) { - if ( server->server_name == NULL && server->fd == -1) - { - if ( waiting_for_masters && !server->type->master) - { - continue; - } - - if ( (rc= bind_qserver( server)) == 0) - { - debug(1, "send %d.%d.%d.%d:%hu\n", - server->ipaddr&0xff, - (server->ipaddr>>8)&0xff, - (server->ipaddr>>16)&0xff, - (server->ipaddr>>24)&0xff, - server->port); - - gettimeofday(&t_lastsend, NULL); - server->type->status_query_func( server); - connected++; - if ( !waiting_for_masters) - { - last_server_bind= server; - } - break; - } - else if ( rc == -2 && ++retry_count > 2) - { - return -2; - } - } + *ip = hcache_lookup_hostname(addr); } - - if ( ! connected && retry_count) + if (*ip == INADDR_NONE) { - return -2; + fprintf(stderr, "%s: Not an IP address or unknown host name\n", addr); + return -1; } - + *ip = ntohl(*ip); return 0; } - -/* - * Functions for sending packets - */ -// this is so broken, someone please rewrite the timeout handling -void -send_packets() +int parse_source_port(char *port, unsigned short *low, unsigned short *high) { - struct qserver *server; - struct timeval now; - int interval, n_sent=0, prev_n_sent; - unsigned i; - debug( 3, "processing..." ); - - gettimeofday( &now, NULL); - - if(!t_lastsend.tv_sec) + char *dash; + *low = atoi(port); + dash = strchr(port, '-'); + *high = 0; + if (dash) { - // nothing + *high = atoi(dash + 1); } - else if(connected && sendinterval && time_delta(&now, &t_lastsend) < sendinterval) + if (*high == 0) { - return; + *high = *low; } - for ( i = 0; i < max_connmap; ++i ) + if (*high < *low) { - server = connmap[i]; - if( ! server ) - { - continue; - } + fprintf(stderr, "%s: Invalid port range\n", port); + return -1; + } + return 0; +} + +void add_config_server_types() +{ + int n_config_types, n_builtin_types, i; + server_type **config_types; + server_type *new_types, *type; + config_types = qsc_get_config_server_types(&n_config_types); + + if (n_config_types == 0) + { + return ; + } + + n_builtin_types = (sizeof(builtin_types) / sizeof(server_type)) - 1; + new_types = (server_type*)malloc(sizeof(server_type)*(n_builtin_types + n_config_types + 1)); + + memcpy(new_types, &builtin_types[0], n_builtin_types *sizeof(server_type)); + type = &new_types[n_builtin_types]; + for (i = n_config_types; i; i--, config_types++, type++) + { + *type = **config_types; + } + n_server_types = n_builtin_types + n_config_types; + new_types[n_server_types].id = Q_UNKNOWN_TYPE; + if (types != &builtin_types[0]) + { + free(types); + } + types = new_types; +} + +void revert_server_types() +{ + if (types != &builtin_types[0]) + { + free(types); + } + n_server_types = (sizeof(builtin_types) / sizeof(server_type)) - 1; + types = &builtin_types[0]; +} + +#ifdef ENABLE_DUMP +unsigned pkt_dump_pos = 0; +const char *pkt_dumps[64] = { 0 }; +static void add_pkt_from_file(const char *file) +{ + if (pkt_dump_pos >= sizeof(pkt_dumps) / sizeof(pkt_dumps[0])) + { + return ; + } + pkt_dumps[pkt_dump_pos++] = file; +} + +static void replay_pkt_dumps() +{ + struct qserver *server = servers; + char *pkt = NULL; + int fd; + int bytes_read = 0; // should be ssize_t but for ease with win32 + int i; + struct stat statbuf; + gettimeofday(&packet_recv_time, NULL); - if(server->fd == -1) + for (i = 0; i < pkt_dump_pos; i++) + { + if ((fd = open(pkt_dumps[i], O_RDONLY)) == -1) { - debug(0, "invalid entry in connmap\n"); + goto err; } - if ( server->type->id & MASTER_SERVER) + if (fstat(fd, &statbuf) == -1) { - interval = master_retry_interval; + goto err; } - else + pkt = malloc(statbuf.st_size); + if (NULL == pkt) { - interval = retry_interval; + goto err; } + bytes_read = read(fd, pkt, statbuf.st_size); + if (bytes_read != statbuf.st_size) + { + fprintf(stderr, "Failed to read entire packet from disk got %d of %ld bytes\n", bytes_read, (long)statbuf.st_size); + goto err; + } + close(fd); + fd = 0; - debug(2, "server %p, name %s, retry1 %d, next_rule %p, next_player_info %d, num_players %d, n_retries %d", server, server->server_name, server->retry1, server->next_rule, server->next_player_info, server->num_players, n_retries); - prev_n_sent = n_sent; - if ( server->server_name == NULL ) + debug(2, "replay, pre-packet_func"); + proccess_func_ret( server, server->type->packet_func( server, pkt, statbuf.st_size ) ); + debug(2, "replay, post-packet_func"); + } + goto out; + + err: perror(__FUNCTION__); + close(fd); + out: fd = 0; // NOP +} +#endif // ENABLE_DUMP + +struct rcv_pkt +{ + struct qserver *server; + struct sockaddr_in addr; + struct timeval recv_time; + char data[PACKET_LEN]; + int len; + int _errno; +}; + +void do_work(void) +{ + int pktlen, rc, fd; + char *pkt = NULL; + int bind_retry = 0; + struct timeval timeout; + struct rcv_pkt *buffer; + unsigned buffill = 0, i = 0; + unsigned bufsize = max_simultaneous * 2; + + struct timeval t, ts; + gettimeofday(&t, NULL); + ts = t; + + buffer = malloc(sizeof(struct rcv_pkt) *bufsize); + + if (!buffer) + { + return ; + } + +#ifdef ENABLE_DUMP + if (pkt_dump_pos) + { + replay_pkt_dumps(); + } + else +#endif + { + bind_retry = bind_sockets(); + } + + send_packets(); + + debug(2, "connected: %d", connected); + + while (connected || (!connected && bind_retry == -2)) + { + if (!connected && bind_retry == -2) { - // We havent seen the server yet? - if ( - server->retry1 != n_retries && - time_delta( &now, &server->packet_time1) < (interval*(n_retries-server->retry1+1)) - ) - { - continue; - } + rc = wait_for_timeout(60); + bind_retry = bind_sockets(); + continue; + } + bind_retry = 0; - if ( ! server->retry1 ) - { - // No more retries - cleanup_qserver( server, 1); - continue; - } + set_file_descriptors(); + + if (progress) + { + display_progress(); + } - if( qserver_get_timeout(server, &now) <= 0 ) + get_next_timeout(&timeout); + + rc = wait_for_file_descriptors(&timeout); + + debug(2, "rc %d", rc); + + if (rc == SOCKET_ERROR) + { +#ifndef _WIN32 + if (errno == EINTR) { - // Query status - debug(2, "calling status_query_func for %p", server); - server->type->status_query_func( server); - gettimeofday(&t_lastsend, NULL); - n_sent++; continue; } +#endif + perror("select"); + break; } - if ( server->next_rule != NO_SERVER_RULES ) + fd = 0; + for (; rc && buffill < bufsize; rc--) { - // We want server rules - if ( - server->retry1 != n_retries && - time_delta( &now, &server->packet_time1) < (interval*(n_retries-server->retry1+1)) - ) + int addrlen = sizeof(buffer[buffill].addr); + struct qserver *server = get_next_ready_server(); + if (server == NULL) { - continue; + break; } - if ( ! server->retry1 ) + gettimeofday(&buffer[buffill].recv_time, NULL); + + pktlen = recvfrom(server->fd, buffer[buffill].data, sizeof(buffer[buffill].data), 0, (struct sockaddr*) &buffer[buffill].addr, (void*) &addrlen); + + debug( 2, "recvfrom: %d", pktlen ); + + if (pktlen == SOCKET_ERROR || 0 == pktlen) { - // no more retries - server->next_rule= NULL; - server->missing_rules = 1; - cleanup_qserver( server, 0); + if (connection_would_block()) + { + malformed_packet(server, "EAGAIN on UDP socket, probably incorrect checksum"); + } + else if (connection_refused() || connection_reset()) + { + server->server_name = DOWN; + num_servers_down++; + cleanup_qserver( server, FORCE ); + } continue; } - send_rule_request_packet( server); - gettimeofday(&t_lastsend, NULL); - n_sent++; + + debug(1, "recv %3d %3d %d.%d.%d.%d:%hu\n", + time_delta(&buffer[buffill].recv_time, &ts), + time_delta(&buffer[buffill].recv_time, &t), + server->ipaddr &0xff, + (server->ipaddr >> 8) &0xff, + (server->ipaddr >> 16) &0xff, + (server->ipaddr >> 24) &0xff, + server->port + ); + + t = buffer[buffill].recv_time; + + buffer[buffill].server = server; + buffer[buffill].len = pktlen; + ++buffill; } - if ( server->next_player_info < server->num_players) + debug( 2, "fill: %d < %d", buffill, bufsize) ; + + for (i = 0; i < buffill; ++i) { - // Expecting player details - if ( - server->retry2 != n_retries && - time_delta( &now, &server->packet_time2) < (interval*(n_retries-server->retry2+1)) - ) + struct qserver *server = buffer[i].server; + pkt = buffer[i].data; + pktlen = buffer[i].len; + memcpy(&packet_recv_time, &buffer[i].recv_time, sizeof(packet_recv_time)); + + if (get_debug_level() > 2) { - continue; + print_packet(server, pkt, pktlen); } - if ( ! server->retry2 ) + +#ifdef ENABLE_DUMP + if (do_dump) { - server->next_player_info++; - if ( server->next_player_info >= server->num_players ) + dump_packet(pkt, pktlen); + } +#endif + if (server->flags &FLAG_BROADCAST) + { + struct qserver *broadcast = server; + unsigned short port = ntohs(buffer[i].addr.sin_port); + /* create new server and init */ + if (!(no_port_offset || server->flags &TF_NO_PORT_OFFSET)) { - // no more retries - cleanup_qserver( server, 0); + port -= server->type->port_offset; + } + server = add_qserver_byaddr(ntohl(buffer[i].addr.sin_addr.s_addr), port, server->type, NULL); + if (server == NULL) + { + server = find_server_by_address(buffer[i].addr.sin_addr.s_addr, ntohs(buffer[i].addr.sin_port)); + if (server == NULL) + { + continue; + } + /* + if ( show_errors) + { + fprintf(stderr, + "duplicate or invalid packet received from 0x%08x:%hu\n", + ntohl(buffer[i].addr.sin_addr.s_addr), ntohs(buffer[i].addr.sin_port)); + print_packet( NULL, pkt, pktlen); + } continue; + */ + } + else + { + server->packet_time1 = broadcast->packet_time1; + server->packet_time2 = broadcast->packet_time2; + server->ping_total = broadcast->ping_total; + server->n_requests = broadcast->n_requests; + server->n_packets = broadcast->n_packets; + broadcast->n_servers++; } - server->retry2 = n_retries; } - send_player_request_packet( server); - gettimeofday(&t_lastsend, NULL); - n_sent++; + + debug(2, "connected, pre-packet_func: %d", connected); + proccess_func_ret( server, server->type->packet_func(server, pkt, pktlen) ); + debug(2, "connected, post-packet_func: %d", connected); } + buffill = 0; - if ( prev_n_sent == n_sent ) + if (run_timeout && time(0) - start_time >= run_timeout) { - // we didnt send any additional queries - debug(2, "%d %d", time_delta( &now, &server->packet_time1 ), (interval*(n_retries+1))); - if ( ! server->retry1 ) + debug(2, "run timeout reached"); + break; + } + + send_packets(); + if (connected < max_simultaneous) + { + bind_retry = bind_sockets(); + } + + debug(2, "connected: %d", connected); + } + + free(buffer); +} + +int main(int argc, char *argv[]) +{ + int arg, n_files, i; + char **files, *outfilename, *query_arg; + struct server_arg *server_args = NULL; + int n_server_args = 0, max_server_args = 0; + int default_server_type_id; + +#ifdef _WIN32 + WORD version = MAKEWORD(1, 1); + WSADATA wsa_data; + if (WSAStartup(version, &wsa_data) != 0) + { + fprintf(stderr, "Could not open winsock\n"); + exit(1); + } +#else + signal(SIGPIPE, SIG_IGN); +#endif + + types = &builtin_types[0]; + n_server_types = (sizeof(builtin_types) / sizeof(server_type)) - 1; + + i = qsc_load_default_config_files(); + if (i == -1) + { + return 1; + } + else if (i == 0) + { + add_config_server_types(); + } + + if (argc == 1) + { + usage(NULL, argv, NULL); + } + + OF = stdout; + + files = (char **)malloc(sizeof(char*)*(argc / 2)); + n_files = 0; + + default_server_type_id = Q_SERVER; + little_endian = ((char*) &one)[0]; + big_endian = !little_endian; + + for (arg = 1; arg < argc; arg++) + { + if (argv[arg][0] != '-') + { + break; + } + outfilename = NULL; + if (strcmp(argv[arg], "-nocfg") == 0 && arg == 1) + { + revert_server_types(); + } + else if (strcmp(argv[arg], "--help") == 0) + { + usage(NULL, argv, NULL); + } + else if (strcmp(argv[arg], "-f") == 0) + { + arg++; + if (arg >= argc) { - // no retries left - if ( time_delta( &now, &server->packet_time1 ) > (interval*(n_retries+1) ) ) - { - cleanup_qserver( server, 1 ); - } + usage("missing argument for -f\n", argv, NULL); } - else + files[n_files++] = argv[arg]; + } + else if (strcmp(argv[arg], "-retry") == 0) + { + arg++; + if (arg >= argc) { - // decrement as we didnt send any packets - server->retry1--; + usage("missing argument for -retry\n", argv, NULL); + } + n_retries = atoi(argv[arg]); + if (n_retries <= 0) + { + fprintf(stderr, "retries must be greater than zero\n"); + exit(1); + } + } + else if (strcmp(argv[arg], "-interval") == 0) + { + double value = 0.0; + arg++; + if (arg >= argc) + { + usage("missing argument for -interval\n", argv, NULL); + } + sscanf(argv[arg], "%lf", &value); + if (value < 0.1) + { + fprintf(stderr, "retry interval must be greater than 0.1\n"); + exit(1); + } + retry_interval = (int)(value *1000); + } + else if (strcmp(argv[arg], "-mi") == 0) + { + double value = 0.0; + arg++; + if (arg >= argc) + { + usage("missing argument for -mi\n", argv, NULL); } + sscanf(argv[arg], "%lf", &value); + if (value < 0.1) + { + fprintf(stderr, "interval must be greater than 0.1\n"); + exit(1); + } + master_retry_interval = (int)(value *1000); + } + else if (strcmp(argv[arg], "-H") == 0) + { + hostname_lookup = 1; + } + else if (strcmp(argv[arg], "-u") == 0) + { + up_servers_only = 1; + } + else if (strcmp(argv[arg], "-nf") == 0) + { + no_full_servers = 1; + } + else if (strcmp(argv[arg], "-ne") == 0) + { + no_empty_servers = 1; + } + else if (strcmp(argv[arg], "-nh") == 0) + { + no_header_display = 1; + } + else if (strcmp(argv[arg], "-old") == 0) + { + new_style = 0; + } + else if (strcmp(argv[arg], "-P") == 0) + { + get_player_info = 1; + } + else if (strcmp(argv[arg], "-R") == 0) + { + get_server_rules = 1; + } + else if (strncmp(argv[arg], "-raw", 4) == 0) + { + if (argv[arg][4] == ',') + { + if (strcmp(&argv[arg][5], "game") == 0) + { + show_game_in_raw = 1; + } + else + { + usage("Unknown -raw option\n", argv, NULL); + } + } + arg++; + if (arg >= argc) + { + usage("missing argument for -raw\n", argv, NULL); + } + raw_delimiter = argv[arg]; + + // Check the multi rule delimiter isnt the same + // If it is fix to maintain backwards compatibility + if (0 == strcmp(raw_delimiter, multi_delimiter) && 0 == strcmp(raw_delimiter, "|")) + { + multi_delimiter = ":"; + } + raw_display = 1; + } + else if (strcmp(argv[arg], "-mdelim") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -mdelim\n", argv, NULL); + } + multi_delimiter = argv[arg]; + } + else if (strcmp(argv[arg], "-xml") == 0) + { + xml_display = 1; + if (raw_display == 1) + { + usage("cannot specify both -raw and -xml\n", argv, NULL); + } + } + else if (strcmp(argv[arg], "-utf8") == 0) + { + xml_encoding = ENCODING_UTF_8; + name_xforms = 0; + } + else if (strcmp(argv[arg], "-ncn") == 0) + { + color_names = 0; + } + else if (strcmp(argv[arg], "-cn") == 0) + { + color_names = 1; + } + else if (strcmp(argv[arg], "-hc") == 0) + { + color_names = 2; + } + else if (strcmp(argv[arg], "-nx") == 0) + { + name_xforms = 1; + } + else if (strcmp(argv[arg], "-nnx") == 0) + { + name_xforms = 0; + } + else if (strcmp(argv[arg], "-tc") == 0) + { + time_format = CLOCK_TIME; + } + else if (strcmp(argv[arg], "-tsw") == 0) + { + time_format = STOPWATCH_TIME; + } + else if (strcmp(argv[arg], "-ts") == 0) + { + time_format = SECONDS; + } + else if (strcmp(argv[arg], "-pa") == 0) + { + player_address = 1; + } + else if (strcmp(argv[arg], "-hpn") == 0) + { + hex_player_names = 1; + } + else if (strcmp(argv[arg], "-hsn") == 0) + { + hex_server_names = 1; + } + else if (strncmp(argv[arg], "-maxsimultaneous", 7) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -maxsimultaneous\n", argv, NULL); + } + max_simultaneous = atoi(argv[arg]); + if (max_simultaneous <= 0) + { + usage("value for -maxsimultaneous must be > 0\n", argv, NULL); + } + if (max_simultaneous > FD_SETSIZE) + { + max_simultaneous = FD_SETSIZE; + } + } + else if (strcmp(argv[arg], "-sendinterval") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -sendinterval\n", argv, NULL); + } + sendinterval = atoi(argv[arg]); + if (sendinterval < 0) + { + usage("value for -sendinterval must be >= 0\n", argv, NULL); + } + } + else if (strcmp(argv[arg], "-raw-arg") == 0) + { + raw_arg = 1000; + } + else if (strcmp(argv[arg], "-timeout") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -timeout\n", argv, NULL); + } + run_timeout = atoi(argv[arg]); + if (run_timeout <= 0) + { + usage("value for -timeout must be > 0\n", argv, NULL); + } + } + else if (strncmp(argv[arg], "-progress", sizeof("-progress") - 1) == 0) + { + char *p = argv[arg] + sizeof("-progress") - 1; + progress = 1; + if (*p == ',') + { + progress = atoi(p + 1); + } + } + else if (strcmp(argv[arg], "-Hcache") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -Hcache\n", argv, NULL); + } + if (hcache_open(argv[arg], 0) == -1) + { + return 1; + } + } + else if (strcmp(argv[arg], "-default") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for -default\n", argv, NULL); + } + default_server_type = find_server_type_string(argv[arg]); + if (default_server_type == NULL) + { + char opt[256], *o = &opt[0]; + sprintf(opt, "-%s", argv[arg]); + for (; *o; o++) + { + *o = tolower(*o); + } + default_server_type = find_server_type_option(opt); + } + if (default_server_type == NULL) + { + fprintf(stderr, "unknown server type \"%s\"\n", argv[arg]); + usage(NULL, argv, NULL); + } + default_server_type_id = default_server_type->id; + default_server_type = NULL; + } + else if (strncmp(argv[arg], "-Tserver", 3) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (read_qserver_template(argv[arg]) == -1) + { + return 1; + } + } + else if (strncmp(argv[arg], "-Trule", 3) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (read_rule_template(argv[arg]) == -1) + { + return 1; + } + } + else if (strncmp(argv[arg], "-Theader", 3) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (read_header_template(argv[arg]) == -1) + { + return 1; + } + } + else if (strncmp(argv[arg], "-Ttrailer", 3) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (read_trailer_template(argv[arg]) == -1) + { + return 1; + } + } + else if (strncmp(argv[arg], "-Tplayer", 3) == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (read_player_template(argv[arg]) == -1) + { + return 1; + } + } + else if (strcmp(argv[arg], "-sort") == 0) + { + size_t pos; + arg++; + if (arg >= argc) + { + usage("missing argument for -sort\n", argv, NULL); + } + strncpy(sort_keys, argv[arg], sizeof(sort_keys) - 1); + pos = strspn(sort_keys, SUPPORTED_SORT_KEYS); + if (pos != strlen(sort_keys)) + { + fprintf(stderr, "Unknown sort key \"%c\", valid keys are \"%s\"\n", sort_keys[pos], SUPPORTED_SORT_KEYS); + return 1; + } + server_sort = strpbrk(sort_keys, SUPPORTED_SERVER_SORT) != NULL; + if (strchr(sort_keys, 'l')) + { + server_sort = 1; + } + player_sort = strpbrk(sort_keys, SUPPORTED_PLAYER_SORT) != NULL; + } + else if (strcmp(argv[arg], "-errors") == 0) + { + show_errors++; + } + else if (strcmp(argv[arg], "-of") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (argv[arg][0] == '-' && argv[arg][1] == '\0') + { + OF = stdout; + } + else + { + OF = fopen(argv[arg], "w"); + } + if (OF == NULL) + { + perror(argv[arg]); + return 1; + } + } + else if (strcmp(argv[arg], "-af") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (argv[arg][0] == '-' && argv[arg][1] == '\0') + { + OF = stdout; + } + else + { + OF = fopen(argv[arg], "a"); + } + if (OF == NULL) + { + perror(argv[arg]); + return 1; + } + } + else if (strcmp(argv[arg], "-htmlnames") == 0) + { + html_names = 1; + } + else if (strcmp(argv[arg], "-nohtmlnames") == 0) + { + html_names = 0; + } + else if (strcmp(argv[arg], "-htmlmode") == 0) + { + html_mode = 1; + } + else if (strcmp(argv[arg], "-carets") == 0) + { + strip_carets = 0; + } + else if (strcmp(argv[arg], "-d") == 0) + { + set_debug_level(get_debug_level() + 1); + } + else if (strcmp(argv[arg], "-showgameport") == 0) + { + show_game_port = 1; + } + else if (strcmp(argv[arg], "-noportoffset") == 0) + { + no_port_offset = 1; + } + else if (strcmp(argv[arg], "-srcip") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (parse_source_address(argv[arg], &source_ip, &source_port) == -1) + { + return 1; + } + if (source_port) + { + source_port_low = source_port; + source_port_high = source_port; + } + } + else if (strcmp(argv[arg], "-srcport") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (parse_source_port(argv[arg], &source_port_low, &source_port_high) == -1) + { + return 1; + } + source_port = source_port_low; + } + else if (strcmp(argv[arg], "-cfg") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + if (qsc_load_config_file(argv[arg]) == -1) + { + return 1; + } + add_config_server_types(); + } + else if (strcmp(argv[arg], "-allowserverdups") == 0) + { + noserverdups = 0; + } + else if (strcmp(argv[arg], "-bom") == 0) + { + output_bom = 1; + } +#ifdef ENABLE_DUMP + else if (strcmp(argv[arg], "-dump") == 0) + { + do_dump = 1; + } + else if (strcmp(argv[arg], "-pkt") == 0) + { + arg++; + if (arg >= argc) + { + usage("missing argument for %s\n", argv, argv[arg - 1]); + } + add_pkt_from_file(argv[arg]); + } +#endif +#ifdef _WIN32 + else if (strcmp(argv[arg], "-noconsole") == 0) + { + FreeConsole(); + } +#endif + else + { + int outfile; + server_type *type; + arg++; + if (arg >= argc) + { + fprintf(stderr, "missing argument for \"%s\"\n", argv[arg - 1]); + return 1; + } + type = parse_server_type_option(argv[arg - 1], &outfile, &query_arg); + if (type == NULL) + { + fprintf(stderr, "unknown option \"%s\"\n", argv[arg - 1]); + return 1; + } + outfilename = NULL; + if (outfile) + { + outfilename = strchr(argv[arg], ','); + if (outfilename == NULL) + { + fprintf(stderr, "missing file name for \"%s,outfile\"\n", argv[arg - 1]); + return 1; + } + *outfilename++ = '\0'; + } + /* + if ( query_arg && !(type->flags & TF_QUERY_ARG)) { + fprintf( stderr, "option flag \"%s\" not allowed for this server type\n", + query_arg); + return 1; + } + */ + if (type->flags &TF_QUERY_ARG_REQUIRED && !query_arg) + { + fprintf(stderr, "option flag missing for server type \"%s\"\n", argv[arg - 1]); + return 1; + } + add_server_arg(argv[arg], type->id, outfilename, query_arg, &server_args, &n_server_args, &max_server_args); + } + } + + start_time = time(0); + + default_server_type = find_server_type_id(default_server_type_id); + + for (i = 0; i < n_files; i++) + { + add_file(files[i]); + } + + for (; arg < argc; arg++) + { + add_qserver(argv[arg], default_server_type, NULL, NULL); + } + + for (i = 0; i < n_server_args; i++) + { + server_type *server_type = find_server_type_id(server_args[i].type_id); + add_qserver(server_args[i].arg, server_type, server_args[i].outfilename, server_args[i].query_arg); + } + + free(server_args); + + if (servers == NULL) + { + exit(1); + } + + max_connmap = max_simultaneous + 10; + connmap = (struct qserver **)calloc(1, sizeof(struct qserver*) * max_connmap); + + if (color_names == -1) + { + color_names = (raw_display) ? DEFAULT_COLOR_NAMES_RAW : DEFAULT_COLOR_NAMES_DISPLAY; + } + + if (time_format == -1) + { + time_format = (raw_display) ? DEFAULT_TIME_FMT_RAW : DEFAULT_TIME_FMT_DISPLAY; + } + + if ((one_server_type_id &MASTER_SERVER) || one_server_type_id == 0) + { + display_prefix = 1; + } + + if (xml_display) + { + xml_header(); + } + else if (new_style && !raw_display && !have_server_template()) + { + display_header(); + } + else if (have_header_template()) + { + template_display_header(); + } + + q_serverinfo.length = htons(q_serverinfo.length); + h2_serverinfo.length = htons(h2_serverinfo.length); + q_player.length = htons(q_player.length); + + do_work(); + + finish_output(); + free_server_hash(); + free(files); + free(connmap); + + return 0; +} + +void finish_output() +{ + int i; + hcache_update_file(); + + if (progress) + { + display_progress(); + fputs("\n", stderr); + } + + if (server_sort) + { + struct qserver **array, *server, *next_server; + if (strchr(sort_keys, 'l') && strpbrk(sort_keys, SUPPORTED_SERVER_SORT) == NULL) + { + server = servers; + for (; server; server = next_server) + { + next_server = server->next; + display_server(server); + } + } + else + { + array = (struct qserver **)malloc(sizeof(struct qserver*) * num_servers_total); + server = servers; + for (i = 0; server != NULL; i++) + { + array[i] = server; + server = server->next; + } + sort_servers(array, num_servers_total); + if (progress) + { + fprintf(stderr, "\n"); + } + for (i = 0; i < num_servers_total; i++) + { + display_server(array[i]); + } + free(array); + } + } + else + { + struct qserver *server, *next_server; + server = servers; + for (; server; server = next_server) + { + next_server = server->next; + if (server->server_name == HOSTNOTFOUND) + { + display_server(server); + } + } + } + + if (xml_display) + { + xml_footer(); + } + else if (have_trailer_template()) + { + template_display_trailer(); + } + + if (OF != stdout) + { + fclose(OF); + } +} + + +void add_file(char *filename) +{ + FILE *file; + char name[200], *comma, *query_arg = NULL; + server_type *type; + + if (strcmp(filename, "-") == 0) + { + file = stdin; + current_filename = NULL; + } + else + { + file = fopen(filename, "r"); + current_filename = filename; + } + current_fileline = 1; + + if (file == NULL) + { + perror(filename); + return ; + } + for (; fscanf(file, "%s", name) == 1; current_fileline++) + { + comma = strchr(name, ','); + if (comma) + { + *comma++ = '\0'; + query_arg = strdup(comma); + } + type = find_server_type_string(name); + if (type == NULL) + { + add_qserver(name, default_server_type, NULL, NULL); + } + else if (fscanf(file, "%s", name) == 1) + { + if (type->flags &TF_QUERY_ARG && comma && *query_arg) + { + add_qserver(name, type, NULL, query_arg); + } + else + { + add_qserver(name, type, NULL, NULL); + } + } + } + + if (file != stdin) + { + fclose(file); + } + + current_fileline = 0; +} + +void print_file_location() +{ + if (current_fileline != 0) + { + fprintf(stderr, "%s:%d: ", current_filename ? current_filename : "<stdin>", current_fileline); + } +} + +void parse_query_params(struct qserver *server, char *params) +{ + char *comma, *arg = params; + do + { + comma = strchr(arg, ','); + if (comma) + { + *comma = '\0'; + } if (strchr(arg, '=')) + { + add_query_param(server, arg); + } + else if (strcmp(arg, "noportoffset") == 0 || strcmp(arg, "qp") == 0) + { + server->flags |= TF_NO_PORT_OFFSET; + } + else if (strcmp(arg, "showgameport") == 0 || strcmp(arg, "gp") == 0) + { + server->flags |= TF_SHOW_GAME_PORT; + } + arg = comma + 1; + } + while (comma); +} + +int add_qserver(char *arg, server_type *type, char *outfilename, char *query_arg) +{ + struct qserver *server, *prev_server; + int flags = 0; + char *colon = NULL, *arg_copy, *hostname = NULL; + unsigned int ipaddr; + unsigned short port, port_max; + int portrange = 0; + unsigned colonpos = 0; + + if (run_timeout && time(0) - start_time >= run_timeout) + { + finish_output(); + exit(0); + } + + port = port_max = type->default_port; + + if (outfilename && strcmp(outfilename, "-") != 0) + { + FILE *outfile = fopen(outfilename, "r+"); + if (outfile == NULL && (errno == EACCES || errno == EISDIR || errno == ENOSPC || errno == ENOTDIR)) + { + perror(outfilename); + return -1; + } + if (outfile) + { + fclose(outfile); + } + } + + arg_copy = strdup(arg); + + colon = strchr(arg, ':'); + if (colon != NULL) + { + if (sscanf(colon + 1, "%hu-%hu", &port, &port_max) == 2) + { + portrange = 1; + } + else + { + port_max = port; + } + *colon = '\0'; + colonpos = colon - arg; + } + + if (*arg == '+') + { + flags |= FLAG_BROADCAST; + arg++; + } + + ipaddr = inet_addr(arg); + if (ipaddr == INADDR_NONE) + { + if (strcmp(arg, "255.255.255.255") != 0) + { + ipaddr = htonl(hcache_lookup_hostname(arg)); + } + } + else if (hostname_lookup && !(flags &FLAG_BROADCAST)) + { + hostname = hcache_lookup_ipaddr(ntohl(ipaddr)); + } + + if ((ipaddr == INADDR_NONE || ipaddr == 0) && strcmp(arg, "255.255.255.255") != 0) + { + print_file_location(); + fprintf(stderr, "%s: %s\n", arg, strherror(h_errno)); + server = (struct qserver*)calloc(1, sizeof(struct qserver)); + for (; port <= port_max; ++port) + { + init_qserver(server, type); + if (portrange) + { + server->arg = (port == port_max) ? arg_copy : strdup(arg_copy); + } if (portrange) + { + sprintf(server->arg + colonpos + 1, "%hu", port); + } + server->server_name = HOSTNOTFOUND; + server->error = strdup(strherror(h_errno)); + server->orig_port = server->query_port = server->port = port; + if (last_server != &servers) + { + prev_server = (struct qserver*)((char*)last_server - ((char*) &server->next - (char*)server)); + server->prev = prev_server; + } + *last_server = server; + last_server = &server->next; + if (one_server_type_id == ~MASTER_SERVER) + { + one_server_type_id = type->id; + } + else if (one_server_type_id != type->id) + { + one_server_type_id = 0; + } + } + return -1; + } + + for (; port > 0 && port <= port_max; ++port) + { + if (noserverdups && find_server_by_address(ipaddr, port) != NULL) + { + continue; + } + + server = (struct qserver*)calloc(1, sizeof(struct qserver)); + server->arg = port == port_max ? arg_copy : strdup(arg_copy); + if (portrange) + { + sprintf(server->arg + colonpos + 1, "%hu", port); + } + if (hostname && colon) + { + server->host_name = (char*)malloc(strlen(hostname) + 5+2); + sprintf(server->host_name, "%s:%hu", hostname, port); + } + else + { + server->host_name = strdup((hostname) ? hostname : arg); + } + + server->ipaddr = ipaddr; + server->orig_port = server->query_port = server->port = port; + server->type = type; + server->outfilename = outfilename; + server->flags = flags; + if (query_arg) + { + server->query_arg = (port == port_max) ? query_arg : strdup(query_arg); + parse_query_params(server, server->query_arg); + } + else + { + server->query_arg = NULL; + } + init_qserver(server, type); + + if (server->type->master) + { + waiting_for_masters++; + } + + if (num_servers_total % 10 == 0) + { + hcache_update_file(); + } + + if (last_server != &servers) + { + prev_server = (struct qserver*)((char*)last_server - ((char*) &server->next - (char*)server)); + server->prev = prev_server; + } + *last_server = server; + last_server = &server->next; + + add_server_to_hash(server); + + if (one_server_type_id == ~MASTER_SERVER) + { + one_server_type_id = type->id; + } + else if (one_server_type_id != type->id) + { + one_server_type_id = 0; + } + + ++num_servers; + } + return 0; +} + +struct qserver *add_qserver_byaddr(unsigned int ipaddr, unsigned short port, server_type *type, int *new_server) +{ + char arg[36]; + struct qserver *server, *prev_server; + char *hostname = NULL; + + if (run_timeout && time(0) - start_time >= run_timeout) + { + finish_output(); + exit(0); + } + + if (new_server) + { + *new_server = 0; + } + ipaddr = htonl(ipaddr); + if (ipaddr == 0) + { + return 0; + } + + // TODO: this prevents servers with the same ip:port being queried + // and hence breaks virtual servers support e.g. Teamspeak 2 + if (find_server_by_address(ipaddr, port) != NULL) + { + return 0; + } + + if (new_server) + { + *new_server = 1; + } + + server = (struct qserver*)calloc(1, sizeof(struct qserver)); + server->ipaddr = ipaddr; + ipaddr = ntohl(ipaddr); + sprintf(arg, "%d.%d.%d.%d:%hu", ipaddr >> 24, (ipaddr >> 16) &0xff, (ipaddr >> 8) &0xff, ipaddr &0xff, port); + server->arg = strdup(arg); + + if (hostname_lookup) + { + hostname = hcache_lookup_ipaddr(ipaddr); + } + + if (hostname) + { + server->host_name = (char*)malloc(strlen(hostname) + 6+2); + sprintf(server->host_name, "%s:%hu", hostname, port); + } + else + { + server->host_name = strdup(arg); + } + + server->orig_port = server->query_port = server->port = port; + init_qserver(server, type); + + if (num_servers_total % 10 == 0) + { + hcache_update_file(); + } + + if (last_server != &servers) + { + prev_server = (struct qserver*)((char*)last_server - ((char*) &server->next - (char*)server)); + server->prev = prev_server; + } + *last_server = server; + last_server = &server->next; + + add_server_to_hash(server); + + ++num_servers; + + return server; +} + +void add_servers_from_masters() +{ + struct qserver *server; + unsigned int ipaddr, i; + unsigned short port; + int n_servers, new_server, port_adjust = 0; + char *pkt; + server_type *server_type; + FILE *outfile; + + for (server = servers; server != NULL; server = server->next) + { + if (!server->type->master || server->master_pkt == NULL) + { + continue; + } + pkt = server->master_pkt; + + if (server->query_arg && server->type->id == GAMESPY_MASTER) + { + server_type = find_server_type_string(server->query_arg); + if (server_type == NULL) + { + server_type = find_server_type_id(server->type->master); + } + } + else + { + server_type = find_server_type_id(server->type->master); + } + + if (server->type->id == GAMESPY_MASTER && server_type) + { + if (server_type->id == UN_SERVER) + { + port_adjust = - 1; + } + else if (server_type->id == KINGPIN_SERVER) + { + port_adjust = 10; + } + } + + outfile = NULL; + if (server->outfilename) + { + if (strcmp(server->outfilename, "-") == 0) + { + outfile = stdout; + } + else + { + outfile = fopen(server->outfilename, "w"); + } + if (outfile == NULL) + { + perror(server->outfilename); + continue; + } + } + n_servers = 0; + for (i = 0; i < server->master_pkt_len; i += 6) + { + memcpy(&ipaddr, &pkt[i], 4); + memcpy(&port, &pkt[i + 4], 2); + ipaddr = ntohl(ipaddr); + port = ntohs(port) + port_adjust; + new_server = 1; + if (outfile) + { + fprintf(outfile, "%s %d.%d.%d.%d:%hu\n", + server_type ? server_type->type_string: "", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff, port + ); + } + else if (server_type == NULL) + { + fprintf(OF, "%d.%d.%d.%d:%hu\n", (ipaddr >> 24) &0xff, (ipaddr >> 16) &0xff, (ipaddr >> 8) &0xff, ipaddr &0xff, port); + } + else + { + add_qserver_byaddr(ipaddr, port, server_type, &new_server); + } + n_servers += new_server; + } + free(server->master_pkt); + server->master_pkt = NULL; + server->master_pkt_len = 0; + server->n_servers = n_servers; + if (outfile) + { + fclose(outfile); + } + } + if (hostname_lookup) + { + hcache_update_file(); + } + bind_sockets(); +} + +void init_qserver(struct qserver *server, server_type *type) +{ + server->server_name = NULL; + server->map_name = NULL; + server->game = NULL; + server->num_players = 0; + server->num_spectators = 0; + server->fd = - 1; + if (server->flags &FLAG_BROADCAST) + { + server->retry1 = 1; + server->retry2 = 1; + } + else + { + server->retry1 = n_retries; + server->retry2 = n_retries; + } + server->n_retries = 0; + server->ping_total = 0; + server->n_packets = 0; + server->n_requests = 0; + + server->n_servers = 0; + server->master_pkt_len = 0; + server->master_pkt = NULL; + server->error = NULL; + + server->saved_data.data = NULL; + server->saved_data.datalen = 0; + server->saved_data.pkt_index = - 1; + server->saved_data.pkt_max = 0; + server->saved_data.next = NULL; + + server->type = type; + server->next_rule = (get_server_rules) ? "" : NO_SERVER_RULES; + server->next_player_info = (get_player_info && type->player_packet) ? 0 : NO_PLAYER_INFO; + + server->n_player_info = 0; + server->players = NULL; + server->n_rules = 0; + server->rules = NULL; + server->last_rule = &server->rules; + server->missing_rules = 0; + + num_servers_total++; +} + +// ipaddr should be network byte-order +// port should be host byte-order +struct qserver *find_server_by_address(unsigned int ipaddr, unsigned short port) +{ + struct qserver **hashed; + unsigned int hash, i; + hash = (ipaddr + port) % ADDRESS_HASH_LENGTH; + + if (ipaddr == 0) + { + for (hash = 0; hash < ADDRESS_HASH_LENGTH; hash++) + { + printf("%3d %d\n", hash, server_hash_len[hash]); + } + return NULL; + } + + hashed = server_hash[hash]; + for (i = server_hash_len[hash]; i; i--, hashed++) + { + if (*hashed && (*hashed)->ipaddr == ipaddr && (*hashed)->port == port) + { + return *hashed; + } + } + return NULL; +} + +void add_server_to_hash(struct qserver *server) +{ + unsigned int hash; + hash = (server->ipaddr + server->port) % ADDRESS_HASH_LENGTH; + + if (server_hash_len[hash] % 16 == 0) + { + server_hash[hash] = (struct qserver **)realloc(server_hash[hash], sizeof(struct qserver **)*(server_hash_len[hash] + 16)); + memset(&server_hash[hash][server_hash_len[hash]], 0, sizeof(struct qserver **) * 16); + } + server_hash[hash][server_hash_len[hash]] = server; + server_hash_len[hash]++; +} + +void remove_server_from_hash(struct qserver *server) +{ + struct qserver **hashed; + unsigned int hash, i, ipaddr = server->ipaddr; + unsigned short port = server->orig_port; + hash = ( ipaddr + port ) % ADDRESS_HASH_LENGTH; + + hashed = server_hash[hash]; + for (i = server_hash_len[hash]; i; i--, hashed++) + { + if (*hashed && (*hashed)->ipaddr == ipaddr && (*hashed)->orig_port == port) + { + *hashed = NULL; + break; + } + } +} + +void free_server_hash() +{ + int i; + for (i = 0; i < ADDRESS_HASH_LENGTH; i++) + { + if (server_hash[i]) + { + free(server_hash[i]); + } + } +} + + +/* Functions for binding sockets to Quake servers + */ +int bind_qserver(struct qserver *server) +{ + struct sockaddr_in addr; + static int one = 1; + int sockbuf = RECV_BUF; + + if (server->type->flags &TF_TCP_CONNECT) + { + server->fd = socket(AF_INET, SOCK_STREAM, 0); + } + else + { + server->fd = socket(AF_INET, SOCK_DGRAM, 0); + } + + if (server->fd == INVALID_SOCKET) + { + if (sockerr() == EMFILE) + { + server->fd = - 1; + return -2; + } + + perror("socket"); + server->server_name = SYSERROR; + return -1; + } + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(source_ip); + if (server->type->id == Q2_MASTER) + { + addr.sin_port = htons(26500); + } + else if (source_port == 0) + { + addr.sin_port = 0; + } + else + { + addr.sin_port = htons(source_port); + source_port++; + if (source_port > source_port_high) + { + source_port = source_port_low; + } + } + memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero)); + + if (bind(server->fd, (struct sockaddr*) &addr, sizeof(struct sockaddr)) == SOCKET_ERROR) + { + if (sockerr() != EADDRINUSE) + { + perror("bind"); + server->server_name = SYSERROR; + } + close(server->fd); + server->fd = - 1; + return -1; + } + + if (server->flags &FLAG_BROADCAST) + { + if ( -1 == setsockopt(server->fd, SOL_SOCKET, SO_BROADCAST, (char*) &one, sizeof(one)) ) + { + perror( "Failed to set broadcast" ); + } + } + + // we need nonblocking always. poll on an udp socket would wake + // up and recv blocks if a packet with incorrect checksum is + // received + set_non_blocking(server->fd); + + if (server->type->id != Q2_MASTER && !(server->flags &FLAG_BROADCAST)) + { + addr.sin_family = AF_INET; + if (no_port_offset || server->flags &TF_NO_PORT_OFFSET) + { + addr.sin_port = htons(server->port); + } + else + { + addr.sin_port = htons((unsigned short)(server->port + server->type->port_offset)); + } + addr.sin_addr.s_addr = server->ipaddr; + memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero)); + + if (connect(server->fd, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR) + { + int ignore = 0; + char error[50]; + if ( connection_inprogress() ) + { + while( 1 ) + { + int ret; + struct timeval tv; + fd_set connect_set; + + tv.tv_sec = retry_interval / 1000; + tv.tv_usec = ( retry_interval % 1000 ) * 1000; + FD_ZERO( &connect_set ); + FD_SET( server->fd, &connect_set ); + + // NOTE: We may need to check exceptfds here on windows instead of writefds + ret = select( server->fd + 1, NULL, &connect_set, NULL, &tv ); + if ( 0 > ret && errno != EINTR ) + { + fprintf( stderr, "Error connecting %d - %s\n", errno, strerror(errno) ); + break; + } + else if ( 0 < ret ) + { + // Socket selected for write + int valopt; + unsigned int lon = sizeof(int); + if ( 0 != getsockopt( server->fd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) ) + { + fprintf( stderr, "Error in getsockopt() %d - %s\n", errno, strerror(errno) ); + break; + } + + // Check the value returned... + if (valopt) + { + fprintf( stderr, "Error in delayed connection() %d - %s\n", valopt, strerror(valopt) ); + break; + } + ignore = 1; + break; + } + else + { + break; + } + } + } + + if ( ! ignore ) + { + sprintf(error, "connect:%s:%u", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + perror(error); + server->server_name = SYSERROR; + close(server->fd); + server->fd = - 1; + return -1; + } + } + } + + if (server->type->flags &TF_TCP_CONNECT) + { + int one = 1; + if ( -1 == setsockopt(server->fd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one)) ) + { + perror( "Failed to set TCP no delay" ); + } + } + + if ( server->type->id & MASTER_SERVER ) + { + // Use a large buffer so we dont miss packets + if ( -1 == setsockopt(server->fd, SOL_SOCKET, SO_RCVBUF, (void*)&sockbuf, sizeof(sockbuf)) ) + { + perror( "Failed to set socket buffer" ); + } + } + +#ifndef _WIN32 + if (server->fd >= max_connmap) + { + int old_max = max_connmap; + max_connmap = server->fd + 32; + connmap = (struct qserver **)realloc(connmap, max_connmap *sizeof(struct qserver*)); + memset(&connmap[old_max], 0, (max_connmap - old_max) *sizeof(struct qserver*)); + } + connmap[server->fd] = server; +#endif +#ifdef _WIN32 + { + int i; + for (i = 0; i < max_connmap; i++) + { + if (connmap[i] == NULL) + { + connmap[i] = server; + break; + } + } + if (i >= max_connmap) + { + printf("could not put server in connmap\n"); + } + } +#endif + + return 0; +} + +static struct timeval t_lastsend = { 0, 0 }; + +int bind_sockets() +{ + struct qserver *server, *next_server; + struct timeval now; + int rc, retry_count = 0; + + gettimeofday(&now, NULL); + if (connected && sendinterval && time_delta(&now, &t_lastsend) < sendinterval) + { + server = NULL; + } + else if (!waiting_for_masters) + { + if (last_server_bind == NULL) + { + last_server_bind = servers; + } + server = last_server_bind; + } + else + { + server = servers; + } + + for (; server != NULL && connected < max_simultaneous; ) + { + // note the next server for use as process_func can free the server + next_server = server->next; + if (server->server_name == NULL && server->fd == -1) + { + if (waiting_for_masters && !server->type->master) + { + server = next_server; + continue; + } + + if ((rc = bind_qserver(server)) == 0) + { + debug(1, "send %d.%d.%d.%d:%hu\n", + server->ipaddr &0xff, + (server->ipaddr >> 8) &0xff, + (server->ipaddr >> 16) &0xff, + (server->ipaddr >> 24) &0xff, + server->port + ); + + gettimeofday(&t_lastsend, NULL); + debug(2, "calling status_query_func for %p", server); + proccess_func_ret( server, server->type->status_query_func(server) ); + + connected++; + if (!waiting_for_masters) + { + last_server_bind = server; + } + break; + } + else if (rc == -2 && ++retry_count > 2) + { + return -2; + } + } + + server = next_server; + } + + if (!connected && retry_count) + { + return -2; + } + + return 0; +} + +int proccess_func_ret( struct qserver *server, int ret ) +{ + debug( 3, "proccess_func_ret %p, %d", server, ret ); + switch ( ret ) + { + case INPROGRESS: + break; + + case DONE_AUTO: + cleanup_qserver( server, NO_FORCE ); + break; + + // For documenation only :) + //case DONE_FORCE: + //case SOCKET_ERROR: + //case MEM_ERROR: + //case PKT_ERROR: + //case ORD_ERROR: + default: + cleanup_qserver( server, FORCE ); + break; + } + + return ret; +} + + +/* + * Functions for sending packets + */ +// this is so broken, someone please rewrite the timeout handling +void send_packets() +{ + struct qserver *server; + struct timeval now; + int interval, n_sent = 0, prev_n_sent; + unsigned i; + debug(3, "processing..."); + + gettimeofday(&now, NULL); + + if (!t_lastsend.tv_sec) + { + // nothing + } + else if (connected && sendinterval && time_delta(&now, &t_lastsend) < sendinterval) + { + return ; + } + + for (i = 0; i < max_connmap; ++i) + { + server = connmap[i]; + if (!server) + { + continue; + } + + if (server->fd == -1) + { + debug(0, "invalid entry in connmap\n"); + } + + if (server->type->id &MASTER_SERVER) + { + interval = master_retry_interval; + } + else + { + interval = retry_interval; + } + + debug(2, "server %p, name %s, retry1 %d, next_rule %p, next_player_info %d, num_players %d, n_retries %d", + server, + server->server_name, + server->retry1, + server->next_rule, + server->next_player_info, + server->num_players, + n_retries + ); + prev_n_sent = n_sent; + if (server->server_name == NULL) + { + // We havent seen the server yet? + if (server->retry1 != n_retries && time_delta(&now, &server->packet_time1) < (interval *(n_retries - server->retry1 + 1))) + { + continue; + } + + if (!server->retry1) + { + // No more retries + cleanup_qserver( server, FORCE ); + continue; + } + + if (qserver_get_timeout(server, &now) <= 0) + { + // Query status + debug(2, "calling status_query_func for %p", server); + proccess_func_ret( server, server->type->status_query_func(server) ); + gettimeofday(&t_lastsend, NULL); + n_sent++; + continue; + } + } + + if (server->next_rule != NO_SERVER_RULES) + { + // We want server rules + if (server->retry1 != n_retries && time_delta(&now, &server->packet_time1) < (interval *(n_retries - server->retry1 + 1))) + { + continue; + } + + if (!server->retry1) + { + // no more retries + server->next_rule = NULL; + server->missing_rules = 1; + cleanup_qserver( server, NO_FORCE ); + continue; + } + send_rule_request_packet(server); + gettimeofday(&t_lastsend, NULL); + n_sent++; + } + + if (server->next_player_info < server->num_players) + { + // Expecting player details + if (server->retry2 != n_retries && time_delta(&now, &server->packet_time2) < (interval *(n_retries - server->retry2 + 1))) + { + continue; + } + if (!server->retry2) + { + server->next_player_info++; + if (server->next_player_info >= server->num_players) + { + // no more retries + cleanup_qserver( server, FORCE ); + continue; + } + server->retry2 = n_retries; + } + send_player_request_packet(server); + gettimeofday(&t_lastsend, NULL); + n_sent++; + } + + if (prev_n_sent == n_sent) + { + // we didnt send any additional queries + debug(2, "no queries sent: %d %d", time_delta(&now, &server->packet_time1), (interval *(n_retries + 1))); + if (!server->retry1) + { + // no retries left + if (time_delta(&now, &server->packet_time1) > (interval *(n_retries + 1))) + { + cleanup_qserver( server, FORCE ); + } + } + else + { + // decrement as we didnt send any packets + server->retry1--; + } + } + } + + debug(3, "done"); +} + +/* server starts sending data immediately, so we need not do anything */ +int send_bfris_request_packet(struct qserver *server) +{ + return register_send(server); +} + + +/* First packet for a normal Quake server + */ +int send_qserver_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +/* First packet for a QuakeWorld server + */ +int send_qwserver_request_packet(struct qserver *server) +{ + int rc; + + if (server->flags &FLAG_BROADCAST) + { + rc = send_broadcast(server, server->type->status_packet, server->type->status_len); + } + else if (server->server_name == NULL) + { + rc = send(server->fd, server->type->status_packet, server->type->status_len, 0); + } + else if (server->server_name != NULL && server->type->rule_packet) + { + rc = send(server->fd, server->type->rule_packet, server->type->rule_len, 0); + } + else + { + rc = SOCKET_ERROR; + } + + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + + if (server->retry1 == n_retries || server->flags &FLAG_BROADCAST) + { + gettimeofday(&server->packet_time1, NULL); + server->n_requests++; + } + else if (server->server_name == NULL) + { + server->n_retries++; + } + server->retry1--; + if (server->server_name == NULL) + { + server->n_packets++; + } + server->next_player_info = NO_PLAYER_INFO; // we don't have a player packet + + return 0; +} + +// First packet for an Unreal Tournament 2003 server +int send_ut2003_request_packet(struct qserver *server) +{ + int ret = send_packet(server, server->type->status_packet, server->type->status_len); + server->next_player_info = NO_PLAYER_INFO; + + return ret; +} + +// First packet for an Half-Life 2 server +int send_hl2_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +/* First packet for an Unreal master + */ +int send_unrealmaster_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +static const char *steam_region[] = +{ + "US East Coast", "US West Coast", "South America", "Europe", "Asia", "Australia", "Middle East", "Africa", NULL +}; + +char *build_hlmaster_packet(struct qserver *server, int *len) +{ + static char packet[1600]; + char *pkt, *r, *sep = ""; + char *gamedir, *map, *flags; + int flen; + + pkt = &packet[0]; + memcpy(pkt, server->type->master_packet, *len); + + if (server->type->flags &TF_MASTER_STEAM) + { + // default the region to 0xff + const char *regionstring = get_param_value(server, "region", NULL); + int region = 0xFF; + if (regionstring) + { + char *tmp = NULL; + region = strtol(regionstring, &tmp, 10); + if (tmp == regionstring) + { + int i = 0; + region = 0xFF; + for (; steam_region[i]; ++i) + { + if (!strcmp(regionstring, steam_region[i])) + { + region = i; + break; + } + } + } + } + *(pkt + 1) = region; + } + + pkt += *len; + + gamedir = get_param_value(server, "game", NULL); + if (gamedir) + { + pkt += sprintf(pkt, "\\gamedir\\%s", gamedir); + } + + // not valid for steam? + map = get_param_value(server, "map", NULL); + if (map) + { + pkt += sprintf(pkt, "\\map\\%s", map); + } + + // not valid for steam? + flags = get_param_value(server, "status", NULL); + r = flags; + while (flags && sep) + { + sep = strchr(r, ':'); + if (sep) + { + flen = sep - r; + } + else + { + flen = strlen(r); + } + + if (strncmp(r, "notempty", flen) == 0) + { + pkt += sprintf(pkt, "\\empty\\1"); + } + else if (strncmp(r, "notfull", flen) == 0) + { + pkt += sprintf(pkt, "\\full\\1"); + } + else if (strncmp(r, "dedicated", flen) == 0) + { + if (server->type->flags &TF_MASTER_STEAM) + { + pkt += sprintf(pkt, "\\type\\d"); + } + else + { + pkt += sprintf(pkt, "\\dedicated\\1"); + } + } + else if (strncmp(r, "linux", flen) == 0) + { + pkt += sprintf(pkt, "\\linux\\1"); + } + else if (strncmp(r, "proxy", flen) == 0) + // steam + { + pkt += sprintf(pkt, "\\proxy\\1"); + } + else if (strncmp(r, "secure", flen) == 0) + // steam + { + pkt += sprintf(pkt, "\\secure\\1"); + } + r = sep + 1; + } + + // always need null terminator + *pkt = 0x00; + pkt++; + + *len = pkt - packet; + + return packet; +} + +/* First packet for a QuakeWorld master server + */ +int send_qwmaster_request_packet(struct qserver *server) +{ + int rc = 0; + + server->next_player_info = NO_PLAYER_INFO; + + if (server->type->id == Q2_MASTER) + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + if (no_port_offset || server->flags &TF_NO_PORT_OFFSET) + { + addr.sin_port = htons(server->port); + } + else + { + addr.sin_port = htons((unsigned short)(server->port + server->type->port_offset)); + } + addr.sin_addr.s_addr = server->ipaddr; + memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero)); + rc = sendto(server->fd, server->type->master_packet, server->type->master_len, 0, (struct sockaddr*) &addr, sizeof(addr)); + } + else + { + char *packet; + int packet_len; + char query_buf[4096] = { 0 }; + + packet = server->type->master_packet; + packet_len = server->type->master_len; + + if (server->type->id == HL_MASTER) + { + memcpy(server->type->master_packet + 1, server->master_query_tag, 3); + if (server->query_arg) + { + packet_len = server->type->master_len; + packet = build_hlmaster_packet(server, &packet_len); + } + } + else if (server->type->flags &TF_MASTER_STEAM) + { + // region + int tag_len = strlen(server->master_query_tag); + if (tag_len < 9) + { + // initial case + tag_len = 9; + strcpy(server->master_query_tag, "0.0.0.0:0"); + } + + // 1 byte packet id + // 1 byte region + // ip:port + // 1 byte null + packet_len = 2+tag_len + 1; + + if (server->query_arg) + { + // build_hlmaster_packet uses server->type->master_packet + // as the basis so copy from server->master_query_tag + strcpy(server->type->master_packet + 2, server->master_query_tag); + packet = build_hlmaster_packet(server, &packet_len); + } + else + { + // default region + *(packet + 1) = 0xff; + memcpy(packet + 2, server->master_query_tag, tag_len); + + // filter null + *(packet + packet_len) = 0x00; + packet_len++; + } + } + else if (server->type->flags &TF_QUERY_ARG) + { + // fill in the master protocol details + char *master_protocol = server->query_arg; + if (master_protocol == NULL) + { + master_protocol = server->type->master_protocol; + } + packet_len = sprintf(query_buf, server->type->master_packet, + master_protocol ? master_protocol : "", + server->type->master_query ? server->type->master_query: "" + ); + packet = query_buf; + } + + rc = send(server->fd, packet, packet_len, 0); + } + + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + + if (server->retry1 == n_retries) + { + gettimeofday(&server->packet_time1, NULL); + server->n_requests++; + } + else + { + server->n_retries++; + } + server->retry1--; + server->n_packets++; + + return INPROGRESS; +} + + +int send_tribes_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->player_packet, server->type->player_len); +} + +int send_tribes2_request_packet(struct qserver *server) +{ + int rc; + + if (server->flags &FLAG_BROADCAST && server->server_name == NULL) + { + rc = send_broadcast(server, server->type->status_packet, server->type->status_len); + } + else if (server->server_name == NULL) + { + rc = send(server->fd, server->type->status_packet, server->type->status_len, 0); + } + else + { + rc = send(server->fd, server->type->player_packet, server->type->player_len, 0); + } + + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + + register_send(server); + + return rc; +} + +int send_ghostrecon_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +int send_eye_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +int send_ravenshield_request_packet(struct qserver *server) +{ + return send_packet(server, server->type->status_packet, server->type->status_len); +} + +int send_savage_request_packet(struct qserver *server) +{ + int len; + char *pkt; + + if (get_player_info) + { + pkt = server->type->player_packet; + len = server->type->player_len; + } + else + { + pkt = server->type->status_packet; + len = server->type->status_len; + } + + return send_packet(server, pkt, len); +} + +int send_farcry_request_packet(struct qserver *server) +{ + int len; + char *pkt; + + if (get_player_info) + { + pkt = server->type->player_packet; + len = server->type->player_len; + } + else + { + pkt = server->type->status_packet; + len = server->type->status_len; + } + + return send_packet(server, pkt, len); +} + +int send_tribes2master_request_packet(struct qserver *server) +{ + int rc; + unsigned char packet[1600], *pkt; + unsigned int len, min_players, max_players, region_mask = 0; + unsigned int build_version, max_bots, min_cpu, status; + char *game, *mission, *buddies; + static char *region_list[] = + { + "naeast", "nawest", "sa", "aus", "asia", "eur", NULL + }; + static char *status_list[] = + { + "dedicated", "nopassword", "linux" + }; + + if (strcmp(get_param_value(server, "query", ""), "types") == 0) + { + rc = send(server->fd, tribes2_game_types_request, sizeof(tribes2_game_types_request), 0); + goto send_done; + } + + memcpy(packet, server->type->master_packet, server->type->master_len); + + pkt = packet + 7; + + game = get_param_value(server, "game", "any"); + len = strlen(game); + if (len > 255) + { + len = 255; + } + *pkt++ = len; + memcpy(pkt, game, len); + pkt += len; + + mission = get_param_value(server, "mission", "any"); + len = strlen(mission); + if (len > 255) + { + len = 255; + } + *pkt++ = len; + memcpy(pkt, mission, len); + pkt += len; + + min_players = get_param_ui_value(server, "minplayers", 0); + max_players = get_param_ui_value(server, "maxplayers", 255); + *pkt++ = min_players; + *pkt++ = max_players; + + region_mask = get_param_ui_value(server, "regions", 0xffffffff); + if (region_mask == 0) + { + char *regions = get_param_value(server, "regions", ""); + char *r = regions; + char **list, *sep; + do + { + sep = strchr(r, ':'); + if (sep) + { + len = sep - r; + } + else + { + len = strlen(r); + } + for (list = region_list; *list; list++) + if (strncasecmp(r, *list, len) == 0) + { + break; + } + if (*list) + { + region_mask |= 1 << (list - region_list); + } + r = sep + 1; + } + while (sep); + } + if (little_endian) + { + memcpy(pkt, ®ion_mask, 4); + } + else + { + pkt[0] = region_mask &0xff; + pkt[1] = (region_mask >> 8) &0xff; + pkt[2] = (region_mask >> 16) &0xff; + pkt[3] = (region_mask >> 24) &0xff; + } + pkt += 4; + + build_version = get_param_ui_value(server, "build", 0); + /* + if ( build_version && build_version < 22337) { + packet[1]= 0; + build_version= 0; + } + */ + if (little_endian) + { + memcpy(pkt, &build_version, 4); + } + else + { + pkt[0] = build_version &0xff; + pkt[1] = (build_version >> 8) &0xff; + pkt[2] = (build_version >> 16) &0xff; + pkt[3] = (build_version >> 24) &0xff; + } + pkt += 4; + + status = get_param_ui_value(server, "status", - 1); + if (status == 0) + { + char *flags = get_param_value(server, "status", ""); + char *r = flags; + char **list, *sep; + do + { + sep = strchr(r, ':'); + if (sep) + { + len = sep - r; + } + else + { + len = strlen(r); + } + for (list = status_list; *list; list++) + if (strncasecmp(r, *list, len) == 0) + { + break; + } + if (*list) + { + status |= 1 << (list - status_list); + } + r = sep + 1; + } + while (sep); + } + else if (status == -1) + { + status = 0; + } + *pkt++ = status; + + max_bots = get_param_ui_value(server, "maxbots", 255); + *pkt++ = max_bots; + + min_cpu = get_param_ui_value(server, "mincpu", 0); + if (little_endian) + { + memcpy(pkt, &min_cpu, 2); + } + else + { + pkt[0] = min_cpu &0xff; + pkt[1] = (min_cpu >> 8) &0xff; + } + pkt += 2; + + buddies = get_param_value(server, "buddies", NULL); + if (buddies) + { + char *b = buddies, *sep; + unsigned int buddy, n_buddies = 0; + unsigned char *n_loc = pkt++; + do + { + sep = strchr(b, ':'); + if (sscanf(b, "%u", &buddy)) + { + n_buddies++; + if (little_endian) + { + memcpy(pkt, &buddy, 4); + } + else + { + pkt[0] = buddy &0xff; + pkt[1] = (buddy >> 8) &0xff; + pkt[2] = (buddy >> 16) &0xff; + pkt[3] = (buddy >> 24) &0xff; + } + pkt += 4; + } + b = sep + 1; + } + while (sep && n_buddies < 255); + *n_loc = n_buddies; + } + else + { + *pkt++ = 0; + } + + rc = send(server->fd, (char*)packet, pkt - packet, 0); + +send_done: + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + + if (server->retry1 == n_retries) + { + gettimeofday(&server->packet_time1, NULL); + server->n_requests++; + } + else + { + server->n_retries++; + } + server->retry1--; + server->n_packets++; + + return 1; +} + +static struct _gamespy_query_map +{ + char *qstat_type; + char *gamespy_type; +} +gamespy_query_map[] = +{ + { "qws", "quakeworld" }, + { "q2s", "quake2" }, + { "q3s", "quake3" }, + { "tbs", "tribes" }, + { "uns", "ut" }, + { "sgs", "shogo" }, + { "hls", "halflife" }, + { "kps", "kingpin" }, + { "hrs", "heretic2" }, + { "sfs", "sofretail" }, + { NULL, NULL } +}; + +int send_gamespy_master_request(struct qserver *server) +{ + int rc, i; + char request[1024]; + + if (server->n_packets) + { + return 0; + } + + rc = send(server->fd, server->type->master_packet, server->type->master_len, 0); + if (rc != server->type->master_len) + { + perror("send"); + } + + strcpy(request, server->type->status_packet); + + for (i = 0; gamespy_query_map[i].qstat_type; i++) + if (strcasecmp(server->query_arg, gamespy_query_map[i].qstat_type) == 0) + { + break; + } + if (gamespy_query_map[i].gamespy_type == NULL) + { + strcat(request, server->query_arg); + } + else + { + strcat(request, gamespy_query_map[i].gamespy_type); + } + strcat(request, "\\final\\"); + assert(strlen(request) < sizeof(request)); + + rc = send(server->fd, request, strlen(request), 0); + if (rc != strlen(request)) + { + perror("send"); + } + + if (server->retry1 == n_retries) + { + gettimeofday(&server->packet_time1, NULL); + server->n_requests++; + } + + server->n_packets++; + + return 1; +} + +int send_rule_request_packet(struct qserver *server) +{ + int rc, len; + + debug(3, "send_rule_request_packet: %p", server); + + /* Server created via broadcast, so bind it */ + if (server->fd == -1) + { + if (bind_qserver(server) < 0) + { + goto setup_retry; + } + } + + if (server->type->rule_query_func && server->type->rule_query_func != send_rule_request_packet) + { + return server->type->rule_query_func(server); + } + + if (server->type->id == Q_SERVER) + { + strcpy((char*)q_rule.data, server->next_rule); + len = Q_HEADER_LEN + strlen((char*)q_rule.data) + 1; + q_rule.length = htons((short)len); + } + else + { + len = server->type->rule_len; + } + + rc = send(server->fd, (const char*)server->type->rule_packet, len, 0); + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + +setup_retry: + if (server->retry1 == n_retries) + { + gettimeofday(&server->packet_time1, NULL); + server->n_requests++; + } + else if (server->server_name == NULL) + { + server->n_retries++; + } + server->retry1--; + if (server->server_name == NULL) + { + server->n_packets++; + } + + return 1; +} + +int send_player_request_packet(struct qserver *server) +{ + int rc; + + debug( 3, "send_player_request_packet %p", server ); + + if (!server->type->player_packet) + { + return 0; + } + + /* Server created via broadcast, so bind it */ + if (server->fd == -1) + { + if (bind_qserver(server) < 0) + { + goto setup_retry; + } + } + + if (server->type->player_query_func && server->type->player_query_func != send_player_request_packet) + { + return server->type->player_query_func(server); + } + + if (!server->type->player_packet) + { + debug(0, "error: server %p has no player_packet", server); + return 0; + } + + if (server->type->id == Q_SERVER) + { + q_player.data[0] = server->next_player_info; + } + rc = send(server->fd, (const char*)server->type->player_packet, server->type->player_len, 0); + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + +setup_retry: + if (server->retry2 == n_retries) + { + gettimeofday(&server->packet_time2, NULL); + server->n_requests++; + } + else + { + server->n_retries++; + } + server->retry2--; + server->n_packets++; + + return 1; +} + +void qserver_disconnect(struct qserver *server) +{ +#ifdef _WIN32 + int i; +#endif + if (server->fd != - 1) + { + close(server->fd); +#ifndef _WIN32 + connmap[server->fd] = NULL; +#else + for (i = 0; i < max_connmap; i++) + { + if (connmap[i] == server) + { + connmap[i] = NULL; + break; + } + } +#endif + server->fd = - 1; + connected--; + } +} + +/* Functions for figuring timeouts and when to give up + * Returns 1 if the query is done (server may be freed) and 0 if not. + */ +int cleanup_qserver(struct qserver *server, int force) +{ + int close_it = force; + debug( 3, "cleanup_qserver %p, %d", server, force ); + if (server->server_name == NULL) + { + debug(3, "server has no name, forcing close"); + close_it = 1; + if (server->type->id &MASTER_SERVER && server->master_pkt != NULL) + { + server->server_name = MASTER; + } + else + { + server->server_name = TIMEOUT; + num_servers_timed_out++; + } + } + else if (server->type->flags &TF_SINGLE_QUERY) + { + debug(3, "TF_SINGLE_QUERY, forcing close"); + close_it = 1; + } + else if (server->next_rule == NO_SERVER_RULES && server->next_player_info >= server->num_players) + { + debug(3, "no server rules and next_player_info >= num_players, forcing close"); + close_it = 1; + } + + debug(3, "close_it %d", close_it); + if (close_it) + { + if (server->saved_data.data) + { + SavedData *sdata = server->saved_data.next; + free(server->saved_data.data); + server->saved_data.data = NULL; + while (sdata != NULL) + { + SavedData *next; + free(sdata->data); + next = sdata->next; + free(sdata); + sdata = next; + } + server->saved_data.next = NULL; + } + + qserver_disconnect(server); + + if (server->server_name != TIMEOUT) + { + num_servers_returned++; + if (server->server_name != DOWN) + { + num_players_total += server->num_players; + max_players_total += server->max_players; + } + } + if (server->server_name == TIMEOUT || server->server_name == DOWN) + { + server->ping_total = 999999; + } + if (server->type->master) + { + waiting_for_masters--; + if (waiting_for_masters == 0) + { + add_servers_from_masters(); + } + } + if (!server_sort) + { + display_server(server); + } + return 1; + } + return 0; +} + +/** must be called only on connected servers + * @returns time in ms until server needs timeout handling. timeout handling is needed if <= zero + */ +static int qserver_get_timeout(struct qserver *server, struct timeval *now) +{ + int diff, diff1, diff2, interval; + + if (server->type->id &MASTER_SERVER) + { + interval = master_retry_interval; + } + else + { + interval = retry_interval; + } + + diff2 = 0xffff; + + diff1 = interval *(n_retries - server->retry1 + 1) - time_delta(now, &server->packet_time1); + + if (server->next_player_info < server->num_players) + { + diff2 = interval *(n_retries - server->retry2 + 1) - time_delta(now, &server->packet_time2); + } + + debug(2, "timeout for %p is diff1 %d diff2 %d", server, diff1, diff2); + + + diff = (diff1 < diff2) ? diff1 : diff2; + + return diff; +} + +void get_next_timeout(struct timeval *timeout) +{ + struct qserver *server = servers; + struct timeval now; + int diff, smallest = retry_interval + master_retry_interval; + int bind_count = 0; + + if (first_server_bind == NULL) + { + first_server_bind = servers; + } + + server = first_server_bind; + + for (; server != NULL && server->fd == -1; server = server->next) + ; + + /* if there are unconnected servers and slots left we retry in 10ms */ + if (server == NULL || (num_servers > connected && connected < max_simultaneous)) + { + timeout->tv_sec = 0; + timeout->tv_usec = 10 * 1000; + return ; + } + + first_server_bind = server; + + gettimeofday(&now, NULL); + for (; server != NULL && bind_count < connected; server = server->next) + { + if (server->fd == -1) + { + continue; + } + + diff = qserver_get_timeout(server, &now); + if (diff < smallest) + { + smallest = diff; + } + bind_count++; + } + + if (smallest < 10) + { + smallest = 10; + } + + timeout->tv_sec = smallest / 1000; + timeout->tv_usec = (smallest % 1000) *1000; +} + + +#ifdef USE_SELECT +static fd_set select_read_fds; +static int select_maxfd; +static int select_cursor; + +int set_fds(fd_set *fds) +{ + int maxfd = - 1, i; + + for (i = 0; i < max_connmap; i++) + { + if (connmap[i] != NULL) + { + FD_SET(connmap[i]->fd, fds); + if (connmap[i]->fd > maxfd) + { + maxfd = connmap[i]->fd; + } + } + } + + return maxfd; +} + +void set_file_descriptors() +{ + FD_ZERO(&select_read_fds); + select_maxfd = set_fds(&select_read_fds); +} + +int wait_for_file_descriptors(struct timeval *timeout) +{ + select_cursor = 0; + return select(select_maxfd + 1, &select_read_fds, NULL, NULL, timeout); +} + +struct qserver *get_next_ready_server() +{ + while (select_cursor < max_connmap && (connmap[select_cursor] == NULL || !FD_ISSET(connmap[select_cursor]->fd, &select_read_fds))) + { + select_cursor++; + } + + if (select_cursor >= max_connmap) + { + return NULL; + } + return connmap[select_cursor++]; +} + +int wait_for_timeout(unsigned int ms) +{ + struct timeval timeout; + timeout.tv_sec = ms / 1000; + timeout.tv_usec = (ms % 1000) *1000; + return select(0, 0, NULL, NULL, &timeout); +} + +#endif /* USE_SELECT */ + +#ifdef USE_POLL +static struct pollfd *pollfds; +static int n_pollfds; +static int max_pollfds = 0; +static int poll_cursor; + +void set_file_descriptors() +{ + struct pollfd *p; + int i; + + if (max_connmap > max_pollfds) + { + max_pollfds = max_connmap; + pollfds = (struct pollfd*)realloc(pollfds, max_pollfds *sizeof(struct pollfd)); + } + + p = pollfds; + for (i = 0; i < max_connmap; i++) + if (connmap[i] != NULL) + { + p->fd = connmap[i]->fd; + p->events = POLLIN; + p->revents = 0; + p++; + } + n_pollfds = p - pollfds; +} + +int wait_for_file_descriptors(struct timeval *timeout) +{ + poll_cursor = 0; + return poll(pollfds, n_pollfds, timeout->tv_sec *1000+timeout->tv_usec / 1000); +} + +struct qserver *get_next_ready_server() +{ + for (; poll_cursor < n_pollfds; poll_cursor++) + { + if (pollfds[poll_cursor].revents) + { + break; + } + } + + if (poll_cursor >= n_pollfds) + { + return NULL; + } + return connmap[pollfds[poll_cursor++].fd]; +} + +int wait_for_timeout(unsigned int ms) +{ + return poll(0, 0, ms); +} + +#endif /* USE_POLL */ + + +void free_server(struct qserver *server) +{ + struct player *player, *next_player; + struct rule *rule, *next_rule; + + /* remove from servers list */ + if (server == servers) + { + servers = server->next; + if (servers) + { + servers->prev = NULL; + } + } + + if ((void*) &server->next == (void*)last_server) + { + if (server->prev) + { + last_server = &server->prev->next; + } + else + { + last_server = &servers; + } + } + if (server == first_server_bind) + { + first_server_bind = server->next; + } + if (server == last_server_bind) + { + last_server_bind = server->next; + } + + if (server->prev) + { + server->prev->next = server->next; + } + if (server->next) + { + server->next->prev = server->prev; + } + + /* remove from server hash table */ + remove_server_from_hash(server); + + /* free all the data */ + for (player = server->players; player; player = next_player) + { + next_player = player->next; + free_player(player); + } + + for (rule = server->rules; rule; rule = next_rule) + { + next_rule = rule->next; + free_rule(rule); + } + + if (server->arg) + { + free(server->arg); + } + if (server->host_name) + { + free(server->host_name); + } + if (server->error) + { + free(server->error); + } + if (server->address) + { + free(server->address); + } + if (server->map_name) + { + free(server->map_name); + } + if (!(server->flags &FLAG_DO_NOT_FREE_GAME) && server->game) + { + free(server->game); + } + if (server->master_pkt) + { + free(server->master_pkt); + } + if ( server->query_arg ) + { + free(server->query_arg); + } + + /* These fields are never malloc'd: outfilename + */ + + if ( + server->server_name != NULL && + server->server_name != DOWN && + server->server_name != HOSTNOTFOUND && + server->server_name != SYSERROR && + server->server_name != MASTER && + server->server_name != SERVERERROR && + server->server_name != TIMEOUT && + server->server_name != GAMESPY_MASTER_NAME && + server->server_name != BFRIS_SERVER_NAME + ) + { + free(server->server_name); + } + + /* + params ... + saved_data ... + */ + + free(server); + --num_servers; +} + +void free_player(struct player *player) +{ + if (player->name) + { + free(player->name); + } + if (!(player->flags &PLAYER_FLAG_DO_NOT_FREE_TEAM) && player->team_name) + { + free(player->team_name); + } + if (player->address) + { + free(player->address); + } + if (player->tribe_tag) + { + free(player->tribe_tag); + } + if (player->skin) + { + free(player->skin); + } + if (player->mesh) + { + free(player->mesh); + } + if (player->face) + { + free(player->face); + } + free(player); +} + +void free_rule(struct rule *rule) +{ + if (rule->name) + { + free(rule->name); + } + + if (rule->value) + { + free(rule->value); + } + free(rule); +} + +/* Functions for handling response packets + */ + +/* Packet from normal Quake server + */ +int deal_with_q_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + struct q_packet *pkt = (struct q_packet*)rawpkt; + int rc; + + debug( 2, "deal_with_q_packet %p, %d", server, pktlen ); + + if (ntohs(pkt->length) != pktlen) + { + fprintf(stderr, "%s Ignoring bogus packet; length %d != %d\n", server->arg, ntohs(pkt->length), pktlen); + return PKT_ERROR; + } + + rawpkt[pktlen] = '\0'; + + switch (pkt->op_code) + { + case Q_CCREP_ACCEPT: + case Q_CCREP_REJECT: + return 0; + case Q_CCREP_SERVER_INFO: + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + rc = server_info_packet(server, pkt, pktlen - Q_HEADER_LEN); + break; + case Q_CCREP_PLAYER_INFO: + server->ping_total += time_delta(&packet_recv_time, &server->packet_time2); + rc = player_info_packet(server, pkt, pktlen - Q_HEADER_LEN); + break; + case Q_CCREP_RULE_INFO: + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + rc = rule_info_packet(server, pkt, pktlen - Q_HEADER_LEN); + break; + case Q_CCREQ_CONNECT: + case Q_CCREQ_SERVER_INFO: + case Q_CCREQ_PLAYER_INFO: + case Q_CCREQ_RULE_INFO: + default: + return 0; + } + + if ( SOCKET_ERROR == rc ) + { + fprintf(stderr, "%s error on packet opcode %x\n", server->arg, (int)pkt->op_code); + } + + return rc; +} + + +/* Packet from QuakeWorld server + */ +int deal_with_qw_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + debug( 2, "deal_with_qw_packet %p, %d", server, pktlen ); + if (server->server_name == NULL) + { + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + } + + if (((rawpkt[0] != '\377' && rawpkt[0] != '\376') || rawpkt[1] != '\377' || rawpkt[2] != '\377' || rawpkt[3] != '\377') && show_errors) + { + unsigned int ipaddr = ntohl(server->ipaddr); + fprintf(stderr, "Odd packet from server %d.%d.%d.%d:%hu, processing ...\n", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff, + ntohs(server->port) + ); + print_packet(server, rawpkt, pktlen); + } + + rawpkt[pktlen] = '\0'; + + if (rawpkt[4] == 'n') + { + if (server->type->id != QW_SERVER) + { + server->type = find_server_type_id(QW_SERVER); + } + return deal_with_q1qw_packet(server, rawpkt, pktlen); + } + else if (rawpkt[4] == '\377' && rawpkt[5] == 'n') + { + if (server->type->id != HW_SERVER) + { + server->type = find_server_type_id(HW_SERVER); + } + return deal_with_q1qw_packet(server, rawpkt, pktlen); + } + else if (strncmp(&rawpkt[4], "print\n\\", 7) == 0) + { + return deal_with_q2_packet(server, rawpkt + 10, pktlen - 10 ); + } + else if (strncmp(&rawpkt[4], "print\n", 6) == 0) + { + /* work-around for occasional bug in Quake II status packets + */ + char *c, *p; + p = c = &rawpkt[10]; + while (*p != '\\' && (c = strchr(p, '\n'))) + { + p = c + 1; + } + if (*p == '\\' && c != NULL) + { + return deal_with_q2_packet(server, p, pktlen - (p - rawpkt) ); + } + } + else if (strncmp(&rawpkt[4], "infoResponse", 12) == 0 || (rawpkt[4] == '\001' && strncmp(&rawpkt[5], "infoResponse", 12) == 0)) + { + /* quake3 info response */ + int ret; + if (rawpkt[4] == '\001') + { + rawpkt++; + pktlen--; + } + rawpkt += 12; + pktlen -= 12; + for (; pktlen && *rawpkt != '\\'; pktlen--, rawpkt++) + ; + if (!pktlen) + { + return INPROGRESS; + } + if (rawpkt[pktlen - 1] == '"') + { + rawpkt[pktlen - 1] = '\0'; + pktlen--; + } + if (get_player_info || get_server_rules) + { + server->next_rule = ""; + } + + ret = deal_with_q2_packet(server, rawpkt, pktlen ); + if ( DONE_AUTO == ret && ( get_player_info || get_server_rules ) ) + { + send_rule_request_packet( server); + server->retry1= n_retries-1; + return INPROGRESS; + } + + return ret; + } + else if (strncmp(&rawpkt[4], "statusResponse\n", 15) == 0 || (rawpkt[4] == '\001' && strncmp(&rawpkt[5], "statusResponse\n", 15) == 0)) + { + /* quake3 status response */ + server->next_rule = NO_SERVER_RULES; + server->retry1 = 0; + if (rawpkt[4] == '\001') + { + rawpkt++; + pktlen--; + } + server->flags |= CHECK_DUPLICATE_RULES; + return deal_with_q2_packet(server, rawpkt + 19, pktlen - 19 ); + } + else if (strncmp(&rawpkt[4], "infostringresponse", 19) == 0) + { + return deal_with_q2_packet(server, rawpkt + 23, pktlen - 23 ); + } + + if (show_errors) + { + unsigned int ipaddr = ntohl(server->ipaddr); + fprintf(stderr, "Odd packet from server %d.%d.%d.%d:%hu, ignoring ...\n", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff, + ntohs(server->port) + ); + print_packet(server, rawpkt, pktlen); + return PKT_ERROR; + } + + return DONE_AUTO; +} + +int deal_with_q1qw_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + char *key, *value, *end, *users; + struct player *player = NULL, **last_player = &server->players; + int len, rc, complete = 0; + int number, frags, connect_time, ping; + char *pkt = &rawpkt[5]; + + debug( 2, "deal_with_q1qw_packet %p, %d", server, pktlen ); + + if (server->type->id == HW_SERVER) + { + pkt = &rawpkt[6]; + } + + *(users = strchr(pkt, '\n')) = '\0'; + while (*pkt && pkt - rawpkt < pktlen) + { + if (*pkt == '\\') + { + pkt++; + end = strchr(pkt, '\\'); + if (end == NULL) + { + break; + } + *end = '\0'; + key = pkt; + pkt += strlen(pkt) + 1; + end = strchr(pkt, '\\'); + if (end == NULL) + { + end = users; + } + value = (char*)malloc(end - pkt + 1); + memcpy(value, pkt, end - pkt); + value[end - pkt] = '\0'; + pkt = end; + if (strcmp(key, "hostname") == 0) + { + server->server_name = value; + } + else if (strcmp(key, "map") == 0) + { + server->map_name = value; + } + else if (strcmp(key, "maxclients") == 0) + { + server->max_players = atoi(value); + free(value); + } + else if (strcmp(key, "maxspectators") == 0) + { + server->max_spectators = atoi(value); + free(value); + } + else if (get_server_rules || strncmp(key, "*game", 5) == 0) + { + add_rule(server, key, value, NO_VALUE_COPY); + if (strcmp(key, "*gamedir") == 0) + { + server->game = value; + server->flags |= FLAG_DO_NOT_FREE_GAME; + } + } + } + else + { + pkt++; + } + complete = 1; + } + *pkt = '\n'; + while (*pkt && pkt - rawpkt < pktlen) + { + if (*pkt == '\n') + { + pkt++; + if (pkt - rawpkt >= pktlen || *pkt == '\0') + { + break; + } + rc = sscanf(pkt, "%d %d %d %d %n", &number, &frags, &connect_time, &ping, &len); + if (rc != 4) + { + char *nl; /* assume it's an error packet */ + server->error = (char*)malloc(pktlen + 1); + nl = strchr(pkt, '\n'); + if (nl != NULL) + { + strncpy(server->error, pkt, nl - pkt); + server->error[nl - pkt] = '\0'; + } + else + { + strcpy(server->error, pkt); + } + server->server_name = SERVERERROR; + complete = 1; + break; + } + if (get_player_info) + { + player = (struct player*)calloc(1, sizeof(struct player)); + player->number = number; + player->frags = frags; + player->connect_time = connect_time * 60; + player->ping = ping > 0 ? ping : - ping; + } + else + { + player = NULL; + } + + pkt += len; + + if (*pkt != '"') + { + break; + } + pkt += ping > 0 ? 1 : 4; // if 4 then no "\s\" in spectators name + // protocol "under construction" + end = strchr(pkt, '"'); + if (end == NULL) + { + break; + } + if (player != NULL) + { + player->name = (char*)malloc(end - pkt + 1); + memcpy(player->name, pkt, end - pkt); + player->name[end - pkt] = '\0'; + } + + pkt = end + 2; + + if (*pkt != '"') + { + break; + } + pkt++; + end = strchr(pkt, '"'); + if (end == NULL) + { + break; + } + if (player != NULL) + { + player->skin = (char*)malloc(end - pkt + 1); + memcpy(player->skin, pkt, end - pkt); + player->skin[end - pkt] = '\0'; + } + pkt = end + 2; + + if (player != NULL) + { + sscanf(pkt, "%d %d%n", &player->shirt_color, &player->pants_color, &len); + *last_player = player; + last_player = &player->next; + } + else + { + sscanf(pkt, "%*d %*d%n", &len); + } + pkt += len; + + if (pkt + 3 < rawpkt + pktlen && *pkt == ' ') + // mvdsv is at last rev 377, 23.06.2006 + { + pkt++; + + if (*pkt != '"') + { + break; + } + pkt++; + end = strchr(pkt, '"'); + if (end == NULL) + { + break; + } + + if (player != NULL) + { + player->team_name = (char*)malloc(end - pkt + 1); + memcpy(player->team_name, pkt, end - pkt); + player->team_name[end - pkt] = '\0'; + } + pkt = end + 1; + } + + if (ping > 0) + { + server->num_players++; + } + else + { + server->num_spectators++; + } + } + else + { + pkt++; + } + complete = 1; + } + + if (!complete) + { + if (rawpkt[4] != 'n' || rawpkt[5] != '\0') + { + fprintf(stderr, "Odd packet from QW server %d.%d.%d.%d:%hu ...\n", + (server->ipaddr >> 24) &0xff, + (server->ipaddr >> 16) &0xff, + (server->ipaddr >> 8) &0xff, + server->ipaddr &0xff, + ntohs(server->port) + ); + print_packet(server, rawpkt, pktlen); + } + } + else if (server->server_name == NULL) + { + server->server_name = strdup(""); + } + + return DONE_AUTO; +} + +int deal_with_q2_packet(struct qserver *server, char *rawpkt, int pktlen ) +{ + char *key, *value, *end; + struct player *player = NULL; + struct player **last_player = &server->players; + int len, rc, complete = 0; + int frags = 0, ping = 0, num_players = 0; + char *pkt = rawpkt; + + debug( 2, "deal_with_q2_packet %p, %d", server, pktlen ); + + while (*pkt && pkt - rawpkt < pktlen) + { + // we have variable, value pairs seperated by slash + if (*pkt == '\\') + { + pkt++; + if (*pkt == '\n' && server->type->id == SOF_SERVER) + { + goto player_info; + } + + // Find the key + end = strchr(pkt, '\\'); + if (NULL == end) + { + break; + } + *end = '\0'; + key = pkt; + pkt += strlen(key) + 1; + + // Find the value + end = strpbrk(pkt, "\\\n"); + if (NULL == end) + { + // Last value + end = rawpkt + pktlen; + } + + // Make a copy of the value + value = (char*)malloc(end - pkt + 1); + memcpy(value, pkt, end - pkt); + value[end - pkt] = '\0'; + pkt = end; + debug(3, "%s = %s", key, value); + if (server->server_name == NULL && (strcmp(key, "hostname") == 0 || strcmp(key, "sv_hostname") == 0)) + { + // Server name + server->server_name = value; + } + else if (strcmp(key, "mapname") == 0 || (strcmp(key, "map") == 0 && server->map_name == NULL)) + { + // Map name + if (NULL != server->map_name) + { + free(server->map_name); + } + server->map_name = value; + } + else if (strcmp(key, "maxclients") == 0 || strcmp(key, "sv_maxclients") == 0 || strcmp(key, "max") == 0) + { + // Max Players + server->max_players = atoi(value); + // Note: COD 4 infoResponse returns max as sv_maxclients - sv_privateClients where as statusResponse returns the true max + // MOHAA Q3 protocol max players is always 0 + if (0 == server->max_players) + { + server->max_players = - 1; + } + free(value); + } + else if (strcmp(key, "clients") == 0 || strcmp(key, "players") == 0) + { + // Num Players + server->num_players = atoi(value); + free(value); + } + else if (server->server_name == NULL && strcmp(key, "pure") == 0) + { + add_rule(server, key, value, NO_VALUE_COPY); + } + else if (get_server_rules || strncmp(key, "game", 4) == 0) + { + int dofree = 0; + int flags = ( server->flags & CHECK_DUPLICATE_RULES ) ? CHECK_DUPLICATE_RULES | NO_VALUE_COPY : NO_VALUE_COPY; + if (add_rule(server, key, value, flags ) == NULL) + { + // duplicate, so free value + dofree = 1; + } + + if (server->game == NULL && strcmp(key, server->type->game_rule) == 0) + { + server->game = value; + if (0 == dofree) + { + server->flags |= FLAG_DO_NOT_FREE_GAME; + } + } + else if (1 == dofree) + { + free(value); + } + } + else + { + free(value); + } + } + else if (*pkt == '\n') + { + player_info: debug(3, "player info"); + pkt++; + if (*pkt == '\0') + { + break; + } + + if (0 == strncmp(pkt, "\\challenge\\", 11)) + { + // qfusion + // This doesnt support getstatus looking at warsow source: + // server/sv_main.c: SV_ConnectionlessPacket + server->next_rule = NO_SERVER_RULES; + debug(3, "no more server rules"); + break; + } + + rc = sscanf(pkt, "%d %n", &frags, &len); + if (rc == 1 && pkt[len] != '"') + { + pkt += len; + rc = sscanf(pkt, "%d %n", &ping, &len); + } + else if (rc == 1) + { + /* MOHAA Q3 protocol only provides player ping */ + ping = frags; + frags = 0; + } + + if (rc != 1) + { + char *nl; /* assume it's an error packet */ + server->error = (char*)malloc(pktlen + 1); + nl = strchr(pkt, '\n'); + if (nl != NULL) + { + strncpy(server->error, pkt, nl - pkt); + } + else + { + strcpy(server->error, pkt); + } + server->server_name = SERVERERROR; + complete = 1; + break; + } + + if (get_player_info) + { + player = (struct player*)calloc(1, sizeof(struct player)); + player->number = 0; + player->connect_time = - 1; + player->frags = frags; + player->ping = ping; + } + else + { + player = NULL; + } + + pkt += len; + + if (isdigit((unsigned char) *pkt)) + { + /* probably an SOF2 1.01 server, includes team # */ + int team; + rc = sscanf(pkt, "%d %n", &team, &len); + if (rc == 1) + { + pkt += len; + if (player) + { + player->team = team; + server->flags |= FLAG_PLAYER_TEAMS; + } + } + } + + if (*pkt != '"') + { + break; + } + + pkt++; + end = strchr(pkt, '"'); + if (end == NULL) + { + break; + } + if (player != NULL) + { + player->name = (char*)malloc(end - pkt + 1); + memcpy(player->name, pkt, end - pkt); + player->name[end - pkt] = '\0'; + } + pkt = end + 1; + + //WarSoW team number + if (*pkt != '\n') + { + int team; + rc = sscanf(pkt, "%d%n", &team, &len); + if (rc == 1) + { + pkt += len; + if (player) + { + player->team = team; + server->flags |= FLAG_PLAYER_TEAMS; + } + } + } + + if (player != NULL) + { + player->skin = NULL; + player->shirt_color = - 1; + player->pants_color = - 1; + *last_player = player; + last_player = &player->next; + } + num_players++; + } + else + { + pkt++; + } + complete = 1; + } + + if (server->num_players == 0 || num_players > server->num_players) + { + server->num_players = num_players; + } + + if (!complete) + { + return PKT_ERROR; + } + else if (server->server_name == NULL) + { + server->server_name = strdup(""); + } + + return DONE_AUTO; +} + +int ack_descent3master_packet(struct qserver *server, char *curtok) +{ + int rc; + char packet[0x1e]; + memcpy(packet, descent3_masterquery, 0x1a); + packet[1] = 0x1d; + packet[0x16] = 1; + memcpy(packet + 0x1a, curtok, 4); + rc = send(server->fd, packet, sizeof(packet), 0); + if (rc == SOCKET_ERROR) + { + return send_error( server, rc ); + } + + return rc; +} + +/* Packet from Descent3 master server (PXO) + */ +int deal_with_descent3master_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + int i = 0, lastpacket = 0; + char *names = rawpkt + 0x1f; + char *ips = rawpkt + 0x29f; + char *ports = rawpkt + 0x2ef; + + debug( 2, "deal_with_descent3master_packet %p, %d", server, pktlen ); + + while (i < 20) + { + if (*names) + { + char *c; + server->master_pkt_len += 6; + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len); + c = server->master_pkt + server->master_pkt_len - 6; + memcpy(c, ips, 4); + memcpy(c + 4, ports, 2); + } + else if (i > 0) + { + lastpacket = 1; + } + names += 0x20; + ips += 4; + ports += 2; + i++; + } + + ack_descent3master_packet(server, rawpkt + 0x1a); + + server->n_servers = server->master_pkt_len / 6; + + server->next_player_info = - 1; + server->retry1 = 0; + + if (lastpacket) + { + return DONE_AUTO; + } + + return INPROGRESS; +} + +/* Packet from QuakeWorld master server + */ +int deal_with_qwmaster_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + int ret = 0; + + debug( 2, "deal_with_qwmaster_packet %p, %d", server, pktlen ); + + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + + if (rawpkt[0] == QW_NACK) + { + server->error = strdup(&rawpkt[2]); + server->server_name = SERVERERROR; + return PKT_ERROR; + } + + if (*((unsigned int*)rawpkt) == 0xffffffff) + { + rawpkt += 4; /* QW 1.5 */ + pktlen -= 4; + if (rawpkt[0] == '\377' && rawpkt[1] == QW_SERVERS) + { + rawpkt++; /* hwmaster */ + pktlen--; + } + } + + if (rawpkt[0] == QW_SERVERS && rawpkt[1] == QW_NEWLINE) + { + rawpkt += 2; + pktlen -= 2; + } + else if (rawpkt[0] == HL_SERVERS && rawpkt[1] == 0x0d) + { + // 2 byte id + 4 byte sequence + memcpy(server->master_query_tag, rawpkt + 2, 3); + rawpkt += 6; + pktlen -= 6; + } + else if (rawpkt[0] == HL_SERVERS && rawpkt[1] == 0x0a) + { + // no sequence id for steam + // instead we use the ip:port of the last recieved server + struct in_addr *sin_addr = (struct in_addr*)(rawpkt + pktlen - 6); + char *ip = inet_ntoa(*sin_addr); + unsigned short port = htons(*((unsigned short*)(rawpkt + pktlen - 2))); + + //fprintf( stderr, "NEXT IP=%s:%u\n", ip, port ); + sprintf(server->master_query_tag, "%s:%u", ip, port); + + // skip over the 2 byte id + rawpkt += 2; + pktlen -= 2; + } + else if (strncmp(rawpkt, "servers", 7) == 0) + { + rawpkt += 8; + pktlen -= 8; + } + else if (strncmp(rawpkt, "getserversResponse", 18) == 0) + { + rawpkt += 18; + pktlen -= 18; + + for (; *rawpkt != '\\' && pktlen; pktlen--, rawpkt++){} + + if (!pktlen) + { + return 1; + } + rawpkt++; + pktlen--; + + debug( 2, "q3m pktlen %d lastchar %x\n", pktlen, (unsigned int)rawpkt[pktlen - 1]); + + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len + pktlen + 1); + + if (server->type->id == STEF_MASTER) + { + ret = decode_stefmaster_packet(server, rawpkt, pktlen); + } + else + { + ret = decode_q3master_packet(server, rawpkt, pktlen); + } + debug( 2, "q3m %d servers\n", server->n_servers); + + return ret; + } + else if (show_errors) + { + unsigned int ipaddr = ntohl(server->ipaddr); + fprintf(stderr, "Odd packet from QW master %d.%d.%d.%d, processing ...\n", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff + ); + print_packet(server, rawpkt, pktlen); + } + + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len + pktlen + 1); + rawpkt[pktlen] = '\0'; + memcpy(server->master_pkt + server->master_pkt_len, rawpkt, pktlen + 1); + server->master_pkt_len += pktlen; + + server->n_servers = server->master_pkt_len / 6; + + if (server->type->flags &TF_MASTER_MULTI_RESPONSE) + { + server->next_player_info = - 1; + server->retry1 = 0; + } + else if (server->type->id == HL_MASTER) + { + if (server->master_query_tag[0] == 0 && server->master_query_tag[1] == 0 && server->master_query_tag[2] == 0) + { + // all done + server->server_name = MASTER; + bind_sockets(); + ret = DONE_FORCE; + } + else + { + // more to come + server->retry1++; + send_qwmaster_request_packet(server); + } + } + else if (server->type->flags &TF_MASTER_STEAM) + { + // should the HL_MASTER be the same as this? + int i; + for (i = pktlen - 6; i < pktlen && 0x00 == rawpkt[i]; i++){} + + if (i == pktlen) + { + // last 6 bytes where 0x00 so we have reached the last packet + server->n_servers--; + server->master_pkt_len -= 6; + server->server_name = MASTER; + bind_sockets(); + ret = DONE_FORCE; + } + else + { + // more to come + server->retry1++; + send_qwmaster_request_packet(server); } } -} + else + { + server->server_name = MASTER; + ret = DONE_AUTO; + bind_sockets(); + } -/* server starts sending data immediately, so we need not do anything */ -void -send_bfris_request_packet( struct qserver *server) -{ - register_send( server ); + return ret; } - -/* First packet for a normal Quake server - */ -void -send_qserver_request_packet( struct qserver *server) +int decode_q3master_packet(struct qserver *server, char *pkt, int pktlen) { + char *p; + char *end = pkt + pktlen; + char *last = end - 6; - int rc = send_packet( server, server->type->status_packet, server->type->status_len ); + pkt[pktlen] = 0; + p = pkt; - if ( rc == SOCKET_ERROR ) + while ( p < last ) { - cleanup_qserver( server, 1 ); - } -} - -/* First packet for a QuakeWorld server - */ -void -send_qwserver_request_packet( struct qserver *server) -{ - int rc; + // IP & Port + memcpy(server->master_pkt + server->master_pkt_len, &p[0], 6); + server->master_pkt_len += 6; + p += 6; + // Sometimes we get some bad IP's so we search for the entry terminator '\' to avoid issues with this + while ( p < end && *p != '\\' ) + { + p++; + } - if ( server->flags & FLAG_BROADCAST) - rc= send_broadcast( server, server->type->status_packet, - server->type->status_len); - else if ( server->server_name == NULL) - rc= send( server->fd, server->type->status_packet, - server->type->status_len, 0); - else if ( server->server_name != NULL && server->type->rule_packet) - rc= send( server->fd, server->type->rule_packet, - server->type->rule_len, 0); - else - rc= SOCKET_ERROR; - - if ( rc == SOCKET_ERROR) { - unsigned int ipaddr= ntohl(server->ipaddr); - fprintf( stderr, - "Error on %d.%d.%d.%d, skipping ...\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff); - perror( "send"); - cleanup_qserver( server, 1); - return; - } - if ( server->retry1 == n_retries || server->flags & FLAG_BROADCAST) { - gettimeofday( &server->packet_time1, NULL); - server->n_requests++; - } - else if ( server->server_name == NULL) - server->n_retries++; - server->retry1--; - if ( server->server_name == NULL) - server->n_packets++; - server->next_player_info = NO_PLAYER_INFO; // we don't have a player packet -} + if ( p < end ) + { + // Skip over the '\' + p++; + } -// First packet for an Unreal Tournament 2003 server -void -send_ut2003_request_packet( struct qserver *server) -{ - send_packet( server, server->type->status_packet, server->type->status_len ); - server->next_player_info = NO_PLAYER_INFO; -} + if ( *p && p + 3 == end && 0 == strncmp( "EOF", p, 3 ) ) + { + // Last packet ID ( seen in COD4 ) + server->n_servers = server->master_pkt_len / 6; + server->retry1 = 0; // received at least one packet so no need to retry + return DONE_FORCE; + } + } -// First packet for an Half-Life 2 server -void -send_hl2_request_packet( struct qserver *server) -{ - send_packet( server, server->type->status_packet, server->type->status_len ); -} + server->n_servers = server->master_pkt_len / 6; + // server->next_player_info= -1; evil, causes busy loop! + server->retry1 = 0; // received at least one packet so no need to retry -/* First packet for an Unreal master - */ -void -send_unrealmaster_request_packet( struct qserver *server) -{ - send_packet( server, server->type->status_packet, server->type->status_len ); + return INPROGRESS; } -static const char* steam_region[] = -{ - "US East Coast", - "US West Coast", - "South America", - "Europe", - "Asia", - "Australia", - "Middle East", - "Africa", - NULL -}; - -char * -build_hlmaster_packet( struct qserver *server, int *len) +int decode_stefmaster_packet(struct qserver *server, char *pkt, int pktlen) { - static char packet[1600]; - char *pkt, *r, *sep= ""; - char *gamedir, *map, *flags; - int flen; + unsigned char *p, *m, *end; + unsigned int i, b; - pkt= &packet[0]; - memcpy( pkt, server->type->master_packet, *len ); + pkt[pktlen] = 0; - if ( server->type->flags & TF_MASTER_STEAM ) + p = (unsigned char*)pkt; + m = (unsigned char*)server->master_pkt + server->master_pkt_len; + end = (unsigned char*) &pkt[pktlen - 12]; + while (*p && p < end) { - // default the region to 0xff - const char* regionstring = get_param_value( server, "region", NULL ); - int region = 0xFF; - if(regionstring) + for (i = 6; i; i--) { - char* tmp = NULL; - region = strtol( regionstring, &tmp, 10); - if(tmp == regionstring) - { - int i = 0; - region = 0xFF; - for(;steam_region[i]; ++i) - { - if(!strcmp(regionstring, steam_region[i])) - { - region = i; - break; - } - } - } + sscanf((char*)p, "%2x", &b); + p += 2; + *m++ = b; + } + server->master_pkt_len += 6; + while (*p && *p == '\\') + { + p++; } - *(pkt+1) = region; } + server->n_servers = server->master_pkt_len / 6; + server->next_player_info = - 1; + server->retry1 = 0; - pkt+= *len; + return 1; +} - gamedir = get_param_value( server, "game", NULL); - if ( gamedir ) - { - pkt+= sprintf( pkt, "\\gamedir\\%s", gamedir); - } +/* Packet from Tribes master server + */ +int deal_with_tribesmaster_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + unsigned char *upkt = (unsigned char*)rawpkt; + int packet_number = upkt[2]; + int n_packets = upkt[3]; + unsigned char *p; + char *mpkt; + int len; + unsigned int ipaddr; - // not valid for steam? - map = get_param_value( server, "map", NULL); - if ( map ) - { - pkt+= sprintf( pkt, "\\map\\%s", map); - } + debug( 2, "deal_with_tribesmaster_packet %p, %d", server, pktlen ); - // not valid for steam? - flags= get_param_value( server, "status", NULL); - r= flags; - while ( flags && sep ) - { - sep= strchr( r, ':'); - if ( sep ) - flen= sep-r; - else - flen= strlen( r); - - if ( strncmp( r, "notempty", flen) == 0) - pkt+= sprintf( pkt, "\\empty\\1"); - else if ( strncmp( r, "notfull", flen) == 0) - pkt+= sprintf( pkt, "\\full\\1"); - else if ( strncmp( r, "dedicated", flen) == 0) - { - if ( server->type->flags & TF_MASTER_STEAM ) - pkt+= sprintf( pkt, "\\type\\d"); - else - pkt+= sprintf( pkt, "\\dedicated\\1"); - } - else if ( strncmp( r, "linux", flen) == 0) - pkt+= sprintf( pkt, "\\linux\\1"); - else if ( strncmp( r, "proxy", flen) == 0) // steam - pkt+= sprintf( pkt, "\\proxy\\1"); - else if ( strncmp( r, "secure", flen) == 0) // steam - pkt+= sprintf( pkt, "\\secure\\1"); - r= sep+1; + if (memcmp(rawpkt, tribes_master_response, sizeof(tribes_master_response)) != 0) + { + fprintf(stderr, "Odd packet from Tribes master server\n"); + print_packet(server, rawpkt, pktlen); } - // always need null terminator - *pkt = 0x00; - pkt++; - - *len = pkt - packet; + /* 0x1006 + 01 packet number + 08 # packets + 02 + 0000 + 66 + 0d length of following string + "Tribes Master" + 3c length of following string + "Check out the Starsiege demo now! www.starsiegeplayers.com" + 0035 + 06 d143 4764 812c + 06 d1e2 8df3 616d + 06 1804 6d50 616d + 06 d81c 6dc0 616d + */ + /* 0x1006 + 02 + 08 + 02 0000 + 66 + 00 3f + 06 cf88 344c 1227 + */ - return packet; -} + /* printf( "packet_number %d n_packets %d\n", packet_number, n_packets); + */ -/* First packet for a QuakeWorld master server - */ -void -send_qwmaster_request_packet( struct qserver *server) -{ - int rc= 0; + len = upkt[8]; + if (len > 0) + { + p = (unsigned char*)rawpkt + 9; + // printf( "%.*s\n", len, p); + p += len; + len = upkt[8+len + 1]; + // printf( "%.*s\n", len, p+1); + p += len + 1; + p += 2; + } + else + { + p = (unsigned char*)rawpkt + 10; + } - server->next_player_info = NO_PLAYER_INFO; + if (server->master_pkt == NULL) + { + server->master_pkt = (char*)malloc(n_packets *64 * 6); + mpkt = server->master_pkt; + } + else + { + mpkt = server->master_pkt + server->n_servers *6; + } - if ( server->type->id == Q2_MASTER) + while ((char*)p < rawpkt + pktlen) { - struct sockaddr_in addr; - addr.sin_family= AF_INET; - if ( no_port_offset || server->flags & TF_NO_PORT_OFFSET) + if (*p != 0x6) { - addr.sin_port= htons(server->port); + printf("*p %u\n", (unsigned) *p); + } + memcpy(mpkt, p + 1, sizeof(ipaddr)); + if (0) + { + mpkt[4] = p[5]; + mpkt[5] = p[6]; } else { - addr.sin_port= htons((unsigned short)( server->port + server->type->port_offset )); + mpkt[5] = p[5]; + mpkt[4] = p[6]; } - addr.sin_addr.s_addr= server->ipaddr; - memset( &(addr.sin_zero), 0, sizeof(addr.sin_zero)); - rc= sendto( server->fd, server->type->master_packet, - server->type->master_len, 0, - (struct sockaddr *) &addr, sizeof(addr)); + //printf( "%08x:%hu %u.%u.%u.%u:%hu\n", ipaddr, port, ipaddr>>24, (ipaddr>>16)&0xff, (ipaddr>>8)&0xff, ipaddr&0xff, port); + p += 7; + mpkt += 6; + } + /* + if ( (char*)p != rawpkt+pktlen) + printf( "%x %x\n", p, rawpkt+pktlen); + */ + server->master_pkt_len = mpkt - server->master_pkt; + server->n_servers = server->master_pkt_len / 6; + server->server_name = MASTER; + server->next_player_info = - 1; + + if (packet_number >= n_packets) + { + return DONE_FORCE; } else { - char *packet; - int packet_len; - char query_buf[4096] = {0}; - - packet= server->type->master_packet; - packet_len= server->type->master_len; + return DONE_AUTO; + } +} - if ( server->type->id == HL_MASTER) +char *display_tribes2_string_list(unsigned char *pkt) +{ + char *delim = ""; + unsigned int count, len; + count = *pkt; + pkt++; + for (; count; count--) + { + len = *pkt; + pkt++; + if (len > 0) { - memcpy( server->type->master_packet+1, server->master_query_tag, 3); - if ( server->query_arg) + if (raw_display) { - packet_len = server->type->master_len; - packet= build_hlmaster_packet( server, &packet_len); + fprintf(OF, "%s%.*s", delim, (int)len, pkt); + delim = raw_delimiter; } - } - else if ( server->type->flags & TF_MASTER_STEAM) - { - // region - int tag_len = strlen( server->master_query_tag ); - if ( tag_len < 9 ) + else { - // initial case - tag_len = 9; - strcpy( server->master_query_tag, "0.0.0.0:0" ); + fprintf(OF, "%.*s\n", (int)len, pkt); } + } + pkt += len; + } + if (raw_display) + { + fputs("\n", OF); + } + return (char*)pkt; +} - // 1 byte packet id - // 1 byte region - // ip:port - // 1 byte null - packet_len = 2 + tag_len + 1; +int deal_with_tribes2master_packet(struct qserver *server, char *pkt, int pktlen) +{ + unsigned int n_servers, index, total, server_limit; + char *p, *mpkt; - if ( server->query_arg ) - { - // build_hlmaster_packet uses server->type->master_packet - // as the basis so copy from server->master_query_tag - strcpy( server->type->master_packet+2, server->master_query_tag ); - packet = build_hlmaster_packet( server, &packet_len ); - } - else - { - // default region - *(packet + 1) = 0xff; - memcpy( packet+2, server->master_query_tag, tag_len ); + debug( 2, "deal_with_tribes2master_packet %p, %d", server, pktlen ); - // filter null - *(packet + packet_len ) = 0x00; - packet_len++; - } + if (pkt[0] == TRIBES2_RESPONSE_GAME_TYPES) + { + pkt += 6; + if (raw_display) + { + fprintf(OF, "%s%s%s%s", server->type->type_prefix, raw_delimiter, server->arg, raw_delimiter); } - else if ( server->type->flags & TF_QUERY_ARG) + else { - // fill in the master protocol details - char *master_protocol= server->query_arg; - if ( master_protocol == NULL) - { - master_protocol= server->type->master_protocol; - } - packet_len = sprintf( query_buf, server->type->master_packet, - master_protocol?master_protocol:"", - server->type->master_query?server->type->master_query:""); - packet = query_buf; + fprintf(OF, "Game Types\n"); + fprintf(OF, "----------\n"); + } + pkt = display_tribes2_string_list((unsigned char*)pkt); + if (raw_display) + { + fprintf(OF, "%s%s%s%s", server->type->type_prefix, raw_delimiter, server->arg, raw_delimiter); + } + else + { + fprintf(OF, "\nMission Types\n"); + fprintf(OF, "-------------\n"); } + display_tribes2_string_list((unsigned char*)pkt); - rc= send( server->fd, packet, packet_len, 0); + server->master_pkt_len = 0; + server->n_servers = 0; + server->server_name = MASTER; + server->next_player_info = - 1; + return DONE_FORCE; } - if ( rc == SOCKET_ERROR) + if (pkt[0] != TRIBES2_RESPONSE_MASTER) { - perror( "send"); + /* error */ + return PKT_ERROR; } - if ( server->retry1 == n_retries) + server_limit = get_param_ui_value(server, "limit", ~0); + + n_servers = little_endian ? *(unsigned short*)(pkt + 8): swap_short(pkt + 8); + index = *(unsigned char*)(pkt + 6); + total = *(unsigned char*)(pkt + 7); + if (server->master_pkt == NULL) { - gettimeofday( &server->packet_time1, NULL); - server->n_requests++; + server->master_pkt = (char*)malloc(total *n_servers * 6); + mpkt = server->master_pkt; } else { - server->n_retries++; + mpkt = server->master_pkt + server->n_servers *6; } - server->retry1--; - server->n_packets++; -} -void -send_tribes_request_packet( struct qserver *server ) -{ - send_packet( server, server->type->player_packet, server->type->player_len ); + p = pkt + 10; + for (; n_servers && ((char*)mpkt - server->master_pkt) / 6 < server_limit; n_servers--, p += 6, mpkt += 6) + { + memcpy(mpkt, p, 4); + mpkt[4] = p[5]; + mpkt[5] = p[4]; + } + server->master_pkt_len = (char*)mpkt - server->master_pkt; + server->n_servers = server->master_pkt_len / 6; + server->server_name = MASTER; + server->next_player_info = - 1; + + if (index >= total - 1 || server->n_servers >= server_limit) + { + return PKT_ERROR; + } + + return DONE_AUTO; } -void -send_tribes2_request_packet( struct qserver *server ) +int server_info_packet(struct qserver *server, struct q_packet *pkt, int datalen) { - int rc; + int off = 0; - if ( server->flags & FLAG_BROADCAST && server->server_name == NULL) - rc= send_broadcast( server, server->type->status_packet, - server->type->status_len); - else if ( server->server_name == NULL) - rc= send( server->fd, server->type->status_packet, - server->type->status_len, 0); - else - rc= send( server->fd, server->type->player_packet, - server->type->player_len, 0); + /* ignore duplicate packets */ + if (server->server_name != NULL) + { + return 0; + } - if ( rc == SOCKET_ERROR) - perror( "send"); + server->address = strdup((char*) &pkt->data[off]); + off += strlen(server->address) + 1; + if (off >= datalen) + { + return -1; + } - register_send( server ); -} + server->server_name = strdup((char*) &pkt->data[off]); + off += strlen(server->server_name) + 1; + if (off >= datalen) + { + return -1; + } -void -send_ghostrecon_request_packet( struct qserver *server) -{ - send_packet( server, server->type->status_packet, server->type->status_len ); -} + server->map_name = strdup((char*) &pkt->data[off]); + off += strlen(server->map_name) + 1; + if (off > datalen) + { + return -1; + } -void -send_eye_request_packet( struct qserver *server) -{ - send_packet( server, server->type->status_packet, server->type->status_len ); + server->num_players = pkt->data[off++]; + server->max_players = pkt->data[off++]; + server->protocol_version = pkt->data[off++]; + + server->retry1 = n_retries; + + if (get_server_rules) + { + send_rule_request_packet(server); + } + if (get_player_info) + { + send_player_request_packet(server); + } + + return 0; } -void -send_ravenshield_request_packet( struct qserver *server) +int player_info_packet(struct qserver *server, struct q_packet *pkt, int datalen) { - send_packet( server, server->type->status_packet, server->type->status_len ); + char *name, *address; + int off, colors, frags, connect_time, player_number; + struct player *player, *last; + + off = 0; + player_number = pkt->data[off++]; + name = (char*) &pkt->data[off]; + off += strlen(name) + 1; + if (off >= datalen) + { + return -1; + } + + colors = pkt->data[off + 3]; + colors = (colors << 8) + pkt->data[off + 2]; + colors = (colors << 8) + pkt->data[off + 1]; + colors = (colors << 8) + pkt->data[off]; + off += sizeof(colors); + + frags = pkt->data[off + 3]; + frags = (frags << 8) + pkt->data[off + 2]; + frags = (frags << 8) + pkt->data[off + 1]; + frags = (frags << 8) + pkt->data[off]; + off += sizeof(frags); + + connect_time = pkt->data[off + 3]; + connect_time = (connect_time << 8) + pkt->data[off + 2]; + connect_time = (connect_time << 8) + pkt->data[off + 1]; + connect_time = (connect_time << 8) + pkt->data[off]; + off += sizeof(connect_time); + + address = (char*) &pkt->data[off]; + off += strlen(address) + 1; + if (off > datalen) + { + return -1; + } + + last = server->players; + while (last != NULL && last->next != NULL) + { + if (last->number == player_number) + { + return 0; + } + last = last->next; + } + + if (last != NULL && last->number == player_number) + { + return 0; + } + + player = (struct player*)calloc(1, sizeof(struct player)); + player->number = player_number; + player->name = strdup(name); + player->address = strdup(address); + player->connect_time = connect_time; + player->frags = frags; + player->shirt_color = colors >> 4; + player->pants_color = colors &0xf; + player->next = NULL; + + if (last == NULL) + { + server->players = player; + } + else + { + last->next = player; + } + + server->next_player_info++; + server->retry2 = n_retries; + if (server->next_player_info < server->num_players) + { + send_player_request_packet(server); + } + + return 0; } -void -send_savage_request_packet( struct qserver *server) +int rule_info_packet(struct qserver *server, struct q_packet *pkt, int datalen) { - int len; - char* pkt; + int off = 0; + struct rule *rule, *last; + char *name, *value; - if ( get_player_info ) + /* Straggler packet after we've already given up fetching rules */ + if (server->next_rule == NULL) { - pkt = server->type->player_packet; - len = server->type->player_len; + return 0; } - else + + if (ntohs(pkt->length) == Q_HEADER_LEN) + { + server->next_rule = NULL; + return 0; + } + + name = (char*) &pkt->data[off]; + off += strlen(name) + 1; + if (off >= datalen) + { + return -1; + } + + value = (char*) &pkt->data[off]; + off += strlen(value) + 1; + if (off > datalen) + { + return -1; + } + + last = server->rules; + while (last != NULL && last->next != NULL) + { + if (strcmp(last->name, name) == 0) + { + return 0; + } + last = last->next; + } + if (last != NULL && strcmp(last->name, name) == 0) { - pkt = server->type->status_packet; - len = server->type->status_len; + return 0; } - send_packet( server, pkt, len ); -} - -void -send_farcry_request_packet( struct qserver *server) -{ - int len; - char* pkt; + rule = (struct rule*)malloc(sizeof(struct rule)); + rule->name = strdup(name); + rule->value = strdup(value); + rule->next = NULL; - if ( get_player_info ) + if (last == NULL) { - pkt = server->type->player_packet; - len = server->type->player_len; + server->rules = rule; } else { - pkt = server->type->status_packet; - len = server->type->status_len; + last->next = rule; } - send_packet( server, pkt, len ); -} - -void -send_tribes2master_request_packet( struct qserver *server) -{ - int rc; - unsigned char packet[1600], *pkt; - unsigned int len, min_players, max_players, region_mask=0; - unsigned int build_version, max_bots, min_cpu, status; - char *game, *mission, *buddies; - static char *region_list[]= { "naeast", "nawest", "sa", "aus", "asia", "eur", NULL }; - static char *status_list[]= { "dedicated", "nopassword", "linux" }; - - if ( strcmp( get_param_value( server, "query", ""), "types") == 0) { - rc= send( server->fd, tribes2_game_types_request, - sizeof(tribes2_game_types_request), 0); - goto send_done; - } - - memcpy( packet, server->type->master_packet, server->type->master_len); - - pkt= packet + 7; - - game= get_param_value( server, "game", "any"); - len= strlen(game); - if ( len > 255) len= 255; - *pkt++= len; - memcpy( pkt, game, len); - pkt+= len; - - mission= get_param_value( server, "mission", "any"); - len= strlen(mission); - if ( len > 255) len= 255; - *pkt++= len; - memcpy( pkt, mission, len); - pkt+= len; - - min_players= get_param_ui_value( server, "minplayers", 0); - max_players= get_param_ui_value( server, "maxplayers", 255); - *pkt++= min_players; - *pkt++= max_players; - - region_mask= get_param_ui_value( server, "regions", 0xffffffff); - if ( region_mask == 0) { - char *regions= get_param_value( server, "regions", ""); - char *r= regions; - char **list, *sep; - do { - sep= strchr( r, ':'); - if ( sep) - len= sep-r; - else - len= strlen( r); - for ( list= region_list; *list; list++) - if ( strncasecmp( r, *list, len) == 0) - break; - if ( *list) - region_mask|= 1<<(list-region_list); - r= sep+1; - } while ( sep); - } - if ( little_endian) - memcpy( pkt, ®ion_mask, 4); - else { - pkt[0]= region_mask&0xff; - pkt[1]= (region_mask>>8)&0xff; - pkt[2]= (region_mask>>16)&0xff; - pkt[3]= (region_mask>>24)&0xff; - } - pkt+= 4; - - build_version= get_param_ui_value( server, "build", 0); -/* - if ( build_version && build_version < 22337) { - packet[1]= 0; - build_version= 0; - } -*/ - if ( little_endian) - memcpy( pkt, &build_version, 4); - else { - pkt[0]= build_version&0xff; - pkt[1]= (build_version>>8)&0xff; - pkt[2]= (build_version>>16)&0xff; - pkt[3]= (build_version>>24)&0xff; - } - pkt+= 4; - - status= get_param_ui_value( server, "status", -1); - if ( status == 0) { - char *flags= get_param_value( server, "status", ""); - char *r= flags; - char **list, *sep; - do { - sep= strchr( r, ':'); - if ( sep) - len= sep-r; - else - len= strlen( r); - for ( list= status_list; *list; list++) - if ( strncasecmp( r, *list, len) == 0) - break; - if ( *list) - status|= 1<<(list-status_list); - r= sep+1; - } while ( sep); - } - else if ( status == -1) - status= 0; - *pkt++= status; - - max_bots= get_param_ui_value( server, "maxbots", 255); - *pkt++= max_bots; - - min_cpu= get_param_ui_value( server, "mincpu", 0); - if ( little_endian) - memcpy( pkt, &min_cpu, 2); - else { - pkt[0]= min_cpu&0xff; - pkt[1]= (min_cpu>>8)&0xff; - } - pkt+= 2; - - buddies= get_param_value( server, "buddies", NULL); - if ( buddies) { - char *b= buddies, *sep; - unsigned int buddy, n_buddies= 0; - unsigned char *n_loc= pkt++; - do { - sep= strchr( b, ':'); - if ( sscanf( b, "%u", &buddy)) { - n_buddies++; - if ( little_endian) - memcpy( pkt, &buddy, 4); - else { - pkt[0]= buddy&0xff; - pkt[1]= (buddy>>8)&0xff; - pkt[2]= (buddy>>16)&0xff; - pkt[3]= (buddy>>24)&0xff; - } - pkt+= 4; - } - b= sep+1; - } while ( sep && n_buddies < 255); - *n_loc= n_buddies; - } - else - *pkt++= 0; - - rc= send( server->fd, (char*)packet, pkt-packet, 0); - -send_done: - if ( rc == SOCKET_ERROR) - perror( "send"); - if ( server->retry1 == n_retries) { - gettimeofday( &server->packet_time1, NULL); - server->n_requests++; - } - else - server->n_retries++; - server->retry1--; - server->n_packets++; -} - -static struct _gamespy_query_map { - char *qstat_type; - char *gamespy_type; -} gamespy_query_map[] = { - { "qws", "quakeworld" }, - { "q2s", "quake2" }, - { "q3s", "quake3" }, - { "tbs", "tribes" }, - { "uns", "ut" }, - { "sgs", "shogo" }, - { "hls", "halflife" }, - { "kps", "kingpin" }, - { "hrs", "heretic2" }, - { "sfs", "sofretail" }, - { NULL, NULL } -}; - -void -send_gamespy_master_request( struct qserver *server) -{ - int rc, i; - char request[1024]; - - if ( server->n_packets) - return; - - rc= send( server->fd, server->type->master_packet, - server->type->master_len, 0); - if ( rc != server->type->master_len) - perror( "send"); - - strcpy( request, server->type->status_packet); - - for ( i= 0; gamespy_query_map[i].qstat_type; i++) - if ( strcasecmp( server->query_arg, gamespy_query_map[i].qstat_type) == 0) - break; - if ( gamespy_query_map[i].gamespy_type == NULL) - strcat( request, server->query_arg); - else - strcat( request, gamespy_query_map[i].gamespy_type); - strcat(request, "\\final\\"); - assert(strlen(request) < sizeof(request)); - - rc= send( server->fd, request, strlen( request), 0); - if ( rc != strlen( request)) - perror( "send"); - - if ( server->retry1 == n_retries) { - gettimeofday( &server->packet_time1, NULL); - server->n_requests++; - } - server->n_packets++; -} - -void -send_rule_request_packet( struct qserver *server) -{ - int rc, len; - - debug(3, "%p", server); - - /* Server created via broadcast, so bind it */ - if ( server->fd == -1) { - if ( bind_qserver( server) < 0) - goto setup_retry; - } - - if(server->type->rule_query_func && server->type->rule_query_func != send_rule_request_packet) - { - server->type->rule_query_func(server); - return; - } - - if ( server->type->id == Q_SERVER) { - strcpy( (char*)q_rule.data, server->next_rule); - len= Q_HEADER_LEN + strlen((char*)q_rule.data) + 1; - q_rule.length= htons( (short)len); - } - else - len= server->type->rule_len; - - rc= send( server->fd, (const char *) server->type->rule_packet, len, 0); - if ( rc == SOCKET_ERROR) - perror( "send"); + server->n_rules++; + server->next_rule = rule->name; + server->retry1 = n_retries; + send_rule_request_packet(server); -setup_retry: - if ( server->retry1 == n_retries) { - gettimeofday( &server->packet_time1, NULL); - server->n_requests++; - } - else if ( server->server_name == NULL) - server->n_retries++; - server->retry1--; - if ( server->server_name == NULL) - server->n_packets++; + return 0; } -void -send_player_request_packet( struct qserver *server) +struct info *player_add_info(struct player *player, char *key, char *value, int flags) { - int rc; - - if(!server->type->player_packet) - return; - - /* Server created via broadcast, so bind it */ - if ( server->fd == -1) { - if ( bind_qserver( server) < 0) - goto setup_retry; - } - - if(server->type->player_query_func && server->type->player_query_func != send_player_request_packet) - { - server->type->player_query_func(server); - return; - } - - if(!server->type->player_packet) - { - debug(0, "error: server %p has no player_packet", server); - return; - } - - if ( server->type->id == Q_SERVER) - q_player.data[0]= server->next_player_info; - rc= send( server->fd, (const char *) server->type->player_packet, - server->type->player_len, 0); - if ( rc == SOCKET_ERROR) - perror( "send"); - -setup_retry: - if ( server->retry2 == n_retries) { - gettimeofday( &server->packet_time2, NULL); - server->n_requests++; - } - else - server->n_retries++; - server->retry2--; - server->n_packets++; -} + struct info *info; + if ( flags & OVERWITE_DUPLICATES ) + { + for (info = player->info; info; info = info->next) + { + if (0 == strcmp(info->name, key)) + { + // We should be able to free this + free(info->value); + if ( flags & NO_VALUE_COPY ) + { + info->value = value; + } + else + { + info->value = strdup(value); + } -void qserver_disconnect(struct qserver* server) -{ -#ifdef _WIN32 - int i; -#endif - if ( server->fd != -1) { - close( server->fd); -#ifndef _WIN32 - connmap[server->fd]= NULL; -#else - for ( i= 0; i < max_connmap; i++) { - if ( connmap[i] == server) { - connmap[i]= NULL; - break; - } + return info; + } + } } -#endif - server->fd= -1; - connected--; - } -} -/* Functions for figuring timeouts and when to give up - * Returns 1 if the query is done (server may be freed) and 0 if not. - */ -int -cleanup_qserver( struct qserver *server, int force ) -{ - int close_it = force; - if ( server->server_name == NULL) + if ( flags & CHECK_DUPLICATE_RULES ) { - close_it = 1; - if ( server->type->id & MASTER_SERVER && server->master_pkt != NULL) + for (info = player->info; info; info = info->next) { - server->server_name = MASTER; + if (0 == strcmp(info->name, key)) + { + return NULL; + } } - else + } + + if ( flags & COMBINE_VALUES ) + { + for (info = player->info; info; info = info->next) { - server->server_name = TIMEOUT; - num_servers_timed_out++; + if (0 == strcmp(info->name, key)) + { + char *full_value = (char*)calloc(sizeof(char), strlen(info->value) + strlen(value) + 2); + if (NULL == full_value) + { + fprintf(stderr, "Failed to malloc combined value\n"); + exit(1); + } + sprintf(full_value, "%s%s%s", info->value, multi_delimiter, value); + + // We should be able to free this + free(info->value); + info->value = full_value; + + + return info; + } } } - else if ( server->type->flags & TF_SINGLE_QUERY ) + + info = (struct info*)malloc(sizeof(struct info)); + if ( flags & NO_KEY_COPY ) { - close_it = 1; + info->name = key; } - else if ( - server->next_rule == NO_SERVER_RULES && - server->next_player_info >= server->num_players - ) + else { - close_it = 1; + info->name = strdup(key); + } + if ( flags & NO_VALUE_COPY ) + { + info->value = value; } + else + { + info->value = strdup(value); + } + info->next = NULL; + + if (NULL == player->info) + { + player->info = info; + } + else + { + *player->last_info = info; + } + player->last_info = &info->next; + player->n_info++; - debug( 3, "close_it %d", close_it ); - if ( close_it ) + return info; +} + +struct rule *add_rule(struct qserver *server, char *key, char *value, int flags) +{ + struct rule *rule; + if ( flags & OVERWITE_DUPLICATES ) { - if ( server->saved_data.data) + for (rule = server->rules; rule; rule = rule->next) { - SavedData *sdata= server->saved_data.next; - free(server->saved_data.data); - server->saved_data.data= NULL; - while ( sdata != NULL) + if ( 0 == strcmp( rule->name, key) ) { - SavedData *next; - free(sdata->data); - next= sdata->next; - free(sdata); - sdata= next; + // We should be able to free this + free(rule->value); + if ( flags & NO_VALUE_COPY ) + { + rule->value = value; + } + else + { + rule->value = strdup(value); + } + + return rule; } - server->saved_data.next= NULL; } + } - qserver_disconnect(server); - - if ( server->server_name != TIMEOUT) + if ( flags & CHECK_DUPLICATE_RULES ) + { + for (rule = server->rules; rule; rule = rule->next) { - num_servers_returned++; - if ( server->server_name != DOWN) + if (0 == strcmp(rule->name, key)) { - num_players_total+= server->num_players; - max_players_total+= server->max_players; + return NULL; } } - if ( server->server_name == TIMEOUT || server->server_name == DOWN) - { - server->ping_total= 999999; - } - if ( server->type->master) + } + + if ( flags & COMBINE_VALUES ) + { + for (rule = server->rules; rule; rule = rule->next) { - waiting_for_masters--; - if ( waiting_for_masters == 0) + if (0 == strcmp(rule->name, key)) { - add_servers_from_masters(); + char *full_value = (char*)calloc(sizeof(char), strlen(rule->value) + strlen(value) + strlen(multi_delimiter) + 1); + if (NULL == full_value) + { + fprintf(stderr, "Failed to malloc combined value\n"); + exit(1); + } + sprintf(full_value, "%s%s%s", rule->value, multi_delimiter, value); + + // We should be able to free this + free(rule->value); + rule->value = full_value; + + return rule; } } - if ( ! server_sort) - { - display_server( server); - } - return 1; } - return 0; -} - -/** must be called only on connected servers - * @returns time in ms until server needs timeout handling. timeout handling is needed if <= zero - */ -static int qserver_get_timeout(struct qserver* server, struct timeval* now) -{ - int diff, diff1, diff2, interval; - if ( server->type->id & MASTER_SERVER) - interval= master_retry_interval; + rule = (struct rule*)malloc(sizeof(struct rule)); + if ( flags & NO_KEY_COPY ) + { + rule->name = key; + } else - interval= retry_interval; - - diff2= 0xffff; - - diff1= interval*(n_retries-server->retry1+1) - - time_delta( now, &server->packet_time1); - - if (server->next_player_info < server->num_players) { - diff2= interval*(n_retries-server->retry2+1) - - time_delta( now, &server->packet_time2); + rule->name = strdup(key); } - debug(2, "timeout for %p is diff1 %d diff2 %d", server, diff1, diff2); - - - diff= (diff1<diff2)?diff1:diff2; + if ( flags &NO_VALUE_COPY ) + { + rule->value = value; + } + else + { + rule->value = strdup(value); + } + rule->next = NULL; + *server->last_rule = rule; + server->last_rule = &rule->next; + server->n_rules++; - return diff; + return rule; } -void -get_next_timeout( struct timeval *timeout) +void add_nrule(struct qserver *server, char *key, char *value, int len) { - struct qserver *server= servers; - struct timeval now; - int diff, smallest= retry_interval+master_retry_interval; - int bind_count= 0; - - if ( first_server_bind == NULL) - first_server_bind= servers; - - server= first_server_bind; - - for ( ; server != NULL && server->fd == -1; server= server->next) - ; - - /* if there are unconnected servers and slots left we retry in 10ms */ - if ( server == NULL || (num_servers > connected && connected < max_simultaneous)) { - timeout->tv_sec= 0; - timeout->tv_usec= 10 * 1000; - return; - } - first_server_bind= server; - - gettimeofday( &now, NULL); - for ( ; server != NULL && bind_count < connected; server= server->next) { - if ( server->fd == -1) - continue; - - diff = qserver_get_timeout(server, &now); - if ( diff < smallest) - smallest= diff; - bind_count++; - } - - if ( smallest < 10) - smallest= 10; + struct rule *rule; + for (rule = server->rules; rule; rule = rule->next) + if (strcmp(rule->name, key) == 0) + { + return ; + } - timeout->tv_sec= smallest / 1000; - timeout->tv_usec= (smallest % 1000) * 1000; + rule = (struct rule*)malloc(sizeof(struct rule)); + rule->name = strdup(key); + rule->value = strndup(value, len); + rule->next = NULL; + *server->last_rule = rule; + server->last_rule = &rule->next; + server->n_rules++; } - -#ifdef USE_SELECT -static fd_set select_read_fds; -static int select_maxfd; -static int select_cursor; - -int -set_fds( fd_set *fds) +struct player *add_player(struct qserver *server, int player_number) { - int maxfd= -1, i; + struct player *player; - for ( i= 0; i < max_connmap; i++) + for (player = server->players; player; player = player->next) { - if ( connmap[i] != NULL) + if (player->number == player_number) { - FD_SET( connmap[i]->fd, fds); - if ( connmap[i]->fd > maxfd) - { - maxfd= connmap[i]->fd; - } + return NULL; } } - return maxfd; -} - -void -set_file_descriptors() -{ - FD_ZERO( &select_read_fds); - select_maxfd= set_fds( &select_read_fds); + player = (struct player*)calloc(1, sizeof(struct player)); + player->number = player_number; + player->next = server->players; + player->n_info = 0; + player->score = NA_INT; + player->deaths = NA_INT; + player->frags = NA_INT; + player->last_info = NULL; + server->players = player; + server->n_player_info++; + return player; } -int -wait_for_file_descriptors( struct timeval *timeout) +STATIC struct player *get_player_by_number(struct qserver *server, int player_number) { - select_cursor= 0; - return select( select_maxfd+1, &select_read_fds, NULL, NULL, timeout); + struct player *player; + for (player = server->players; player; player = player->next) + if (player->number == player_number) + { + return player; + } return NULL; } -struct qserver * -get_next_ready_server() +// Updates a servers port information. +// Sets the rules: +// _queryport <queryport> +// hostport <port> +void change_server_port(struct qserver *server, unsigned short port, int force) { - while ( select_cursor < max_connmap && - ( connmap[select_cursor] == NULL || - ! FD_ISSET( connmap[select_cursor]->fd, &select_read_fds)) ) + if (port > 0 && port != server->port) { - select_cursor++; - } - if ( select_cursor >= max_connmap) - return NULL; - return connmap[select_cursor++]; -} + // valid port and changing + char arg[64]; + unsigned int ipaddr = ntohl(server->ipaddr); -int -wait_for_timeout( unsigned int ms) -{ - struct timeval timeout; - timeout.tv_sec= ms/1000; - timeout.tv_usec= (ms%1000) * 1000; - return select( 0, 0, NULL, NULL, &timeout); -} + // Update the servers hostname as required + sprintf(arg, "%d.%d.%d.%d:%hu", ipaddr >> 24, (ipaddr >> 16) &0xff, (ipaddr >> 8) &0xff, ipaddr &0xff, port); -#endif /* USE_SELECT */ + if (show_game_port || force || server->flags &TF_SHOW_GAME_PORT) + { + // Update the server arg + free(server->arg); + server->arg = strdup(arg); -#ifdef USE_POLL -static struct pollfd *pollfds; -static int n_pollfds; -static int max_pollfds= 0; -static int poll_cursor; + // Add a rule noting the previous query port + sprintf(arg, "%hu", server->port); + add_rule(server, "_queryport", arg, NO_FLAGS); -void -set_file_descriptors() -{ - struct pollfd *p; - int i; + // Update the servers port + server->port = port; + } - if ( max_connmap > max_pollfds) { - max_pollfds= max_connmap; - pollfds= (struct pollfd *) realloc( pollfds, max_pollfds * - sizeof(struct pollfd)); - } + if ( 0 != strcmp(server->arg, server->host_name) ) + { + // hostname isnt the query arg + char *colon = strchr(server->host_name, ':'); + // dns hostname or hostname:port + char *hostname = malloc( strlen(server->host_name) + 7 ); + if ( NULL == hostname ) + { + fprintf(stderr, "Failed to malloc hostname memory\n"); + } + else + { + if (colon) + { + *colon = '\0'; + } + sprintf(hostname, "%s:%hu", server->host_name, port); + free(server->host_name); + server->host_name = hostname; + } + } - p= pollfds; - for ( i= 0; i < max_connmap; i++) - if ( connmap[i] != NULL) { - p->fd= connmap[i]->fd; - p->events= POLLIN; - p->revents= 0; - p++; + // Add a rule noting the servers hostport + sprintf(arg, "%hu", port); + add_rule(server, "hostport", arg, OVERWITE_DUPLICATES); } - n_pollfds= p - pollfds; } -int -wait_for_file_descriptors( struct timeval *timeout) +STATIC void players_set_teamname(struct qserver *server, int teamid, char *teamname) { - poll_cursor= 0; - return poll( pollfds, n_pollfds, timeout->tv_sec*1000 + timeout->tv_usec/1000); + struct player *player; + for (player = server->players; player; player = player->next) + { + if (player->team == teamid) + { + player->team_name = strdup(teamname); + } + } } -struct qserver * -get_next_ready_server() +STATIC char *dup_nstring(const char *pkt, const char *end, char **next) { - for ( ; poll_cursor < n_pollfds; poll_cursor++) + char *pt = (char*)pkt; + int len = ((unsigned char*)pkt)[0]; + pt++; + if (*pt == '\1') { - if ( pollfds[ poll_cursor].revents) - break; + len++; } - if ( poll_cursor >= n_pollfds) + if (pt + len > end) + { return NULL; - return connmap[pollfds[poll_cursor++].fd]; + } + + *next = pt + len; + return strndup(pt, len); } -int -wait_for_timeout( unsigned int ms) +STATIC char *dup_n1string(char *pkt, char *end, char **next) { - return poll( 0, 0, ms); -} + unsigned len; -#endif /* USE_POLL */ + if (!pkt || pkt >= end) + { + return NULL; + } + + len = (unsigned char)pkt[0] - 1; + pkt++; + if (pkt + len > end) + { + return NULL; + } + *next = pkt + len; + return strndup(pkt, len); +} -void -free_server( struct qserver *server) +STATIC int pariah_basic_packet(struct qserver *server, char *rawpkt, char *end) { - struct player *player, *next_player; - struct rule *rule, *next_rule; - - /* remove from servers list */ - if ( server == servers) { - servers= server->next; - if ( servers) - servers->prev= NULL; - } - if ( (void*) &server->next == (void*) last_server) { - if ( server->prev) - last_server= & server->prev->next; - else - last_server= & servers; - } - if ( server == first_server_bind) - first_server_bind= server->next; - if ( server == last_server_bind) - last_server_bind= server->next; - - if ( server->prev) - server->prev->next= server->next; - if ( server->next) - server->next->prev= server->prev; - - /* remove from server hash table */ - remove_server_from_hash( server); - - /* free all the data */ - for ( player= server->players; player; player= next_player) { - next_player= player->next; - free_player( player); - } - - for ( rule= server->rules; rule; rule= next_rule) { - next_rule= rule->next; - free_rule( rule); - } - - if ( server->arg) free( server->arg); - if ( server->host_name) free( server->host_name); - if ( server->error) free( server->error); - if ( server->address) free( server->address); - if ( server->map_name) free( server->map_name); - if ( !(server->flags&FLAG_DO_NOT_FREE_GAME) && server->game) - free(server->game); - if ( server->master_pkt) free( server->master_pkt); - - free(server->query_arg); - - /* These fields are never malloc'd: outfilename - */ - - if ( server->server_name != NULL && - server->server_name != DOWN && - server->server_name != HOSTNOTFOUND && - server->server_name != SYSERROR && - server->server_name != MASTER && - server->server_name != SERVERERROR && - server->server_name != TIMEOUT && - server->server_name != GAMESPY_MASTER_NAME && - server->server_name != BFRIS_SERVER_NAME) { - free( server->server_name); - } + char *next; + char *string; + change_server_port(server, swap_short_from_little(&rawpkt[14]), 0); + if (NULL == (string = ut2003_strdup(&rawpkt[18], end, &next))) + { + return -1; + } -/* -params ... -saved_data ... -*/ - - free( server); - --num_servers; -} - -void -free_player( struct player *player) -{ - if ( player->name) free( player->name); - if ( ! (player->flags&PLAYER_FLAG_DO_NOT_FREE_TEAM) && player->team_name) - free( player->team_name); - if ( player->address) free( player->address); - if ( player->tribe_tag) free( player->tribe_tag); - if ( player->skin) free( player->skin); - if ( player->mesh) free( player->mesh); - if ( player->face) free( player->face); - free( player); -} - -void -free_rule( struct rule *rule) -{ - if ( rule->name) free( rule->name); - if ( rule->value) free( rule->value); - free( rule); -} + if (server->server_name == NULL) + { + server->server_name = string; + } + else + { + free(string); + } -/* Functions for handling response packets - */ + if (NULL == (string = ut2003_strdup(next, end, &next))) + { + return -1; + } -/* Packet from normal Quake server - */ -void -deal_with_q_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - struct q_packet *pkt= (struct q_packet *)rawpkt; - int rc; + if (server->map_name == NULL) + { + server->map_name = string; + } + else + { + free(string); + } - if ( ntohs( pkt->length) != pktlen) { - fprintf( stderr, "%s Ignoring bogus packet; length %d != %d\n", - server->arg, ntohs( pkt->length), pktlen); - cleanup_qserver(server,FORCE); - return; - } - - rawpkt[pktlen]= '\0'; - - switch ( pkt->op_code) { - case Q_CCREP_ACCEPT: - case Q_CCREP_REJECT: - return; - case Q_CCREP_SERVER_INFO: - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); - rc= server_info_packet( server, pkt, pktlen-Q_HEADER_LEN); - break; - case Q_CCREP_PLAYER_INFO: - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time2); - rc= player_info_packet( server, pkt, pktlen-Q_HEADER_LEN); - break; - case Q_CCREP_RULE_INFO: - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); - rc= rule_info_packet( server, pkt, pktlen-Q_HEADER_LEN); - break; - case Q_CCREQ_CONNECT: - case Q_CCREQ_SERVER_INFO: - case Q_CCREQ_PLAYER_INFO: - case Q_CCREQ_RULE_INFO: - default: - return; - } - - if ( rc == -1) - fprintf( stderr, "%s error on packet opcode %x\n", server->arg, - (int)pkt->op_code); + if (NULL == (string = ut2003_strdup(next, end, &next))) + { + return -1; + } - cleanup_qserver( server, (rc == -1) ? FORCE : 0); -} + if (server->game == NULL) + { + server->game = string; + add_rule(server, "gametype", server->game, NO_FLAGS | CHECK_DUPLICATE_RULES); + } + else + { + free(string); + } -/* Packet from QuakeWorld server - */ -void -deal_with_qw_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - if ( server->server_name == NULL) - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); - - if ( ((rawpkt[0] != '\377' && rawpkt[0] != '\376') || rawpkt[1] != '\377' || - rawpkt[2] != '\377' || rawpkt[3] != '\377') && show_errors) { - unsigned int ipaddr= ntohl(server->ipaddr); - fprintf( stderr, - "Odd packet from server %d.%d.%d.%d:%hu, processing ...\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, ntohs(server->port)); - print_packet( server, rawpkt, pktlen); - } - - rawpkt[pktlen]= '\0'; - - if ( rawpkt[4] == 'n') { - if ( server->type->id != QW_SERVER) - server->type= find_server_type_id( QW_SERVER); - deal_with_q1qw_packet( server, rawpkt, pktlen); - return; - } - else if ( rawpkt[4] == '\377' && rawpkt[5] == 'n') { - if ( server->type->id != HW_SERVER) - server->type= find_server_type_id( HW_SERVER); - deal_with_q1qw_packet( server, rawpkt, pktlen); - return; - } - else if ( strncmp( &rawpkt[4], "print\n\\", 7) == 0) { - deal_with_q2_packet( server, rawpkt+10, pktlen-10, 0); - return; - } - else if ( strncmp( &rawpkt[4], "print\n", 6) == 0) { - /* work-around for occasional bug in Quake II status packets - */ - char *c, *p; - p= c= &rawpkt[10]; - while ( *p != '\\' && (c= strchr( p, '\n'))) - p= c+1; - if ( *p == '\\' && c != NULL) { - deal_with_q2_packet( server, p, pktlen-(p-rawpkt), 0); - return; - } - } - else if ( strncmp( &rawpkt[4], "infoResponse", 12) == 0 || - (rawpkt[4] == '\001' && strncmp( &rawpkt[5], "infoResponse", 12) == 0) ) { - /* quake3 info response */ - if ( rawpkt[4] == '\001') { - rawpkt++; - pktlen--; - } - rawpkt+= 12; - pktlen-= 12; - for ( ; pktlen && *rawpkt != '\\'; pktlen--, rawpkt++) - ; - if ( !pktlen) - return; - if ( rawpkt[pktlen-1] == '"') { - rawpkt[pktlen-1]= '\0'; - pktlen--; - } - if ( get_player_info || get_server_rules) - server->next_rule= ""; - deal_with_q2_packet( server, rawpkt, pktlen, 0); - if ( (get_player_info || get_server_rules) && - ( server->flags & FLAG_BROADCAST || server->fd != -1)) { - send_rule_request_packet( server); - server->retry1= n_retries-1; - } - return; - } - else if ( strncmp( &rawpkt[4], "statusResponse\n", 15) == 0 || - (rawpkt[4] == '\001' && strncmp( &rawpkt[5], "statusResponse\n", 15) == 0) ) { - /* quake3 status response */ - server->next_rule= NO_SERVER_RULES; - server->retry1 = 0; - if ( rawpkt[4] == '\001') { - rawpkt++; - pktlen--; - } - deal_with_q2_packet( server, rawpkt + 19, pktlen - 19, - CHECK_DUPLICATE_RULES); - return; - } - else if ( strncmp( &rawpkt[4], "infostringresponse", 19) == 0) { - deal_with_q2_packet( server, rawpkt+23, pktlen-23, 0); - return; - } - - if ( show_errors) { - unsigned int ipaddr= ntohl(server->ipaddr); - fprintf( stderr, - "Odd packet from server %d.%d.%d.%d:%hu, ignoring ...\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, ntohs(server->port)); - print_packet( server, rawpkt, pktlen); - cleanup_qserver( server, 1); - } - else - cleanup_qserver( server, 0); -} - -void -deal_with_q1qw_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - char *key, *value, *end; - struct player *player= NULL, **last_player= &server->players; - int len, rc, complete= 0; - int number, frags, connect_time, ping; - char *pkt= &rawpkt[5]; - - if ( server->type->id == HW_SERVER) - pkt= &rawpkt[6]; - - while ( *pkt && pkt-rawpkt < pktlen) { - if ( *pkt == '\\') { - pkt++; - end= strchr( pkt, '\\'); - if ( end == NULL) - break; - *end= '\0'; - key= pkt; - pkt+= strlen(pkt)+1; - end= strchr( pkt, '\\'); - if ( end == NULL) - end= strchr( pkt, '\n'); - value= (char*) malloc(end-pkt+1); - memcpy( value, pkt, end-pkt); - value[end-pkt]= '\0'; - pkt= end; - if ( strcmp( key, "hostname") == 0) - server->server_name= value; - else if ( strcmp( key, "map") == 0) - server->map_name= value; - else if ( strcmp( key, "maxclients") == 0) { - server->max_players= atoi(value); - free( value); - } - else if ( get_server_rules || strncmp( key, "*game", 5) == 0) { - add_rule( server, key, value, NO_VALUE_COPY); - if ( strcmp( key, "*gamedir") == 0) { - server->game= value; - server->flags |= FLAG_DO_NOT_FREE_GAME; - } - } - } - else if ( *pkt == '\n') { - pkt++; - if ( pkt-rawpkt>=pktlen || *pkt == '\0') - break; - rc= sscanf( pkt, "%d %d %d %d %n", &number, &frags, &connect_time, - &ping, &len); - if ( rc != 4) { - char *nl; /* assume it's an error packet */ - server->error= (char*)malloc( pktlen+1); - nl= strchr( pkt, '\n'); - if ( nl != NULL) { - strncpy( server->error, pkt, nl-pkt); - server->error[nl-pkt]= '\0'; - } - else - strcpy( server->error, pkt); - server->server_name= SERVERERROR; - complete= 1; - break; - } - if ( get_player_info) { - player= (struct player *) calloc( 1, sizeof( struct player)); - player->number= number; - player->frags= frags; - player->connect_time= connect_time * 60; - player->ping= ping; - } - else - player= NULL; - - pkt+= len; - - if ( *pkt != '"') break; - pkt++; - end= strchr( pkt, '"'); - if ( end == NULL) break; - if ( player != NULL) { - player->name= (char*) malloc(end-pkt+1); - memcpy( player->name, pkt, end-pkt); - player->name[end-pkt]= '\0'; - } - pkt= end+2; - - if ( *pkt != '"') break; - pkt++; - end= strchr( pkt, '"'); - if ( end == NULL) break; - if ( player != NULL) { - player->skin= (char*) malloc(end-pkt+1); - memcpy( player->skin, pkt, end-pkt); - player->skin[end-pkt]= '\0'; - } - pkt= end+2; - - if ( player != NULL) { - sscanf( pkt, "%d %d%n", &player->shirt_color, - &player->pants_color, &len); - *last_player= player; - last_player= & player->next; - } - else - sscanf( pkt, "%*d %*d%n", &len); - pkt+= len; - - server->num_players++; - } - else - pkt++; - complete= 1; - } - - if ( !complete) { - if ( rawpkt[4] != 'n' || rawpkt[5] != '\0') { - fprintf( stderr, - "Odd packet from QW server %d.%d.%d.%d:%hu ...\n", - (server->ipaddr>>24)&0xff, (server->ipaddr>>16)&0xff, - (server->ipaddr>>8)&0xff, server->ipaddr&0xff, - ntohs(server->port)); - print_packet( server, rawpkt, pktlen); - } - } - else if ( server->server_name == NULL) - server->server_name= strdup(""); - - cleanup_qserver( server, 0); -} - -void -deal_with_q2_packet( struct qserver *server, char *rawpkt, int pktlen, - int check_duplicate_rules) -{ - char *key, *value, *end; - struct player *player= NULL; - struct player **last_player= & server->players; - int len, rc, complete= 0; - int frags=0, ping=0, num_players= 0; - char *pkt= rawpkt; - - while ( *pkt && pkt-rawpkt < pktlen) { - if ( *pkt == '\\') { - pkt++; - if ( *pkt == '\n' && server->type->id == SOF_SERVER) - goto player_info; - end= strchr( pkt, '\\'); - if ( end == NULL) - break; - *end= '\0'; - key= pkt; - pkt+= strlen(pkt)+1; - end= strpbrk( pkt, "\\\n"); - if(!end) { - end= rawpkt+pktlen; - } - value= (char*) malloc(end-pkt+1); - memcpy( value, pkt, end-pkt); - value[end-pkt]= '\0'; - pkt= end; - debug(3, "%s = %s", key, value); - if ( server->server_name == NULL && - (strcmp( key, "hostname") == 0 || - strcmp( key, "sv_hostname") == 0)) - server->server_name= value; - else if ( strcmp( key, "mapname") == 0 || - (strcmp( key, "map") == 0 && server->map_name == NULL)) { - if ( server->map_name != NULL) - free( server->map_name); - server->map_name= value; - } - else if ( strcmp( key, "maxclients") == 0 || - strcmp( key, "sv_maxclients") == 0 || - strcmp( key, "max") == 0) { - server->max_players= atoi(value); - /* MOHAA Q3 protocol max players is always 0 */ - if ( server->max_players == 0) - server->max_players= -1; - free(value); - } - else if ( strcmp( key, "clients") == 0 || - strcmp( key, "players") == 0) { - server->num_players= atoi(value); - free(value); - } - else if ( server->server_name == NULL && - strcmp( key, "pure") == 0) { - add_rule( server, key, value, NO_VALUE_COPY); - } - else if ( get_server_rules || strncmp( key, "game", 4) == 0) - { - if ( add_rule( server, key, value, NO_VALUE_COPY|check_duplicate_rules) == NULL) - { - free(value); /* duplicate, so free value */ - } - if ( server->game == NULL && strcmp( key, server->type->game_rule) == 0) - { - server->game= value; - server->flags |= FLAG_DO_NOT_FREE_GAME; - } - } - else - free(value); - } - else if ( *pkt == '\n') { -player_info: - pkt++; - if ( *pkt == '\0') - break; - if(!strncmp(pkt, "\\challenge\\", 11)) - { - // qfusion - // This doesnt support getstatus looking at warsow source: - // server/sv_main.c: SV_ConnectionlessPacket - server->next_rule = NO_SERVER_RULES; - break; - } - rc= sscanf( pkt, "%d %n", &frags, &len); - if ( rc == 1 && pkt[len] != '"') { - pkt+= len; - rc= sscanf( pkt, "%d %n", &ping, &len); - } - else if ( rc == 1) { - /* MOHAA Q3 protocol only provides player ping */ - ping= frags; - frags= 0; - } - if ( rc != 1) { - char *nl; /* assume it's an error packet */ - server->error= (char*)malloc( pktlen+1); - nl= strchr( pkt, '\n'); - if ( nl != NULL) - strncpy( server->error, pkt, nl-pkt); - else - strcpy( server->error, pkt); - server->server_name= SERVERERROR; - complete= 1; - break; - } - if ( get_player_info) { - player= (struct player *) calloc( 1, sizeof( struct player)); - player->number= 0; - player->connect_time= -1; - player->frags= frags; - player->ping= ping; - } - else - player= NULL; - - pkt+= len; - - if ( isdigit((unsigned char)*pkt)) { - /* probably an SOF2 1.01 server, includes team # */ - int team; - rc= sscanf( pkt, "%d %n", &team, &len); - if ( rc == 1) { - pkt+= len; - if ( player) { - player->team= team; - server->flags|= FLAG_PLAYER_TEAMS; - } - } - } - - if ( *pkt != '"') break; - - pkt++; - end= strchr( pkt, '"'); - if ( end == NULL) break; - if ( player != NULL) { - player->name= (char*) malloc(end-pkt+1); - memcpy( player->name, pkt, end-pkt); - player->name[end-pkt]= '\0'; - } - pkt= end+1; - - //WarSoW team number - if ( *pkt != '\n') { - int team; - rc= sscanf( pkt, "%d%n", &team, &len); - if ( rc == 1) { - pkt+= len; - if ( player) { - player->team= team; - server->flags|= FLAG_PLAYER_TEAMS; - } - } - } - - if ( player != NULL) { - player->skin= NULL; - player->shirt_color= -1; - player->pants_color= -1; - *last_player= player; - last_player= & player->next; - } - num_players++; - } - else - pkt++; - complete= 1; - } - - if ( server->num_players == 0 || num_players > server->num_players) - server->num_players= num_players; - - if ( !complete) { - cleanup_qserver( server, 1); - return; - } - else if ( server->server_name == NULL) - server->server_name= strdup(""); - - cleanup_qserver( server, 0); -} - -void -ack_descent3master_packet( struct qserver *server, char *curtok ) -{ - int rc; - char packet[0x1e]; - memcpy( packet, descent3_masterquery,0x1a); - packet[1]= 0x1d; - packet[0x16]= 1; - memcpy( packet + 0x1a, curtok, 4); - rc= send( server->fd, packet, sizeof(packet), 0); - if ( rc == SOCKET_ERROR) - perror( "send"); -} + server->num_players = (unsigned char)next[0]; + server->max_players = (unsigned char)next[1]; -/* Packet from Descent3 master server (PXO) - */ -void -deal_with_descent3master_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - int i= 0, lastpacket= 0; - char *names= rawpkt + 0x1f; - char *ips= rawpkt + 0x29f; - char *ports= rawpkt + 0x2ef; - /* printf ("s=%p p=%p l=%i\n",server,rawpkt,pktlen); */ - while ( i<20) { - if ( *names) { - char *c; - server->master_pkt_len += 6; - server->master_pkt= (char*)realloc( server->master_pkt, - server->master_pkt_len); - c= server->master_pkt + server->master_pkt_len - 6; - memcpy( c, ips, 4); - memcpy( c + 4, ports, 2); - }else if (i>0) - lastpacket= 1; - names+= 0x20; - ips+= 4; - ports+= 2; - i++; - } - - ack_descent3master_packet( server, rawpkt+0x1a); - - server->n_servers= server->master_pkt_len / 6; - - server->next_player_info= -1; - server->retry1= 0; - - if (lastpacket) { - cleanup_qserver( server, 0); - } + return 0; } -/* Packet from QuakeWorld master server - */ -void -deal_with_qwmaster_packet( struct qserver *server, char *rawpkt, int pktlen) +STATIC int ut2003_basic_packet(struct qserver *server, char *rawpkt, char *end) { - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); + char *next; + char *string; + change_server_port(server, swap_short_from_little(&rawpkt[6]), 0); - if ( rawpkt[0] == QW_NACK) + if (NULL == (string = ut2003_strdup(&rawpkt[14], end, &next))) { - server->error= strdup( &rawpkt[2]); - server->server_name= SERVERERROR; - cleanup_qserver( server, 1); - return; + return -1; } - if ( *((unsigned int*)rawpkt) == 0xffffffff) + if (server->server_name == NULL) + { + server->server_name = string; + } + else { - rawpkt+= 4; /* QW 1.5 */ - pktlen-= 4; + free(string); } - if ( rawpkt[0] == QW_SERVERS && rawpkt[1] == QW_NEWLINE) + if (NULL == (string = ut2003_strdup(next, end, &next))) { - rawpkt+= 2; - pktlen-= 2; + return -1; } - else if ( rawpkt[0] == HL_SERVERS && rawpkt[1] == 0x0d ) + + if (server->map_name == NULL) { - // 2 byte id + 4 byte sequence - memcpy( server->master_query_tag, rawpkt+2, 3); - rawpkt+= 6; - pktlen-= 6; + server->map_name = string; } - else if ( rawpkt[0] == HL_SERVERS && rawpkt[1] == 0x0a ) + else { - // no sequence id for steam - // instead we use the ip:port of the last recieved server - struct in_addr *sin_addr = (struct in_addr*)(rawpkt+pktlen-6); - char *ip = inet_ntoa( *sin_addr ); - unsigned short port = htons( *((unsigned short*)(rawpkt+pktlen-2)) ); - - //fprintf( stderr, "NEXT IP=%s:%u\n", ip, port ); - sprintf( server->master_query_tag, "%s:%u", ip, port ); + free(string); + } - // skip over the 2 byte id - rawpkt+= 2; - pktlen-= 2; + if (NULL == (string = ut2003_strdup(next, end, &next))) + { + return -1; } - else if ( strncmp( rawpkt, "servers", 7) == 0) + + if (server->game == NULL) { - rawpkt+= 8; - pktlen-= 8; + server->game = string; + add_rule(server, "gametype", server->game, NO_FLAGS | CHECK_DUPLICATE_RULES); } - else if ( strncmp( rawpkt, "getserversResponse", 18) == 0) + else { - static int q3m_debug= 0; + free(string); + } + + server->num_players = swap_long_from_little(next); + next += 4; + server->max_players = swap_long_from_little(next); + return 0; +} + +STATIC int pariah_rule_packet(struct qserver *server, char *rawpkt, char *end) +{ + char *key, *value; + + unsigned char no_rules = (unsigned char)rawpkt[1]; + unsigned char seen = 0; - rawpkt+= 18; - pktlen-= 18; + // type + no_rules + rawpkt += 2; - for ( ; *rawpkt != '\\' && pktlen; pktlen--, rawpkt++) + // we get size encoded key = value pairs + while (rawpkt < end && no_rules > seen) + { + // first byte is the rule count + seen = (unsigned char)rawpkt[0]; + rawpkt++; + if (NULL == (key = ut2003_strdup(rawpkt, end, &rawpkt))) { + break; } - if ( !pktlen) + if ('\0' == rawpkt[0]) { - return; + value = strdup(""); + rawpkt++; } - rawpkt++; - pktlen--; - - if ( q3m_debug) printf( "q3m pktlen %d lastchar %x\n", pktlen, (unsigned int)rawpkt[pktlen-1]); - - server->master_pkt= (char*)realloc( server->master_pkt, - server->master_pkt_len + pktlen+1); - - if ( server->type->id == STEF_MASTER) + else if (NULL == (value = ut2003_strdup(rawpkt, end, &rawpkt))) { - decode_stefmaster_packet( server, rawpkt, pktlen); + break; } - else + + if (NULL == add_rule(server, key, value, NO_KEY_COPY | NO_VALUE_COPY | COMBINE_VALUES)) { - decode_q3master_packet( server, rawpkt, pktlen); + /* duplicate, so free key and value */ + free(value); + free(key); } - if ( q3m_debug) printf( "q3m %d servers\n", server->n_servers); - return; + seen++; } - else if ( show_errors) + + if (no_rules == seen) { - unsigned int ipaddr= ntohl(server->ipaddr); - fprintf( stderr, - "Odd packet from QW master %d.%d.%d.%d, processing ...\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff - ); - print_packet( server, rawpkt, pktlen); + // all done + server->next_rule = NULL; + return 1; } - server->master_pkt= (char*)realloc( server->master_pkt, - server->master_pkt_len+pktlen+1); - rawpkt[pktlen]= '\0'; - memcpy( server->master_pkt+server->master_pkt_len, rawpkt, pktlen+1); - server->master_pkt_len+= pktlen; + return 0; +} - server->n_servers= server->master_pkt_len / 6; +STATIC int ut2003_rule_packet(struct qserver *server, char *rawpkt, char *end) +{ + char *key, *value; + int result = 0; - if ( server->type->flags & TF_MASTER_MULTI_RESPONSE) - { - server->next_player_info= -1; - server->retry1= 0; - } - else if ( server->type->id == HL_MASTER ) + // Packet Type + rawpkt++; + + // we get size encoded key = value pairs + while (rawpkt < end) { - if ( server->master_query_tag[0] == 0 && - server->master_query_tag[1] == 0 && - server->master_query_tag[2] == 0 - ) + if (NULL == (key = ut2003_strdup(rawpkt, end, &rawpkt))) { - // all done - server->server_name = MASTER; - cleanup_qserver( server, 1); - bind_sockets(); + break; } - else + + if (NULL == (value = ut2003_strdup(rawpkt, end, &rawpkt))) { - // more to come - server->retry1++; - send_qwmaster_request_packet( server); + break; + } + + if (strcmp(key, "minplayers") == 0) + { + result = atoi(value); } + + if (NULL == add_rule(server, key, value, NO_KEY_COPY | NO_VALUE_COPY | COMBINE_VALUES)) + { + /* duplicate, so free key and value */ + free(value); + free(key); + } + } + + return result; +} + +char *ut2003_strdup(const char *string, const char *end, char **next) +{ + unsigned char len = string[0]; + char *result = NULL; + + if (len < 128) + { + // type 1 string + //fprintf( stderr, "Type 1:" ); + result = dup_nstring(string, end, next); } - else if ( server->type->flags & TF_MASTER_STEAM ) + else { - // should the HL_MASTER be the same as this? - int i; - for ( i = pktlen - 6; i < pktlen && 0x00 == rawpkt[i] ; i++ ) + // type 2 string + //fprintf( stderr, "Type 2:\n" ); + const char *last; + char *resp, *pos; + // minus indicator + len -= 128; + // double byte chars so * 2 + len = len * 2; + last = string + len; + if (last > end) { + *next = (char*)end; + fprintf(stderr, "Type 2 string format error ( too short )\n"); + return NULL; } - if ( i == pktlen ) + *next = (char*)last + 1; + if (NULL == (result = (char*)calloc(last - string, sizeof(char)))) { - // last 6 bytes where 0x00 so we have reached the last packet - server->n_servers--; - server->master_pkt_len -= 6; - server->server_name = MASTER; - cleanup_qserver( server, 1); - bind_sockets(); + fprintf(stderr, "Failed to malloc string memory\n"); + return NULL; } - else + resp = result; + pos = (char*)string + 1; + while (pos <= last) { - // more to come - server->retry1++; - send_qwmaster_request_packet( server ); + // check for a color code + if (pos + 6 <= last && 0 == memcmp(pos, "^\0#\0", 4)) + { + // we have a color code + //fprintf( stderr, "color:%02hhx%02hhx\n", pos[4], pos[5] ); + // indicator transformed to ^\1 + *resp = *pos; + resp++; + pos++; + *resp = '\1'; + resp++; + pos += 3; + // color byte + *resp = *pos; + resp++; + pos += 2; + //pos += 6; + } + + // standard char + //fprintf( stderr, "char: %02hhx\n", *pos ); + *resp = *pos; + resp++; + pos += 2; } } - else - { - server->server_name = MASTER; - cleanup_qserver( server, 0); - bind_sockets(); - } + + //fprintf( stderr, "'%s'\n", result ); + + return result; } -void -decode_q3master_packet( struct qserver *server, char *pkt, int pktlen) + +STATIC int pariah_player_packet(struct qserver *server, char *rawpkt, char *end) { - char *p; + unsigned char no_players = rawpkt[1]; + unsigned char seen = 0; /* XXX: cannot work this way, it takes only + this packet into consideration. What if + player info is spread across multiple + packets? */ - pkt[pktlen]= 0; - p= pkt; + // type + no_players + some unknown preamble + rawpkt += 3; + while (rawpkt < end && seen < no_players) + { + struct player *player; - while ( *p && p < &pkt[pktlen-6]) { - memcpy( server->master_pkt + server->master_pkt_len, &p[0], 4); - memcpy( server->master_pkt + server->master_pkt_len + 4, &p[4], 2); - server->master_pkt_len += 6; - p+= 6; - while ( *p && *p == '\\') - p++; - } - server->n_servers= server->master_pkt_len / 6; -// server->next_player_info= -1; evil, causes busy loop! - server->retry1 = 0; // received at least one packet so no need to retry -} - -void -decode_stefmaster_packet( struct qserver *server, char *pkt, int pktlen) -{ - unsigned char *p, *m, *end; - unsigned int i, b; - - pkt[pktlen]= 0; - - p= (unsigned char*) pkt; - m= (unsigned char*) server->master_pkt + server->master_pkt_len; - end= (unsigned char*) &pkt[pktlen-12]; - while ( *p && p < end) { - for ( i= 6; i; i--) { - sscanf( (char*)p, "%2x", &b); - p+= 2; - *m++= b; - } - server->master_pkt_len += 6; - while ( *p && *p == '\\') - p++; - } - server->n_servers= server->master_pkt_len / 6; - server->next_player_info= -1; - server->retry1= 0; -} + // Player Number + rawpkt += 4; -/* Packet from Tribes master server - */ -void -deal_with_tribesmaster_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - unsigned char *upkt= (unsigned char*) rawpkt; - int packet_number= upkt[2]; - int n_packets= upkt[3]; - unsigned char *p; - char *mpkt; - int len; - unsigned int ipaddr; - - if ( memcmp( rawpkt, tribes_master_response, sizeof(tribes_master_response)) != 0) { - fprintf( stderr, "Odd packet from Tribes master server\n"); - print_packet( server, rawpkt, pktlen); - } - - /* 0x1006 - 01 packet number - 08 # packets - 02 - 0000 - 66 - 0d length of following string - "Tribes Master" - 3c length of following string - "Check out the Starsiege demo now! www.starsiegeplayers.com" - 0035 - 06 d143 4764 812c - 06 d1e2 8df3 616d - 06 1804 6d50 616d - 06 d81c 6dc0 616d -*/ -/* 0x1006 - 02 - 08 - 02 0000 - 66 - 00 3f - 06 cf88 344c 1227 -*/ - -/* printf( "packet_number %d n_packets %d\n", packet_number, n_packets); -*/ - - len= upkt[8]; - if ( len > 0) { - p= (unsigned char*) rawpkt+9; -/* printf( "%.*s\n", len, p); -*/ - p+= len; - len= upkt[8+len+1]; -/* printf( "%.*s\n", len, p+1); -*/ - p+= len+1; - p+= 2; - } - else - p= (unsigned char*) rawpkt+10; - - if ( server->master_pkt == NULL) { - server->master_pkt= (char*)malloc( n_packets*64*6); - mpkt= server->master_pkt; - } - else - mpkt= server->master_pkt + server->n_servers*6; - - while ( (char*)p < rawpkt+pktlen) { - if ( *p != 0x6) printf( "*p %u\n", (unsigned)*p); - memcpy( mpkt, p+1, sizeof(ipaddr)); - if ( 0) { - mpkt[4]= p[5]; - mpkt[5]= p[6]; - } - else { - mpkt[5]= p[5]; - mpkt[4]= p[6]; + // Create a player + if (NULL == (player = add_player(server, server->n_player_info))) + { + return 0; + } + + // Name ( min 3 bytes ) + player->name = ut2003_strdup(rawpkt, end, &rawpkt); + + // Ping + player->ping = swap_long_from_little(rawpkt); + rawpkt += 4; + + // Frags + player->frags = (unsigned char)rawpkt[0]; + rawpkt++; + + // unknown + rawpkt++; + + seen++; } -/* - printf( "%08x:%hu %u.%u.%u.%u:%hu\n", ipaddr, port, ipaddr>>24, - (ipaddr>>16)&0xff, (ipaddr>>8)&0xff, ipaddr&0xff, port); -*/ - p+= 7; - mpkt+= 6; - } -/* -if ( (char*)p != rawpkt+pktlen) -printf( "%x %x\n", p, rawpkt+pktlen); -*/ - server->master_pkt_len= mpkt - server->master_pkt; - server->n_servers= server->master_pkt_len / 6; - server->server_name= MASTER; - server->next_player_info= -1; - - if ( packet_number >= n_packets) - cleanup_qserver( server, 1); - else - cleanup_qserver( server, 0); -} - -char * -display_tribes2_string_list( unsigned char *pkt) -{ - char *delim=""; - unsigned int count, len; - count= *pkt; - pkt++; - for ( ; count; count--) { - len= *pkt; - pkt++; - if ( len > 0) { - if ( raw_display) { - fprintf( OF, "%s%.*s", delim, (int)len, pkt); - delim= raw_delimiter; - } - else - fprintf( OF, "%.*s\n", (int)len, pkt); - } - pkt+= len; - } - if ( raw_display) - fputs( "\n", OF); - return (char*)pkt; -} - -void -deal_with_tribes2master_packet( struct qserver *server, char *pkt, int pktlen) -{ - unsigned int n_servers, index, total, server_limit; - char *p, *mpkt; - - if ( pkt[0] == TRIBES2_RESPONSE_GAME_TYPES) { - pkt+= 6; - if ( raw_display) { - fprintf( OF, "%s%s%s%s", server->type->type_prefix, raw_delimiter, - server->arg, raw_delimiter); - } - else { - fprintf( OF, "Game Types\n"); - fprintf( OF, "----------\n"); - } - pkt= display_tribes2_string_list( (unsigned char *)pkt); - if ( raw_display) { - fprintf( OF, "%s%s%s%s", server->type->type_prefix, raw_delimiter, - server->arg, raw_delimiter); - } - else { - fprintf( OF, "\nMission Types\n"); - fprintf( OF, "-------------\n"); - } - display_tribes2_string_list( (unsigned char *)pkt); - - server->master_pkt_len= 0; - server->n_servers= 0; - server->server_name= MASTER; - server->next_player_info= -1; - cleanup_qserver( server, 1); - return; - } - - if ( pkt[0] != TRIBES2_RESPONSE_MASTER) { - /* error */ - cleanup_qserver( server, 1); - return; - } - - server_limit= get_param_ui_value( server, "limit", ~0); - - n_servers= little_endian ? *(unsigned short*)(pkt+8) : - swap_short(pkt+8); - index= *(unsigned char*)(pkt+6); - total= *(unsigned char*)(pkt+7); - if ( server->master_pkt == NULL) { - server->master_pkt= (char*)malloc( total * n_servers * 6); - mpkt= server->master_pkt; - } - else - mpkt= server->master_pkt + server->n_servers*6; - - p= pkt+10; - for ( ; n_servers && ((char*)mpkt - server->master_pkt)/6 < server_limit; - n_servers--, p+= 6, mpkt+= 6) { - memcpy( mpkt, p, 4); - mpkt[4]= p[5]; - mpkt[5]= p[4]; - } - server->master_pkt_len= (char*)mpkt - server->master_pkt; - server->n_servers= server->master_pkt_len / 6; - server->server_name= MASTER; - server->next_player_info= -1; - - if ( index >= total-1 || server->n_servers >= server_limit) - cleanup_qserver( server, 1); - else - cleanup_qserver( server, 0); -} -int -server_info_packet( struct qserver *server, struct q_packet *pkt, int datalen) -{ - int off= 0; + if (no_players == seen) + { + // all done + server->num_players = server->n_player_info; + return 1; + } + + // possibly more to come - /* ignore duplicate packets */ - if ( server->server_name != NULL) return 0; +} + +STATIC int ut2003_player_packet(struct qserver *server, char *rawpkt, char *end) +{ + // skip type + rawpkt++; + switch (server->protocol_version) + { + case 0x7e: + // XMP packet + //fprintf( stderr, "XMP packet\n" ); + while (rawpkt < end) + { + struct player *player; + char *var, *val; + unsigned char no_props; + if (rawpkt + 24 > end) + { + malformed_packet(server, "player info too short"); + rawpkt = end; + return 1; + } - server->address= strdup((char*)&pkt->data[off]); - off+= strlen(server->address) + 1; - if ( off >= datalen) - return -1; - - server->server_name= strdup((char*)&pkt->data[off]); - off+= strlen(server->server_name) + 1; - if ( off >= datalen) - return -1; - - server->map_name= strdup((char*)&pkt->data[off]); - off+= strlen(server->map_name) + 1; - if ( off > datalen) - return -1; - - server->num_players= pkt->data[off++]; - server->max_players= pkt->data[off++]; - server->protocol_version= pkt->data[off++]; - - server->retry1= n_retries; - - if ( get_server_rules) - send_rule_request_packet( server); - if ( get_player_info) - send_player_request_packet( server); - - return 0; -} - -int -player_info_packet( struct qserver *server, struct q_packet *pkt, int datalen) -{ - char *name, *address; - int off, colors, frags, connect_time, player_number; - struct player *player, *last; - - off= 0; - player_number= pkt->data[off++]; - name= (char*) &pkt->data[off]; - off+= strlen(name)+1; - if ( off >= datalen) - return -1; - - colors= pkt->data[off+3]; - colors= (colors<<8) + pkt->data[off+2]; - colors= (colors<<8) + pkt->data[off+1]; - colors= (colors<<8) + pkt->data[off]; - off+= sizeof(colors); - - frags= pkt->data[off+3]; - frags= (frags<<8) + pkt->data[off+2]; - frags= (frags<<8) + pkt->data[off+1]; - frags= (frags<<8) + pkt->data[off]; - off+= sizeof(frags); - - connect_time= pkt->data[off+3]; - connect_time= (connect_time<<8) + pkt->data[off+2]; - connect_time= (connect_time<<8) + pkt->data[off+1]; - connect_time= (connect_time<<8) + pkt->data[off]; - off+= sizeof(connect_time); - - address= (char*) &pkt->data[off]; - off+= strlen(address)+1; - if ( off > datalen) - return -1; - - last= server->players; - while ( last != NULL && last->next != NULL) { - if ( last->number == player_number) - return 0; - last= last->next; - } - if ( last != NULL && last->number == player_number) - return 0; + // Player Number never set + rawpkt += 4; - player= (struct player *) calloc( 1, sizeof(struct player)); - player->number= player_number; - player->name= strdup( name); - player->address= strdup( address); - player->connect_time= connect_time; - player->frags= frags; - player->shirt_color= colors>>4; - player->pants_color= colors&0xf; - player->next= NULL; - - if ( last == NULL) - server->players= player; - else - last->next= player; - - server->next_player_info++; - server->retry2= n_retries; - if ( server->next_player_info < server->num_players) - send_player_request_packet( server); - - return 0; -} - -int -rule_info_packet( struct qserver *server, struct q_packet *pkt, int datalen) -{ - int off= 0; - struct rule *rule, *last; - char *name, *value; + // Player ID never set + rawpkt += 4; - /* Straggler packet after we've already given up fetching rules */ - if ( server->next_rule == NULL) - return 0; + if (NULL == (player = add_player(server, server->n_player_info))) + { + return 0; + } - if ( ntohs(pkt->length) == Q_HEADER_LEN) { - server->next_rule= NULL; - return 0; - } + // Name ( min 3 bytes ) + player->name = ut2003_strdup(rawpkt, end, &rawpkt); - name= (char*)&pkt->data[off]; - off+= strlen( name)+1; - if ( off >= datalen) - return -1; - - value= (char*)&pkt->data[off]; - off+= strlen( value)+1; - if ( off > datalen) - return -1; - - last= server->rules; - while ( last != NULL && last->next != NULL) { - if ( strcmp( last->name, name) == 0) - return 0; - last= last->next; - } - if ( last != NULL && strcmp( last->name, name) == 0) - return 0; + // Ping + player->ping = swap_long_from_little(rawpkt); + rawpkt += 4; - rule= (struct rule *) malloc( sizeof( struct rule)); - rule->name= strdup( name); - rule->value= strdup( value); - rule->next= NULL; + // Frags + player->frags = swap_long_from_little(rawpkt); + rawpkt += 4; - if ( last == NULL) - server->rules= rule; - else - last->next= rule; + // Stat ID never set + rawpkt += 4; - server->n_rules++; - server->next_rule= rule->name; - server->retry1= n_retries; - send_rule_request_packet( server); + // Player properties + no_props = rawpkt[0]; + //fprintf( stderr, "noprops %d\n", no_props ); + rawpkt++; + while (rawpkt < end && no_props > 0) + { + if (NULL == (var = ut2003_strdup(rawpkt, end, &rawpkt))) + { + break; + } + if (NULL == (val = ut2003_strdup(rawpkt, end, &rawpkt))) + { + break; + } + //fprintf( stderr, "attrib: %s = %s\n", var, val ); - return 0; -} + // Things we can use + if (0 == strcmp(var, "team")) + { + player->team_name = val; + } + else if (0 == strcmp(var, "class")) + { + player->skin = val; + } + else + { + free(val); + } -struct info * -player_add_info( struct player *player, char *key, char *value, int flags) -{ - struct info *info; - if ( flags & CHECK_DUPLICATE_RULES ) - { - for ( info = player->info; info; info = info->next ) - { - if ( 0 == strcmp( info->name, key ) ) - { - return NULL; + free(var); + no_props--; + } } - } - } - - if ( flags & COMBINE_VALUES ) - { - for ( info = player->info; info; info = info->next ) - { - if ( 0 == strcmp( info->name, key ) ) + break; + default: + while (rawpkt < end) { - char *full_value = (char*)calloc( sizeof(char), strlen( info->value ) + strlen( value ) + 2 ); - if ( NULL == full_value ) + struct player *player; + + if (rawpkt + 4 > end) { - fprintf( stderr, "Failed to malloc combined value\n" ); - exit( 1 ); + malformed_packet(server, "player packet too short"); + return 1; } - sprintf( full_value, "%s%s%s", info->value, multi_delimiter, value ); - // We should be able to free this - free( info->value ); - info->value = full_value; + if (NULL == (player = add_player(server, swap_long_from_little(rawpkt)))) + { + return 0; + } - return info; + player->name = ut2003_strdup(rawpkt + 4, end, &rawpkt); + if (rawpkt + 8 > end) + { + malformed_packet(server, "player packet too short"); + return 1; + } + player->ping = swap_long_from_little(rawpkt); + rawpkt += 4; + player->frags = swap_long_from_little(rawpkt); + rawpkt += 4; + { + unsigned team = swap_long_from_little(rawpkt); + rawpkt += 4; + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + if (team &1 << 29) + { + player->team_name = "red"; + } + else if (team &1 << 30) + { + player->team_name = "blue"; + } + } } - } } - info = (struct info *) malloc( sizeof( struct info)); - if ( flags & NO_KEY_COPY) - { - info->name = key; - } - else - { - info->name = strdup(key); - } - if ( flags & NO_VALUE_COPY) - { - info->value = value; - } - else - { - info->value = strdup(value); - } - info->next = NULL; + return 0; +} - if ( NULL == player->info ) - { - player->info = info; - } - else + +char *get_rule(struct qserver *server, char *name) +{ + struct rule *rule; + rule = server->rules; + for (; rule != NULL; rule = rule->next) { - *player->last_info = info; + if (strcmp(name, rule->name) == 0) + { + return rule->value; + } } - player->last_info = &info->next; - player->n_info++; - return info; + return NULL; } -struct rule * -add_rule( struct qserver *server, char *key, char *value, int flags) +int deal_with_ut2003_packet(struct qserver *server, char *rawpkt, int pktlen) { - struct rule *rule; - if ( flags & CHECK_DUPLICATE_RULES ) + + // For protocol spec see: + // http://unreal.student.utwente.nl/UT2003-queryspec.html + + char *end; + int error = 0, before; + unsigned int packet_header; + + debug( 2, "deal_with_ut2003_packet %p, %d", server, pktlen ); + + rawpkt[pktlen] = '\0'; + end = &rawpkt[pktlen]; + + packet_header = swap_long_from_little(&rawpkt[0]); + rawpkt += 4; + + server->protocol_version = packet_header; + if ( + packet_header != 0x77 // Pariah Demo? + && packet_header != 0x78 // UT2003 Demo + && packet_header != 0x79 // UT2003 Retail + && packet_header != 0x7e // Unreal2 XMP + && packet_header != 0x7f // UT2004 Demo + && packet_header != 0x80 // UT2004 Retail + ) { - for ( rule = server->rules; rule; rule = rule->next ) - { - if ( 0 == strcmp( rule->name, key ) ) + malformed_packet(server, "Unknown type 0x%x", packet_header); + } + + switch (rawpkt[0]) + { + case 0x00: + // Server info + if (server->server_name == NULL) { - return NULL; + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - } - } - if ( flags & COMBINE_VALUES ) - { - for ( rule = server->rules; rule; rule = rule->next ) - { - if ( 0 == strcmp( rule->name, key ) ) + error = ut2003_basic_packet(server, rawpkt, end); + if (!error) { - char *full_value = (char*)calloc( sizeof(char), strlen( rule->value ) + strlen( value ) + 2 ); - if ( NULL == full_value ) + if (get_server_rules || get_player_info) { - fprintf( stderr, "Failed to malloc combined value\n" ); - exit( 1 ); + int requests = server->n_requests; + server->next_rule = ""; + server->retry1 = n_retries; + server->retry2 = 0; // don't wait for player packet + send_rule_request_packet(server); + server->n_requests = requests; // would produce wrong ping } - sprintf( full_value, "%s%s%s", rule->value, multi_delimiter, value ); + } + break; - // We should be able to free this - free( rule->value ); - rule->value = full_value; + case 0x01: + // Game info + ut2003_rule_packet(server, rawpkt, end); + server->next_rule = ""; + server->retry1 = 0; /* we received at least one rule packet so + no need to retry. We'd get double + entries otherwise. */ + break; - return rule; + case 0x02: + // Player info + before = server->n_player_info; + error = ut2003_player_packet(server, rawpkt, end); + if (before == server->n_player_info) + { + error = 1; } - } - } + break; - rule = (struct rule *) malloc( sizeof( struct rule)); - if ( flags & NO_KEY_COPY) - { - rule->name = key; - } - else - { - rule->name = strdup(key); - } - if ( flags & NO_VALUE_COPY) - { - rule->value = value; + case 0x10: + // Pariah Server info + if (server->server_name == NULL) + { + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + } + + error = pariah_basic_packet(server, rawpkt, end); + if (!error) + { + // N.B. pariah always sends a rules and players packet + int requests = server->n_requests; + server->next_rule = ""; + server->retry1 = n_retries; + server->retry2 = 0; + server->n_requests = requests; // would produce wrong ping + } + break; + + case 0x11: + // Game info + pariah_rule_packet(server, rawpkt, end); + server->retry1 = 0; /* we received at least one rule packet so + no need to retry. We'd get double + entries otherwise. */ + break; + + case 0x12: + // Player info + before = server->n_player_info; + pariah_player_packet(server, rawpkt, end); + if (before == server->n_player_info) + { + error = 1; + } + break; + + + default: + malformed_packet(server, "Unknown packet type 0x%x", (unsigned)rawpkt[0]); + break; } - else + + /* don't cleanup if we fetch server rules. We would lose + * rule packets as we don't know how many we get + * We do clean up if we don't fetch server rules so we don't + * need to wait for timeout. + */ + if ( + error || + (!get_server_rules && !get_player_info) || + (!get_server_rules && server->num_players == server->n_player_info) || + (server->next_rule == NULL && server->num_players == server->n_player_info) + ) { - rule->value = strdup(value); + return DONE_FORCE; } - rule->next = NULL; - *server->last_rule = rule; - server->last_rule = & rule->next; - server->n_rules++; - return rule; + return INPROGRESS; } -void -add_nrule( struct qserver *server, char *key, char *value, int len) +int deal_with_unrealmaster_packet(struct qserver *server, char *rawpkt, int pktlen) { - struct rule *rule; - for ( rule= server->rules; rule; rule= rule->next) - if ( strcmp( rule->name, key) == 0) - return; + debug( 2, "deal_with_unrealmaster_packet %p, %d", server, pktlen ); - rule= (struct rule *) malloc( sizeof( struct rule)); - rule->name= strdup(key); - rule->value= strndup(value,len); - rule->next= NULL; - *server->last_rule= rule; - server->last_rule= & rule->next; - server->n_rules++; + if (pktlen == 0) + { + return PKT_ERROR; + } + print_packet(server, rawpkt, pktlen); + puts("--"); + return 0; } -struct player * -add_player( struct qserver *server, int player_number ) +/* Returns 1 if the query is done (server may be freed) and 0 if not. + */ +int deal_with_halflife_packet(struct qserver *server, char *rawpkt, int pktlen) { - struct player *player; + char *pkt; + char *end = &rawpkt[pktlen]; + int pkt_index = 0, pkt_max = 0; + char number[16]; + short pkt_id; + + debug( 2, "deal_with_halflife_packet %p, %d", server, pktlen ); - for ( player = server->players; player; player = player->next ) - { - if ( player->number == player_number) + if (server->server_name == NULL) { - return NULL; + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - } - player = (struct player *) calloc( 1, sizeof( struct player)); - player->number = player_number; - player->next = server->players; - player->n_info = 0; - player->score = NA_INT; - player->deaths = NA_INT; - player->frags = NA_INT; - player->last_info = NULL; - server->players = player; - server->n_player_info++; - return player; -} + if (pktlen < 5) + { + return PKT_ERROR; + } -STATIC struct player * -get_player_by_number( struct qserver *server, int player_number) -{ - struct player *player; - for ( player= server->players; player; player= player->next) - if ( player->number == player_number) - return player; - return NULL; -} + if (((rawpkt[0] != '\377' && rawpkt[0] != '\376') || rawpkt[1] != '\377' || rawpkt[2] != '\377' || rawpkt[3] != '\377') && show_errors) + { + unsigned int ipaddr = ntohl(server->ipaddr); + fprintf(stderr, "Odd packet from server %d.%d.%d.%d:%hu, processing ...\n", + (ipaddr >> 24) &0xff, + (ipaddr >> 16) &0xff, + (ipaddr >> 8) &0xff, + ipaddr &0xff, + ntohs(server->port) + ); + print_packet(server, rawpkt, pktlen); + } -// Updates a servers port information. -// Sets the rules: -// _queryport <queryport> -// hostport <port> -void -change_server_port( struct qserver *server, unsigned short port, int force ) -{ - if ( port > 0 && port != server->port ) + if (((unsigned char*)rawpkt)[0] == 0xfe) { - // valid port and changing - char arg[64]; + SavedData *sdata; + pkt_index = ((unsigned char*)rawpkt)[8] >> 4; + pkt_max = ((unsigned char*)rawpkt)[8] &0xf; + memcpy(&pkt_id, &rawpkt[4], 2); - if ( show_game_port || force || server->flags & TF_SHOW_GAME_PORT ) + if (server->saved_data.data == NULL) { - unsigned int ipaddr = ntohl(server->ipaddr); - - // Update the servers hostname as required - sprintf( arg, "%d.%d.%d.%d:%hu", ipaddr>>24, (ipaddr>>16)&0xff, (ipaddr>>8)&0xff, ipaddr&0xff, port ); - if ( 0 != strcmp( server->arg, server->host_name )) - { - // hostname isnt the query arg - char *colon = strchr( server->host_name, ':' ); - if ( colon ) - { - // dns hostname or hostname:port - char *hostname = malloc( strlen(server->host_name) + 6 ); - *colon= '\0'; - sprintf( hostname, "%s:%hu", server->host_name, port); - free( server->host_name); - server->host_name= hostname; - } - } - // Update the server arg - free( server->arg ); - server->arg = strdup( arg ); + sdata = &server->saved_data; + } + else + { + sdata = (SavedData*)calloc(1, sizeof(SavedData)); + sdata->next = server->saved_data.next; + server->saved_data.next = sdata; + } - // Add a rule noting the previous query port - sprintf( arg, "%hu", server->port ); - add_rule( server, "_queryport", arg, NO_FLAGS); + sdata->pkt_index = pkt_index; + sdata->pkt_max = pkt_max; + sdata->pkt_id = pkt_id; + sdata->datalen = pktlen - 9; + sdata->data = (char*)malloc(pktlen - 9); + memcpy(sdata->data, &rawpkt[9], pktlen - 9); - // Update the servers port - server->port = port; - } + /* combine_packets will call us recursively */ + return combine_packets(server); - // Add a rule noting the servers hostport - sprintf( arg, "%hu", port ); - add_rule( server, "hostport", arg, NO_FLAGS); + /* + fprintf( OF, "pkt_index %d pkt_max %d\n", pkt_index, pkt_max); + rawpkt+= 9; + pktlen-= 9; + */ } -} -STATIC void -players_set_teamname( struct qserver *server, int teamid, char *teamname ) -{ - struct player *player; - for ( player= server->players; player; player= player->next) + /* 'info' response */ + if (rawpkt[4] == 'C' || rawpkt[4] == 'm') { - if ( player->team == teamid ) + if (server->server_name != NULL) { - player->team_name = strdup( teamname ); + return 0; } - } -} + pkt = &rawpkt[5]; + server->address = strdup(pkt); + pkt += strlen(pkt) + 1; + server->server_name = strdup(pkt); + pkt += strlen(pkt) + 1; + server->map_name = strdup(pkt); + pkt += strlen(pkt) + 1; -STATIC char * -dup_nstring( const char *pkt, const char *end, char **next) -{ - char *pt = (char*)pkt; - int len= ((unsigned char*)pkt)[0]; - pt++; - if ( *pt == '\1') - { - len++; + if (*pkt) + { + add_rule(server, "gamedir", pkt, NO_FLAGS); + } + if (*pkt && strcmp(pkt, "valve") != 0) + { + server->game = add_rule(server, "game", pkt, NO_FLAGS)->value; + server->flags |= FLAG_DO_NOT_FREE_GAME; + } + pkt += strlen(pkt) + 1; + if (*pkt) + { + add_rule(server, "gamename", pkt, NO_FLAGS); + } + pkt += strlen(pkt) + 1; + + server->num_players = (unsigned int)pkt[0]; + server->max_players = (unsigned int)pkt[1]; + pkt += 2; + if (pkt < end) + { + int protocol = *((unsigned char*)pkt); + sprintf(number, "%d", protocol); + add_rule(server, "protocol", number, NO_FLAGS); + pkt++; + } + + if (rawpkt[4] == 'm') + { + if (*pkt == 'd') + { + add_rule(server, "sv_type", "dedicated", NO_FLAGS); + } + else if (*pkt == 'l') + { + add_rule(server, "sv_type", "listen", NO_FLAGS); + } + else + { + add_rule(server, "sv_type", "?", NO_FLAGS); + } + pkt++; + if (*pkt == 'w') + { + add_rule(server, "sv_os", "windows", NO_FLAGS); + } + else if (*pkt == 'l') + { + add_rule(server, "sv_os", "linux", NO_FLAGS); + } + else + { + char str[2] = "\0"; + str[0] = *pkt; + add_rule(server, "sv_os", str, NO_FLAGS); + } + pkt++; + add_rule(server, "sv_password", *pkt ? "1" : "0", NO_FLAGS); + pkt++; + add_rule(server, "mod", *pkt ? "1" : "0", NO_FLAGS); + if (*pkt) + { + int n; + /* pull out the mod infomation */ + pkt++; + add_rule(server, "mod_info_url", pkt, NO_FLAGS); + pkt += strlen(pkt) + 1; + if (*pkt) + { + add_rule(server, "mod_download_url", pkt, NO_FLAGS); + } + pkt += strlen(pkt) + 1; + if (*pkt) + { + add_rule(server, "mod_detail", pkt, NO_FLAGS); + } + pkt += strlen(pkt) + 1; + n = swap_long_from_little(pkt); + sprintf(number, "%d", n); + add_rule(server, "modversion", number, NO_FLAGS); + pkt += 4; + n = swap_long_from_little(pkt); + sprintf(number, "%d", n); + add_rule(server, "modsize", number, NO_FLAGS); + pkt += 4; + add_rule(server, "svonly", *pkt ? "1" : "0", NO_FLAGS); + pkt++; + add_rule(server, "cldll", *pkt ? "1" : "0", NO_FLAGS); + pkt++; + if (pkt < end) + { + add_rule(server, "secure", *pkt ? "1" : "0", NO_FLAGS); + } + } + } + + if (get_player_info && server->num_players) + { + int requests = server->n_requests; + server->next_player_info = server->num_players - 1; + send_player_request_packet(server); + server->n_requests = requests; // prevent wrong ping + } + if (get_server_rules) + { + int requests = server->n_requests; + server->next_rule = ""; + server->retry1 = n_retries; + send_rule_request_packet(server); + server->n_requests = requests; // prevent wrong ping + } + } + /* 'players' response */ + else if (rawpkt[4] == 'D' && server->players == NULL) + { + unsigned int n = 0, temp; + struct player *player; + struct player **last_player = &server->players; + if ((unsigned int)rawpkt[5] > server->num_players) + { + server->num_players = (unsigned int)rawpkt[5]; + } pkt = &rawpkt[6]; + rawpkt[pktlen] = '\0'; + while (1) + { + if (*pkt != n + 1) + { + break; + } + n++; + pkt++; + player = (struct player*)calloc(1, sizeof(struct player)); + player->name = strdup(pkt); + pkt += strlen(pkt) + 1; + memcpy(&player->frags, pkt, 4); + pkt += 4; + memcpy(&temp, pkt, 4); + pkt += 4; + if (big_endian) + { + player->frags = swap_long(&player->frags); + } + player->connect_time = swap_float_from_little(&temp); + *last_player = player; + last_player = &player->next; + } + if (n > server->num_players) + { + server->num_players = n; + } + server->next_player_info = server->num_players; + } + /* 'rules' response */ + else if (rawpkt[4] == 'E' && server->next_rule != NULL) + { + int n = 0; + n = ((unsigned char*)rawpkt)[5] + ((unsigned char*)rawpkt)[6] *256; + pkt = &rawpkt[7]; + while (n) + { + char *key = pkt; + char *value; + pkt += strlen(pkt) + 1; + if (pkt > end) + { + break; + } + value = pkt; + pkt += strlen(pkt) + 1; + if (pkt > end) + { + break; + } + if (key[0] == 's' && strcmp(key, "sv_password") == 0) + { + add_rule(server, key, value, CHECK_DUPLICATE_RULES); + } + else + { + add_rule(server, key, value, NO_FLAGS); + } + n--; + } + server->next_rule = NULL; } - if ( pt + len > end) - { - return NULL; + else if (rawpkt[4] != 'E' && rawpkt[4] != 'D' && rawpkt[4] != 'm' && rawpkt[4] != 'C' && show_errors) + { + /* if ( pkt_count) { rawpkt-= 9; pktlen+= 9; } */ + fprintf(stderr, "Odd packet from HL server %s (packet len %d)\n", server->arg, pktlen); + print_packet(server, rawpkt, pktlen); } - *next = pt+len; - return strndup( pt, len ); + return DONE_AUTO; } -STATIC char * -dup_n1string( char *pkt, char *end, char **next) -{ - unsigned len; - - if(!pkt || pkt >= end) - return NULL; - - len = (unsigned char)pkt[0]-1; - pkt++; - if ( pkt + len > end) - return NULL; - - *next= pkt+len; - return strndup( pkt, len); -} -STATIC int -pariah_basic_packet( struct qserver *server, char *rawpkt, char *end) +int deal_with_tribes_packet(struct qserver *server, char *rawpkt, int pktlen) { - char *next; - char *string; - change_server_port( server, swap_short_from_little( &rawpkt[14]), 0 ); - if ( NULL == ( string = ut2003_strdup( &rawpkt[18], end, &next) ) ) - { - return -1; - } - - if ( server->server_name == NULL) - { - server->server_name = string; - } - else - { - free(string); - } + unsigned char *pkt, *end; + int len, pnum, ping, packet_loss, n_teams, t; + struct player *player; + struct player **teams = NULL; + struct player **last_player = &server->players; + char buf[24]; - if ( NULL == ( string = ut2003_strdup( next, end, &next) ) ) - { - return -1; - } + debug( 2, "deal_with_tribes_packet %p, %d", server, pktlen ); - if ( server->map_name == NULL) - { - server->map_name = string; + if (server->server_name == NULL) + { + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - else - { - free(string); + else + { + gettimeofday(&server->packet_time1, NULL); } - if ( NULL == ( string= ut2003_strdup( next, end, &next) ) ) - { - return -1; + if (pktlen < sizeof(tribes_info_reponse)) + { + return PKT_ERROR; } - if ( server->game == NULL) - { - server->game = string; - add_rule( server, "gametype", server->game, NO_FLAGS | CHECK_DUPLICATE_RULES); - } - else - { - free(string); + if (strncmp(rawpkt, tribes_players_reponse, sizeof(tribes_players_reponse)) != 0) + { + return PKT_ERROR; } - server->num_players = (unsigned char)next[0]; - server->max_players = (unsigned char)next[1]; - - return 0; -} + pkt = (unsigned char*) &rawpkt[sizeof(tribes_info_reponse)]; -STATIC int -ut2003_basic_packet( struct qserver *server, char *rawpkt, char *end) -{ - char *next; - char *string; - change_server_port( server, swap_short_from_little( &rawpkt[6]), 0 ); + len = *pkt; /* game name: "Tribes" */ + add_nrule(server, "gamename", (char*)pkt + 1, len); + pkt += len + 1; + len = *pkt; /* version */ + add_nrule(server, "version", (char*)pkt + 1, len); + pkt += len + 1; + len = *pkt; /* server name */ + server->server_name = strndup((char*)pkt + 1, len); + pkt += len + 1; + add_rule(server, "dedicated", *pkt ? "1" : "0", NO_FLAGS); + pkt++; /* flag: dedicated server */ + add_rule(server, "needpass", *pkt ? "1" : "0", NO_FLAGS); + pkt++; /* flag: password on server */ + server->num_players = *pkt++; + server->max_players = *pkt++; - if ( NULL == ( string = ut2003_strdup( &rawpkt[14], end, &next) ) ) - { - return -1; - } + sprintf(buf, "%u", (unsigned int)pkt[0] + (unsigned int)pkt[1] *256); + add_rule(server, "cpu", buf, NO_FLAGS); + pkt++; /* cpu speed, lsb */ + pkt++; /* cpu speed, msb */ - if ( server->server_name == NULL) - { - server->server_name = string; - } - else - { - free(string); - } + len = *pkt; /* Mod (game) */ + add_nrule(server, "mods", (char*)pkt + 1, len); + pkt += len + 1; - if ( NULL == ( string = ut2003_strdup( next, end, &next) ) ) - { - return -1; - } + len = *pkt; /* game (mission): "C&H" */ + add_nrule(server, "game", (char*)pkt + 1, len); + pkt += len + 1; - if ( server->map_name == NULL) - { - server->map_name= string; - } - else - { - free(string); - } + len = *pkt; /* Mission (map) */ + server->map_name = strndup((char*)pkt + 1, len); + pkt += len + 1; - if ( NULL == ( string= ut2003_strdup( next, end, &next) ) ) - { - return -1; - } + len = *pkt; /* description (contains Admin: and Email: ) */ + debug( 2, "%.*s\n", len, pkt + 1); + pkt += len + 1; - if ( server->game == NULL) - { - server->game= string; - add_rule( server, "gametype", server->game, NO_FLAGS | CHECK_DUPLICATE_RULES); - } - else - { - free(string); + n_teams = *pkt++; /* number of teams */ + if (n_teams == 255) + { + return PKT_ERROR; } + sprintf(buf, "%d", n_teams); + add_rule(server, "numteams", buf, NO_FLAGS); - server->num_players= swap_long_from_little( next); - next+= 4; - server->max_players= swap_long_from_little( next); - return 0; -} + len = *pkt; /* first title */ + debug( 2, "%.*s\n", len, pkt + 1); + pkt += len + 1; -STATIC int -pariah_rule_packet( struct qserver *server, char *rawpkt, char *end ) -{ - char *key, *value; + len = *pkt; /* second title */ + debug( 2, "%.*s\n", len, pkt + 1); + pkt += len + 1; - unsigned char no_rules = (unsigned char)rawpkt[1]; - unsigned char seen = 0; + if (n_teams > 1) + { + teams = (struct player **)calloc(1, sizeof(struct player*) * n_teams); + for (t = 0; t < n_teams; t++) + { + teams[t] = (struct player*)calloc(1, sizeof(struct player)); + teams[t]->number = TRIBES_TEAM; + teams[t]->team = t; + len = *pkt; /* team name */ + teams[t]->name = strndup((char*)pkt + 1, len); + debug( 2, "team#0 <%.*s>\n", len, pkt + 1); + pkt += len + 1; - // type + no_rules - rawpkt+=2; + len = *pkt; /* team score */ + if (len > 2) + { + strncpy(buf, (char*)pkt + 1+3, len - 3); + buf[len - 3] = '\0'; + } + else + { + debug( 2, "%s score len %d\n", server->arg, len); + buf[0] = '\0'; + } + teams[t]->frags = atoi(buf); + debug( 2, "team#0 <%.*s>\n", len - 3, pkt + 1+3); + pkt += len + 1; + } + } + else + { + len = *pkt; /* DM team? */ + debug( 2, "%.*s\n", len, pkt + 1); + pkt += len + 1; + pkt++; + n_teams = 0; + } - // we get size encoded key = value pairs - while ( rawpkt < end && no_rules > seen ) - { - // first byte is the rule count - seen = (unsigned char)rawpkt[0]; - rawpkt++; - if ( NULL == ( key = ut2003_strdup( rawpkt, end, &rawpkt) ) ) + pnum = 0; + while ((char*)pkt < (rawpkt + pktlen)) + { + ping = (unsigned int) *pkt << 2; + pkt++; + packet_loss = *pkt; + pkt++; + debug( 2, "player#%d, team #%d\n", pnum, (int) *pkt); + pkt++; + len = *pkt; + if ((char*)pkt + len > (rawpkt + pktlen)) { break; } - - if ( '\0' == rawpkt[0] ) + player = (struct player*)calloc(1, sizeof(struct player)); + player->team = pkt[ - 1]; + if (n_teams && player->team < n_teams) { - value = strdup( "" ); - rawpkt++; + player->team_name = teams[player->team]->name; } - else if ( NULL == ( value = ut2003_strdup( rawpkt, end, &rawpkt) ) ) + else if (player->team == 255 && n_teams) { - break; + player->team_name = "Unknown"; } - - if ( NULL == add_rule( server, key, value, NO_KEY_COPY | NO_VALUE_COPY | COMBINE_VALUES ) ) + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + player->ping = ping; + player->packet_loss = packet_loss; + player->name = strndup((char*)pkt + 1, len); + debug( 2, "player#%d, name %.*s\n", pnum, len, pkt + 1); + pkt += len + 1; + len = *pkt; + debug( 2, "player#%d, info <%.*s>\n", pnum, len, pkt + 1); + end = (unsigned char*)strchr((char*)pkt + 9, 0x9); + if (end) { - /* duplicate, so free key and value */ - free(value); - free(key); + strncpy(buf, (char*)pkt + 9, end - (pkt + 9)); + buf[end - (pkt + 9)] = '\0'; + player->frags = atoi(buf); + debug( 2, "player#%d, score <%.*s>\n", pnum, (unsigned)(end - (pkt + 9)), pkt + 9); } - seen++; - } + *last_player = player; + last_player = &player->next; + + pkt += len + 1; + pnum++; + } - if ( no_rules == seen ) + for (t = n_teams; t;) { - // all done - server->next_rule = NULL; - return 1; + t--; + teams[t]->next = server->players; + server->players = teams[t]; } + free(teams); - return 0; + return DONE_AUTO; } -STATIC int -ut2003_rule_packet( struct qserver *server, char *rawpkt, char *end ) +void get_tribes2_player_type(struct player *player) { - char *key, *value; - int result= 0; - - // Packet Type - rawpkt++; - - // we get size encoded key = value pairs - while ( rawpkt < end ) - { - if ( NULL == ( key = ut2003_strdup( rawpkt, end, &rawpkt) ) ) - { - break; - } - - if ( NULL == ( value = ut2003_strdup( rawpkt, end, &rawpkt) ) ) + char *name = player->name; + for (; *name; name++) + { + switch (*name) { - break; + case 0x8: + player->type_flag = PLAYER_TYPE_NORMAL; + continue; + case 0xc: + player->type_flag = PLAYER_TYPE_ALIAS; + continue; + case 0xe: + player->type_flag = PLAYER_TYPE_BOT; + continue; + case 0xb: + break; + default: + continue; } - - if ( strcmp( key, "minplayers") == 0) + name++; + if (isprint(*name)) { - result = atoi(value); + char *n = name; + for (; isprint(*n); n++) + ; + player->tribe_tag = strndup(name, n - name); + name = n; } - - if ( NULL == add_rule( server, key, value, NO_KEY_COPY | NO_VALUE_COPY | COMBINE_VALUES ) ) + if (! *name) { - /* duplicate, so free key and value */ - free(value); - free(key); + break; } - } - - return result; + } } -char * -ut2003_strdup( const char *string, const char *end, char **next ) +int deal_with_tribes2_packet(struct qserver *server, char *pkt, int pktlen) { - unsigned char len = string[0]; - char *result = NULL; + char str[256], *pktstart = pkt, *term, *start; + unsigned int minimum_net_protocol, build_version, i, t, len, s, status; + unsigned int net_protocol; + unsigned short cpu_speed; + int n_teams = 0, n_players; + struct player **teams = NULL, *player; + struct player **last_player = &server->players; + int query_version; - if ( len < 128 ) + debug( 2, "deal_with_tribes2_packet %p, %d", server, pktlen ); + + pkt[pktlen] = '\0'; + + if (server->server_name == NULL) { - // type 1 string - //fprintf( stderr, "Type 1:" ); - result = dup_nstring( string, end, next ); + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } + /* else + gettimeofday( &server->packet_time1, NULL); + */ + + if (pkt[0] == TRIBES2_RESPONSE_PING) { - // type 2 string - //fprintf( stderr, "Type 2:\n" ); - const char *last; - char *resp, *pos; - // minus indicator - len -= 128; - // double byte chars so * 2 - len = len * 2; - last = string + len; - if ( last > end ) + if (pkt[6] < 4 || pkt[6] > 12 || strncmp(pkt + 7, "VER", 3) != 0) { - *next = (char*)end; - fprintf( stderr, "Type 2 string format error ( too short )\n" ); - return NULL; + return PKT_ERROR; } - *next = (char*)last+1; - if ( NULL == ( result = (char*)calloc( last - string, sizeof(char) ) ) ) - { - fprintf( stderr, "Failed to malloc string memory\n" ); - return NULL; - } - resp = result; - pos = (char*)string + 1; - while ( pos <= last ) - { - // check for a color code - if ( pos + 6 <= last && 0 == memcmp( pos, "^\0#\0", 4 ) ) - { - // we have a color code - //fprintf( stderr, "color:%02hhx%02hhx\n", pos[4], pos[5] ); - // indicator transformed to ^\1 - *resp = *pos; - resp++; - pos++; - *resp = '\1'; - resp++; - pos+=3; - // color byte - *resp = *pos; - resp++; - pos+=2; - //pos += 6; - } + strncpy(str, pkt + 10, pkt[6] - 3); + str[pkt[6] - 3] = '\0'; + query_version = atoi(str); + add_nrule(server, "queryversion", pkt + 7, pkt[6]); + pkt += 7+pkt[6]; - // standard char - //fprintf( stderr, "char: %02hhx\n", *pos ); - *resp = *pos; - resp++; - pos += 2; + server->protocol_version = query_version; + if (query_version != 3 && query_version != 5) + { + server->server_name = strdup("Unknown query version"); + return PKT_ERROR; } - } - - //fprintf( stderr, "'%s'\n", result ); - - return result; -} - - -STATIC int -pariah_player_packet( struct qserver *server, char *rawpkt, char *end) -{ - unsigned char no_players = rawpkt[1]; - unsigned char seen = 0; /* XXX: cannot work this way, it takes only - this packet into consideration. What if - player info is spread across multiple - packets? */ - - // type + no_players + some unknown preamble - rawpkt += 3; - while ( rawpkt < end && seen < no_players ) - { - struct player *player; - - // Player Number - rawpkt += 4; - // Create a player - if ( NULL == ( player = add_player( server, server->n_player_info ) ) ) + if (query_version == 5) { - return 0; + net_protocol = swap_long_from_little(pkt); + sprintf(str, "%u", net_protocol); + add_rule(server, "net_protocol", str, NO_FLAGS); + pkt += 4; } + minimum_net_protocol = swap_long_from_little(pkt); + sprintf(str, "%u", minimum_net_protocol); + add_rule(server, "minimum_net_protocol", str, NO_FLAGS); + pkt += 4; + build_version = swap_long_from_little(pkt); + sprintf(str, "%u", build_version); + add_rule(server, "build_version", str, NO_FLAGS); + pkt += 4; - // Name ( min 3 bytes ) - player->name = ut2003_strdup( rawpkt, end, &rawpkt ); - - // Ping - player->ping = swap_long_from_little( rawpkt ); - rawpkt += 4; - - // Frags - player->frags = (unsigned char)rawpkt[0]; - rawpkt++; - - // unknown - rawpkt++; + server->server_name = strndup(pkt + 1, *(unsigned char*)(pkt)); - seen++; + /* Always send the player request because the ping packet + * contains very little information */ + send_player_request_packet(server); + return 0; } - - if ( no_players == seen ) + else if (pkt[0] != TRIBES2_RESPONSE_INFO) { - // all done - server->num_players = server->n_player_info; - return 1; + return PKT_ERROR; } - // possibly more to come - - return 0; -} + pkt += 6; + for (i = 0; i < *(unsigned char*)pkt; i++) + if (!isprint(pkt[i + 1])) + { + return PKT_ERROR; + } + add_nrule(server, server->type->game_rule, pkt + 1, *(unsigned char*)pkt); + server->game = strndup(pkt + 1, *(unsigned char*)pkt); + pkt += *pkt + 1; + add_nrule(server, "mission", pkt + 1, *(unsigned char*)pkt); + pkt += *pkt + 1; + server->map_name = strndup(pkt + 1, *(unsigned char*)pkt); + pkt += *pkt + 1; -STATIC int -ut2003_player_packet( struct qserver *server, char *rawpkt, char *end) -{ - // skip type - rawpkt++; - switch ( server->protocol_version ) + status = *(unsigned char*)pkt; + sprintf(str, "%u", status); + add_rule(server, "status", str, NO_FLAGS); + if (status &TRIBES2_STATUS_DEDICATED) + { + add_rule(server, "dedicated", "1", NO_FLAGS); + } + if (status &TRIBES2_STATUS_PASSWORD) + { + add_rule(server, "password", "1", NO_FLAGS); + } + if (status &TRIBES2_STATUS_LINUX) + { + add_rule(server, "linux", "1", NO_FLAGS); + } + if (status &TRIBES2_STATUS_TEAMDAMAGE) + { + add_rule(server, "teamdamage", "1", NO_FLAGS); + } + if (server->protocol_version == 3) { - case 0x7e: - // XMP packet - //fprintf( stderr, "XMP packet\n" ); - while ( rawpkt < end ) + if (status &TRIBES2_STATUS_TOURNAMENT_VER3) { - struct player *player; - char *var, *val; - unsigned char no_props; - if ( rawpkt + 24 > end ) - { - malformed_packet( server, "player info too short" ); - rawpkt = end; - return 1; - } - - // Player Number never set - rawpkt += 4; - - // Player ID never set - rawpkt += 4; - - if ( NULL == ( player = add_player( server, server->n_player_info ) ) ) - { - return 0; - } - - // Name ( min 3 bytes ) - player->name = ut2003_strdup( rawpkt, end, &rawpkt ); - - // Ping - player->ping = swap_long_from_little( rawpkt ); - rawpkt += 4; - - // Frags - player->frags = swap_long_from_little( rawpkt ); - rawpkt += 4; - - // Stat ID never set - rawpkt += 4; - - // Player properties - no_props = rawpkt[0]; - //fprintf( stderr, "noprops %d\n", no_props ); - rawpkt++; - while( rawpkt < end && no_props > 0 ) - { - if ( NULL == ( var = ut2003_strdup( rawpkt, end, &rawpkt ) ) ) - { - break; - } - if ( NULL == ( val = ut2003_strdup( rawpkt, end, &rawpkt ) ) ) - { - break; - } - //fprintf( stderr, "attrib: %s = %s\n", var, val ); - - // Things we can use - if ( 0 == strcmp( var, "team" ) ) - { - player->team_name = val; - } - else if ( 0 == strcmp( var, "class" ) ) - { - player->skin = val; - } - else - { - free( val ); - } - - free( var ); - no_props--; - } + add_rule(server, "tournament", "1", NO_FLAGS); + } + if (status &TRIBES2_STATUS_NOALIAS_VER3) + { + add_rule(server, "no_aliases", "1", NO_FLAGS); + } + } + else + { + if (status &TRIBES2_STATUS_TOURNAMENT) + { + add_rule(server, "tournament", "1", NO_FLAGS); } - break; - default: - while ( rawpkt < end ) + if (status &TRIBES2_STATUS_NOALIAS) { - struct player *player; - - if(rawpkt+4 > end) - { - malformed_packet(server, "player packet too short"); - return 1; - } - - if ( NULL == ( player = add_player( server, swap_long_from_little(rawpkt) ) ) ) - { - return 0; - } - - player->name = ut2003_strdup( rawpkt+4, end, &rawpkt ); - if(rawpkt+8 > end) - { - malformed_packet(server, "player packet too short"); - return 1; - } - player->ping = swap_long_from_little(rawpkt); - rawpkt+= 4; - player->frags = swap_long_from_little(rawpkt); - rawpkt+= 4; - { - unsigned team = swap_long_from_little(rawpkt); - rawpkt+= 4; - player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - if(team & 1<<29) - player->team_name = "red"; - else if(team & 1<<30) - player->team_name = "blue"; - } + add_rule(server, "no_aliases", "1", NO_FLAGS); } } + pkt++; + server->num_players = *(unsigned char*)pkt; + pkt++; + server->max_players = *(unsigned char*)pkt; + pkt++; + sprintf(str, "%u", *(unsigned char*)pkt); + add_rule(server, "bot_count", str, NO_FLAGS); + pkt++; + cpu_speed = swap_short_from_little(pkt); + sprintf(str, "%hu", cpu_speed); + add_rule(server, "cpu_speed", str, NO_FLAGS); + pkt += 2; - return 0; -} - - -char * -get_rule( struct qserver *server, char *name) -{ - struct rule *rule; - rule= server->rules; - for ( ; rule != NULL; rule= rule->next) { - if ( strcmp( name, rule->name) == 0) - return rule->value; - } - return NULL; -} + if (strcmp(server->server_name, "VER3") == 0) + { + free(server->server_name); + server->server_name = strndup(pkt + 1, *(unsigned char*)pkt); + } + else + { + add_nrule(server, "info", pkt + 1, *(unsigned char*)pkt); + } -void -deal_with_ut2003_packet( struct qserver *server, char *rawpkt, int pktlen) -{ + pkt += *(unsigned char*)pkt + 1; + len = swap_short_from_little(pkt); + pkt += 2; + start = pkt; + if (len + (pkt - pktstart) > pktlen) + { + len -= (len + (pkt - pktstart)) - pktlen; + } - // For protocol spec see: - // http://unreal.student.utwente.nl/UT2003-queryspec.html + if (len == 0 || pkt - pktstart >= pktlen) + { + goto info_done; + } - char *end; - int error = 0, before; - unsigned int packet_header; + term = strchr(pkt, 0xa); + if (!term) + { + goto info_done; + } + *term = '\0'; + n_teams = atoi(pkt); + sprintf(str, "%d", n_teams); + add_rule(server, "numteams", str, NO_FLAGS); + pkt = term + 1; - rawpkt[pktlen]= '\0'; - end = &rawpkt[pktlen]; + if (pkt - pktstart >= pktlen) + { + goto info_done; + } - packet_header = swap_long_from_little( &rawpkt[0] ); - rawpkt += 4; + teams = (struct player **)calloc(1, sizeof(struct player*) * n_teams); + for (t = 0; t < n_teams; t++) + { + teams[t] = (struct player*)calloc(1, sizeof(struct player)); + teams[t]->number = TRIBES_TEAM; + teams[t]->team = t; + /* team name */ + term = strchr(pkt, 0x9); + if (!term) + { + n_teams = t; + goto info_done; + } teams[t]->name = strndup(pkt, term - pkt); + pkt = term + 1; + term = strchr(pkt, 0xa); + if (!term) + { + n_teams = t; + goto info_done; + } + *term = '\0'; + teams[t]->frags = atoi(pkt); + pkt = term + 1; + if (pkt - pktstart >= pktlen) + { + goto info_done; + } + } - server->protocol_version = packet_header; - if ( - packet_header != 0x77 // Pariah Demo? - && packet_header != 0x78 // UT2003 Demo - && packet_header != 0x79 // UT2003 Retail - && packet_header != 0x7e // Unreal2 XMP - && packet_header != 0x7f // UT2004 Demo - && packet_header != 0x80 // UT2004 Retail - ) + term = strchr(pkt, 0xa); + if (!term || term - start >= len) { - malformed_packet(server, "Unknown type 0x%x", packet_header); + goto info_done; } + *term = '\0'; + n_players = atoi(pkt); + pkt = term + 1; - switch( rawpkt[0] ) + for (i = 0; i < n_players && pkt - start < len; i++) { - case 0x00: - // Server info - if ( server->server_name == NULL ) + pkt++; /* skip first byte (0x10) */ + if (pkt - start >= len) + { + break; + } + player = (struct player*)calloc(1, sizeof(struct player)); + term = strchr(pkt, 0x11); + if (!term || term - start >= len) + { + free(player); + break; + } player->name = strndup(pkt, term - pkt); + get_tribes2_player_type(player); + pkt = term + 1; + pkt++; /* skip 0x9 */ + if (pkt - start >= len) { - server->ping_total+= time_delta( &packet_recv_time, &server->packet_time1); + break; } - - error = ut2003_basic_packet( server, rawpkt, end ); - if ( ! error ) + term = strchr(pkt, 0x9); + if (!term || term - start >= len) + { + free(player->name); + free(player); + break; + } + for (t = 0; t < n_teams; t++) { - if(get_server_rules || get_player_info) + if (term - pkt == strlen(teams[t]->name) && strncmp(pkt, teams[t]->name, term - pkt) == 0) { - int requests = server->n_requests; - server->next_rule = ""; - server->retry1 = n_retries; - server->retry2 = 0; // don't wait for player packet - send_rule_request_packet( server); - server->n_requests = requests; // would produce wrong ping + break; } } - break; - - case 0x01: - // Game info - ut2003_rule_packet( server, rawpkt, end ); - server->next_rule = ""; - server->retry1 = 0; /* we received at least one rule packet so - no need to retry. We'd get double - entries otherwise. */ - break; - - case 0x02: - // Player info - before = server->n_player_info; - error = ut2003_player_packet( server, rawpkt, end); - if (before == server->n_player_info ) + if (t == n_teams) { - error = 1; + player->team = - 1; + player->team_name = "Unassigned"; } - break; - - case 0x10: - // Pariah Server info - if ( server->server_name == NULL ) + else { - server->ping_total+= time_delta( &packet_recv_time, &server->packet_time1); + player->team = t; + player->team_name = teams[t]->name; } - - error = pariah_basic_packet( server, rawpkt, end ); - if ( ! error ) + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + pkt = term + 1; + for (s = 0; *pkt != 0xa && pkt - start < len; pkt++) { - // N.B. pariah always sends a rules and players packet - int requests = server->n_requests; - server->next_rule = ""; - server->retry1 = n_retries; - server->retry2 = 0; - server->n_requests = requests; // would produce wrong ping + str[s++] = *pkt; } - break; - - case 0x11: - // Game info - pariah_rule_packet( server, rawpkt, end ); - server->retry1 = 0; /* we received at least one rule packet so - no need to retry. We'd get double - entries otherwise. */ - break; - - case 0x12: - // Player info - before = server->n_player_info; - pariah_player_packet( server, rawpkt, end ); - if ( before == server->n_player_info ) + str[s] = '\0'; + player->frags = atoi(str); + if (*pkt == 0xa) { - error = 1; + pkt++; } - break; - - default: - malformed_packet(server, "Unknown packet type 0x%x", (unsigned)rawpkt[0]); - break; + *last_player = player; + last_player = &player->next; } - /* don't cleanup if we fetch server rules. We would lose - * rule packets as we don't know how many we get - * We do clean up if we don't fetch server rules so we don't - * need to wait for timeout. - */ - if (error - || (!get_server_rules && !get_player_info) - || (!get_server_rules && server->num_players == server->n_player_info) - || (server->next_rule == NULL && server->num_players == server->n_player_info)) +info_done: + for (t = n_teams; t;) { - cleanup_qserver( server, 1 ); + t--; + teams[t]->next = server->players; + server->players = teams[t]; + } + if (teams) + { + free(teams); } -} -int -deal_with_unrealmaster_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - if ( pktlen == 0) { - cleanup_qserver( server, 1); - return 0; - } - print_packet( server, rawpkt, pktlen); - puts( "--"); - return 0; + return DONE_FORCE; } -/* Returns 1 if the query is done (server may be freed) and 0 if not. - */ -int -deal_with_halflife_packet( struct qserver *server, char *rawpkt, int pktlen) +static const char GrPacketHead[] = { - char *pkt; - char *end= &rawpkt[pktlen]; - int pkt_index= 0, pkt_max= 0; - char number[16]; - short pkt_id; - - if ( server->server_name == NULL) - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); - - if ( pktlen < 5) - return cleanup_qserver( server, 1); - - if ( ((rawpkt[0] != '\377' && rawpkt[0] != '\376') || rawpkt[1] != '\377' || - rawpkt[2] != '\377' || rawpkt[3] != '\377') && show_errors) { - unsigned int ipaddr= ntohl(server->ipaddr); - fprintf( stderr, - "Odd packet from server %d.%d.%d.%d:%hu, processing ...\n", - (ipaddr>>24)&0xff, (ipaddr>>16)&0xff, - (ipaddr>>8)&0xff, ipaddr&0xff, ntohs(server->port)); - print_packet( server, rawpkt, pktlen); - } - - if ( ((unsigned char*)rawpkt)[0] == 0xfe) { - SavedData *sdata; - pkt_index= ((unsigned char*)rawpkt)[8] >> 4; - pkt_max= ((unsigned char*)rawpkt)[8] & 0xf; - memcpy( &pkt_id, &rawpkt[4], 2); - - if ( server->saved_data.data == NULL) - sdata= & server->saved_data; - else { - sdata= (SavedData*) calloc( 1, sizeof(SavedData)); - sdata->next= server->saved_data.next; - server->saved_data.next= sdata; - } - - sdata->pkt_index= pkt_index; - sdata->pkt_max= pkt_max; - sdata->pkt_id= pkt_id; - sdata->datalen= pktlen-9; - sdata->data= (char*) malloc( pktlen-9); - memcpy( sdata->data, &rawpkt[9], pktlen-9); - - /* combine_packets will call us recursively */ - return combine_packets( server); - -/* -fprintf( OF, "pkt_index %d pkt_max %d\n", pkt_index, pkt_max); - rawpkt+= 9; - pktlen-= 9; -*/ - } - - /* 'info' response */ - if ( rawpkt[4] == 'C' || rawpkt[4] == 'm') { - if ( server->server_name != NULL) - return 0; - pkt= &rawpkt[5]; - server->address= strdup( pkt); - pkt+= strlen(pkt)+1; - server->server_name= strdup( pkt); - pkt+= strlen(pkt)+1; - server->map_name= strdup( pkt); - pkt+= strlen(pkt)+1; - - if ( *pkt) - add_rule( server, "gamedir", pkt, NO_FLAGS); - if ( *pkt && strcmp( pkt, "valve") != 0) { - server->game= add_rule( server, "game", pkt, NO_FLAGS)->value; - server->flags |= FLAG_DO_NOT_FREE_GAME; - } - pkt+= strlen(pkt)+1; - if ( *pkt) - add_rule( server, "gamename", pkt, NO_FLAGS); - pkt+= strlen(pkt)+1; - - server->num_players= (unsigned int)pkt[0]; - server->max_players= (unsigned int)pkt[1]; - pkt+= 2; - if ( pkt < end) { - int protocol= *((unsigned char *)pkt); - sprintf( number, "%d", protocol); - add_rule( server, "protocol", number, NO_FLAGS); - pkt++; - } - - if ( rawpkt[4] == 'm') { - if ( *pkt == 'd') - add_rule( server, "sv_type", "dedicated", NO_FLAGS); - else if ( *pkt == 'l') - add_rule( server, "sv_type", "listen", NO_FLAGS); - else - add_rule( server, "sv_type", "?", NO_FLAGS); - pkt++; - if ( *pkt == 'w') - add_rule( server, "sv_os", "windows", NO_FLAGS); - else if ( *pkt == 'l') - add_rule( server, "sv_os", "linux", NO_FLAGS); - else { - char str[2]= "\0"; - str[0]= *pkt; - add_rule( server, "sv_os", str, NO_FLAGS); - } - pkt++; - add_rule( server, "sv_password", *pkt ? "1" : "0", NO_FLAGS); - pkt++; - add_rule( server, "mod", *pkt ? "1" : "0", NO_FLAGS); - if ( *pkt) { - int n; - /* pull out the mod infomation */ - pkt++; - add_rule( server, "mod_info_url", pkt, NO_FLAGS); - pkt+= strlen( pkt)+1; - if ( *pkt) - add_rule( server, "mod_download_url", pkt, NO_FLAGS); - pkt+= strlen( pkt)+1; - if ( *pkt) - add_rule( server, "mod_detail", pkt, NO_FLAGS); - pkt+= strlen( pkt)+1; - n= swap_long_from_little( pkt); - sprintf( number, "%d", n); - add_rule( server, "modversion", number, NO_FLAGS); - pkt+= 4; - n= swap_long_from_little( pkt); - sprintf( number, "%d", n); - add_rule( server, "modsize", number, NO_FLAGS); - pkt+= 4; - add_rule( server, "svonly", *pkt ? "1" : "0", NO_FLAGS); - pkt++; - add_rule( server, "cldll", *pkt ? "1" : "0", NO_FLAGS); - pkt++; - if ( pkt < end) - add_rule( server, "secure", *pkt ? "1" : "0", NO_FLAGS); - } - } - - if ( get_player_info && server->num_players) { - int requests = server->n_requests; - server->next_player_info= server->num_players-1; - send_player_request_packet( server); - server->n_requests = requests; // prevent wrong ping - } - if ( get_server_rules) { - int requests = server->n_requests; - server->next_rule= ""; - server->retry1= n_retries; - send_rule_request_packet( server); - server->n_requests = requests; // prevent wrong ping - } - } - /* 'players' response */ - else if ( rawpkt[4] == 'D' && server->players == NULL) { - unsigned int n= 0, temp; - struct player *player; - struct player **last_player= & server->players; - if ( (unsigned int)rawpkt[5] > server->num_players) - server->num_players= (unsigned int)rawpkt[5]; - pkt= &rawpkt[6]; - rawpkt[pktlen]= '\0'; - while (1) { - if ( *pkt != n+1) - break; - n++; - pkt++; - player= (struct player*) calloc( 1, sizeof(struct player)); - player->name= strdup( pkt); - pkt+= strlen(pkt)+1; - memcpy( &player->frags, pkt, 4); - pkt+= 4; - memcpy( &temp, pkt, 4); - pkt+= 4; - if ( big_endian) { - player->frags= swap_long( &player->frags); - } - player->connect_time= swap_float_from_little(&temp); - *last_player= player; - last_player= & player->next; - } - if ( n > server->num_players) - server->num_players= n; - server->next_player_info= server->num_players; - } - /* 'rules' response */ - else if ( rawpkt[4] == 'E' && server->next_rule != NULL) { - int n= 0; - n= ((unsigned char*)rawpkt)[5] + ((unsigned char *)rawpkt)[6]*256; - pkt= &rawpkt[7]; - while ( n) { - char *key= pkt; - char *value; - pkt+= strlen(pkt)+1; - if ( pkt > end) - break; - value= pkt; - pkt+= strlen(pkt)+1; - if ( pkt > end) - break; - if ( key[0] == 's' && strcmp( key, "sv_password") == 0) - add_rule( server, key, value, CHECK_DUPLICATE_RULES); - else - add_rule( server, key, value, NO_FLAGS); - n--; - } - server->next_rule= NULL; - } - else if ( rawpkt[4] != 'E' && rawpkt[4] != 'D' && rawpkt[4] != 'm' && - rawpkt[4] != 'C' && show_errors) { -/* if ( pkt_count) { rawpkt-= 9; pktlen+= 9; } */ - fprintf( stderr, "Odd packet from HL server %s (packet len %d)\n", - server->arg, pktlen); - print_packet( server, rawpkt, pktlen); - } - - return cleanup_qserver( server, 0); -} - - -static int tribes_debug= 0; - -void -deal_with_tribes_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - unsigned char *pkt, *end; - int len, pnum, ping, packet_loss, n_teams, t; - struct player *player; - struct player **teams= NULL; - struct player **last_player= & server->players; - char buf[24]; - - if ( server->server_name == NULL) - { - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); - } - else - { - gettimeofday( &server->packet_time1, NULL); - } - - if ( pktlen < sizeof( tribes_info_reponse)) - { - cleanup_qserver( server, 1); - return; - } - - if ( strncmp( rawpkt, tribes_players_reponse, - sizeof( tribes_players_reponse)) != 0) - { - cleanup_qserver( server, 1); - return; - } - - pkt= (unsigned char*) &rawpkt[sizeof( tribes_info_reponse)]; - - len= *pkt; /* game name: "Tribes" */ - add_nrule( server, "gamename", (char*)pkt+1, len); - pkt+= len+1; - len= *pkt; /* version */ - add_nrule( server, "version", (char*)pkt+1, len); - pkt+= len+1; - len= *pkt; /* server name */ - server->server_name= strndup( (char*)pkt+1, len); - pkt+= len+1; - add_rule( server, "dedicated", *pkt?"1":"0", NO_FLAGS); - pkt++; /* flag: dedicated server */ - add_rule( server, "needpass", *pkt?"1":"0", NO_FLAGS); - pkt++; /* flag: password on server */ - server->num_players= *pkt++; - server->max_players= *pkt++; - - sprintf( buf, "%u", (unsigned int)pkt[0] + (unsigned int)pkt[1]*256); - add_rule( server, "cpu", buf, NO_FLAGS); - pkt++; /* cpu speed, lsb */ - pkt++; /* cpu speed, msb */ - - len= *pkt; /* Mod (game) */ - add_nrule( server, "mods", (char*)pkt+1, len); - pkt+= len+1; - - len= *pkt; /* game (mission): "C&H" */ - add_nrule( server, "game", (char*)pkt+1, len); - pkt+= len+1; - - len= *pkt; /* Mission (map) */ - server->map_name= strndup( (char*)pkt+1, len); - pkt+= len+1; - - len= *pkt; /* description (contains Admin: and Email: ) */ -if ( tribes_debug) printf( "%.*s\n", len, pkt+1); - pkt+= len+1; - - n_teams= *pkt++; /* number of teams */ - if ( n_teams == 255) { - cleanup_qserver( server, 1); - return; - } - sprintf( buf, "%d", n_teams); - add_rule( server, "numteams", buf, NO_FLAGS); - - len= *pkt; /* first title */ -if ( tribes_debug) printf( "%.*s\n", len, pkt+1); - pkt+= len+1; - - len= *pkt; /* second title */ -if ( tribes_debug) printf( "%.*s\n", len, pkt+1); - pkt+= len+1; - - if ( n_teams > 1) { - teams= (struct player**) calloc( 1, sizeof(struct player*) * n_teams); - for ( t= 0; t < n_teams; t++) { - teams[t]= (struct player*) calloc(1, sizeof(struct player)); - teams[t]->number= TRIBES_TEAM; - teams[t]->team= t; - len= *pkt; /* team name */ - teams[t]->name= strndup( (char*)pkt+1, len); -if ( tribes_debug) printf( "team#0 <%.*s>\n", len, pkt+1); - pkt+= len+1; - - len= *pkt; /* team score */ -if ( len <= 2 && tribes_debug) printf( "%s score len %d\n", server->arg, len); - if ( len > 2) { - strncpy( buf, (char*)pkt+1+3, len-3); - buf[len-3]= '\0'; - } - else - buf[0]= '\0'; - teams[t]->frags= atoi( buf); -if ( tribes_debug) printf( "team#0 <%.*s>\n", len-3, pkt+1+3); - pkt+= len+1; - } - } - else { - len= *pkt; /* DM team? */ -if ( tribes_debug) printf( "%.*s\n", len, pkt+1); - pkt+= len+1; - pkt++; - n_teams= 0; - } - - pnum= 0; - while ( (char*)pkt < (rawpkt+pktlen)) { - ping= (unsigned int)*pkt << 2; - pkt++; - packet_loss= *pkt; - pkt++; -if ( tribes_debug) printf( "player#%d, team #%d\n", pnum, (int)*pkt); - pkt++; - len= *pkt; - if ( (char*)pkt+len > (rawpkt+pktlen)) - break; - player= (struct player*) calloc( 1, sizeof(struct player)); - player->team= pkt[-1]; - if ( n_teams && player->team < n_teams) - player->team_name= teams[player->team]->name; - else if ( player->team == 255 && n_teams) - player->team_name= "Unknown"; - player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - player->ping= ping; - player->packet_loss= packet_loss; - player->name= strndup( (char*)pkt+1, len); -if ( tribes_debug) printf( "player#%d, name %.*s\n", pnum, len, pkt+1); - pkt+= len+1; - len= *pkt; -if ( tribes_debug) printf( "player#%d, info <%.*s>\n", pnum, len, pkt+1); - end= (unsigned char*) strchr( (char*)pkt+9, 0x9); - if ( end) { - strncpy( buf, (char*)pkt+9, end-(pkt+9)); - buf[end-(pkt+9)]= '\0'; - player->frags= atoi( buf); -if ( tribes_debug) printf( "player#%d, score <%.*s>\n", pnum, (unsigned)(end-(pkt+9)), pkt+9); - } - *last_player= player; - last_player= & player->next; - - pkt+= len+1; - pnum++; - } - - for ( t= n_teams; t;) { - t--; - teams[t]->next= server->players; - server->players= teams[t]; - } - free( teams); - - cleanup_qserver( server, 0); -} - -void -get_tribes2_player_type( struct player *player) -{ - char *name= player->name; - for ( ; *name; name++) { - switch ( *name) { - case 0x8: player->type_flag= PLAYER_TYPE_NORMAL; continue; - case 0xc: player->type_flag= PLAYER_TYPE_ALIAS; continue; - case 0xe: player->type_flag= PLAYER_TYPE_BOT; continue; - case 0xb: break; - default: continue; - } - name++; - if ( isprint( *name)) { - char *n= name; - for ( ; isprint(*n); n++) - ; - player->tribe_tag= strndup( name, n-name); - name= n; - } - if ( !*name) - break; - } -} - -void -deal_with_tribes2_packet( struct qserver *server, char *pkt, int pktlen) -{ - char str[256], *pktstart= pkt, *term, *start; - unsigned int minimum_net_protocol, build_version, i, t, len, s, status; - unsigned int net_protocol; - unsigned short cpu_speed; - int n_teams= 0, n_players; - struct player **teams= NULL, *player; - struct player **last_player= & server->players; - int query_version; - - pkt[pktlen]= '\0'; - - if ( server->server_name == NULL) - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); -/* - else - gettimeofday( &server->packet_time1, NULL); -*/ - - if ( pkt[0] == TRIBES2_RESPONSE_PING) { - if ( pkt[6] < 4 || pkt[6] > 12 || strncmp( pkt+7, "VER", 3) != 0) { - cleanup_qserver( server, 1); - return; - } - strncpy( str, pkt+10, pkt[6]-3); - str[ pkt[6]-3]= '\0'; - query_version= atoi( str); - add_nrule(server,"queryversion", pkt+7, pkt[6]); - pkt+= 7 + pkt[6]; - - server->protocol_version= query_version; - if ( query_version != 3 && query_version != 5) { - server->server_name= strdup( "Unknown query version"); - cleanup_qserver( server, 1); - return; - } - - if ( query_version == 5) { - net_protocol= swap_long_from_little( pkt); - sprintf( str, "%u", net_protocol); - add_rule(server,"net_protocol",str, NO_FLAGS); - pkt+= 4; - } - minimum_net_protocol= swap_long_from_little( pkt); - sprintf( str, "%u", minimum_net_protocol); - add_rule(server,"minimum_net_protocol",str, NO_FLAGS); - pkt+= 4; - build_version= swap_long_from_little( pkt); - sprintf( str, "%u", build_version); - add_rule(server,"build_version",str, NO_FLAGS); - pkt+= 4; - - server->server_name= strndup( pkt+1, *(unsigned char*)(pkt)); - - /* Always send the player request because the ping packet - * contains very little information */ - send_player_request_packet(server); - return; - } - else if ( pkt[0] != TRIBES2_RESPONSE_INFO) { - cleanup_qserver( server, 1); - return; - } - - pkt+= 6; - for ( i= 0; i < *(unsigned char *)pkt; i++) - if ( !isprint(pkt[i+1])) { - cleanup_qserver( server, 1); - return; - } - add_nrule( server, server->type->game_rule, pkt+1, *(unsigned char *)pkt); - server->game= strndup( pkt+1, *(unsigned char *)pkt); - pkt+= *pkt + 1; - add_nrule( server, "mission", pkt+1, *(unsigned char *)pkt); - pkt+= *pkt + 1; - server->map_name= strndup( pkt+1, *(unsigned char *)pkt); - pkt+= *pkt + 1; - - status= *(unsigned char *)pkt; - sprintf( str, "%u", status); - add_rule( server, "status", str, NO_FLAGS); - if ( status & TRIBES2_STATUS_DEDICATED) - add_rule( server, "dedicated", "1", NO_FLAGS); - if ( status & TRIBES2_STATUS_PASSWORD) - add_rule( server, "password", "1", NO_FLAGS); - if ( status & TRIBES2_STATUS_LINUX) - add_rule( server, "linux", "1", NO_FLAGS); - if ( status & TRIBES2_STATUS_TEAMDAMAGE) - add_rule( server, "teamdamage", "1", NO_FLAGS); - if ( server->protocol_version == 3) { - if ( status & TRIBES2_STATUS_TOURNAMENT_VER3) - add_rule( server, "tournament", "1", NO_FLAGS); - if ( status & TRIBES2_STATUS_NOALIAS_VER3) - add_rule( server, "no_aliases", "1", NO_FLAGS); - } - else { - if ( status & TRIBES2_STATUS_TOURNAMENT) - add_rule( server, "tournament", "1", NO_FLAGS); - if ( status & TRIBES2_STATUS_NOALIAS) - add_rule( server, "no_aliases", "1", NO_FLAGS); - } - pkt++; - server->num_players= *(unsigned char *)pkt; - pkt++; - server->max_players= *(unsigned char *)pkt; - pkt++; - sprintf( str, "%u", *(unsigned char *)pkt); - add_rule( server, "bot_count", str, NO_FLAGS); - pkt++; - cpu_speed= swap_short_from_little( pkt); - sprintf( str, "%hu", cpu_speed); - add_rule( server, "cpu_speed", str, NO_FLAGS); - pkt+= 2; - - if ( strcmp( server->server_name, "VER3") == 0) { - free( server->server_name); - server->server_name= strndup( pkt+1, *(unsigned char*)pkt); - } - else - add_nrule( server, "info", pkt+1, *(unsigned char*)pkt); - - pkt+= *(unsigned char*)pkt + 1; - len= swap_short_from_little( pkt); - pkt+= 2; - start= pkt; - if ( len+(pkt-pktstart) > pktlen) - len-= (len+(pkt-pktstart)) - pktlen; - - if ( len == 0 || pkt-pktstart >= pktlen) goto info_done; - - term= strchr( pkt, 0xa); - if ( !term) goto info_done; - *term= '\0'; - n_teams= atoi( pkt); - sprintf( str, "%d", n_teams); - add_rule( server, "numteams", str, NO_FLAGS); - pkt= term + 1; - - if ( pkt-pktstart >= pktlen) goto info_done; - - teams= (struct player**) calloc( 1, sizeof(struct player*) * n_teams); - for ( t= 0; t < n_teams; t++) { - teams[t]= (struct player*) calloc(1, sizeof(struct player)); - teams[t]->number= TRIBES_TEAM; - teams[t]->team= t; - /* team name */ - term= strchr( pkt, 0x9); - if ( !term) { n_teams= t; goto info_done; } - teams[t]->name= strndup( pkt, term-pkt); - pkt= term+1; - term= strchr( pkt, 0xa); - if ( !term) { n_teams= t; goto info_done; } - *term='\0'; - teams[t]->frags= atoi(pkt); - pkt= term+1; - if ( pkt-pktstart >= pktlen) goto info_done; - } - - term= strchr( pkt, 0xa); - if ( !term || term-start >= len) goto info_done; - *term= '\0'; - n_players= atoi( pkt); - pkt= term + 1; - - for ( i= 0; i < n_players && pkt-start < len; i++) { - pkt++; /* skip first byte (0x10) */ - if ( pkt-start >= len) break; - player= (struct player*) calloc( 1, sizeof(struct player)); - term= strchr( pkt, 0x11); - if ( !term || term-start >= len) { - free( player); - break; - } - player->name= strndup( pkt, term-pkt); - get_tribes2_player_type( player); - pkt= term+1; - pkt++; /* skip 0x9 */ - if ( pkt-start >= len) break; - term= strchr( pkt, 0x9); - if ( !term || term-start >= len) { - free( player->name); - free( player); - break; - } - for ( t= 0; t < n_teams; t++) { - if ( term-pkt == strlen(teams[t]->name) && - strncmp( pkt, teams[t]->name, term-pkt) == 0) - break; - } - if ( t == n_teams) { - player->team= -1; - player->team_name= "Unassigned"; - } - else { - player->team= t; - player->team_name= teams[t]->name; - } - player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - pkt= term+1; - for ( s= 0; *pkt != 0xa && pkt-start < len; pkt++) - str[s++]= *pkt; - str[s]= '\0'; - player->frags= atoi(str); - if ( *pkt == 0xa) - pkt++; - - *last_player= player; - last_player= & player->next; - } - -info_done: - for ( t= n_teams; t;) { - t--; - teams[t]->next= server->players; - server->players= teams[t]; - } - if ( teams) free( teams); - - cleanup_qserver( server, 1); - return; -} - -static const char GrPacketHead[]={'\xc0','\xde','\xf1','\x11'}; -static const char PacketStart='\x42'; -static char Dat2Reply1_2_10[]={'\xf4','\x03','\x14','\x02','\x0a','\x41','\x02','\x0a','\x41','\x00','\x00','\x78','\x30','\x63'}; -static char Dat2Reply1_3[] ={'\xf4','\x03','\x14','\x03','\x05','\x41','\x03','\x05','\x41','\x00','\x00','\x78','\x30','\x63'}; -static char Dat2Reply1_4[] ={'\xf4','\x03','\x14','\x04','\x00','\x41','\x04','\x00','\x41','\x00','\x00','\x78','\x30','\x63'}; + '\xc0', '\xde', '\xf1', '\x11' +}; +static const char PacketStart = '\x42'; +static char Dat2Reply1_2_10[] = +{ + '\xf4', '\x03', '\x14', '\x02', '\x0a', '\x41', '\x02', '\x0a', '\x41', '\x00', '\x00', '\x78', '\x30', '\x63' +}; +static char Dat2Reply1_3[] = +{ + '\xf4', '\x03', '\x14', '\x03', '\x05', '\x41', '\x03', '\x05', '\x41', '\x00', '\x00', '\x78', '\x30', '\x63' +}; +static char Dat2Reply1_4[] = +{ + '\xf4', '\x03', '\x14', '\x04', '\x00', '\x41', '\x04', '\x00', '\x41', '\x00', '\x00', '\x78', '\x30', '\x63' +}; //static char HDat2[]={'\xea','\x03','\x02','\x00','\x14'}; #define SHORT_GR_LEN 75 @@ -8343,349 +9359,394 @@ #define VERSION_1_3 2 #define VERSION_1_4 3 -void -deal_with_ghostrecon_packet( struct qserver *server, char *pkt, int pktlen) +int deal_with_ghostrecon_packet(struct qserver *server, char *pkt, int pktlen) { - char str[256], *start, *end, StartFlag, *lpszIgnoreServerPlayer; - char *lpszMission; - unsigned int iIgnoreServerPlayer, iDedicatedServer, iUseStartTimer; - unsigned short GrPayloadLen; - int i; - struct player *player; - int iLen, iTemp; + char str[256], *start, *end, StartFlag, *lpszIgnoreServerPlayer; + char *lpszMission; + unsigned int iIgnoreServerPlayer, iDedicatedServer, iUseStartTimer; + unsigned short GrPayloadLen; + int i; + struct player *player; + int iLen, iTemp; short sLen; int iSecsPlayed; long iSpawnType; - int ServerVersion=UNKNOWN_VERSION; + int ServerVersion = UNKNOWN_VERSION; float flStartTimerSetPoint; + debug( 2, "deal_with_ghostrecon_packet %p, %d", server, pktlen ); + start = pkt; - end=&pkt[pktlen]; - pkt[pktlen]= '\0'; + end = &pkt[pktlen]; + pkt[pktlen] = '\0'; -/* - This function walks a packet that is recieved from a ghost recon server - default from port 2348. It does quite a few - sanity checks along the way as the structure is not documented. The packet is mostly binary in nature with many string - fields being variable in length, ie the length is listed foloowed by that many bytes. There are two structure arrays - that have an array size followed by structure size * number of elements (player name and player data). This routine + /* + This function walks a packet that is recieved from a ghost recon server - default from port 2348. It does quite a few + sanity checks along the way as the structure is not documented. The packet is mostly binary in nature with many string + fields being variable in length, ie the length is listed foloowed by that many bytes. There are two structure arrays + that have an array size followed by structure size * number of elements (player name and player data). This routine walks this packet and increments a pointer "pkt" to extract the info. -*/ + */ - if ( server->server_name == NULL) - server->ping_total+= time_delta( &packet_recv_time, - &server->packet_time1); + if (server->server_name == NULL) + { + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + } /* sanity check against packet */ - if (memcmp(pkt,GrPacketHead,sizeof(GrPacketHead))!=0) + if (memcmp(pkt, GrPacketHead, sizeof(GrPacketHead)) != 0) { - server->server_name= strdup( "Unknown Packet Header"); - cleanup_qserver( server, 1); - return; - }; + server->server_name = strdup("Unknown Packet Header"); + return PKT_ERROR; + } pkt += sizeof(GrPacketHead); - StartFlag=pkt[0]; + StartFlag = pkt[0]; pkt += 1; if (StartFlag != 0x42) { - server->server_name= strdup( "Unknown Start Flag"); - cleanup_qserver( server, 1); - return; - }; + server->server_name = strdup("Unknown Start Flag"); + return PKT_ERROR; + } /* compare packet length recieved to included size - header info */ sLen = swap_short_from_little(pkt); pkt += 2; - GrPayloadLen = pktlen - sizeof(GrPacketHead) -3; // 3 = size slen + size start flag + GrPayloadLen = pktlen - sizeof(GrPacketHead) - 3; + // 3 = size slen + size start flag if (sLen != GrPayloadLen) { - server->server_name= strdup( "Packet Size Mismatch"); - cleanup_qserver( server, 1); - return; - }; + server->server_name = strdup("Packet Size Mismatch"); + return PKT_ERROR; + } -/* -Will likely need to verify and add to this "if" construct with every patch / add-on. -*/ - if (memcmp(pkt, Dat2Reply1_2_10, sizeof(Dat2Reply1_2_10)) == 0) ServerVersion=VERSION_1_2_10; - else if (memcmp(pkt, Dat2Reply1_3, sizeof(Dat2Reply1_3)) == 0) ServerVersion=VERSION_1_3; - else if (memcmp(pkt, Dat2Reply1_4, sizeof(Dat2Reply1_4)) == 0) ServerVersion=VERSION_1_4; + /* + Will likely need to verify and add to this "if" construct with every patch / add-on. + */ + if (memcmp(pkt, Dat2Reply1_2_10, sizeof(Dat2Reply1_2_10)) == 0) + { + ServerVersion = VERSION_1_2_10; + } + else if (memcmp(pkt, Dat2Reply1_3, sizeof(Dat2Reply1_3)) == 0) + { + ServerVersion = VERSION_1_3; + } + else if (memcmp(pkt, Dat2Reply1_4, sizeof(Dat2Reply1_4)) == 0) + { + ServerVersion = VERSION_1_4; + } if (ServerVersion == UNKNOWN_VERSION) { - server->server_name= strdup( "Unknown GR Version"); - cleanup_qserver( server, 1); - return; - }; + server->server_name = strdup("Unknown GR Version"); + return PKT_ERROR; + } switch (ServerVersion) { case VERSION_1_2_10: - { - strcpy(str,"1.2.10"); - pkt+=sizeof(Dat2Reply1_2_10); - break; - }; + strcpy(str, "1.2.10"); + pkt += sizeof(Dat2Reply1_2_10); + break; + case VERSION_1_3: - { - strcpy(str,"1.3"); - pkt+=sizeof(Dat2Reply1_3); - break; - }; + strcpy(str, "1.3"); + pkt += sizeof(Dat2Reply1_3); + break; + case VERSION_1_4: - { - strcpy(str,"1.4"); - pkt+=sizeof(Dat2Reply1_4); - break; - }; + strcpy(str, "1.4"); + pkt += sizeof(Dat2Reply1_4); + break; - }; + } add_rule(server, "patch", str, NO_FLAGS); /* have player packet */ - // Ghost recon has one of the player slots filled up with the server program itself. By default we will - // drop the first player listed. This causes a bit of a mess here and below but makes for the best display + // Ghost recon has one of the player slots filled up with the server program itself. By default we will + // drop the first player listed. This causes a bit of a mess here and below but makes for the best display // a user can specify -grs,ignoreserverplayer=no to override this behaviour. - lpszIgnoreServerPlayer = get_param_value( server, "ignoreserverplayer", "yes"); - for (i=0; i<4; i++) str[i]=tolower(lpszIgnoreServerPlayer[i]); - if (strcmp(str,"yes")==0)iIgnoreServerPlayer=1; - else iIgnoreServerPlayer=0; + lpszIgnoreServerPlayer = get_param_value(server, "ignoreserverplayer", "yes"); + for (i = 0; i < 4; i++) + { + str[i] = tolower(lpszIgnoreServerPlayer[i]); + } + if (strcmp(str, "yes") == 0) + { + iIgnoreServerPlayer = 1; + } + else + { + iIgnoreServerPlayer = 0; + } - pkt+=4; /* unknown */ + pkt += 4; /* unknown */ - // this is the first of many variable strings. get the length, + // this is the first of many variable strings. get the length, // increment pointer over length, check for sanity, // get the string, increment the pointer over string (using length) iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { - server->server_name= strdup( "Server Name too Long"); - cleanup_qserver(server, 1); - return; - }; - server->server_name = strndup( pkt, iLen); + server->server_name = strdup("Server Name too Long"); + return PKT_ERROR; + } + server->server_name = strndup(pkt, iLen); pkt += iLen; iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { add_rule(server, "error", "Map Name too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - server->map_name = strndup( pkt, iLen); + return PKT_ERROR; + } + server->map_name = strndup(pkt, iLen); pkt += iLen; iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { - add_rule(server, "error", "Mission Name too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - /* mission does not make sense unless a coop game type. Since - we dont know that now, we will save the mission and set - the rule and free memory below when we know game type */ - lpszMission = strndup( pkt, iLen); + add_rule(server, "error", "Mission Name too Long", NO_FLAGS); + return PKT_ERROR; + } + /* mission does not make sense unless a coop game type. Since + we dont know that now, we will save the mission and set + the rule and free memory below when we know game type */ + lpszMission = strndup(pkt, iLen); pkt += iLen; iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { - add_rule(server, "error", "Mission Type too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - add_nrule( server, "missiontype", pkt, iLen); + add_rule(server, "error", "Mission Type too Long", NO_FLAGS); + return PKT_ERROR; + } + add_nrule(server, "missiontype", pkt, iLen); pkt += iLen; - if ( pkt[1]) + if (pkt[1]) { - add_rule( server, "password", "Yes", NO_FLAGS); - } else + add_rule(server, "password", "Yes", NO_FLAGS); + } + else { - add_rule( server, "password", "No", NO_FLAGS); - }; + add_rule(server, "password", "No", NO_FLAGS); + } pkt += 2; - server->max_players= swap_long_from_little(pkt); + server->max_players = swap_long_from_little(pkt); pkt += 4; if (server->max_players > 36) { - add_rule(server, "error", "Max players more then 36", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; + add_rule(server, "error", "Max players more then 36", NO_FLAGS); + return PKT_ERROR; + } - server->num_players= swap_long_from_little(pkt); + server->num_players = swap_long_from_little(pkt); pkt += 4; if (server->num_players > server->max_players) { add_rule(server, "error", "More then MAX Players", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; + return PKT_ERROR; + } - if (iIgnoreServerPlayer) // skip past first player + if (iIgnoreServerPlayer) + // skip past first player { server->num_players--; server->max_players--; iLen = swap_long_from_little(pkt); pkt += 4; pkt += iLen; - }; + } - for (i=0;i<server->num_players;i++) // read each player name + for (i = 0; i < server->num_players; i++) + // read each player name { iLen = swap_long_from_little(pkt); pkt += 4; - player= (struct player*) calloc( 1, sizeof(struct player)); + player = (struct player*)calloc(1, sizeof(struct player)); - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { add_rule(server, "error", "Player Name too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - player->name= strndup( pkt, iLen); - pkt += iLen; /* player name */ - player->team= i; // tag so we can find this record when we have player dat. - player->team_name= "Unassigned"; + return PKT_ERROR; + } + player->name = strndup(pkt, iLen); + pkt += iLen; /* player name */ + player->team = i; // tag so we can find this record when we have player dat. + player->team_name = "Unassigned"; player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - player->frags=0; + player->frags = 0; - player->next= server->players; - server->players= player; - }; + player->next = server->players; + server->players = player; + } pkt += 17; iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN)) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { - add_rule(server, "error", "Version too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - strncpy(str,pkt,iLen); - add_rule( server, "version", str, NO_FLAGS); - pkt += iLen; /* version */ + add_rule(server, "error", "Version too Long", NO_FLAGS); + return PKT_ERROR; + } + strncpy(str, pkt, iLen); + add_rule(server, "version", str, NO_FLAGS); + pkt += iLen; /* version */ iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >LONG_GR_LEN)) + if ((iLen < 1) || (iLen > LONG_GR_LEN)) { - add_rule(server, "error", "Mods too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - server->game= strndup( pkt, iLen); + add_rule(server, "error", "Mods too Long", NO_FLAGS); + return PKT_ERROR; + } + server->game = strndup(pkt, iLen); - for (i=0;i<(int)strlen(server->game)-5;i++) // clean the "/mods/" part from every entry + for (i = 0; i < (int)strlen(server->game) - 5; i++) + // clean the "/mods/" part from every entry { - if (memcmp(&server->game[i],"\\mods\\",6)==0) + if (memcmp(&server->game[i], "\\mods\\", 6) == 0) { - server->game[i]=' '; - strcpy(&server->game[i+1],&server->game[i+6]); - }; - }; - add_rule(server, "game", server->game, NO_FLAGS); + server->game[i] = ' '; + strcpy(&server->game[i + 1], &server->game[i + 6]); + } + } + add_rule(server, "game", server->game, NO_FLAGS); - pkt += iLen; /* mods */ + pkt += iLen; /* mods */ - iDedicatedServer=pkt[0]; - if ( iDedicatedServer) - add_rule( server, "dedicated", "Yes", NO_FLAGS); + iDedicatedServer = pkt[0]; + if (iDedicatedServer) + { + add_rule(server, "dedicated", "Yes", NO_FLAGS); + } else - add_rule( server, "dedicated", "No", NO_FLAGS); + { + add_rule(server, "dedicated", "No", NO_FLAGS); + } - pkt += 1; /* unknown */ + pkt += 1; /* unknown */ iSecsPlayed = swap_float_from_little(pkt); - add_rule(server, "timeplayed", play_time(iSecsPlayed,2), NO_FLAGS); + add_rule(server, "timeplayed", play_time(iSecsPlayed, 2), NO_FLAGS); - pkt += 4; /* time played */ + pkt += 4; /* time played */ - switch (pkt[0]) { - case 3 : strcpy(str,"Joining"); break; - case 4 : strcpy(str,"Playing"); break; - case 5 : strcpy(str,"Debrief"); break; - default : strcpy(str,"Undefined"); - }; - add_rule( server, "status", str, NO_FLAGS); + switch (pkt[0]) + { + case 3: + strcpy(str, "Joining"); + break; + case 4: + strcpy(str, "Playing"); + break; + case 5: + strcpy(str, "Debrief"); + break; + default: + strcpy(str, "Undefined"); + } + add_rule(server, "status", str, NO_FLAGS); pkt += 1; - pkt += 3; /* unknown */ + pkt += 3; /* unknown */ - switch (pkt[0]) { - case 2: strcpy(str,"COOP"); break; - case 3: strcpy(str,"SOLO"); break; - case 4: strcpy(str,"TEAM"); break; - default: sprintf(str,"UNKOWN %u",pkt[0]); break; - }; + switch (pkt[0]) + { + case 2: + strcpy(str, "COOP"); + break; + case 3: + strcpy(str, "SOLO"); + break; + case 4: + strcpy(str, "TEAM"); + break; + default: + sprintf(str, "UNKOWN %u", pkt[0]); + break; + } - add_rule( server, "gamemode", str, NO_FLAGS); + add_rule(server, "gamemode", str, NO_FLAGS); - if (pkt[0]==2) - add_rule( server, "mission", lpszMission, NO_FLAGS); + if (pkt[0] == 2) + { + add_rule(server, "mission", lpszMission, NO_FLAGS); + } else - add_rule( server, "mission", "No Mission", NO_FLAGS); + { + add_rule(server, "mission", "No Mission", NO_FLAGS); + } free(lpszMission); - pkt += 1; /* Game Mode */ + pkt += 1; /* Game Mode */ - pkt += 3; /* unknown */ + pkt += 3; /* unknown */ iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >LONG_GR_LEN)) + if ((iLen < 1) || (iLen > LONG_GR_LEN)) { - add_rule(server, "error", "MOTD too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - strncpy(str,pkt,sizeof(str)); - str[sizeof(str)-1]=0; + add_rule(server, "error", "MOTD too Long", NO_FLAGS); + return PKT_ERROR; + } + strncpy(str, pkt, sizeof(str)); + str[sizeof(str) - 1] = 0; add_rule(server, "motd", str, NO_FLAGS); - pkt += iLen; /* MOTD */ + pkt += iLen; /* MOTD */ iSpawnType = swap_long_from_little(pkt); - switch (iSpawnType) { - case 0: strcpy(str,"None"); break; - case 1: strcpy(str,"Individual"); break; - case 2: strcpy(str,"Team"); break; - case 3: strcpy(str,"Infinite"); break; - default:strcpy(str,"Unknown"); - }; + switch (iSpawnType) + { + case 0: + strcpy(str, "None"); + break; + case 1: + strcpy(str, "Individual"); + break; + case 2: + strcpy(str, "Team"); + break; + case 3: + strcpy(str, "Infinite"); + break; + default: + strcpy(str, "Unknown"); + } - add_rule( server, "spawntype", str, NO_FLAGS); - pkt += 4; /* spawn type */ + add_rule(server, "spawntype", str, NO_FLAGS); + pkt += 4; /* spawn type */ iTemp = swap_float_from_little(pkt); - add_rule(server, "gametime", play_time(iTemp,2), NO_FLAGS); + add_rule(server, "gametime", play_time(iTemp, 2), NO_FLAGS); - iTemp = iTemp-iSecsPlayed; + iTemp = iTemp - iSecsPlayed; - if (iTemp <= 0) iTemp=0; - add_rule(server, "remainingtime", play_time(iTemp,2), NO_FLAGS); + if (iTemp <= 0) + { + iTemp = 0; + } + add_rule(server, "remainingtime", play_time(iTemp, 2), NO_FLAGS); pkt += 4; /* Game time */ @@ -8693,238 +9754,281 @@ if (iIgnoreServerPlayer) { iTemp--; - }; + } if (iTemp != server->num_players) { - add_rule(server, "error", "Number of Players Mismatch", NO_FLAGS); - }; + add_rule(server, "error", "Number of Players Mismatch", NO_FLAGS); + } pkt += 4; /* player count 2 */ if (iIgnoreServerPlayer) { - pkt+=5; // skip first player data - }; + pkt += 5; // skip first player data + } - for (i=0;i<server->num_players;i++) // for each player get binary data + for (i = 0; i < server->num_players; i++) + // for each player get binary data { - player=server->players; // first we must find the player - lets look for the tag - while (player && (player->team != i)) player=player->next; /* get to player - linked list is in reverse order */ + player = server->players; + // first we must find the player - lets look for the tag + while (player && (player->team != i)) + { + player = player->next; + } + /* get to player - linked list is in reverse order */ if (player) { - player->team= pkt[2]; + player->team = pkt[2]; switch (player->team) { - case 1: player->team_name= "Red"; break; - case 2: player->team_name= "Blue"; break; - case 3: player->team_name= "Yellow"; break; - case 4: player->team_name= "Green"; break; - case 5: player->team_name= "Unassigned"; break; - default: player->team_name= "Not Known"; break; - }; + case 1: + player->team_name = "Red"; + break; + case 2: + player->team_name = "Blue"; + break; + case 3: + player->team_name = "Yellow"; + break; + case 4: + player->team_name = "Green"; + break; + case 5: + player->team_name = "Unassigned"; + break; + default: + player->team_name = "Not Known"; + break; + } player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - player->deaths=pkt[1]; - }; + player->deaths = pkt[1]; + } pkt += 5; /* player data*/ - }; + } - for (i=0;i<5;i++) + for (i = 0; i < 5; i++) { pkt += 8; /* team data who knows what they have in here */ - }; + } - pkt +=1; - iUseStartTimer=pkt[0]; // UseStartTimer + pkt += 1; + iUseStartTimer = pkt[0]; // UseStartTimer - pkt +=1; + pkt += 1; - iTemp = flStartTimerSetPoint = swap_float_from_little(pkt);// Start Timer Set Point + iTemp = flStartTimerSetPoint = swap_float_from_little(pkt); + // Start Timer Set Point pkt += 4; if (iUseStartTimer) { - add_rule( server, "usestarttime", "Yes", NO_FLAGS); - add_rule( server, "starttimeset", play_time(iTemp,2), NO_FLAGS); - } else + add_rule(server, "usestarttime", "Yes", NO_FLAGS); + add_rule(server, "starttimeset", play_time(iTemp, 2), NO_FLAGS); + } + else { - add_rule( server, "usestarttime", "No", NO_FLAGS); - add_rule( server, "starttimeset", play_time(0,2), NO_FLAGS); - }; + add_rule(server, "usestarttime", "No", NO_FLAGS); + add_rule(server, "starttimeset", play_time(0, 2), NO_FLAGS); + } - if ((ServerVersion == VERSION_1_3) || // stuff added in patch 1.3 - (ServerVersion == VERSION_1_4)) + if ((ServerVersion == VERSION_1_3) || // stuff added in patch 1.3 + (ServerVersion == VERSION_1_4)) { - iTemp = swap_float_from_little(pkt);// Debrief Time - add_rule( server, "debrieftime", play_time(iTemp,2), NO_FLAGS); + iTemp = swap_float_from_little(pkt); // Debrief Time + add_rule(server, "debrieftime", play_time(iTemp, 2), NO_FLAGS); pkt += 4; - iTemp = swap_float_from_little(pkt);// Respawn Min - add_rule( server, "respawnmin", play_time(iTemp,2), NO_FLAGS); + iTemp = swap_float_from_little(pkt); // Respawn Min + add_rule(server, "respawnmin", play_time(iTemp, 2), NO_FLAGS); pkt += 4; - iTemp = swap_float_from_little(pkt);// Respawn Max - add_rule( server, "respawnmax", play_time(iTemp,2), NO_FLAGS); + iTemp = swap_float_from_little(pkt); // Respawn Max + add_rule(server, "respawnmax", play_time(iTemp, 2), NO_FLAGS); pkt += 4; - iTemp = swap_float_from_little(pkt);// Respawn Invulnerable - add_rule( server, "respawnsafe", play_time(iTemp,2), NO_FLAGS); + iTemp = swap_float_from_little(pkt); // Respawn Invulnerable + add_rule(server, "respawnsafe", play_time(iTemp, 2), NO_FLAGS); pkt += 4; - } else + } + else { - add_rule( server, "debrieftime", "Undefined", NO_FLAGS); - add_rule( server, "respawnmin", "Undefined", NO_FLAGS); - add_rule( server, "respawnmax", "Undefined", NO_FLAGS); - add_rule( server, "respawnsafe", "Undefined", NO_FLAGS); + add_rule(server, "debrieftime", "Undefined", NO_FLAGS); + add_rule(server, "respawnmin", "Undefined", NO_FLAGS); + add_rule(server, "respawnmax", "Undefined", NO_FLAGS); + add_rule(server, "respawnsafe", "Undefined", NO_FLAGS); - }; + } - pkt+=4; // 4 - iTemp=pkt[0]; // Spawn Count + pkt += 4; // 4 + iTemp = pkt[0]; // Spawn Count - if ((iSpawnType == 1) || (iSpawnType == 2)) /* Individual or team */ - sprintf( str, "%u", iTemp); - else /* else not used */ - sprintf( str, "%u", 0); - add_rule( server, "spawncount", str, NO_FLAGS); + if ((iSpawnType == 1) || (iSpawnType == 2)) + /* Individual or team */ + { + sprintf(str, "%u", iTemp); + } + else + /* else not used */ + { + sprintf(str, "%u", 0); + } + add_rule(server, "spawncount", str, NO_FLAGS); pkt += 1; // 5 - pkt +=4; // 9 + pkt += 4; // 9 - iTemp=pkt[0]; // Allow Observers + iTemp = pkt[0]; // Allow Observers if (iTemp) - strcpy( str, "Yes"); - else /* else not used */ - strcpy( str, "No"); - add_rule( server, "allowobservers", str, NO_FLAGS); - pkt +=1; // 10 + { + strcpy(str, "Yes"); + } + else + /* else not used */ + { + strcpy(str, "No"); + } + add_rule(server, "allowobservers", str, NO_FLAGS); + pkt += 1; // 10 - pkt +=3; // 13 + pkt += 3; // 13 // pkt += 13; if (iUseStartTimer) { - iTemp=swap_float_from_little(pkt); // Start Timer Count - add_rule( server, "startwait", play_time(iTemp,2), NO_FLAGS); + iTemp = swap_float_from_little(pkt); // Start Timer Count + add_rule(server, "startwait", play_time(iTemp, 2), NO_FLAGS); } else { - add_rule( server, "startwait", play_time(0,2), NO_FLAGS); - }; - pkt += 4; //17 + add_rule(server, "startwait", play_time(0, 2), NO_FLAGS); + } + pkt += 4; //17 - iTemp = pkt[0]; // IFF + iTemp = pkt[0]; // IFF switch (iTemp) { - case 0 : strcpy(str,"None"); break; - case 1 : strcpy(str,"Reticule"); break; - case 2 : strcpy(str,"Names"); break; - default : strcpy(str,"Unknown"); break; - }; - add_rule( server, "iff", str, NO_FLAGS); + case 0: + strcpy(str, "None"); + break; + case 1: + strcpy(str, "Reticule"); + break; + case 2: + strcpy(str, "Names"); + break; + default: + strcpy(str, "Unknown"); + break; + } + add_rule(server, "iff", str, NO_FLAGS); pkt += 1; // 18 - iTemp = pkt [0]; // Threat Indicator - if (iTemp) add_rule(server, "ti", "ON ", NO_FLAGS); - else add_rule(server, "ti", "OFF", NO_FLAGS); + iTemp = pkt[0]; // Threat Indicator + if (iTemp) + { + add_rule(server, "ti", "ON ", NO_FLAGS); + } + else + { + add_rule(server, "ti", "OFF", NO_FLAGS); + } - pkt += 1; // 19 + pkt += 1; // 19 - pkt += 5; // 24 + pkt += 5; // 24 iLen = swap_long_from_little(pkt); pkt += 4; - if ((iLen<1) || (iLen >SHORT_GR_LEN) ) + if ((iLen < 1) || (iLen > SHORT_GR_LEN)) { - add_rule(server, "error", "Restrictions too Long", NO_FLAGS); - cleanup_qserver(server, 1); - return; - }; - add_rule( server, "restrict", pkt, NO_FLAGS); - pkt += iLen; /* restrictions */ + add_rule(server, "error", "Restrictions too Long", NO_FLAGS); + return PKT_ERROR; + } + add_rule(server, "restrict", pkt, NO_FLAGS); + pkt += iLen; /* restrictions */ pkt += 23; /* if ( ghostrecon_debug) print_packet( pkt, GrPayloadLen); - */ + */ - cleanup_qserver( server, 1); - return; + return DONE_FORCE; } -char* -find_ravenshield_game( char *gameno ) +char *find_ravenshield_game(char *gameno) { - switch( atoi( gameno ) ) + switch (atoi(gameno)) { - case 8: - return strdup( "Team Deathmatch" ); - break; - case 13: - return strdup( "Deathmatch" ); - break; - case 14: - return strdup( "Team Deathmatch" ); - break; - case 15: - return strdup( "Bomb" ); - break; - case 16: - return strdup( "Escort Pilot" ); - break; - default: - // 1.50 and above actually uses a string so - // return that - return strdup( gameno ); - break; + case 8: + return strdup("Team Deathmatch"); + break; + case 13: + return strdup("Deathmatch"); + break; + case 14: + return strdup("Team Deathmatch"); + break; + case 15: + return strdup("Bomb"); + break; + case 16: + return strdup("Escort Pilot"); + break; + default: + // 1.50 and above actually uses a string so + // return that + return strdup(gameno); + break; } } -char* -find_savage_game( char *gametype ) +char *find_savage_game(char *gametype) { - if ( 0 == strcmp( "RTSS", gametype ) ) + if (0 == strcmp("RTSS", gametype)) { - return strdup( "RTSS" ); + return strdup("RTSS"); } else { - return strdup( "Unknown" ); + return strdup("Unknown"); } } -void -deal_with_ravenshield_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_ravenshield_packet(struct qserver *server, char *rawpkt, int pktlen) { - char *s, *key, *value; + char *s, *key, *value; + + debug( 2, "deal_with_ravenshield_packet %p, %d", server, pktlen ); server->n_servers++; - if ( NULL == server->server_name ) + if (NULL == server->server_name) { - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - else + else { - gettimeofday( &server->packet_time1, NULL ); + gettimeofday(&server->packet_time1, NULL); } - rawpkt[pktlen]= '\0'; + rawpkt[pktlen] = '\0'; - s = rawpkt; - while ( *s ) + s = rawpkt; + while (*s) { // Find the seperator - while ( *s && *s != '\xB6' ) + while (*s && *s != '\xB6') { s++; } - if ( !*s ) + if (! *s) { // Hit the end no more break; @@ -8932,11 +10036,11 @@ // key start key = ++s; - while ( *s && *s != ' ' ) + while (*s && *s != ' ') { s++; } - if ( *s != ' ') + if (*s != ' ') { // malformed break; @@ -8946,189 +10050,189 @@ // value start value = s; - while ( *s && *s != '\xB6' ) + while (*s && *s != '\xB6') { s++; } - if ( *s == '\xB6' ) + if (*s == '\xB6') { - *(s-1) = '\0'; + *(s - 1) = '\0'; } // Decode current key par - if ( 0 == strcmp( "A1", key ) ) + if (0 == strcmp("A1", key)) { // Max players - server->max_players = atoi( value ); + server->max_players = atoi(value); } - else if ( 0 == strcmp( "A2", key ) ) + else if (0 == strcmp("A2", key)) { // TeamKillerPenalty - add_rule( server, "TeamKillerPenalty", value, NO_FLAGS ); + add_rule(server, "TeamKillerPenalty", value, NO_FLAGS); } - else if ( 0 == strcmp( "B1", key ) ) + else if (0 == strcmp("B1", key)) { // Current players - server->num_players = atoi( value ); + server->num_players = atoi(value); } - else if ( 0 == strcmp( "B2", key ) ) + else if (0 == strcmp("B2", key)) { // AllowRadar - add_rule( server, "AllowRadar", value, NO_FLAGS ); + add_rule(server, "AllowRadar", value, NO_FLAGS); } - else if ( 0 == strcmp( "D2", key ) ) + else if (0 == strcmp("D2", key)) { // Version info - add_rule( server, "Version", value, NO_FLAGS ); + add_rule(server, "Version", value, NO_FLAGS); } - else if ( 0 == strcmp( "E1", key ) ) + else if (0 == strcmp("E1", key)) { // Current map - server->map_name = strdup( value ); + server->map_name = strdup(value); } - else if ( 0 == strcmp( "E2", key ) ) + else if (0 == strcmp("E2", key)) { // Unknown } - else if ( 0 == strcmp( "F1", key ) ) + else if (0 == strcmp("F1", key)) { // Game type - server->game = find_ravenshield_game( value ); - add_rule( server, server->type->game_rule, server->game, NO_FLAGS ); + server->game = find_ravenshield_game(value); + add_rule(server, server->type->game_rule, server->game, NO_FLAGS); } - else if ( 0 == strcmp( "F2", key ) ) + else if (0 == strcmp("F2", key)) { // Unknown } - else if ( 0 == strcmp( "G1", key ) ) + else if (0 == strcmp("G1", key)) { // Password - add_rule( server, "Password", value, NO_FLAGS ); + add_rule(server, "Password", value, NO_FLAGS); } - else if ( 0 == strcmp( "G2", key ) ) + else if (0 == strcmp("G2", key)) { // Query port } - else if ( 0 == strcmp( "H1", key ) ) + else if (0 == strcmp("H1", key)) { // Unknown } - else if ( 0 == strcmp( "H2", key ) ) + else if (0 == strcmp("H2", key)) { // Number of Terrorists - add_rule( server, "nbTerro", value, NO_FLAGS ); + add_rule(server, "nbTerro", value, NO_FLAGS); } - else if ( 0 == strcmp( "I1", key ) ) + else if (0 == strcmp("I1", key)) { // Server name - server->server_name = strdup( value ); + server->server_name = strdup(value); } - else if ( 0 == strcmp( "I2", key ) ) + else if (0 == strcmp("I2", key)) { // Unknown } - else if ( 0 == strcmp( "J1", key ) ) + else if (0 == strcmp("J1", key)) { // Game Type Order // Not pretty ignore for now //add_rule( server, "Game Type Order", value, NO_FLAGS ); } - else if ( 0 == strcmp( "J2", key ) ) + else if (0 == strcmp("J2", key)) { // RotateMap - add_rule( server, "RotateMap", value, NO_FLAGS); + add_rule(server, "RotateMap", value, NO_FLAGS); } - else if ( 0 == strcmp( "K1", key ) ) + else if (0 == strcmp("K1", key)) { // Map Cycle // Not pretty ignore for now //add_rule( server, "Map Cycle", value, NO_FLAGS ); } - else if ( 0 == strcmp( "K2", key ) ) + else if (0 == strcmp("K2", key)) { // Force First Person Weapon - add_rule( server, "ForceFPersonWeapon", value, NO_FLAGS); + add_rule(server, "ForceFPersonWeapon", value, NO_FLAGS); } - else if ( 0 == strcmp( "L1", key ) ) + else if (0 == strcmp("L1", key)) { // Players names int player_number = 0; char *n = value; - if ( *n == '/' ) + if (*n == '/') { // atleast 1 player n++; - while( *n && *n != '\xB6' ) + while (*n && *n != '\xB6') { char *player_name = n; - while ( *n && *n != '/' && *n != '\xB6' ) + while (*n && *n != '/' && *n != '\xB6') { n++; } - if ( *n == '/' ) + if (*n == '/') { *n++ = '\0'; } - else if ( *n == '\xB6' ) + else if (*n == '\xB6') { - *(n-1) = '\0'; + *(n - 1) = '\0'; } - if ( 0 != strlen( player_name ) ) + if (0 != strlen(player_name)) { - struct player *player = add_player( server, player_number ); - if ( NULL != player ) + struct player *player = add_player(server, player_number); + if (NULL != player) { - player->name = strdup( player_name ); + player->name = strdup(player_name); } player_number++; } } } } - else if ( 0 == strcmp( "L3", key ) ) + else if (0 == strcmp("L3", key)) { // PunkBuster state - add_rule( server, "PunkBuster", value, NO_FLAGS ); + add_rule(server, "PunkBuster", value, NO_FLAGS); } - else if ( 0 == strcmp( "M1", key ) ) + else if (0 == strcmp("M1", key)) { // Players times int player_number = 0; char *n = value; - if ( *n == '/' ) + if (*n == '/') { // atleast 1 player n++; - while( *n && *n != '\xB6' ) + while (*n && *n != '\xB6') { char *time = n; - while ( *n && *n != '/' && *n != '\xB6' ) + while (*n && *n != '/' && *n != '\xB6') { n++; } - if ( *n == '/' ) + if (*n == '/') { *n++ = '\0'; } - else if ( *n == '\xB6' ) + else if (*n == '\xB6') { - *(n-1) = '\0'; + *(n - 1) = '\0'; } - if ( 0 != strlen( time ) ) + if (0 != strlen(time)) { int mins, seconds; - if ( 2 == sscanf( time, "%d:%d", &mins, &seconds ) ) + if (2 == sscanf(time, "%d:%d", &mins, &seconds)) { - struct player *player = get_player_by_number( server, player_number ); - if ( NULL != player ) + struct player *player = get_player_by_number(server, player_number); + if (NULL != player) { - player->connect_time = mins * 60 + seconds; + player->connect_time = mins * 60+seconds; } } player_number++; @@ -9136,164 +10240,162 @@ } } } - else if ( 0 == strcmp( "N1", key ) ) + else if (0 == strcmp("N1", key)) { // Players ping int player_number = 0; char *n = value; - if ( *n == '/' ) + if (*n == '/') { // atleast 1 player n++; - while( *n && *n != '\xB6' ) + while (*n && *n != '\xB6') { char *ping = n; - while ( *n && *n != '/' && *n != '\xB6' ) + while (*n && *n != '/' && *n != '\xB6') { n++; } - if ( *n == '/' ) + if (*n == '/') { *n++ = '\0'; } - else if ( *n == '\xB6' ) + else if (*n == '\xB6') { - *(n-1) = '\0'; + *(n - 1) = '\0'; } - if ( 0 != strlen( ping ) ) + if (0 != strlen(ping)) { - struct player *player = get_player_by_number( server, player_number ); - if ( NULL != player ) + struct player *player = get_player_by_number(server, player_number); + if (NULL != player) { - player->ping = atoi( ping ); - } - player_number++; + player->ping = atoi(ping); + } player_number++; } } } } - else if ( 0 == strcmp( "O1", key ) ) + else if (0 == strcmp("O1", key)) { // Players fags int player_number = 0; char *n = value; - if ( *n == '/' ) + if (*n == '/') { // atleast 1 player n++; - while( *n && *n != '\xB6' ) + while (*n && *n != '\xB6') { char *frags = n; - while ( *n && *n != '/' && *n != '\xB6' ) + while (*n && *n != '/' && *n != '\xB6') { n++; } - if ( *n == '/' ) + if (*n == '/') { *n++ = '\0'; } - else if ( *n == '\xB6' ) + else if (*n == '\xB6') { - *(n-1) = '\0'; + *(n - 1) = '\0'; } - if ( 0 != strlen( frags ) ) + if (0 != strlen(frags)) { - struct player *player = get_player_by_number( server, player_number ); - if ( NULL != player ) + struct player *player = get_player_by_number(server, player_number); + if (NULL != player) { - player->frags = atoi( frags ); - } - player_number++; + player->frags = atoi(frags); + } player_number++; } } } } - else if ( 0 == strcmp( "P1", key ) ) + else if (0 == strcmp("P1", key)) { // Game port // Not pretty ignore for now /* change_server_port( server, atoi( value ), 0 ); - */ + */ } - else if ( 0 == strcmp( "Q1", key ) ) + else if (0 == strcmp("Q1", key)) { // RoundsPerMatch - add_rule( server, "RoundsPerMatch", value, NO_FLAGS ); + add_rule(server, "RoundsPerMatch", value, NO_FLAGS); } - else if ( 0 == strcmp( "R1", key ) ) + else if (0 == strcmp("R1", key)) { // RoundTime - add_rule( server, "RoundTime", value, NO_FLAGS ); + add_rule(server, "RoundTime", value, NO_FLAGS); } - else if ( 0 == strcmp( "S1", key ) ) + else if (0 == strcmp("S1", key)) { // BetweenRoundTime - add_rule( server, "BetweenRoundTime", value, NO_FLAGS ); + add_rule(server, "BetweenRoundTime", value, NO_FLAGS); } - else if ( 0 == strcmp( "T1", key ) ) + else if (0 == strcmp("T1", key)) { // BombTime - add_rule( server, "BombTime", value, NO_FLAGS ); + add_rule(server, "BombTime", value, NO_FLAGS); } - else if ( 0 == strcmp( "W1", key ) ) + else if (0 == strcmp("W1", key)) { // ShowNames - add_rule( server, "ShowNames", value, NO_FLAGS ); + add_rule(server, "ShowNames", value, NO_FLAGS); } - else if ( 0 == strcmp( "X1", key ) ) + else if (0 == strcmp("X1", key)) { // InternetServer - add_rule( server, "InternetServer", value, NO_FLAGS ); + add_rule(server, "InternetServer", value, NO_FLAGS); } - else if ( 0 == strcmp( "Y1", key ) ) + else if (0 == strcmp("Y1", key)) { // FriendlyFire - add_rule( server, "FriendlyFire", value, NO_FLAGS ); + add_rule(server, "FriendlyFire", value, NO_FLAGS); } - else if ( 0 == strcmp( "Z1", key ) ) + else if (0 == strcmp("Z1", key)) { // Autobalance - add_rule( server, "Autobalance", value, NO_FLAGS ); + add_rule(server, "Autobalance", value, NO_FLAGS); } } - cleanup_qserver( server, 1 ); - return; + return DONE_FORCE; } -void -deal_with_savage_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_savage_packet(struct qserver *server, char *rawpkt, int pktlen) { - char *s, *key, *value, *end; + char *s, *key, *value, *end; + + debug( 2, "deal_with_savage_packet %p, %d", server, pktlen ); server->n_servers++; - if ( NULL == server->server_name ) + if (NULL == server->server_name) { - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - else + else { - gettimeofday( &server->packet_time1, NULL ); + gettimeofday(&server->packet_time1, NULL); } - rawpkt[pktlen]= '\0'; + rawpkt[pktlen] = '\0'; - end = s = rawpkt; + end = s = rawpkt; end += pktlen; - while ( *s ) + while (*s) { // Find the seperator - while ( s <= end && *s != '\xFF' ) + while (s <= end && *s != '\xFF') { s++; } - if ( s >= end ) + if (s >= end) { // Hit the end no more break; @@ -9301,11 +10403,11 @@ // key start key = ++s; - while ( s < end && *s != '\xFE' ) + while (s < end && *s != '\xFE') { s++; } - if ( *s != '\xFE') + if (*s != '\xFE') { // malformed break; @@ -9315,75 +10417,75 @@ // value start value = s; - while ( s < end && *s != '\xFF' ) + while (s < end && *s != '\xFF') { s++; } - if ( *s == '\xFF' ) + if (*s == '\xFF') { *s = '\0'; } //fprintf( stderr, "'%s' = '%s'\n", key, value ); // Decode current key par - if ( 0 == strcmp( "cmax", key ) ) + if (0 == strcmp("cmax", key)) { // Max players - server->max_players = atoi( value ); + server->max_players = atoi(value); } - else if ( 0 == strcmp( "cnum", key ) ) + else if (0 == strcmp("cnum", key)) { // Current players - server->num_players = atoi( value ); + server->num_players = atoi(value); } - else if ( 0 == strcmp( "bal", key ) ) + else if (0 == strcmp("bal", key)) { // Balance - add_rule( server, "Balance", value, NO_FLAGS ); + add_rule(server, "Balance", value, NO_FLAGS); } - else if ( 0 == strcmp( "world", key ) ) + else if (0 == strcmp("world", key)) { // Current map - server->map_name = strdup( value ); + server->map_name = strdup(value); } - else if ( 0 == strcmp( "gametype", key ) ) + else if (0 == strcmp("gametype", key)) { // Game type - server->game = find_savage_game( value ); - add_rule( server, server->type->game_rule, server->game, NO_FLAGS ); + server->game = find_savage_game(value); + add_rule(server, server->type->game_rule, server->game, NO_FLAGS); } - else if ( 0 == strcmp( "pure", key ) ) + else if (0 == strcmp("pure", key)) { // Pure - add_rule( server, "Pure", value, NO_FLAGS ); + add_rule(server, "Pure", value, NO_FLAGS); } - else if ( 0 == strcmp( "time", key ) ) + else if (0 == strcmp("time", key)) { // Current game time - add_rule( server, "Time", value, NO_FLAGS ); + add_rule(server, "Time", value, NO_FLAGS); } - else if ( 0 == strcmp( "notes", key ) ) + else if (0 == strcmp("notes", key)) { // Notes - add_rule( server, "Notes", value, NO_FLAGS ); + add_rule(server, "Notes", value, NO_FLAGS); } - else if ( 0 == strcmp( "needcmdr", key ) ) + else if (0 == strcmp("needcmdr", key)) { // Need Commander - add_rule( server, "Need Commander", value, NO_FLAGS ); + add_rule(server, "Need Commander", value, NO_FLAGS); } - else if ( 0 == strcmp( "name", key ) ) + else if (0 == strcmp("name", key)) { // Server name - server->server_name = strdup( value ); + server->server_name = strdup(value); } - else if ( 0 == strcmp( "fw", key ) ) + else if (0 == strcmp("fw", key)) { // Firewalled - add_rule( server, "Firewalled", value, NO_FLAGS ); + add_rule(server, "Firewalled", value, NO_FLAGS); } - else if ( 0 == strcmp( "players", key ) ) + else if (0 == strcmp("players", key)) { // Players names @@ -9394,12 +10496,12 @@ // team name n++; - while( *n && *n != '\x0a' ) + while (*n && *n != '\x0a') { n++; } - if ( *n != '\x0a' ) + if (*n != '\x0a') { // Broken data break; @@ -9407,14 +10509,14 @@ *n = '\0'; player_name = ++n; - while( *n ) + while (*n) { - while( *n && *n != '\x0a' ) + while (*n && *n != '\x0a') { n++; } - if ( *n != '\x0a' ) + if (*n != '\x0a') { // Broken data break; @@ -9422,23 +10524,22 @@ *n = '\0'; n++; - if ( 0 == strncmp( "Team ", player_name, 5 ) ) + if (0 == strncmp("Team ", player_name, 5)) { team_name = player_name; team_number++; } else { - if ( 0 != strlen( player_name ) ) + if (0 != strlen(player_name)) { - struct player *player = add_player( server, player_number ); - if ( NULL != player ) + struct player *player = add_player(server, player_number); + if (NULL != player) { - player->name = strdup( player_name ); + player->name = strdup(player_name); player->team = team_number; - player->team_name = strdup( team_name ); - } - player_number++; + player->team_name = strdup(team_name); + } player_number++; } } player_name = n; @@ -9448,38 +10549,38 @@ *s = '\xFF'; } - cleanup_qserver( server, 1 ); - return; + return DONE_FORCE; } -void -deal_with_farcry_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_farcry_packet(struct qserver *server, char *rawpkt, int pktlen) { - char *s, *key, *value, *end; + char *s, *key, *value, *end; + + debug( 2, "deal_with_farcry_packet %p, %d", server, pktlen ); server->n_servers++; - if ( NULL == server->server_name ) + if (NULL == server->server_name) { - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } - else + else { - gettimeofday( &server->packet_time1, NULL ); + gettimeofday(&server->packet_time1, NULL); } - rawpkt[pktlen]= '\0'; + rawpkt[pktlen] = '\0'; - end = s = rawpkt; + end = s = rawpkt; end += pktlen; - while ( *s ) + while (*s) { // Find the seperator - while ( s <= end && *s != '\xFF' ) + while (s <= end && *s != '\xFF') { s++; } - if ( s >= end ) + if (s >= end) { // Hit the end no more break; @@ -9487,11 +10588,11 @@ // key start key = ++s; - while ( s < end && *s != '\xFE' ) + while (s < end && *s != '\xFE') { s++; } - if ( *s != '\xFE') + if (*s != '\xFE') { // malformed break; @@ -9501,75 +10602,75 @@ // value start value = s; - while ( s < end && *s != '\xFF' ) + while (s < end && *s != '\xFF') { s++; } - if ( *s == '\xFF' ) + if (*s == '\xFF') { *s = '\0'; } //fprintf( stderr, "'%s' = '%s'\n", key, value ); // Decode current key par - if ( 0 == strcmp( "cmax", key ) ) + if (0 == strcmp("cmax", key)) { // Max players - server->max_players = atoi( value ); + server->max_players = atoi(value); } - else if ( 0 == strcmp( "cnum", key ) ) + else if (0 == strcmp("cnum", key)) { // Current players - server->num_players = atoi( value ); + server->num_players = atoi(value); } - else if ( 0 == strcmp( "bal", key ) ) + else if (0 == strcmp("bal", key)) { // Balance - add_rule( server, "Balance", value, NO_FLAGS ); + add_rule(server, "Balance", value, NO_FLAGS); } - else if ( 0 == strcmp( "world", key ) ) + else if (0 == strcmp("world", key)) { // Current map - server->map_name = strdup( value ); + server->map_name = strdup(value); } - else if ( 0 == strcmp( "gametype", key ) ) + else if (0 == strcmp("gametype", key)) { // Game type - server->game = find_savage_game( value ); - add_rule( server, server->type->game_rule, server->game, NO_FLAGS ); + server->game = find_savage_game(value); + add_rule(server, server->type->game_rule, server->game, NO_FLAGS); } - else if ( 0 == strcmp( "pure", key ) ) + else if (0 == strcmp("pure", key)) { // Pure - add_rule( server, "Pure", value, NO_FLAGS ); + add_rule(server, "Pure", value, NO_FLAGS); } - else if ( 0 == strcmp( "time", key ) ) + else if (0 == strcmp("time", key)) { // Current game time - add_rule( server, "Time", value, NO_FLAGS ); + add_rule(server, "Time", value, NO_FLAGS); } - else if ( 0 == strcmp( "notes", key ) ) + else if (0 == strcmp("notes", key)) { // Notes - add_rule( server, "Notes", value, NO_FLAGS ); + add_rule(server, "Notes", value, NO_FLAGS); } - else if ( 0 == strcmp( "needcmdr", key ) ) + else if (0 == strcmp("needcmdr", key)) { // Need Commander - add_rule( server, "Need Commander", value, NO_FLAGS ); + add_rule(server, "Need Commander", value, NO_FLAGS); } - else if ( 0 == strcmp( "name", key ) ) + else if (0 == strcmp("name", key)) { // Server name - server->server_name = strdup( value ); + server->server_name = strdup(value); } - else if ( 0 == strcmp( "fw", key ) ) + else if (0 == strcmp("fw", key)) { // Firewalled - add_rule( server, "Firewalled", value, NO_FLAGS ); + add_rule(server, "Firewalled", value, NO_FLAGS); } - else if ( 0 == strcmp( "players", key ) ) + else if (0 == strcmp("players", key)) { // Players names @@ -9580,12 +10681,12 @@ // team name n++; - while( *n && *n != '\x0a' ) + while (*n && *n != '\x0a') { n++; } - if ( *n != '\x0a' ) + if (*n != '\x0a') { // Broken data break; @@ -9593,14 +10694,14 @@ *n = '\0'; player_name = ++n; - while( *n ) + while (*n) { - while( *n && *n != '\x0a' ) + while (*n && *n != '\x0a') { n++; } - if ( *n != '\x0a' ) + if (*n != '\x0a') { // Broken data break; @@ -9608,23 +10709,22 @@ *n = '\0'; n++; - if ( 0 == strncmp( "Team ", player_name, 5 ) ) + if (0 == strncmp("Team ", player_name, 5)) { team_name = player_name; team_number++; } else { - if ( 0 != strlen( player_name ) ) + if (0 != strlen(player_name)) { - struct player *player = add_player( server, player_number ); - if ( NULL != player ) + struct player *player = add_player(server, player_number); + if (NULL != player) { - player->name = strdup( player_name ); + player->name = strdup(player_name); player->team = team_number; - player->team_name = strdup( team_name ); - } - player_number++; + player->team_name = strdup(team_name); + } player_number++; } } player_name = n; @@ -9634,574 +10734,624 @@ *s = '\xFF'; } - cleanup_qserver( server, 1 ); - return; + return DONE_FORCE; } - - /* postions of map name, player name (in player substring), zero-based */ #define BFRIS_MAP_POS 18 #define BFRIS_PNAME_POS 11 -void -deal_with_bfris_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_bfris_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + int i, player_data_pos, nplayers; + SavedData *sdata; + unsigned char *saved_data; + int saved_data_size; + + debug( 2, "deal_with_bfris_packet %p, %d", server, pktlen ); + + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + + /* add to the data previously saved */ + sdata = &server->saved_data; + if (!sdata->data) + { + sdata->data = (char*)malloc(pktlen); + } + else + { + sdata->data = (char*)realloc(sdata->data, sdata->datalen + pktlen); + } + + memcpy(sdata->data + sdata->datalen, rawpkt, pktlen); + sdata->datalen += pktlen; + + saved_data = (unsigned char*)sdata->data; + saved_data_size = sdata->datalen; + + /* after we get the server portion of the data, server->game != NULL */ + if (!server->game) + { + + /* server data goes up to map name */ + if (sdata->datalen <= BFRIS_MAP_POS) + { + return 0; + } + + /* see if map name is complete */ + player_data_pos = 0; + for (i = BFRIS_MAP_POS; i < saved_data_size; i++) + { + if (saved_data[i] == '\0') + { + player_data_pos = i + 1; + /* data must extend beyond map name */ + if (saved_data_size <= player_data_pos) + { + return 0; + } + break; + } + } + + /* did we find beginning of player data? */ + if (!player_data_pos) + { + return 0; + } + + /* now we can go ahead and fill in server data */ + server->map_name = strdup((char*)saved_data + BFRIS_MAP_POS); + server->max_players = saved_data[12]; + server->protocol_version = saved_data[11]; + + /* save game type */ + switch (saved_data[13] &15) + { + case 0: + server->game = "FFA"; + break; + case 5: + server->game = "Rover"; + break; + case 6: + server->game = "Occupation"; + break; + case 7: + server->game = "SPAAL"; + break; + case 8: + server->game = "CTF"; + break; + default: + server->game = "unknown"; + break; + } + server->flags |= FLAG_DO_NOT_FREE_GAME; + add_rule(server, server->type->game_rule, server->game, NO_FLAGS); + + if (get_server_rules) + { + char buf[24]; + + /* server revision */ + sprintf(buf, "%d", (unsigned int)saved_data[11]); + add_rule(server, "Revision", buf, NO_FLAGS); + + /* latency */ + sprintf(buf, "%d", (unsigned int)saved_data[10]); + add_rule(server, "Latency", buf, NO_FLAGS); + + /* player allocation */ + add_rule(server, "Allocation", saved_data[13] &16 ? "Automatic" : "Manual", NO_FLAGS); + + } + + } + + /* If we got this far, we know the data saved goes at least to the start of + the player information, and that the server data is taken care of. + */ + + /* start of player data */ + player_data_pos = BFRIS_MAP_POS + strlen((char*)saved_data + BFRIS_MAP_POS) + 1; + + /* ensure all player data have arrived */ + nplayers = 0; + while (saved_data[player_data_pos] != '\0') + { + + player_data_pos += BFRIS_PNAME_POS; + + /* does player data extend to player name? */ + if (saved_data_size <= player_data_pos + 1) + { + return 0; + } + + /* does player data extend to end of player name? */ + for (i = 0; player_data_pos + i < saved_data_size; i++) + { + + if (saved_data_size == player_data_pos + i + 1) + { + return 0; + } + + if (saved_data[player_data_pos + i] == '\0') + { + player_data_pos += i + 1; + nplayers++; + break; + } + } + } + /* all player data are complete */ + + server->num_players = nplayers; + + if (get_player_info) + { + + /* start of player data */ + player_data_pos = BFRIS_MAP_POS + strlen((char*)saved_data + BFRIS_MAP_POS) + 1; + + for (i = 0; i < nplayers; i++) + { + struct player *player; + player = add_player(server, saved_data[player_data_pos]); + + player->ship = saved_data[player_data_pos + 1]; + player->ping = saved_data[player_data_pos + 2]; + player->frags = saved_data[player_data_pos + 3]; + player->team = saved_data[player_data_pos + 4]; + switch (player->team) + { + case 0: + player->team_name = "silver"; + break; + case 1: + player->team_name = "red"; + break; + case 2: + player->team_name = "blue"; + break; + case 3: + player->team_name = "green"; + break; + case 4: + player->team_name = "purple"; + break; + case 5: + player->team_name = "yellow"; + break; + case 6: + player->team_name = "cyan"; + break; + default: + player->team_name = "unknown"; + break; + } + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + player->room = saved_data[player_data_pos + 5]; + + /* score is little-endian integer */ + player->score = saved_data[player_data_pos + 7] + + (saved_data[player_data_pos + 8] << 8) + + (saved_data[player_data_pos + 9] << 16) + + (saved_data[player_data_pos + 10] << 24); + + /* for archs with > 4-byte int */ + if (player->score &0x80000000) + { + player->score = - (~(player->score)) - 1; + } + + + player_data_pos += BFRIS_PNAME_POS; + player->name = strdup((char*)saved_data + player_data_pos); + + player_data_pos += strlen(player->name) + 1; + } + + } + + server->server_name = BFRIS_SERVER_NAME; + + return DONE_FORCE; +} + +struct rule *add_uchar_rule(struct qserver *server, char *key, unsigned char value) { - int i, player_data_pos, nplayers; - SavedData *sdata; - unsigned char *saved_data; - int saved_data_size; - - server->ping_total += time_delta( &packet_recv_time, - &server->packet_time1); - - /* add to the data previously saved */ - sdata= & server->saved_data; - if (! sdata->data) - sdata->data = (char*)malloc(pktlen); - else - sdata->data = (char*)realloc(sdata->data,sdata->datalen + pktlen); - - memcpy(sdata->data + sdata->datalen, rawpkt, pktlen); - sdata->datalen += pktlen; - - saved_data= (unsigned char*) sdata->data; - saved_data_size= sdata->datalen; - - /* after we get the server portion of the data, server->game != NULL */ - if (!server->game) { - - /* server data goes up to map name */ - if (sdata->datalen <= BFRIS_MAP_POS) - return; - - /* see if map name is complete */ - player_data_pos=0; - for (i=BFRIS_MAP_POS; i<saved_data_size; i++) { - if (saved_data[i] == '\0') { - player_data_pos = i+1; - /* data must extend beyond map name */ - if (saved_data_size <= player_data_pos) - return; - break; - } - } - - /* did we find beginning of player data? */ - if (!player_data_pos) - return; - - /* now we can go ahead and fill in server data */ - server->map_name = strdup((char*)saved_data + BFRIS_MAP_POS); - server->max_players = saved_data[12]; - server->protocol_version = saved_data[11]; - - /* save game type */ - switch (saved_data[13] & 15) { - case 0: server->game = "FFA"; break; - case 5: server->game = "Rover"; break; - case 6: server->game = "Occupation"; break; - case 7: server->game = "SPAAL"; break; - case 8: server->game = "CTF"; break; - default: - server->game = "unknown"; break; - } - server->flags |= FLAG_DO_NOT_FREE_GAME; - add_rule(server,server->type->game_rule,server->game, NO_FLAGS); - - if (get_server_rules) { - char buf[24]; - - /* server revision */ - sprintf(buf,"%d",(unsigned int)saved_data[11]); - add_rule(server,"Revision",buf, NO_FLAGS); - - /* latency */ - sprintf(buf,"%d",(unsigned int)saved_data[10]); - add_rule(server,"Latency",buf, NO_FLAGS); - - /* player allocation */ - add_rule(server,"Allocation",saved_data[13] & 16 ? "Automatic" : "Manual", NO_FLAGS); - - } - - } - - /* If we got this far, we know the data saved goes at least to the start of - the player information, and that the server data is taken care of. - */ - - /* start of player data */ - player_data_pos = BFRIS_MAP_POS + strlen((char*)saved_data+BFRIS_MAP_POS) + 1; - - /* ensure all player data have arrived */ - nplayers = 0; - while (saved_data[player_data_pos] != '\0') { - - player_data_pos += BFRIS_PNAME_POS; - - /* does player data extend to player name? */ - if (saved_data_size <= player_data_pos + 1) - return; - - /* does player data extend to end of player name? */ - for (i=0; player_data_pos + i < saved_data_size; i++) { - - if (saved_data_size == player_data_pos + i + 1) - return; - - if (saved_data[player_data_pos + i] == '\0') { - player_data_pos += i + 1; - nplayers++; - break; - } - } - } - /* all player data are complete */ - - server->num_players = nplayers; - - if (get_player_info) { - - /* start of player data */ - player_data_pos = BFRIS_MAP_POS + strlen((char*)saved_data+BFRIS_MAP_POS) + 1; - - for (i=0; i<nplayers; i++) { - struct player *player; - player= add_player( server, saved_data[player_data_pos]); - - player->ship = saved_data[player_data_pos + 1]; - player->ping = saved_data[player_data_pos + 2]; - player->frags = saved_data[player_data_pos + 3]; - player->team = saved_data[player_data_pos + 4]; - switch (player->team) { - case 0: player->team_name = "silver"; break; - case 1: player->team_name = "red"; break; - case 2: player->team_name = "blue"; break; - case 3: player->team_name = "green"; break; - case 4: player->team_name = "purple"; break; - case 5: player->team_name = "yellow"; break; - case 6: player->team_name = "cyan"; break; - default: - player->team_name = "unknown"; break; - } - player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; - player->room = saved_data[player_data_pos + 5]; - - /* score is little-endian integer */ - player->score = - saved_data[player_data_pos+7] + - (saved_data[player_data_pos+8] << 8) + - (saved_data[player_data_pos+9] << 16) + - (saved_data[player_data_pos+10] << 24); - - /* for archs with > 4-byte int */ - if (player->score & 0x80000000) - player->score = -(~(player->score)) - 1; - - - player_data_pos += BFRIS_PNAME_POS; - player->name = strdup((char*)saved_data + player_data_pos); - - player_data_pos += strlen(player->name) + 1; - } - - } - - server->server_name = BFRIS_SERVER_NAME; - cleanup_qserver(server, 1); - return; -} - -struct rule * -add_uchar_rule( struct qserver *server, char *key, unsigned char value) -{ - char buf[24]; - sprintf( buf, "%u", (unsigned)value); - return add_rule( server, key, buf, NO_FLAGS); -} - -void -deal_with_descent3_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - char *pkt; - char buf[24]; - - if ( server->server_name == NULL) - server->ping_total += time_delta( &packet_recv_time, - &server->packet_time1); - - if ( pktlen < 4) { - fprintf( stderr, "short descent3 packet\n"); - print_packet( server, rawpkt, pktlen); - cleanup_qserver( server, 1); - return; - } - - /* 'info' response */ - if ( rawpkt[1] == 0x1f) { - if ( server->server_name != NULL) - { - cleanup_qserver( server, 1); - return; - } - - - pkt= &rawpkt[0x15]; - server->server_name= strdup( pkt); - pkt+= strlen(pkt)+2; - server->map_name= strdup( pkt); /* mission name (blah.mn3) */ - pkt+= strlen(pkt)+2; - add_rule( server, "level_name", pkt, NO_FLAGS); - pkt+= strlen(pkt)+2; - add_rule( server, "gametype", pkt, NO_FLAGS); - pkt+= strlen(pkt)+1; - - sprintf( buf, "%hu", swap_short_from_little(pkt)); - add_rule( server, "level_num", buf, NO_FLAGS); - pkt+=2; - server->num_players= swap_short_from_little(pkt); - pkt+=2; - server->max_players= swap_short_from_little(pkt); - pkt+=2; - - /* unknown/undecoded fields.. stuff like permissible, banned items/ships, etc */ - add_uchar_rule( server, "u0", pkt[0]); - add_uchar_rule( server, "u1", pkt[1]); - add_uchar_rule( server, "u2", pkt[2]); - add_uchar_rule( server, "u3", pkt[3]); - add_uchar_rule( server, "u4", pkt[4]); - add_uchar_rule( server, "u5", pkt[5]); - add_uchar_rule( server, "u6", pkt[6]); - add_uchar_rule( server, "u7", pkt[7]); - add_uchar_rule( server, "u8", pkt[8]); - - add_uchar_rule( server, "randpowerup", !(pkt[4]&1)); /* randomize powerup spawn */ - add_uchar_rule( server, "acccollisions", (pkt[5]&4) > 0); /* accurate collision detection */ - add_uchar_rule( server, "brightships", (pkt[5]&16) > 0); /* bright player ships */ - add_uchar_rule( server, "mouselook", (pkt[6]&1) > 0); /* mouselook enabled */ - sprintf( buf, "%s%s", (pkt[4]&16)?"PP":"CS", (pkt[6]&1)?"-ML":""); - add_rule( server, "servertype", buf, NO_FLAGS); - - sprintf( buf, "%hhu", pkt[9]); - add_rule( server, "difficulty", buf, NO_FLAGS); - - /* unknown/undecoded fields after known flags removed */ - add_uchar_rule( server, "x4", pkt[4] & ~(1+16)); - add_uchar_rule( server, "x5", pkt[5] & ~(4+16)); - add_uchar_rule( server, "x6", pkt[6] & ~1); - - if ( get_player_info && server->num_players) { - server->next_player_info= 0; - send_player_request_packet( server); - cleanup_qserver( server, 0); - return; - } - - } - /* MP_PLAYERLIST_DATA */ - else if ( rawpkt[1] == 0x73) { - struct player *player; - struct player **last_player= & server->players; - - if ( server->players != NULL) - { - cleanup_qserver( server, 1); - return; - } - - pkt= &rawpkt[0x4]; - while (*pkt) { - player= (struct player*) calloc( 1, sizeof(struct player)); - player->name= strdup( pkt); - pkt+= strlen(pkt) + 1; - *last_player= player; - last_player= & player->next; - } - server->next_player_info= NO_PLAYER_INFO; - } - else { - fprintf( stderr, "unknown d3 packet\n"); - print_packet( server, rawpkt, pktlen); - } - cleanup_qserver( server, 1); - return; -} - - -#define EYE_NAME_MASK 1 -#define EYE_TEAM_MASK 2 -#define EYE_SKIN_MASK 4 -#define EYE_SCORE_MASK 8 -#define EYE_PING_MASK 16 -#define EYE_TIME_MASK 32 - -void -deal_with_eye_packet( struct qserver *server, char *rawpkt, int pktlen) -{ - char *next, *end, *value, *key; - struct player **last_player; - unsigned char pkt_index, pkt_max; - unsigned int pkt_id; - - if ( pktlen < 4) - { - cleanup_qserver( server, 1); - return; - } - - if ( rawpkt[0] != 'E' || rawpkt[1] != 'Y' || rawpkt[2] != 'E') - { - cleanup_qserver( server, 1); - return; - } + char buf[24]; + sprintf(buf, "%u", (unsigned)value); + return add_rule(server, key, buf, NO_FLAGS); +} + +int deal_with_descent3_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + char *pkt; + char buf[24]; + + debug( 2, "deal_with_descent3_packet %p, %d", server, pktlen ); + + if (server->server_name == NULL) + { + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); + } + + if (pktlen < 4) + { + fprintf(stderr, "short descent3 packet\n"); + print_packet(server, rawpkt, pktlen); + return PKT_ERROR; + } + + /* 'info' response */ + if (rawpkt[1] == 0x1f) + { + if (server->server_name != NULL) + { + return PKT_ERROR; + } + + + pkt = &rawpkt[0x15]; + server->server_name = strdup(pkt); + pkt += strlen(pkt) + 2; + server->map_name = strdup(pkt); /* mission name (blah.mn3) */ + pkt += strlen(pkt) + 2; + add_rule(server, "level_name", pkt, NO_FLAGS); + pkt += strlen(pkt) + 2; + add_rule(server, "gametype", pkt, NO_FLAGS); + pkt += strlen(pkt) + 1; + + sprintf(buf, "%hu", swap_short_from_little(pkt)); + add_rule(server, "level_num", buf, NO_FLAGS); + pkt += 2; + server->num_players = swap_short_from_little(pkt); + pkt += 2; + server->max_players = swap_short_from_little(pkt); + pkt += 2; + + /* unknown/undecoded fields.. stuff like permissible, banned items/ships, etc */ + add_uchar_rule(server, "u0", pkt[0]); + add_uchar_rule(server, "u1", pkt[1]); + add_uchar_rule(server, "u2", pkt[2]); + add_uchar_rule(server, "u3", pkt[3]); + add_uchar_rule(server, "u4", pkt[4]); + add_uchar_rule(server, "u5", pkt[5]); + add_uchar_rule(server, "u6", pkt[6]); + add_uchar_rule(server, "u7", pkt[7]); + add_uchar_rule(server, "u8", pkt[8]); + + add_uchar_rule(server, "randpowerup", (unsigned char)!(pkt[4] &1)); /* + randomize powerup spawn */ + add_uchar_rule(server, "acccollisions", (unsigned char)((pkt[5] &4) > 0)); + /* accurate collision detection */ + add_uchar_rule(server, "brightships", (unsigned char)((pkt[5] &16) > 0)); + /* bright player ships */ + add_uchar_rule(server, "mouselook", (unsigned char)((pkt[6] &1) > 0)); /* + mouselook enabled */ + sprintf(buf, "%s%s", (pkt[4] &16) ? "PP" : "CS", (pkt[6] &1) ? "-ML" : ""); + add_rule(server, "servertype", buf, NO_FLAGS); + + sprintf(buf, "%hhu", pkt[9]); + add_rule(server, "difficulty", buf, NO_FLAGS); + + /* unknown/undecoded fields after known flags removed */ + add_uchar_rule(server, "x4", (unsigned char)(pkt[4] &~(1+16))); + add_uchar_rule(server, "x5", (unsigned char)(pkt[5] &~(4+16))); + add_uchar_rule(server, "x6", (unsigned char)(pkt[6] &~1)); + + if (get_player_info && server->num_players) + { + server->next_player_info = 0; + send_player_request_packet(server); + return INPROGRESS; + } + + } + /* MP_PLAYERLIST_DATA */ + else if (rawpkt[1] == 0x73) + { + struct player *player; + struct player **last_player = &server->players; + + if (server->players != NULL) + { + return PKT_ERROR; + } + + pkt = &rawpkt[0x4]; + while (*pkt) + { + player = (struct player*)calloc(1, sizeof(struct player)); + player->name = strdup(pkt); + pkt += strlen(pkt) + 1; + *last_player = player; + last_player = &player->next; + } + server->next_player_info = NO_PLAYER_INFO; + } + else + { + fprintf(stderr, "unknown d3 packet\n"); + print_packet(server, rawpkt, pktlen); + } + + return DONE_FORCE; +} + + +#define EYE_NAME_MASK 1 +#define EYE_TEAM_MASK 2 +#define EYE_SKIN_MASK 4 +#define EYE_SCORE_MASK 8 +#define EYE_PING_MASK 16 +#define EYE_TIME_MASK 32 + +int deal_with_eye_packet(struct qserver *server, char *rawpkt, int pktlen) +{ + char *next, *end, *value, *key; + struct player **last_player; + unsigned char pkt_index, pkt_max; + unsigned int pkt_id; + + debug( 2, "deal_with_eye_packet %p, %d", server, pktlen ); + + if (pktlen < 4) + { + return PKT_ERROR; + } - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1); + if (rawpkt[0] != 'E' || rawpkt[1] != 'Y' || rawpkt[2] != 'E') + { + return PKT_ERROR; + } - end= rawpkt + pktlen; - pkt_index= rawpkt[3] - '0'; + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); - if ( pktlen == 1364 || pkt_index != 1) + end = rawpkt + pktlen; + pkt_index = rawpkt[3] - '0'; + + if (pktlen == 1364 || pkt_index != 1) { /* fragmented packet */ SavedData *sdata; - /* EYE doesn't tell us how many packets to expect. Two packets + /* EYE doesn't tell us how many packets to expect. Two packets * is enough for 100+ players on a BF1942 server with standard * server rules. */ - pkt_max= 2; - memcpy( &pkt_id, &rawpkt[pktlen-4], 4); + pkt_max = 2; + memcpy(&pkt_id, &rawpkt[pktlen - 4], 4); - if ( server->saved_data.data == NULL) + if (server->saved_data.data == NULL) { - sdata= & server->saved_data; + sdata = &server->saved_data; } else { - sdata= (SavedData*) calloc( 1, sizeof(SavedData)); - sdata->next= server->saved_data.next; - server->saved_data.next= sdata; + sdata = (SavedData*)calloc(1, sizeof(SavedData)); + sdata->next = server->saved_data.next; + server->saved_data.next = sdata; } - sdata->pkt_index= pkt_index-1; - sdata->pkt_max= pkt_max; - sdata->pkt_id= pkt_id; - if ( pkt_index == 1) + sdata->pkt_index = pkt_index - 1; + sdata->pkt_max = pkt_max; + sdata->pkt_id = pkt_id; + if (pkt_index == 1) { - sdata->datalen= pktlen-4; + sdata->datalen = pktlen - 4; } else { - sdata->datalen= pktlen-8; + sdata->datalen = pktlen - 8; } - sdata->data= (char*) malloc( sdata->datalen); + sdata->data = (char*)malloc(sdata->datalen); - if ( NULL == sdata->data ) + if (NULL == sdata->data) { - fprintf( stderr, "Out of memory\n" ); - cleanup_qserver( server, 1 ); - return; + return MEM_ERROR; } - if ( pkt_index == 1) + + if (pkt_index == 1) { - memcpy( sdata->data, &rawpkt[0], sdata->datalen); + memcpy(sdata->data, &rawpkt[0], sdata->datalen); } else { - memcpy( sdata->data, &rawpkt[4], sdata->datalen); + memcpy(sdata->data, &rawpkt[4], sdata->datalen); } /* combine_packets will call us recursively */ - combine_packets( server); - return; - } + return combine_packets(server); + } - value= dup_n1string( &rawpkt[4], end, &next); - if ( value == NULL) + value = dup_n1string(&rawpkt[4], end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - add_rule( server, "gamename", value, NO_VALUE_COPY); + add_rule(server, "gamename", value, NO_VALUE_COPY); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - add_rule( server, "hostport", value, NO_VALUE_COPY); + add_rule(server, "hostport", value, NO_VALUE_COPY); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - server->server_name= value; + server->server_name = value; - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - server->game= value; - add_rule( server, server->type->game_rule, value, NO_FLAGS); + server->game = value; + add_rule(server, server->type->game_rule, value, NO_FLAGS); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - server->map_name= value; + server->map_name = value; - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - add_rule( server, "_version", value, NO_VALUE_COPY); + add_rule(server, "_version", value, NO_VALUE_COPY); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - add_rule( server, "_password", value, NO_VALUE_COPY); + add_rule(server, "_password", value, NO_VALUE_COPY); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - server->num_players= atoi(value); - free(value); + server->num_players = atoi(value); + free(value); - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { - goto eye_protocol_error; + return MEM_ERROR; } - server->max_players= atoi(value); - free(value); + server->max_players = atoi(value); + free(value); - /* rule1,value1,rule2,value2, ... empty string */ + /* rule1,value1,rule2,value2, ... empty string */ - do + do { - key= dup_n1string( next, end, &next); - if ( key == NULL) + key = dup_n1string(next, end, &next); + if (key == NULL) { break; } - else if ( key[0] == '\0') + else if (key[0] == '\0') { free(key); break; } - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { free(key); break; } - add_rule( server, key, value, NO_VALUE_COPY | NO_KEY_COPY); - } while ( 1); + add_rule(server, key, value, NO_VALUE_COPY | NO_KEY_COPY); + } + while (1); - /* [mask1]<name1><team1><skin1><score1><ping1><time1>[mask2]... */ + /* [mask1]<name1><team1><skin1><score1><ping1><time1>[mask2]... */ - last_player= & server->players; - while ( next && next < end ) + last_player = &server->players; + while (next && next < end) { struct player *player; - unsigned mask= *((unsigned char*)next); + unsigned mask = *((unsigned char*)next); next++; - if ( next >= end) + if (next >= end) { break; } - if ( mask == 0) + if (mask == 0) { break; } - player= (struct player*) calloc( 1, sizeof(struct player)); - if ( player == NULL) + player = (struct player*)calloc(1, sizeof(struct player)); + if (player == NULL) { break; } - if ( mask & EYE_NAME_MASK) + if (mask &EYE_NAME_MASK) { - player->name= dup_n1string( next, end, &next); + player->name = dup_n1string(next, end, &next); //fprintf( stderr, "Player '%s'\n", player->name ); - if ( player->name == NULL) + if (player->name == NULL) { break; } } - if ( mask & EYE_TEAM_MASK) + if (mask &EYE_TEAM_MASK) { - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { break; } - if ( isdigit((unsigned char)value[0])) + if (isdigit((unsigned char)value[0])) { - player->team= atoi(value); + player->team = atoi(value); free(value); } else { - player->team_name= value; + player->team_name = value; } } - if ( mask & EYE_SKIN_MASK) + if (mask &EYE_SKIN_MASK) { - player->skin= dup_n1string( next, end, &next); - if ( player->skin == NULL) + player->skin = dup_n1string(next, end, &next); + if (player->skin == NULL) { break; } } - if ( mask & EYE_SCORE_MASK) + if (mask &EYE_SCORE_MASK) { - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { break; } - player->score= atoi(value); - player->frags= player->score; + player->score = atoi(value); + player->frags = player->score; free(value); } - if ( mask & EYE_PING_MASK) + if (mask &EYE_PING_MASK) { - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { break; } - player->ping= atoi(value); + player->ping = atoi(value); free(value); } - if ( mask & EYE_TIME_MASK) + if (mask &EYE_TIME_MASK) { - value= dup_n1string( next, end, &next); - if ( value == NULL) + value = dup_n1string(next, end, &next); + if (value == NULL) { break; } - player->connect_time= atoi(value); + player->connect_time = atoi(value); free(value); } - *last_player= player; - last_player= & player->next; + *last_player = player; + last_player = &player->next; //fprintf( stderr, "Player '%s'\n", player->name ); - } - - cleanup_qserver( server, 1); - return; + } -eye_protocol_error: - cleanup_qserver( server, 1); + return DONE_FORCE; } static const char hl2_statusresponse[] = "\xFF\xFF\xFF\xFF\x49"; @@ -10211,9 +11361,7 @@ #define HL2_STATUS 1 #define HL2_PLAYERS 2 #define HL2_RULES 3 - -void -deal_with_hl2_packet( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_hl2_packet(struct qserver *server, char *rawpkt, int pktlen) { char *ptr = rawpkt; char *end = rawpkt + pktlen; @@ -10222,734 +11370,910 @@ unsigned char protocolver = 0; int n_sent = 0; + debug( 2, "deal_with_hl2_packet %p, %d", server, pktlen ); + server->n_servers++; - if ( server->server_name == NULL) + if (server->server_name == NULL) { - server->ping_total += time_delta( &packet_recv_time, &server->packet_time1); + server->ping_total += time_delta(&packet_recv_time, &server->packet_time1); } else { - gettimeofday( &server->packet_time1, NULL); + gettimeofday(&server->packet_time1, NULL); } // Check if correct reply - if ( pktlen < hl2_response_size ) + if (pktlen < hl2_response_size) { malformed_packet(server, "short response type"); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } else { - if ( 0 == memcmp( hl2_statusresponse, ptr, hl2_response_size ) ) + if (0 == memcmp(hl2_statusresponse, ptr, hl2_response_size)) { - if ( pktlen < hl2_response_size + 20 ) + if (pktlen < hl2_response_size + 20) { malformed_packet(server, "short packet"); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } type = HL2_STATUS; } - else if ( 0 == memcmp( hl2_playersresponse, ptr, hl2_response_size ) ) + else if (0 == memcmp(hl2_playersresponse, ptr, hl2_response_size)) { type = HL2_PLAYERS; } - else if ( 0 == memcmp( hl2_rulesresponse, ptr, hl2_response_size ) ) + else if (0 == memcmp(hl2_rulesresponse, ptr, hl2_response_size)) { type = HL2_RULES; } else { malformed_packet(server, "unknown response"); - cleanup_qserver( server, 1); - return; + return PKT_ERROR; } } // header ptr += hl2_response_size; - switch( type ) - { - case HL2_STATUS: - - // protocol version - protocolver = *ptr; - ptr++; - - debug(2, "protocol: 0x%02X", protocolver ); - // Commented out till out of beta -/* - if( '\x02' != protocolver ) - { - malformed_packet(server, "protocol version != 0x02"); - cleanup_qserver( server, 1); - return; - } -*/ + switch (type) + { + case HL2_STATUS: - server->protocol_version = protocolver; - sprintf( temp, "%d", protocolver ); - add_rule( server, "protocol", temp, NO_FLAGS); + // protocol version + protocolver = *ptr; + ptr++; - // server name - server->server_name = strdup( ptr ); - ptr += strlen( ptr ) + 1; + debug(2, "protocol: 0x%02X", protocolver); + // Commented out till out of beta + /* + if( '\x02' != protocolver ) + { + malformed_packet(server, "protocol version != 0x02"); + return PKT_ERROR; + } + */ - // map - server->map_name = strdup( ptr ); - ptr += strlen( ptr ) + 1; + server->protocol_version = protocolver; + sprintf(temp, "%d", protocolver); + add_rule(server, "protocol", temp, NO_FLAGS); - // gamedir - server->game = strdup( ptr ); - add_rule( server, "gamedir", ptr, NO_FLAGS ); - ptr += strlen( ptr ) + 1; + // server name + server->server_name = strdup(ptr); + ptr += strlen(ptr) + 1; - // description - add_rule( server, "description", ptr, NO_FLAGS ); - ptr += strlen( ptr ) + 1; + // map + server->map_name = strdup(ptr); + ptr += strlen(ptr) + 1; - // appid - ptr += 2; + // gamedir + server->game = strdup(ptr); + add_rule(server, "gamedir", ptr, NO_FLAGS); + ptr += strlen(ptr) + 1; - // num players - server->num_players = *ptr; - ptr++; + // description + add_rule(server, "description", ptr, NO_FLAGS); + ptr += strlen(ptr) + 1; - // max players - server->max_players = *ptr; - ptr++; + // appid + ptr += 2; - // bot players - sprintf( temp, "%hhu", (*ptr) ); - add_rule( server, "bot_players", temp, NO_FLAGS ); - ptr++; + // num players + server->num_players = *ptr; + ptr++; - // dedicated - if ( 'd' == *ptr ) - { - add_rule( server, "sv_type", "dedicated", NO_FLAGS ); - } - else if ( 'l' == *ptr ) - { - add_rule( server, "sv_type", "listen", NO_FLAGS ); - } - else - { - char tmp[2] = { *ptr, '\0' }; - add_rule( server, "sv_type", tmp, NO_FLAGS ); - } - ptr++; + // max players + server->max_players = *ptr; + ptr++; - // OS - if ( 'l' == *ptr ) - { - add_rule( server, "sv_os", "linux", NO_FLAGS ); - } - else if ( 'w' == *ptr ) - { - add_rule( server, "sv_os", "windows", NO_FLAGS ); - } - else - { - char tmp[2] = { *ptr, '\0' }; - add_rule( server, "sv_os", tmp, NO_FLAGS ); - } - ptr++; + // bot players + sprintf(temp, "%hhu", (*ptr)); + add_rule(server, "bot_players", temp, NO_FLAGS); + ptr++; - // passworded - add_rule( server, "sv_password", *ptr ? "1" : "0", NO_FLAGS); - ptr++; + // dedicated + if ('d' == *ptr) + { + add_rule(server, "sv_type", "dedicated", NO_FLAGS); + } + else if ('l' == *ptr) + { + add_rule(server, "sv_type", "listen", NO_FLAGS); + } + else + { + char tmp[2] = + { + *ptr, '\0' + } + ; + add_rule(server, "sv_type", tmp, NO_FLAGS); + } + ptr++; - // secure - add_rule( server, "secure", *ptr ? "1" : "0", NO_FLAGS); - ptr++; + // OS + if ('l' == *ptr) + { + add_rule(server, "sv_os", "linux", NO_FLAGS); + } + else if ('w' == *ptr) + { + add_rule(server, "sv_os", "windows", NO_FLAGS); + } + else + { + char tmp[2] = + { + *ptr, '\0' + } + ; + add_rule(server, "sv_os", tmp, NO_FLAGS); + } + ptr++; - // send the other request packets if wanted - if ( get_server_rules ) - { - int requests = server->n_requests; - send_rule_request_packet( server ); - server->n_requests = requests; // prevent wrong ping - n_sent++; - } - else if ( get_player_info ) - { - int requests = server->n_requests; - send_player_request_packet( server ) ; - server->n_requests = requests; // prevent wrong ping - n_sent++; - } - break; + // passworded + add_rule(server, "sv_password", *ptr ? "1" : "0", NO_FLAGS); + ptr++; - case HL2_RULES: - // num_players - ptr++; + // secure + add_rule(server, "secure", *ptr ? "1" : "0", NO_FLAGS); + ptr++; - // max_players - ptr++; - while ( ptr < end ) - { - char *var = ptr; - char *val; - ptr += strlen( var ) + 1; - val = ptr; - ptr += strlen( val ) + 1; - add_rule( server, var, val, NO_FLAGS ); - } + // send the other request packets if wanted + if (get_server_rules) + { + int requests = server->n_requests; + send_rule_request_packet(server); + server->n_requests = requests; // prevent wrong ping + n_sent++; + } + else if (get_player_info) + { + int requests = server->n_requests; + send_player_request_packet(server); + server->n_requests = requests; // prevent wrong ping + n_sent++; + } + break; - if ( get_player_info ) - { - send_player_request_packet( server ) ; - n_sent++; - } - break; + case HL2_RULES: + // num_players + ptr++; - case HL2_PLAYERS: - // num_players - ptr++; + // max_players + ptr++; + while (ptr < end) + { + char *var = ptr; + char *val; + ptr += strlen(var) + 1; + val = ptr; + ptr += strlen(val) + 1; + add_rule(server, var, val, NO_FLAGS); + } - while ( ptr < end ) - { - struct player *player = add_player( server, server->n_player_info ); + if (get_player_info) + { + send_player_request_packet(server); + n_sent++; + } + break; - // player no + case HL2_PLAYERS: + // num_players ptr++; - // name - player->name = strdup( ptr ); - ptr += strlen( ptr ) + 1; - - // frags - player->frags = swap_long_from_little( ptr ); - ptr += 4; - - // time - player->connect_time = swap_float_from_little( ptr ); - ptr += 4; - } + while (ptr < end) + { + struct player *player = add_player(server, server->n_player_info); - break; + // player no + ptr++; - default: - malformed_packet( server, "unknown response" ); - cleanup_qserver( server, 1); - return; - } + // name + player->name = strdup(ptr); + ptr += strlen(ptr) + 1; + // frags + player->frags = swap_long_from_little(ptr); + ptr += 4; - if ( 0 == n_sent ) - { - cleanup_qserver( server, 1 ); + // time + player->connect_time = swap_float_from_little(ptr); + ptr += 4; + } + + break; + + default: + malformed_packet(server, "unknown response"); + return PKT_ERROR; } - return; + + return ( 0 == n_sent ) ? DONE_FORCE : INPROGRESS; } -void -deal_with_gamespy_master_response( struct qserver *server, char *rawpkt, int pktlen) +int deal_with_gamespy_master_response(struct qserver *server, char *rawpkt, int pktlen) { - if ( pktlen == 0) { - int len= server->saved_data.datalen; - char *data= server->saved_data.data; - char *ip, *portstr; - unsigned int ipaddr; - unsigned short port; - int master_pkt_max; + debug( 2, "deal_with_gamespy_master_response %p, %d", server, pktlen ); + + if (pktlen == 0) + { + int len = server->saved_data.datalen; + char *data = server->saved_data.data; + char *ip, *portstr; + unsigned int ipaddr; + unsigned short port; + int master_pkt_max; - server->server_name= GAMESPY_MASTER_NAME; + server->server_name = GAMESPY_MASTER_NAME; - master_pkt_max= (len / 20) * 6; - server->master_pkt= (char*) malloc( master_pkt_max); - server->master_pkt_len= 0; - - while ( len) { - for ( ; len && *data == '\\'; data++, len--) ; - if ( len < 3) break; - if ( data[0] == 'i' && data[1] == 'p' && data[2] == '\\') { - data+= 3; - len-= 3; - ip= data; - portstr= NULL; - for ( ; len && *data != '\\'; data++, len--) { - if ( *data == ':') { - portstr= data+1; - *data= '\0'; - } - } - if ( len == 0) - break; - *data++= '\0'; - len--; - ipaddr= inet_addr( ip); - if ( portstr) - port= htons( (unsigned short)atoi( portstr)); - else - port= htons( 28000); /* ## default port */ - if ( server->master_pkt_len >= master_pkt_max) { - master_pkt_max+= 20*6; - server->master_pkt= (char*) realloc( server->master_pkt, - master_pkt_max); - } - memcpy( server->master_pkt + server->master_pkt_len, - &ipaddr, 4); - memcpy( server->master_pkt + server->master_pkt_len + 4, - &port, 2); - server->master_pkt_len+= 6; - } - else - for ( ; len && *data != '\\'; data++, len--) ; - } - - server->n_servers= server->master_pkt_len / 6; - server->next_player_info= -1; - server->retry1= 0; - - cleanup_qserver( server, 1); - return; - } - - if (! server->saved_data.data) - server->saved_data.data= (char*)malloc( pktlen); - else - server->saved_data.data= (char*)realloc( server->saved_data.data, - server->saved_data.datalen + pktlen); + master_pkt_max = (len / 20) *6; + server->master_pkt = (char*)malloc(master_pkt_max); + server->master_pkt_len = 0; + + while (len) + { + for (; len && *data == '\\'; data++, len--) + ; + if (len < 3) + { + break; + } + if (data[0] == 'i' && data[1] == 'p' && data[2] == '\\') + { + data += 3; + len -= 3; + ip = data; + portstr = NULL; + for (; len && *data != '\\'; data++, len--) + { + if (*data == ':') + { + portstr = data + 1; + *data = '\0'; + } + } + if (len == 0) + { + break; + } + *data++ = '\0'; + len--; + ipaddr = inet_addr(ip); + if (portstr) + { + port = htons((unsigned short)atoi(portstr)); + } + else + { + port = htons(28000); + } + /* ## default port */ + if (server->master_pkt_len >= master_pkt_max) + { + master_pkt_max += 20 * 6; + server->master_pkt = (char*)realloc(server->master_pkt, master_pkt_max); + } + memcpy(server->master_pkt + server->master_pkt_len, &ipaddr, 4); + memcpy(server->master_pkt + server->master_pkt_len + 4, &port, 2); + server->master_pkt_len += 6; + } + else + { + for (; len && *data != '\\'; data++, len--) + ; + } + } + + server->n_servers = server->master_pkt_len / 6; + server->next_player_info = - 1; + server->retry1 = 0; + + return DONE_FORCE; + } + + if (!server->saved_data.data) + { + server->saved_data.data = (char*)malloc(pktlen); + } + else + { + server->saved_data.data = (char*)realloc(server->saved_data.data, server->saved_data.datalen + pktlen); + } - memcpy( server->saved_data.data + server->saved_data.datalen, rawpkt, pktlen); - server->saved_data.datalen+= pktlen; + memcpy(server->saved_data.data + server->saved_data.datalen, rawpkt, pktlen); + server->saved_data.datalen += pktlen; + return INPROGRESS; } /* Misc utility functions */ -char * -strndup( const char *string, size_t len) +char *strndup(const char *string, size_t len) { - char *result; - result= (char*) malloc( len+1); - memcpy( result, string, len); - result[len]= '\0'; - return result; + char *result; + result = (char*)malloc(len + 1); + memcpy(result, string, len); + result[len] = '\0'; + return result; } -unsigned int -swap_long( void *l) +unsigned int swap_long(void *l) { - unsigned char *b= (unsigned char *) l; - return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); + unsigned char *b = (unsigned char*)l; + return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24); } -unsigned short -swap_short( void *l) +unsigned short swap_short(void *l) { - unsigned char *b= (unsigned char *) l; - return (unsigned short)b[0] | (b[1]<<8); + unsigned char *b = (unsigned char*)l; + return (unsigned short)b[0] | (b[1] << 8); } -unsigned int -swap_long_from_little( void *l) +unsigned int swap_long_from_little(void *l) { - unsigned char *b= (unsigned char *) l; - unsigned int result; - if ( little_endian) - memcpy( &result, l, 4); - else - result= (unsigned int)b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); - return result; + unsigned char *b = (unsigned char*)l; + unsigned int result; + if (little_endian) + { + memcpy(&result, l, 4); + } + else + { + result = (unsigned int)b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24); + } + return result; } -float -swap_float_from_little( void *f ) +float swap_float_from_little(void *f) { - union { + union + { int i; float fl; } temp; temp.i = swap_long_from_little(f); return temp.fl; -}; +} -unsigned short -swap_short_from_little( void *l) +unsigned short swap_short_from_little(void *l) { - unsigned char *b= (unsigned char *) l; - unsigned short result; - if ( little_endian) - memcpy( &result, l, 2); - else - result= (unsigned short)b[0] | ((unsigned short)b[1]<<8); - return result; + unsigned char *b = (unsigned char*)l; + unsigned short result; + if (little_endian) + { + memcpy(&result, l, 2); + } + else + { + result = (unsigned short)b[0] | ((unsigned short)b[1] << 8); + } + return result; } /** write four byte to buf */ -void put_long_little(unsigned val, char* buf) +void put_long_little(unsigned val, char *buf) { - buf[0] = val & 0xFF; - buf[1] = (val >> 8) & 0xFF; - buf[2] = (val >> 16) & 0xFF; - buf[3] = (val >> 24) & 0xFF; + buf[0] = val &0xFF; + buf[1] = (val >> 8) &0xFF; + buf[2] = (val >> 16) &0xFF; + buf[3] = (val >> 24) &0xFF; } #define MAXSTRLEN 2048 -char * -xml_escape( char *string) +char *xml_escape(char *string) { - static char _buf[4][MAXSTRLEN+8]; - static int _buf_index= 0; - char *result, *b, *end; - unsigned char c; + static unsigned char _buf[4][MAXSTRLEN + 8]; + static int _buf_index = 0; + unsigned char *result, *b, *end; + unsigned int c; - if ( string == NULL) - return ""; + if (string == NULL) + { + return ""; + } - result= &_buf[_buf_index][0]; - _buf_index= (_buf_index+1) % 4; + result = &_buf[_buf_index][0]; + _buf_index = (_buf_index + 1) % 4; - end= &result[MAXSTRLEN]; + end = &result[MAXSTRLEN]; - b= result; - for ( ; *string && b < end; string++) { - c= *string; - switch ( c) { - case '&': - *b++= '&'; - *b++= 'a'; - *b++= 'm'; - *b++= 'p'; - *b++= ';'; - continue; - case '<': - *b++= '&'; - *b++= 'l'; - *b++= 't'; - *b++= ';'; - continue; - case '>': - *b++= '&'; - *b++= 'g'; - *b++= 't'; - *b++= ';'; - continue; - default: - break; - } - if ( ! name_xforms) { - *b++= c; - } - else if ( xml_encoding == ENCODING_LATIN_1) { - if ( isprint(c)) - *b++= c; - else - b+= sprintf( b, "&#%u;", c); - } - else if ( xml_encoding == ENCODING_UTF_8) { - if ( (c & 0x80) == 0) - *b++= c; - else { - *b++= 0xC0 | (0x03 & (c >> 6)) ; - *b++= 0x80 | (0x3F & c) ; - } + b = result; + for (; *string && b < end; string++) + { + c = *string; + switch (c) + { + case '&': + *b++ = '&'; + *b++ = 'a'; + *b++ = 'm'; + *b++ = 'p'; + *b++ = ';'; + continue; + case '\'': + *b++ = '&'; + *b++ = 'a'; + *b++ = 'p'; + *b++ = 'o'; + *b++ = 's'; + *b++ = ';'; + continue; + case '"': + *b++ = '&'; + *b++ = 'q'; + *b++ = 'u'; + *b++ = 'o'; + *b++ = 't'; + *b++ = ';'; + continue; + case '<': + *b++ = '&'; + *b++ = 'l'; + *b++ = 't'; + *b++ = ';'; + continue; + case '>': + *b++ = '&'; + *b++ = 'g'; + *b++ = 't'; + *b++ = ';'; + continue; + default: + break; + } + + // Validate character + // http://www.w3.org/TR/2000/REC-xml-20001006#charsets + if ( ! + ( + 0x09 == c || + 0xA == c || + 0xD == c || + ( 0x20 <= c && 0xD7FF >= c ) || + ( 0xE000 <= c && 0xFFFD >= c ) || + ( 0x10000 <= c && 0x10FFFF >= c ) + ) + ) + { + fprintf(stderr, "Encoding error (%d) for U+%x, D+%d\n", 1, c, c); + } + else if (xml_encoding == ENCODING_LATIN_1) + { + if (!name_xforms) + { + *b++ = c; + } + else + { + if (isprint(c)) + { + *b++ = c; + } + else + { + b += sprintf( (char *)b, "&#%u;", c); + } + } + } + else if (xml_encoding == ENCODING_UTF_8) + { + unsigned char tempbuf[10] = + { + 0 + }; + unsigned char *buf = &tempbuf[0]; + int bytes = 0; + int error = 1; + + // Valid character ranges + if ( + 0x09 == c || + 0xA == c || + 0xD == c || + ( 0x20 <= c && 0xD7FF >= c ) || + ( 0xE000 <= c && 0xFFFD >= c ) || + ( 0x10000 <= c && 0x10FFFF >= c ) + ) + { + error = 0; + } + + if (c < 0x80) + /* 0XXX XXXX one byte */ + { + buf[0] = c; + bytes = 1; + } + else if (c < 0x0800) + /* 110X XXXX two bytes */ + { + buf[0] = 0xC0 | (0x03 &(c >> 6)); + buf[1] = 0x80 | (0x3F &c); + bytes = 2; + } + else if (c < 0x10000) + /* 1110 XXXX three bytes */ + { + buf[0] = 0xE0 | (c >> 12); + buf[1] = 0x80 | ((c >> 6) &0x3F); + buf[2] = 0x80 | (c &0x3F); + + bytes = 3; + if (c == UTF8BYTESWAPNOTACHAR || c == UTF8NOTACHAR) + { + error = 3; + } + + } + else if (c < 0x10FFFF) + /* 1111 0XXX four bytes */ + { + buf[0] = 0xF0 | (c >> 18); + buf[1] = 0x80 | ((c >> 12) &0x3F); + buf[2] = 0x80 | ((c >> 6) &0x3F); + buf[3] = 0x80 | (c &0x3F); + bytes = 4; + if (c > UTF8MAXFROMUCS4) + { + error = 4; + } + + } + else if (c < 0x4000000) + /* 1111 10XX five bytes */ + { + buf[0] = 0xF8 | (c >> 24); + buf[1] = 0x80 | (c >> 18); + buf[2] = 0x80 | ((c >> 12) &0x3F); + buf[3] = 0x80 | ((c >> 6) &0x3F); + buf[4] = 0x80 | (c &0x3F); + bytes = 5; + error = 5; + } + else if (c < 0x80000000) + /* 1111 110X six bytes */ + { + buf[0] = 0xFC | (c >> 30); + buf[1] = 0x80 | ((c >> 24) &0x3F); + buf[2] = 0x80 | ((c >> 18) &0x3F); + buf[3] = 0x80 | ((c >> 12) &0x3F); + buf[4] = 0x80 | ((c >> 6) &0x3F); + buf[5] = 0x80 | (c &0x3F); + bytes = 6; + error = 6; + } + else + { + error = 7; + } + + if (error) + { + int i; + fprintf(stderr, "UTF-8 encoding error (%d) for U+%x, D+%d : ", error, c, c); + for (i = 0; i < bytes; i++) + { + fprintf(stderr, "0x%02x ", buf[i]); + } + fprintf(stderr, "\n"); + } + else + { + int i; + for (i = 0; i < bytes; ++i) + { + *b++ = buf[i]; + } + } + + } } - } - *b= '\0'; - return result; + *b = '\0'; + return (char*)result; } -static char *quake3_escape_colors[8] = { -"black", "red", "green", "yellow", "blue", "cyan", "magenta", "white" +static char *quake3_escape_colors[8] = +{ + "black", "red", "green", "yellow", "blue", "cyan", "magenta", "white" }; -static char *sof_colors[32] = { -"FFFFFF","FFFFFF","FF0000","00FF00","FFFF00","0000FF","FF00FF","00FFFF", -"000000","7F7F7F","702D07","7F0000","007F00","FFFFFF","007F7F","00007F", -"564D28","4C5E36","370B65","005572","54647E","1E2A63","66097B","705E61", -"980053","960018","702D07","54492A","61A997","CB8F39","CF8316","FF8020" +static char *sof_colors[32] = +{ + "FFFFFF", "FFFFFF", "FF0000", "00FF00", "FFFF00", "0000FF", "FF00FF", "00FFFF", "000000", "7F7F7F", "702D07", "7F0000", "007F00", + "FFFFFF", "007F7F", "00007F", "564D28", "4C5E36", "370B65", "005572", "54647E", "1E2A63", "66097B", "705E61", "980053", + "960018", "702D07", "54492A", "61A997", "CB8F39", "CF8316", "FF8020" }; -char * -xform_name( char *string, struct qserver *server) +char *xform_name(char *string, struct qserver *server) { static char _buf1[2048], _buf2[2048]; - static char *_q= &_buf1[0]; - unsigned char *s= (unsigned char*) string; + static char *_q = &_buf1[0]; + unsigned char *s = (unsigned char*)string; char *q; int is_server_name = (string == server->server_name); - int font_tag= 0; + int font_tag = 0; - _q= _q == _buf1 ? _buf2 : _buf1; - q= _q; + _q = _q == _buf1 ? _buf2 : _buf1; + q = _q; - if ( s == NULL) + if (s == NULL) { - q[0]= '?'; - q[1]= '\0'; + q[0] = '?'; + q[1] = '\0'; return _q; } - if ( ! name_xforms) { - strcpy( _q, string); + if (!name_xforms) + { + strcpy(_q, string); return _q; } - if ( (hex_player_names && !is_server_name) || (hex_server_names && is_server_name)) + if ((hex_player_names && !is_server_name) || (hex_server_names && is_server_name)) { - for ( ; *s; s++, q+= 2) + for (; *s; s++, q += 2) { - sprintf( q, "%02x", *s); + sprintf(q, "%02x", *s); } - *q= '\0'; + *q = '\0'; return _q; } - if ( server->type->flags & TF_QUAKE3_NAMES) + if (server->type->flags &TF_QUAKE3_NAMES) { - for ( ; *s; s++) + for (; *s; s++) { - if ( *s == '^' && *(s+1) != '^') + if (*s == '^' && *(s + 1) != '^') { - if ( *(s+1) == '\0') + if (*(s + 1) == '\0') { break; } - if ( html_names == 1) + if (html_names == 1) { - q+= sprintf( q, "%s<font color=\"%s\">", - font_tag?"</font>":"", - quake3_escape_colors[ *(s+1) & 0x7]); + q += sprintf(q, "%s<font color=\"%s\">", font_tag ? "</font>" : "", quake3_escape_colors[*(s + 1) &0x7]); s++; - font_tag= 1; + font_tag = 1; } - else if ( strip_carets) + else if (strip_carets) { s++; } else { - *q++= *s; + *q++ = *s; } } else { - int inc = html_entity( *s, q ); - if ( 0 != inc ) + int inc = html_entity(*s, q); + if (0 != inc) { q += inc; } - else if ( isprint(*s)) - { - *q++= *s; - } - else if ( *s == '\033') + else if (isprint(*s)) { + *q++ = *s; } - else if ( *s == 0x80) + else if (*s == '\033'){} + else if (*s == 0x80) { - *q++= '('; + *q++ = '('; } - else if ( *s == 0x81) + else if (*s == 0x81) { - *q++= '='; + *q++ = '='; } - else if ( *s == 0x82) + else if (*s == 0x82) { - *q++= ')'; + *q++ = ')'; } - else if ( *s == 0x10 || *s == 0x90) + else if (*s == 0x10 || *s == 0x90) { - *q++= '['; + *q++ = '['; } - else if ( *s == 0x11 || *s == 0x91) + else if (*s == 0x11 || *s == 0x91) { - *q++= ']'; + *q++ = ']'; } - else if ( *s >= 0x92 && *s <= 0x9a) + else if (*s >= 0x92 && *s <= 0x9a) { - *q++= *s - 98; + *q++ = *s - 98; } - else if ( *s >= 0xa0 && *s <= 0xe0) + else if (*s >= 0xa0 && *s <= 0xe0) { - *q++= *s - 128; + *q++ = *s - 128; } - else if ( *s >= 0xe1 && *s <= 0xfa) + else if (*s >= 0xe1 && *s <= 0xfa) { - *q++= *s - 160; + *q++ = *s - 160; } - else if ( *s >= 0xfb && *s <= 0xfe) + else if (*s >= 0xfb && *s <= 0xfe) { - *q++= *s - 128; + *q++ = *s - 128; } } } - *q= '\0'; + *q = '\0'; } - else if ( !is_server_name && (server->type->flags & TF_TRIBES2_NAMES)) + else if (!is_server_name && (server->type->flags &TF_TRIBES2_NAMES)) { - for ( ; *s; s++) + for (; *s; s++) { - int inc = html_entity( *s, q ); - if ( 0 != inc ) + int inc = html_entity(*s, q); + if (0 != inc) { q += inc; continue; } - else if ( isprint(*s)) + else if (isprint(*s)) { - *q++= *s; + *q++ = *s; continue; } - if ( html_names == 1 && s[1] != '\0') + if (html_names == 1 && s[1] != '\0') { char *font_color; - switch( *s) + switch (*s) { - case 0x8: font_color= "white"; break; /* normal */ - case 0xb: font_color= "yellow"; break; /* tribe tag */ - case 0xc: font_color= "blue"; break; /* alias */ - case 0xe: font_color= "green"; break; /* bot */ - default: font_color= NULL; + case 0x8: + font_color = "white"; + break; /* normal */ + case 0xb: + font_color = "yellow"; + break; /* tribe tag */ + case 0xc: + font_color = "blue"; + break; /* alias */ + case 0xe: + font_color = "green"; + break; /* bot */ + default: + font_color = NULL; } - if ( font_color) + if (font_color) { - q+= sprintf( q, "%s<font color=\"%s\">", - font_tag?"</font>":"", - font_color); - font_tag= 1; + q += sprintf(q, "%s<font color=\"%s\">", font_tag ? "</font>" : "", font_color); + font_tag = 1; } } } - *q= '\0'; + *q = '\0'; } - else if ( server->type->flags & TF_U2_NAMES ) + else if (server->type->flags &TF_U2_NAMES) { - for ( ; *s; s++) + for (; *s; s++) { - if ( 0 == memcmp( s, "^\1", 2 ) ) + if (0 == memcmp(s, "^\1", 2)) { // xmp Color follows s += 2; - q += u2xmp_html_color( (unsigned char)*s, q, &font_tag ); + q += u2xmp_html_color((unsigned char) *s, q, &font_tag); } - else if ( 0 == memcmp( s, "\x1b", 1 ) ) + else if (0 == memcmp(s, "\x1b", 1)) { // Color follows s += 1; - q += ut2k4_html_color( s, q, &font_tag ); + q += ut2k4_html_color(s, q, &font_tag); s += 2; } else { - int inc = html_entity( *s, q ); - if ( 0 != inc ) + int inc = html_entity(*s, q); + if (0 != inc) { q += inc; } - else if ( isprint(*s)) + else if (isprint(*s)) { - *q++= *s; + *q++ = *s; } - else if ( 0xa0 == *s ) + else if (0xa0 == *s) { - *q++= ' '; + *q++ = ' '; } } } *q = '\0'; } - else if ( server->type->flags & TF_TM_NAMES ) + else if (server->type->flags &TF_TM_NAMES) { int open = 0; - for ( ; *s; s++) + for (; *s; s++) { - if ( *s == '$' ) - { - s++; - switch ( *s ) - { - case 'i': - case 'I': - // italic - if ( 1 == html_names ) - { - strcat( q, "<span style=\"font-style:italic\">" ); - q += 32; - open++; - } - break; - case 's': - case 'S': - // shadowed - break; - case 'w': - case 'W': - // wide - break; - case 'n': - case 'N': - // narrow - break; - case 'm': - case 'M': - // normal - if ( 1 == html_names ) - { - strcat( q, "<span style=\"font-style:normal\">" ); - q += 32; - open++; - } - break; - case 'g': - case 'G': - // default color - strcat( q, "<span style=\"color:black\">" ); - q += 26; - open++; - break; - case 'z': - case 'Z': - // reset all - while ( open ) - { - strcat( q, "</span>" ); - q += 7; - open--; - } - open = 0; - break; - case 't': - case 'T': - // capitalise - if ( 1 == html_names ) - { - strcat( q, "<span style=\"text-transform:capitalize\">" ); - q += 40; - open++; - } - break; - case '$': - // literal $ - *q++ = '$'; - break; - default: - // color - if ( 1 == html_names ) - { - sprintf( q, "<span style=\"color:%c%c%c%c%c%c\">", *s, *s, *(s+1), *(s+1), *(s+2), *(s+2) ); - q += 27; + if (*s == '$') + { + s++; + switch (*s) + { + case 'i': + case 'I': + // italic + if (1 == html_names) + { + strcat(q, "<span style=\"font-style:italic\">"); + q += 32; + open++; + } + break; + case 's': + case 'S': + // shadowed + break; + case 'w': + case 'W': + // wide + break; + case 'n': + case 'N': + // narrow + break; + case 'm': + case 'M': + // normal + if (1 == html_names) + { + strcat(q, "<span style=\"font-style:normal\">"); + q += 32; + open++; + } + break; + case 'g': + case 'G': + // default color + strcat(q, "<span style=\"color:black\">"); + q += 26; open++; - } - if ( *(s+1) ) - { - s++; - } - if ( *(s+1) ) - { - s++; - } - break; + break; + case 'z': + case 'Z': + // reset all + while (open) + { + strcat(q, "</span>"); + q += 7; + open--; + } + open = 0; + break; + case 't': + case 'T': + // capitalise + if (1 == html_names) + { + strcat(q, "<span style=\"text-transform:capitalize\">"); + q += 40; + open++; + } + break; + case '$': + // literal $ + *q++ = '$'; + break; + default: + // color + if (1 == html_names) + { + sprintf(q, "<span style=\"color:%c%c%c%c%c%c\">", *s, *s, *(s + 1), *(s + 1), *(s + 2), *(s + 2)); + q += 27; + open++; + } + if (*(s + 1)) + { + s++; + } + if (*(s + 1)) + { + s++; + } + break; } } else @@ -10958,89 +12282,84 @@ } } - while ( open ) + while (open) { - strcat( q, "</span>" ); + strcat(q, "</span>"); q += 7; open--; } *q = '\0'; } - else if ( !is_server_name || server->type->flags & TF_SOF_NAMES ) + else if (!is_server_name || server->type->flags &TF_SOF_NAMES) { // Catch all for NOT is_server_name OR TF_SOF_NAMES // The may not be the intention but is needed for q1 at least - for ( ; *s; s++) + for (; *s; s++) { - int inc = html_entity( *s, q ); - if ( 0 != inc ) + int inc = html_entity(*s, q); + if (0 != inc) { q += inc; continue; } - if ( *s < ' ' ) + if (*s < ' ') { - if ( html_names == 1) + if (html_names == 1) { - q+= sprintf( q, "%s<font color=\"#%s\">", - font_tag?"</font>":"", - sof_colors[ *(s) ]); - font_tag= 1; + q += sprintf(q, "%s<font color=\"#%s\">", font_tag ? "</font>" : "", sof_colors[*(s)]); + font_tag = 1; } } - else if ( isprint(*s)) + else if (isprint(*s)) { - *q++= *s; + *q++ = *s; } // ## more fixes below; double check against real sof servers - else if ( *s >= 0xa0) + else if (*s >= 0xa0) { - *q++= *s & 0x7f; + *q++ = *s &0x7f; } - else if ( *s >= 0x92 && *s < 0x9c) + else if (*s >= 0x92 && *s < 0x9c) { - *q++= '0' + (*s - 0x92); + *q++ = '0' + (*s - 0x92); } - else if ( *s >= 0x12 && *s < 0x1c) + else if (*s >= 0x12 && *s < 0x1c) { - *q++= '0' + (*s - 0x12); + *q++ = '0' + (*s - 0x12); } - else if ( *s == 0x90 || *s == 0x10) + else if (*s == 0x90 || *s == 0x10) { - *q++= '['; + *q++ = '['; } - else if ( *s == 0x91 || *s == 0x11) + else if (*s == 0x91 || *s == 0x11) { - *q++= ']'; + *q++ = ']'; } - else if ( *s == 0xa || *s == 0xc || *s == 0xd) + else if (*s == 0xa || *s == 0xc || *s == 0xd) { - *q++= ']'; + *q++ = ']'; } } - *q= '\0'; + *q = '\0'; } else { - strcpy( _q, string); + strcpy(_q, string); } - if ( font_tag ) + if (font_tag) { - q+= sprintf( q, "</font>"); + q += sprintf(q, "</font>"); } return _q; } - -int u2xmp_html_color( short color, char *dest, int *font_tag ) +int u2xmp_html_color(short color, char *dest, int *font_tag) { - if ( 1 == html_names ) + if (1 == html_names) { - int len = sprintf( dest, "%s<font color=\"%s\">", - *font_tag ? "</font>" : "", unreal_rgb_colors[ color - 1 ] - ); + int len = sprintf(dest, "%s<font color=\"%s\">", *font_tag ? "</font>" : "", unreal_rgb_colors[color - 1]); *font_tag = 1; return len; @@ -11048,16 +12367,11 @@ return 0; } -int ut2k4_html_color( const unsigned char *color, char *dest, int *font_tag ) +int ut2k4_html_color(const unsigned char *color, char *dest, int *font_tag) { - if ( 1 == html_names ) + if (1 == html_names) { - int len = sprintf( dest, "%s<font color=\"#%02hhx%02hhx%02hhx\">", - *font_tag ? "</font>" : "", - color[0], - color[1], - color[2] - ); + int len = sprintf(dest, "%s<font color=\"#%02hhx%02hhx%02hhx\">", *font_tag ? "</font>" : "", color[0], color[1], color[2]); *font_tag = 1; return len; @@ -11065,188 +12379,216 @@ return 0; } -int -is_default_rule( struct rule *rule) +int is_default_rule(struct rule *rule) { - if ( strcmp( rule->name, "sv_maxspeed") == 0) - return strcmp( rule->value, Q_DEFAULT_SV_MAXSPEED) == 0; - if ( strcmp( rule->name, "sv_friction") == 0) - return strcmp( rule->value, Q_DEFAULT_SV_FRICTION) == 0; - if ( strcmp( rule->name, "sv_gravity") == 0) - return strcmp( rule->value, Q_DEFAULT_SV_GRAVITY) == 0; - if ( strcmp( rule->name, "noexit") == 0) - return strcmp( rule->value, Q_DEFAULT_NOEXIT) == 0; - if ( strcmp( rule->name, "teamplay") == 0) - return strcmp( rule->value, Q_DEFAULT_TEAMPLAY) == 0; - if ( strcmp( rule->name, "timelimit") == 0) - return strcmp( rule->value, Q_DEFAULT_TIMELIMIT) == 0; - if ( strcmp( rule->name, "fraglimit") == 0) - return strcmp( rule->value, Q_DEFAULT_FRAGLIMIT) == 0; - return 0; -} - -int html_entity( const char c, char *dest ) -{ - if ( html_mode ) - { - switch( c ) - { - case '<': - strcpy( dest, "<" ); - return 4; - case '>': - strcpy( dest, ">" ); - return 4; - case '&': - strcpy( dest, "&" ); - return 5; - default: - break; + if (strcmp(rule->name, "sv_maxspeed") == 0) + { + return strcmp(rule->value, Q_DEFAULT_SV_MAXSPEED) == 0; + } if (strcmp(rule->name, "sv_friction") == 0) + { + return strcmp(rule->value, Q_DEFAULT_SV_FRICTION) == 0; + } + if (strcmp(rule->name, "sv_gravity") == 0) + { + return strcmp(rule->value, Q_DEFAULT_SV_GRAVITY) == 0; + } + if (strcmp(rule->name, "noexit") == 0) + { + return strcmp(rule->value, Q_DEFAULT_NOEXIT) == 0; + } + if (strcmp(rule->name, "teamplay") == 0) + { + return strcmp(rule->value, Q_DEFAULT_TEAMPLAY) == 0; + } + if (strcmp(rule->name, "timelimit") == 0) + { + return strcmp(rule->value, Q_DEFAULT_TIMELIMIT) == 0; + } + if (strcmp(rule->name, "fraglimit") == 0) + { + return strcmp(rule->value, Q_DEFAULT_FRAGLIMIT) == 0; + } + return 0; +} + +int html_entity(const char c, char *dest) +{ + if (html_mode) + { + switch (c) + { + case '<': + strcpy(dest, "<"); + return 4; + case '>': + strcpy(dest, ">"); + return 4; + case '&': + strcpy(dest, "&"); + return 5; + default: + break; } } return 0; } -char * -strherror( int h_err) +char *strherror(int h_err) +{ + static char msg[100]; + switch (h_err) + { + case HOST_NOT_FOUND: + return "host not found"; + case TRY_AGAIN: + return "try again"; + case NO_RECOVERY: + return "no recovery"; + case NO_ADDRESS: + return "no address"; + default: + sprintf(msg, "%d", h_err); + return msg; + } +} + +int time_delta(struct timeval *later, struct timeval *past) +{ + if (later->tv_usec < past->tv_usec) + { + later->tv_sec--; + later->tv_usec += 1000000; + } + return (later->tv_sec - past->tv_sec) *1000+(later->tv_usec - past->tv_usec) / 1000; +} + +int connection_inprogress() +{ +#ifdef _WIN32 + return WSAGetLastError() == WSAEWOULDBLOCK; +#else + return errno == EINPROGRESS; +#endif +} + +int connection_refused() +{ +#ifdef _WIN32 + return WSAGetLastError() == WSAECONNABORTED; +#else + return errno == ECONNREFUSED; +#endif +} + +int connection_would_block() { - static char msg[100]; - switch (h_err) { - case HOST_NOT_FOUND: return "host not found"; - case TRY_AGAIN: return "try again"; - case NO_RECOVERY: return "no recovery"; - case NO_ADDRESS: return "no address"; - default: sprintf( msg, "%d", h_err); return msg; - } -} - -int -time_delta( struct timeval *later, struct timeval *past) -{ - if ( later->tv_usec < past->tv_usec) { - later->tv_sec--; - later->tv_usec+= 1000000; - } - return (later->tv_sec - past->tv_sec) * 1000 + - (later->tv_usec - past->tv_usec) / 1000; +#ifdef _WIN32 + return WSAGetLastError() == WSAEWOULDBLOCK; +#else + return errno == EAGAIN; +#endif } -int -connection_refused() +int connection_reset() { #ifdef _WIN32 - return WSAGetLastError() == WSAECONNABORTED; + return WSAGetLastError() == WSAECONNRESET; #else - return errno == ECONNREFUSED; + return errno == ECONNRESET; #endif } -void -set_non_blocking( int fd) +void set_non_blocking(int fd) { #ifdef _WIN32 - int one= 1; - ioctlsocket( fd, FIONBIO, (unsigned long*)&one); + int one = 1; + ioctlsocket(fd, FIONBIO, (unsigned long*) &one); #else #ifdef O_NONBLOCK - fcntl( fd, F_SETFL, O_NONBLOCK); + fcntl(fd, F_SETFL, O_NONBLOCK); #else - fcntl( fd, F_SETFL, O_NDELAY); + fcntl(fd, F_SETFL, O_NDELAY); #endif // O_NONBLOCK #endif // _WIN32 } -char * -quake_color( int color) +char *quake_color(int color) { - static char *colors[] = { - "White", /* 0 */ - "Brown", /* 1 */ - "Lavender", /* 2 */ - "Khaki", /* 3 */ - "Red", /* 4 */ - "Lt Brown", /* 5 */ - "Peach", /* 6 */ - "Lt Peach", /* 7 */ - "Purple", /* 8 */ - "Dk Purple", /* 9 */ - "Tan", /* 10 */ - "Green", /* 11 */ - "Yellow", /* 12 */ - "Blue", /* 13 */ - "Blue", /* 14 */ - "Blue" /* 15 */ - }; + static char *colors[] = + { + "White", /* 0 */ + "Brown", /* 1 */ + "Lavender", /* 2 */ + "Khaki", /* 3 */ + "Red", /* 4 */ + "Lt Brown", /* 5 */ + "Peach", /* 6 */ + "Lt Peach", /* 7 */ + "Purple", /* 8 */ + "Dk Purple",/* 9 */ + "Tan", /* 10 */ + "Green", /* 11 */ + "Yellow", /* 12 */ + "Blue", /* 13 */ + "Blue", /* 14 */ + "Blue" /* 15 */ + }; - static char *rgb_colors[] = { - "#ffffff", /* 0 */ - "#8b4513", /* 1 */ - "#e6e6fa", /* 2 */ - "#f0e68c", /* 3 */ - "#ff0000", /* 4 */ - "#deb887", /* 5 */ - "#eecbad", /* 6 */ - "#ffdab9", /* 7 */ - "#9370db", /* 8 */ - "#5d478b", /* 9 */ - "#d2b48c", /* 10 */ - "#00ff00", /* 11 */ - "#ffff00", /* 12 */ - "#0000ff", /* 13 */ - "#0000ff", /* 14 */ - "#0000ff" /* 15 */ - }; + static char *rgb_colors[] = + { + "#ffffff", /* 0 */ + "#8b4513", /* 1 */ + "#e6e6fa", /* 2 */ + "#f0e68c", /* 3 */ + "#ff0000", /* 4 */ + "#deb887", /* 5 */ + "#eecbad", /* 6 */ + "#ffdab9", /* 7 */ + "#9370db", /* 8 */ + "#5d478b", /* 9 */ + "#d2b48c", /* 10 */ + "#00ff00", /* 11 */ + "#ffff00", /* 12 */ + "#0000ff", /* 13 */ + "#0000ff", /* 14 */ + "#0000ff" /* 15 */ + }; - static char *color_nr[] = { - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15" - }; + static char *color_nr[] = + { + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" + }; - if ( color_names ) + if (color_names) { - if ( color_names == 1) + if (color_names == 1) { - return colors[color&0xf]; + return colors[color &0xf]; } else { - return rgb_colors[color&0xf]; + return rgb_colors[color &0xf]; } } else { - return color_nr[color&0xf]; + return color_nr[color &0xf]; } } -const char * -unreal_color( int color ) +const char *unreal_color(int color) { - if ( color_names ) + if (color_names) { - if ( color_names == 1) + if (color_names == 1) { - return unreal_colors[color&0xf]; + return unreal_colors[color &0xf]; } else { - return unreal_rgb_colors[color&0xf]; + return unreal_rgb_colors[color &0xf]; } } @@ -11260,296 +12602,368 @@ #define FMT_SECOND_1 "%2ds" #define FMT_SECOND_2 "%ds" -char * -play_time( int seconds, int show_seconds) +char *play_time(int seconds, int show_seconds) { - static char time_string[24]; - if ( time_format == CLOCK_TIME) { - char *fmt_hour= show_seconds==2 ? FMT_HOUR_2 : FMT_HOUR_1; - char *fmt_minute= show_seconds==2 ? FMT_MINUTE_2 : FMT_MINUTE_1; - char *fmt_second= show_seconds==2 ? FMT_SECOND_2 : FMT_SECOND_1; - time_string[0]= '\0'; - if ( seconds/3600) - sprintf( time_string, fmt_hour, seconds/3600); - else if ( show_seconds < 2) - strcat( time_string, " "); - if ( (seconds%3600)/60 || seconds/3600) - sprintf( time_string+strlen(time_string), fmt_minute, - (seconds%3600)/60); - else if ( ! show_seconds) - sprintf( time_string+strlen(time_string), " 0m"); - else if ( show_seconds < 2) - strcat( time_string, " "); - if ( show_seconds) - sprintf( time_string+strlen(time_string), fmt_second, seconds%60); - } - else if ( time_format == STOPWATCH_TIME) { - if ( show_seconds) - sprintf( time_string, "%02d:%02d:%02d", seconds/3600, - (seconds%3600)/60, seconds % 60); - else - sprintf( time_string, "%02d:%02d", seconds/3600, - (seconds%3600)/60); - } - else - sprintf( time_string, "%d", seconds); - - return time_string; -} - -char * -ping_time( int ms) -{ - static char time_string[24]; - if ( ms < 1000) - sprintf( time_string, "%dms", ms); - else if ( ms < 1000000) - sprintf( time_string, "%ds", ms/1000); - else - sprintf( time_string, "%dm", ms/1000/60); - return time_string; -} - -int -count_bits( int n) -{ - int b= 0; - for ( ; n; n>>=1) - if ( n&1) - b++; - return b; + static char time_string[24]; + if (time_format == CLOCK_TIME) + { + char *fmt_hour = show_seconds == 2 ? FMT_HOUR_2 : FMT_HOUR_1; + char *fmt_minute = show_seconds == 2 ? FMT_MINUTE_2 : FMT_MINUTE_1; + char *fmt_second = show_seconds == 2 ? FMT_SECOND_2 : FMT_SECOND_1; + time_string[0] = '\0'; + if (seconds / 3600) + { + sprintf(time_string, fmt_hour, seconds / 3600); + } + else if (show_seconds < 2) + { + strcat(time_string, " "); + } + if ((seconds % 3600) / 60 || seconds / 3600) + { + sprintf(time_string + strlen(time_string), fmt_minute, (seconds % 3600) / 60); + } + else if (!show_seconds) + { + sprintf(time_string + strlen(time_string), " 0m"); + } + else if (show_seconds < 2) + { + strcat(time_string, " "); + } + if (show_seconds) + { + sprintf(time_string + strlen(time_string), fmt_second, seconds % 60); + } + } + else if (time_format == STOPWATCH_TIME) + { + if (show_seconds) + { + sprintf(time_string, "%02d:%02d:%02d", seconds / 3600, (seconds % 3600) / 60, seconds % 60); + } + else + { + sprintf(time_string, "%02d:%02d", seconds / 3600, (seconds % 3600) / 60); + } + } + else + { + sprintf(time_string, "%d", seconds); + } + + return time_string; } -int -strcmp_withnull( char *one, char *two) +char *ping_time(int ms) { - if ( one == NULL && two == NULL) - return 0; - if ( one != NULL && two == NULL) - return -1; - if ( one == NULL) - return 1; - return strcasecmp( one, two); + static char time_string[24]; + if (ms < 1000) + { + sprintf(time_string, "%dms", ms); + } + else if (ms < 1000000) + { + sprintf(time_string, "%ds", ms / 1000); + } + else + { + sprintf(time_string, "%dm", ms / 1000 / 60); + } + return time_string; +} + +int count_bits(int n) +{ + int b = 0; + for (; n; n >>= 1) + if (n &1) + { + b++; + } + return b; +} + +int strcmp_withnull(char *one, char *two) +{ + if (one == NULL && two == NULL) + { + return 0; + } + if (one != NULL && two == NULL) + { + return -1; + } + if (one == NULL) + { + return 1; + } + return strcasecmp(one, two); } /* * Sorting functions */ -void -sort_servers( struct qserver **array, int size) +void sort_servers(struct qserver **array, int size) { - quicksort( (void**)array, 0, size-1, (int (*)(void*,void*)) server_compare); + quicksort((void **)array, 0, size - 1, (int(*)(void *, void*))server_compare); } -void -sort_players( struct qserver *server) +void sort_players(struct qserver *server) { - struct player **array, *player, *last_team= NULL, **next; - int np, i; - - if ( server->num_players == 0 || server->players == NULL) - return; - - player= server->players; - for ( ; player != NULL && player->number == TRIBES_TEAM; ) { - last_team= player; - player= player->next; - } - if ( player == NULL) - return; - - array= (struct player **) malloc( sizeof(struct player *) * - server->num_players); - for ( np= 0; player != NULL && np < server->num_players; np++) { - array[np]= player; - player= player->next; - } - quicksort( (void**)array, 0, np-1, (int (*)(void*,void*)) player_compare); - - if ( last_team) - next= &last_team->next; - else - next= &server->players; - - for ( i= 0; i < np; i++) { - *next= array[i]; - array[i]->next= NULL; - next= &array[i]->next; - } - - free( array); -} - -int -server_compare( struct qserver *one, struct qserver *two) -{ - int rc; - - char *key= sort_keys; - - for ( ; *key; key++) { - switch( *key) { - case 'g': - rc= strcmp_withnull( one->game, two->game); - if ( rc) - return rc; - break; - case 'p': - if ( one->n_requests == 0) - return two->n_requests; - else if ( two->n_requests == 0) - return -1; - rc= one->ping_total/one->n_requests - - two->ping_total/two->n_requests; - if ( rc) - return rc; - break; - case 'i': - if ( one->ipaddr > two->ipaddr) - return 1; - else if ( one->ipaddr < two->ipaddr) - return -1; - else if ( one->port > two->port) - return 1; - else if ( one->port < two->port) - return -1; - break; - case 'h': - rc= strcmp_withnull( one->host_name, two->host_name); - if ( rc) - return rc; - break; - case 'n': - rc= two->num_players - one->num_players; - if ( rc) - return rc; - break; - } - } - - return 0; -} - -int -type_option_compare( server_type *one, server_type *two ) -{ - return strcmp_withnull( one->type_option, two->type_option ); -} - -int -type_string_compare( server_type *one, server_type *two ) -{ - return strcmp_withnull( one->type_string, two->type_string ); -} - -int -player_compare( struct player *one, struct player *two) -{ - int rc; - - char *key= sort_keys; - - for ( ; *key; key++) { - switch( *key) { - case 'P': - rc= one->ping - two->ping; - if ( rc) - return rc; - break; - case 'F': - rc= two->frags - one->frags; - if ( rc) - return rc; - break; - case 'S': - rc= two->score - one->score; - if ( rc) - return rc; - break; - case 'T': - rc= one->team - two->team; - if ( rc) - return rc; - rc = strcmp_withnull( one->team_name, two->team_name ); - if ( rc ) - return rc; - break; - case 'N': - rc= strcmp_withnull( one->name, two->name ); - if ( rc ) - return rc; - return one->number - two->number; - break; + struct player **array, *player, *last_team = NULL, **next; + int np, i; + + if (server->num_players == 0 || server->players == NULL) + { + return ; + } + + player = server->players; + for (; player != NULL && player->number == TRIBES_TEAM;) + { + last_team = player; + player = player->next; + } + + if (player == NULL) + { + return ; + } + + array = (struct player **)malloc(sizeof(struct player*)*(server->num_players + server->num_spectators)); + for (np = 0; player != NULL && np < server->num_players + server->num_spectators; np++) + { + array[np] = player; + player = player->next; + } quicksort((void **)array, 0, np - 1, (int(*)(void *, void*))player_compare); + + if (last_team) + { + next = &last_team->next; + } + else + { + next = &server->players; + } + + for (i = 0; i < np; i++) + { + *next = array[i]; + array[i]->next = NULL; + next = &array[i]->next; + } + + free(array); +} + +int server_compare(struct qserver *one, struct qserver *two) +{ + int rc; + + char *key = sort_keys; + + for (; *key; key++) + { + switch (*key) + { + case 'g': + rc = strcmp_withnull(one->game, two->game); + if (rc) + { + return rc; + } + break; + case 'p': + if (one->n_requests == 0) + { + return two->n_requests; + } + else if (two->n_requests == 0) + { + return -1; + } + rc = one->ping_total / one->n_requests - two->ping_total / two->n_requests; + if (rc) + { + return rc; + } + break; + case 'i': + if (one->ipaddr > two->ipaddr) + { + return 1; + } + else if (one->ipaddr < two->ipaddr) + { + return -1; + } + else if (one->port > two->port) + { + return 1; + } + else if (one->port < two->port) + { + return -1; + } + break; + case 'h': + rc = strcmp_withnull(one->host_name, two->host_name); + if (rc) + { + return rc; + } + break; + case 'n': + rc = two->num_players - one->num_players; + if (rc) + { + return rc; + } + break; + } + } + + return 0; +} + +int type_option_compare(server_type *one, server_type *two) +{ + return strcmp_withnull(one->type_option, two->type_option); +} + +int type_string_compare(server_type *one, server_type *two) +{ + return strcmp_withnull(one->type_string, two->type_string); +} + +int player_compare(struct player *one, struct player *two) +{ + int rc; + + char *key = sort_keys; + + for (; *key; key++) + { + switch (*key) + { + case 'P': + rc = one->ping - two->ping; + if (rc) + { + return rc; + } + break; + case 'F': + rc = two->frags - one->frags; + if (rc) + { + return rc; + } + break; + case 'S': + rc = two->score - one->score; + if (rc) + { + return rc; + } + break; + case 'T': + rc = one->team - two->team; + if (rc) + { + return rc; + } + rc = strcmp_withnull(one->team_name, two->team_name); + if (rc) + { + return rc; + } + break; + case 'N': + rc = strcmp_withnull(one->name, two->name); + if (rc) + { + return rc; + } + return one->number - two->number; + break; + } } - } - return 0; + return 0; } -void -quicksort( void **array, int i, int j, int (*compare)(void*,void*)) +void quicksort(void **array, int i, int j, int(*compare)(void *, void*)) { - int q= 0; + int q = 0; - if ( i < j) { - q = qpartition(array,i,j, compare); - quicksort(array,i,q, compare); - quicksort(array,q+1,j, compare); - } + if (i < j) + { + q = qpartition(array, i, j, compare); + quicksort(array, i, q, compare); + quicksort(array, q + 1, j, compare); + } } -int -qpartition( void **array, int a, int b, int (*compare)(void*,void*)) +int qpartition(void **array, int a, int b, int(*compare)(void *, void*)) { - /* this is our comparison point. when we are done - splitting this array into 2 parts, we want all the - elements on the left side to be less then or equal - to this, all the elements on the right side need to - be greater then or equal to this - */ - void *z; + /* this is our comparison point. when we are done + splitting this array into 2 parts, we want all the + elements on the left side to be less then or equal + to this, all the elements on the right side need to + be greater then or equal to this + */ + void *z; - /* indicies into the array to sort. Used to calculate a partition - point - */ - int i = a-1; - int j = b+1; + /* indicies into the array to sort. Used to calculate a partition + point + */ + int i = a - 1; + int j = b + 1; - /* temp pointer used to swap two array elements */ - void * tmp = NULL; + /* temp pointer used to swap two array elements */ + void *tmp = NULL; - z = array[a]; + z = array[a]; - while (1) { + while (1) + { - /* move the right indice over until the value of that array - elem is less than or equal to z. Stop if we hit the left - side of the array (ie, j == a); - */ - do { - j--; - } while( j > a && compare(array[j],z) > 0); + /* move the right indice over until the value of that array + elem is less than or equal to z. Stop if we hit the left + side of the array (ie, j == a); + */ + do + { + j--; + } + while (j > a && compare(array[j], z) > 0); - /* move the left indice over until the value of that - array elem is greater than or equal to z, or until - we hit the right side of the array (ie i == j) - */ - do { - i++; - } while( i <= j && compare(array[i],z) < 0); + /* move the left indice over until the value of that + array elem is greater than or equal to z, or until + we hit the right side of the array (ie i == j) + */ + do + { + i++; + } + while (i <= j && compare(array[i], z) < 0); - /* if i is less then j, we need to switch those two array - elements, if not then we are done partitioning this array - section - */ - if(i < j) { - tmp = array[i]; - array[i] = array[j]; - array[j] = tmp; + /* if i is less then j, we need to switch those two array + elements, if not then we are done partitioning this array + section + */ + if (i < j) + { + tmp = array[i]; + array[i] = array[j]; + array[j] = tmp; + } + else + { + return j; + } } - else - return j; - } } -// vim: sw=8 ts=8 noet diff -urP qstat-2.11/qstat.cfg qstat-2.11-20080912svn311/qstat.cfg --- qstat-2.11/qstat.cfg 2006-09-14 16:51:01.000000000 -0400 +++ qstat-2.11-20080912svn311/qstat.cfg 2008-09-12 14:52:23.000000000 -0400 @@ -90,6 +90,7 @@ status2 packet = \377\377\377\377\002getstatus xxx end +# Config for Call of Duty gametype CODS new extend Q3S name = Call of Duty default port = 28960 @@ -106,6 +107,40 @@ master query = full empty end +# Config for Call of Duty 2 +gametype COD2S new extend Q3S + name = Call of Duty 2 + default port = 28960 + template var = CALLOFDUTY2 + game rule = gamename +end + +gametype COD2M new extend Q3M + name = Call of Duty 2 Master + default port = 20710 + template var = COD2MASTER + master protocol = 118 + master for gametype = COD2S + master query = full empty +end + +# Config for Call of Duty 4 +gametype COD4S new extend Q3S + name = Call of Duty 4 + default port = 28960 + template var = CALLOFDUTY4 + game rule = gamename +end + +gametype COD4M new extend Q3M + name = Call of Duty 4 Master + default port = 20810 + template var = COD4MASTER + master protocol = 5 + master for gametype = COD4S + master query = full empty +end + # enemy territory gametype WOETS new extend Q3S name = Enemy Territory @@ -215,3 +250,9 @@ master for gametype = PREYS end +gametype UT3S new extend GS4 + name = UT3 + default port = 6500 + template var = UT3 +end + diff -urP qstat-2.11/qstatdoc.html qstat-2.11-20080912svn311/qstatdoc.html --- qstat-2.11/qstatdoc.html 2005-11-17 00:06:04.000000000 -0500 +++ qstat-2.11-20080912svn311/qstatdoc.html 2008-09-12 14:52:23.000000000 -0400 @@ -120,6 +120,7 @@ <tr><td>-tbs<td>tbs<td>28001<td>Starsiege: Tribes <tr><td>-t2s<td>t2s<td>28000<td>Tribes 2 <tr><td>-qwm<td>qwm<td>27000<td>QuakeWorld master +<tr><td>-hwm<td>hwm<td>26900<td>HexenWorld master <tr><td>-q2m<td>q2m<td>27900<td>Quake II master <tr><td>-hlm<td>hlm<td>27010<td>Half-Life master <tr><td>-stm<td>stm<td>27010<td>Half-Life master (Steam) @@ -147,6 +148,7 @@ <tr><td>-efs<td>efs<td>29070<td>Jedi Knight: Jedi Academy <tr><td>-efm<td>efm<td>29060<td>Jedi Knight: Jedi Academy master <tr><td>-grs<td>grs<td>2346<td>Ghost Recon +<tr><td>-etqws<td>etqws<td>27733<td>QuakeWars server </table> <p> The command-line options can be specified multiple times, one for diff -urP qstat-2.11/qstat.h qstat-2.11-20080912svn311/qstat.h --- qstat-2.11/qstat.h 2006-08-04 16:42:09.000000000 -0400 +++ qstat-2.11-20080912svn311/qstat.h 2008-09-12 14:52:23.000000000 -0400 @@ -68,11 +68,15 @@ #include "ut2004.h" #include "doom3.h" #include "a2s.h" +#include "fl.h" #include "gps.h" #include "gs2.h" #include "gs3.h" +#include "haze.h" #include "ts2.h" #include "tm.h" +#include "wic.h" +#include "ottd.h" /* * Various magic numbers. @@ -87,6 +91,7 @@ #define QW_DEFAULT_PORT 27500 #define QW_MASTER_DEFAULT_PORT 27000 #define HW_DEFAULT_PORT 26950 +#define HW_MASTER_DEFAULT_PORT 26900 #define UNREAL_DEFAULT_PORT 7777 #define UNREAL_MASTER_DEFAULT_PORT 28900 #define HALFLIFE_DEFAULT_PORT 27015 @@ -120,6 +125,8 @@ #define HL2_MASTER_DEFAULT_PORT 27011 #define TS2_DEFAULT_PORT 51234 #define TM_DEFAULT_PORT 5000 +#define WIC_DEFAULT_PORT 5000 // Default is actually disabled +#define FL_DEFAULT_PORT 5478 #define Q_UNKNOWN_TYPE 0 @@ -183,8 +190,15 @@ #define GAMESPY4_PROTOCOL_SERVER 55 #define PREY_SERVER 56 #define TM_PROTOCOL_SERVER 57 +#define ETQW_SERVER 58 +#define HAZE_SERVER 59 +#define HW_MASTER (60 | MASTER_SERVER) +#define WIC_PROTOCOL_SERVER 61 +#define OTTD_SERVER 62 +#define OTTD_MASTER (63 | MASTER_SERVER) +#define FL_SERVER 64 -#define LAST_BUILTIN_SERVER 57 +#define LAST_BUILTIN_SERVER 64 #define TF_SINGLE_QUERY (1<<1) #define TF_OUTFILE (1<<2) @@ -218,8 +232,8 @@ struct q_packet; typedef void (*DisplayFunc)( struct qserver *); -typedef void (*QueryFunc)( struct qserver *); -typedef void (*PacketFunc)( struct qserver *, char *rawpkt, int pktlen); +typedef int (*QueryFunc)( struct qserver *); +typedef int (*PacketFunc)( struct qserver *, char *rawpkt, int pktlen); /* * Output and formatting functions @@ -250,6 +264,9 @@ void display_hl2_player_info( struct qserver *server); void display_ts2_player_info( struct qserver *server); void display_tm_player_info( struct qserver *server); +void display_haze_player_info( struct qserver *server); +void display_wic_player_info( struct qserver *server); +void display_fl_player_info( struct qserver *server); void raw_display_server( struct qserver *server); void raw_display_server_rules( struct qserver *server); @@ -274,6 +291,9 @@ void raw_display_hl2_player_info( struct qserver *server); void raw_display_ts2_player_info( struct qserver *server); void raw_display_tm_player_info( struct qserver *server); +void raw_display_haze_player_info( struct qserver *server); +void raw_display_wic_player_info( struct qserver *server); +void raw_display_fl_player_info( struct qserver *server); void xml_display_server( struct qserver *server); void xml_header(); @@ -300,59 +320,63 @@ void xml_display_hl2_player_info( struct qserver *server); void xml_display_ts2_player_info( struct qserver *server); void xml_display_tm_player_info( struct qserver *server); +void xml_display_haze_player_info( struct qserver *server); +void xml_display_wic_player_info( struct qserver *server); +void xml_display_fl_player_info( struct qserver *server); char *xml_escape( char*); char *str_replace( char *, char *, char *); -void send_server_request_packet( struct qserver *server); -void send_qserver_request_packet( struct qserver *server); -void send_qwserver_request_packet( struct qserver *server); -void send_ut2003_request_packet( struct qserver *server); -void send_tribes_request_packet( struct qserver *server); -void send_qwmaster_request_packet( struct qserver *server); -void send_bfris_request_packet( struct qserver *server); -void send_player_request_packet( struct qserver *server); -void send_rule_request_packet( struct qserver *server); -void send_ravenshield_request_packet( struct qserver *server); -void send_savage_request_packet( struct qserver *server); -void send_farcry_request_packet( struct qserver *server); -void send_gamespy_master_request( struct qserver *server); -void send_tribes2_request_packet( struct qserver *server); -void send_tribes2master_request_packet( struct qserver *server); -void send_ghostrecon_request_packet( struct qserver *server); -void send_eye_request_packet( struct qserver *server); -void send_gs2_request_packet( struct qserver *server); -void send_doom3_request_packet( struct qserver *server); -void send_hl2_request_packet( struct qserver *server); -void send_ts2_request_packet( struct qserver *server); -void send_tm_request_packet( struct qserver *server); - -void deal_with_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_q_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_qw_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_q1qw_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_q2_packet( struct qserver *server, char *pkt, int pktlen, - int check_duplicate_rules); -void deal_with_doom3master_packet( struct qserver *server, char *rawpkt, int pktlen); -void deal_with_qwmaster_packet( struct qserver *server, char *pkt, int pktlen); +int send_server_request_packet( struct qserver *server); +int send_qserver_request_packet( struct qserver *server); +int send_qwserver_request_packet( struct qserver *server); +int send_ut2003_request_packet( struct qserver *server); +int send_tribes_request_packet( struct qserver *server); +int send_qwmaster_request_packet( struct qserver *server); +int send_bfris_request_packet( struct qserver *server); +int send_player_request_packet( struct qserver *server); +int send_rule_request_packet( struct qserver *server); +int send_ravenshield_request_packet( struct qserver *server); +int send_savage_request_packet( struct qserver *server); +int send_farcry_request_packet( struct qserver *server); +int send_gamespy_master_request( struct qserver *server); +int send_tribes2_request_packet( struct qserver *server); +int send_tribes2master_request_packet( struct qserver *server); +int send_ghostrecon_request_packet( struct qserver *server); +int send_eye_request_packet( struct qserver *server); +int send_gs2_request_packet( struct qserver *server); +int send_doom3_request_packet( struct qserver *server); +int send_hl2_request_packet( struct qserver *server); +int send_ts2_request_packet( struct qserver *server); +int send_tm_request_packet( struct qserver *server); +int send_wic_request_packet( struct qserver *server); + +int deal_with_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_q_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_qw_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_q1qw_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_q2_packet( struct qserver *server, char *pkt, int pktlen ); +int deal_with_doom3master_packet( struct qserver *server, char *rawpkt, int pktlen); +int deal_with_qwmaster_packet( struct qserver *server, char *pkt, int pktlen); int deal_with_halflife_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_ut2003_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_tribes_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_tribesmaster_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_bfris_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_gamespy_master_response( struct qserver *server, char *pkt, int pktlen); -void deal_with_ravenshield_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_savage_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_farcry_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_tribes2_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_tribes2master_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_descent3_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_descent3master_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_ghostrecon_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_eye_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_doom3_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_hl2_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_ts2_packet( struct qserver *server, char *pkt, int pktlen); -void deal_with_tm_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_ut2003_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_tribes_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_tribesmaster_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_bfris_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_gamespy_master_response( struct qserver *server, char *pkt, int pktlen); +int deal_with_ravenshield_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_savage_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_farcry_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_tribes2_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_tribes2master_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_descent3_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_descent3master_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_ghostrecon_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_eye_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_doom3_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_hl2_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_ts2_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_tm_packet( struct qserver *server, char *pkt, int pktlen); +int deal_with_wic_packet( struct qserver *server, char *pkt, int pktlen); struct _server_type { int id; @@ -436,9 +460,9 @@ /* QUAKE WORLD */ struct { char prefix[4]; - char command[7]; + char command[10]; } qw_serverstatus = -{ { '\377', '\377', '\377', '\377' }, { 's', 't', 'a', 't', 'u', 's', '\n' } }; +{ { '\377', '\377', '\377', '\377' }, { 's', 't', 'a', 't', 'u', 's', ' ', '2', '3', '\n' } }; /* QUAKE3 */ struct { @@ -512,6 +536,10 @@ #define QW_GET_SERVERS 'c' char qw_masterquery[] = { QW_GET_SERVERS, '\n', '\0' }; +/* HEXENWORLD MASTER */ +#define HW_GET_SERVERS 'c' +char hw_masterquery[] = { '\377', HW_GET_SERVERS, '\0' }; + /* QUAKE 2 MASTER */ char q2_masterquery[] = { 'q', 'u', 'e', 'r', 'y', '\n', '\0' }; @@ -656,7 +684,9 @@ // 10: Team information (00 to disable) // 11: Request new format unsigned char gs3_player_query[] = { - 0xfe,0xfd,0x00,0x10,0x20,0x30,0x40,0xff,0xff,0xff,0x01 + 0xfe,0xfd,0x00, + 0x10,0x20,0x30,0x40, + 0xff,0xff,0xff,0x01 }; // Format: @@ -687,7 +717,40 @@ // 1 - 3: query head // 4 - 7: queryid unsigned char gs3_challenge[] = { - 0xfe,0xfd,0x09,0x10,0x20,0x30,0x40 + 0xfe,0xfd,0x09, + 0x10,0x20,0x30,0x40 +}; + +// Format: +// 1 - 8: Query Request +// 9 - 12: Query Header +// 13: Query ID + +// Query ID is made up of the following +// 0x01: Basic Info +// 0x02: Game Rules +// 0x03: Player Information +// 0x04: Team Information +unsigned char haze_status_query[] = { + 'f', 'r', 'd', 'q', 'u', 'e', 'r', 'y', + 0x10,0x20,0x30,0x40, + 0x0A +}; + +// Format: +// 1 - 8: Query Request +// 9 - 12: Query Header +// 13: Query ID + +// Query ID is made up of the following +// 0x01: Basic Info +// 0x02: Game Rules +// 0x03: Player Information +// 0x04: Team Information +unsigned char haze_player_query[] = { + 'f', 'r', 'd', 'q', 'u', 'e', 'r', 'y', + 0x10,0x20,0x30,0x40, + 0x03 }; @@ -748,6 +811,22 @@ unsigned char ts2_status_query[] = "si"; +char ottd_master_query[] = { + 0x04, 0x00, // packet length + 0x06, // packet type + 0x01 // packet version +}; + +char ottd_serverinfo[] = { + 0x03, 0x00, // packet length + 0x00, // packet type +}; + +char ottd_serverdetails[] = { + 0x03, 0x00, // packet length + 0x02, // packet type +}; + server_type builtin_types[] = { { /* QUAKE */ @@ -1223,7 +1302,6 @@ send_qwserver_request_packet,/* status_query_func */ NULL, /* rule_query_func */ NULL, /* player_query_func */ - (void (*)( struct qserver *, char *, int)) deal_with_halflife_packet, /* packet_func */ }, { @@ -1910,6 +1988,40 @@ deal_with_qwmaster_packet, /* packet_func */ }, { + /* HEXEN2WORLD MASTER */ + HW_MASTER, /* id */ + "HWM", /* type_prefix */ + "hwm", /* type_string */ + "-hwm", /* type_option */ /* ## also "-qw" */ + "HexenWorld Master", /* game_name */ + HW_SERVER, /* master */ + HW_MASTER_DEFAULT_PORT, /* default_port */ + 0, /* port_offset */ + TF_SINGLE_QUERY|TF_OUTFILE, /* flags */ + "", /* game_rule */ + "HWMASTER", /* template_var */ + NULL, /* status_packet */ + 0, /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + (char*) &hw_masterquery, /* master_packet */ + sizeof( hw_masterquery), /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_qwmaster, /* display_player_func */ + NULL, /* display_rule_func */ + NULL, /* display_raw_player_func */ + NULL, /* display_raw_rule_func */ + NULL, /* display_xml_player_func */ + NULL, /* display_xml_rule_func */ + send_qwmaster_request_packet,/* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_qwmaster_packet, /* packet_func */ +}, +{ /* QUAKE 2 MASTER */ Q2_MASTER, /* id */ "Q2M", /* type_prefix */ @@ -2493,10 +2605,10 @@ QUAKE4_SERVER, /* id */ "Q4S", /* type_prefix */ "q4s", /* type_string */ - "-q4s", /* type_option */ + "-q4s", /* type_option */ "Quake 4", /* game_name */ 0, /* master */ - QUAKE4_DEFAULT_PORT, /* default_port */ + QUAKE4_DEFAULT_PORT, /* default_port */ 0, /* port_offset */ TF_QUAKE3_NAMES, /* flags */ "fs_game", /* game_rule */ @@ -2520,7 +2632,7 @@ send_qwserver_request_packet, /* status_query_func */ NULL, /* rule_query_func */ NULL, /* player_query_func */ - deal_with_quake4_packet, /* packet_func */ + deal_with_quake4_packet, /* packet_func */ }, { /* QUAKE 4 MASTER */ @@ -2659,6 +2771,210 @@ deal_with_tm_packet, /* packet_func */ }, { + /* Enemy Territory : QuakeWars */ + ETQW_SERVER, /* id */ + "ETQWS", /* type_prefix */ + "etqws", /* type_string */ + "-etqws", /* type_option */ + "QuakeWars", /* game_name */ + 0, /* master */ + ETQW_DEFAULT_PORT, /* default_port */ + 0, /* port_offset */ + TF_QUAKE3_NAMES, /* flags */ + "fs_game", /* game_rule */ + "QUAKE4", /* template_var */ + (char*) &doom3_serverinfo, /* status_packet */ + sizeof( doom3_serverinfo), /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + NULL, /* master_packet */ + 0, /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_doom3_player_info, /* display_player_func */ + display_server_rules, /* display_rule_func */ + raw_display_doom3_player_info, /* display_raw_player_func */ + raw_display_server_rules, /* display_raw_rule_func */ + xml_display_doom3_player_info, /* display_xml_player_func */ + xml_display_server_rules, /* display_xml_rule_func */ + send_qwserver_request_packet, /* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_etqw_packet, /* packet_func */ +}, +{ + /* HAZE PROTOCOL */ + HAZE_SERVER, /* id */ + "HAZES", /* type_prefix */ + "hazes", /* type_string */ + "-hazes", /* type_option */ + "Haze Protocol", /* game_name */ + 0, /* master */ + 0, /* default_port */ + 0, /* port_offset */ + TF_SINGLE_QUERY, /* flags */ + "gametype", /* game_rule */ + "HAZE", /* template_var */ + (char*) &haze_status_query, /* status_packet */ + sizeof( haze_status_query), /* status_len */ + (char*) &haze_player_query, /* player_packet */ + sizeof( haze_player_query), /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + NULL, /* master_packet */ + 0, /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_haze_player_info, /* display_player_func */ + display_server_rules, /* display_rule_func */ + raw_display_haze_player_info, /* display_raw_player_func */ + raw_display_server_rules, /* display_raw_rule_func */ + xml_display_haze_player_info, /* display_xml_player_func */ + xml_display_server_rules, /* display_xml_rule_func */ + send_haze_request_packet, /* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_haze_packet, /* packet_func */ +}, +{ + /* World in Confict PROTOCOL */ + WIC_PROTOCOL_SERVER, /* id */ + "WICS", /* type_prefix */ + "wics", /* type_string */ + "-wics", /* type_option */ + "World in Conflict", /* game_name */ + 0, /* master */ + 0, /* default_port */ + 0, /* port_offset */ + TF_TCP_CONNECT|TF_QUERY_ARG_REQUIRED|TF_QUERY_ARG, /* flags */ + "N/A", /* game_rule */ + "WICPROTOCOL", /* template_var */ + NULL, /* status_packet */ + 0, /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + NULL, /* master_packet */ + 0, /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_wic_player_info, /* display_player_func */ + display_server_rules, /* display_rule_func */ + raw_display_wic_player_info, /* display_raw_player_func */ + raw_display_server_rules, /* display_raw_rule_func */ + xml_display_wic_player_info, /* display_xml_player_func */ + xml_display_server_rules, /* display_xml_rule_func */ + send_wic_request_packet, /* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_wic_packet, /* packet_func */ +}, +{ + /* openTTD */ + OTTD_SERVER, /* id */ + "OTTDS", /* type_prefix */ + "ottds", /* type_string */ + "-ottds", /* type_option */ + "OpenTTD", /* game_name */ + 0, /* master */ + 3979, /* default_port */ + 0, /* port_offset */ + 0, /* flags */ + "", /* game_rule */ + "OPENTTD", /* template_var */ + (char*) &ottd_serverinfo, /* status_packet */ + sizeof( ottd_serverinfo), /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + (char*) &ottd_serverdetails,/* rule_packet */ + sizeof( ottd_serverdetails), /* rule_len */ + NULL, /* master_packet */ + 0, /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_q2_player_info, /* display_player_func */ + display_server_rules, /* display_rule_func */ + raw_display_q2_player_info, /* display_raw_player_func */ + raw_display_server_rules, /* display_raw_rule_func */ + xml_display_gs2_player_info,/* display_xml_player_func */ + xml_display_server_rules, /* display_xml_rule_func */ + send_ottd_request_packet, /* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_ottd_packet, /* packet_func */ +}, +{ + /* openTTD Master */ + OTTD_MASTER, /* id */ + "OTTDM", /* type_prefix */ + "ottdm", /* type_string */ + "-ottdm", /* type_option */ + "openTTD Master", /* game_name */ + OTTD_SERVER, /* master */ + 3978, /* default_port */ + 0, /* port_offset */ + TF_OUTFILE | TF_QUERY_ARG, /* flags */ + "", /* game_rule */ + "OTTDMASTER", /* template_var */ + NULL, /* status_packet */ + 0, /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + ottd_master_query, /* master_packet */ + sizeof(ottd_master_query),/* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_qwmaster, /* display_player_func */ + NULL, /* display_rule_func */ + NULL, /* display_raw_player_func */ + NULL, /* display_raw_rule_func */ + NULL, /* display_xml_player_func */ + NULL, /* display_xml_rule_func */ + send_ottdmaster_request_packet,/* status_query_func */ + NULL, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_ottdmaster_packet, /* packet_func */ +}, +{ + /* Frontlines-Fuel of War */ + FL_SERVER, /* id */ + "FLS", /* type_prefix */ + "fls", /* type_string */ + "-fls", /* type_option */ + "Frontlines-Fuel of War", /* game_name */ + 0, /* master */ + FL_DEFAULT_PORT, /* default_port */ + 0, /* port_offset */ + TF_QUAKE3_NAMES, /* flags */ + "gamedir", /* game_rule */ + "FLS", /* template_var */ + NULL, /* status_packet */ + 0, /* status_len */ + NULL, /* player_packet */ + 0, /* player_len */ + NULL, /* rule_packet */ + 0, /* rule_len */ + NULL, /* master_packet */ + 0, /* master_len */ + NULL, /* master_protocol */ + NULL, /* master_query */ + display_fl_player_info, /* display_player_func */ + display_server_rules, /* display_rule_func */ + raw_display_fl_player_info, /* display_raw_player_func */ + raw_display_server_rules, /* display_raw_rule_func */ + xml_display_fl_player_info, /* display_xml_player_func */ + xml_display_server_rules, /* display_xml_rule_func */ + send_fl_request_packet, /* status_query_func */ + send_fl_rule_request_packet, /* rule_query_func */ + NULL, /* player_query_func */ + deal_with_fl_packet, /* packet_func */ +}, +{ Q_UNKNOWN_TYPE, /* id */ "", /* type_prefix */ "", /* type_string */ @@ -2873,6 +3189,8 @@ int time_delta( struct timeval *later, struct timeval *past); char * strherror( int h_err); int connection_refused(); +int connection_would_block(); +int connection_reset(); void add_file( char *filename); int add_qserver( char *arg, server_type* type, char *outfilename, char *query_arg); @@ -2889,6 +3207,7 @@ #define CHECK_DUPLICATE_RULES 2 #define NO_KEY_COPY 4 #define COMBINE_VALUES 8 +#define OVERWITE_DUPLICATES 16 struct player* get_player_by_number( struct qserver *server, int player_number ); struct rule* add_rule( struct qserver *server, char *key, char *value, int flags) ; @@ -2949,4 +3268,14 @@ #define NO_PLAYER_INFO 0xffff #define NO_SERVER_RULES NULL +#define FORCE 1 +#define NO_FORCE 0 + +#define INPROGRESS 0 +#define DONE_AUTO 1 +#define DONE_FORCE 2 +#define MEM_ERROR -2 +#define PKT_ERROR -3 +#define ORD_ERROR -4 + #endif diff -urP qstat-2.11/template/.cvsignore qstat-2.11-20080912svn311/template/.cvsignore --- qstat-2.11/template/.cvsignore 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/template/.cvsignore 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff -urP qstat-2.11/template/ghostrecon.lst qstat-2.11-20080912svn311/template/ghostrecon.lst --- qstat-2.11/template/ghostrecon.lst 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/template/ghostrecon.lst 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,2 @@ +grs 208.144.248.104 +grs,ignoreserverplayer=yes 208.144.248.105 diff -urP qstat-2.11/template/Makefile.in qstat-2.11-20080912svn311/template/Makefile.in --- qstat-2.11/template/Makefile.in 2006-11-04 07:59:01.000000000 -0500 +++ qstat-2.11-20080912svn311/template/Makefile.in 2008-09-12 15:00:26.000000000 -0400 @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.7.9 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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. @@ -13,6 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -20,6 +21,7 @@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 @@ -33,20 +35,7 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -subdir = template -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/gnuconfig.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ @@ -68,6 +57,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -90,14 +80,11 @@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ 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@ @@ -105,60 +92,49 @@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ 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@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ -mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ EXTRA_DIST = $(wildcard *.html *.txt) +subdir = template +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/gnuconfig.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = $(srcdir)/Makefile.in Makefile.am all: all-am .SUFFIXES: -$(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 \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign template/Makefile'; \ +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign template/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 +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: tags: TAGS TAGS: @@ -166,6 +142,10 @@ ctags: CTAGS CTAGS: +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ @@ -179,7 +159,7 @@ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ @@ -197,6 +177,7 @@ check-am: all-am check: check-am all-am: Makefile + installdirs: install: install-am install-exec: install-exec-am @@ -217,7 +198,7 @@ clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -234,8 +215,6 @@ dvi-am: -html: html-am - info: info-am info-am: @@ -269,8 +248,8 @@ uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ Binary files qstat-2.11/tests/etqw_1.4_test1 and qstat-2.11-20080912svn311/tests/etqw_1.4_test1 differ Binary files qstat-2.11/tests/etqw_1.4_test2 and qstat-2.11-20080912svn311/tests/etqw_1.4_test2 differ diff -urP qstat-2.11/tests/etqws.pl qstat-2.11-20080912svn311/tests/etqws.pl --- qstat-2.11/tests/etqws.pl 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/tests/etqws.pl 2008-09-12 14:52:21.000000000 -0400 @@ -0,0 +1,45 @@ +#!/usr/bin/perl -w +# simple responder for doom3/quake4/etqw queries + +use strict; +use IO::Socket::INET; +use IO::File; + +my $sock = IO::Socket::INET->new( + LocalAddr => '0.0.0.0', + LocalPort => 27733, + Proto => 'udp'); + +my $rin = ''; +vec($rin, $sock->fileno, 1) = 1; + +my @files = @ARGV; +die "USAGE: $0 <file>" unless @files; + +sub readfile($) +{ + my $fn = shift; + print "reading $fn\n"; + my $f = IO::File->new($fn, "r"); + my $buf; + $f->read($buf, 0xffff); # XXX use stat + $f->close; + return $buf; +} + +while (select(my $rout = $rin, undef, undef, undef)) { + my $data = ''; + my $hispaddr; + $hispaddr = $sock->recv($data, 0xffff, 0) || die "recv: $!"; + my ($port, $hisiaddr) = sockaddr_in($hispaddr); + printf '%d bytes from %s:%d'."\n", length($data), inet_ntoa($hisiaddr), $port; + + if($data !~ /^\xff\xffgetInfo/) { + printf 'invalid packet from %s:%d'."\n", inet_ntoa($hisiaddr), $port; + next; + } + + my $buf = readfile($files[0]); + + $sock->send($buf, 0, $hispaddr); +} diff -urP qstat-2.11/tests/xml.pl qstat-2.11-20080912svn311/tests/xml.pl --- qstat-2.11/tests/xml.pl 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/tests/xml.pl 2008-09-12 14:52:21.000000000 -0400 @@ -0,0 +1,65 @@ +#!/usr/bin/perl -w +# simple qstat xml output parser, prints values specified as command +# line arguments +# +# Author: Ludwig Nussel +# +# Usage Examples: +# +# Print server name: +# "qstat/server/name" +# +# Print second server rule (numbered from zero): +# "qstat/server/rules/rule/1" +# +# Print the rule with name "gamename": +# "qstat/server/rules/rule/[name=gamename]" +# +# Print name of sixth player: +# "qstat/server/players/player/5/name" +# +# Print clan of player with name "suCk3r": +# "qstat/server/players/player/[name=suCk3r]/clan" + +use strict; +use XML::Bare; +use Data::Dumper; + +sub getvalue { + my $x = shift; + my @a = split(/\//, shift); + for my $n (@a) { + if ($n =~ /^[[:digit:]]+$/) { + return undef unless exists $x->[$n]; + $x = $x->[$n]; + } elsif ($n =~ /\[(.*)=(.*)\]/) { + my ($k, $v) = ($1, $2); + my $r; + for my $i (@$x) { + next unless exists $i->{$k}; + if($i->{$k}->{value} eq $v) { + $r = $i; + last; + } + } + return undef unless $r; + $x = $r; + } else { + return undef unless exists $x->{$n}; + $x = $x->{$n}; + } + } + return $x->{value}; +} + +sub printvalue { + my $val = getvalue(@_); + $val = "(undefined)" unless defined $val; + print $val, "\n" +} + +my $xml = XML::Bare->new(text => join('', <STDIN>))->parse(); + +for (@ARGV) { + printvalue($xml, $_); +} diff -urP qstat-2.11/tm.c qstat-2.11-20080912svn311/tm.c --- qstat-2.11/tm.c 2006-08-14 05:51:21.000000000 -0400 +++ qstat-2.11-20080912svn311/tm.c 2008-09-12 14:52:23.000000000 -0400 @@ -22,35 +22,48 @@ #include "qstat.h" #include "packet_manip.h" +#define TM_XML_PREFIX "<?xml version=\"1.0\"?>\n<methodCall>\n<methodName>system.multicall</methodName>\n<params><param><value><array><data>\n" +#define TM_XML_SUFFIX "</data></array></value></param></params>\n</methodCall>" +#define TM_SERVERINFO "<value><struct><member><name>methodName</name><value>GetServerOptions</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n<value><struct><member><name>methodName</name><value>GetCurrentChallengeInfo</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n" +#define TM_PLAYERLIST "<value><struct><member><name>methodName</name><value>GetPlayerList</value></member><member><name>params</name><value><array><data><value><i4>100</i4></value><value><i4>0</i4></value></data></array></value></member></struct></value>\n" +#define TM_AUTH_TEMPLATE "<value><struct>\n<member><name>methodName</name><value><string>Authenticate</string></value></member>\n<member><name>params</name><value><array><data>\n<value><string>%s</string></value>\n<value><string>%s</string></value></data></array></value></member></struct></value>\n" -void send_tm_request_packet( struct qserver *server ) +int send_tm_request_packet( struct qserver *server ) { char buf[2048]; char *xmlp = buf + 8; unsigned int len; + char *user = get_param_value( server, "user", NULL ); + char *password = get_param_value( server, "password", NULL ); if ( ! server->protocol_version ) { // No seen the version yet wait // register_send here to ensure that timeouts function correctly - register_send( server ); - return; + return register_send( server ); } - if ( get_player_info ) + // build the query xml + len = sprintf( xmlp, TM_XML_PREFIX ); + + if ( user != NULL && password != NULL ) { - server->flags |= TF_PLAYER_QUERY|TF_RULES_QUERY; - // TODO: add more calls to get full player info? - strcpy( xmlp, "<?xml version=\"1.0\"?>\n<methodCall>\n<methodName>system.multicall</methodName>\n<params><param><value><array><data>\n<value><struct><member><name>methodName</name><value>GetServerOptions</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n<value><struct><member><name>methodName</name><value>GetCurrentChallengeInfo</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n<value><struct><member><name>methodName</name><value>GetPlayerList</value></member><member><name>params</name><value><array><data><value><i4>100</i4></value><value><i4>0</i4></value></data></array></value></member></struct></value>\n</data></array></value></param></params>\n</methodCall>" ); + len += sprintf( xmlp + len, TM_AUTH_TEMPLATE, user, password ); } else { - server->flags |= TF_STATUS_QUERY; - strcpy( xmlp, "<?xml version=\"1.0\"?>\n<methodCall>\n<methodName>system.multicall</methodName>\n<params><param><value><array><data>\n<value><struct><member><name>methodName</name><value>GetServerOptions</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n<value><struct><member><name>methodName</name><value>GetCurrentChallengeInfo</value></member><member><name>params</name><value><array><data></data></array></value></member></struct></value>\n<value><struct><member><name>methodName</name><value>GetPlayerList</value></member><member><name>params</name><value><array><data><value><i4>100</i4></value><value><i4>0</i4></value></data></array></value></member></struct></value>\n</data></array></value></param></params>\n</methodCall>" ); + // Default to User / User + len += sprintf( xmlp + len, TM_AUTH_TEMPLATE, "User", "User" ); } + // Always get Player info otherwise player count is invalid + // TODO: add more calls to get full player info? + server->flags |= TF_PLAYER_QUERY|TF_RULES_QUERY; + len += sprintf( xmlp + len, TM_SERVERINFO ); + len += sprintf( xmlp + len, TM_PLAYERLIST ); + len += sprintf( xmlp + len, TM_XML_SUFFIX ); + // First 4 bytes is the length of the request - len = strlen( xmlp ); memcpy( buf, &len, 4 ); // Second 4 bytes is the handle identifier ( id ) memcpy( buf+4, &server->challenge, 4 ); @@ -59,13 +72,14 @@ // we expect at least 1 packet response server->saved_data.pkt_max = 1; - send_packet( server, buf, len + 8 ); + return send_packet( server, buf, len + 8 ); } -void deal_with_tm_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_tm_packet( struct qserver *server, char *rawpkt, int pktlen ) { - char *s, *end; + char *s; + char *pkt = rawpkt; char *key = NULL, *value = NULL, *tmpp = NULL; char fullname[256]; struct player *player = NULL; @@ -75,20 +89,30 @@ debug( 2, "processing..." ); s = rawpkt; - if ( 4 == pktlen && 0 == memcmp( rawpkt, "\x0b\x00\x00\x00", 4 ) ) + + // We may get the setup handle and the protocol version in one packet we may not + // So we continue to parse if we see the handle + if ( 4 <= pktlen && 0 == memcmp( pkt, "\x0b\x00\x00\x00", 4 ) ) { // setup handle identifier // greater 2^31 = XML-RPC, less = callback server->challenge = 0x80000001; - return; + if ( 4 == pktlen ) + { + return 0; + } + pktlen -= 4; + pkt += 4; } - else if ( 10 < pktlen && 1 == sscanf( rawpkt, "GBXRemote %d", &server->protocol_version ) ) + + if ( 11 <= pktlen && 1 == sscanf( pkt, "GBXRemote %d", &server->protocol_version ) ) { // Got protocol version send request send_tm_request_packet( server ); - return; + return 0; } - else if ( 8 <= pktlen && 0 == memcmp( rawpkt+4, &server->challenge, 4 ) ) + + if ( 8 <= pktlen && 0 == memcmp( pkt+4, &server->challenge, 4 ) ) { // first 4 bytes = the length // Note: We use pkt_id to store the length of the expected packet @@ -104,9 +128,9 @@ if ( ! add_packet( server, len, 0, 2, pktlen, rawpkt, 1 ) ) { // fatal error e.g. out of memory - return; + return -1; } - return; + return 0; } else { @@ -117,7 +141,8 @@ } total_len = combined_length( server, server->saved_data.pkt_id ); - expected_len = server->saved_data.pkt_id; + expected_len = server->saved_data.pkt_id; + debug( 2, "total: %d, expected: %d\n", total_len, expected_len ); if ( total_len < expected_len + 8 ) { // we dont have a complete response add the packet @@ -136,15 +161,15 @@ if ( ! add_packet( server, server->saved_data.pkt_id, pkt_max - 1, new_max, pktlen, rawpkt, 1 ) ) { // fatal error e.g. out of memory - return; + return -1; } if ( last ) { // we are the last packet run combine to call us back - combine_packets( server ); + return combine_packets( server ); } - return; + return 0; } server->n_servers++; @@ -157,11 +182,18 @@ gettimeofday( &server->packet_time1, NULL); } - rawpkt[pktlen]= '\0'; - end = &rawpkt[pktlen]; + // Terminate the packet data + pkt = (char*)malloc( pktlen + 1 ); + if ( NULL == pkt ) + { + debug( 0, "Failed to malloc memory for packet terminator\n" ); + return MEM_ERROR; + } + memcpy( pkt, rawpkt, pktlen ); + pkt[pktlen] = '\0'; //fprintf( stderr, "S=%s\n", s ); - s = strtok( s, "\015\012" ); + s = strtok( pkt + 8, "\015\012" ); while ( NULL != s ) { //fprintf( stderr, "S=%s\n", s ); @@ -177,7 +209,7 @@ value = NULL; continue; } - else if ( 0 == strncmp( s, "<value>", 7 ) ) + else if ( NULL != key && 0 == strncmp( s, "<value>", 7 ) ) { // value s += 7; @@ -223,7 +255,7 @@ method_response++; } - if ( NULL != value ) + if ( NULL != value && NULL != key ) { switch( method_response ) { @@ -297,9 +329,13 @@ s = strtok( NULL, "\015\012" ); } + free( pkt ); + if ( 0 == strncmp( rawpkt + pktlen - 19, "</methodResponse>", 17 ) ) { // last packet seen - cleanup_qserver( server, 1 ); + return DONE_FORCE; } + + return INPROGRESS; } diff -urP qstat-2.11/tm.h qstat-2.11-20080912svn311/tm.h --- qstat-2.11/tm.h 2006-08-04 16:42:09.000000000 -0400 +++ qstat-2.11-20080912svn311/tm.h 2008-09-12 14:52:23.000000000 -0400 @@ -13,8 +13,8 @@ #include "qserver.h" // Packet processing methods -void deal_with_tm_packet( struct qserver *server, char *pkt, int pktlen ); -void send_tm_request_packet( struct qserver *server ); +int deal_with_tm_packet( struct qserver *server, char *pkt, int pktlen ); +int send_tm_request_packet( struct qserver *server ); #endif diff -urP qstat-2.11/ts2.c qstat-2.11-20080912svn311/ts2.c --- qstat-2.11/ts2.c 2006-05-24 10:26:00.000000000 -0400 +++ qstat-2.11-20080912svn311/ts2.c 2008-09-12 14:52:23.000000000 -0400 @@ -2,7 +2,7 @@ * qstat 2.8 * by Steve Jankowski * - * Gamespy query protocol + * Teamspeak 2 query protocol * Copyright 2005 Steven Hartland * * Licensed under the Artistic License, see LICENSE.txt for license terms @@ -22,7 +22,7 @@ #include "packet_manip.h" -void send_ts2_request_packet( struct qserver *server ) +int send_ts2_request_packet( struct qserver *server ) { char buf[256]; @@ -42,14 +42,14 @@ server->saved_data.pkt_index = 1; } - send_packet( server, buf, strlen( buf ) ); + return send_packet( server, buf, strlen( buf ) ); } -void deal_with_ts2_packet( struct qserver *server, char *rawpkt, int pktlen ) +int deal_with_ts2_packet( struct qserver *server, char *rawpkt, int pktlen ) { char *s, *end; - int ping, connect_time; + int ping, connect_time, mode = 0; char name[256]; debug( 2, "processing..." ); @@ -71,67 +71,94 @@ while ( NULL != s ) { - char *key = s; - char *value = strchr( key, '=' ); - if ( NULL != value ) + if ( 0 == mode ) { - // Server Rule - *value = '\0'; - value++; - if ( 0 == strcmp( "server_name", key ) ) - { - server->server_name = strdup( value ); - } - else if ( 0 == strcmp( "server_udpport", key ) ) - { - change_server_port( server, atoi( value ), 0 ); - add_rule( server, key, value, NO_FLAGS ); + // Rules + char *key = s; + char *value = strchr( key, '=' ); + if ( NULL != value ) + { + // Server Rule + *value = '\0'; + value++; + if ( 0 == strcmp( "server_name", key ) ) + { + server->server_name = strdup( value ); + } + else if ( 0 == strcmp( "server_udpport", key ) ) + { + change_server_port( server, atoi( value ), 0 ); + add_rule( server, key, value, NO_FLAGS ); + } + else if ( 0 == strcmp( "server_maxusers", key ) ) + { + server->max_players = atoi( value ); + } + else if ( 0 == strcmp( "server_currentusers", key ) ) + { + server->num_players = atoi( value); + } + else + { + add_rule( server, key, value, NO_FLAGS); + } + } + else if ( 0 == strcmp( "OK", s ) ) + { + // end of rules request + server->saved_data.pkt_index--; + mode++; + } + else if ( 0 == strcmp( "[TS]", s ) ) + { + // nothing to do + } + else if ( 0 == strcmp( "ERROR, invalid id", s ) ) + { + // bad server + server->server_name = DOWN; + server->saved_data.pkt_index = 0; } - else if ( 0 == strcmp( "server_maxusers", key ) ) + } + else if ( 1 == mode ) + { + // Player info + if ( 3 == sscanf( s, "%*d %*d %*d %*d %*d %*d %*d %d %d %*d %*d %*d %*d \"0.0.0.0\" \"%255[^\"]", &ping, &connect_time, name ) ) { - server->max_players = atoi( value ); + // Player info + struct player *player = add_player( server, server->n_player_info ); + if ( NULL != player ) + { + player->name = strdup( name ); + player->ping = ping; + player->connect_time = connect_time; + } } - else if ( 0 == strcmp( "server_currentusers", key ) ) + else if ( 0 == strcmp( "OK", s ) ) { - server->num_players = atoi( value); + // end of rules request + server->saved_data.pkt_index--; + mode++; } - else + else if ( 0 == strcmp( "[TS]", s ) ) { - add_rule( server, key, value, NO_FLAGS); + // nothing to do } - } - else if ( 3 == sscanf( s, "%*d %*d %*d %*d %*d %*d %*d %d %d %*d %*d %*d %*d \"0.0.0.0\" \"%255[^\"]", &ping, &connect_time, name ) ) - { - // Player info - struct player *player = add_player( server, server->n_player_info ); - if ( NULL != player ) + else if ( 0 == strcmp( "ERROR, invalid id", s ) ) { - player->name = strdup( name ); - player->ping = ping; - player->connect_time = connect_time; + // bad server + server->server_name = DOWN; + server->saved_data.pkt_index = 0; } } - else if ( 0 == strcmp( "OK", s ) ) - { - // end of request result - server->saved_data.pkt_index--; - } - else if ( 0 == strcmp( "[TS]", s ) ) - { - // nothing to do - } - else if ( 0 == strcmp( "ERROR, invalid id", s ) ) - { - // bad server - server->server_name = DOWN; - server->saved_data.pkt_index = 0; - } s = strtok( NULL, "\015\012" ); } if ( 0 == server->saved_data.pkt_index ) { server->map_name = strdup( "N/A" ); - cleanup_qserver( server, 1 ); + return DONE_FORCE; } + + return INPROGRESS; } diff -urP qstat-2.11/ts2.h qstat-2.11-20080912svn311/ts2.h --- qstat-2.11/ts2.h 2005-09-21 10:46:11.000000000 -0400 +++ qstat-2.11-20080912svn311/ts2.h 2008-09-12 14:52:23.000000000 -0400 @@ -13,8 +13,8 @@ #include "qserver.h" // Packet processing methods -void deal_with_ts2_packet( struct qserver *server, char *pkt, int pktlen ); -void send_ts2_request_packet( struct qserver *server ); +int deal_with_ts2_packet( struct qserver *server, char *pkt, int pktlen ); +int send_ts2_request_packet( struct qserver *server ); #endif diff -urP qstat-2.11/ut2004.c qstat-2.11-20080912svn311/ut2004.c --- qstat-2.11/ut2004.c 2006-05-28 07:48:38.000000000 -0400 +++ qstat-2.11-20080912svn311/ut2004.c 2008-09-12 14:52:23.000000000 -0400 @@ -30,216 +30,220 @@ */ static void bin2hex(const char* in, size_t len, char* out); -#define CD_KEY_LENGTH 23 +#define CD_KEY_LENGTH 23 // arbitrary #define MAX_LISTING_RECORD_LEN 0x04FF -#define RESPONSE_OFFSET_CDKEY 5 +#define RESPONSE_OFFSET_CDKEY 5 #define RESPONSE_OFFSET_CHALLENGE 39 static const char challenge_response[] = { - 0x68, 0x00, 0x00, 0x00, '!', 0xCD, 0xCD, 0xCD, - /* length | ! MD5SUM, CD is placeholder */ - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, - '!', 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, - 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, - - 0x0c, 'U', 'T', '2', 'K', '4', 'C', 'L', - /*^^ 12 byte string */ - 'I', 'E', 'N', 'T', 0x00, 0xfb, 0x0c, 0x00, - /* | unknown */ - 0x00, 0x06, 0x04, 'i', 'n', 't', 0x00, 0x00, - /* | ^^ 4 byte string | ? */ - 0x00, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x11, - /* unknown */ - 0x00, 0x00, 0x00, 0x01 }; + 0x68, 0x00, 0x00, 0x00, '!', 0xCD, 0xCD, 0xCD, + /* length | ! MD5SUM, CD is placeholder */ + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, + '!', 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, + 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, + + 0x0c, 'U', 'T', '2', 'K', '4', 'C', 'L', + /*^^ 12 byte string */ + 'I', 'E', 'N', 'T', 0x00, 0xfb, 0x0c, 0x00, + /* | unknown */ + 0x00, 0x06, 0x04, 'i', 'n', 't', 0x00, 0x00, + /* | ^^ 4 byte string | ? */ + 0x00, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x11, + /* unknown */ + 0x00, 0x00, 0x00, 0x01 }; static const char approved[] = { - 0x0e, 0x00, 0x00, 0x00, 0x09, 'A', 'P', 'P', - 'R', 'O', 'V', 'E', 'D', 0x00, 0x03, 0x00, - 0x00, 0x00 }; + 0x0e, 0x00, 0x00, 0x00, 0x09, 'A', 'P', 'P', + 'R', 'O', 'V', 'E', 'D', 0x00, 0x03, 0x00, + 0x00, 0x00 }; static const char approved_response[] = { - 0x22, 0x00, 0x00, 0x00, '!', '0', '0', '0', - '0', '0', '0', '0', '0', '0', '0', '0', - '0', '0', '0', '0', '0', '0', '0', '0', - '0', '0', '0', '0', '0', '0', '0', '0', - '0', '0', '0', '0', '0', 0x00 }; + 0x22, 0x00, 0x00, 0x00, '!', '0', '0', '0', + '0', '0', '0', '0', '0', '0', '0', '0', + '0', '0', '0', '0', '0', '0', '0', '0', + '0', '0', '0', '0', '0', '0', '0', '0', + '0', '0', '0', '0', '0', 0x00 }; static const char verified[] = { - 0x0a, 0x00, 0x00, 0x00, 0x09, 'V', 'E', 'R', - 'I', 'F', 'I', 'E', 'D', 0x00 }; + 0x0a, 0x00, 0x00, 0x00, 0x09, 'V', 'E', 'R', + 'I', 'F', 'I', 'E', 'D', 0x00 }; #if 0 struct server_listing_record_head { - unsigned len; - unsigned ip; - short port; - short queryport; - char name[]; - // char map[] + unsigned len; + unsigned ip; + short port; + short queryport; + char name[]; + // char map[] }; struct server_listing_record_foot { - unsigned char marker1[3]; - unsigned char unknown1; - unsigned char maxplayers; - unsigned char unknown2[4]; - unsigned char marker2[3]; + unsigned char marker1[3]; + unsigned char unknown1; + unsigned char maxplayers; + unsigned char unknown2[4]; + unsigned char marker2[3]; }; #endif static char cdkey[CD_KEY_LENGTH+1] = ""; enum ut2004_state { - STATE_CHALLENGE = 0x00, - STATE_APPROVED = 0x01, - STATE_VERIFIED = 0x02, - STATE_LISTING = 0x03, + STATE_CHALLENGE = 0x00, + STATE_APPROVED = 0x01, + STATE_VERIFIED = 0x02, + STATE_LISTING = 0x03, }; -void send_ut2004master_request_packet(struct qserver *server) +int send_ut2004master_request_packet(struct qserver *server) { - if(server->n_packets) - { - cleanup_qserver(server, 1); - return; - } - - if(!*cdkey) - { - char* param = get_param_value( server, "cdkey", NULL); - if(!param) - { - debug(0, "Error: missing cdkey parameter"); - server->server_name = SYSERROR; - cleanup_qserver(server, 1); - return; - } - - if(*param == '/') - { - FILE* fp = fopen(param, "r"); - if(!fp || fread(cdkey, 1, CD_KEY_LENGTH, fp) != CD_KEY_LENGTH) - { - debug(0, "Error: can't key from %s", param); - server->server_name = SYSERROR; - cleanup_qserver(server, 1); - if(fp) fclose(fp); - return; - } - fclose(fp); - } - else if(strchr(param, '-') && strlen(param) == CD_KEY_LENGTH) + int ret; + if(server->n_packets) { - memcpy(cdkey, param, CD_KEY_LENGTH); + return DONE_FORCE; } - else if( *param == '$' - && (param = getenv(param+1)) // replaces param! - && strlen(param) == CD_KEY_LENGTH) - { - memcpy(cdkey, param, CD_KEY_LENGTH); - } - else + + if(!*cdkey) { - debug(0, "Error: invalid cdkey parameter"); - server->server_name = SYSERROR; - cleanup_qserver(server, 1); - return; + char* param = get_param_value( server, "cdkey", NULL); + if(!param) + { + debug(0, "Error: missing cdkey parameter"); + server->server_name = SYSERROR; + return PKT_ERROR; + } + + if(*param == '/') + { + FILE* fp = fopen(param, "r"); + if(!fp || fread(cdkey, 1, CD_KEY_LENGTH, fp) != CD_KEY_LENGTH) + { + debug(0, "Error: can't key from %s", param); + server->server_name = SYSERROR; + if(fp) + { + fclose(fp); + } + return PKT_ERROR; + } + fclose(fp); + } + else if(strchr(param, '-') && strlen(param) == CD_KEY_LENGTH) + { + memcpy(cdkey, param, CD_KEY_LENGTH); + } + else if( *param == '$' + && (param = getenv(param+1)) // replaces param! + && strlen(param) == CD_KEY_LENGTH) + { + memcpy(cdkey, param, CD_KEY_LENGTH); + } + else + { + debug(0, "Error: invalid cdkey parameter"); + server->server_name = SYSERROR; + return PKT_ERROR; + } } - } - qserver_send(server, NULL, 0); + ret = qserver_send(server, NULL, 0); #if 0 - // XXX since we do not send but rather expect a reply directly after - // connect it's pointless to retry doing nothing - debug(0, "retry1: %d", server->retry1); - server->retry1 = 0; + // XXX since we do not send but rather expect a reply directly after + // connect it's pointless to retry doing nothing + debug(0, "retry1: %d", server->retry1); + server->retry1 = 0; #endif - server->master_query_tag[0] = STATE_CHALLENGE; + server->master_query_tag[0] = STATE_CHALLENGE; + return ret; } static void ut2004_server_done(struct qserver* server) { - if(server->saved_data.next) - { - debug(0, "%d bytes of unprocessed data left. Premature EOF!?", - server->saved_data.next->datalen); - free(server->saved_data.next->data); - free(server->saved_data.next); - server->saved_data.next = NULL; - } + if(server->saved_data.next) + { + debug(0, "%d bytes of unprocessed data left. Premature EOF!?", server->saved_data.next->datalen); + free(server->saved_data.next->data); + free(server->saved_data.next); + server->saved_data.next = NULL; + } } // we use n_servers to store number of used bytes in master_pkt so // it needs to be divided by 6 when finished static void ut2004_parse_record(struct qserver* server, char* pkt) { - char* dest; + char* dest; #if 0 - unsigned ip; - unsigned short port; + unsigned ip; + unsigned short port; - memcpy(&ip, pkt+4, 4); - port = swap_short_from_little(pkt+4+4); + memcpy(&ip, pkt+4, 4); + port = swap_short_from_little(pkt+4+4); - debug(2, "got %d.%d.%d.%d:%hu", ip&0xff, (ip>>8)&0xff, (ip>>16)&0xff, (ip>>24)&0xff, port); + debug(2, "got %d.%d.%d.%d:%hu", ip&0xff, (ip>>8)&0xff, (ip>>16)&0xff, (ip>>24)&0xff, port); #endif - if(server->n_servers+6 > server->master_pkt_len) - { - if(!server->master_pkt_len) - server->master_pkt_len = 180; - else - server->master_pkt_len *= 2; - server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len); - } - - dest = server->master_pkt + server->n_servers; - - memcpy(dest, pkt+4, 4 ); - dest[4] = pkt[9]; - dest[5] = pkt[8]; - server->n_servers += 6; + if(server->n_servers+6 > server->master_pkt_len) + { + if(!server->master_pkt_len) + { + server->master_pkt_len = 180; + } + else + { + server->master_pkt_len *= 2; + } + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len); + } + + dest = server->master_pkt + server->n_servers; + + memcpy(dest, pkt+4, 4 ); + dest[4] = pkt[9]; + dest[5] = pkt[8]; + server->n_servers += 6; } static char* put_bytes(char* buf, const char* bytes, size_t len, size_t* left) { - if(!buf || len > *left) + if(!buf || len > *left) return NULL; - memcpy(buf, bytes, len); - *left -= len; + memcpy(buf, bytes, len); + *left -= len; - return buf+len; + return buf+len; } static char* put_string(char* buf, const char* string, size_t* left) { - size_t len = strlen(string)+1; - char l; + size_t len = strlen(string)+1; + char l; - if(!buf || len > 0xFF || *left < len+1) - return NULL; + if(!buf || len > 0xFF || *left < len+1) + return NULL; - l = len; + l = len; - buf = put_bytes(buf, &l, 1, left); - return put_bytes(buf, string, len, left); + buf = put_bytes(buf, &l, 1, left); + return put_bytes(buf, string, len, left); } /** \brief assemble the server filter and send the master query - + the query consists of four bytes length (excluding the four length bytes), a null byte and then the number of item pairs that follow. @@ -249,416 +253,404 @@ */ static int ut2004_send_query(struct qserver* server) { - char buf[4096] = {0}; - size_t left = sizeof(buf); - char *b = buf; - char *param, *r, *sep= ""; - unsigned flen = 0; - unsigned char items = 0; - - // header is done later - b += 6; - left -= 6; - - param = get_param_value( server, "gametype", NULL); - if(param) - { - ++items; - b = put_string(b, "gametype", &left); - b = put_string(b, param, &left); - b = put_bytes(b, "", 1, &left); - } - - param = get_param_value( server, "status", NULL); - r = param; - while ( param && sep ) - { - sep= strchr( r, ':'); - if ( sep ) - flen= sep-r; - else - flen= strlen(r); - - if ( strncmp( r, "standard", flen) == 0 - || strncmp( r, "nostandard", flen) == 0) - { - ++items; - b = put_string(b, "standard", &left); - if(*r == 'n') - b = put_string(b, "false", &left); - else - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - else if ( strncmp( r, "password", flen) == 0 - || strncmp( r, "nopassword", flen) == 0) - { - ++items; - b = put_string(b, "password", &left); - if(*r == 'n') - b = put_string(b, "false", &left); - else - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - else if ( strncmp( r, "notempty", flen) == 0) - { - ++items; - b = put_string(b, "currentplayers", &left); - b = put_string(b, "0", &left); - b = put_bytes(b, "\x04", 1, &left); - } - else if ( strncmp( r, "notfull", flen) == 0) - { - ++items; - b = put_string(b, "freespace", &left); - b = put_string(b, "0", &left); - b = put_bytes(b, "\x04", 1, &left); - } - else if ( strncmp( r, "nobots", flen) == 0) - { - ++items; - b = put_string(b, "nobots", &left); - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - else if ( strncmp( r, "stats", flen) == 0 - || strncmp( r, "nostats", flen) == 0) - { - ++items; - b = put_string(b, "stats", &left); - if(*r == 'n') - b = put_string(b, "false", &left); - else - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - else if ( strncmp( r, "weaponstay", flen) == 0 - || strncmp( r, "noweaponstay", flen) == 0) - { - ++items; - b = put_string(b, "weaponstay", &left); - if(*r == 'n') - b = put_string(b, "false", &left); - else - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - else if ( strncmp( r, "transloc", flen) == 0 - || strncmp( r, "notransloc", flen) == 0) - { - ++items; - b = put_string(b, "transloc", &left); - if(*r == 'n') - b = put_string(b, "false", &left); - else - b = put_string(b, "true", &left); - b = put_bytes(b, "", 1, &left); - } - r= sep+1; - } + char buf[4096] = {0}; + size_t left = sizeof(buf); + char *b = buf; + char *param, *r, *sep= ""; + unsigned flen = 0; + unsigned char items = 0; + + // header is done later + b += 6; + left -= 6; + + param = get_param_value( server, "gametype", NULL); + if(param) + { + ++items; + b = put_string(b, "gametype", &left); + b = put_string(b, param, &left); + b = put_bytes(b, "", 1, &left); + } + + param = get_param_value( server, "status", NULL); + r = param; + while ( param && sep ) + { + sep= strchr( r, ':'); + if ( sep ) + flen= sep-r; + else + flen= strlen(r); - param = get_param_value( server, "mutator", NULL); - r = param; - sep = ""; - while ( param && sep ) - { - char neg = '\0'; - unsigned char l; - sep= strchr( r, ':'); - if ( sep ) - flen= sep-r; - else - flen= strlen(r); - - if(*r == '-') - { - neg = '\x04'; - ++r; - --flen; + if ( strncmp( r, "standard", flen) == 0 + || strncmp( r, "nostandard", flen) == 0) + { + ++items; + b = put_string(b, "standard", &left); + if(*r == 'n') + b = put_string(b, "false", &left); + else + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + else if ( strncmp( r, "password", flen) == 0 + || strncmp( r, "nopassword", flen) == 0) + { + ++items; + b = put_string(b, "password", &left); + if(*r == 'n') + b = put_string(b, "false", &left); + else + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + else if ( strncmp( r, "notempty", flen) == 0) + { + ++items; + b = put_string(b, "currentplayers", &left); + b = put_string(b, "0", &left); + b = put_bytes(b, "\x04", 1, &left); + } + else if ( strncmp( r, "notfull", flen) == 0) + { + ++items; + b = put_string(b, "freespace", &left); + b = put_string(b, "0", &left); + b = put_bytes(b, "\x04", 1, &left); + } + else if ( strncmp( r, "nobots", flen) == 0) + { + ++items; + b = put_string(b, "nobots", &left); + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + else if ( strncmp( r, "stats", flen) == 0 + || strncmp( r, "nostats", flen) == 0) + { + ++items; + b = put_string(b, "stats", &left); + if(*r == 'n') + b = put_string(b, "false", &left); + else + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + else if ( strncmp( r, "weaponstay", flen) == 0 + || strncmp( r, "noweaponstay", flen) == 0) + { + ++items; + b = put_string(b, "weaponstay", &left); + if(*r == 'n') + b = put_string(b, "false", &left); + else + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + else if ( strncmp( r, "transloc", flen) == 0 + || strncmp( r, "notransloc", flen) == 0) + { + ++items; + b = put_string(b, "transloc", &left); + if(*r == 'n') + b = put_string(b, "false", &left); + else + b = put_string(b, "true", &left); + b = put_bytes(b, "", 1, &left); + } + r= sep+1; } - if(!flen) - continue; + param = get_param_value( server, "mutator", NULL); + r = param; + sep = ""; + while ( param && sep ) + { + char neg = '\0'; + unsigned char l; + sep= strchr( r, ':'); + if ( sep ) + flen= sep-r; + else + flen= strlen(r); - b = put_string(b, "mutator", &left); - l = flen+1; - b = put_bytes(b, (char*)&l, 1, &left); - b = put_bytes(b, r, flen, &left); - b = put_bytes(b, "", 1, &left); - b = put_bytes(b, &neg, 1, &left); - ++items; - - r= sep+1; - } - - if(!b) - { - debug(0, "Error: query buffer too small. Please file a bug report!"); - return 0; - } + if(*r == '-') + { + neg = '\x04'; + ++r; + --flen; + } + + if(!flen) + continue; + + b = put_string(b, "mutator", &left); + l = flen+1; + b = put_bytes(b, (char*)&l, 1, &left); + b = put_bytes(b, r, flen, &left); + b = put_bytes(b, "", 1, &left); + b = put_bytes(b, &neg, 1, &left); + ++items; + + r= sep+1; + } + + if(!b) + { + debug(0, "Error: query buffer too small. Please file a bug report!"); + return 0; + } - put_long_little(b-buf-4, buf); - buf[5] = items; + put_long_little(b-buf-4, buf); + buf[5] = items; - return (qserver_send(server, buf, sizeof(buf)-left) > 0); + return (qserver_send(server, buf, sizeof(buf)-left) > 0); } -void deal_with_ut2004master_packet(struct qserver *server, char *rawpkt, int pktlen) +int deal_with_ut2004master_packet(struct qserver *server, char *rawpkt, int pktlen) { - unsigned char* state = (unsigned char*)&server->master_query_tag[0]; + unsigned char* state = (unsigned char*)&server->master_query_tag[0]; - md5_state_t md5; + md5_state_t md5; - if(!pktlen) - { - ut2004_server_done(server); - goto cleanup_out; - } + if(!pktlen) + { + ut2004_server_done(server); + goto cleanup_out; + } - server->ping_total+= time_delta( &packet_recv_time, &server->packet_time1); + server->ping_total+= time_delta( &packet_recv_time, &server->packet_time1); - switch(*state) - { + switch(*state) + { case STATE_CHALLENGE: - // ensure at least one byte challenge, fit into buffer, - // match challenge, null terminated - if( pktlen < 4 +1 +1 +1 + // ensure at least one byte challenge, fit into buffer, + // match challenge, null terminated + if( pktlen < 4 +1 +1 +1 || pktlen > 4 +1 +8 +1 || rawpkt[pktlen-1] != '\0') - { - malformed_packet(server, "invalid challenge" ); - goto cleanup_out; - } - else - { - char response[sizeof(challenge_response)]; - char* challenge = rawpkt+5; - char sum[16]; - - memcpy(response, challenge_response, sizeof(challenge_response)); - - debug(2, "challenge: %s", challenge); - - md5_init(&md5); - md5_append(&md5, (unsigned char*)cdkey, CD_KEY_LENGTH); - md5_finish(&md5, (unsigned char*)sum); - bin2hex(sum, 16, response+RESPONSE_OFFSET_CDKEY); - - md5_init(&md5); - md5_append(&md5, (unsigned char*)cdkey, CD_KEY_LENGTH); - md5_append(&md5, (unsigned char*)challenge, strlen(challenge)); - md5_finish(&md5, (unsigned char*)sum); - bin2hex(sum, 16, response+RESPONSE_OFFSET_CHALLENGE); - - qserver_send(server, response, sizeof(response)); - - server->server_name = MASTER; - - *state = STATE_APPROVED; - } - break; + { + malformed_packet(server, "invalid challenge" ); + goto cleanup_out; + } + else + { + char response[sizeof(challenge_response)]; + char* challenge = rawpkt+5; + char sum[16]; + + memcpy(response, challenge_response, sizeof(challenge_response)); + + debug(2, "challenge: %s", challenge); + + md5_init(&md5); + md5_append(&md5, (unsigned char*)cdkey, CD_KEY_LENGTH); + md5_finish(&md5, (unsigned char*)sum); + bin2hex(sum, 16, response+RESPONSE_OFFSET_CDKEY); + + md5_init(&md5); + md5_append(&md5, (unsigned char*)cdkey, CD_KEY_LENGTH); + md5_append(&md5, (unsigned char*)challenge, strlen(challenge)); + md5_finish(&md5, (unsigned char*)sum); + bin2hex(sum, 16, response+RESPONSE_OFFSET_CHALLENGE); + + qserver_send(server, response, sizeof(response)); + + server->server_name = MASTER; + + *state = STATE_APPROVED; + } + break; case STATE_APPROVED: - if(pktlen != sizeof(approved) + if(pktlen != sizeof(approved) || 0 != memcmp(rawpkt, approved, pktlen)) - { - malformed_packet(server, "CD key not approved" ); - goto cleanup_out; - } + { + malformed_packet(server, "CD key not approved" ); + goto cleanup_out; + } - debug(2, "got approval, sending verify"); + debug(2, "got approval, sending verify"); - qserver_send(server, approved_response, sizeof(approved_response)); - *state = STATE_VERIFIED; + qserver_send(server, approved_response, sizeof(approved_response)); + *state = STATE_VERIFIED; - break; + break; case STATE_VERIFIED: - if(pktlen != sizeof(verified) + if(pktlen != sizeof(verified) || 0 != memcmp(rawpkt, verified, pktlen)) - { - malformed_packet(server, "CD key not verified" ); - goto cleanup_out; - } + { + malformed_packet(server, "CD key not verified" ); + goto cleanup_out; + } - if(!ut2004_send_query(server)) - goto cleanup_out; + if(!ut2004_send_query(server)) + goto cleanup_out; - *state = STATE_LISTING; + *state = STATE_LISTING; - break; + break; case STATE_LISTING: - // first packet. contains number of servers to expect - if(!server->saved_data.pkt_id) - { + // first packet. contains number of servers to expect + if(!server->saved_data.pkt_id) + { /* - server->saved_data.data = malloc(pktlen); - memcpy(server->saved_data.data, rawpkt, pktlen); - server->saved_data.datalen = pktlen; - */ - server->saved_data.pkt_id = 1; + server->saved_data.data = malloc(pktlen); + memcpy(server->saved_data.data, rawpkt, pktlen); + server->saved_data.datalen = pktlen; + */ + server->saved_data.pkt_id = 1; - if(pktlen == 9) - { - unsigned num = swap_long_from_little(rawpkt+4); - debug(2, "expect %u servers", num); + if(pktlen == 9) + { + unsigned num = swap_long_from_little(rawpkt+4); + debug(2, "expect %u servers", num); #if 1 - if(num < 10000) - { - server->master_pkt_len = num*6; - server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len); - } + if(num < 10000) + { + server->master_pkt_len = num*6; + server->master_pkt = (char*)realloc(server->master_pkt, server->master_pkt_len); + } #endif - } - } - else if(pktlen < 4) - { - malformed_packet(server, "packet too short"); - goto cleanup_out; - } - else - { - char* p = rawpkt; - unsigned recordlen = 0; - - if(server->saved_data.next) - { - unsigned need = 0; - SavedData* data = server->saved_data.next; - // nasty, four bytes of record length are split up. since - // we alloc'ed at least four bytes we just copy the 4-x - // bytes to data->data - if(data->datalen < 4) - { - need = 4 - data->datalen; - debug(2, "need %d bytes more for recordlen", need); - if( need > pktlen) - { - // XXX ok, im lazy now. Stupid server can't even - // send four bytes in a row - malformed_packet(server, "chunk too small"); - goto cleanup_out; } - memcpy(data->data+data->datalen, p, need); - p += need; - data->datalen = 4; - } - - recordlen = swap_long_from_little(data->data); - - if(!recordlen || recordlen > MAX_LISTING_RECORD_LEN) - { - malformed_packet(server, - "record lengthx %x out of range, position %d", recordlen, (int)(p-rawpkt)); + } + else if(pktlen < 4) + { + malformed_packet(server, "packet too short"); goto cleanup_out; - } - - need = 4+recordlen - data->datalen; - - debug(2, "recordlen: %d, saved: %d, pkglen: %d, needed: %d", recordlen, data->datalen, pktlen, need); - - if( need <= pktlen) - { - data->data = realloc(data->data, 4+recordlen); - memcpy(data->data + data->datalen, p, need); - ut2004_parse_record(server, data->data); - p += need; - - free(data->data); - free(data); - server->saved_data.next = NULL; - } } - - while(!server->saved_data.next && p-rawpkt+4 < pktlen) + else { - recordlen = swap_long_from_little(p); + char* p = rawpkt; + unsigned recordlen = 0; - // record too large - if(!recordlen || recordlen > MAX_LISTING_RECORD_LEN) - { - malformed_packet(server, - "record length %x out of range, position %d", recordlen, (int)(p-rawpkt)); - goto cleanup_out; - } - // recordlen itself is four bytes - recordlen += 4; - - // record fully inside packet - if(p-rawpkt+recordlen <= pktlen) - { - ut2004_parse_record(server, p); - p += recordlen; - } - else - break; - } - - // record continues in next packet. save it. - if(p-rawpkt < pktlen) - { - SavedData* data = server->saved_data.next; - unsigned tosave = pktlen - (p-rawpkt); - if(!data) - { - data = malloc(sizeof(SavedData)); - data->data = malloc(tosave<4?4:tosave); // alloc at least four bytes - data->datalen = tosave; - memcpy(data->data, p, data->datalen); - data->next = NULL; - server->saved_data.next = data; - - debug(1, "saved %d bytes", data->datalen ); - } - else - { - data->data = realloc(data->data, data->datalen + tosave ); - memcpy(data->data+data->datalen, p, tosave); - data->datalen += tosave; - - debug(1, "saved %d bytes (+)", data->datalen ); - } - } - } - break; - } + if(server->saved_data.next) + { + unsigned need = 0; + SavedData* data = server->saved_data.next; + // nasty, four bytes of record length are split up. since + // we alloc'ed at least four bytes we just copy the 4-x + // bytes to data->data + if(data->datalen < 4) + { + need = 4 - data->datalen; + debug(2, "need %d bytes more for recordlen", need); + if( need > pktlen) + { + // XXX ok, im lazy now. Stupid server can't even + // send four bytes in a row + malformed_packet(server, "chunk too small"); + goto cleanup_out; + } + memcpy(data->data+data->datalen, p, need); + p += need; + data->datalen = 4; + } + + recordlen = swap_long_from_little(data->data); + + if(!recordlen || recordlen > MAX_LISTING_RECORD_LEN) + { + malformed_packet(server, + "record lengthx %x out of range, position %d", recordlen, (int)(p-rawpkt)); + goto cleanup_out; + } + + need = 4+recordlen - data->datalen; + + debug(2, "recordlen: %d, saved: %d, pkglen: %d, needed: %d", recordlen, data->datalen, pktlen, need); + + if( need <= pktlen) + { + data->data = realloc(data->data, 4+recordlen); + memcpy(data->data + data->datalen, p, need); + ut2004_parse_record(server, data->data); + p += need; + + free(data->data); + free(data); + server->saved_data.next = NULL; + } + } -#if 0 // would cause extremely short timeout - server->next_player_info= -1; // would clean up otherwise <- not true? -#endif + while(!server->saved_data.next && p-rawpkt+4 < pktlen) + { + recordlen = swap_long_from_little(p); + // record too large + if(!recordlen || recordlen > MAX_LISTING_RECORD_LEN) + { + malformed_packet(server, + "record length %x out of range, position %d", recordlen, (int)(p-rawpkt)); + goto cleanup_out; + } + // recordlen itself is four bytes + recordlen += 4; + + // record fully inside packet + if(p-rawpkt+recordlen <= pktlen) + { + ut2004_parse_record(server, p); + p += recordlen; + } + else + break; + } - debug(2, "%d servers total", server->n_servers/6); + // record continues in next packet. save it. + if(p-rawpkt < pktlen) + { + SavedData* data = server->saved_data.next; + unsigned tosave = pktlen - (p-rawpkt); + if(!data) + { + data = malloc(sizeof(SavedData)); + data->data = malloc(tosave<4?4:tosave); // alloc at least four bytes + data->datalen = tosave; + memcpy(data->data, p, data->datalen); + data->next = NULL; + server->saved_data.next = data; + + debug(1, "saved %d bytes", data->datalen ); + } + else + { + data->data = realloc(data->data, data->datalen + tosave ); + memcpy(data->data+data->datalen, p, tosave); + data->datalen += tosave; -#if 0 // harms now with new ping scheduling - server->retry1= 0; - cleanup_qserver( server, 0); - bind_sockets(); -#endif + debug(1, "saved %d bytes (+)", data->datalen ); + } + } + } + break; + } + + debug(2, "%d servers total", server->n_servers/6); - return; + return 0; cleanup_out: - server->master_pkt_len = server->n_servers; - server->n_servers /= 6; - cleanup_qserver(server, 1); - return; + server->master_pkt_len = server->n_servers; + server->n_servers /= 6; + return DONE_FORCE; } static const char hexchar[] = "0123456789abcdef"; static void bin2hex(const char* in, size_t len, char* out) { - char* o = out+len*2; - in += len; - do - { - *--o = hexchar[*--in&0x0F]; - *--o = hexchar[(*in>>4)&0x0F]; - } while(o != out); + char* o = out+len*2; + in += len; + do + { + *--o = hexchar[*--in&0x0F]; + *--o = hexchar[(*in>>4)&0x0F]; + } while(o != out); } -// vim: sw=4 ts=8 noet +// vim: sw=4 ts=4 noet diff -urP qstat-2.11/ut2004.h qstat-2.11-20080912svn311/ut2004.h --- qstat-2.11/ut2004.h 2004-10-17 16:41:53.000000000 -0400 +++ qstat-2.11-20080912svn311/ut2004.h 2008-09-12 14:52:23.000000000 -0400 @@ -12,7 +12,7 @@ #include "qstat.h" -void send_ut2004master_request_packet(struct qserver *server); -void deal_with_ut2004master_packet(struct qserver *server, char *rawpkt, int pktlen); +int send_ut2004master_request_packet(struct qserver *server); +int deal_with_ut2004master_packet(struct qserver *server, char *rawpkt, int pktlen); #endif diff -urP qstat-2.11/wic.c qstat-2.11-20080912svn311/wic.c --- qstat-2.11/wic.c 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/wic.c 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,184 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * World in Conflict Protocol + * Copyright 2007 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + * + */ + +#include <sys/types.h> +#ifndef _WIN32 +#include <sys/socket.h> +#endif +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> + +#include "debug.h" +#include "qstat.h" +#include "packet_manip.h" + + +int send_wic_request_packet( struct qserver *server ) +{ + char buf[256]; + + int serverport = get_param_i_value( server, "port", 0 ); + char *password = get_param_value( server, "password", "N/A" ); + change_server_port( server, serverport, 1 ); + + if ( get_player_info ) + { + server->flags |= TF_PLAYER_QUERY|TF_RULES_QUERY; + sprintf( buf, "%s\x0d\x0a/listsettings\x0d\x0a/listplayers\x0d\x0a/exit\x0d\x0a", password ); + server->saved_data.pkt_index = 2; + } + else + { + server->flags |= TF_STATUS_QUERY; + sprintf( buf, "%s\x0d\x0a/listsettings\x0d\x0a/exit\x0d\x0a", password ); + server->saved_data.pkt_index = 1; + } + + return send_packet( server, buf, strlen( buf ) ); +} + + +int deal_with_wic_packet( struct qserver *server, char *rawpkt, int pktlen ) +{ + char *s, *end, *team = NULL; + int mode = server->n_servers, slot, score; + char name[256], role[256]; + + debug( 2, "processing n_requests %d, retry1 %d, n_retries %d, delta %d", server->n_requests, server->retry1, n_retries, time_delta( &packet_recv_time, &server->packet_time1 ) ); + + server->ping_total += time_delta( &packet_recv_time, &server->packet_time1 ); + server->n_requests++; + gettimeofday( &server->packet_time1, NULL); + + rawpkt[pktlen]= '\0'; + end = &rawpkt[pktlen]; + + s = rawpkt; + + while ( NULL != s ) + { + int len = strlen( s ); + *(s + len - 2) = '\0'; // strip off \x0D\x0A + debug( 2, "Line[%d]: %s", mode, s ); + + if ( 0 == mode ) + { + // Settings + // TODO: make parse safe + if ( 0 == strncmp( s, "Settings: ", 9 ) ) + { + // Server Rule + char *key = s + 10; + char *value = strchr( key, ' ' ); + *value = '\0'; + value++; + debug( 2, "key: '%s' = '%s'", key, value ); + if ( 0 == strcmp( "myGameName", key ) ) + { + server->server_name = strdup( value ); + } + else if ( 0 == strcmp( "myMapFilename", key ) ) + { + server->map_name = strdup( value ); + } + else if ( 0 == strcmp( "myMaxPlayers", key ) ) + { + server->max_players = atoi( value ); + } + else if ( 0 == strcmp( "myCurrentNumberOfPlayers", key ) ) + { + server->num_players = atoi( value); + } + else + { + add_rule( server, key, value, NO_FLAGS ); + } + } + else if ( 0 == strcmp( "Listing players", s ) ) + { + // end of rules request + server->saved_data.pkt_index--; + mode++; + } + else if ( 0 == strcmp( "Exit confirmed.", s ) ) + { + server->n_servers = mode; + return DONE_FORCE; + } + } + else if ( 1 == mode ) + { + // Player info + if ( 0 == strncmp( s, "Team: ", 6 ) ) + { + team = s + 6; + debug( 2, "Team: %s", team ); + } + else if ( 4 == sscanf( s, "Slot: %d Role: %s Score: %d Name: %255[^\x0d\x0a]", &slot, role, &score, name ) ) + { + // Player info + struct player *player = add_player( server, server->n_player_info ); + if ( NULL != player ) + { + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + player->name = strdup( name ); + player->score = score; + player->team_name = team; + player->tribe_tag = strdup( role ); + // Indicate if its a bot + player->type_flag = ( 0 == strcmp( name, "Computer: Balanced" ) ) ? 1 : 0; + } + debug( 2, "player %d, role %s, score %d, name %s", slot, role, score, name ); + } + else if ( 3 == sscanf( s, "Slot: %d Role: Score: %d Name: %255[^\x0d\x0a]", &slot, &score, name ) ) + { + // Player info + struct player *player = add_player( server, server->n_player_info ); + if ( NULL != player ) + { + player->flags |= PLAYER_FLAG_DO_NOT_FREE_TEAM; + player->name = strdup( name ); + player->score = score; + player->team_name = team; + // Indicate if its a bot + player->type_flag = ( 0 == strcmp( name, "Computer: Balanced" ) ) ? 1 : 0; + } + debug( 2, "player %d, score %d, name %s", slot, score, name ); + } + else if ( 0 == strcmp( "Exit confirmed.", s ) ) + { + server->n_servers = mode; + return DONE_FORCE; + } + } + + s += len; + if ( s + 1 < end ) + { + s++; // next line + } + else + { + s = NULL; + } + } + + server->n_servers = mode; + + if ( 0 == server->saved_data.pkt_index ) + { + server->map_name = strdup( "N/A" ); + return DONE_FORCE; + } + + return INPROGRESS; +} diff -urP qstat-2.11/wic.h qstat-2.11-20080912svn311/wic.h --- qstat-2.11/wic.h 1969-12-31 19:00:00.000000000 -0500 +++ qstat-2.11-20080912svn311/wic.h 2008-09-12 14:52:23.000000000 -0400 @@ -0,0 +1,20 @@ +/* + * qstat 2.8 + * by Steve Jankowski + * + * World in Conflict Protocol + * Copyright 2007 Steven Hartland + * + * Licensed under the Artistic License, see LICENSE.txt for license terms + */ +#ifndef QSTAT_GPS_H +#define QSTAT_GPS_H + +#include "qserver.h" + +// Packet processing methods +int deal_with_wic_packet( struct qserver *server, char *pkt, int pktlen ); +int send_wic_request_packet( struct qserver *server ); + +#endif +