diff options
| author | Christian Breunig <christian@breunig.cc> | 2024-04-29 20:58:47 +0200 | 
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2024-04-29 20:58:47 +0200 | 
| commit | 049d2843b521d15e2f355430d94eb9d2e83311be (patch) | |
| tree | 9f106f0f4825a58ca0e4680705b9c4eafa0b0f7d | |
| parent | 19008ab68d9d504aa58eb34d5f564755a1613b8b (diff) | |
| download | libnss-tacplus-049d2843b521d15e2f355430d94eb9d2e83311be.tar.gz libnss-tacplus-049d2843b521d15e2f355430d94eb9d2e83311be.zip | |
Import version 1.0.4-cl5.1.0u11 from Cumulus Linux
| -rw-r--r-- | Makefile.am | 4 | ||||
| -rwxr-xr-x | config/config.guess | 920 | ||||
| -rwxr-xr-x | config/config.sub | 409 | ||||
| -rw-r--r-- | debian/changelog | 83 | ||||
| -rw-r--r-- | debian/control | 9 | ||||
| -rw-r--r-- | debian/copyright | 2 | ||||
| -rw-r--r-- | debian/libnss-tacplus.manpages | 1 | ||||
| -rw-r--r-- | debian/libnss-tacplus.postinst | 6 | ||||
| -rw-r--r-- | debian/libnss-tacplus.prerm | 2 | ||||
| -rw-r--r-- | debian/libnss-tacplus.symbols | 5 | ||||
| -rw-r--r-- | nss_tacplus.c | 664 | ||||
| -rw-r--r-- | tacplus_nss.conf | 8 | ||||
| -rw-r--r-- | tacplus_nss.conf.5 | 114 | 
13 files changed, 1429 insertions, 798 deletions
| diff --git a/Makefile.am b/Makefile.am index 293951e..fb0a9d1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@  ###########################################################################  ## -## Copyright 2014, 2015, 2016 Cumulus Networks.  All rights reserved. +## Copyright 2014, 2015, 2016, 2018 Cumulus Networks.  All rights reserved.  ## Author: Dave Olson <olson@cumulusnetworks.com>  ##  ########################################################################### @@ -16,6 +16,8 @@ libnss_tacplus_la_SOURCES = \  nss_tacplus.c \  nss_tacplus.h +dist_man_MANS = tacplus_nss.conf.5 +  libnss_tacplus_la_CFLAGS = $(AM_CFLAGS)  # Version 2.0 because that's the NSS module version, and they must match  libnss_tacplus_la_LDFLAGS = -module -version-info 2:0:0 -shared diff --git a/config/config.guess b/config/config.guess index d622a44..f50dcdb 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,14 +1,12 @@  #! /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, 2006, 2007, 2008, 2009, 2010, -#   2011, 2012 Free Software Foundation, Inc. +#   Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2018-02-24'  # 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 -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or  # (at your option) any later version.  #  # This program is distributed in the hope that it will be useful, but @@ -17,24 +15,22 @@ timestamp='2012-02-10'  # General Public License for more details.  #  # You should have received a copy of the GNU General Public License -# along with this program; if not, see <http://www.gnu.org/licenses/>. +# along with this program; if not, see <https://www.gnu.org/licenses/>.  #  # 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.  Please send patches (context -# diff format) to <config-patches@gnu.org> and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program.  This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3").  # -# This script attempts to guess a canonical system name similar to -# config.sub.  If it succeeds, it prints the system name on stdout, and -# exits with 0.  Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.  #  # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to <config-patches@gnu.org>. +  me=`echo "$0" | sed -e 's,.*/,,'` @@ -43,7 +39,7 @@ Usage: $0 [OPTION]  Output the configuration name of the system \`$me' is run on. -Operation modes: +Options:    -h, --help         print this help, then exit    -t, --time-stamp   print date of last modification, then exit    -v, --version      print version number, then exit @@ -54,9 +50,7 @@ version="\  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, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -113,9 +107,9 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;  dummy=$tmp/dummy ;  tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;  case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,)    echo "int x;" > $dummy.c ; + ,,)    echo "int x;" > "$dummy.c" ;  	for c in cc gcc c89 c99 ; do -	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then +	  if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then  	     CC_FOR_BUILD="$c"; break ;  	  fi ;  	done ; @@ -138,9 +132,37 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown  UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown  UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) +	# If the system lacks a compiler, then just pick glibc. +	# We could probably try harder. +	LIBC=gnu + +	eval "$set_cc_for_build" +	cat <<-EOF > "$dummy.c" +	#include <features.h> +	#if defined(__UCLIBC__) +	LIBC=uclibc +	#elif defined(__dietlibc__) +	LIBC=dietlibc +	#else +	LIBC=gnu +	#endif +	EOF +	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + +	# If ldd exists, use it to detect musl libc. +	if command -v ldd >/dev/null && \ +		ldd --version 2>&1 | grep -q ^musl +	then +	    LIBC=musl +	fi +	;; +esac +  # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in      *:NetBSD:*:*)  	# NetBSD (nbsd) targets should (where applicable) match one or  	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -153,21 +175,31 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  	# Note: NetBSD doesn't particularly care about the vendor  	# portion of the name.  We always set it to "unknown".  	sysctl="sysctl -n hw.machine_arch" -	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ -	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)` -	case "${UNAME_MACHINE_ARCH}" in +	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ +	    "/sbin/$sysctl" 2>/dev/null || \ +	    "/usr/sbin/$sysctl" 2>/dev/null || \ +	    echo unknown)` +	case "$UNAME_MACHINE_ARCH" in  	    armeb) machine=armeb-unknown ;;  	    arm*) machine=arm-unknown ;;  	    sh3el) machine=shl-unknown ;;  	    sh3eb) machine=sh-unknown ;;  	    sh5el) machine=sh5le-unknown ;; -	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;; +	    earmv*) +		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` +		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` +		machine="${arch}${endian}"-unknown +		;; +	    *) machine="$UNAME_MACHINE_ARCH"-unknown ;;  	esac  	# The Operating System including object format, if it has switched -	# to ELF recently, or will in the future. -	case "${UNAME_MACHINE_ARCH}" in +	# to ELF recently (or will in the future) and ABI. +	case "$UNAME_MACHINE_ARCH" in +	    earm*) +		os=netbsdelf +		;;  	    arm*|i386|m68k|ns32k|sh3*|sparc|vax) -		eval $set_cc_for_build +		eval "$set_cc_for_build"  		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \  			| grep -q __ELF__  		then @@ -182,40 +214,67 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  		os=netbsd  		;;  	esac +	# Determine ABI tags. +	case "$UNAME_MACHINE_ARCH" in +	    earm*) +		expr='s/^earmv[0-9]/-eabi/;s/eb$//' +		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` +		;; +	esac  	# The OS release  	# Debian GNU/NetBSD machines have a different userland, and  	# thus, need a distinct triplet. However, they do not need  	# kernel version information, so it can be replaced with a  	# suitable tag, in the style of linux-gnu. -	case "${UNAME_VERSION}" in +	case "$UNAME_VERSION" in  	    Debian*)  		release='-gnu'  		;;  	    *) -		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` +		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`  		;;  	esac  	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:  	# contains redundant information, the shorter form:  	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. -	echo "${machine}-${os}${release}" +	echo "$machine-${os}${release}${abi}" +	exit ;; +    *:Bitrig:*:*) +	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` +	echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"  	exit ;;      *:OpenBSD:*:*)  	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` -	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} +	echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" +	exit ;; +    *:LibertyBSD:*:*) +	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` +	echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" +	exit ;; +    *:MidnightBSD:*:*) +	echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"  	exit ;;      *:ekkoBSD:*:*) -	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"  	exit ;;      *:SolidBSD:*:*) -	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"  	exit ;;      macppc:MirBSD:*:*) -	echo powerpc-unknown-mirbsd${UNAME_RELEASE} +	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"  	exit ;;      *:MirBSD:*:*) -	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" +	exit ;; +    *:Sortix:*:*) +	echo "$UNAME_MACHINE"-unknown-sortix  	exit ;; +    *:Redox:*:*) +	echo "$UNAME_MACHINE"-unknown-redox +	exit ;; +    mips:OSF1:*.*) +        echo mips-dec-osf1 +        exit ;;      alpha:OSF1:*:*)  	case $UNAME_RELEASE in  	*4.0) @@ -232,63 +291,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`  	case "$ALPHA_CPU_TYPE" in  	    "EV4 (21064)") -		UNAME_MACHINE="alpha" ;; +		UNAME_MACHINE=alpha ;;  	    "EV4.5 (21064)") -		UNAME_MACHINE="alpha" ;; +		UNAME_MACHINE=alpha ;;  	    "LCA4 (21066/21068)") -		UNAME_MACHINE="alpha" ;; +		UNAME_MACHINE=alpha ;;  	    "EV5 (21164)") -		UNAME_MACHINE="alphaev5" ;; +		UNAME_MACHINE=alphaev5 ;;  	    "EV5.6 (21164A)") -		UNAME_MACHINE="alphaev56" ;; +		UNAME_MACHINE=alphaev56 ;;  	    "EV5.6 (21164PC)") -		UNAME_MACHINE="alphapca56" ;; +		UNAME_MACHINE=alphapca56 ;;  	    "EV5.7 (21164PC)") -		UNAME_MACHINE="alphapca57" ;; +		UNAME_MACHINE=alphapca57 ;;  	    "EV6 (21264)") -		UNAME_MACHINE="alphaev6" ;; +		UNAME_MACHINE=alphaev6 ;;  	    "EV6.7 (21264A)") -		UNAME_MACHINE="alphaev67" ;; +		UNAME_MACHINE=alphaev67 ;;  	    "EV6.8CB (21264C)") -		UNAME_MACHINE="alphaev68" ;; +		UNAME_MACHINE=alphaev68 ;;  	    "EV6.8AL (21264B)") -		UNAME_MACHINE="alphaev68" ;; +		UNAME_MACHINE=alphaev68 ;;  	    "EV6.8CX (21264D)") -		UNAME_MACHINE="alphaev68" ;; +		UNAME_MACHINE=alphaev68 ;;  	    "EV6.9A (21264/EV69A)") -		UNAME_MACHINE="alphaev69" ;; +		UNAME_MACHINE=alphaev69 ;;  	    "EV7 (21364)") -		UNAME_MACHINE="alphaev7" ;; +		UNAME_MACHINE=alphaev7 ;;  	    "EV7.9 (21364A)") -		UNAME_MACHINE="alphaev79" ;; +		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'` +	echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"  	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.  	exitcode=$?  	trap '' 0  	exit $exitcode ;; -    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 ;; -    21064:Windows_NT:50:3) -	echo alpha-dec-winnt3.5 -	exit ;;      Amiga*:UNIX_System_V:4.0:*)  	echo m68k-unknown-sysv4  	exit ;;      *:[Aa]miga[Oo][Ss]:*:*) -	echo ${UNAME_MACHINE}-unknown-amigaos +	echo "$UNAME_MACHINE"-unknown-amigaos  	exit ;;      *:[Mm]orph[Oo][Ss]:*:*) -	echo ${UNAME_MACHINE}-unknown-morphos +	echo "$UNAME_MACHINE"-unknown-morphos  	exit ;;      *:OS/390:*:*)  	echo i370-ibm-openedition @@ -300,9 +350,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  	echo powerpc-ibm-os400  	exit ;;      arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) -	echo arm-acorn-riscix${UNAME_RELEASE} +	echo arm-acorn-riscix"$UNAME_RELEASE"  	exit ;; -    arm:riscos:*:*|arm:RISCOS:*:*) +    arm*:riscos:*:*|arm*:RISCOS:*:*)  	echo arm-unknown-riscos  	exit ;;      SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -327,38 +377,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  	    sparc) echo sparc-icl-nx7; exit ;;  	esac ;;      s390x:SunOS:*:*) -	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +	echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"  	exit ;;      sun4H:SunOS:5.*:*) -	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +	echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"  	exit ;;      sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) -	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +	echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"  	exit ;;      i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) -	echo i386-pc-auroraux${UNAME_RELEASE} +	echo i386-pc-auroraux"$UNAME_RELEASE"  	exit ;;      i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) -	eval $set_cc_for_build -	SUN_ARCH="i386" +	eval "$set_cc_for_build" +	SUN_ARCH=i386  	# If there is a compiler, see if it is configured for 64-bit objects.  	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.  	# This test works for both compilers. -	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then +	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then  	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ -		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ +		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \  		grep IS_64BIT_ARCH >/dev/null  	    then -		SUN_ARCH="x86_64" +		SUN_ARCH=x86_64  	    fi  	fi -	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +	echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"  	exit ;;      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/[^.]*//'` +	echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"  	exit ;;      sun4*:SunOS:*:*)  	case "`/usr/bin/arch -k`" in @@ -367,25 +417,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  		;;  	esac  	# Japanese Language versions have a version number like `4.1.3-JL'. -	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` +	echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"  	exit ;;      sun3*:SunOS:*:*) -	echo m68k-sun-sunos${UNAME_RELEASE} +	echo m68k-sun-sunos"$UNAME_RELEASE"  	exit ;;      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 +	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3  	case "`/bin/arch`" in  	    sun3) -		echo m68k-sun-sunos${UNAME_RELEASE} +		echo m68k-sun-sunos"$UNAME_RELEASE"  		;;  	    sun4) -		echo sparc-sun-sunos${UNAME_RELEASE} +		echo sparc-sun-sunos"$UNAME_RELEASE"  		;;  	esac  	exit ;;      aushp:SunOS:*:*) -	echo sparc-auspex-sunos${UNAME_RELEASE} +	echo sparc-auspex-sunos"$UNAME_RELEASE"  	exit ;;      # The situation for MiNT is a little confusing.  The machine name      # can be virtually everything (everything which is not @@ -396,44 +446,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in      # MiNT.  But MiNT is downward compatible to TOS, so this should      # be no problem.      atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) -	echo m68k-atari-mint${UNAME_RELEASE} +	echo m68k-atari-mint"$UNAME_RELEASE"  	exit ;;      atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) -	echo m68k-atari-mint${UNAME_RELEASE} +	echo m68k-atari-mint"$UNAME_RELEASE"  	exit ;;      *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) -	echo m68k-atari-mint${UNAME_RELEASE} +	echo m68k-atari-mint"$UNAME_RELEASE"  	exit ;;      milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) -	echo m68k-milan-mint${UNAME_RELEASE} +	echo m68k-milan-mint"$UNAME_RELEASE"  	exit ;;      hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) -	echo m68k-hades-mint${UNAME_RELEASE} +	echo m68k-hades-mint"$UNAME_RELEASE"  	exit ;;      *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) -	echo m68k-unknown-mint${UNAME_RELEASE} +	echo m68k-unknown-mint"$UNAME_RELEASE"  	exit ;;      m68k:machten:*:*) -	echo m68k-apple-machten${UNAME_RELEASE} +	echo m68k-apple-machten"$UNAME_RELEASE"  	exit ;;      powerpc:machten:*:*) -	echo powerpc-apple-machten${UNAME_RELEASE} +	echo powerpc-apple-machten"$UNAME_RELEASE"  	exit ;;      RISC*:Mach:*:*)  	echo mips-dec-mach_bsd4.3  	exit ;;      RISC*:ULTRIX:*:*) -	echo mips-dec-ultrix${UNAME_RELEASE} +	echo mips-dec-ultrix"$UNAME_RELEASE"  	exit ;;      VAX*:ULTRIX*:*:*) -	echo vax-dec-ultrix${UNAME_RELEASE} +	echo vax-dec-ultrix"$UNAME_RELEASE"  	exit ;;      2020:CLIX:*:* | 2430:CLIX:*:*) -	echo clipper-intergraph-clix${UNAME_RELEASE} +	echo clipper-intergraph-clix"$UNAME_RELEASE"  	exit ;;      mips:*:*:UMIPS | mips:*:*:RISCos) -	eval $set_cc_for_build -	sed 's/^	//' << EOF >$dummy.c +	eval "$set_cc_for_build" +	sed 's/^	//' << EOF > "$dummy.c"  #ifdef __cplusplus  #include <stdio.h>  /* for printf() prototype */  	int main (int argc, char *argv[]) { @@ -442,23 +492,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in  #endif  	#if defined (host_mips) && defined (MIPSEB)  	#if defined (SYSTYPE_SYSV) -	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); +	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);  	#endif  	#if defined (SYSTYPE_SVR4) -	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); +	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);  	#endif  	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) -	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); +	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);  	#endif  	#endif  	  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` && +	$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; } -	echo mips-mips-riscos${UNAME_RELEASE} +	echo mips-mips-riscos"$UNAME_RELEASE"  	exit ;;      Motorola:PowerMAX_OS:*:*)  	echo powerpc-motorola-powermax @@ -484,17 +534,17 @@ EOF      AViiON:dgux:*:*)  	# DG/UX returns AViiON for all architectures  	UNAME_PROCESSOR=`/usr/bin/uname -p` -	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] +	if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]  	then -	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ -	       [ ${TARGET_BINARY_INTERFACE}x = x ] +	    if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ +	       [ "$TARGET_BINARY_INTERFACE"x = x ]  	    then -		echo m88k-dg-dgux${UNAME_RELEASE} +		echo m88k-dg-dgux"$UNAME_RELEASE"  	    else -		echo m88k-dg-dguxbcs${UNAME_RELEASE} +		echo m88k-dg-dguxbcs"$UNAME_RELEASE"  	    fi  	else -	    echo i586-dg-dgux${UNAME_RELEASE} +	    echo i586-dg-dgux"$UNAME_RELEASE"  	fi  	exit ;;      M88*:DolphinOS:*:*)	# DolphinOS (SVR3) @@ -511,7 +561,7 @@ EOF  	echo m68k-tektronix-bsd  	exit ;;      *:IRIX*:*:*) -	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` +	echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"  	exit ;;      ????????: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 @@ -523,14 +573,14 @@ EOF  	if [ -x /usr/bin/oslevel ] ; then  		IBM_REV=`/usr/bin/oslevel`  	else -		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} +		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"  	fi -	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} +	echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"  	exit ;;      *:AIX:2:3)  	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then -		eval $set_cc_for_build -		sed 's/^		//' << EOF >$dummy.c +		eval "$set_cc_for_build" +		sed 's/^		//' << EOF > "$dummy.c"  		#include <sys/systemcfg.h>  		main() @@ -541,7 +591,7 @@ EOF  			exit(0);  			}  EOF -		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` +		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`  		then  			echo "$SYSTEM_NAME"  		else @@ -555,26 +605,27 @@ EOF  	exit ;;      *:AIX:*:[4567])  	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 +	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then  		IBM_ARCH=rs6000  	else  		IBM_ARCH=powerpc  	fi -	if [ -x /usr/bin/oslevel ] ; then -		IBM_REV=`/usr/bin/oslevel` +	if [ -x /usr/bin/lslpp ] ; then +		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | +			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`  	else -		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} +		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"  	fi -	echo ${IBM_ARCH}-ibm-aix${IBM_REV} +	echo "$IBM_ARCH"-ibm-aix"$IBM_REV"  	exit ;;      *:AIX:*:*)  	echo rs6000-ibm-aix  	exit ;; -    ibmrt:4.4BSD:*|romp-ibm:BSD:*) +    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)  	echo romp-ibm-bsd4.4  	exit ;;      ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and -	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to +	echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to  	exit ;;                             # report: romp-ibm BSD 4.3      *:BOSX:*:*)  	echo rs6000-bull-bosx @@ -589,28 +640,28 @@ EOF  	echo m68k-hp-bsd4.4  	exit ;;      9000/[34678]??:HP-UX:*:*) -	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` -	case "${UNAME_MACHINE}" in -	    9000/31? )            HP_ARCH=m68000 ;; -	    9000/[34]?? )         HP_ARCH=m68k ;; +	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` +	case "$UNAME_MACHINE" in +	    9000/31?)            HP_ARCH=m68000 ;; +	    9000/[34]??)         HP_ARCH=m68k ;;  	    9000/[678][0-9][0-9])  		if [ -x /usr/bin/getconf ]; then  		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`  		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` -		    case "${sc_cpu_version}" in -		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 -		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 +		    case "$sc_cpu_version" in +		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 +		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1  		      532)                      # CPU_PA_RISC2_0 -			case "${sc_kernel_bits}" in -			  32) HP_ARCH="hppa2.0n" ;; -			  64) HP_ARCH="hppa2.0w" ;; -			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20 +			case "$sc_kernel_bits" in +			  32) HP_ARCH=hppa2.0n ;; +			  64) HP_ARCH=hppa2.0w ;; +			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20  			esac ;;  		    esac  		fi -		if [ "${HP_ARCH}" = "" ]; then -		    eval $set_cc_for_build -		    sed 's/^		//' << EOF >$dummy.c +		if [ "$HP_ARCH" = "" ]; then +		    eval "$set_cc_for_build" +		    sed 's/^		//' << EOF > "$dummy.c"  		#define _HPUX_SOURCE  		#include <stdlib.h> @@ -643,13 +694,13 @@ EOF  		    exit (0);  		}  EOF -		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` +		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`  		    test -z "$HP_ARCH" && HP_ARCH=hppa  		fi ;;  	esac -	if [ ${HP_ARCH} = "hppa2.0w" ] +	if [ "$HP_ARCH" = hppa2.0w ]  	then -	    eval $set_cc_for_build +	    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 @@ -660,23 +711,23 @@ EOF  	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess  	    # => hppa64-hp-hpux11.23 -	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | +	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |  		grep -q __LP64__  	    then -		HP_ARCH="hppa2.0w" +		HP_ARCH=hppa2.0w  	    else -		HP_ARCH="hppa64" +		HP_ARCH=hppa64  	    fi  	fi -	echo ${HP_ARCH}-hp-hpux${HPUX_REV} +	echo "$HP_ARCH"-hp-hpux"$HPUX_REV"  	exit ;;      ia64:HP-UX:*:*) -	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` -	echo ia64-hp-hpux${HPUX_REV} +	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` +	echo ia64-hp-hpux"$HPUX_REV"  	exit ;;      3050*:HI-UX:*:*) -	eval $set_cc_for_build -	sed 's/^	//' << EOF >$dummy.c +	eval "$set_cc_for_build" +	sed 's/^	//' << EOF > "$dummy.c"  	#include <unistd.h>  	int  	main () @@ -701,11 +752,11 @@ EOF  	  exit (0);  	}  EOF -	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && +	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&  		{ echo "$SYSTEM_NAME"; exit; }  	echo unknown-hitachi-hiuxwe2  	exit ;; -    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) +    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)  	echo hppa1.1-hp-bsd  	exit ;;      9000/8??:4.3bsd:*:*) @@ -714,7 +765,7 @@ EOF      *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)  	echo hppa1.0-hp-mpeix  	exit ;; -    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) +    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)  	echo hppa1.1-hp-osf  	exit ;;      hp8??:OSF1:*:*) @@ -722,9 +773,9 @@ EOF  	exit ;;      i*86:OSF1:*:*)  	if [ -x /usr/sbin/sysversion ] ; then -	    echo ${UNAME_MACHINE}-unknown-osf1mk +	    echo "$UNAME_MACHINE"-unknown-osf1mk  	else -	    echo ${UNAME_MACHINE}-unknown-osf1 +	    echo "$UNAME_MACHINE"-unknown-osf1  	fi  	exit ;;      parisc*:Lites*:*:*) @@ -749,124 +800,109 @@ EOF  	echo c4-convex-bsd  	exit ;;      CRAY*Y-MP:*:*:*) -	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +	echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'  	exit ;;      CRAY*[A-Z]90:*:*:*) -	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ +	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \  	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \  	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \  	      -e 's/\.[^.]*$/.X/'  	exit ;;      CRAY*TS:*:*:*) -	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +	echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'  	exit ;;      CRAY*T3E:*:*:*) -	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +	echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'  	exit ;;      CRAY*SV1:*:*:*) -	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +	echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'  	exit ;;      *:UNICOS/mp:*:*) -	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +	echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'  	exit ;;      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/ /_/'` +	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/ /_/'` +	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 ;;      i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) -	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"  	exit ;;      sparc*:BSD/OS:*:*) -	echo sparc-unknown-bsdi${UNAME_RELEASE} +	echo sparc-unknown-bsdi"$UNAME_RELEASE"  	exit ;;      *:BSD/OS:*:*) -	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"  	exit ;;      *:FreeBSD:*:*)  	UNAME_PROCESSOR=`/usr/bin/uname -p` -	case ${UNAME_PROCESSOR} in +	case "$UNAME_PROCESSOR" in  	    amd64) -		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; -	    *) -		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; +		UNAME_PROCESSOR=x86_64 ;; +	    i386) +		UNAME_PROCESSOR=i586 ;;  	esac +	echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"  	exit ;;      i*:CYGWIN*:*) -	echo ${UNAME_MACHINE}-pc-cygwin +	echo "$UNAME_MACHINE"-pc-cygwin  	exit ;; -    *:MINGW*:*) -	echo ${UNAME_MACHINE}-pc-mingw32 +    *:MINGW64*:*) +	echo "$UNAME_MACHINE"-pc-mingw64  	exit ;; -    i*:MSYS*:*) -	echo ${UNAME_MACHINE}-pc-msys +    *:MINGW*:*) +	echo "$UNAME_MACHINE"-pc-mingw32  	exit ;; -    i*:windows32*:*) -	# uname -m includes "-pc" on this system. -	echo ${UNAME_MACHINE}-mingw32 +    *:MSYS*:*) +	echo "$UNAME_MACHINE"-pc-msys  	exit ;;      i*:PW*:*) -	echo ${UNAME_MACHINE}-pc-pw32 +	echo "$UNAME_MACHINE"-pc-pw32  	exit ;;      *:Interix*:*) -	case ${UNAME_MACHINE} in +	case "$UNAME_MACHINE" in  	    x86) -		echo i586-pc-interix${UNAME_RELEASE} +		echo i586-pc-interix"$UNAME_RELEASE"  		exit ;;  	    authenticamd | genuineintel | EM64T) -		echo x86_64-unknown-interix${UNAME_RELEASE} +		echo x86_64-unknown-interix"$UNAME_RELEASE"  		exit ;;  	    IA64) -		echo ia64-unknown-interix${UNAME_RELEASE} +		echo ia64-unknown-interix"$UNAME_RELEASE"  		exit ;;  	esac ;; -    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) -	echo i${UNAME_MACHINE}-pc-mks -	exit ;; -    8664:Windows_NT:*) -	echo x86_64-pc-mks -	exit ;; -    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 ;;      i*:UWIN*:*) -	echo ${UNAME_MACHINE}-pc-uwin +	echo "$UNAME_MACHINE"-pc-uwin  	exit ;;      amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)  	echo x86_64-unknown-cygwin  	exit ;; -    p*:CYGWIN*:*) -	echo powerpcle-unknown-cygwin -	exit ;;      prep*:SunOS:5.*:*) -	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +	echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"  	exit ;;      *:GNU:*:*)  	# the GNU system -	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` +	echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`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 +	echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"  	exit ;;      i*86:Minix:*:*) -	echo ${UNAME_MACHINE}-pc-minix +	echo "$UNAME_MACHINE"-pc-minix  	exit ;;      aarch64:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      aarch64_be:Linux:*:*)  	UNAME_MACHINE=aarch64_be -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      alpha:Linux:*:*)  	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,63 +915,64 @@ EOF  	  EV68*) UNAME_MACHINE=alphaev68 ;;  	esac  	objdump --private-headers /bin/sh | grep -q ld.so.1 -	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi -	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} +	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +	exit ;; +    arc:Linux:*:* | arceb:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      arm*:Linux:*:*) -	eval $set_cc_for_build +	eval "$set_cc_for_build"  	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \  	    | grep -q __ARM_EABI__  	then -	    echo ${UNAME_MACHINE}-unknown-linux-gnu +	    echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	else  	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \  		| grep -q __ARM_PCS_VFP  	    then -		echo ${UNAME_MACHINE}-unknown-linux-gnueabi +		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi  	    else -		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf +		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf  	    fi  	fi  	exit ;;      avr32*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      cris:Linux:*:*) -	echo ${UNAME_MACHINE}-axis-linux-gnu +	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"  	exit ;;      crisv32:Linux:*:*) -	echo ${UNAME_MACHINE}-axis-linux-gnu +	echo "$UNAME_MACHINE"-axis-linux-"$LIBC" +	exit ;; +    e2k:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      frv:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      hexagon:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      i*86:Linux:*:*) -	LIBC=gnu -	eval $set_cc_for_build -	sed 's/^	//' << EOF >$dummy.c -	#ifdef __dietlibc__ -	LIBC=dietlibc -	#endif -EOF -	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` -	echo "${UNAME_MACHINE}-pc-linux-${LIBC}" +	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"  	exit ;;      ia64:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +	exit ;; +    k1om:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      m32r*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      m68*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      mips:Linux:*:* | mips64:Linux:*:*) -	eval $set_cc_for_build -	sed 's/^	//' << EOF >$dummy.c +	eval "$set_cc_for_build" +	sed 's/^	//' << EOF > "$dummy.c"  	#undef CPU  	#undef ${UNAME_MACHINE}  	#undef ${UNAME_MACHINE}el @@ -949,55 +986,74 @@ EOF  	#endif  	#endif  EOF -	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` -	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } +	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" +	test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }  	;; -    or32:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +    mips64el:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +	exit ;; +    openrisc*:Linux:*:*) +	echo or1k-unknown-linux-"$LIBC" +	exit ;; +    or32:Linux:*:* | or1k*:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      padre:Linux:*:*) -	echo sparc-unknown-linux-gnu +	echo sparc-unknown-linux-"$LIBC"  	exit ;;      parisc64:Linux:*:* | hppa64:Linux:*:*) -	echo hppa64-unknown-linux-gnu +	echo hppa64-unknown-linux-"$LIBC"  	exit ;;      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-unknown-linux-gnu ;; -	  PA8*) echo hppa2.0-unknown-linux-gnu ;; -	  *)    echo hppa-unknown-linux-gnu ;; +	  PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; +	  PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; +	  *)    echo hppa-unknown-linux-"$LIBC" ;;  	esac  	exit ;;      ppc64:Linux:*:*) -	echo powerpc64-unknown-linux-gnu +	echo powerpc64-unknown-linux-"$LIBC"  	exit ;;      ppc:Linux:*:*) -	echo powerpc-unknown-linux-gnu +	echo powerpc-unknown-linux-"$LIBC" +	exit ;; +    ppc64le:Linux:*:*) +	echo powerpc64le-unknown-linux-"$LIBC" +	exit ;; +    ppcle:Linux:*:*) +	echo powerpcle-unknown-linux-"$LIBC" +	exit ;; +    riscv32:Linux:*:* | riscv64:Linux:*:*) +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      s390:Linux:*:* | s390x:Linux:*:*) -	echo ${UNAME_MACHINE}-ibm-linux +	echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"  	exit ;;      sh64*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      sh*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      sparc:Linux:*:* | sparc64:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      tile*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      vax:Linux:*:*) -	echo ${UNAME_MACHINE}-dec-linux-gnu +	echo "$UNAME_MACHINE"-dec-linux-"$LIBC"  	exit ;;      x86_64:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	if objdump -f /bin/sh | grep -q elf32-x86-64; then +	    echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 +	else +	    echo "$UNAME_MACHINE"-pc-linux-"$LIBC" +	fi  	exit ;;      xtensa*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"  	exit ;;      i*86:DYNIX/ptx:4*:*)  	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1011,34 +1067,34 @@ EOF  	# I am not positive that other SVR4 systems won't match this,  	# I just have to hope.  -- rms.  	# Use sysv4.2uw... so that sysv4* matches it. -	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} +	echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"  	exit ;;      i*86:OS/2:*:*)  	# If we were able to find `uname', then EMX Unix compatibility  	# is probably installed. -	echo ${UNAME_MACHINE}-pc-os2-emx +	echo "$UNAME_MACHINE"-pc-os2-emx  	exit ;;      i*86:XTS-300:*:STOP) -	echo ${UNAME_MACHINE}-unknown-stop +	echo "$UNAME_MACHINE"-unknown-stop  	exit ;;      i*86:atheos:*:*) -	echo ${UNAME_MACHINE}-unknown-atheos +	echo "$UNAME_MACHINE"-unknown-atheos  	exit ;;      i*86:syllable:*:*) -	echo ${UNAME_MACHINE}-pc-syllable +	echo "$UNAME_MACHINE"-pc-syllable  	exit ;;      i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) -	echo i386-unknown-lynxos${UNAME_RELEASE} +	echo i386-unknown-lynxos"$UNAME_RELEASE"  	exit ;;      i*86:*DOS:*:*) -	echo ${UNAME_MACHINE}-pc-msdosdjgpp +	echo "$UNAME_MACHINE"-pc-msdosdjgpp  	exit ;; -    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) -	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` +    i*86:*:4.*:*) +	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`  	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then -		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} +		echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"  	else -		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} +		echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"  	fi  	exit ;;      i*86:*:5:[678]*) @@ -1048,12 +1104,12 @@ EOF  	    *Pentium)	     UNAME_MACHINE=i586 ;;  	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;  	esac -	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} +	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}"  	exit ;;      i*86:*:3.2:*)  	if test -f /usr/options/cb.name; then  		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` -		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL +		echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"  	elif /bin/uname -X 2>/dev/null >/dev/null ; then  		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`  		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1063,9 +1119,9 @@ EOF  			&& UNAME_MACHINE=i686  		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \  			&& UNAME_MACHINE=i686 -		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL +		echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"  	else -		echo ${UNAME_MACHINE}-pc-sysv32 +		echo "$UNAME_MACHINE"-pc-sysv32  	fi  	exit ;;      pc:*:*:*) @@ -1073,7 +1129,7 @@ EOF  	# uname -m prints for DJGPP always 'pc', but it prints nothing about  	# the processor, so we play safe by assuming i586.  	# Note: whatever this is, it MUST be the same as what config.sub -	# prints for the "djgpp" host, or else GDB configury will decide that +	# prints for the "djgpp" host, or else GDB configure will decide that  	# this is a cross-build.  	echo i586-pc-msdosdjgpp  	exit ;; @@ -1085,9 +1141,9 @@ EOF  	exit ;;      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 +	  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 +	  echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4  	fi  	exit ;;      mini*:CTIX:SYS*5:*) @@ -1107,9 +1163,9 @@ EOF  	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; }  	/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; } ;;      3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)  	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \  	  && { echo i486-ncr-sysv4; exit; } ;; @@ -1118,28 +1174,28 @@ EOF  	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; }  	/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; }  	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ -	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; +	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;      m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) -	echo m68k-unknown-lynxos${UNAME_RELEASE} +	echo m68k-unknown-lynxos"$UNAME_RELEASE"  	exit ;;      mc68030:UNIX_System_V:4.*:*)  	echo m68k-atari-sysv4  	exit ;;      TSUNAMI:LynxOS:2.*:*) -	echo sparc-unknown-lynxos${UNAME_RELEASE} +	echo sparc-unknown-lynxos"$UNAME_RELEASE"  	exit ;;      rs6000:LynxOS:2.*:*) -	echo rs6000-unknown-lynxos${UNAME_RELEASE} +	echo rs6000-unknown-lynxos"$UNAME_RELEASE"  	exit ;;      PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) -	echo powerpc-unknown-lynxos${UNAME_RELEASE} +	echo powerpc-unknown-lynxos"$UNAME_RELEASE"  	exit ;;      SM[BE]S:UNIX_SV:*:*) -	echo mips-dde-sysv${UNAME_RELEASE} +	echo mips-dde-sysv"$UNAME_RELEASE"  	exit ;;      RM*:ReliantUNIX-*:*:*)  	echo mips-sni-sysv4 @@ -1150,7 +1206,7 @@ EOF      *:SINIX-*:*:*)  	if uname -p 2>/dev/null >/dev/null ; then  		UNAME_MACHINE=`(uname -p) 2>/dev/null` -		echo ${UNAME_MACHINE}-sni-sysv4 +		echo "$UNAME_MACHINE"-sni-sysv4  	else  		echo ns32k-sni-sysv  	fi @@ -1170,23 +1226,23 @@ EOF  	exit ;;      i*86:VOS:*:*)  	# From Paul.Green@stratus.com. -	echo ${UNAME_MACHINE}-stratus-vos +	echo "$UNAME_MACHINE"-stratus-vos  	exit ;;      *:VOS:*:*)  	# From Paul.Green@stratus.com.  	echo hppa1.1-stratus-vos  	exit ;;      mc68*:A/UX:*:*) -	echo m68k-apple-aux${UNAME_RELEASE} +	echo m68k-apple-aux"$UNAME_RELEASE"  	exit ;;      news*:NEWS-OS:6*:*)  	echo mips-sony-newsos6  	exit ;;      R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)  	if [ -d /usr/nec ]; then -		echo mips-nec-sysv${UNAME_RELEASE} +		echo mips-nec-sysv"$UNAME_RELEASE"  	else -		echo mips-unknown-sysv${UNAME_RELEASE} +		echo mips-unknown-sysv"$UNAME_RELEASE"  	fi  	exit ;;      BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only. @@ -1201,66 +1257,97 @@ EOF      BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.  	echo i586-pc-haiku  	exit ;; +    x86_64:Haiku:*:*) +	echo x86_64-unknown-haiku +	exit ;;      SX-4:SUPER-UX:*:*) -	echo sx4-nec-superux${UNAME_RELEASE} +	echo sx4-nec-superux"$UNAME_RELEASE"  	exit ;;      SX-5:SUPER-UX:*:*) -	echo sx5-nec-superux${UNAME_RELEASE} +	echo sx5-nec-superux"$UNAME_RELEASE"  	exit ;;      SX-6:SUPER-UX:*:*) -	echo sx6-nec-superux${UNAME_RELEASE} +	echo sx6-nec-superux"$UNAME_RELEASE"  	exit ;;      SX-7:SUPER-UX:*:*) -	echo sx7-nec-superux${UNAME_RELEASE} +	echo sx7-nec-superux"$UNAME_RELEASE"  	exit ;;      SX-8:SUPER-UX:*:*) -	echo sx8-nec-superux${UNAME_RELEASE} +	echo sx8-nec-superux"$UNAME_RELEASE"  	exit ;;      SX-8R:SUPER-UX:*:*) -	echo sx8r-nec-superux${UNAME_RELEASE} +	echo sx8r-nec-superux"$UNAME_RELEASE" +	exit ;; +    SX-ACE:SUPER-UX:*:*) +	echo sxace-nec-superux"$UNAME_RELEASE"  	exit ;;      Power*:Rhapsody:*:*) -	echo powerpc-apple-rhapsody${UNAME_RELEASE} +	echo powerpc-apple-rhapsody"$UNAME_RELEASE"  	exit ;;      *:Rhapsody:*:*) -	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"  	exit ;;      *:Darwin:*:*)  	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown -	case $UNAME_PROCESSOR in -	    i386) -		eval $set_cc_for_build -		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then -		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ -		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ -		      grep IS_64BIT_ARCH >/dev/null -		  then -		      UNAME_PROCESSOR="x86_64" -		  fi -		fi ;; -	    unknown) UNAME_PROCESSOR=powerpc ;; -	esac -	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} +	eval "$set_cc_for_build" +	if test "$UNAME_PROCESSOR" = unknown ; then +	    UNAME_PROCESSOR=powerpc +	fi +	if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then +	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then +		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ +		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ +		       grep IS_64BIT_ARCH >/dev/null +		then +		    case $UNAME_PROCESSOR in +			i386) UNAME_PROCESSOR=x86_64 ;; +			powerpc) UNAME_PROCESSOR=powerpc64 ;; +		    esac +		fi +		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc +		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ +		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ +		       grep IS_PPC >/dev/null +		then +		    UNAME_PROCESSOR=powerpc +		fi +	    fi +	elif test "$UNAME_PROCESSOR" = i386 ; then +	    # Avoid executing cc on OS X 10.9, as it ships with a stub +	    # that puts up a graphical alert prompting to install +	    # developer tools.  Any system running Mac OS X 10.7 or +	    # later (Darwin 11 and later) is required to have a 64-bit +	    # processor. This is not true of the ARM version of Darwin +	    # that Apple uses in portable devices. +	    UNAME_PROCESSOR=x86_64 +	fi +	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"  	exit ;;      *:procnto*:*:* | *:QNX:[0123456789]*:*)  	UNAME_PROCESSOR=`uname -p` -	if test "$UNAME_PROCESSOR" = "x86"; then +	if test "$UNAME_PROCESSOR" = x86; then  		UNAME_PROCESSOR=i386  		UNAME_MACHINE=pc  	fi -	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} +	echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"  	exit ;;      *:QNX:*:4*)  	echo i386-pc-qnx  	exit ;; -    NEO-?:NONSTOP_KERNEL:*:*) -	echo neo-tandem-nsk${UNAME_RELEASE} +    NEO-*:NONSTOP_KERNEL:*:*) +	echo neo-tandem-nsk"$UNAME_RELEASE" +	exit ;; +    NSE-*:NONSTOP_KERNEL:*:*) +	echo nse-tandem-nsk"$UNAME_RELEASE"  	exit ;; -    NSE-?:NONSTOP_KERNEL:*:*) -	echo nse-tandem-nsk${UNAME_RELEASE} +    NSR-*:NONSTOP_KERNEL:*:*) +	echo nsr-tandem-nsk"$UNAME_RELEASE"  	exit ;; -    NSR-?:NONSTOP_KERNEL:*:*) -	echo nsr-tandem-nsk${UNAME_RELEASE} +    NSV-*:NONSTOP_KERNEL:*:*) +	echo nsv-tandem-nsk"$UNAME_RELEASE" +	exit ;; +    NSX-*:NONSTOP_KERNEL:*:*) +	echo nsx-tandem-nsk"$UNAME_RELEASE"  	exit ;;      *:NonStop-UX:*:*)  	echo mips-compaq-nonstopux @@ -1269,18 +1356,18 @@ EOF  	echo bs2000-siemens-sysv  	exit ;;      DS/*:UNIX_System_V:*:*) -	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} +	echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"  	exit ;;      *:Plan9:*:*)  	# "uname -m" is not consistent, so use $cputype instead. 386  	# is converted to i386 for consistency with other x86  	# operating systems. -	if test "$cputype" = "386"; then +	if test "$cputype" = 386; then  	    UNAME_MACHINE=i386  	else  	    UNAME_MACHINE="$cputype"  	fi -	echo ${UNAME_MACHINE}-unknown-plan9 +	echo "$UNAME_MACHINE"-unknown-plan9  	exit ;;      *:TOPS-10:*:*)  	echo pdp10-unknown-tops10 @@ -1301,14 +1388,14 @@ EOF  	echo pdp10-unknown-its  	exit ;;      SEI:*:*:SEIUX) -	echo mips-sei-seiux${UNAME_RELEASE} +	echo mips-sei-seiux"$UNAME_RELEASE"  	exit ;;      *:DragonFly:*:*) -	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` +	echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"  	exit ;;      *:*VMS:*:*)  	UNAME_MACHINE=`(uname -p) 2>/dev/null` -	case "${UNAME_MACHINE}" in +	case "$UNAME_MACHINE" in  	    A*) echo alpha-dec-vms ; exit ;;  	    I*) echo ia64-dec-vms ; exit ;;  	    V*) echo vax-dec-vms ; exit ;; @@ -1317,185 +1404,48 @@ EOF  	echo i386-pc-xenix  	exit ;;      i*86:skyos:*:*) -	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' +	echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"  	exit ;;      i*86:rdos:*:*) -	echo ${UNAME_MACHINE}-pc-rdos +	echo "$UNAME_MACHINE"-pc-rdos  	exit ;;      i*86:AROS:*:*) -	echo ${UNAME_MACHINE}-pc-aros +	echo "$UNAME_MACHINE"-pc-aros  	exit ;;      x86_64:VMkernel:*:*) -	echo ${UNAME_MACHINE}-unknown-esx +	echo "$UNAME_MACHINE"-unknown-esx +	exit ;; +    amd64:Isilon\ OneFS:*:*) +	echo x86_64-unknown-onefs  	exit ;;  esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c <<EOF -#ifdef _SEQUENT_ -# include <sys/types.h> -# include <sys/utsname.h> -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) -  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed, -     I don't know....  */ -  printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> -  printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 -	"4" -#else -	"" -#endif -	); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) -  printf ("arm-acorn-riscix\n"); exit (0); -#endif +echo "$0: unable to guess system type" >&2 -#if defined (hp300) && !defined (hpux) -  printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif -  int version; -  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; -  if (version < 4) -    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); -  else -    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); -  exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) -  printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) -  printf ("ns32k-encore-mach\n"); exit (0); -#else -  printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) -  printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) -  printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) -  printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif +case "$UNAME_MACHINE:$UNAME_SYSTEM" in +    mips:Linux | mips64:Linux) +	# If we got here on MIPS GNU/Linux, output extra information. +	cat >&2 <<EOF -#if defined (_SEQUENT_) -    struct utsname un; - -    uname(&un); - -    if (strncmp(un.version, "V2", 2) == 0) { -	printf ("i386-sequent-ptx2\n"); exit (0); -    } -    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ -	printf ("i386-sequent-ptx1\n"); exit (0); -    } -    printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -#  include <sys/param.h> -#  if defined (BSD) -#   if BSD == 43 -      printf ("vax-dec-bsd4.3\n"); exit (0); -#   else -#    if BSD == 199006 -      printf ("vax-dec-bsd4.3reno\n"); exit (0); -#    else -      printf ("vax-dec-bsd\n"); exit (0); -#    endif -#   endif -#  else -    printf ("vax-dec-bsd\n"); exit (0); -#  endif -# else -    printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) -  printf ("i860-alliant-bsd\n"); exit (0); -#endif - -  exit (1); -} +NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize +the system type. Please install a C compiler and try again.  EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && -	{ echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then -    case `getsysinfo -f cpu_type` in -    c1*) -	echo c1-convex-bsd -	exit ;; -    c2*) -	if getsysinfo -f scalar_acc -	then echo c32-convex-bsd -	else echo c2-convex-bsd -	fi -	exit ;; -    c34*) -	echo c34-convex-bsd -	exit ;; -    c38*) -	echo c38-convex-bsd -	exit ;; -    c4*) -	echo c4-convex-bsd -	exit ;; -    esac -fi +	;; +esac  cat >&2 <<EOF -$0: unable to guess system type -This script, last modified $timestamp, has failed to recognize -the operating system you are using. It is advised that you -download the most up to date version of the config scripts from +This script (version $timestamp), has failed to recognize the +operating system you are using. If your script is old, overwrite *all* +copies of config.guess and config.sub with the latest versions from: -  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess  and -  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub -If the version you run ($0) is already up to date, please -send the following data and any information you think might be -pertinent to <config-patches@gnu.org> in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system.  config.guess timestamp = $timestamp @@ -1514,16 +1464,16 @@ hostinfo               = `(hostinfo) 2>/dev/null`  /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`  /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM  = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM  = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION"  EOF  exit 1  # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp)  # time-stamp-start: "timestamp='"  # time-stamp-format: "%:y-%02m-%02d"  # time-stamp-end: "'" diff --git a/config/config.sub b/config/config.sub index 6205f84..1d8e98b 100755 --- a/config/config.sub +++ b/config/config.sub @@ -1,36 +1,31 @@  #! /bin/sh  # Configuration validation subroutine script. -#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -#   2011, 2012 Free Software Foundation, Inc. +#   Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-04-18' +timestamp='2018-02-22' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine.  It does not imply ALL GNU software can. -# -# 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 -# the Free Software Foundation; either version 2 of the License, or +# 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 +# the Free Software Foundation; either version 3 of the License, or  # (at your option) any later version.  # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU General Public License for more details. +# 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, see <http://www.gnu.org/licenses/>. +# along with this program; if not, see <https://www.gnu.org/licenses/>.  #  # 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. +# the same distribution terms that you use for the rest of that +# program.  This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to <config-patches@gnu.org>.  Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to <config-patches@gnu.org>.  #  # Configuration subroutine to validate and canonicalize a configuration type.  # Supply the specified configuration type as an argument. @@ -38,7 +33,7 @@ timestamp='2012-04-18'  # Otherwise, we print the canonical config type on stdout and succeed.  # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub  # This file is supposed to be the same for all GNU packages  # and recognize all the CPU types, system types and aliases @@ -58,12 +53,11 @@ timestamp='2012-04-18'  me=`echo "$0" | sed -e 's,.*/,,'`  usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS -       $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS  Canonicalize a configuration name. -Operation modes: +Options:    -h, --help         print this help, then exit    -t, --time-stamp   print date of last modification, then exit    -v, --version      print version number, then exit @@ -73,9 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."  version="\  GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -102,7 +94,7 @@ while test $# -gt 0 ; do      *local*)         # First pass through any local machine types. -       echo $1 +       echo "$1"         exit ;;      * ) @@ -120,24 +112,24 @@ esac  # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).  # Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`  case $maybe_os in    nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ -  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ -  knetbsd*-gnu* | netbsd*-gnu* | \ -  kopensolaris*-gnu* | \ +  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ +  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ +  kopensolaris*-gnu* | cloudabi*-eabi* | \    storm-chaos* | os2-emx* | rtmk-nova*)      os=-$maybe_os -    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`      ;;    android-linux)      os=-linux-android -    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown +    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown      ;;    *) -    basic_machine=`echo $1 | sed 's/-[^-]*$//'` -    if [ $basic_machine != $1 ] -    then os=`echo $1 | sed 's/.*-/-/'` +    basic_machine=`echo "$1" | sed 's/-[^-]*$//'` +    if [ "$basic_machine" != "$1" ] +    then os=`echo "$1" | sed 's/.*-/-/'`      else os=; fi      ;;  esac @@ -156,7 +148,7 @@ case $os in  	-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 | -microblaze) +	-apple | -axis | -knuth | -cray | -microblaze*)  		os=  		basic_machine=$1  		;; @@ -186,44 +178,44 @@ case $os in  		;;  	-sco6)  		os=-sco5v6 -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco5)  		os=-sco3.2v5 -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco4)  		os=-sco3.2v4 -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco3.2.[4-9]*)  		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco3.2v[4-9]*)  		# Don't forget version if it is 3.2v4 or newer. -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco5v6*)  		# Don't forget version if it is 3.2v4 or newer. -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-sco*)  		os=-sco3.2v2 -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-udk*) -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-isc)  		os=-isc2.2 -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-clix*)  		basic_machine=clipper-intergraph  		;;  	-isc*) -		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`  		;;  	-lynx*178)  		os=-lynxos178 @@ -235,10 +227,7 @@ case $os in  		os=-lynxos  		;;  	-ptx*) -		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` -		;; -	-windowsnt*) -		os=`echo $os | sed -e 's/windowsnt/winnt/'` +		basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`  		;;  	-psos*)  		os=-psos @@ -259,21 +248,25 @@ case $basic_machine in  	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \  	| 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 | avr32 \ -        | be32 | be64 \ +	| arc | arceb \ +	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ +	| avr | avr32 \ +	| ba \ +	| be32 | be64 \  	| bfin \ -	| c4x | clipper \ +	| c4x | c8051 | clipper \  	| d10v | d30v | dlx | dsp16xx \ -	| epiphany \ -	| fido | fr30 | frv \ +	| e2k | epiphany \ +	| fido | fr30 | frv | ft32 \  	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \  	| hexagon \ -	| i370 | i860 | i960 | ia64 \ +	| i370 | i860 | i960 | ia16 | ia64 \  	| ip2k | iq2000 \ +	| k1om \  	| le32 | le64 \  	| lm32 \  	| m32c | m32r | m32rle | m68000 | m68k | m88k \ -	| maxq | mb | microblaze | mcore | mep | metag \ +	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \  	| mips | mipsbe | mipseb | mipsel | mipsle \  	| mips16 \  	| mips64 | mips64el \ @@ -287,26 +280,30 @@ case $basic_machine in  	| mips64vr5900 | mips64vr5900el \  	| mipsisa32 | mipsisa32el \  	| mipsisa32r2 | mipsisa32r2el \ +	| mipsisa32r6 | mipsisa32r6el \  	| mipsisa64 | mipsisa64el \  	| mipsisa64r2 | mipsisa64r2el \ +	| mipsisa64r6 | mipsisa64r6el \  	| mipsisa64sb1 | mipsisa64sb1el \  	| mipsisa64sr71k | mipsisa64sr71kel \ +	| mipsr5900 | mipsr5900el \  	| mipstx39 | mipstx39el \  	| mn10200 | mn10300 \  	| moxie \  	| mt \  	| msp430 \  	| nds32 | nds32le | nds32be \ -	| nios | nios2 \ +	| nios | nios2 | nios2eb | nios2el \  	| ns16k | ns32k \ -	| open8 \ -	| or32 \ -	| pdp10 | pdp11 | pj | pjl \ +	| open8 | or1k | or1knd | or32 \ +	| pdp10 | pj | pjl \  	| powerpc | powerpc64 | powerpc64le | powerpcle \ +	| pru \  	| pyramid \ +	| riscv32 | riscv64 \  	| rl78 | rx \  	| score \ -	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ +	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \  	| sh64 | sh64le \  	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \  	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -314,7 +311,8 @@ case $basic_machine in  	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \  	| ubicom32 \  	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ -	| we32k \ +	| visium \ +	| wasm32 \  	| x86 | xc16x | xstormy16 | xtensa \  	| z8k | z80)  		basic_machine=$basic_machine-unknown @@ -328,11 +326,14 @@ case $basic_machine in  	c6x)  		basic_machine=tic6x-unknown  		;; -	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) +	leon|leon[3-9]) +		basic_machine=sparc-$basic_machine +		;; +	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)  		basic_machine=$basic_machine-unknown  		os=-none  		;; -	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) +	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)  		;;  	ms1)  		basic_machine=mt-unknown @@ -361,7 +362,7 @@ case $basic_machine in  	  ;;  	# Object if more than one company name word.  	*-*-*) -		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 +		echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2  		exit 1  		;;  	# Recognize the basic CPU types with company name. @@ -370,26 +371,29 @@ case $basic_machine in  	| aarch64-* | aarch64_be-* \  	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \  	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ -	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ +	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \  	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \  	| avr-* | avr32-* \ +	| ba-* \  	| be32-* | be64-* \  	| bfin-* | bs2000-* \  	| c[123]* | c30-* | [cjt]90-* | c4x-* \ -	| clipper-* | craynv-* | cydra-* \ +	| c8051-* | clipper-* | craynv-* | cydra-* \  	| d10v-* | d30v-* | dlx-* \ -	| elxsi-* \ +	| e2k-* | elxsi-* \  	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \  	| h8300-* | h8500-* \  	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \  	| hexagon-* \ -	| i*86-* | i860-* | i960-* | ia64-* \ +	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \  	| ip2k-* | iq2000-* \ +	| k1om-* \  	| le32-* | le64-* \  	| lm32-* \  	| m32c-* | m32r-* | m32rle-* \  	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ -	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ +	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ +	| microblaze-* | microblazeel-* \  	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \  	| mips16-* \  	| mips64-* | mips64el-* \ @@ -403,28 +407,34 @@ case $basic_machine in  	| mips64vr5900-* | mips64vr5900el-* \  	| mipsisa32-* | mipsisa32el-* \  	| mipsisa32r2-* | mipsisa32r2el-* \ +	| mipsisa32r6-* | mipsisa32r6el-* \  	| mipsisa64-* | mipsisa64el-* \  	| mipsisa64r2-* | mipsisa64r2el-* \ +	| mipsisa64r6-* | mipsisa64r6el-* \  	| mipsisa64sb1-* | mipsisa64sb1el-* \  	| mipsisa64sr71k-* | mipsisa64sr71kel-* \ +	| mipsr5900-* | mipsr5900el-* \  	| mipstx39-* | mipstx39el-* \  	| mmix-* \  	| mt-* \  	| msp430-* \  	| nds32-* | nds32le-* | nds32be-* \ -	| nios-* | nios2-* \ +	| nios-* | nios2-* | nios2eb-* | nios2el-* \  	| none-* | np1-* | ns16k-* | ns32k-* \  	| open8-* \ +	| or1k*-* \  	| orion-* \  	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \  	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ +	| pru-* \  	| pyramid-* \ +	| riscv32-* | riscv64-* \  	| rl78-* | romp-* | rs6000-* | rx-* \  	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \  	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \  	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \  	| sparclite-* \ -	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ +	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \  	| tahoe-* \  	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \  	| tile*-* \ @@ -432,6 +442,8 @@ case $basic_machine in  	| ubicom32-* \  	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \  	| vax-* \ +	| visium-* \ +	| wasm32-* \  	| we32k-* \  	| x86-* | x86_64-* | xc16x-* | xps100-* \  	| xstormy16-* | xtensa*-* \ @@ -445,7 +457,7 @@ case $basic_machine in  	# Recognize the various machine names and aliases which stand  	# for a CPU type and a company and sometimes even an OS.  	386bsd) -		basic_machine=i386-unknown +		basic_machine=i386-pc  		os=-bsd  		;;  	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) @@ -479,7 +491,7 @@ case $basic_machine in  		basic_machine=x86_64-pc  		;;  	amd64-*) -		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	amdahl)  		basic_machine=580-amdahl @@ -508,6 +520,9 @@ case $basic_machine in  		basic_machine=i386-pc  		os=-aros  		;; +	asmjs) +		basic_machine=asmjs-unknown +		;;  	aux)  		basic_machine=m68k-apple  		os=-aux @@ -521,7 +536,7 @@ case $basic_machine in  		os=-linux  		;;  	blackfin-*) -		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		os=-linux  		;;  	bluegene*) @@ -529,13 +544,13 @@ case $basic_machine in  		os=-cnk  		;;  	c54x-*) -		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	c55x-*) -		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	c6x-*) -		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	c90)  		basic_machine=c90-cray @@ -624,10 +639,18 @@ case $basic_machine in  		basic_machine=rs6000-bull  		os=-bosx  		;; -	dpx2* | dpx2*-bull) +	dpx2*)  		basic_machine=m68k-bull  		os=-sysv3  		;; +	e500v[12]) +		basic_machine=powerpc-unknown +		os=$os"spe" +		;; +	e500v[12]-*) +		basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` +		os=$os"spe" +		;;  	ebmon29k)  		basic_machine=a29k-amd  		os=-ebmon @@ -717,9 +740,6 @@ case $basic_machine in  	hp9k8[0-9][0-9] | hp8[0-9][0-9])  		basic_machine=hppa1.0-hp  		;; -	hppa-next) -		os=-nextstep3 -		;;  	hppaosf)  		basic_machine=hppa1.1-hp  		os=-osf @@ -732,26 +752,26 @@ case $basic_machine in  		basic_machine=i370-ibm  		;;  	i*86v32) -		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`  		os=-sysv32  		;;  	i*86v4*) -		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`  		os=-sysv4  		;;  	i*86v) -		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`  		os=-sysv  		;;  	i*86sol2) -		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` +		basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`  		os=-solaris2  		;;  	i386mach)  		basic_machine=i386-mach  		os=-mach  		;; -	i386-vsta | vsta) +	vsta)  		basic_machine=i386-unknown  		os=-vsta  		;; @@ -769,17 +789,17 @@ case $basic_machine in  		basic_machine=m68k-isi  		os=-sysv  		;; +	leon-*|leon[3-9]-*) +		basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` +		;;  	m68knommu)  		basic_machine=m68k-unknown  		os=-linux  		;;  	m68knommu-*) -		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		os=-linux  		;; -	m88k-omron*) -		basic_machine=m88k-omron -		;;  	magnum | m3230)  		basic_machine=mips-mips  		os=-sysv @@ -788,11 +808,15 @@ case $basic_machine in  		basic_machine=ns32k-utek  		os=-sysv  		;; -	microblaze) +	microblaze*)  		basic_machine=microblaze-xilinx  		;; +	mingw64) +		basic_machine=x86_64-pc +		os=-mingw64 +		;;  	mingw32) -		basic_machine=i386-pc +		basic_machine=i686-pc  		os=-mingw32  		;;  	mingw32ce) @@ -807,10 +831,10 @@ case $basic_machine in  		os=-mint  		;;  	mips3*-*) -		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` +		basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`  		;;  	mips3*) -		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown +		basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown  		;;  	monitor)  		basic_machine=m68k-rom68k @@ -820,15 +844,19 @@ case $basic_machine in  		basic_machine=powerpc-unknown  		os=-morphos  		;; +	moxiebox) +		basic_machine=moxie-unknown +		os=-moxiebox +		;;  	msdos)  		basic_machine=i386-pc  		os=-msdos  		;;  	ms1-*) -		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` +		basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`  		;;  	msys) -		basic_machine=i386-pc +		basic_machine=i686-pc  		os=-msys  		;;  	mvs) @@ -867,7 +895,7 @@ case $basic_machine in  		basic_machine=v70-nec  		os=-sysv  		;; -	next | m*-next ) +	next | m*-next)  		basic_machine=m68k-next  		case $os in  		    -nextstep* ) @@ -912,6 +940,12 @@ case $basic_machine in  	nsr-tandem)  		basic_machine=nsr-tandem  		;; +	nsv-tandem) +		basic_machine=nsv-tandem +		;; +	nsx-tandem) +		basic_machine=nsx-tandem +		;;  	op50n-* | op60c-*)  		basic_machine=hppa1.1-oki  		os=-proelf @@ -944,7 +978,7 @@ case $basic_machine in  		os=-linux  		;;  	parisc-*) -		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		os=-linux  		;;  	pbd) @@ -960,7 +994,7 @@ case $basic_machine in  		basic_machine=i386-pc  		;;  	pc98-*) -		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	pentium | p5 | k5 | k6 | nexgen | viac3)  		basic_machine=i586-pc @@ -975,16 +1009,16 @@ case $basic_machine in  		basic_machine=i786-pc  		;;  	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) -		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	pentiumpro-* | p6-* | 6x86-* | athlon-*) -		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) -		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	pentium4-*) -		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	pn)  		basic_machine=pn-gould @@ -994,23 +1028,23 @@ case $basic_machine in  	ppc | ppcbe)	basic_machine=powerpc-unknown  		;;  	ppc-* | ppcbe-*) -		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;; -	ppcle | powerpclittle | ppc-le | powerpc-little) +	ppcle | powerpclittle)  		basic_machine=powerpcle-unknown  		;;  	ppcle-* | powerpclittle-*) -		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	ppc64)	basic_machine=powerpc64-unknown  		;; -	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` +	ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;; -	ppc64le | powerpc64little | ppc64-le | powerpc64-little) +	ppc64le | powerpc64little)  		basic_machine=powerpc64le-unknown  		;;  	ppc64le-* | powerpc64little-*) -		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	ps2)  		basic_machine=i386-ibm @@ -1019,7 +1053,11 @@ case $basic_machine in  		basic_machine=i586-unknown  		os=-pw32  		;; -	rdos) +	rdos | rdos64) +		basic_machine=x86_64-pc +		os=-rdos +		;; +	rdos32)  		basic_machine=i386-pc  		os=-rdos  		;; @@ -1060,17 +1098,10 @@ case $basic_machine in  	sequent)  		basic_machine=i386-sequent  		;; -	sh) -		basic_machine=sh-hitachi -		os=-hms -		;;  	sh5el)  		basic_machine=sh5le-unknown  		;; -	sh64) -		basic_machine=sh64-unknown -		;; -	sparclite-wrs | simso-wrs) +	simso-wrs)  		basic_machine=sparclite-wrs  		os=-vxworks  		;; @@ -1089,7 +1120,7 @@ case $basic_machine in  		os=-sysv4  		;;  	strongarm-* | thumb-*) -		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` +		basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`  		;;  	sun2)  		basic_machine=m68000-sun @@ -1211,6 +1242,9 @@ case $basic_machine in  		basic_machine=hppa1.1-winbond  		os=-proelf  		;; +	x64) +		basic_machine=x86_64-pc +		;;  	xbox)  		basic_machine=i686-pc  		os=-mingw32 @@ -1219,20 +1253,12 @@ case $basic_machine in  		basic_machine=xps100-honeywell  		;;  	xscale-* | xscalee[bl]-*) -		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` +		basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`  		;;  	ymp)  		basic_machine=ymp-cray  		os=-unicos  		;; -	z8k-*-coff) -		basic_machine=z8k-unknown -		os=-sim -		;; -	z80-*-coff) -		basic_machine=z80-unknown -		os=-sim -		;;  	none)  		basic_machine=none-none  		os=-none @@ -1261,10 +1287,6 @@ case $basic_machine in  	vax)  		basic_machine=vax-dec  		;; -	pdp10) -		# there are many clones, so DEC is not a safe bet -		basic_machine=pdp10-unknown -		;;  	pdp11)  		basic_machine=pdp11-dec  		;; @@ -1274,9 +1296,6 @@ case $basic_machine in  	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)  		basic_machine=sh-unknown  		;; -	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) -		basic_machine=sparc-sun -		;;  	cydra)  		basic_machine=cydra-cydrome  		;; @@ -1296,7 +1315,7 @@ case $basic_machine in  		# Make sure to match an already-canonicalized machine name.  		;;  	*) -		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 +		echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2  		exit 1  		;;  esac @@ -1304,10 +1323,10 @@ esac  # Here we canonicalize certain aliases for manufacturers.  case $basic_machine in  	*-digital*) -		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +		basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`  		;;  	*-commodore*) -		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` +		basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`  		;;  	*)  		;; @@ -1318,8 +1337,8 @@ esac  if [ x"$os" != x"" ]  then  case $os in -	# First match some system type aliases -	# that might get confused with valid system types. +	# First match some system type aliases that might get confused +	# with valid system types.  	# -solaris* is a basic system type, with this one exception.  	-auroraux)  		os=-auroraux @@ -1330,45 +1349,48 @@ case $os in  	-solaris)  		os=-solaris2  		;; -	-svr4*) -		os=-sysv4 -		;;  	-unixware*)  		os=-sysv4.2uw  		;;  	-gnu/linux*)  		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`  		;; -	# First accept the basic system types. +	# es1800 is here to avoid being matched by es* (a different OS) +	-es1800*) +		os=-ose +		;; +	# Now accept the basic system types.  	# The portable systems comes first. -	# Each alternative MUST END IN A *, to match a version number. +	# Each alternative MUST end in a * to match a version number.  	# -sysv* is not here because it comes later, after sysvr4.  	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \  	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\  	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ -	      | -sym* | -kopensolaris* \ +	      | -sym* | -kopensolaris* | -plan9* \  	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ -	      | -aos* | -aros* \ +	      | -aos* | -aros* | -cloudabi* | -sortix* \  	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \  	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ -	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ -	      | -openbsd* | -solidbsd* \ +	      | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ +	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \  	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \  	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \  	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \  	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ -	      | -chorusos* | -chorusrdb* | -cegcc* \ +	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \  	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ -	      | -mingw32* | -linux-gnu* | -linux-android* \ -	      | -linux-newlib* | -linux-uclibc* \ -	      | -uxpv* | -beos* | -mpeix* | -udk* \ -	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ +	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ +	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \ +	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ +	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \  	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \  	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \  	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ -	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ +	      | -morphos* | -superux* | -rtmk* | -windiss* \  	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ -	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) +	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ +	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ +	      | -midnightbsd*)  	# Remember, each alternative MUST END IN *, to match a version number.  		;;  	-qnx*) @@ -1385,12 +1407,12 @@ case $os in  	-nto*)  		os=`echo $os | sed -e 's|nto|nto-qnx|'`  		;; -	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ -	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ +	-sim | -xray | -os68k* | -v88r* \ +	      | -windows* | -osx | -abug | -netware* | -os9* \  	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)  		;;  	-mac*) -		os=`echo $os | sed -e 's|mac|macos|'` +		os=`echo "$os" | sed -e 's|mac|macos|'`  		;;  	-linux-dietlibc)  		os=-linux-dietlibc @@ -1399,10 +1421,10 @@ case $os in  		os=`echo $os | sed -e 's|linux|linux-gnu|'`  		;;  	-sunos5*) -		os=`echo $os | sed -e 's|sunos5|solaris2|'` +		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`  		;;  	-sunos6*) -		os=`echo $os | sed -e 's|sunos6|solaris3|'` +		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`  		;;  	-opened*)  		os=-openedition @@ -1413,12 +1435,6 @@ case $os in  	-wince*)  		os=-wince  		;; -	-osfrose*) -		os=-osfrose -		;; -	-osf*) -		os=-osf -		;;  	-utek*)  		os=-bsd  		;; @@ -1443,7 +1459,7 @@ case $os in  	-nova*)  		os=-rtmk-nova  		;; -	-ns2 ) +	-ns2)  		os=-nextstep2  		;;  	-nsk*) @@ -1465,7 +1481,7 @@ case $os in  	-oss*)  		os=-sysv3  		;; -	-svr4) +	-svr4*)  		os=-sysv4  		;;  	-svr3) @@ -1480,35 +1496,38 @@ case $os in  	-ose*)  		os=-ose  		;; -	-es1800*) -		os=-ose -		;; -	-xenix) -		os=-xenix -		;;  	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)  		os=-mint  		;; -	-aros*) -		os=-aros -		;; -	-kaos*) -		os=-kaos -		;;  	-zvmoe)  		os=-zvmoe  		;;  	-dicos*)  		os=-dicos  		;; +	-pikeos*) +		# Until real need of OS specific support for +		# particular features comes up, bare metal +		# configurations are quite functional. +		case $basic_machine in +		    arm*) +			os=-eabi +			;; +		    *) +			os=-elf +			;; +		esac +		;;  	-nacl*)  		;; +	-ios) +		;;  	-none)  		;;  	*)  		# Get rid of the `-' at the beginning of $os.  		os=`echo $os | sed 's/[^-]*-//'` -		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 +		echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2  		exit 1  		;;  esac @@ -1543,6 +1562,9 @@ case $basic_machine in  	c4x-* | tic4x-*)  		os=-coff  		;; +	c8051-*) +		os=-elf +		;;  	hexagon-*)  		os=-elf  		;; @@ -1595,12 +1617,12 @@ case $basic_machine in  	sparc-* | *-sun)  		os=-sunos4.1.1  		;; +	pru-*) +		os=-elf +		;;  	*-be)  		os=-beos  		;; -	*-haiku) -		os=-haiku -		;;  	*-ibm)  		os=-aix  		;; @@ -1640,7 +1662,7 @@ case $basic_machine in  	m88k-omron*)  		os=-luna  		;; -	*-next ) +	*-next)  		os=-nextstep  		;;  	*-sequent) @@ -1655,9 +1677,6 @@ case $basic_machine in  	i370-*)  		os=-mvs  		;; -	*-next) -		os=-nextstep3 -		;;  	*-gould)  		os=-sysv  		;; @@ -1767,15 +1786,15 @@ case $basic_machine in  				vendor=stratus  				;;  		esac -		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` +		basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`  		;;  esac -echo $basic_machine$os +echo "$basic_machine$os"  exit  # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp)  # time-stamp-start: "timestamp='"  # time-stamp-format: "%:y-%02m-%02d"  # time-stamp-end: "'" diff --git a/debian/changelog b/debian/changelog index b24ac24..61aee24 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,16 +1,71 @@ -libnss-tacplus (1.0.3-2) unstable; urgency=low +libnss-tacplus (1.0.4-cl5.1.0u11) RELEASED; urgency=medium + +  * new build for 5.1.0 from original hash +    cf2f734609a59da41248ed45e95807998a4a75f3 + + -- root <root@3da22e72fb7c>  Fri, 11 Feb 2022 20:25:59 +0000 + +libnss-tacplus (1.0.4-cl4u1) RELEASED; urgency=medium + +   * First 4.0 release +   * Implemented the nss group entry points, so sudoers plugin no longer +     needed + + -- dev-support <dev-support@cumulusnetworks.com>  Tue, 22 Oct 2019 08:18:08 -0700 + +libnss-tacplus (1.0.4-cl3u3) RELEASED; urgency=low +  * Fixed problem with fallback to local authorization when +    all TACACS servers are down + + -- dev-support <dev-support@cumulusnetworks.com>  Tue, 21 Aug 2018 16:14:31 -0700 + +libnss-tacplus (1.0.4-cl3u2) RELEASED; urgency=low +  * Optimized attempts to connect to server that has previously not responded +  * Added tacplus_nss.conf man page + + -- dev-support <dev-support@cumulusnetworks.com>  Fri, 29 Jun 2018 13:43:12 -0700 + +libnss-tacplus (1.0.4-cl3u1) RELEASED; urgency=low +  * New: Enabled - added the ability to set the source IP address via +    the source_ip config variable. + + -- dev-support <dev-support@cumulusnetworks.com>  Tue, 03 Jul 2018 17:10:17 -0700 + +libnss-tacplus (1.0.3-cl3u4) RELEASED; urgency=low +  * Added man, snmp, daemon, nobody, cron, radius users and frr to +    exclude_users to prevent tacacs lookup on these system accounts. + + -- dev-support <dev-support@cumulusnetworks.com>  Wed, 14 Feb 2018 14:14:00 -0800 + +libnss-tacplus (1.0.3-cl3u3) RELEASED; urgency=low +  * do not log message about acct_all unknown config variable + + -- dev-support <dev-support@cumulusnetworks.com>  Thu, 28 Sep 2017 14:47:10 -0700 + +libnss-tacplus (1.0.3-cl3u2) RELEASED; urgency=low    * Fixed package remove to clean up plugin entries in nsswitch.conf + + -- dev-support <dev-support@cumulusnetworks.com>  Fri, 30 Jun 2017 13:34:20 -0700 + +libnss-tacplus (1.0.3-cl3u1) RELEASED; urgency=low    * New Disabled: added user_homedir config variable to allow per-user      home directories (unless per-command authorization is enabled) -  * Fixed configuration files should automatically be reparsed +  * Closes: CM-16082: configuration files should automatically be reparsed      if they change, for long-lived programs and daemons that use NSS. - -- Dave Olson <olson@cumulusnetworks.com>  Fri, 30 Jun 2017 13:34:20 -0700 + -- dev-support <dev-support@cumulusnetworks.com>  Fri, 12 May 2017 14:51:23 -0700 + +libnss-tacplus (1.0.2-cl3u1) RELEASED; urgency=low +  * New Enabled: added vrf config variable, so NSS lookups work  +    for normal ssh use (rather than ssh@mgmt) +  * Closes: CM-15481: During login, send remote add IP address in AUTH request + + -- dev-support <dev-support@cumulusnetworks.com>  Tue, 07 Mar 2017 14:54:34 -0800 -libnss-tacplus (1.0.3-1) unstable; urgency=low -  * Added config variable "timeout" to limit time attempting to +libnss-tacplus (1.0.1-cl3u3) RELEASED; urgency=low +  * New Enabled: added config variable "timeout" to limit time attempting to      connect to non-responding TACACS server. -  * Added config variable "exclude_users" in /etc/tacplus_nss +  * New Enabled: added config variable "exclude_users" in /etc/tacplus_nss      to avoid looking up "local" user accounts via TACACS servers.  This      improves overall system performance for local users, and avoids significant      delays when a TACACS server is unreachable. @@ -18,16 +73,10 @@ libnss-tacplus (1.0.3-1) unstable; urgency=low      libraries can connect to a TACACS+ server without being tacacs aware.    * Improved debugging messages.    * Minor corrections to Copyright and licensing -  * Added vrf config variable, so NSS lookups work correctly$ -  * During login, send remote add IP address in AUTH request -  * Configuration files should automatically be reparsed -    if they change, for long-lived programs and daemons that use NSS. -  * Added user_homedir config variable to allow per-user -    home directories (unless per-command authorization is enabled) - -- Dave Olson <olson@cumulusnetworks.com>  Thu, 23 Mar 2017 22:40:01 -0800 + -- dev-support <dev-support@cumulusnetworks.com>  Tue, 29 Nov 2016 16:55:16 -0800 -libnss-tacplus (1.0.2-1) unstable; urgency=low +libnss-tacplus (1.0.1-cl3eau2) RELEASED; urgency=low    * Improve debugging on server connections, and always try all      servers in list until successful response, in case different @@ -36,13 +85,13 @@ libnss-tacplus (1.0.2-1) unstable; urgency=low    * Add min_uid and exclude_users config variables to avoid TACACS+      lookups of local users, for robustness and performance. - -- Dave Olson <olson@cumulusnetworks.com>  Thu, 06 Oct 2016 14:13:43 -0700 + -- dev-support <dev-support@cumulusnetworks.com>  Fri, 30 Sep 2016 13:56:05 -0700 -libnss-tacplus (1.0.1-1) unstable; urgency=low +libnss-tacplus (1.0.1-cl3eau1) RELEASED; urgency=low    * Initial version with NSS lookups for tacacs users using mapping      Works with modified libpam-tacplus to authenticate TACACS+ users      without local passwd entries, mapping them to tacacs0..15 based on      TACACS privilege level. - -- Dave Olson <olson@cumulusnetworks.com>  Thu, 23 Jun 2016 13:31:01 -0700 + -- dev-support <dev-support@cumulusnetworks.com>  Thu, 23 Jun 2016 13:31:01 -0700 diff --git a/debian/control b/debian/control index ea65d0b..2926895 100644 --- a/debian/control +++ b/debian/control @@ -1,12 +1,15 @@  Source: libnss-tacplus  Priority: optional -Maintainer: Dave Olson <olson@cumulusnetworks.com> +Maintainer: dev-support <dev-support@cumulusnetworks.com>  Build-Depends: debhelper (>= 9), autotools-dev, libtac-dev (>= 1.4.1~),      libtacplus-map-dev, libaudit-dev, autoconf, libpam-tacplus-dev,      dpkg-dev (>= 1.16.1), git  Section: libs -Standards-Version: 3.9.6 +Standards-Version: 3.9.8  Homepage: http://www.cumulusnetworks.com +XS-Build-Source: True +XS-Cumulus-Valid-Arch: amd64 armel +XBCS-Vcs-Hash: cf2f734609a59da41248ed45e95807998a4a75f3  Package: libnss-tacplus  Architecture: any @@ -15,3 +18,5 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, libtac2 (>= 1.4.1~),  Description: NSS module for TACACS+ authentication without local passwd entry  	Performs getpwname and getpwuid lookups via NSS for users logged in via  	tacacs authentication, and mapping done with libtacplus_map +XBCS-Vcs-Hash: cf2f734609a59da41248ed45e95807998a4a75f3 + diff --git a/debian/copyright b/debian/copyright index 710851e..f91dfc6 100644 --- a/debian/copyright +++ b/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: libnss-tacplus  Source: http://www.cumulusnetworks.com  Files: * -Copyright: 2015, 2016, 2017 Cumulus Networks, Inc.  All rights reserved., +Copyright: 2015, 2016, 2017, 2018 Cumulus Networks, Inc.  All rights reserved.,             2010 Pawel Krawczyk <pawel.krawczyk@hush.com> and                  Jeroen Nijhof <jeroen@jeroennijhof.nl>  License: GPL-2+ diff --git a/debian/libnss-tacplus.manpages b/debian/libnss-tacplus.manpages new file mode 100644 index 0000000..a3f80cf --- /dev/null +++ b/debian/libnss-tacplus.manpages @@ -0,0 +1 @@ +tacplus_nss.conf.5 diff --git a/debian/libnss-tacplus.postinst b/debian/libnss-tacplus.postinst index 77f16f4..06253d7 100644 --- a/debian/libnss-tacplus.postinst +++ b/debian/libnss-tacplus.postinst @@ -11,8 +11,10 @@ case "$1" in          # for this package, and won't break anything else.  Do nothing          # if tacplus is already present in the passwd line          if [ -e "/etc/nsswitch.conf" ]; then -            sed -i -e '/tacplus\s/b' \ -                -e '/^passwd:/s/compat/tacplus &/' /etc/nsswitch.conf +            sed -i -E -e '/tacplus\s/b' \ +                -e '/^passwd:/s/(compat|files)/tacplus &/' /etc/nsswitch.conf +            sed -i -E -e '/tacplus\s/b' \ +                -e '/^group:/s/(compat|files)/tacplus &/' /etc/nsswitch.conf          fi      ;; diff --git a/debian/libnss-tacplus.prerm b/debian/libnss-tacplus.prerm index c47a314..c6f246c 100644 --- a/debian/libnss-tacplus.prerm +++ b/debian/libnss-tacplus.prerm @@ -7,6 +7,8 @@ if [ "$1" = remove ]; then      if [ -e "/etc/nsswitch.conf" ]; then          sed -i -e '/^passwd:.*tacplus\s/s/tacplus\s//' \              /etc/nsswitch.conf || true # don't prevent remove on error +        sed -i -e '/^group:.*tacplus\s/s/tacplus\s//' \ +            /etc/nsswitch.conf || true # don't prevent remove on error      fi  fi diff --git a/debian/libnss-tacplus.symbols b/debian/libnss-tacplus.symbols index 2bf9b88..873bce7 100644 --- a/debian/libnss-tacplus.symbols +++ b/debian/libnss-tacplus.symbols @@ -1,3 +1,8 @@  libnss_tacplus.so.2 libnss-tacplus #MINVER#   _nss_tacplus_getpwnam_r@Base 1.0.1   _nss_tacplus_getpwuid_r@Base 1.0.1 + _nss_tacplus_setgrent@Base 1.0.4-cl4u1 + _nss_tacplus_endgrent@Base 1.0.4-cl4u1 + _nss_tacplus_getgrent_r@Base 1.0.4-cl4u1 + _nss_tacplus_getgrgid_r@Base 1.0.4-cl4u1 + _nss_tacplus_getgrnam_r@Base 1.0.4-cl4u1 diff --git a/nss_tacplus.c b/nss_tacplus.c index 79e62b9..3a7e09c 100644 --- a/nss_tacplus.c +++ b/nss_tacplus.c @@ -1,5 +1,5 @@  /* - * Copyright (C) 2014, 2015, 2016, 2017 Cumulus Networks, Inc. + * Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019 Cumulus Networks, Inc.   * All rights reserved.   * Author: Dave Olson <olson@cumulusnetworks.com>   * @@ -37,6 +37,8 @@  #include <ctype.h>  #include <nss.h>  #include <libaudit.h> +#include <stddef.h> +#include <grp.h>  #include <sys/socket.h>  #include <sys/stat.h> @@ -63,6 +65,7 @@ struct pwbuf {  typedef struct {      struct addrinfo *addr;      char *key; +    unsigned not_resp;  } tacplus_server_t;  /* set from configuration file parsing */ @@ -75,8 +78,12 @@ static char vrfname[64];  static char *exclude_users;  static uid_t min_uid = ~0U; /*  largest possible */  static int debug; -uint16_t use_tachome; +static int printed_srvs; +static uint16_t use_tachome;  static int conf_parsed = 0; +static struct sockaddr src_sockaddr; +static struct addrinfo src_addr_info; +static struct addrinfo *src_addr;  static void get_remote_addr(void); @@ -98,9 +105,11 @@ reset_config(void)          exclude_users = NULL;      }      debug = 0; +    printed_srvs = 0;      use_tachome = 0;      tac_timeout = 0;      min_uid = ~0U; +    src_addr = NULL;      for(i = 0; i < nservers; i++) {          if(tac_srv[i].key) { @@ -108,9 +117,30 @@ reset_config(void)              tac_srv[i].key = NULL;          }          tac_srv[i].addr = NULL; +        tac_srv[i].not_resp = 0;      }  } +/* Convert ip address string to address info. + * It returns 0 on success, or -1 otherwise + * It supports ipv4 only. + */ +static int str_to_ipv4(const char *srcaddr, struct addrinfo *p_addr_info) +{ +    struct sockaddr_in *s_in; + +    s_in = (struct sockaddr_in *)p_addr_info->ai_addr; +    s_in->sin_family = AF_INET; +    s_in->sin_addr.s_addr = INADDR_ANY; + +    if (inet_pton(AF_INET, srcaddr, &(s_in->sin_addr)) == 1) { +        p_addr_info->ai_family = AF_INET; +        p_addr_info->ai_addrlen = sizeof (struct sockaddr_in); +        return 0; +    } +    return -1; +} +  static int nss_tacplus_config(int *errnop, const char *cfile, int top)  {      FILE *conf; @@ -146,8 +176,8 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)                  break; /* found removed or different file, so re-parse */          }          reset_config(); -        syslog(LOG_NOTICE, "%s: Configuration file(s) have changed, re-initializing", -            nssname); +        syslog(LOG_NOTICE, "%s: Configuration file(s) have changed, " +               "re-initializing", nssname);      }      /*  don't check for failures, we'll just skip, don't want to error out */ @@ -181,11 +211,15 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)          else if (!strncmp (lbuf, "user_homedir=", 13))              use_tachome = (uint16_t)strtoul(lbuf+13, NULL, 0);          else if (!strncmp (lbuf, "timeout=", 8)) { -            tac_timeout = (int)strtoul(lbuf+8, NULL, 0); -            if (tac_timeout < 0) /* explict neg values disable poll() use */ -                tac_timeout = 0; -            else /* poll() only used if timeout is explictly set */ +            char *argend; +            int val = (unsigned)strtol(lbuf+8, &argend, 0); +            if (argend != (lbuf+8) && val >= 0) { +                tac_timeout = val;                  tac_readtimeout_enable = 1; +            } +            else +                syslog(LOG_WARNING, "%s: invalid parameter value (%s)", +                    nssname, lbuf);          }          /*           * This next group is here to prevent a warning in the @@ -203,8 +237,9 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)                  if((tac_srv[tac_key_no].key = strdup(lbuf+7)))                      tac_key_no++;                  else -                    syslog(LOG_ERR, "%s: unable to copy server secret %s", -                        nssname, lbuf+7); +                    /* don't log the actual line, it's a security issue */ +                    syslog(LOG_ERR, "%s: unable to copy server secret %d: %m", +                        nssname, tac_key_no);              }              /* handle case where 'secret=' was given after a 'server='               * parameter, fill in the current secret */ @@ -214,6 +249,21 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)                  tac_srv[i].key = strdup(lbuf+7);              }          } +        else if (!strncmp (lbuf, "source_ip=", 10)) { +            const char *srcip = lbuf + 10; +            /* if source ip address, convert it to addr info  */ +            memset (&src_addr_info, 0, sizeof (struct addrinfo)); +            memset (&src_sockaddr, 0, sizeof (struct sockaddr)); +            src_addr_info.ai_addr = &src_sockaddr; +            if (str_to_ipv4 (srcip, &src_addr_info) == 0) +                src_addr = &src_addr_info; +            else { +                src_addr = NULL; /* for re-parsing or errors */ +                syslog(LOG_WARNING, +                       "%s: unable to convert %s to an IPv4 address", nssname, +                       lbuf); +            } +        }          else if(!strncmp(lbuf, "exclude_users=", 14)) {              /*               * Don't lookup users in this comma-separated list for both @@ -251,7 +301,7 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)                  port = strchr(server_buf, ':');                  if(port != NULL) {                      *port = '\0'; -					port++; +                    port++;                  }                  if((rv = getaddrinfo(server_buf, (port == NULL) ?                              "49" : port, &hints, &servers)) == 0) { @@ -278,8 +328,12 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)              }          }          else if(debug) /* ignore unrecognized lines, unless debug on */ -            syslog(LOG_WARNING, "%s: unrecognized parameter: %s", -                nssname, lbuf); +            /*  Don't complain about acct_all, may be set in shared +             *  config, even if we don't use it. +             */ +            if(strncmp(lbuf, "acct_all=", 9)) +                syslog(LOG_WARNING, "%s: unrecognized parameter: %s", +                    nssname, lbuf);      }      fclose(conf); @@ -287,6 +341,26 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)      return 0;  } +/* common get config code at each entry point */ +static int +get_config(int *errp, int level) +{ +    int result = nss_tacplus_config(errp, config_file, 1); +    conf_parsed = result == 0 ? 2 : 1; + +    get_remote_addr(); + +    /* no config file, no servers, etc. +     * this is a debug because privileges may not allow access +     * for included files. +    */ +    if(debug && result) +        syslog(LOG_DEBUG, "%s: bad config or server line for nss_tacplus", +            nssname); +    return result; +} + +  /*   * Separate function so we can print first time we try to connect,   * rather than during config. @@ -295,23 +369,23 @@ static int nss_tacplus_config(int *errnop, const char *cfile, int top)   */  static void print_servers(void)  { -    static int printed = 0;      int n; -    if (printed || !debug) +    if (printed_srvs || !debug)          return; -    printed = 1; +    printed_srvs = 1;      if(tac_srv_no == 0) -        syslog(LOG_DEBUG, "%s:%s: no TACACS %s in config (or no perm)," +        syslog(LOG_DEBUG, "%s:%s: no TACACS %s in config (or no permission),"              " giving up",              nssname, __FUNCTION__, tac_srv_no ? "service" :              (*tac_service ? "server" : "service and no server")); +    /*  do not log tac_srv[n].key; it's a security issue */      for(n = 0; n < tac_srv_no; n++) -        syslog(LOG_DEBUG, "%s: server[%d] { addr=%s, key='%s' }", nssname, +        syslog(LOG_DEBUG, "%s: server[%d] { addr=%s }", nssname,              n, tac_srv[n].addr ? tac_ntop(tac_srv[n].addr->ai_addr) -            : "unknown", tac_srv[n].key); +            : "unknown");  }  /* @@ -366,8 +440,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,      if (tachome && *shell == 'r') {          tachome = 0;          if(debug > 1) -            syslog(LOG_DEBUG, "%s tacacs login %s with user_homedir not allowed; " -                "shell is %s", nssname, srcpw->pw_name, buf); +            syslog(LOG_DEBUG, "%s tacacs login %s with user_homedir not allowed" +                "; shell is %s", nssname, srcpw->pw_name, buf);      }      cnt++;      buf += cnt; @@ -391,7 +465,6 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,          cnt = snprintf(buf, len, "%s", srcpw->pw_dir ? srcpw->pw_dir : "");      destpw->pw_dir = buf;      cnt++; -    buf += cnt;      len -= cnt;      if(len < 0) {          if(debug) @@ -417,17 +490,17 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw,   *   * If not found, then try to map to a localuser tacacsN where N <= to the   * TACACS+ privilege level, using the APIs in libtacplus_map.so - * algorithm in update_mapuser() + * algorithm in update_mapuser(), but only considering tacacs users.   * Returns 0 on success, else 1   */  static int  find_pw_userpriv(unsigned priv, struct pwbuf *pb)  {      FILE *pwfile; -    struct passwd upw, tpw, *ent; -    int matches, ret, retu, rett; +    struct passwd tpw, *ent; +    int matches, ret, rett;      unsigned origpriv = priv; -    char ubuf[pb->buflen], tbuf[pb->buflen]; +    char tbuf[pb->buflen];      char tacuser[9]; /* "tacacs" followed by 1-2 digits */      tacuser[0] = '\0'; @@ -440,16 +513,10 @@ find_pw_userpriv(unsigned priv, struct pwbuf *pb)  recheck:      snprintf(tacuser, sizeof tacuser, "tacacs%u", priv); -    tpw.pw_name = upw.pw_name = NULL; -    retu = 0, rett = 0; -    for(matches=0; matches < 2 && (ent = fgetpwent(pwfile)); ) { -        if(!ent->pw_name) -            continue; /* shouldn't happen */ -        if(!strcmp(ent->pw_name, pb->name)) { -            retu = pwcopy(ubuf, sizeof(ubuf), ent, &upw, NULL, use_tachome); -            matches++; -        } -        else if(!strcmp(ent->pw_name, tacuser)) { +    tpw.pw_name = NULL; +    rett = 0; +    for(matches=0; !matches && (ent = fgetpwent(pwfile)); ) { +        if(ent->pw_name && !strcmp(ent->pw_name, tacuser)) {              rett = pwcopy(tbuf, sizeof(tbuf), ent, &tpw, NULL, use_tachome);              matches++;          } @@ -465,12 +532,10 @@ recheck:          if(priv != origpriv && debug)              syslog(LOG_DEBUG, "%s: local user not found at privilege=%u,"                  " using %s", nssname, origpriv, tacuser); -        if(upw.pw_name && !retu) -            ret = pwcopy(pb->buf, pb->buflen, &upw, pb->pw, pb->name, -                use_tachome); -        else if(tpw.pw_name && !rett) +        if(tpw.pw_name && !rett) {              ret = pwcopy(pb->buf, pb->buflen, &tpw, pb->pw, pb->name,                  use_tachome); +        }      }      if(ret)         *pb->errnop = ERANGE; @@ -570,7 +635,7 @@ connect_tacacs(struct tac_attrib **attr, int srvr)  {      int fd; -    fd = tac_connect_single(tac_srv[srvr].addr, tac_srv[srvr].key, NULL, +    fd = tac_connect_single(tac_srv[srvr].addr, tac_srv[srvr].key, src_addr,          vrfname[0]?vrfname:NULL);      if(fd >= 0) {          tac_add_attrib(attr, "service", tac_service); @@ -582,6 +647,25 @@ connect_tacacs(struct tac_attrib **attr, int srvr)      return fd;  } +/* + * If all servers have been unresponsive, clear that state, so we try + * them all.  It might have been transient. + */ +static void tac_chk_anyresp(void) +{ +    int i, anyok=0; + +    for(i = 0; i < tac_srv_no; i++) { +        if (!tac_srv[i].not_resp) +            anyok++; +    } +    if (!anyok) { +        for(i = 0; i < tac_srv_no; i++) +            tac_srv[i].not_resp = 0; +    } +} + +  /*   * lookup the user on a TACACS server.  Returns 0 on successful lookup, else 1 @@ -626,12 +710,16 @@ lookup_tacacs_user(struct pwbuf *pb)          return ret;      print_servers(); +    tac_chk_anyresp();      for(srvr=0; srvr < tac_srv_no && !done; srvr++) { +        if (tac_srv[srvr].not_resp) +            continue; /*  don't retry if previously not responding */          arep.msg = NULL;          arep.attr = NULL;          arep.status = TAC_PLUS_AUTHOR_STATUS_ERROR; /* if author_send fails */          tac_fd = connect_tacacs(&attr, srvr);          if (tac_fd < 0) { +            tac_srv[srvr].not_resp = 1;              if(debug)                  syslog(LOG_WARNING, "%s: failed to connect TACACS+ server %s,"                      " ret=%d: %m", nssname, tac_srv[srvr].addr ? @@ -642,10 +730,10 @@ lookup_tacacs_user(struct pwbuf *pb)          ret = tac_author_send(tac_fd, pb->name, "", tac_rhost, attr);          if(ret < 0) {              if(debug) -                syslog(LOG_WARNING, "%s: TACACS+ server %s authorization failed (%d) " -                    " user (%s)", nssname, tac_srv[srvr].addr ? -                    tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", ret, -                    pb->name); +                syslog(LOG_WARNING, "%s: TACACS+ server %s authorization " +                       "failed (%d) user (%s)", nssname, tac_srv[srvr].addr ? +                       tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", ret, +                       pb->name);          }          else  {              errno = 0; @@ -669,12 +757,12 @@ lookup_tacacs_user(struct pwbuf *pb)             arep.status == AUTHOR_STATUS_PASS_REPL) {              ret = got_tacacs_user(arep.attr, pb);              if(debug>1) -                syslog(LOG_DEBUG, "%s: TACACS+ server %s successful for user %s." +                syslog(LOG_DEBUG, "%s: TACACS+ server %s successful for user %s"                      " local lookup %s", nssname,                      tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name, -                    ret?"OK":"no match"); +                    ret?"copy problem":"OK");              else if(debug) -                syslog(LOG_DEBUG, "%s: TACACS+ server %s successful for user %s", +                syslog(LOG_DEBUG, "%s: TACACS+ server %s success on user %s",                      nssname, tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name);              done = 1; /* break out of loop after arep cleanup */          } @@ -700,13 +788,16 @@ lookup_mapped_uid(struct pwbuf *pb, uid_t uid, uid_t auid, int session)  {      char *loginname, mappedname[256];      uint16_t flag; +    int ret = 1;      mappedname[0] = '\0';      loginname = lookup_mapuid(uid, auid, session,                              mappedname, sizeof mappedname, &flag); -    if(loginname) -        return find_pw_user(loginname, mappedname, pb, flag & MAP_USERHOMEDIR); -    return 1; +    if(loginname) { +        ret = find_pw_user(loginname, mappedname, pb, flag & MAP_USERHOMEDIR); +        free(loginname); +    } +    return ret;  }  /* @@ -727,51 +818,47 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw,      char *buffer, size_t buflen, int *errnop)  {      enum nss_status status = NSS_STATUS_NOTFOUND; -    int result; +    int result, lookup;      struct pwbuf pbuf; -    result = nss_tacplus_config(errnop, config_file, 1); -    conf_parsed = result == 0 ? 2 : 1; - -    get_remote_addr(); +    result = get_config(errnop, 1); +    if(result) +        return status; -    if(result) { /* no config file, no servers, etc. */ -        /*  this is a debug because privileges may not allow access */ -        if(debug) -            syslog(LOG_DEBUG, "%s: bad config or server line for nss_tacplus", -                nssname); +    /* marshal the args for the lower level functions */ +    pbuf.name = (char *)name; +    pbuf.pw = pw; +    pbuf.buf = buffer; +    pbuf.buflen = buflen; +    pbuf.errnop = errnop; + +    lookup = lookup_tacacs_user(&pbuf); +    if(!lookup) { +        status = NSS_STATUS_SUCCESS; +        if (errnop) +            *errnop = 0;      } -    else { -        int lookup; - -        /* marshal the args for the lower level functions */ -        pbuf.name = (char *)name; -        pbuf.pw = pw; -        pbuf.buf = buffer; -        pbuf.buflen = buflen; -        pbuf.errnop = errnop; - -        lookup = lookup_tacacs_user(&pbuf); -        if(!lookup) +    else if(lookup == 1) { /*  2 means exclude_users match */ +        uint16_t flag; +        /* +         * If we can't contact a tacacs server (either not configured, or +         * more likely, we aren't running as root and the config for the +         * server is not readable by our uid for security reasons), see if +         * we can find the user via the mapping database, and if so, use +         * that.  This will work for non-root users as long as the requested +         * name is in use (that is, logged in), which will be the most +         * common case of wanting to use the original login name by non-root +         * users. +         */ +        char *mapname = lookup_mapname(name, -1, -1, NULL, &flag); +        if(mapname != name && !find_pw_user(name, mapname, &pbuf, +                flag & MAP_USERHOMEDIR))              status = NSS_STATUS_SUCCESS; -        else if(lookup == 1) { /*  2 means exclude_users match */ -            uint16_t flag; -            /* -             * If we can't contact a tacacs server (either not configured, or -             * more likely, we aren't running as root and the config for the -             * server is not readable by our uid for security reasons), see if -             * we can find the user via the mapping database, and if so, use -             * that.  This will work for non-root users as long as the requested -             * name is in use (that is, logged in), which will be the most -             * common case of wanting to use the original login name by non-root -             * users. -             */ -            char *mapname = lookup_mapname(name, -1, -1, NULL, &flag); -            if(mapname != name && !find_pw_user(name, mapname, &pbuf, -                    flag & MAP_USERHOMEDIR)) -                status = NSS_STATUS_SUCCESS; -        }      } + +    if (status == NSS_STATUS_SUCCESS && errnop) +        *errnop = 0; /*  be sane, no stale errno */ +     return status;  } @@ -811,12 +898,11 @@ enum nss_status _nss_tacplus_getpwuid_r(uid_t uid, struct passwd *pw,  {      struct pwbuf pb;      enum nss_status status = NSS_STATUS_NOTFOUND; -    int session, ret; +    int session;      uid_t auid; -    ret = nss_tacplus_config(errnop, config_file, 1); -    conf_parsed = ret == 0 ? 2 : 1; - +    (void) get_config(errnop, 1); +    /*  config errors aren't fatal here */      if (min_uid != ~0U && uid < min_uid) {          if(debug > 1)              syslog(LOG_DEBUG, "%s: uid %u < min_uid %u, don't lookup", @@ -874,3 +960,393 @@ static void get_remote_addr(void)      if(debug > 1 && tac_rhost[0])          syslog(LOG_DEBUG, "%s: rhost=%s", nssname, tac_rhost);  } + +/* start of infrastructure for getgr* routines */ + +static int copyuser(char **grmem, const char *user, long long *blen, +                    int *err) +{ +    size_t l = strlen(user) + 1; +    *blen -= l; +    if (*blen < 0) { +        *err = ERANGE; +        return 1; +    } +    strcpy(*grmem, user); +    *grmem += l; +    return 0; +} + +/* +* Return a char ** list of strings of usernames from the mapping db +* that for each username such as tacacs15, looks up that name and +* replaces it with usernames logged in and mapped to that name, +* for replacing the gr_mem field for getgrent(), etc. +* Passed the original gr_mem array straight from the group file. +* All strings go into buf, and we return ERANGE in *err if there +* isn't enough room. +* The allocated memory will leak, but it's re-used on each call, so +* not too signficant, and if endgrent() gets called, we'll clean up. +*/ +static char ** +fixup_gr_mem(const char *grnam, const char **gr_in, char *buf, +             size_t *lenp, int *err) +{ +    int nadded = 0, midx = 0; +    long long l = 0, len = *lenp;   /* size_t unsigned on some systems */ +    const char **in; +    char **out = NULL, *mem = buf; +    char **gr_mem; +    const unsigned align = sizeof(void *) - 1; + +    *err = 0; + +    /* set up to copy to supplied buffer */ +    l = (((ptrdiff_t)mem + align) & align); +    len -= align; +    mem += align; +    gr_mem = (char **)mem; + +    if (!gr_in) +        goto done; + +    /* sort of ugly to have to do this twice, to reserve enough +     * space in gr_mem, but it's not too expensive, no connects +     * to a tacacs server. +    */ +    for (in=gr_in; in && *in; in++) { +        char *mapnames = lookup_all_mapped(*in); +        if (mapnames) { /*  comma separated list was returned  */ +            char *saved, *tok; +            tok = strtok_r(mapnames, ",", &saved); +            while (tok) { +                nadded++; +                tok = strtok_r(NULL, ",", &saved); +            } +        } +        else +            nadded++; +    } +    l = sizeof *gr_mem * (nadded+1); +    len -= l; +    mem += l; + +    /*  do the copying in this loop */ +    for (in=gr_in; in && *in; in++) { +        char *mapnames = lookup_all_mapped(*in); +        if (mapnames) { /*  comma separated list was returned  */ +            char *saved, *tok; +            tok = strtok_r(mapnames, ",", &saved); +            while (tok) { +                gr_mem[midx] = mem; +                if(copyuser(&mem, tok, &len, err)) +                    goto done; +                midx++; +                tok = strtok_r(NULL, ",", &saved); +            } +        } +        else { /*  just copy what was returned to the buffer */ +            gr_mem[midx] = mem; +            if(copyuser(&mem, *in, &len, err)) +                goto done; +            midx++; +        } +    } + + done: +    gr_mem[midx] = NULL;        /*  terminate the list */ + +    if (*err) { +        syslog(LOG_WARNING, "%s: group %s members truncated due to short" +               " buffer %lld characters", nssname, grnam, (long long)*lenp); +        *lenp = 0; +    } else { +        out = gr_mem; +        *lenp = mem - buf; +    } +    return out; +} + +/* end of infrastructure for getgr* routines */ +/* +* The group routines are here so we can substitute mappings for radius_user +* and radius_priv_user when reading /etc/group, so that we can make +* users members of the appropriate groups for various privileged +* (and unprivileged) tasks. +* Ideally, we'd be able to use the getgr* routines specifying compat, +* but the NSS plugin infrastructure doesn't support that, so we have to +* read /etc/group directly, and then do our substitutions. +* +* This won't work if the RADIUS users are in LDAP group and/or password +* files, but that's the way it goes. +* +* For the intended purpose, it works well enough. +* +* We need getgrent() for this one, because initgroups needs it, unlike +* the password file. +*/ + +static FILE *grent; + +__attribute__((visibility("default"))) +enum nss_status _nss_tacplus_setgrent(void) +{ +    enum nss_status status = NSS_STATUS_NOTFOUND; +    static const char *grpname = "/etc/group"; +    int error, errval; + +    error = get_config(&errval, 1); +    if(error) +        return errval == ENOENT ? NSS_STATUS_UNAVAIL : status; + +    if (grent) { +        rewind(grent); +        status = NSS_STATUS_SUCCESS; +        goto done; +    } + +    grent = fopen(grpname, "r"); +    if (!grent) { +        syslog(LOG_WARNING, "%s: failed to open %s: %m", nssname, grpname); +        status = NSS_STATUS_UNAVAIL; +    } else { +        status = NSS_STATUS_SUCCESS; +        /*  don't leave fd open across execs */ +        (void)fcntl(fileno(grent), F_SETFD, FD_CLOEXEC); +    } + done: +    return status; +} + +__attribute__((visibility("default"))) +enum nss_status _nss_tacplus_endgrent(void) +{ +    if (grent) { +        FILE *f = grent; +        grent = NULL; +        (void)fclose(f); +    } +    return NSS_STATUS_SUCCESS; +} + +/* +* do the fixups and copies, using the passed in buffer.  result must +* have been checked to be sure it's non-NULL before calling. +*/ +static int fixup_grent(struct group *entry, struct group *result, char *buf, +                       size_t lenbuf, int *errp) +{ +    char **grusr, **new_grmem = NULL; +    struct group *newg; +    long long l, len;           /* size_t unsigned on some systems */ +    int err, members, memlen; +    int ret = NSS_STATUS_NOTFOUND; +    char *nm = entry->gr_name ? entry->gr_name : "(nil)"; +    size_t usedbuf; + +    if (!result)                /* should always be non-NULL, just cautious */ +        return ret; + +    len = lenbuf; +    if (!errp)                  /*  to reduce checks below */ +        errp = &err; +    *errp = 0; + +    newg = (struct group *)buf; +    len -= sizeof *newg; +    buf += sizeof *newg; +    if (len < 0) { +        *errp = ENOMEM; +        return ret; +    } +    newg->gr_gid = entry->gr_gid; +    l = snprintf(buf, len, "%s", entry->gr_name); +    newg->gr_name = buf; +    len -= l + 1; +    buf += l + 1; +    if (len > 0) { +        l = snprintf(buf, len, "%s", entry->gr_passwd); +        newg->gr_passwd = buf; +        len -= l + 1; +        buf += l + 1; +    } +    if (len < 0) { +        *errp = ENOMEM; +        return NSS_STATUS_TRYAGAIN; +    } + +    /* +     * for each member in the group, see if it's a tacacs mapped name, and if +     * so, replace it with the login name(s) mapped to it, if any, otherwise +     * leave it as is. +     */ +    for (memlen=members=0, grusr=entry->gr_mem; grusr && *grusr; grusr++) { +        members++; +        memlen += strlen(*grusr) + 1; +    } + +    usedbuf = len; + +    /*  substitute login names (if any) for mapped users */ +    new_grmem = fixup_gr_mem(nm, (const char **)entry->gr_mem, +                             buf, &usedbuf, errp); +    buf += usedbuf; +    len -= usedbuf; +    if (errp) { +        if (*errp == ERANGE) +            ret = NSS_STATUS_TRYAGAIN; +        else if (*errp == ENOENT) +            ret = NSS_STATUS_UNAVAIL; + +    } else if (len < 0) { +        *errp = ERANGE; +        ret = NSS_STATUS_TRYAGAIN; +    } + +    if (*errp) +        goto done; +    *result = *newg; +    if (new_grmem) +        result->gr_mem = new_grmem; +    else { +        char **sav, **entgr, *usrbuf; +        len -= (members + 1) * sizeof *new_grmem; +        len -= memlen; +        if (len < 0) { +            *errp = ERANGE; +            ret = NSS_STATUS_TRYAGAIN; +            goto done; +        } +        sav = result->gr_mem = (char **)buf; +        buf += (members + 1) * sizeof *new_grmem; +        usrbuf = buf; + +        for (entgr = entry->gr_mem; entgr && *entgr; entgr++, sav++) { +            *sav = usrbuf; +            usrbuf += strlen(*entgr) + 1; +            strcpy(*sav, *entgr); +        } + +        *sav = NULL; +    } +    ret = NSS_STATUS_SUCCESS; + done: +    return ret; +} + +/* +* No locking needed because our only global is the dirent * for +* the runuser directory, and our use of that should be thread safe +*/ +__attribute__((visibility("default"))) +enum nss_status _nss_tacplus_getgrent_r(struct group *gr_result, +                                        char *buffer, size_t buflen, +                                        int *errnop) +{ +    enum nss_status status = NSS_STATUS_NOTFOUND; +    struct group *ent; +    int ret = 1; +    int localerr; + +    if (!gr_result) { +        if (errnop) +            *errnop = EFAULT; +        return status; +    } + +    ret = get_config(errnop, 1); +    if(ret) +        return errnop && *errnop == ENOENT ? NSS_STATUS_UNAVAIL : status; + +    if (!grent) { +        status = _nss_tacplus_setgrent(); +        if (status != NSS_STATUS_SUCCESS) +            return status; +    } + +    ent = fgetgrent(grent); +    if (!ent) { +        int e = errno; +        if (ferror(grent)) { +            syslog(LOG_WARNING, +                   "%s: error reading group information: %m", nssname); +            errno = e; +        } else +            errno = 0; +        return status; +    } +    ret = fixup_grent(ent, gr_result, buffer, buflen, &localerr); +    if (errnop) +        *errnop = localerr; +    return ret; +} + +__attribute__((visibility("default"))) +enum nss_status _nss_tacplus_getgrnam_r(const char *name, struct group *gr, +                                        char *buffer, size_t buflen, +                                        int *errnop) +{ +    enum nss_status status = NSS_STATUS_NOTFOUND; +    int ret; +    struct group *ent; +    int localerr; + +    if (!gr) { +        if (errnop) +            *errnop = EFAULT; +        return status; +    } + +    ret = get_config(errnop, 1); +    if(ret) +        return errnop && *errnop == ENOENT ? NSS_STATUS_UNAVAIL : status; + +    if (_nss_tacplus_setgrent() != NSS_STATUS_SUCCESS) +        return status; + +    for (ent = fgetgrent(grent); ent; ent = fgetgrent(grent)) { +        if (!strcmp(ent->gr_name, name)) { +            status = fixup_grent(ent, gr, buffer, buflen, &localerr); +            if (errnop) +                *errnop = localerr; +            break; +        } +    } + +    return status; +} + +__attribute__((visibility("default"))) +enum nss_status _nss_tacplus_getgrgid_r(gid_t gid, struct group *gr, +                                        char *buffer, size_t buflen, +                                        int *errnop) +{ +    int ret; +    enum nss_status status = NSS_STATUS_NOTFOUND; +    struct group *ent; +    int localerr; + +    if (!gr) { +        if (errnop) +            *errnop = EFAULT; +        return status; +    } + +    ret = get_config(errnop, 1); +    if(ret) +        return errnop && *errnop == ENOENT ? NSS_STATUS_UNAVAIL : status; + +    if (_nss_tacplus_setgrent() != NSS_STATUS_SUCCESS) +        return status; + +    for (ent = fgetgrent(grent); ent; ent = fgetgrent(grent)) { +        if (ent->gr_gid == gid) { +            status = fixup_grent(ent, gr, buffer, buflen, &localerr); +            if (errnop) +                *errnop = localerr; +            break; +        } +    } + +    return status; +} diff --git a/tacplus_nss.conf b/tacplus_nss.conf index bb4eb1e..3c71422 100644 --- a/tacplus_nss.conf +++ b/tacplus_nss.conf @@ -30,7 +30,7 @@ min_uid=1001  # that during pathname completion, bash can do an NSS lookup on "*"  # To avoid server round trip delays, or worse, unreachable server delays  # on filename completion, we include "*" in the exclusion list. -exclude_users=root,cumulus,quagga,sshd,ntp,* +exclude_users=root,daemon,nobody,cron,radius_user,radius_priv_user,sshd,cumulus,quagga,frr,snmp,www-data,ntp,man,_lldpd,*  # The include keyword allows centralizing the tacacs+ server information  # including the IP address and shared secret @@ -42,6 +42,12 @@ include=/etc/tacplus_servers  #secret=SECRET1  #server=1.1.1.1 +# Sets the IPv4 address used as the source IP address when communicating with +# the TACACS+ server.  IPv6 addresses are not supported, nor are hostnames. +# The address must work when passsed to the bind() system call, that is, it must +# be valid for the interface being used. +# source_ip=192.168.1.3 +  # The connection timeout for an NSS library should be short, since it is  # invoked for many programs and daemons, and a failure is usually not  # catastrophic.  Not set or set to a negative value disables use of poll(). diff --git a/tacplus_nss.conf.5 b/tacplus_nss.conf.5 new file mode 100644 index 0000000..f8fcac2 --- /dev/null +++ b/tacplus_nss.conf.5 @@ -0,0 +1,114 @@ +.TH tacplus_nss.conf 5 +.\" Copyright 2018, 2019 Cumulus Networks, Inc.  All rights reserved. +.SH NAME +/etc/tacplus_nss.conf \- TACACS+ client configuration file +.SH SYNOPSIS +.B /etc/tacplus_nss.conf +is the primary configuration file for the NSS tacplus client plugin. +.SH DESCRIPTION +All NSS passwd and group lookups for the tacplus client use this configuration file. +This plugin +does lookups on TACACS+ user information, and for group lookups, substitutes the +login name of tacacs users for the mapping names +.IR tacacs0 ... tacacs15 . +These accounts must be listed in the +.B /etc/passwd +and +.B /etc/group +files for the client-side mapping based on privilege level to work successful. +.PP +The +.I tacplus_nss.conf +file is minimal, because it uses the +.I include +directive to read the +.I /etc/tacplus_servers +file for most of the configuration items. +.P +However, non-root accounts will not be able to read the +.I /etc/tacplus_servers +contents due to required security file permissions.  This normally is not an issue, +due to the use of the tacplus client mapping database. +.P +Configuration variables set prior to the +.I include +directive may be modified or extended by the common configuration file. +Those that follow the +.I include +directive will override those in the common configuration file. +.PP +Most commonly, the +.I timeout +and +.I debug +variables are set in this configuration file, so they can use different +values than the PAM libraries, etc. +.PP +Programs using the NSS tacplus plugin may not be able to read this +file when running as a non-root user (because +.I tacplus_servers +has permissions that do not allow world-access, because it contains the +shared secret key. +Typically the +.B secret +keyword should not be used in this NSS configuration files, for that reason. +.PP +.I debug=Number +Output debugging information via syslog(3). +Debugging is heavy, including passwords. Do not leave debugging enabled on a production switch once you have completed troubleshooting.  Currently most components only check to see if it is non-zero.  Some components will print additional debug if set to +.BR 2 . +.TP +.I timeout=SECONDS +Sets the per-connection timeout for reaching the TACACS+ server(s).  For the NSS plugin, +there is typically only one connection per lookup. +The libnss functionality typically sets a smaller timeout in it's +own configuration file than the value set in +.IR /etc/tacplus_servers , +because NSS lookups are more frequent and less important than logins. +.TP +.I include=/file/name +Open the listed file, and continue to read configuration from that file, +if the open is successful.  This avoids duplication of configuration information. +A maximum of 8 configuration files may be used. +.TP +.I min_uid=value +This is the minimum uid the NSS plugin will lookup.  Setting this to 0 +means uid 0 (root) is never looked up, good for robustness and performance +Cumulus Linux ships with it set to 1001, to ignore system users and the +.I cumulus +user, which typically has the uid 1000.  Should not be greater +than the local +.IR tacacs0 ... tacacs15 +usernames, or they will not be looked up. +.TP +.I exclude_users=user1,user2,*,... +This is a comma separated list of usernames that are never looked up +by this NSS plugin, instead they cause an early not found return. +.B * +(asterisk) is not a wild card in this list.  While it's not a legal username, +bash may lookup this as a user name during pathname completion, so +it is included in this list as a username string. +.PP +For all the other configuration variables, see the +.I /etc/tacplus_servers +file and it's man page. +.SH "SEE ALSO" +.BR tacplus_servers (5), +.IR getpwnam (3), +.IR getpwnam_r (3), +.IR getpwuid (3), +.IR getpwuid_r (3). +.IR getgrnam (3), +.IR getpgram_r (3), +and +.IR getpgrent (3). +.SH FILES +.I /etc/tacplus_nss.conf +- configuration file for TACACS+ NSS lookups +.br +.I /etc/tacplus_servers - +default top-level TACSCS+ client configuration, that is included by +.I /etc/tacplus_nss.conf +to avoid duplicating configuration information. +.SH AUTHOR +Dave Olson <olson@cumulusnetworks.com> | 
