#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+# Free Software Foundation, Inc.
-timestamp='2004-03-12'
+version='2004-08-19'
# 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
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted ChangeLog entry.
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
#
# 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.
#
# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
Usage: $0 [OPTION]
-Output the configuration name of the system \`$me' is run on.
+Output the configuration name of this system.
Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit"
help="
Try \`$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit 0 ;;
- --version | -v )
+ case "$1" in
+ --version | --vers* | -V )
echo "$version" ; exit 0 ;;
--help | --h* | -h )
echo "$usage"; exit 0 ;;
- ) # Use stdin as input.
break ;;
-* )
- echo "$me: invalid option $1$help" >&2
+ exec >&2
+ echo "$me: invalid option $1"
+ echo "$help"
exit 1 ;;
* )
break ;;
exit 1
fi
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
+# Use $HOST_CC if defined. $CC may point to a cross-compiler
+if test x"$CC_FOR_BUILD" = x; then
+ if test x"$HOST_CC" != x; then
+ CC_FOR_BUILD="$HOST_CC"
+ else
+ if test x"$CC" != x; then
+ CC_FOR_BUILD="$CC"
+ else
+ CC_FOR_BUILD=cc
+ fi
+ fi
+fi
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) 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
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ;'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
+# (ghazi@noc.rutgers.edu 8/24/94.)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
PATH=$PATH:/.attbin ; export PATH
fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
+ # Netbsd (nbsd) targets should (where applicable) match one or
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
# switched to ELF, *-*-netbsd* would select the old
# object file format. This provides both forward
# compatibility and a consistent mechanism for selecting the
# object file format.
- #
- # 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
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-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
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep __ELF__ >/dev/null
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
+ # Determine the machine/vendor (is the vendor relevant).
+ case "${UNAME_MACHINE}" in
+ amiga) machine=m68k-unknown ;;
+ arm32) machine=arm-unknown ;;
+ atari*) machine=m68k-atari ;;
+ sun3*) machine=m68k-sun ;;
+ mac68k) machine=m68k-apple ;;
+ macppc) machine=powerpc-apple ;;
+ hp3[0-9][05]) machine=m68k-hp ;;
+ ibmrt|romp-ibm) machine=romp-ibm ;;
+ *) machine=${UNAME_MACHINE}-unknown ;;
esac
+ # The Operating System including object format.
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
# 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
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}"
exit 0 ;;
- amd64:OpenBSD:*:*)
- echo x86_64-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- amiga:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- arc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- cats:OpenBSD:*:*)
- echo arm-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- hp300:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mac68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- macppc:OpenBSD:*:*)
- echo powerpc-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme88k:OpenBSD:*:*)
- echo m88k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvmeppc:OpenBSD:*:*)
- echo powerpc-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- pegasos:OpenBSD:*:*)
- echo powerpc-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- pmax:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- sgi:OpenBSD:*:*)
- echo mipseb-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- sun3:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- wgrisc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- *:OpenBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit 0 ;;
- macppc:MirBSD:*:*)
- echo powerppc-unknown-mirbsd${UNAME_RELEASE}
- exit 0 ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit 0 ;;
alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
+ if test $UNAME_RELEASE = "V4.0"; then
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- 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" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
+ fi
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit 0 ;;
- Alpha*:OpenVMS:*:*)
- echo alpha-hp-vms
+ cat <<EOF >$dummy.s
+ .data
+\$Lformat:
+ .byte 37,100,45,37,120,10,0 # "%d-%x\n"
+
+ .text
+ .globl main
+ .align 4
+ .ent main
+main:
+ .frame \$30,16,\$26,0
+ ldgp \$29,0(\$27)
+ .prologue 1
+ .long 0x47e03d80 # implver \$0
+ lda \$2,-1
+ .long 0x47e20c21 # amask \$2,\$1
+ lda \$16,\$Lformat
+ mov \$0,\$17
+ not \$1,\$18
+ jsr \$26,printf
+ ldgp \$29,0(\$26)
+ mov 0,\$16
+ jsr \$26,exit
+ .end main
+EOF
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ case `./$dummy` in
+ 0-0)
+ UNAME_MACHINE="alpha"
+ ;;
+ 1-0)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 1-1)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 1-101)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 2-303)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ 2-307)
+ UNAME_MACHINE="alphaev67"
+ ;;
+ esac
+ fi
+ rm -f $dummy.s $dummy
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit 0 ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
Amiga*:UNIX_System_V:4.0:*)
echo m68k-unknown-sysv4
exit 0;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
*:[Aa]miga[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-amigaos
exit 0 ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:OS/390:*:*)
echo i370-ibm-openedition
exit 0 ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ SR2?01:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp
exit 0;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4
exit 0 ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit 0 ;;
- DRS?6000:UNIX_SV:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7 && exit 0 ;;
- esac ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
echo m68k-sun-sunos${UNAME_RELEASE}
exit 0 ;;
sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
case "`/bin/arch`" in
sun3)
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
+ # "atarist" or "atariste" at least should have a processor
# > m68000). The system name ranges from "MiNT" over "FreeMiNT"
# to the lowercase version "mint" (or "freemint"). Finally
# the system name "TOS" denotes a system which is actually not
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
echo clipper-intergraph-clix${UNAME_RELEASE}
exit 0 ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#ifdef __cplusplus
#include <stdio.h> /* for printf() prototype */
exit (-1);
}
EOF
- $CC_FOR_BUILD -o $dummy $dummy.c \
- && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
- && exit 0
+ $CC_FOR_BUILD $dummy.c -o $dummy \
+ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit 0 ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit 0 ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit 0 ;;
Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix
exit 0 ;;
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 ]
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
+ i?86:AIX:*:*)
echo i386-ibm-aix
exit 0 ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit 0 ;;
*: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
#include <sys/systemcfg.h>
exit(0);
}
EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
fi
exit 0 ;;
*:AIX:*:[45])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep -i PowerPC >/dev/null 2>&1; then
IBM_ARCH=powerpc
- fi
+ else
+ IBM_ARCH=rs6000
+ fi
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ IBM_REV=4.${UNAME_RELEASE}
fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
exit 0 ;;
echo m68k-hp-bsd4.4
exit 0 ;;
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 ;;
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
- 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
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
+ sed 's/^ //' << EOF >$dummy.c
#define _HPUX_SOURCE
#include <stdlib.h>
exit (0);
}
EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
+ (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+ rm -f $dummy.c $dummy
esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- # avoid double evaluation of $set_cc_for_build
- test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit 0 ;;
- ia64:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;;
3050*:HI-UX:*:*)
- eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include <unistd.h>
int
exit (0);
}
EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
echo unknown-hitachi-hiuxwe2
exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd
exit 0 ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ *9??*:MPE/iX:*:*)
echo hppa1.0-hp-mpeix
exit 0 ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
hp8??:OSF1:*:*)
echo hppa1.0-hp-osf
exit 0 ;;
- i*86:OSF1:*:*)
+ i?86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk
else
parisc*:Lites*:*:*)
echo hppa1.1-hp-lites
exit 0 ;;
+ hppa*:OpenBSD:*:*)
+ echo hppa-unknown-openbsd
+ exit 0 ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
exit 0 ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ echo ymp-cray-unicos${UNAME_RELEASE}
exit 0 ;;
CRAY*[A-Z]90:*:*:*)
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
exit 0 ;;
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- *:UNICOS/mp:*:*)
- echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
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}"
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
sparc*:BSD/OS:*:*)
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit 0 ;;
*:FreeBSD:*:*)
- # Determine whether the default compiler uses glibc.
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <features.h>
- #if __GLIBC__ >= 2
- LIBC=gnu
- #else
- LIBC=
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
- # GNU/KFreeBSD systems have a "k" prefix to indicate we are using
- # FreeBSD's kernel, but not the complete OS.
- case ${LIBC} in gnu) kernel_only='k' ;; esac
- echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
exit 0 ;;
- x86:Interix*:[34]*)
- echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
- exit 0 ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit 0 ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
# UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
+ echo i386-pc-interix
exit 0 ;;
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
*:GNU:*:*)
- # the GNU system
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
- exit 0 ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
exit 0 ;;
- arm*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- cris:Linux:*:*)
- echo cris-axis-linux-gnu
- exit 0 ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- mips:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef mips
- #undef mipsel
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=mipsel
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=mips
- #else
- CPU=
- #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 0
- ;;
- mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef mips64
- #undef mips64el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=mips64el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=mips64
- #else
- CPU=
- #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 0
- ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-gnu
- exit 0 ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-gnu
- exit 0 ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
- exit 0 ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-gnu ;;
- PA8*) echo hppa2.0-unknown-linux-gnu ;;
- *) echo hppa-unknown-linux-gnu ;;
- esac
- exit 0 ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit 0 ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit 0 ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- x86_64:Linux:*:*)
- echo x86_64-unknown-linux-gnu
- exit 0 ;;
- i*86:Linux:*:*)
+ *:Linux:*:*)
+
# The BFD linker knows what the default object file format is, so
# first see if it will tell us. cd to the root directory to prevent
# problems with other programs or directories called `ld' in the path.
- # Set LC_ALL=C to ensure ld outputs messages in English.
- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
- | sed -ne '/supported targets:/!d
+ ld_help_string=`cd /; ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
s/[ ][ ]*/ /g
- s/.*supported targets: *//
+ s/.*supported emulations: *//
s/ .*//
p'`
- case "$ld_supported_targets" in
- elf32-i386)
- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ case "$ld_supported_emulations" in
+ *ia64)
+ echo "${UNAME_MACHINE}-unknown-linux"
+ exit 0
;;
- a.out-i386-linux)
+ i?86linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
- exit 0 ;;
- coff-i386)
+ exit 0
+ ;;
+ elf_i?86)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ i?86coff)
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
- exit 0 ;;
- "")
- # Either a pre-BFD a.out linker (linux-gnuoldld) or
- # one that does not give us useful --help.
- echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
- exit 0 ;;
+ exit 0
+ ;;
+ sparclinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ armlinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32arm*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
+ exit 0
+ ;;
+ armelf_linux*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnu"
+ exit 0
+ ;;
+ m68klinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32ppc | elf32ppclinux)
+ # Determine Lib Version
+ cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#if defined(__GLIBC__)
+ printf("%s %s\n", __libc_version, __libc_release);
+#else
+ printf("unkown\n");
+#endif
+ return 0;
+}
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy | grep 1\.99 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.c $dummy
+ echo powerpc-unknown-linux-gnu${LIBC}
+ exit 0
+ ;;
+ shelf_linux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnu"
+ exit 0
+ ;;
esac
- # Determine whether the default compiler is a.out or elf
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <features.h>
- #ifdef __ELF__
- # ifdef __GLIBC__
- # if __GLIBC__ >= 2
- LIBC=gnu
- # else
- LIBC=gnulibc1
- # endif
- # else
- LIBC=gnulibc1
- # endif
- #else
- #ifdef __INTEL_COMPILER
- LIBC=gnu
- #else
- LIBC=gnuaout
- #endif
- #endif
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ cat <<EOF >$dummy.s
+ .data
+ \$Lformat:
+ .byte 37,100,45,37,120,10,0 # "%d-%x\n"
+
+ .text
+ .globl main
+ .align 4
+ .ent main
+ main:
+ .frame \$30,16,\$26,0
+ ldgp \$29,0(\$27)
+ .prologue 1
+ .long 0x47e03d80 # implver \$0
+ lda \$2,-1
+ .long 0x47e20c21 # amask \$2,\$1
+ lda \$16,\$Lformat
+ mov \$0,\$17
+ not \$1,\$18
+ jsr \$26,printf
+ ldgp \$29,0(\$26)
+ mov 0,\$16
+ jsr \$26,exit
+ .end main
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ case `./$dummy` in
+ 0-0)
+ UNAME_MACHINE="alpha"
+ ;;
+ 1-0)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 1-1)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 1-101)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 2-303)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ 2-307)
+ UNAME_MACHINE="alphaev67"
+ ;;
+ esac
+
+ objdump --private-headers $dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.s $dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >$dummy.c <<EOF
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
- test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
- ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ elif test "${UNAME_MACHINE}" = "s390x"; then
+ echo s390x-ibm-linux && exit 0
+ elif test "${UNAME_MACHINE}" = "s390"; then
+ echo s390-ibm-linux && exit 0
+ elif test "${UNAME_MACHINE}" = "x86_64"; then
+ echo x86_64-unknown-linux-gnu && exit 0
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if __GLIBC__ >= 2
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
echo i386-sequent-sysv4
exit 0 ;;
- i*86:UNIX_SV:4.2MP:2.*)
+ i?86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2...
# I am not positive that other SVR4 systems won't match this,
# Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit 0 ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit 0 ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit 0 ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit 0 ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit 0 ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit 0 ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
fi
exit 0 ;;
- i*86:*:5:[78]*)
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ i?86:*:5:7*)
+ # Fixed at (any) Pentium or better
+ UNAME_MACHINE=i586
+ if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+ echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
exit 0 ;;
- i*86:*:3.2:*)
+ 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
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
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
&& UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit 0 ;;
+ i?86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
pc:*:*:*)
# Left here for compatibility:
# uname -m prints for DJGPP always 'pc', but it prints nothing about
# "miniframe"
echo m68010-convergent-sysv
exit 0 ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit 0 ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit 0 ;;
M68*:*:R3V[567]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4 && exit 0 ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ m68*:LynxOS:2.*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
exit 0 ;;
+ i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
- rs6000:LynxOS:2.*:*)
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE}
exit 0 ;;
echo ns32k-sni-sysv
fi
exit 0 ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
echo i586-unisys-sysv4
exit 0 ;;
*:UNIX_System_V:4*:FTX*)
# From seanf@swdc.stratus.com.
echo i860-stratus-sysv4
exit 0 ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit 0 ;;
mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE}
exit 0 ;;
SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE}
exit 0 ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit 0 ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
*:Darwin:*:*)
- case `uname -p` in
- *86) UNAME_PROCESSOR=i686 ;;
- powerpc) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ echo `uname -p`-apple-darwin${UNAME_RELEASE}
exit 0 ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
+ if test "${UNAME_MACHINE}" = "x86pc"; then
UNAME_MACHINE=pc
fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ echo `uname -p`-${UNAME_MACHINE}-nto-qnx
exit 0 ;;
*:QNX:*:4*)
echo i386-pc-qnx
exit 0 ;;
- NSR-?:NONSTOP_KERNEL:*:*)
+ NSR-[KW]:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit 0 ;;
BS2000:POSIX*:*:*)
echo bs2000-siemens-sysv
exit 0 ;;
fi
echo ${UNAME_MACHINE}-unknown-plan9
exit 0 ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit 0 ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit 0 ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit 0 ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit 0 ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit 0 ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit 0 ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit 0 ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit 0 ;;
+ *:OS/2:*:*)
+ echo ${UNAME_MACHINE}-pc-os2_emx
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>
#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
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
#endif
#if defined (alliant) && defined (i860)
}
EOF
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
# Apollos put the system type in the environment.
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
+The $version version of this script cannot recognize your system type.
+Please download the most up to date version of the config scripts:
ftp://ftp.gnu.org/pub/gnu/config/
pertinent to <config-patches@gnu.org> in order to provide the needed
information to handle your system.
-config.guess timestamp = $timestamp
+config.guess version = $version
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
+# time-stamp-start: "version='"
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "'"
# End:
-{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\froman Times New Roman;}{\f3\froman Times New Roman;}}
-{\colortbl\red0\green0\blue0;\red0\green0\blue255;}
-\deflang1033\pard\qc\plain\f2\fs28\b AFS Client for Windows 95/98 (\plain\f2\fs20\b Version 2.0.0.0 - 04/20/01 12:18 PM\plain\f2\fs28\b )
-\par \pard\plain\f2\fs28
-\par \plain\f2\fs20 Welcome to the Open AFS Client for Windows 95/98.
-\par
-\par This client will allow you to access files on sites stored all over the Internet as though the files were residing on your local machine. You can store your own files on the Internet to share with others, and can limit access to your files to specific users or groups of users. You can browse through the different AFS sites (known as \plain\f2\fs20\i cells\plain\f2\fs20 ) from a single file tree and use standard Windows programs such as Explorer to copy and manipulate files. You can open files stored on the Internet directly from Windows applications.
-\par
-\par One drive letter will be created on your machine by default - Z:. The Z: drive will be the root of the AFS tree, allowing you to browse all sites that have AFS servers available.
-\par
-\par This is a native Windows 9x client; a gateway machine is not required.
-\par
-\par \plain\f2\fs24\b System Requirements
-\par
-\par \plain\f2\fs20 IBM compatible PC running Windows 95 (see below) or 98
-\par 16 MB RAM
-\par 20 MB free disk space
-\par Client for Microsoft Networks must be installed
-\par TCP/IP protocol stack must be installed
-\par
-\par \plain\f2\fs24\b Getting Started
-\par \plain\f2\fs20
-\par To use the client, you will need to perform the following tasks after installation and reboot:
-\par
-\par 1) Boot up your machine and log in to Windows. (Note: if you bypass the login by hitting "Cancel" at the login screen, Windows networking will not work and you will not be able to mount your drives.)
-\par 2) Connect to the Internet or your company's intranet. (Note: If you are using the client in a firewalled intranet environment with private AFS cells, you will probably need a CellServDB file specific to your
-\par company's environment. Ask your system administrator.)
-\par 3) Check your system time, timezone, and date settings and make sure they are synchronized with the AFS server.
-\par 4) Start the AFS Client by double-clicking on the icon on the desktop or Start Menu.
-\par 5) A box will appear asking for your userid and password. Type them in and press "Connect". This will
-\par authenticate you to the AFS cell you specified at installation. (Note: You cannot use the GUI interface to authenticate to other cells at present. This will be added later. You can still authenticate to other cells using the "klog" command; see "Command Line Tools" below.) Use the "Save Password" checkbox to enable the AFS Client to save your password in the registry for use next time you run the AFS Client. (The password will be saved encrypted in the registry if you are running Windows 98 or have installed Internet Explorer version 4.0 or later. Otherwise, it will be saved in clear text. We recommend you do not use the save password feature if encryption is not available on your system.)
-\par 6) Now a Windows Explorer will start to allow you to browse your new Z: drive. Z: will be the root of the AFS tree.
-\par 7) By checking "Advanced Options", you can add and change your drive letter assignments. There is one share assigned by default, "all". (Note: the "all" share cannot be removed.) New shares must be assigned a unique share name and an AFS path. You can mount and unmount your AFS drives by checking or unchecking the box next to each drive letter. You can also set whether a drive will be automatically mounted at startup by highlighting the drive and clicking "Change".
-\par 8) You can kill or minimize the AFS client dialog window. Double click the icon in the system tray to restore it.
-\par 9) When you are ready to shut down the AFS client, bring up the AFS client dialog and click the "Disconnect" button. This will terminate the AFS daemon. Then click "Exit" to quit.
-\par
-\par Complete documentation for the AFS client is available at:
-\par http://www.openafs.org/dl/openafs/1.0.2/afs-3.6-doc.tar.gz
-\par
-\par \plain\f2\fs24\b Explorer Shell Extension
-\par
-\par \plain\f2\fs20 You can right click on items within an AFS tree to bring up an "AFS" menu item. Under this menu are various operations you can execute on a file or directory. The most useful item is "Access Control Lists" which allows you to view and edit the permissions of a particular directory.
-\par
-\par
-\par \plain\f2\fs24\b Command Line Tools
-\par
-\par \plain\f2\fs20 The following command line tools are available in the install directory. See the full documentation at the above URL for complete information on these commands:
-\par
-\par klog.exe: \tab Authenticate a user to a cell, e.g. "klog joeuser@mycell.com" \tab
-\par unlog.exe: \tab Unauthenticate to a cell\tab
-\par tokens.exe\tab List which tokens you have (cells you have authenticated to) and their expiration times\tab
-\par kpasswd.exe\tab Change your password for the specified cell\tab
-\par symlink.exe: \tab Create a symbolic link , e.g. "symlink make dest src" makes a link called "dest" pointing to file "src"\tab
-\par fs.exe: \tab This command is used for a number of file server functions. Type "fs help" for a list, and then "fs help function" to get detailed help for that function. See the documentation for more info.\tab
-\par fs help\tab list functions\tab
-\par fs listacl <directory>\tab show directory access control list\tab
-\par fs setacl <diretory> <acl>\tab set directory access control list\tab
-\par fs listquota <directory>\tab show directory disk quota\tab
-\par fs flushvolume <directory>\tab flush cached data from volume\tab
-\par pts.exe\tab This command is used for user administration functions. See the documentation for more info. (Note: this command currently does not work in Windows 95.)\tab
-\par
-\par \plain\f2\fs24\b Known Issues
-\par
-\par \pard\li720\fi-360\plain\f2\fs20 1) The Microsoft Visual Studio linker "link.exe" fails when writing to a file stored in AFS. It freezes the system for a minute or so and then times out. This problem may exist in other programs as well.
-\par 2) Occasionally the U: and Z: drive letters are not mapped automatically when the client is started. If this happens, you can map them manually by entering the commands:
-\par \pard\li1440\fi-360\tx1440\plain\f2\fs20 0net use u: \\\\mymachine-afs\\home
-\par 1net use z: \\\\mymachine-afs\\all
-\par 2where "mymachine" is the Windows networking name of your machine.
-\par \pard\li720\fi-360\plain\f2\fs20 3) The Windows file system does not understand symbolic links, so links to directories just look like normal directories. This can lead to problems when trying to recursively copy a directory, since following cyclical links can lead to infinite regress.
-\par 4) The Office 2000 install program seems to take a very long time to install Office 2000 to AFS.
-\par 5) You must log in to Windows for Windows networking to work correctly. If you bypass the login, AFS will time out trying to start the AFS client console, with the error "Connect can't continue: Network error adding Z:all."
-\par 6) Under certain configurations the AFS Client Console will report a cache error. This will prevent the AFS Client from initializing.
-\par 7) Infrequently Windows will incorrectly notify the AFS Control Panel that there are open files. If this prevents AFS from disconnecting, it will require you to reboot.
-\par \pard\plain\f2\fs20
-\par
-\par \plain\f2\fs24\b Legalities
-\par
-\par \pard\li720\ri810\plain\f2\fs24\i Copyright 2000, International Business Machines Corporation and others. All Rights Reserved. This software has been released under the terms of the IBM Public License. For details, see the LICENSE file in the top-level source directory or online at \plain\f2\fs24\cf1\i\ul http://www.openafs.org/dl/license10.html\plain\f2\fs24\b
-\par \pard\plain\f2\fs24\b
-\par \plain\f2\fs20 This program was compiled using the DJGPP compiler and includes object code copyrighted by DJ Delorie. The compiler and libraries are available at http://www.delorie.com.
-\par
-\par This program includes software developed by the University of California, Berkeley, and its contributors.
-\par
-\par This program has been distributed with, and uses the services of, the sock.vxd and mmap.vxd drivers written for the Coda project at http://www.coda.cs.cmu.edu and licensed under the GNU General Public License. Source code for these drivers is available at the above web site.
-\par
-\par
-\par }
+{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\froman Times New Roman;}{\f3\froman Times New Roman;}}\r
+{\colortbl\red0\green0\blue0;\red0\green0\blue255;}\r
+\deflang1033\pard\qc\plain\f2\fs28\b AFS Client for Windows 95/98 (\plain\f2\fs20\b Version 2.0.0.0 - 04/20/01 12:18 PM\plain\f2\fs28\b )\r
+\par \pard\plain\f2\fs28 \r
+\par \plain\f2\fs20 Welcome to the Open AFS Client for Windows 95/98.\r
+\par \r
+\par This client will allow you to access files on sites stored all over the Internet as though the files were residing on your local machine. You can store your own files on the Internet to share with others, and can limit access to your files to specific users or groups of users. You can browse through the different AFS sites (known as \plain\f2\fs20\i cells\plain\f2\fs20 ) from a single file tree and use standard Windows programs such as Explorer to copy and manipulate files. You can open files stored on the Internet directly from Windows applications.\r
+\par \r
+\par One drive letter will be created on your machine by default - Z:. The Z: drive will be the root of the AFS tree, allowing you to browse all sites that have AFS servers available.\r
+\par \r
+\par This is a native Windows 9x client; a gateway machine is not required.\r
+\par \r
+\par \plain\f2\fs24\b System Requirements\r
+\par \r
+\par \plain\f2\fs20 IBM compatible PC running Windows 95 (see below) or 98\r
+\par 16 MB RAM\r
+\par 20 MB free disk space\r
+\par Client for Microsoft Networks must be installed\r
+\par TCP/IP protocol stack must be installed\r
+\par \r
+\par \plain\f2\fs24\b Getting Started\r
+\par \plain\f2\fs20 \r
+\par To use the client, you will need to perform the following tasks after installation and reboot:\r
+\par \r
+\par 1) Boot up your machine and log in to Windows. (Note: if you bypass the login by hitting "Cancel" at the login screen, Windows networking will not work and you will not be able to mount your drives.)\r
+\par 2) Connect to the Internet or your company's intranet. (Note: If you are using the client in a firewalled intranet environment with private AFS cells, you will probably need a CellServDB file specific to your \r
+\par company's environment. Ask your system administrator.)\r
+\par 3) Check your system time, timezone, and date settings and make sure they are synchronized with the AFS server. \r
+\par 4) Start the AFS Client by double-clicking on the icon on the desktop or Start Menu.\r
+\par 5) A box will appear asking for your userid and password. Type them in and press "Connect". This will\r
+\par authenticate you to the AFS cell you specified at installation. (Note: You cannot use the GUI interface to authenticate to other cells at present. This will be added later. You can still authenticate to other cells using the "klog" command; see "Command Line Tools" below.) Use the "Save Password" checkbox to enable the AFS Client to save your password in the registry for use next time you run the AFS Client. (The password will be saved encrypted in the registry if you are running Windows 98 or have installed Internet Explorer version 4.0 or later. Otherwise, it will be saved in clear text. We recommend you do not use the save password feature if encryption is not available on your system.)\r
+\par 6) Now a Windows Explorer will start to allow you to browse your new Z: drive. Z: will be the root of the AFS tree.\r
+\par 7) By checking "Advanced Options", you can add and change your drive letter assignments. There is one share assigned by default, "all". (Note: the "all" share cannot be removed.) New shares must be assigned a unique share name and an AFS path. You can mount and unmount your AFS drives by checking or unchecking the box next to each drive letter. You can also set whether a drive will be automatically mounted at startup by highlighting the drive and clicking "Change".\r
+\par 8) You can kill or minimize the AFS client dialog window. Double click the icon in the system tray to restore it.\r
+\par 9) When you are ready to shut down the AFS client, bring up the AFS client dialog and click the "Disconnect" button. This will terminate the AFS daemon. Then click "Exit" to quit.\r
+\par \r
+\par Complete documentation for the AFS client is available at: \r
+\par http://www.openafs.org/dl/openafs/1.0.2/afs-3.6-doc.tar.gz\r
+\par \r
+\par \plain\f2\fs24\b Explorer Shell Extension\r
+\par \r
+\par \plain\f2\fs20 You can right click on items within an AFS tree to bring up an "AFS" menu item. Under this menu are various operations you can execute on a file or directory. The most useful item is "Access Control Lists" which allows you to view and edit the permissions of a particular directory. \r
+\par \r
+\par \r
+\par \plain\f2\fs24\b Command Line Tools\r
+\par \r
+\par \plain\f2\fs20 The following command line tools are available in the install directory. See the full documentation at the above URL for complete information on these commands:\r
+\par \r
+\par klog.exe: \tab Authenticate a user to a cell, e.g. "klog joeuser@mycell.com" \tab \r
+\par unlog.exe: \tab Unauthenticate to a cell\tab \r
+\par tokens.exe\tab List which tokens you have (cells you have authenticated to) and their expiration times\tab \r
+\par kpasswd.exe\tab Change your password for the specified cell\tab \r
+\par symlink.exe: \tab Create a symbolic link , e.g. "symlink make dest src" makes a link called "dest" pointing to file "src"\tab \r
+\par fs.exe: \tab This command is used for a number of file server functions. Type "fs help" for a list, and then "fs help function" to get detailed help for that function. See the documentation for more info.\tab \r
+\par fs help\tab list functions\tab \r
+\par fs listacl <directory>\tab show directory access control list\tab \r
+\par fs setacl <diretory> <acl>\tab set directory access control list\tab \r
+\par fs listquota <directory>\tab show directory disk quota\tab \r
+\par fs flushvolume <directory>\tab flush cached data from volume\tab \r
+\par pts.exe\tab This command is used for user administration functions. See the documentation for more info. (Note: this command currently does not work in Windows 95.)\tab \r
+\par \r
+\par \plain\f2\fs24\b Known Issues\r
+\par \r
+\par \pard\li720\fi-360\plain\f2\fs20 1) The Microsoft Visual Studio linker "link.exe" fails when writing to a file stored in AFS. It freezes the system for a minute or so and then times out. This problem may exist in other programs as well.\r
+\par 2) Occasionally the U: and Z: drive letters are not mapped automatically when the client is started. If this happens, you can map them manually by entering the commands:\r
+\par \pard\li1440\fi-360\tx1440\plain\f2\fs20 0net use u: \\\\mymachine-afs\\home\r
+\par 1net use z: \\\\mymachine-afs\\all\r
+\par 2where "mymachine" is the Windows networking name of your machine.\r
+\par \pard\li720\fi-360\plain\f2\fs20 3) The Windows file system does not understand symbolic links, so links to directories just look like normal directories. This can lead to problems when trying to recursively copy a directory, since following cyclical links can lead to infinite regress.\r
+\par 4) The Office 2000 install program seems to take a very long time to install Office 2000 to AFS.\r
+\par 5) You must log in to Windows for Windows networking to work correctly. If you bypass the login, AFS will time out trying to start the AFS client console, with the error "Connect can't continue: Network error adding Z:all."\r
+\par 6) Under certain configurations the AFS Client Console will report a cache error. This will prevent the AFS Client from initializing. \r
+\par 7) Infrequently Windows will incorrectly notify the AFS Control Panel that there are open files. If this prevents AFS from disconnecting, it will require you to reboot.\r
+\par \pard\plain\f2\fs20 \r
+\par \r
+\par \plain\f2\fs24\b Legalities\r
+\par \r
+\par \pard\li720\ri810\plain\f2\fs24\i Copyright 2000, International Business Machines Corporation and others. All Rights Reserved. This software has been released under the terms of the IBM Public License. For details, see the LICENSE file in the top-level source directory or online at \plain\f2\fs24\cf1\i\ul http://www.openafs.org/dl/license10.html\plain\f2\fs24\b \r
+\par \pard\plain\f2\fs24\b \r
+\par \plain\f2\fs20 This program was compiled using the DJGPP compiler and includes object code copyrighted by DJ Delorie. The compiler and libraries are available at http://www.delorie.com.\r
+\par \r
+\par This program includes software developed by the University of California, Berkeley, and its contributors.\r
+\par \r
+\par This program has been distributed with, and uses the services of, the sock.vxd and mmap.vxd drivers written for the Coda project at http://www.coda.cs.cmu.edu and licensed under the GNU General Public License. Source code for these drivers is available at the above web site.\r
+\par \r
+\par \r
+\par }\r
\0
\ No newline at end of file
-/*
-
-
- * Copyright 2000, International Business Machines Corporation and others.
-
-
- * All Rights Reserved.
-
-
- *
-
-
- * This software has been released under the terms of the IBM Public
-
-
- * License. For details, see the LICENSE file in the top-level source
-
-
- * directory or online at http://www.openafs.org/dl/license10.html
-
-
- */
-
-
-
-
-
-/*
-
-
- * Test pthread interaction with native Win32 threads
-
-
- *
-
-
- */
-
-
-
-
-
-
-
-
-#include <afs/param.h>
-
-
-#include <afs/stds.h>
-
-
-
-
-
-#include <windows.h>
-
-
-#include <stdio.h>
-
-
-#include <stdlib.h>
-
-
-
-
-
-extern "C" {
-
-
-#include <pthread.h>
-
-
-#include <assert.h>
-
-
-#include <rx/rx_queue.h>
-
-
-}
-
-
-
-
-
-
-
-
-#define nTESTS 3
-
-
-#define nPASSES_MAX 256
-
-
-
-
-
-
-
-
-/*
-
-
- * Test1 - Tests the main thread calling pthread_self()
-
-
- *
-
-
- */
-
-
-
-
-
-BOOL Test1 (void)
-
-
-{
-
-
- BOOL rc = TRUE;
-
-
- printf ("Begin Test1:\n");
-
-
-
-
-
- PVOID hSelf;
-
-
- if ((hSelf = pthread_self()) == NULL)
-
-
- rc = FALSE;
-
-
-
-
-
- printf (" 1: pthread_self() on main thread returned 0x%08lX\n", hSelf);
-
-
-
-
-
- printf ("--> Test1 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));
-
-
- return rc;
-
-
-}
-
-
-
-
-
-
-
-
-/*
-
-
- * Test2 - Tests a Win32 thread's ability to join onto a pthread
-
-
- *
-
-
- */
-
-
-#define TEST2_RETURNVALUE 'Test'
-
-
-
-
-
-DWORD WINAPI Test2_Thread1 (LPVOID lp)
-
-
-{
-
-
- printf (" 1-1: waiting for thread 2 to begin\n");
-
-
-
-
-
- while (!*(volatile DWORD*)lp)
-
-
- ;
-
-
-
-
-
- printf (" 1-1: calling pthread_join (0x%08lX)\n", *(DWORD*)lp);
-
-
-
-
-
- DWORD status;
-
-
- int rc;
-
-
- if ((rc = pthread_join ((pthread_t)(*(DWORD*)lp), (void**)&status)) != 0)
-
-
- {
-
-
- printf (" 1-1: pthread_join failed; rc=%lu\n", rc);
-
-
- return 0;
-
-
- }
-
-
-
-
-
- if (status != TEST2_RETURNVALUE)
-
-
- {
-
-
- printf (" 1-1: pthread_join succeeded with wrong status (rc=%lu)\n", status);
-
-
- return 0;
-
-
- }
-
-
-
-
-
- printf (" 1-1: pthread_join succeeded; terminating\n");
-
-
- return 1;
-
-
-}
-
-
-
-
-
-extern "C" void *Test2_Thread2 (void *pdwCommonParam)
-
-
-{
-
-
- printf (" 1-2: signalling that thread 2 began\n");
-
-
- *(volatile DWORD*)pdwCommonParam = (DWORD)pthread_self();
-
-
- Sleep (1500);
-
-
-
-
-
- printf (" 1-2: terminating\n");
-
-
- return (void*)TEST2_RETURNVALUE;
-
-
-}
-
-
-
-
-
-BOOL Test2 (void)
-
-
-{
-
-
- BOOL rc = TRUE;
-
-
- printf ("Begin Test2:\n");
-
-
-
-
-
- DWORD dwCommonParam = 0;
-
-
- DWORD idThread;
-
-
-
-
-
- printf (" 1: creating win32 thread\n");
-
-
- HANDLE hThread1 = CreateThread (0, 0, Test2_Thread1, (LPVOID)&dwCommonParam, 0, &idThread);
-
-
- Sleep(500);
-
-
-
-
-
- printf (" 1: creating pthread thread\n");
-
-
- pthread_t hThread2;
-
-
- pthread_create (&hThread2, NULL, Test2_Thread2, (void *)&dwCommonParam);
-
-
- Sleep(500);
-
-
-
-
-
- printf (" 1: blocking until win32 thread (thread1) terminates...\n");
-
-
-
-
-
- WaitForSingleObject (hThread1, INFINITE);
-
-
- GetExitCodeThread (hThread1, (ULONG*)&rc);
-
-
-
-
-
- printf (" 1: detected thread1 termination\n");
-
-
-
-
-
- printf ("--> Test2 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));
-
-
- return rc;
-
-
-}
-
-
-
-
-
-
-
-
-/*
-
-
- * Test3 - Makes sure the pthread library recognizes when native threads die
-
-
- *
-
-
- */
-
-
-
-
-
-DWORD WINAPI Test3_Thread1 (LPVOID lp)
-
-
-{
-
-
- LONG *pdw = (LONG*)lp;
-
-
-
-
-
- // We're awake. Do something pthready.
-
-
- //
-
-
- pthread_t pMe;
-
-
- if ((pMe = pthread_self()) == NULL)
-
-
- printf (" 3-1: could not get a pthread_self!\n");
-
-
- else
-
-
- printf (" 3-1: ready\n");
-
-
-
-
-
- InterlockedIncrement (pdw);
-
-
-
-
-
- // Now wait until we see the signal to die.
-
-
- //
-
-
- while (*(volatile LONG*)pdw != 5)
-
-
- ;
-
-
-
-
-
- printf (" 3-1: terminating\n");
-
-
- InterlockedIncrement (pdw);
-
-
- return 1;
-
-
-}
-
-
-
-
-
-
-
-
-DWORD WINAPI Test3_Thread2 (LPVOID lp)
-
-
-{
-
-
- LONG *pdw = (LONG*)lp;
-
-
-
-
-
- // We're awake. Do something pthready.
-
-
- //
-
-
- pthread_t pMe;
-
-
- if ((pMe = pthread_self()) == NULL)
-
-
- printf (" 3-2: could not get a pthread_self!\n");
-
-
- else
-
-
- printf (" 3-2: ready\n");
-
-
-
-
-
- InterlockedIncrement (pdw);
-
-
-
-
-
- // Now wait until we see the signal to die.
-
-
- //
-
-
- while (*(volatile LONG*)pdw != 7)
-
-
- ;
-
-
-
-
-
- printf (" 3-2: terminating\n");
-
-
- InterlockedIncrement (pdw);
-
-
- return 1;
-
-
-}
-
-
-
-
-
-
-
-
-extern "C" void *Test3_Thread3 (void *pdwParam)
-
-
-{
-
-
- LONG *pdw = (LONG*)pdwParam;
-
-
-
-
-
- // We're awake.
-
-
- //
-
-
- printf (" 3-3: ready\n");
-
-
- InterlockedIncrement (pdw);
-
-
-
-
-
- // Now wait until we see the signal to die.
-
-
- //
-
-
- while (*(volatile LONG*)pdw != 9)
-
-
- ;
-
-
-
-
-
- printf (" 3-3: terminating\n");
-
-
- InterlockedIncrement (pdw);
-
-
- return (void*)1;
-
-
-}
-
-
-
-
-
-
-
-
-extern "C" void *Test3_Thread4 (void *pdwParam)
-
-
-{
-
-
- LONG *pdw = (LONG*)pdwParam;
-
-
-
-
-
- // We're awake.
-
-
- //
-
-
- printf (" 3-4: ready\n");
-
-
- InterlockedIncrement (pdw);
-
-
-
-
-
- // Now wait until we see the signal to die.
-
-
- //
-
-
- while (*(volatile LONG*)pdw != 11)
-
-
- ;
-
-
-
-
-
- printf (" 3-4: terminating\n");
-
-
- InterlockedIncrement (pdw);
-
-
- return (void*)1;
-
-
-}
-
-
-
-
-
-
-
-
-extern "C" void *Test3_ThreadCount (void *pdwParam)
-
-
-{
-
-
- volatile LONG *pdw = (LONG*)pdwParam;
-
-
-
-
-
- pthread_t pMe;
-
-
- if ((pMe = pthread_self()) == NULL)
-
-
- return (void*)0;
-
-
-
-
-
- try {
-
-
- struct rx_queue *pNow = (rx_queue*)pMe;
-
-
-
-
-
- for (struct rx_queue *pWalk = pNow->next; pWalk != pNow; pWalk = pWalk->next)
-
-
- ++(*pdw);
-
-
-
-
-
- } catch(...) {
-
-
- *pdw = 0;
-
-
- }
-
-
-
-
-
- return (void*)*pdw;
-
-
-}
-
-
-
-
-
-size_t Test3_CountActiveQueue (void)
-
-
-{
-
-
- DWORD dwArg = 0;
-
-
- pthread_t pThread;
-
-
- pthread_create (&pThread, NULL, Test3_ThreadCount, (void *)&dwArg);
-
-
-
-
-
- DWORD status;
-
-
- int rc;
-
-
- if ((rc = pthread_join (pThread, (void**)&status)) != 0)
-
-
- {
-
-
- printf (" 3: counter: pthread_join failed; rc=%lu\n", rc);
-
-
- return 0;
-
-
- }
-
-
-
-
-
- return dwArg;
-
-
-}
-
-
-
-
-
-BOOL Test3 (void)
-
-
-{
-
-
- BOOL rc = TRUE;
-
-
- printf ("Begin Test3:\n");
-
-
-
-
-
- // Find the size of the active queue
-
-
- //
-
-
- size_t cInitialQueueSize;
-
-
- if ((cInitialQueueSize = Test3_CountActiveQueue()) == 0)
-
-
- {
-
-
- printf (" 3: unable to determine active queue size\n");
-
-
- rc = FALSE;
-
-
- }
-
-
- else
-
-
- {
-
-
- // Start two Win32 threads and two pthreads. We'll use a single, common
-
-
- // parameter for each thread: dwSignal. Each thread will increment the
-
-
- // signal param when it's ready for us to go; once that's done, a
-
-
- // thread will kill itself and inc the signal *again* each die we
-
-
- // increment the signal:
-
-
- //
-
-
- // starts at 0
-
-
- // thread 1 wakes up and incs signal to 1
-
-
- // thread 2 wakes up and incs signal to 2
-
-
- // thread 3 wakes up and incs signal to 3
-
-
- // thread 4 wakes up and incs signal to 4
-
-
- // we notice signal is 4, and we increment signal to 5
-
-
- // thread 1 notices signal is 5, incs to 6 and dies
-
-
- // we notice signal is 6, and we increment signal to 7
-
-
- // thread 1 notices signal is 7, incs to 8 and dies
-
-
- // we notice signal is 8, and we increment signal to 9
-
-
- // thread 1 notices signal is 9, incs to 10 and dies
-
-
- // we notice signal is 10, and we increment signal to 11
-
-
- // thread 1 notices signal is 11, incs to 12 and dies
-
-
- // we notice signal is 12 and finish our tests
-
-
- //
-
-
- volatile LONG dwSignal = 0;
-
-
- printf (" 3: creating test threads\n");
-
-
-
-
-
- DWORD idThread;
-
-
- CreateThread (0, 0, Test3_Thread1, (LPVOID)&dwSignal, 0, &idThread);
-
-
- Sleep (500);
-
-
-
-
-
- CreateThread (0, 0, Test3_Thread2, (LPVOID)&dwSignal, 0, &idThread);
-
-
- Sleep (500);
-
-
-
-
-
- pthread_attr_t attr;
-
-
- attr.is_joinable = PTHREAD_CREATE_DETACHED;
-
-
-
-
-
- pthread_t hThread;
-
-
- pthread_create (&hThread, &attr, Test3_Thread3, (void *)&dwSignal);
-
-
- Sleep (500);
-
-
-
-
-
- pthread_create (&hThread, &attr, Test3_Thread4, (void *)&dwSignal);
-
-
- Sleep (500);
-
-
-
-
-
- // Count the active queue again as soon as we're sure all the threads
-
-
- // are ready for us to do so.
-
-
- //
-
-
- while (dwSignal != 4)
-
-
- ;
-
-
-
-
-
- size_t cQueueSize;
-
-
- if ((cQueueSize = Test3_CountActiveQueue()) == 0)
-
-
- {
-
-
- printf (" 3: unable to determine active queue size\n");
-
-
- rc = FALSE;
-
-
- }
-
-
- else if (cQueueSize != cInitialQueueSize+4)
-
-
- {
-
-
- printf (" 3: error: active queue wasn't increased by 4\n");
-
-
- rc = FALSE;
-
-
- }
-
-
- else while (rc && (dwSignal < 12))
-
-
- {
-
-
- LONG dwTarget = dwSignal +2;
-
-
- InterlockedIncrement ((LONG*)&dwSignal);
-
-
-
-
-
- // wait for a thread to notice the change and kill itself
-
-
- while (dwSignal != dwTarget)
-
-
- ;
-
-
- Sleep (500); // give a little time for cleanup after thread incremented
-
-
-
-
-
- if ((cQueueSize = Test3_CountActiveQueue()) == 0)
-
-
- {
-
-
- printf (" 3: unable to determine active queue size (dwSignal=%ld)\n", dwSignal);
-
-
- rc = FALSE;
-
-
- }
-
-
- else if (cQueueSize != (cInitialQueueSize + 4 - ((dwTarget -4) /2)))
-
-
- {
-
-
- printf (" 3: active queue size did not diminish (dwSignal=%ld)\n", dwSignal);
-
-
- rc = FALSE;
-
-
- }
-
-
- }
-
-
- }
-
-
-
-
-
- printf ("--> Test3 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));
-
-
- return rc;
-
-
-}
-
-
-
-
-
-
-
-
-/*
-
-
- * main - Runs all tests (unless the command-line says otherwise)
-
-
- *
-
-
- */
-
-
-int main(int argc, char **argv)
-
-
-{
-
-
- DWORD iRunTest[nPASSES_MAX];
-
-
- for (size_t ii = 0; ii < nPASSES_MAX; ++ii)
-
-
- iRunTest[ii] = (ii < nTESTS) ? (ii+1) : 0;
-
-
-
-
-
- ii = 0;
-
-
- for (--argc,++argv; argc; --argc,++argv)
-
-
- {
-
-
- DWORD iTest;
-
-
- if ( ((iTest = (size_t)atol (*argv)) > 0) && (iTest <= nTESTS) )
-
-
- {
-
-
- if (ii == 0)
-
-
- memset (iRunTest, 0x00, sizeof(iRunTest));
-
-
- if (ii < nPASSES_MAX)
-
-
- iRunTest[ ii++ ] = iTest;
-
-
- }
-
-
- }
-
-
-
-
-
- BOOL rc = TRUE;
-
-
-
-
-
- for (ii = 0; ii < nPASSES_MAX; ++ii)
-
-
- {
-
-
- if (iRunTest[ ii ] == 0)
-
-
- break;
-
-
- else switch (iRunTest[ ii ])
-
-
- {
-
-
- case 1: if (!Test1()) rc = FALSE; break;
-
-
- case 2: if (!Test2()) rc = FALSE; break;
-
-
- case 3: if (!Test3()) rc = FALSE; break;
-
-
- }
-
-
- }
-
-
-
-
-
- return rc;
-
-
-}
-
-
-
-
-
+/*\r\r\r
+ * Copyright 2000, International Business Machines Corporation and others.\r\r\r
+ * All Rights Reserved.\r\r\r
+ * \r\r\r
+ * This software has been released under the terms of the IBM Public\r\r\r
+ * License. For details, see the LICENSE file in the top-level source\r\r\r
+ * directory or online at http://www.openafs.org/dl/license10.html\r\r\r
+ */\r\r\r
+\r\r\r
+/*\r\r\r
+ * Test pthread interaction with native Win32 threads\r\r\r
+ *\r\r\r
+ */\r\r\r
+\r\r\r
+\r\r\r
+#include <afs/param.h>\r\r\r
+#include <afs/stds.h>\r\r\r
+\r\r\r
+#include <windows.h>\r\r\r
+#include <stdio.h>\r\r\r
+#include <stdlib.h>\r\r\r
+\r\r\r
+extern "C" {\r\r\r
+#include <pthread.h>\r\r\r
+#include <assert.h>\r\r\r
+#include <rx/rx_queue.h>\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+#define nTESTS 3\r\r\r
+#define nPASSES_MAX 256\r\r\r
+\r\r\r
+\r\r\r
+/*\r\r\r
+ * Test1 - Tests the main thread calling pthread_self()\r\r\r
+ *\r\r\r
+ */\r\r\r
+\r\r\r
+BOOL Test1 (void)\r\r\r
+{\r\r\r
+ BOOL rc = TRUE;\r\r\r
+ printf ("Begin Test1:\n");\r\r\r
+\r\r\r
+ PVOID hSelf;\r\r\r
+ if ((hSelf = pthread_self()) == NULL)\r\r\r
+ rc = FALSE;\r\r\r
+\r\r\r
+ printf (" 1: pthread_self() on main thread returned 0x%08lX\n", hSelf);\r\r\r
+\r\r\r
+ printf ("--> Test1 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));\r\r\r
+ return rc;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+/*\r\r\r
+ * Test2 - Tests a Win32 thread's ability to join onto a pthread\r\r\r
+ *\r\r\r
+ */\r\r\r
+#define TEST2_RETURNVALUE 'Test'\r\r\r
+\r\r\r
+DWORD WINAPI Test2_Thread1 (LPVOID lp)\r\r\r
+{\r\r\r
+ printf (" 1-1: waiting for thread 2 to begin\n");\r\r\r
+\r\r\r
+ while (!*(volatile DWORD*)lp)\r\r\r
+ ;\r\r\r
+\r\r\r
+ printf (" 1-1: calling pthread_join (0x%08lX)\n", *(DWORD*)lp);\r\r\r
+\r\r\r
+ DWORD status;\r\r\r
+ int rc;\r\r\r
+ if ((rc = pthread_join ((pthread_t)(*(DWORD*)lp), (void**)&status)) != 0)\r\r\r
+ {\r\r\r
+ printf (" 1-1: pthread_join failed; rc=%lu\n", rc);\r\r\r
+ return 0;\r\r\r
+ }\r\r\r
+\r\r\r
+ if (status != TEST2_RETURNVALUE)\r\r\r
+ {\r\r\r
+ printf (" 1-1: pthread_join succeeded with wrong status (rc=%lu)\n", status);\r\r\r
+ return 0;\r\r\r
+ }\r\r\r
+\r\r\r
+ printf (" 1-1: pthread_join succeeded; terminating\n");\r\r\r
+ return 1;\r\r\r
+}\r\r\r
+\r\r\r
+extern "C" void *Test2_Thread2 (void *pdwCommonParam)\r\r\r
+{\r\r\r
+ printf (" 1-2: signalling that thread 2 began\n");\r\r\r
+ *(volatile DWORD*)pdwCommonParam = (DWORD)pthread_self();\r\r\r
+ Sleep (1500);\r\r\r
+\r\r\r
+ printf (" 1-2: terminating\n");\r\r\r
+ return (void*)TEST2_RETURNVALUE;\r\r\r
+}\r\r\r
+\r\r\r
+BOOL Test2 (void)\r\r\r
+{\r\r\r
+ BOOL rc = TRUE;\r\r\r
+ printf ("Begin Test2:\n");\r\r\r
+\r\r\r
+ DWORD dwCommonParam = 0;\r\r\r
+ DWORD idThread;\r\r\r
+\r\r\r
+ printf (" 1: creating win32 thread\n");\r\r\r
+ HANDLE hThread1 = CreateThread (0, 0, Test2_Thread1, (LPVOID)&dwCommonParam, 0, &idThread);\r\r\r
+ Sleep(500);\r\r\r
+\r\r\r
+ printf (" 1: creating pthread thread\n");\r\r\r
+ pthread_t hThread2;\r\r\r
+ pthread_create (&hThread2, NULL, Test2_Thread2, (void *)&dwCommonParam);\r\r\r
+ Sleep(500);\r\r\r
+\r\r\r
+ printf (" 1: blocking until win32 thread (thread1) terminates...\n");\r\r\r
+\r\r\r
+ WaitForSingleObject (hThread1, INFINITE);\r\r\r
+ GetExitCodeThread (hThread1, (ULONG*)&rc);\r\r\r
+\r\r\r
+ printf (" 1: detected thread1 termination\n");\r\r\r
+\r\r\r
+ printf ("--> Test2 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));\r\r\r
+ return rc;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+/*\r\r\r
+ * Test3 - Makes sure the pthread library recognizes when native threads die\r\r\r
+ *\r\r\r
+ */\r\r\r
+\r\r\r
+DWORD WINAPI Test3_Thread1 (LPVOID lp)\r\r\r
+{\r\r\r
+ LONG *pdw = (LONG*)lp;\r\r\r
+\r\r\r
+ // We're awake. Do something pthready.\r\r\r
+ //\r\r\r
+ pthread_t pMe;\r\r\r
+ if ((pMe = pthread_self()) == NULL)\r\r\r
+ printf (" 3-1: could not get a pthread_self!\n");\r\r\r
+ else\r\r\r
+ printf (" 3-1: ready\n");\r\r\r
+\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+\r\r\r
+ // Now wait until we see the signal to die.\r\r\r
+ //\r\r\r
+ while (*(volatile LONG*)pdw != 5)\r\r\r
+ ;\r\r\r
+\r\r\r
+ printf (" 3-1: terminating\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+ return 1;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+DWORD WINAPI Test3_Thread2 (LPVOID lp)\r\r\r
+{\r\r\r
+ LONG *pdw = (LONG*)lp;\r\r\r
+\r\r\r
+ // We're awake. Do something pthready.\r\r\r
+ //\r\r\r
+ pthread_t pMe;\r\r\r
+ if ((pMe = pthread_self()) == NULL)\r\r\r
+ printf (" 3-2: could not get a pthread_self!\n");\r\r\r
+ else\r\r\r
+ printf (" 3-2: ready\n");\r\r\r
+\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+\r\r\r
+ // Now wait until we see the signal to die.\r\r\r
+ //\r\r\r
+ while (*(volatile LONG*)pdw != 7)\r\r\r
+ ;\r\r\r
+\r\r\r
+ printf (" 3-2: terminating\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+ return 1;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+extern "C" void *Test3_Thread3 (void *pdwParam)\r\r\r
+{\r\r\r
+ LONG *pdw = (LONG*)pdwParam;\r\r\r
+\r\r\r
+ // We're awake.\r\r\r
+ //\r\r\r
+ printf (" 3-3: ready\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+\r\r\r
+ // Now wait until we see the signal to die.\r\r\r
+ //\r\r\r
+ while (*(volatile LONG*)pdw != 9)\r\r\r
+ ;\r\r\r
+\r\r\r
+ printf (" 3-3: terminating\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+ return (void*)1;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+extern "C" void *Test3_Thread4 (void *pdwParam)\r\r\r
+{\r\r\r
+ LONG *pdw = (LONG*)pdwParam;\r\r\r
+\r\r\r
+ // We're awake.\r\r\r
+ //\r\r\r
+ printf (" 3-4: ready\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+\r\r\r
+ // Now wait until we see the signal to die.\r\r\r
+ //\r\r\r
+ while (*(volatile LONG*)pdw != 11)\r\r\r
+ ;\r\r\r
+\r\r\r
+ printf (" 3-4: terminating\n");\r\r\r
+ InterlockedIncrement (pdw);\r\r\r
+ return (void*)1;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+extern "C" void *Test3_ThreadCount (void *pdwParam)\r\r\r
+{\r\r\r
+ volatile LONG *pdw = (LONG*)pdwParam;\r\r\r
+\r\r\r
+ pthread_t pMe;\r\r\r
+ if ((pMe = pthread_self()) == NULL)\r\r\r
+ return (void*)0;\r\r\r
+\r\r\r
+ try {\r\r\r
+ struct rx_queue *pNow = (rx_queue*)pMe;\r\r\r
+\r\r\r
+ for (struct rx_queue *pWalk = pNow->next; pWalk != pNow; pWalk = pWalk->next)\r\r\r
+ ++(*pdw);\r\r\r
+\r\r\r
+ } catch(...) {\r\r\r
+ *pdw = 0;\r\r\r
+ }\r\r\r
+\r\r\r
+ return (void*)*pdw;\r\r\r
+}\r\r\r
+\r\r\r
+size_t Test3_CountActiveQueue (void)\r\r\r
+{\r\r\r
+ DWORD dwArg = 0;\r\r\r
+ pthread_t pThread;\r\r\r
+ pthread_create (&pThread, NULL, Test3_ThreadCount, (void *)&dwArg);\r\r\r
+\r\r\r
+ DWORD status;\r\r\r
+ int rc;\r\r\r
+ if ((rc = pthread_join (pThread, (void**)&status)) != 0)\r\r\r
+ {\r\r\r
+ printf (" 3: counter: pthread_join failed; rc=%lu\n", rc);\r\r\r
+ return 0;\r\r\r
+ }\r\r\r
+\r\r\r
+ return dwArg;\r\r\r
+}\r\r\r
+\r\r\r
+BOOL Test3 (void)\r\r\r
+{\r\r\r
+ BOOL rc = TRUE;\r\r\r
+ printf ("Begin Test3:\n");\r\r\r
+\r\r\r
+ // Find the size of the active queue\r\r\r
+ //\r\r\r
+ size_t cInitialQueueSize;\r\r\r
+ if ((cInitialQueueSize = Test3_CountActiveQueue()) == 0)\r\r\r
+ {\r\r\r
+ printf (" 3: unable to determine active queue size\n");\r\r\r
+ rc = FALSE;\r\r\r
+ }\r\r\r
+ else\r\r\r
+ {\r\r\r
+ // Start two Win32 threads and two pthreads. We'll use a single, common\r\r\r
+ // parameter for each thread: dwSignal. Each thread will increment the\r\r\r
+ // signal param when it's ready for us to go; once that's done, a\r\r\r
+ // thread will kill itself and inc the signal *again* each die we\r\r\r
+ // increment the signal:\r\r\r
+ //\r\r\r
+ // starts at 0\r\r\r
+ // thread 1 wakes up and incs signal to 1\r\r\r
+ // thread 2 wakes up and incs signal to 2\r\r\r
+ // thread 3 wakes up and incs signal to 3\r\r\r
+ // thread 4 wakes up and incs signal to 4\r\r\r
+ // we notice signal is 4, and we increment signal to 5\r\r\r
+ // thread 1 notices signal is 5, incs to 6 and dies\r\r\r
+ // we notice signal is 6, and we increment signal to 7\r\r\r
+ // thread 1 notices signal is 7, incs to 8 and dies\r\r\r
+ // we notice signal is 8, and we increment signal to 9\r\r\r
+ // thread 1 notices signal is 9, incs to 10 and dies\r\r\r
+ // we notice signal is 10, and we increment signal to 11\r\r\r
+ // thread 1 notices signal is 11, incs to 12 and dies\r\r\r
+ // we notice signal is 12 and finish our tests\r\r\r
+ //\r\r\r
+ volatile LONG dwSignal = 0;\r\r\r
+ printf (" 3: creating test threads\n");\r\r\r
+\r\r\r
+ DWORD idThread;\r\r\r
+ CreateThread (0, 0, Test3_Thread1, (LPVOID)&dwSignal, 0, &idThread);\r\r\r
+ Sleep (500);\r\r\r
+\r\r\r
+ CreateThread (0, 0, Test3_Thread2, (LPVOID)&dwSignal, 0, &idThread);\r\r\r
+ Sleep (500);\r\r\r
+\r\r\r
+ pthread_attr_t attr;\r\r\r
+ attr.is_joinable = PTHREAD_CREATE_DETACHED;\r\r\r
+\r\r\r
+ pthread_t hThread;\r\r\r
+ pthread_create (&hThread, &attr, Test3_Thread3, (void *)&dwSignal);\r\r\r
+ Sleep (500);\r\r\r
+\r\r\r
+ pthread_create (&hThread, &attr, Test3_Thread4, (void *)&dwSignal);\r\r\r
+ Sleep (500);\r\r\r
+\r\r\r
+ // Count the active queue again as soon as we're sure all the threads\r\r\r
+ // are ready for us to do so.\r\r\r
+ //\r\r\r
+ while (dwSignal != 4)\r\r\r
+ ;\r\r\r
+\r\r\r
+ size_t cQueueSize;\r\r\r
+ if ((cQueueSize = Test3_CountActiveQueue()) == 0)\r\r\r
+ {\r\r\r
+ printf (" 3: unable to determine active queue size\n");\r\r\r
+ rc = FALSE;\r\r\r
+ }\r\r\r
+ else if (cQueueSize != cInitialQueueSize+4)\r\r\r
+ {\r\r\r
+ printf (" 3: error: active queue wasn't increased by 4\n");\r\r\r
+ rc = FALSE;\r\r\r
+ }\r\r\r
+ else while (rc && (dwSignal < 12))\r\r\r
+ {\r\r\r
+ LONG dwTarget = dwSignal +2;\r\r\r
+ InterlockedIncrement ((LONG*)&dwSignal);\r\r\r
+\r\r\r
+ // wait for a thread to notice the change and kill itself\r\r\r
+ while (dwSignal != dwTarget)\r\r\r
+ ;\r\r\r
+ Sleep (500); // give a little time for cleanup after thread incremented\r\r\r
+\r\r\r
+ if ((cQueueSize = Test3_CountActiveQueue()) == 0)\r\r\r
+ {\r\r\r
+ printf (" 3: unable to determine active queue size (dwSignal=%ld)\n", dwSignal);\r\r\r
+ rc = FALSE;\r\r\r
+ }\r\r\r
+ else if (cQueueSize != (cInitialQueueSize + 4 - ((dwTarget -4) /2)))\r\r\r
+ {\r\r\r
+ printf (" 3: active queue size did not diminish (dwSignal=%ld)\n", dwSignal);\r\r\r
+ rc = FALSE;\r\r\r
+ }\r\r\r
+ }\r\r\r
+ }\r\r\r
+\r\r\r
+ printf ("--> Test3 %s\n", (rc) ? TEXT("succeeded") : TEXT("FAILED\a\a\a"));\r\r\r
+ return rc;\r\r\r
+}\r\r\r
+\r\r\r
+\r\r\r
+/*\r\r\r
+ * main - Runs all tests (unless the command-line says otherwise)\r\r\r
+ *\r\r\r
+ */\r\r\r
+int main(int argc, char **argv)\r\r\r
+{\r\r\r
+ DWORD iRunTest[nPASSES_MAX];\r\r\r
+ for (size_t ii = 0; ii < nPASSES_MAX; ++ii)\r\r\r
+ iRunTest[ii] = (ii < nTESTS) ? (ii+1) : 0;\r\r\r
+\r\r\r
+ ii = 0;\r\r\r
+ for (--argc,++argv; argc; --argc,++argv)\r\r\r
+ {\r\r\r
+ DWORD iTest;\r\r\r
+ if ( ((iTest = (size_t)atol (*argv)) > 0) && (iTest <= nTESTS) )\r\r\r
+ {\r\r\r
+ if (ii == 0)\r\r\r
+ memset (iRunTest, 0x00, sizeof(iRunTest));\r\r\r
+ if (ii < nPASSES_MAX)\r\r\r
+ iRunTest[ ii++ ] = iTest;\r\r\r
+ }\r\r\r
+ }\r\r\r
+\r\r\r
+ BOOL rc = TRUE;\r\r\r
+\r\r\r
+ for (ii = 0; ii < nPASSES_MAX; ++ii)\r\r\r
+ {\r\r\r
+ if (iRunTest[ ii ] == 0)\r\r\r
+ break;\r\r\r
+ else switch (iRunTest[ ii ])\r\r\r
+ {\r\r\r
+ case 1: if (!Test1()) rc = FALSE; break;\r\r\r
+ case 2: if (!Test2()) rc = FALSE; break;\r\r\r
+ case 3: if (!Test3()) rc = FALSE; break;\r\r\r
+ }\r\r\r
+ }\r\r\r
+\r\r\r
+ return rc;\r\r\r
+}\r\r\r
+\r\r\r