From: Chip Salzenberg Date: Thu, 15 May 1997 22:15:00 +0000 (+1200) Subject: [differences between cumulative patch application and perl5.004] X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=84c476bd7dc489e0b953be0e097d1a3adfd610d4;hp=3bf198a5e20d135d4136d3233d58cf49a70772d9;p=p5sagit%2Fp5-mst-13.2.git [differences between cumulative patch application and perl5.004] --- diff --git a/Changes b/Changes index 8677e9e..0b1317d 100644 --- a/Changes +++ b/Changes @@ -45,6 +45,182 @@ And the Keepers of the Patch Pumpkin: Chip Salzenberg +------------- +Version 5.004 +------------- + +"Hey, Rocky! Watch me pull a release out of my hat!" +"Aww, that trick never works..." + + CORE LANGUAGE CHANGES + + Title: "Make C reset pos on failure; make C not reset" + From: Chip Salzenberg + Files: dump.c op.c op.h pod/perldelta.pod pod/perlfaq6.pod + pod/perlop.pod pod/perlre.pod pp_ctl.c pp_hot.c regcomp.c + t/op/pat.t toke.c + + Title: "SECURITY: Forbid exec() if $ENV{BASH_ENV} is tainted" + From: Chip Salzenberg + Files: pod/perldelta.pod pod/perlrun.pod pod/perlsec.pod t/op/taint.t + taint.c + + Title: "Allow exec() if $ENV{TERM} is tainted but innocuous" + From: Chip Salzenberg + Files: pod/perldelta.pod pod/perlrun.pod pod/perlsec.pod t/op/taint.t + taint.c + + Title: "Allow globbing when tainted under VMS (no external program)" + From: Chip Salzenberg + Files: pp_sys.c t/op/taint.t + + CORE PORTABILITY + + Title: "Make Irix hints adapt when n32 libm.so is missing" + From: Chip Salzenberg + Files: hints/irix_6.sh + + Title: "Fix default HP-UX installation path" + From: Jeff Okamoto + Msg-ID: <199705132228.AA227042483@hpcc123.corp.hp.com> + Date: Tue, 13 May 1997 15:28:04 -0700 + Files: hints/hpux.sh + + Title: "VMS update, including socket support (four patches)" + From: Jonathan Hudson , + Peter Prymmer , + Dan Sugalski + Files: vms/config.vms vms/descrip.mms vms/sockadapt.h vms/vms.c + vms/vmsish.h + + Title: "Win32 update (three patches)" + From: Gurusamy Sarathy + Files: README.win32 perl.c win32/Makefile win32/config.H + win32/config_h.PL win32/config_sh.PL win32/makedef.pl + win32/win32.c win32/win32.h win32/win32io.c win32/win32io.h + win32/win32iop.h + + Title: "Don't require executable bit on perl -S if DOSISH" + From: Danny Sadinoff + Msg-ID: <337351CE.79B28DE3@olf.com> + Date: Fri, 09 May 1997 12:33:18 -0400 + Files: perl.c + + OTHER CORE CHANGES + + Title: "In C, always call &func in scalar context" + From: Chip Salzenberg + Files: op.c + + Title: "Fix recursive substitution" + From: Chip Salzenberg; test from Tim Bunce + Files: cop.h global.sym pp_ctl.c proto.h scope.c t/op/subst.t + + Title: "Make read with <> from a TTY notice EOF" + From: Jonathan I. Kamens + Msg-ID: <199705121147.HAA03845@jik.saturn.net> + Date: Mon, 12 May 1997 07:47:13 -0400 + Files: sv.c + + Title: "Fix core dump from get*() functions returning no alias array" + From: Chip Salzenberg + Files: pp_sys.c + + Title: "Fix typo" + From: Mark K Trettin + Msg-ID: <199705102228.RAA11163@gv18c.ih.lucent.com> + Date: Sat, 10 May 1997 17:28:35 -0500 + Files: pp_sys.c + + BUILD PROCESS + + Title: "Don't use 'unset' in Configure" + From: Chip Salzenberg + Files: Configure + + Title: "Protect against having no such command as 'cc'" + From: Hans Mulder + Msg-ID: <1997May12.163534.2006434@hmivax.humgen.upenn.edu> + Date: Mon, 12 May 1997 16:35:34 -0400 (EDT) + Files: Configure + + Title: "minor wording enhancement for Configure" + From: Jarkko Hietaniemi + Msg-ID: <199705101038.NAA00471@alpha.hut.fi> + Date: Sat, 10 May 1997 13:38:31 +0300 (EET DST) + Files: Configure + + LIBRARY AND EXTENSIONS + + Title: "Refresh CGI.pm to 2.36" + From: Lincoln Stein + Files: eg/cgi/frameset.cgi eg/cgi/javascript.cgi lib/CGI.pm + + Title: "In IO::File::open, prepend './' less often (for Win32 et al)" + From: Chip Salzenberg + Files: ext/IO/lib/IO/File.pm + + Title: "Fix core dump on IO::Seekable::setpos($fh, undef)" + From: Chip Salzenberg + Files: ext/IO/IO.xs t/lib/io_xs.t + + TESTS + + Title: "Make rand.t vanishingly unlikely to give false failure" + From: Tom Phoenix + Msg-ID: + Date: Sat, 10 May 1997 19:57:30 -0700 (PDT) + Files: t/op/rand.t + + Title: "Fix sleep test: sleep(N) is defined to allow sleeping N-1" + From: Chuck D. Phillips + Msg-ID: <199705151735.KAA01143@palrel1.hp.com> + Date: Thu, 15 May 1997 11:35:41 -0600 + Files: t/op/sleep.t + + UTILITIES + + Title: "h2xs and @EXPORT_OK" + From: Jeff Okamoto + Msg-ID: <199705092348.AA057881699@hpcc123.corp.hp.com> + Date: Fri, 9 May 1997 16:48:20 -0700 + Files: utils/h2xs.PL + + DOCUMENTATION + + Title: "Tweaks for perldelta" + From: hansm@euronet.nl + Msg-ID: <199705102346.BAA17300@mail.euronet.nl> + Date: Sun, 11 May 97 01:46:00 +0200 + Files: pod/perldelta.pod + + Title: "Mention perlfaq.pod and perlmodlib.pod in perldelta.pod" + From: Chip Salzenberg + Files: pod/perldelta.pod + + Title: "Fix example of use of lexicals with formats" + From: Chip Salzenberg + Files: pod/perldelta.pod + + Title: "Explain that destruction order is not defined" + From: Gurusamy Sarathy + Msg-ID: <199705150600.CAA13550@aatma.engin.umich.edu> + Date: Thu, 15 May 1997 02:00:23 -0400 + Files: pod/perltoot.pod + + Title: "Note that DATA filehandle is unavailable during BEGIN {}" + From: neilb@cre.canon.co.uk (Neil Bowers) + Msg-ID: <199705121227.NAA29718@tardis.cre.canon.co.uk> + Date: Mon, 12 May 1997 13:27:43 +0100 + Files: pod/perldata.pod + + Title: "More detailed IO::Socket documentation" + From: Tom Christiansen + Msg-ID: <199705141456.IAA19061@jhereg.perl.com> + Date: Wed, 14 May 1997 08:56:30 -0600 + Files: pod/perlipc.pod + + ----------------- Version 5.003_99a ----------------- diff --git a/Configure b/Configure index 6eedea8..0071a7c 100755 --- a/Configure +++ b/Configure @@ -85,8 +85,11 @@ done PATH=.$p_$PATH export PATH -: This should not matter in a script, but apparently it does sometimes -unset CDPATH +: This should not matter in scripts, but apparently it does, sometimes +case "$CDPATH" in +'') ;; +*) CDPATH='' ;; +esac : Sanity checks if test ! -t 0; then @@ -115,6 +118,7 @@ EOM especially on older exotic systems. If yours does, try the Bourne shell instead.) EOM + unset ENV fi fi else @@ -2997,8 +3001,8 @@ main() { #endif } EOP - cc -o pdp11 pdp11.c >/dev/null 2>&1 - if ./pdp11 2>/dev/null; then + (cc -o pdp11 pdp11.c) >/dev/null 2>&1 + if $test -f pdp11 && ./pdp11 2>/dev/null; then dflt='unsplit split' else tans=`./loc . X /lib/small /lib/large /usr/lib/small /usr/lib/large /lib/medium /usr/lib/medium /lib/huge` @@ -8285,7 +8289,7 @@ EOCP if $cc $optimize $ccflags $ldflags -o try try.c $libs && ./try; then echo 'Looks OK. (Perl supports up to version 1.86).' >&4 else - echo "I can't use your Berkeley DB. I'll disable it." >&4 + echo "I can't use Berkeley DB with your . I'll disable Berkeley DB." >&4 i_db=$undef case " $libs " in *"-ldb "*) diff --git a/Configure.orig b/Configure.orig deleted file mode 100755 index 6eedea8..0000000 --- a/Configure.orig +++ /dev/null @@ -1,10560 +0,0 @@ -#! /bin/sh -# -# If these # comments don't work, trim them. Don't worry about any other -# shell scripts, Configure will trim # comments from them for you. -# -# (If you are trying to port this package to a machine without sh, -# I would suggest you have a look at the prototypical config_h.SH file -# and edit it to reflect your system. Some packages may include samples -# of config.h for certain machines, so you might look for one of those.) -# -# Yes, you may rip this off to use in other distribution packages. This -# script belongs to the public domain and cannot be copyrighted. -# -# (Note: this Configure script was generated automatically. Rather than -# working with this copy of Configure, you may wish to get metaconfig. -# The dist-3.0 package (which contains metaconfig) was posted in -# comp.sources.misc so you may fetch it yourself from your nearest -# archive site. Check with Archie if you don't know where that can be.) -# - -# $Id: Head.U,v 3.0.1.8 1995/07/25 13:40:02 ram Exp $ -# -# Generated on Sat Feb 1 00:26:40 EST 1997 [metaconfig 3.0 PL60] - -cat >/tmp/c1$$ </tmp/c2$$ </dev/null` - test "$me" || me=$0 - ;; -esac - -: Proper PATH separator -p_=: -: On OS/2 this directory should exist if this is not floppy only system :-] -if test -d c:/. -a -n "$OS2_SHELL"; then - p_=\; - PATH=`cmd /c "echo %PATH%" | tr '\\\\' / ` - OS2_SHELL=`cmd /c "echo %OS2_SHELL%" | tr '\\\\' / | tr '[A-Z]' '[a-z]'` -fi - -: Proper PATH setting -paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin' -paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin" -paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin" -paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin" -paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb" -paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /usr/ccs/bin" -paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib" -paths="$paths /sbin /usr/sbin /usr/libexec" - -for p in $paths -do - case "$p_$PATH$p_" in - *$p_$p$p_*) ;; - *) test -d $p && PATH=$PATH$p_$p ;; - esac -done - -PATH=.$p_$PATH -export PATH - -: This should not matter in a script, but apparently it does sometimes -unset CDPATH - -: Sanity checks -if test ! -t 0; then - echo "Say 'sh $me', not 'sh <$me'" - exit 1 -fi - -: Test and see if we are running under ksh, either blatantly or in disguise. -if (PATH=.; alias -x) >/dev/null 2>&1; then - : running under ksh. Is this a good thing? - if test -d /usr/lpp -a -f /usr/bin/bsh -a -f /usr/bin/uname ; then - if test X`/usr/bin/uname -v` = X4 ; then - : on AIX 4, /bin/sh is really ksh, and it causes us problems. - : Avoid it - cat <<'EOM' -(Feeding myself to /usr/bin/bsh to avoid AIX 4's /bin/sh.) -EOM - unset ENV - exec /usr/bin/bsh $0 "$@" - fi - else - if test ! -f /hp-ux ; then - : Warn them if they use ksh on other systems - cat <&2 -$me: Fatal Error: I can't find a Bourne Shell anywhere. -Usually it's in /bin/sh. How did you even get this far? -Please contact me (Chip Salzenberg) at chip@perl.com and -we'll try to straigten this all out. -EOM - exit 1 - ;; -esac - -: see if sh knows # comments -if `$sh -c '#' >/dev/null 2>&1`; then - shsharp=true - spitshell=cat - echo " " - xcat=/bin/cat - test -f $xcat || xcat=/usr/bin/cat - echo "#!$xcat" >try - $eunicefix try - chmod +x try - ./try > today - if test -s today; then - sharpbang='#!' - else - echo "#! $xcat" > try - $eunicefix try - chmod +x try - ./try > today - if test -s today; then - sharpbang='#! ' - else - echo "Okay, let's see if #! works on this system..." - echo "It's just a comment." - sharpbang=': use ' - fi - fi -else - echo "Your $sh doesn't grok # comments--I will strip them later on." - shsharp=false - cd .. - echo "exec grep -v '^[ ]*#'" >spitshell - chmod +x spitshell - $eunicefix spitshell - spitshell=`pwd`/spitshell - cd UU - echo "I presume that if # doesn't work, #! won't work either!" - sharpbang=': use ' -fi -rm -f try today - -: figure out how to guarantee sh startup -case "$startsh" in -'') startsh=${sharpbang}${sh} ;; -*) -esac -cat >try <extract <>extract <<'EOS' -CONFIG=true -echo "Doing variable substitutions on .SH files..." -if test -f MANIFEST; then - shlist=`awk '{print $1}' options.awk <<'EOF' -BEGIN { - optstr = "dD:eEf:hKOrsSU:V"; # getopt-style specification - - len = length(optstr); - for (i = 1; i <= len; i++) { - c = substr(optstr, i, 1); - if (i < len) a = substr(optstr, i + 1, 1); else a = ""; - if (a == ":") { - arg[c] = 1; - i++; - } - opt[c] = 1; - } -} -{ - expect = 0; - str = $0; - if (substr(str, 1, 1) != "-") { - printf("'%s'\n", str); - next; - } - len = length($0); - for (i = 2; i <= len; i++) { - c = substr(str, i, 1); - if (!opt[c]) { - printf("-%s\n", substr(str, i)); - next; - } - printf("-%s\n", c); - if (arg[c]) { - if (i < len) - printf("'%s'\n", substr(str, i + 1)); - else - expect = 1; - next; - } - } -} -END { - if (expect) - print "?"; -} -EOF - -: process the command line options -set X `for arg in "$@"; do echo "X$arg"; done | - sed -e s/X// | awk -f options.awk` -eval "set $*" -shift -rm -f options.awk - -: set up default values -fastread='' -reuseval=false -config_sh='' -alldone='' -error='' -silent='' -extractsh='' -override='' -knowitall='' - -rm -f optdef.sh -cat >optdef.sh <&2 - error=true - fi - cd UU - shift;; - -h) shift; error=true;; - -r) shift; reuseval=true;; - -s) shift; silent=true;; - -E) shift; alldone=exit;; - -K) shift; knowitall=true;; - -O) shift; override=true;; - -S) shift; extractsh=true;; - -D) - shift - case "$1" in - *=) - echo "$me: use '-U symbol=', not '-D symbol='." >&2 - echo "$me: ignoring -D $1" >&2 - ;; - *=*) echo "$1" | \ - sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;; - *) echo "$1='define'" >> optdef.sh;; - esac - shift - ;; - -U) - shift - case "$1" in - *=) echo "$1" >> optdef.sh;; - *=*) - echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2 - echo "$me: ignoring -U $1" >&2 - ;; - *) echo "$1='undef'" >> optdef.sh;; - esac - shift - ;; - -V) echo "$me generated by metaconfig 3.0 PL60." >&2 - exit 0;; - --) break;; - -*) echo "$me: unknown option $1" >&2; shift; error=true;; - *) break;; - esac -done - -case "$error" in -true) - cat >&2 <&1 -case "$silent" in -true) exec 1>/dev/null;; -esac - -: run the defines and the undefines, if any, but leave the file out there... -touch optdef.sh -. ./optdef.sh - -case "$extractsh" in -true) - case "$config_sh" in - '') config_sh='config.sh'; config='./config.sh';; - /*) config="$config_sh";; - *) config="./$config_sh";; - esac - echo " " - echo "Fetching answers from $config_sh..." - cd .. - . $config - test "$override" && . ./optdef.sh - echo " " - . ./UU/extract - rm -rf UU - echo "Done." - exit 0 - ;; -esac - -: set package name -package=perl5 -first=`echo $package | sed -e 's/^\(.\).*/\1/'` -last=`echo $package | sed -e 's/^.\(.*\)/\1/'` -case "`echo AbyZ | tr '[:lower:]' '[:upper:]' 2>/dev/null`" in -ABYZ) spackage=`echo $first | tr '[:lower:]' '[:upper:]'`$last;; -*) spackage=`echo $first | tr '[a-z]' '[A-Z]'`$last;; -esac - -: Eunice requires " " instead of "", can you believe it -echo " " -: Here we go... -echo "Beginning of configuration questions for $package." - -trap 'echo " "; test -d ../UU && rm -rf X $rmlist; exit 1' 1 2 3 15 - -: Some greps do not return status, grrr. -echo "grimblepritz" >grimble -if grep blurfldyick grimble >/dev/null 2>&1 ; then - contains=contains -elif grep grimblepritz grimble >/dev/null 2>&1 ; then - contains=grep -else - contains=contains -fi -rm -f grimble -: the following should work in any shell -case "$contains" in -contains*) - echo " " - echo "AGH! Grep doesn't return a status. Attempting remedial action." - cat >contains <<'EOSS' -grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp -EOSS -chmod +x contains -esac - -: first determine how to suppress newline on echo command -echo " " -echo "Checking echo to see how to suppress newlines..." -(echo "hi there\c" ; echo " ") >.echotmp -if $contains c .echotmp >/dev/null 2>&1 ; then - echo "...using -n." - n='-n' - c='' -else - cat <<'EOM' -...using \c -EOM - n='' - c='\c' -fi -echo $n "The star should be here-->$c" -echo '*' -rm -f .echotmp - -: Now test for existence of everything in MANIFEST -echo " " -if test -f ../MANIFEST; then - echo "First let's make sure your kit is complete. Checking..." >&4 - awk '$1 !~ /PACK[A-Z]+/ {print $1}' ../MANIFEST | split -50 - rm -f missing - for filelist in x??; do - (cd ..; ls `cat UU/$filelist` >/dev/null 2>>UU/missing) - done - if test -s missing; then - cat missing >&4 - cat >&4 <<'EOM' - -THIS PACKAGE SEEMS TO BE INCOMPLETE. - -You have the option of continuing the configuration process, despite the -distinct possibility that your kit is damaged, by typing 'y'es. If you -do, don't blame me if something goes wrong. I advise you to type 'n'o -and contact the author (chip@perl.com). - -EOM - echo $n "Continue? [n] $c" >&4 - read ans - case "$ans" in - y*) - echo "Continuing..." >&4 - rm -f missing - ;; - *) - echo "ABORTING..." >&4 - kill $$ - ;; - esac - else - echo "Looks good..." >&4 - fi -else - echo "There is no MANIFEST file. I hope your kit is complete !" -fi -rm -f missing x?? - -: compute the number of columns on the terminal for proper question formatting -case "$COLUMNS" in -'') COLUMNS='80';; -esac - -: set up the echo used in my read -myecho="case \"\$xxxm\" in -'') echo $n \"\$rp $c\" >&4;; -*) case \"\$rp\" in - '') echo $n \"[\$xxxm] $c\";; - *) - if test \`echo \"\$rp [\$xxxm] \" | wc -c\` -ge $COLUMNS; then - echo \"\$rp\" >&4 - echo $n \"[\$xxxm] $c\" >&4 - else - echo $n \"\$rp [\$xxxm] $c\" >&4 - fi - ;; - esac;; -esac" - -: now set up to do reads with possible shell escape and default assignment -cat <myread -$startsh -xxxm=\$dflt -$myecho -ans='!' -case "\$fastread" in -yes) case "\$dflt" in - '') ;; - *) ans=''; - case "\$silent-\$rp" in - true-) ;; - *) echo " " >&4;; - esac;; - esac;; -*) case "\$silent" in - true) case "\$rp" in - '') ans='';; - esac;; - esac;; -esac -while expr "X\$ans" : "X!" >/dev/null; do - read answ - set x \$xxxm - shift - aok=''; eval ans="\\"\$answ\\"" && aok=y - case "\$answ" in - "\$ans") - case "\$ans" in - \\&*) - set x \`expr "X\$ans" : "X&\(.*\)\$"\` - shift - case "\$1" in - -d) - fastread=yes - echo "(OK, I'll run with -d after this question.)" >&4 - ;; - -*) - echo "*** Sorry, \$1 not supported yet." >&4 - ;; - esac - $myecho - ans=! - ;; - "!") - sh 1>&4 - echo " " - $myecho - ;; - !*) - set x \`expr "X\$ans" : "X!\(.*\)\$"\` - shift - sh 1>&4 -c "\$*" - echo " " - $myecho - ;; - esac;; - *) - case "\$aok" in - y) - echo "*** Substitution done -- please confirm." - xxxm="\$ans" - ans=\`echo $n "\$ans$c" | tr '\012' ' '\` - xxxm="\$ans" - ans=! - ;; - *) - echo "*** Error -- try again." - ans=! - ;; - esac - $myecho - ;; - esac - case "\$ans\$xxxm\$nostick" in - '') - ans=! - $myecho - ;; - esac -done -case "\$ans" in -'') ans="\$xxxm";; -esac -EOSC - -: create .config dir to save info across Configure sessions -test -d ../.config || mkdir ../.config -cat >../.config/README </dev/null` -case "$user" in "") - user=`whoami 2>&1` ;; -esac -if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then - firsttime=false - echo " " - rp='Would you like to see the instructions?' - dflt=n - . ./myread - case "$ans" in - [yY]*) ;; - *) needman=false;; - esac -fi -if $needman; then - cat <>../.config/instruct;; - esac -fi - -: find out where common programs are -echo " " -echo "Locating common programs..." >&4 -cat <loc -$startsh -case \$# in -0) exit 1;; -esac -thing=\$1 -shift -dflt=\$1 -shift -for dir in \$*; do - case "\$thing" in - .) - if test -d \$dir/\$thing; then - echo \$dir - exit 0 - fi - ;; - *) - for thisthing in \$dir/\$thing; do - : just loop through to pick last item - done - if test -f \$thisthing; then - echo \$thisthing - exit 0 - elif test -f \$dir/\$thing.exe; then - : on Eunice apparently - echo \$dir/\$thing - exit 0 - fi - ;; - esac -done -echo \$dflt -exit 1 -EOSC -chmod +x loc -$eunicefix loc -loclist=" -awk -cat -comm -cp -echo -expr -find -grep -ls -mkdir -rm -sed -sort -touch -tr -uniq -" -trylist=" -Mcc -byacc -cpp -csh -date -egrep -gzip -less -line -ln -more -nroff -perl -pg -sendmail -test -uname -zip -" -pth=`echo $PATH | sed -e "s/$p_/ /g"` -pth="$pth /lib /usr/lib" -for file in $loclist; do - xxx=`./loc $file $file $pth` - eval $file=$xxx - eval _$file=$xxx - case "$xxx" in - /*) - echo $file is in $xxx. - ;; - ?:[\\/]*) - echo $file is in $xxx. - ;; - *) - echo "I don't know where '$file' is, and my life depends on it." >&4 - echo "Go find a public domain implementation or fix your PATH setting!" >&4 - exit 1 - ;; - esac -done -echo " " -echo "Don't worry if any of the following aren't found..." -say=offhand -for file in $trylist; do - xxx=`./loc $file $file $pth` - eval $file=$xxx - eval _$file=$xxx - case "$xxx" in - /*) - echo $file is in $xxx. - ;; - ?:[\\/]*) - echo $file is in $xxx. - ;; - *) - echo "I don't see $file out there, $say." - say=either - ;; - esac -done -case "$egrep" in -egrep) - echo "Substituting grep for egrep." - egrep=$grep - ;; -esac -case "$ln" in -ln) - echo "Substituting cp for ln." - ln=$cp - ;; -esac -case "$test" in -test) - echo "Hopefully test is built into your sh." - ;; -*) - if `sh -c "PATH= test true" >/dev/null 2>&1`; then - echo "Using the test built into your sh." - test=test - _test=test - fi - ;; -esac -case "$echo" in -echo) - echo "Hopefully echo is built into your sh." - ;; -'') ;; -*) - echo " " -echo "Checking compatibility between $echo and builtin echo (if any)..." >&4 - $echo $n "hi there$c" >foo1 - echo $n "hi there$c" >foo2 - if cmp foo1 foo2 >/dev/null 2>&1; then - echo "They are compatible. In fact, they may be identical." - else - case "$n" in - '-n') n='' c='\c';; - *) n='-n' c='';; - esac - cat <$c" - $echo "*" - fi - $rm -f foo1 foo2 - ;; -esac - -: determine whether symbolic links are supported -echo " " -$touch blurfl -if $ln -s blurfl sym > /dev/null 2>&1 ; then - echo "Symbolic links are supported." >&4 - lns="$ln -s" -else - echo "Symbolic links are NOT supported." >&4 - lns="$ln" -fi -$rm -f blurfl sym - -: see whether [:lower:] and [:upper:] are supported character classes -echo " " -up='[A-Z]' -low='[a-z]' -case "`echo AbyZ | $tr '[:lower:]' '[:upper:]' 2>/dev/null`" in -ABYZ) - echo "Good, your tr supports [:lower:] and [:upper:] to convert case." >&4 - up='[:upper:]' - low='[:lower:]' - ;; -*) - echo "Your tr only supports [a-z] and [A-Z] to convert case." >&4 - ;; -esac -: set up the translation script tr, must be called with ./tr of course -cat >tr </dev/null || hostname) 2>&1` -myuname=`echo $myuname | $sed -e 's/^[^=]*=//' -e 's/\///g' | \ - ./tr '[A-Z]' '[a-z]' | tr '\012' ' '` -newmyuname="$myuname" -dflt=n -case "$knowitall" in -'') - if test -f ../config.sh; then - if $contains myuname= ../config.sh >/dev/null 2>&1; then - eval "`grep myuname= ../config.sh`" - fi - if test "X$myuname" = "X$newmyuname"; then - dflt=y - fi - fi - ;; -*) dflt=y;; -esac - -: Get old answers from old config file if Configure was run on the -: same system, otherwise use the hints. -hint=default -cd .. -if test -f config.sh; then - echo " " - rp="I see a config.sh file. Shall I use it to set the defaults?" - . UU/myread - case "$ans" in - n*|N*) echo "OK, I'll ignore it."; mv config.sh config.sh.old;; - *) echo "Fetching default answers from your old config.sh file..." >&4 - tmp_n="$n" - tmp_c="$c" - tmp_sh="$sh" - . ./config.sh - cp config.sh UU - n="$tmp_n" - c="$tmp_c" - : Older versions did not always set $sh. Catch re-use of such - : an old config.sh. - case "$sh" in - '') sh="$tmp_sh" ;; - esac - hint=previous - ;; - esac -fi -if test ! -f config.sh; then - $cat <&4 - dflt='' - : Half the following guesses are probably wrong... If you have better - : tests or hints, please send them to chip@perl.com - : The metaconfig authors would also appreciate a copy... - $test -f /irix && osname=irix - $test -f /xenix && osname=sco_xenix - $test -f /dynix && osname=dynix - $test -f /dnix && osname=dnix - $test -f /lynx.os && osname=lynxos - $test -f /unicos && osname=unicos && osvers=`$uname -r` - $test -f /unicosmk.ar && osname=unicosmk && osvers=`$uname -r` - $test -f /bin/mips && /bin/mips && osname=mips - $test -d /NextApps && set X `hostinfo | grep 'NeXT Mach.*:' | \ - $sed -e 's/://' -e 's/\./_/'` && osname=next && osvers=$4 - $test -d /usr/apollo/bin && osname=apollo - $test -f /etc/saf/_sactab && osname=svr4 - $test -d /usr/include/minix && osname=minix - if $test -d /MachTen; then - osname=machten - if $test -x /sbin/version; then - osvers=`/sbin/version | $awk '{print $2}' | - $sed -e 's/[A-Za-z]$//'` - elif $test -x /usr/etc/version; then - osvers=`/usr/etc/version | $awk '{print $2}' | - $sed -e 's/[A-Za-z]$//'` - else - osvers="$2.$3" - fi - fi - if $test -f $uname; then - set X $myuname - shift - - case "$5" in - fps*) osname=fps ;; - mips*) - case "$4" in - umips) osname=umips ;; - *) osname=mips ;; - esac;; - [23]100) osname=mips ;; - next*) osname=next ;; - news*) osname=news ;; - i386*) - if $test -f /etc/kconfig; then - osname=isc - if test "$lns" = "ln -s"; then - osvers=4 - elif $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then - osvers=3 - elif $contains _POSIX_SOURCE /usr/include/stdio.h > /dev/null 2>&1 ; then - osvers=2 - fi - fi - ;; - esac - - case "$1" in - aix) osname=aix - tmp=`( (oslevel) 2>/dev/null || echo "not found") 2>&1` - case "$tmp" in - 'not found') osvers="$4"."$3" ;; - '<3240'|'<>3240') osvers=3.2.0 ;; - '=3240'|'>3240'|'<3250'|'<>3250') osvers=3.2.4 ;; - '=3250'|'>3250') osvers=3.2.5 ;; - *) osvers=$tmp;; - esac - ;; - *dc.osx) osname=dcosx - osvers="$3" - ;; - dnix) osname=dnix - osvers="$3" - ;; - domainos) osname=apollo - osvers="$3" - ;; - dgux) osname=dgux - osvers="$3" - ;; - dynixptx*) osname=dynixptx - osvers="$3" - ;; - freebsd) osname=freebsd - osvers="$3" ;; - genix) osname=genix ;; - hp*) osname=hpux - case "$3" in - *.08.*) osvers=9 ;; - *.09.*) osvers=9 ;; - *.10.*) osvers=10 ;; - *) osvers="$3" ;; - esac - ;; - irix*) osname=irix - case "$3" in - 4*) osvers=4 ;; - 5*) osvers=5 ;; - *) osvers="$3" ;; - esac - ;; - linux) osname=linux - case "$3" in - 1*) osvers=1 ;; - *) osvers="$3" ;; - esac - ;; - netbsd*) osname=netbsd - osvers="$3" - ;; - bsd386) osname=bsd386 - osvers=`$uname -r` - ;; - next*) osname=next ;; - solaris) osname=solaris - case "$3" in - 5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;; - *) osvers="$3" ;; - esac - ;; - sunos) osname=sunos - case "$3" in - 5*) osname=solaris - osvers=`echo $3 | $sed 's/^5/2/g'` ;; - *) osvers="$3" ;; - esac - ;; - titanos) osname=titanos - case "$3" in - 1*) osvers=1 ;; - 2*) osvers=2 ;; - 3*) osvers=3 ;; - 4*) osvers=4 ;; - *) osvers="$3" ;; - esac - ;; - ultrix) osname=ultrix - osvers="$3" - ;; - osf1|mls+) case "$5" in - alpha) - osname=dec_osf - osvers=`echo "$3" | sed 's/^[vt]//'` - ;; - hp*) osname=hp_osf1 ;; - mips) osname=mips_osf1 ;; - esac - ;; - uts) osname=uts - osvers="$3" - ;; - qnx) osname=qnx - osvers="$4" - ;; - $2) case "$osname" in - *isc*) ;; - *freebsd*) ;; - svr*) - : svr4.x or possibly later - case "svr$3" in - ${osname}*) - osname=svr$3 - osvers=$4 - ;; - esac - case "$osname" in - svr4.0) - : Check for ESIX - if test -f /stand/boot ; then - eval `grep '^INITPROG=[a-z/0-9]*$' /stand/boot` - if test -n "$INITPROG" -a -f "$INITPROG"; then - isesix=`strings -a $INITPROG|grep 'ESIX SYSTEM V/386 Release 4.0'` - if test -n "$isesix"; then - osname=esix4 - fi - fi - fi - ;; - esac - ;; - *) if test -f /etc/systemid; then - osname=sco - set `echo $3 | $sed 's/\./ /g'` $4 - if $test -f sco_$1_$2_$3.sh; then - osvers=$1.$2.$3 - elif $test -f sco_$1_$2.sh; then - osvers=$1.$2 - elif $test -f sco_$1.sh; then - osvers=$1 - fi - else - case "$osname" in - '') : Still unknown. Probably a generic Sys V. - osname="sysv" - osvers="$3" - ;; - esac - fi - ;; - esac - ;; - *) case "$osname" in - '') : Still unknown. Probably a generic BSD. - osname="$1" - osvers="$3" - ;; - esac - ;; - esac - else - if test -f /vmunix -a -f news_os.sh; then - (what /vmunix | ../UU/tr '[A-Z]' '[a-z]') > ../UU/kernel.what 2>&1 - if $contains news-os ../UU/kernel.what >/dev/null 2>&1; then - osname=news_os - fi - $rm -f ../UU/kernel.what - elif test -d c:/.; then - set X $myuname - osname=os2 - osvers="$5" - fi - fi - - : Now look for a hint file osname_osvers, unless one has been - : specified already. - case "$hintfile" in - ''|' ') - file=`echo "${osname}_${osvers}" | $sed -e 's@\.@_@g' -e 's@_$@@'` - : Also try without trailing minor version numbers. - xfile=`echo $file | $sed -e 's@_[^_]*$@@'` - xxfile=`echo $xfile | $sed -e 's@_[^_]*$@@'` - xxxfile=`echo $xxfile | $sed -e 's@_[^_]*$@@'` - xxxxfile=`echo $xxxfile | $sed -e 's@_[^_]*$@@'` - case "$file" in - '') dflt=none ;; - *) case "$osvers" in - '') dflt=$file - ;; - *) if $test -f $file.sh ; then - dflt=$file - elif $test -f $xfile.sh ; then - dflt=$xfile - elif $test -f $xxfile.sh ; then - dflt=$xxfile - elif $test -f $xxxfile.sh ; then - dflt=$xxxfile - elif $test -f $xxxxfile.sh ; then - dflt=$xxxxfile - elif $test -f "${osname}.sh" ; then - dflt="${osname}" - else - dflt=none - fi - ;; - esac - ;; - esac - ;; - *) - dflt=`echo $hintfile | $sed 's/\.sh$//'` - ;; - esac - - $cat <> ../UU/config.sh - elif $test X$tans = X -o X$tans = Xnone ; then - : nothing - else - : Give one chance to correct a possible typo. - echo "$file.sh does not exist" - dflt=$file - rp="hint to use instead?" - . ../UU/myread - for file in $ans; do - if $test -f "$file.sh"; then - . ./$file.sh - $cat $file.sh >> ../UU/config.sh - elif $test X$ans = X -o X$ans = Xnone ; then - : nothing - else - echo "$file.sh does not exist -- ignored." - fi - done - fi - done - - hint=recommended - : Remember our hint file for later. - if $test -f "$file.sh" ; then - hintfile="$file" - else - hintfile='' - fi - - cd .. -fi -cd UU -;; -*) - echo " " - echo "Fetching default answers from $config_sh..." >&4 - tmp_n="$n" - tmp_c="$c" - cd .. - cp $config_sh config.sh 2>/dev/null - chmod +w config.sh - . ./config.sh - cd UU - cp ../config.sh . - n="$tmp_n" - c="$tmp_c" - hint=previous - ;; -esac -test "$override" && . ./optdef.sh -myuname="$newmyuname" - -: Restore computed paths -for file in $loclist $trylist; do - eval $file="\$_$file" -done - -cat << EOM - -Configure uses the operating system name and version to set some defaults. -The default value is probably right if the name rings a bell. Otherwise, -since spelling matters for me, either accept the default or answer "none" -to leave it blank. - -EOM -case "$osname" in - ''|' ') - case "$hintfile" in - ''|' '|none) dflt=none ;; - *) dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/_.*$//'` ;; - esac - ;; - *) dflt="$osname" ;; -esac -rp="Operating system name?" -. ./myread -case "$ans" in -none) osname='' ;; -*) osname=`echo "$ans" | $sed -e 's/[ ][ ]*/_/g' | ./tr '[A-Z]' '[a-z]'`;; -esac -echo " " -case "$osvers" in - ''|' ') - case "$hintfile" in - ''|' '|none) dflt=none ;; - *) dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/^[^_]*//'` - dflt=`echo $dflt | $sed -e 's/^_//' -e 's/_/./g'` - case "$dflt" in - ''|' ') dflt=none ;; - esac - ;; - esac - ;; - *) dflt="$osvers" ;; -esac -rp="Operating system version?" -. ./myread -case "$ans" in -none) osvers='' ;; -*) osvers="$ans" ;; -esac - - - -: who configured the system -cf_time=`$date 2>&1` -cf_by=`(logname) 2>/dev/null` -case "$cf_by" in "") - cf_by=`(whoami) 2>/dev/null` - case "$cf_by" in "") - cf_by=unknown ;; - esac ;; -esac - -: determine the architecture name -echo " " -if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then - tarch=`arch`"-$osname" -elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then - if uname -m > tmparch 2>&1 ; then - tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \ - -e 's/$/'"-$osname/" tmparch` - else - tarch="$osname" - fi - $rm -f tmparch -else - tarch="$osname" -fi -case "$myarchname" in -''|"$tarch") ;; -*) - echo "(Your architecture name used to be $myarchname.)" - archname='' - ;; -esac -case "$archname" in -'') dflt="$tarch";; -*) dflt="$archname";; -esac -rp='What is your architecture name' -. ./myread -archname="$ans" -myarchname="$tarch" - -: is AFS running? -echo " " -case "$afs" in -$define|true) afs=true ;; -$undef|false) afs=false ;; -*) if test -d /afs; then - afs=true - else - afs=false - fi - ;; -esac -if $afs; then - echo "AFS may be running... I'll be extra cautious then..." >&4 -else - echo "AFS does not seem to be running..." >&4 -fi - -: decide how portable to be. Allow command line overrides. -case "$d_portable" in -"$undef") ;; -*) d_portable="$define" ;; -esac - -: set up shell script to do ~ expansion -cat >filexp <&2 - exit 1 - fi - case "\$1" in - */*) - echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\` - ;; - *) - echo \$dir - ;; - esac - fi - ;; -*) - echo \$1 - ;; -esac -EOSS -chmod +x filexp -$eunicefix filexp - -: now set up to get a file name -cat <getfile -$startsh -EOS -cat <<'EOSC' >>getfile -tilde='' -fullpath='' -already='' -skip='' -none_ok='' -exp_file='' -nopath_ok='' -orig_rp="$rp" -orig_dflt="$dflt" - -case "$fn" in -*\(*) - expr $fn : '.*(\(.*\)).*' | tr ',' '\012' >getfile.ok - fn=`echo $fn | sed 's/(.*)//'` - ;; -esac - -case "$fn" in -*:*) - loc_file=`expr $fn : '.*:\(.*\)'` - fn=`expr $fn : '\(.*\):.*'` - ;; -esac - -case "$fn" in -*~*) tilde=true;; -esac -case "$fn" in -*/*) fullpath=true;; -esac -case "$fn" in -*+*) skip=true;; -esac -case "$fn" in -*n*) none_ok=true;; -esac -case "$fn" in -*e*) exp_file=true;; -esac -case "$fn" in -*p*) nopath_ok=true;; -esac - -case "$fn" in -*f*) type='File';; -*d*) type='Directory';; -*l*) type='Locate';; -esac - -what="$type" -case "$what" in -Locate) what='File';; -esac - -case "$exp_file" in -'') - case "$d_portable" in - "$define") ;; - *) exp_file=true;; - esac - ;; -esac - -cd .. -while test "$type"; do - redo='' - rp="$orig_rp" - dflt="$orig_dflt" - case "$tilde" in - true) rp="$rp (~name ok)";; - esac - . UU/myread - if test -f UU/getfile.ok && \ - $contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1 - then - value="$ans" - ansexp="$ans" - break - fi - case "$ans" in - none) - value='' - ansexp='' - case "$none_ok" in - true) type='';; - esac - ;; - *) - case "$tilde" in - '') value="$ans" - ansexp="$ans";; - *) - value=`UU/filexp $ans` - case $? in - 0) - if test "$ans" != "$value"; then - echo "(That expands to $value on this system.)" - fi - ;; - *) value="$ans";; - esac - ansexp="$value" - case "$exp_file" in - '') value="$ans";; - esac - ;; - esac - case "$fullpath" in - true) - case "$ansexp" in - /*) value="$ansexp" ;; - *) - redo=true - case "$already" in - true) - echo "I shall only accept a full path name, as in /bin/ls." >&4 - echo "Use a ! shell escape if you wish to check pathnames." >&4 - ;; - *) - echo "Please give a full path name, starting with slash." >&4 - case "$tilde" in - true) - echo "Note that using ~name is ok provided it expands well." >&4 - already=true - ;; - esac - esac - ;; - esac - ;; - esac - case "$redo" in - '') - case "$type" in - File) - if test -f "$ansexp"; then - type='' - elif test -r "$ansexp" || (test -h "$ansexp") >/dev/null 2>&1 - then - echo "($value is not a plain file, but that's ok.)" - type='' - fi - ;; - Directory) - if test -d "$ansexp"; then - type='' - fi - ;; - Locate) - if test -d "$ansexp"; then - echo "(Looking for $loc_file in directory $value.)" - value="$value/$loc_file" - ansexp="$ansexp/$loc_file" - fi - if test -f "$ansexp"; then - type='' - fi - case "$nopath_ok" in - true) case "$value" in - */*) ;; - *) echo "Assuming $value will be in people's path." - type='' - ;; - esac - ;; - esac - ;; - esac - - case "$skip" in - true) type=''; - esac - - case "$type" in - '') ;; - *) - if test "$fastread" = yes; then - dflt=y - else - dflt=n - fi - rp="$what $value doesn't exist. Use that name anyway?" - . UU/myread - dflt='' - case "$ans" in - y*) type='';; - *) echo " ";; - esac - ;; - esac - ;; - esac - ;; - esac -done -cd UU -ans="$value" -rp="$orig_rp" -dflt="$orig_dflt" -rm -f getfile.ok -EOSC - -: determine root of directory hierarchy where package will be installed. -case "$prefix" in -'') - dflt=`./loc . /usr/local /usr/local /local /opt /usr` - ;; -*) - dflt="$prefix" - ;; -esac -$cat <&4 -if $test -r ../patchlevel.h;then - patchlevel=`awk '/PATCHLEVEL/ {print $3}' ../patchlevel.h` - subversion=`awk '/SUBVERSION/ {print $3}' ../patchlevel.h` -else - patchlevel=0 - subversion=0 -fi -$echo $n "(You have $package" $c -case "$package" in -"*$baserev") ;; -*) $echo $n " $baserev" $c ;; -esac -$echo $n " patchlevel $patchlevel" $c -test 0 -eq "$subversion" || $echo $n " subversion $subversion" $c -echo ".)" - -: set the prefixup variable, to restore leading tilda escape -prefixup='case "$prefixexp" in -"$prefix") ;; -*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";; -esac' - -: determine where public architecture dependent libraries go -set archlib archlib -eval $prefixit -case "$archlib" in -'') - case "$privlib" in - '') dflt=`./loc . "." $prefixexp/lib /usr/local/lib /usr/lib /lib` - set dflt - eval $prefixup - ;; - *) if test 0 -eq "$subversion"; then - version=`LC_ALL=C; export LC_ALL; \ - echo $baserev $patchlevel | \ - $awk '{ printf "%.3f\n", $1 + $2/1000.0 }'` - else - version=`LC_ALL=C; export LC_ALL; \ - echo $baserev $patchlevel $subversion | \ - $awk '{ printf "%.5f\n", $1 + $2/1000.0 + $3/100000.0 }'` - fi - dflt="$privlib/$archname/$version" - ;; - esac - ;; -*) - dflt="$archlib" - ;; -esac -cat <whoa -$startsh -EOS -cat <<'EOSC' >>whoa -dflt=y -echo " " -echo "*** WHOA THERE!!! ***" >&4 -echo " The $hint value for \$$var on this machine was \"$was\"!" >&4 -rp=" Keep the $hint value?" -. ./myread -case "$ans" in -y) td=$was; tu=$was;; -esac -EOSC - -: function used to set $1 to $val -setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef; -case "$val$was" in -$define$undef) . ./whoa; eval "$var=\$td";; -$undef$define) . ./whoa; eval "$var=\$tu";; -*) eval "$var=$val";; -esac' - -$cat <bsd -echo exit 1 >usg -echo exit 1 >v7 -echo exit 1 >osf1 -echo exit 1 >eunice -echo exit 1 >xenix -echo exit 1 >venix -echo exit 1 >os2 -d_bsd="$undef" -$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null -if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1 -then - echo "Looks kind of like an OSF/1 system, but we'll see..." - echo exit 0 >osf1 -elif test `echo abc | tr a-z A-Z` = Abc ; then - xxx=`./loc addbib blurfl $pth` - if $test -f $xxx; then - echo "Looks kind of like a USG system with BSD features, but we'll see..." - echo exit 0 >bsd - echo exit 0 >usg - else - if $contains SIGTSTP foo >/dev/null 2>&1 ; then - echo "Looks kind of like an extended USG system, but we'll see..." - else - echo "Looks kind of like a USG system, but we'll see..." - fi - echo exit 0 >usg - fi -elif $contains SIGTSTP foo >/dev/null 2>&1 ; then - echo "Looks kind of like a BSD system, but we'll see..." - d_bsd="$define" - echo exit 0 >bsd -else - echo "Looks kind of like a Version 7 system, but we'll see..." - echo exit 0 >v7 -fi -case "$eunicefix" in -*unixtovms*) - $cat <<'EOI' -There is, however, a strange, musty smell in the air that reminds me of -something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit. -EOI - echo exit 0 >eunice - d_eunice="$define" -: it so happens the Eunice I know will not run shell scripts in Unix format - ;; -*) - echo " " - echo "Congratulations. You aren't running Eunice." - d_eunice="$undef" - ;; -esac -: Detect OS2. The p_ variable is set above in the Head.U unit. -case "$p_" in -:) ;; -*) - $cat <<'EOI' -I have the feeling something is not exactly right, however...don't tell me... -lemme think...does HAL ring a bell?...no, of course, you're only running OS/2! -EOI - echo exit 0 >os2 - ;; -esac -if test -f /xenix; then - echo "Actually, this looks more like a XENIX system..." - echo exit 0 >xenix - d_xenix="$define" -else - echo " " - echo "It's not Xenix..." - d_xenix="$undef" -fi -chmod +x xenix -$eunicefix xenix -if test -f /venix; then - echo "Actually, this looks more like a VENIX system..." - echo exit 0 >venix -else - echo " " - if ./xenix; then - : null - else - echo "Nor is it Venix..." - fi -fi -chmod +x bsd usg v7 osf1 eunice xenix venix os2 -$eunicefix bsd usg v7 osf1 eunice xenix venix os2 -$rm -f foo - -: see if setuid scripts can be secure -$cat <reflect - chmod +x,u+s reflect - ./reflect >flect 2>&1 - if $contains "/dev/fd" flect >/dev/null; then - echo "Congratulations, your kernel has secure setuid scripts!" >&4 - val="$define" - else - $cat <&4 - dflt=n;; - "$undef") - echo "Well, the $hint value is *not* secure." >&4 - dflt=n;; - *) echo "Well, the $hint value *is* secure." >&4 - dflt=y;; - esac - ;; - *) - $rm -f reflect flect - echo "#!$ls" >reflect - chmod +x,u+s reflect - echo >flect - chmod a+w flect - echo '"su" will (probably) prompt you for '"$ans's password." - su $ans -c './reflect >flect' - if $contains "/dev/fd" flect >/dev/null; then - echo "Okay, it looks like setuid scripts are secure." >&4 - dflt=y - else - echo "I don't think setuid scripts are secure." >&4 - dflt=n - fi - ;; - esac - rp='Does your kernel have *secure* setuid scripts?' - . ./myread - case "$ans" in - [yY]*) val="$define";; - *) val="$undef";; - esac - fi -else - echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4 - echo "(That's for file descriptors, not floppy disks.)" - val="$undef" -fi -set d_suidsafe -eval $setvar - -$rm -f reflect flect - -: now see if they want to do setuid emulation -echo " " -val="$undef" -case "$d_suidsafe" in -"$define") - val="$undef" - echo "No need to emulate SUID scripts since they are secure here." >& 4 - ;; -*) - $cat <&4 -else - echo "Could not find manual pages in source form." >&4 -fi - -: see what memory models we can support -case "$models" in -'') - $cat >pdp11.c <<'EOP' -main() { -#ifdef pdp11 - exit(0); -#else - exit(1); -#endif -} -EOP - cc -o pdp11 pdp11.c >/dev/null 2>&1 - if ./pdp11 2>/dev/null; then - dflt='unsplit split' - else - tans=`./loc . X /lib/small /lib/large /usr/lib/small /usr/lib/large /lib/medium /usr/lib/medium /lib/huge` - case "$tans" in - X) dflt='none';; - *) if $test -d /lib/small || $test -d /usr/lib/small; then - dflt='small' - else - dflt='' - fi - if $test -d /lib/medium || $test -d /usr/lib/medium; then - dflt="$dflt medium" - fi - if $test -d /lib/large || $test -d /usr/lib/large; then - dflt="$dflt large" - fi - if $test -d /lib/huge || $test -d /usr/lib/huge; then - dflt="$dflt huge" - fi - esac - fi;; -*) dflt="$models";; -esac -$cat </dev/null 2>&1 || \ - $contains '\-i' $sysman/cc.1 >/dev/null 2>&1; then - dflt='-i' - else - dflt='none' - fi;; - *) dflt="$split";; - esac - rp="What flag indicates separate I and D space?" - . ./myread - tans="$ans" - case "$tans" in - none) tans='';; - esac - split="$tans" - unsplit='';; -*large*|*small*|*medium*|*huge*) - case "$models" in - *large*) - case "$large" in - '') dflt='-Ml';; - *) dflt="$large";; - esac - rp="What flag indicates large model?" - . ./myread - tans="$ans" - case "$tans" in - none) tans=''; - esac - large="$tans";; - *) large='';; - esac - case "$models" in - *huge*) case "$huge" in - '') dflt='-Mh';; - *) dflt="$huge";; - esac - rp="What flag indicates huge model?" - . ./myread - tans="$ans" - case "$tans" in - none) tans=''; - esac - huge="$tans";; - *) huge="$large";; - esac - case "$models" in - *medium*) case "$medium" in - '') dflt='-Mm';; - *) dflt="$medium";; - esac - rp="What flag indicates medium model?" - . ./myread - tans="$ans" - case "$tans" in - none) tans=''; - esac - medium="$tans";; - *) medium="$large";; - esac - case "$models" in - *small*) case "$small" in - '') dflt='none';; - *) dflt="$small";; - esac - rp="What flag indicates small model?" - . ./myread - tans="$ans" - case "$tans" in - none) tans=''; - esac - small="$tans";; - *) small='';; - esac - ;; -*) - echo "Unrecognized memory models--you may have to edit Makefile.SH" >&4 - ;; -esac - -: see if we need a special compiler -echo " " -if ./usg; then - case "$cc" in - '') case "$Mcc" in - /*) dflt='Mcc';; - *) case "$large" in - -M*) dflt='cc';; - *) if $contains '\-M' $sysman/cc.1 >/dev/null 2>&1 ; then - if $contains '\-M' $sysman/cpp.1 >/dev/null 2>&1; then - dflt='cc' - else - dflt='cc -M' - fi - else - dflt='cc' - fi;; - esac;; - esac;; - *) dflt="$cc";; - esac - $cat <<'EOM' -On some systems the default C compiler will not resolve multiple global -references that happen to have the same name. On some such systems the "Mcc" -command may be used to force these to be resolved. On other systems a "cc -M" -command is required. (Note that the -M flag on other systems indicates a -memory model to use!) If you have the Gnu C compiler, you might wish to use -that instead. - -EOM - rp="What command will force resolution on this system?" - . ./myread - cc="$ans" -else - case "$cc" in - '') dflt=cc;; - *) dflt="$cc";; - esac - rp="Use which C compiler?" - . ./myread - cc="$ans" -fi -echo " " -echo "Checking for GNU cc in disguise and/or its version number..." >&4 -$cat >gccvers.c < -int main() { -#ifdef __GNUC__ -#ifdef __VERSION__ - printf("%s\n", __VERSION__); -#else - printf("%s\n", "1"); -#endif -#endif - exit(0); -} -EOM -if $cc -o gccvers gccvers.c >/dev/null 2>&1; then - gccversion=`./gccvers` - case "$gccversion" in - '') echo "You are not using GNU cc." ;; - *) echo "You are using GNU cc $gccversion." ;; - esac -else - echo " " - echo "*** WHOA THERE!!! ***" >&4 - echo " Your C compiler \"$cc\" doesn't seem to be working!" >&4 - case "$knowitall" in - '') - echo " You'd better start hunting for one and let me know about it." >&4 - exit 1 - ;; - esac -fi -$rm -f gccvers* -case "$gccversion" in -1*) cpp=`./loc gcc-cpp $cpp $pth` ;; -esac - -: What should the include directory be ? -echo " " -$echo $n "Hmm... $c" -dflt='/usr/include' -incpath='' -mips_type='' -if $test -f /bin/mips && /bin/mips; then - echo "Looks like a MIPS system..." - $cat >usr.c <<'EOCP' -#ifdef SYSTYPE_BSD43 -/bsd43 -#endif -EOCP - if $cc -E usr.c > usr.out && $contains / usr.out >/dev/null 2>&1; then - dflt='/bsd43/usr/include' - incpath='/bsd43' - mips_type='BSD 4.3' - else - mips_type='System V' - fi - $rm -f usr.c usr.out - echo "and you're compiling with the $mips_type compiler and libraries." - xxx_prompt=y - echo "exit 0" >mips -else - echo "Doesn't look like a MIPS system." - xxx_prompt=n - echo "exit 1" >mips -fi -chmod +x mips -$eunicefix mips -echo " " -case "$usrinc" in -'') ;; -*) dflt="$usrinc";; -esac -case "$xxx_prompt" in -y) fn=d/ - rp='Where are the include files you want to use?' - . ./getfile - usrinc="$ans" - ;; -*) usrinc="$dflt" - ;; -esac - -: Set private lib path -case "$plibpth" in -'') if ./mips; then - plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib" - fi;; -esac -case "$libpth" in -' ') dlist='';; -'') dlist="$loclibpth $plibpth $glibpth";; -*) dlist="$libpth";; -esac - -: Now check and see which directories actually exist, avoiding duplicates -libpth='' -for xxx in $dlist -do - if $test -d $xxx; then - case " $libpth " in - *" $xxx "*) ;; - *) libpth="$libpth $xxx";; - esac - fi -done -$cat <<'EOM' - -Some systems have incompatible or broken versions of libraries. Among -the directories listed in the question below, please remove any you -know not to be holding relevant libraries, and add any that are needed. -Say "none" for none. - -EOM -case "$libpth" in -'') dflt='none';; -*) - set X $libpth - shift - dflt=${1+"$@"} - ;; -esac -rp="Directories to use for library searches?" -. ./myread -case "$ans" in -none) libpth=' ';; -*) libpth="$ans";; -esac - -: Define several unixisms. Hints files or command line options -: can be used to override them. -case "$ar" in -'') ar='ar';; -esac -case "$lib_ext" in -'') lib_ext='.a';; -esac -case "$obj_ext" in -'') obj_ext='.o';; -esac -case "$path_sep" in -'') path_sep=':';; -esac -: Which makefile gets called first. This is used by make depend. -case "$firstmakefile" in -'') firstmakefile='makefile';; -esac - -: compute shared library extension -case "$so" in -'') - if xxx=`./loc libc.sl X $libpth`; $test -f "$xxx"; then - dflt='sl' - else - dflt='so' - fi - ;; -*) dflt="$so";; -esac -$cat <&4 -case "$libs" in -' '|'') dflt='';; -*) dflt="$libs";; -esac -case "$libswanted" in -'') libswanted='c_s';; -esac -for thislib in $libswanted; do - - if xxx=`./loc lib$thislib.$so.[0-9]'*' X $libpth`; $test -f "$xxx"; then - echo "Found -l$thislib (shared)." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l$thislib";; - esac - elif xxx=`./loc lib$thislib.$so X $libpth` ; $test -f "$xxx"; then - echo "Found -l$thislib (shared)." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l$thislib";; - esac - elif xxx=`./loc lib$thislib$lib_ext X $libpth`; $test -f "$xxx"; then - echo "Found -l$thislib." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l$thislib";; - esac - elif xxx=`./loc $thislib$lib_ext X $libpth`; $test -f "$xxx"; then - echo "Found -l$thislib." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l$thislib";; - esac - elif xxx=`./loc lib${thislib}_s$lib_ext X $libpth`; $test -f "$xxx"; then - echo "Found -l${thislib}_s." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l${thislib}_s";; - esac - elif xxx=`./loc Slib$thislib$lib_ext X $xlibpth`; $test -f "$xxx"; then - echo "Found -l$thislib." - case " $dflt " in - *"-l$thislib "*);; - *) dflt="$dflt -l$thislib";; - esac - else - echo "No -l$thislib." - fi -done -set X $dflt -shift -dflt="$*" -case "$libs" in -'') dflt="$dflt";; -*) dflt="$libs";; -esac -case "$dflt" in -' '|'') dflt='none';; -esac - -$cat <&4 -cat <<'EOT' >testcpp.c -#define ABC abc -#define XYZ xyz -ABC.XYZ -EOT -cd .. -echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin -chmod 755 cppstdin -wrapper=`pwd`/cppstdin -ok='false' -cd UU - -if $test "X$cppstdin" != "X" && \ - $cppstdin $cppminus testcpp.out 2>&1 && \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 -then - echo "You used to use $cppstdin $cppminus so we'll use that again." - case "$cpprun" in - '') echo "But let's see if we can live without a wrapper..." ;; - *) - if $cpprun $cpplast testcpp.out 2>&1 && \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 - then - echo "(And we'll use $cpprun $cpplast to preprocess directly.)" - ok='true' - else - echo "(However, $cpprun $cpplast does not work, let's see...)" - fi - ;; - esac -else - case "$cppstdin" in - '') ;; - *) - echo "Good old $cppstdin $cppminus does not seem to be of any help..." - ;; - esac -fi - -if $ok; then - : nothing -elif echo 'Maybe "'"$cc"' -E" will work...'; \ - $cc -E testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "Yup, it does." - x_cpp="$cc -E" - x_minus=''; -elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \ - $cc -E - testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "Yup, it does." - x_cpp="$cc -E" - x_minus='-'; -elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \ - $cc -P testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "Yipee, that works!" - x_cpp="$cc -P" - x_minus=''; -elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \ - $cc -P - testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "At long last!" - x_cpp="$cc -P" - x_minus='-'; -elif echo 'No such luck, maybe "'$cpp'" will work...'; \ - $cpp testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "It works!" - x_cpp="$cpp" - x_minus=''; -elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \ - $cpp - testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "Hooray, it works! I was beginning to wonder." - x_cpp="$cpp" - x_minus='-'; -elif echo 'Uh-uh. Time to get fancy. Trying a wrapper...'; \ - $wrapper testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - x_cpp="$wrapper" - x_minus='' - echo "Eureka!" -else - dflt='' - rp="No dice. I can't find a C preprocessor. Name one:" - . ./myread - x_cpp="$ans" - x_minus='' - $x_cpp testcpp.out 2>&1 - if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then - echo "OK, that will do." >&4 - else -echo "Sorry, I can't get that to work. Go find one and rerun Configure." >&4 - exit 1 - fi -fi - -case "$ok" in -false) - cppstdin="$x_cpp" - cppminus="$x_minus" - cpprun="$x_cpp" - cpplast="$x_minus" - set X $x_cpp - shift - case "$1" in - "$cpp") - echo "Perhaps can we force $cc -E using a wrapper..." - if $wrapper testcpp.out 2>&1; \ - $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 - then - echo "Yup, we can." - cppstdin="$wrapper" - cppminus=''; - else - echo "Nope, we'll have to live without it..." - fi - ;; - esac - case "$cpprun" in - "$wrapper") - cpprun='' - cpplast='' - ;; - esac - ;; -esac - -case "$cppstdin" in -"$wrapper") ;; -*) $rm -f $wrapper;; -esac -$rm -f testcpp.c testcpp.out - -: determine optimize, if desired, or use for debug flag also -case "$optimize" in -' '|$undef) dflt='none';; -'') dflt='-O';; -*) dflt="$optimize";; -esac -$cat </dev/null 2>&1 - then - dflt="$dflt -posix" - fi - ;; - esac - ;; -esac - -case "$mips_type" in -*BSD*|'') inclwanted="$locincpth $usrinc";; -*) inclwanted="$locincpth $inclwanted $usrinc/bsd";; -esac -for thisincl in $inclwanted; do - if $test -d $thisincl; then - if $test x$thisincl != x$usrinc; then - case "$dflt" in - *$thisincl*);; - *) dflt="$dflt -I$thisincl";; - esac - fi - fi -done - -inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then - xxx=true; -elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then - xxx=true; -else - xxx=false; -fi; -if $xxx; then - case "$dflt" in - *$2*);; - *) dflt="$dflt -D$2";; - esac; -fi' - -if ./osf1; then - set signal.h __LANGUAGE_C__; eval $inctest -else - set signal.h LANGUAGE_C; eval $inctest -fi - -case "$hint" in -none|recommended) dflt="$ccflags $dflt" ;; -*) dflt="$ccflags";; -esac - -case "$dflt" in -''|' ') dflt=none;; -esac -$cat <&4 - set X $cppflags - shift - cppflags='' - $cat >cpp.c <<'EOM' -#define BLURFL foo - -BLURFL xx LFRULB -EOM - previous='' - for flag in $* - do - case "$flag" in - -*) ftry="$flag";; - *) ftry="$previous $flag";; - esac - if $cppstdin -DLFRULB=bar $cppflags $ftry $cppminus cpp1.out 2>/dev/null && \ - $cpprun -DLFRULB=bar $ftry $cpplast cpp2.out 2>/dev/null && \ - $contains 'foo.*xx.*bar' cpp1.out >/dev/null 2>&1 && \ - $contains 'foo.*xx.*bar' cpp2.out >/dev/null 2>&1 - then - cppflags="$cppflags $ftry" - previous='' - else - previous="$flag" - fi - done - set X $cppflags - shift - cppflags=${1+"$@"} - case "$cppflags" in - *-*) echo "They appear to be: $cppflags";; - esac - $rm -f cpp.c cpp?.out - ;; -esac - -: flags used in final linking phase - -case "$ldflags" in -'') if ./venix; then - dflt='-i -z' - else - dflt='' - fi - case "$ccflags" in - *-posix*) dflt="$dflt -posix" ;; - esac - ;; -*) dflt="$ldflags";; -esac - -: Try to guess additional flags to pick up local libraries. -for thislibdir in $libpth; do - case " $loclibpth " in - *" $thislibdir "*) - case "$dflt " in - *"-L$thislibdir "*) ;; - *) dflt="$dflt -L$thislibdir" ;; - esac - ;; - esac -done - -case "$dflt" in -'') dflt='none' ;; -esac - -$cat <&4 -set X $cc $optimize $ccflags $ldflags -o try try.c $libs -shift -$cat >try.msg < try.c <<'EOF' -#include -main() { exit(0); } -EOF -dflt=y -if sh -c "$cc $optimize $ccflags -o try try.c $ldflags $libs" >>try.msg 2>&1; then - if sh -c './try' >>try.msg 2>&1; then - dflt=n - else - echo "The program compiled OK, but exited with status $?." >>try.msg - rp="You have a problem. Shall I abort Configure" - dflt=y - fi -else - echo "I can't compile the test program." >>try.msg - rp="You have a BIG problem. Shall I abort Configure" - dflt=y -fi -case "$dflt" in -y) - $cat try.msg - case "$knowitall" in - '') - echo "(The supplied flags might be incorrect with this C compiler.)" - ;; - *) dflt=n;; - esac - echo " " - . ./myread - case "$ans" in - n*|N*) ;; - *) echo "Ok. Stopping Configure." >&4 - exit 1 - ;; - esac - ;; -n) echo "OK, that should do.";; -esac -$rm -f try try.* core - -echo " " -echo "Checking for GNU C Library..." >&4 -cat >gnulibc.c </dev/null 2>&1 && \ - ./gnulibc | $contains '^GNU C Library' >/dev/null 2>&1; then - val="$define" - echo "You are using the GNU C Library" -else - val="$undef" - echo "You are not using the GNU C Library" -fi -$rm -f gnulibc* -set d_gnulibc -eval $setvar - -: see if nm is to be used to determine whether a symbol is defined or not -case "$usenm" in -'') - case "$d_gnulibc" in - $define) - dflt=n - ;; - *) - dflt=`egrep 'inlibc|csym' ../Configure | wc -l 2>/dev/null` - if $test $dflt -gt 20; then - dflt=y - else - dflt=n - fi - ;; - esac - ;; -*) - case "$usenm" in - true) dflt=y;; - *) dflt=n;; - esac - ;; -esac -$cat < /dev/null 2>&1; then - nm_so_opt='--dynamic' - fi - ;; - esac - ;; -esac - -case "$runnm" in -true) -: get list of predefined functions in a handy place -echo " " -case "$libc" in -'') libc=unknown - case "$libs" in - *-lc_s*) libc=`./loc libc_s$lib_ext $libc $libpth` - esac - ;; -esac -libnames=''; -case "$libs" in -'') ;; -*) for thislib in $libs; do - case "$thislib" in - -lc|-lc_s) - : Handle C library specially below. - ;; - -l*) - thislib=`echo $thislib | $sed -e 's/^-l//'` - if try=`./loc lib$thislib.$so.'*' X $libpth`; $test -f "$try"; then - : - elif try=`./loc lib$thislib.$so X $libpth`; $test -f "$try"; then - : - elif try=`./loc lib$thislib$lib_ext X $libpth`; $test -f "$try"; then - : - elif try=`./loc $thislib$lib_ext X $libpth`; $test -f "$try"; then - : - elif try=`./loc lib$thislib X $libpth`; $test -f "$try"; then - : - elif try=`./loc $thislib X $libpth`; $test -f "$try"; then - : - elif try=`./loc Slib$thislib$lib_ext X $xlibpth`; $test -f "$try"; then - : - else - try='' - fi - libnames="$libnames $try" - ;; - *) libnames="$libnames $thislib" ;; - esac - done - ;; -esac -xxx=normal -case "$libc" in -unknown) - set /lib/libc.$so - for xxx in $libpth; do - $test -r $1 || set $xxx/libc.$so - : The messy sed command sorts on library version numbers. - $test -r $1 || \ - set `echo blurfl; echo $xxx/libc.$so.[0-9]* | \ - tr ' ' '\012' | egrep -v '\.[A-Za-z]*$' | $sed -e ' - h - s/[0-9][0-9]*/0000&/g - s/0*\([0-9][0-9][0-9][0-9][0-9]\)/\1/g - G - s/\n/ /' | \ - sort | $sed -e 's/^.* //'` - eval set \$$# - done - $test -r $1 || set /usr/ccs/lib/libc.$so - $test -r $1 || set /lib/libsys_s$lib_ext - ;; -*) - set blurfl - ;; -esac -if $test -r "$1"; then - echo "Your (shared) C library seems to be in $1." - libc="$1" -elif $test -r /lib/libc && $test -r /lib/clib; then - echo "Your C library seems to be in both /lib/clib and /lib/libc." - xxx=apollo - libc='/lib/clib /lib/libc' - if $test -r /lib/syslib; then - echo "(Your math library is in /lib/syslib.)" - libc="$libc /lib/syslib" - fi -elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then - echo "Your C library seems to be in $libc, as you said before." -elif $test -r $incpath/usr/lib/libc$lib_ext; then - libc=$incpath/usr/lib/libc$lib_ext; - echo "Your C library seems to be in $libc. That's fine." -elif $test -r /lib/libc$lib_ext; then - libc=/lib/libc$lib_ext; - echo "Your C library seems to be in $libc. You're normal." -else - if tans=`./loc libc$lib_ext blurfl/dyick $libpth`; $test -r "$tans"; then - : - elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then - libnames="$libnames "`./loc clib blurfl/dyick $libpth` - elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then - : - elif tans=`./loc Slibc$lib_ext blurfl/dyick $xlibpth`; $test -r "$tans"; then - : - elif tans=`./loc Mlibc$lib_ext blurfl/dyick $xlibpth`; $test -r "$tans"; then - : - else - tans=`./loc Llibc$lib_ext blurfl/dyick $xlibpth` - fi - if $test -r "$tans"; then - echo "Your C library seems to be in $tans, of all places." - libc=$tans - else - libc='blurfl' - fi -fi -if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then - dflt="$libc" - cat < libpath - cat >&4 < libnames -set X `cat libnames` -shift -xxx=files -case $# in 1) xxx=file; esac -echo "Extracting names from the following $xxx for later perusal:" >&4 -echo " " -$sed 's/^/ /' libnames >&4 -echo " " -$echo $n "This may take a while...$c" >&4 - -: Linux may need the special Dynamic option to nm for shared libraries. -: In general, this is stored in the nm_so_opt variable. -: Unfortunately, that option may be fatal on non-shared libraries. -for nm_libs_ext in $*; do - case $nm_libs_ext in - *$so*) nm $nm_so_opt $nm_opt $nm_libs_ext 2>/dev/null ;; - *) nm $nm_opt $nm_libs_ext 2>/dev/null ;; - esac -done > libc.tmp - -$echo $n ".$c" -$grep fprintf libc.tmp > libc.ptf -xscan='eval "libc.list"; $echo $n ".$c" >&4' -xrun='eval "libc.list"; echo "done" >&4' -xxx='[ADTSIW]' -if com="$sed -n -e 's/__IO//' -e 's/^.* $xxx *_[_.]*//p' -e 's/^.* $xxx *//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \ - -e '/ file/d' -e 's/^\([^ ]*\).*/\1/p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^.*|Proc .*|Text *| *//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e '/Def. Text/s/.* \([^ ]*\)\$/\1/p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/^[-0-9a-f ]*_\(.*\)=.*/\1/p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -elif com="$sed -n -e 's/.*\.text n\ \ \ \.//p'";\ - eval $xscan;\ - $contains '^fprintf$' libc.list >/dev/null 2>&1; then - eval $xrun -else - nm -p $* 2>/dev/null >libc.tmp - $grep fprintf libc.tmp > libc.ptf - if com="$sed -n -e 's/^.* [ADTSIW] *_[_.]*//p' -e 's/^.* [ADTSIW] //p'";\ - eval $xscan; $contains '^fprintf$' libc.list >/dev/null 2>&1 - then - nm_opt='-p' - eval $xrun - else - echo " " - echo "nm didn't seem to work right. Trying ar instead..." >&4 - com='' - if ar t $libc > libc.tmp; then - for thisname in $libnames; do - ar t $thisname >>libc.tmp - done - $sed -e 's/\.o$//' < libc.tmp > libc.list - echo "Ok." >&4 - else - echo "ar didn't seem to work right." >&4 - echo "Maybe this is a Cray...trying bld instead..." >&4 - if bld t $libc | $sed -e 's/.*\///' -e 's/\.o:.*$//' > libc.list - then - for thisname in $libnames; do - bld t $libnames | \ - $sed -e 's/.*\///' -e 's/\.o:.*$//' >>libc.list - ar t $thisname >>libc.tmp - done - echo "Ok." >&4 - else - echo "That didn't work either. Giving up." >&4 - exit 1 - fi - fi - fi -fi -nm_extract="$com" -if $test -f /lib/syscalls.exp; then - echo " " - echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4 - $sed -n 's/^\([^ ]*\)[ ]*syscall$/\1/p' /lib/syscalls.exp >>libc.list -fi -;; -esac -$rm -f libnames libpath - -: determine filename position in cpp output -echo " " -echo "Computing filename position in cpp output for #include directives..." >&4 -echo '#include ' > foo.c -$cat >fieldn </dev/null | \ -$grep '^[ ]*#.*stdio\.h' | \ -while read cline; do - pos=1 - set \$cline - while $test \$# -gt 0; do - if $test -r \`echo \$1 | $tr -d '"'\`; then - echo "\$pos" - exit 0 - fi - shift - pos=\`expr \$pos + 1\` - done -done -EOF -chmod +x fieldn -fieldn=`./fieldn` -$rm -f foo.c fieldn -case $fieldn in -'') pos='???';; -1) pos=first;; -2) pos=second;; -3) pos=third;; -*) pos="${fieldn}th";; -esac -echo "Your cpp writes the filename in the $pos field of the line." - -: locate header file -$cat >findhdr <" > foo\$\$.c -$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \ -$grep "^[ ]*#.*\$wanted" | \ -while read cline; do - name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\` - case "\$name" in - */\$wanted) echo "\$name"; exit 0;; - *) name='';; - esac; -done; -$rm -f foo\$\$.c; -case "\$name" in -'') exit 1;; -esac -EOF -chmod +x findhdr - -: define an alternate in-header-list? function -inhdr='echo " "; td=$define; tu=$undef; yyy=$@; -cont=true; xxf="echo \"<\$1> found.\" >&4"; -case $# in 2) xxnf="echo \"<\$1> NOT found.\" >&4";; -*) xxnf="echo \"<\$1> NOT found, ...\" >&4";; -esac; -case $# in 4) instead=instead;; *) instead="at last";; esac; -while $test "$cont"; do - xxx=`./findhdr $1` - var=$2; eval "was=\$$2"; - if $test "$xxx" && $test -r "$xxx"; - then eval $xxf; - eval "case \"\$$var\" in $undef) . ./whoa; esac"; eval "$var=\$td"; - cont=""; - else eval $xxnf; - eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu"; fi; - set $yyy; shift; shift; yyy=$@; - case $# in 0) cont="";; - 2) xxf="echo \"but I found <\$1> $instead.\" >&4"; - xxnf="echo \"and I did not find <\$1> either.\" >&4";; - *) xxf="echo \"but I found <\$1\> instead.\" >&4"; - xxnf="echo \"there is no <\$1>, ...\" >&4";; - esac; -done; -while $test "$yyy"; -do set $yyy; var=$2; eval "was=\$$2"; - eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu"; - set $yyy; shift; shift; yyy=$@; -done' - -: see if dld is available -set dld.h i_dld -eval $inhdr - -: is a C symbol defined? -csym='tlook=$1; -case "$3" in --v) tf=libc.tmp; tc=""; tdc="";; --a) tf=libc.tmp; tc="[0]"; tdc="[]";; -*) tlook="^$1\$"; tf=libc.list; tc="()"; tdc="()";; -esac; -tx=yes; -case "$reuseval-$4" in -true-) ;; -true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;; -esac; -case "$tx" in -yes) - case "$runnm" in - true) - if $contains $tlook $tf >/dev/null 2>&1; - then tval=true; - else tval=false; - fi;; - *) - echo "main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c; - if $cc $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1; - then tval=true; - else tval=false; - fi; - $rm -f t t.c;; - esac;; -*) - case "$tval" in - $define) tval=true;; - *) tval=false;; - esac;; -esac; -eval "$2=$tval"' - -: define an is-in-libc? function -inlibc='echo " "; td=$define; tu=$undef; -sym=$1; var=$2; eval "was=\$$2"; -tx=yes; -case "$reuseval$was" in -true) ;; -true*) tx=no;; -esac; -case "$tx" in -yes) - set $sym tres -f; - eval $csym; - case "$tres" in - true) - echo "$sym() found." >&4; - case "$was" in $undef) . ./whoa; esac; eval "$var=\$td";; - *) - echo "$sym() NOT found." >&4; - case "$was" in $define) . ./whoa; esac; eval "$var=\$tu";; - esac;; -*) - case "$was" in - $define) echo "$sym() found." >&4;; - *) echo "$sym() NOT found." >&4;; - esac;; -esac' - -: see if dlopen exists -xxx_runnm="$runnm" -runnm=false -set dlopen d_dlopen -eval $inlibc -runnm="$xxx_runnm" - -: determine which dynamic loading, if any, to compile in -echo " " -dldir="ext/DynaLoader" -case "$usedl" in -$define|y|true) - dflt='y' - usedl="$define" - ;; -$undef|n|false) - dflt='n' - usedl="$undef" - ;; -*) - dflt='n' - case "$d_dlopen" in - $define) dflt='y' ;; - esac - case "$i_dld" in - $define) dflt='y' ;; - esac - : Does a dl_xxx.xs file exist for this operating system - $test -f ../$dldir/dl_${osname}.xs && dflt='y' - ;; -esac -rp="Do you wish to use dynamic loading?" -. ./myread -usedl="$ans" -case "$ans" in -y*) usedl="$define" - case "$dlsrc" in - '') - if $test -f ../$dldir/dl_${osname}.xs ; then - dflt="$dldir/dl_${osname}.xs" - elif $test "$d_dlopen" = "$define" ; then - dflt="$dldir/dl_dlopen.xs" - elif $test "$i_dld" = "$define" ; then - dflt="$dldir/dl_dld.xs" - else - dflt='' - fi - ;; - *) dflt="$dldir/$dlsrc" - ;; - esac - echo "The following dynamic loading files are available:" - : Can not go over to $dldir because getfile has path hard-coded in. - cd ..; ls -C $dldir/dl*.xs; cd UU - rp="Source file to use for dynamic loading" - fn="fne" - . ./getfile - usedl="$define" - : emulate basename - dlsrc=`echo $ans | $sed -e 's@.*/\([^/]*\)$@\1@'` - - $cat << EOM - -Some systems may require passing special flags to $cc -c to -compile modules that will be used to create a shared library. -To use no flags, say "none". - -EOM - case "$cccdlflags" in - '') case "$gccversion" in - '') case "$osname" in - hpux) dflt='+z' ;; - next) dflt='none' ;; - svr4*|esix*) dflt='-Kpic' ;; - irix*) dflt='-KPIC' ;; - solaris) case "$ccflags" in - *-DDEBUGGING*) dflt='-KPIC' ;; - *) dflt='-Kpic' ;; - esac ;; - sunos) dflt='-pic' ;; - *) dflt='none' ;; - esac ;; - *) case "$osname/$ccflags" in - solaris/*-DDEBUGGING*) dflt='-fPIC' ;; - *) dflt='-fpic' ;; - esac ;; - esac ;; - *) dflt="$cccdlflags" ;; - esac - rp="Any special flags to pass to $cc -c to compile shared library modules?" - . ./myread - case "$ans" in - none) cccdlflags=' ' ;; - *) cccdlflags="$ans" ;; - esac - - cat << EOM - -Some systems use ld to create libraries that can be dynamically loaded, -while other systems (such as those using ELF) use $cc. - -EOM - case "$ld" in - '') $cat >try.c <<'EOM' -/* Test for whether ELF binaries are produced */ -#include -#include -main() { - char b[4]; - int i = open("a.out",O_RDONLY); - if(i == -1) - exit(1); /* fail */ - if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F') - exit(0); /* succeed (yes, it's ELF) */ - else - exit(1); /* fail */ -} -EOM - if $cc $ccflags try.c >/dev/null 2>&1 && ./a.out; then - cat <&4 - -To build perl, you must add the current working directory to your -$xxx environtment variable before running make. You can do -this with - $xxx=\`pwd\`; export $xxx -for Bourne-style shells, or - setenv $xxx \`pwd\` -for Csh-style shells. You *MUST* do this before running make. - -EOM - ;; - *) useshrplib='false' ;; - esac - ;; -esac - -case "$useshrplib" in -true) - case "$libperl" in - '') - # Figure out a good name for libperl.so. Since it gets stored in - # a version-specific architecture-dependent library, the version - # number isn't really that important, except for making cc/ld happy. - # - # A name such as libperl.so.3.1 - majmin="libperl.$so.$patchlevel.$subversion" - # A name such as libperl.so.301 - majonly=`echo $patchlevel $subversion | - $awk '{printf "%d%02d", $1, $2}'` - majonly=libperl.$so.$majonly - # I'd prefer to keep the os-specific stuff here to a minimum, and - # rely on figuring it out from the naming of libc. - case "${osname}${osvers}" in - next4*) - dflt=libperl.5.$so - # XXX How handle the --version stuff for MAB? - ;; - linux*) # ld won't link with a bare -lperl otherwise. - dflt=libperl.$so - ;; - *) # Try to guess based on whether libc has major.minor. - case "$libc" in - *libc.$so.[0-9]*.[0-9]*) dflt=$majmin ;; - *libc.$so.[0-9]*) dflt=$majonly ;; - *) dflt=libperl.$so ;; - esac - ;; - esac - ;; - *) dflt=$libperl - ;; - esac - cat << EOM - -I need to select a good name for the shared libperl. If your system uses -library names with major and minor numbers, then you might want something -like $majmin. Alternatively, if your system uses a single version -number for shared libraries, then you might want to use $majonly. -Or, your system might be quite happy with a simple libperl.$so. - -Since the shared libperl will get installed into a version-specific -architecture-dependent directory, the version number of the shared perl -library probably isn't important, so the default should be o.k. - -EOM - rp='What name do you want to give to the shared libperl?' - . ./myread - libperl=$ans - echo "Ok, I'll use $libperl" - ;; -*) - libperl="libperl${lib_ext}" - ;; -esac - -# Detect old use of shrpdir via undocumented Configure -Dshrpdir -case "$shrpdir" in -'') ;; -*) $cat >&4 <&4 <&4 <&4 - -Adding $xxx to the flags -passed to $ld so that the perl executable will find the -installed shared $libperl. - -EOM - ;; - esac - ;; - esac -fi -# Respect a hint or command-line value. -case "$shrpenv" in -'') shrpenv="$tmp_shrpenv" ;; -esac - -: determine where manual pages go -set man1dir man1dir none -eval $prefixit -$cat <$first) 2>/dev/null; then - if $test -f 123456789abcde; then - echo 'You cannot have filenames longer than 14 characters. Sigh.' >&4 - val="$undef" - else - if (echo hi >$second) 2>/dev/null; then - if $test -f /tmp/cf$$/123456789abcde; then - $cat <<'EOM' -That's peculiar... You can have filenames longer than 14 characters, but only -on some of the filesystems. Maybe you are using NFS. Anyway, to avoid problems -I shall consider your system cannot support long filenames at all. -EOM - val="$undef" - else - echo 'You can have filenames longer than 14 characters.' >&4 - val="$define" - fi - else - $cat <<'EOM' -How confusing! Some of your filesystems are sane enough to allow filenames -longer than 14 characters but some others like /tmp can't even think about them. -So, for now on, I shall assume your kernel does not allow them at all. -EOM - val="$undef" - fi - fi -else - $cat <<'EOM' -You can't have filenames longer than 14 chars. You can't even think about them! -EOM - val="$undef" -fi -set d_flexfnam -eval $setvar -$rm -rf /tmp/cf$$ 123456789abcde* - -: determine where library module manual pages go -set man3dir man3dir none -eval $prefixit -$cat </dev/null 2>&1; then - dflt=y - else - dflt=n - fi;; - *) dflt=n;; - esac - echo " " - rp='Are you getting the hosts file via yellow pages?' - . ./myread - case "$ans" in - y*) hostcat='ypcat hosts';; - *) hostcat='cat /etc/hosts';; - esac - ;; - esac -fi - -: now get the host name -echo " " -echo "Figuring out host name..." >&4 -case "$myhostname" in -'') cont=true - echo 'Maybe "hostname" will work...' - if tans=`sh -c hostname 2>&1` ; then - myhostname=$tans - phostname=hostname - cont='' - fi - ;; -*) cont='';; -esac -if $test "$cont"; then - if ./xenix; then - echo 'Oh, dear. Maybe "/etc/systemid" is the key...' - if tans=`cat /etc/systemid 2>&1` ; then - myhostname=$tans - phostname='cat /etc/systemid' - echo "Whadyaknow. Xenix always was a bit strange..." - cont='' - fi - elif $test -r /etc/systemid; then - echo "(What is a non-Xenix system doing with /etc/systemid?)" - fi -fi -if $test "$cont"; then - echo 'No, maybe "uuname -l" will work...' - if tans=`sh -c 'uuname -l' 2>&1` ; then - myhostname=$tans - phostname='uuname -l' - else - echo 'Strange. Maybe "uname -n" will work...' - if tans=`sh -c 'uname -n' 2>&1` ; then - myhostname=$tans - phostname='uname -n' - else - echo 'Oh well, maybe I can mine it out of whoami.h...' - if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then - myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'` - phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h" - else - case "$myhostname" in - '') echo "Does this machine have an identity crisis or something?" - phostname='';; - *) - echo "Well, you said $myhostname before..." - phostname='echo $myhostname';; - esac - fi - fi - fi -fi -: you do not want to know about this -set $myhostname -myhostname=$1 - -: verify guess -if $test "$myhostname" ; then - dflt=y - rp='Your host name appears to be "'$myhostname'".'" Right?" - . ./myread - case "$ans" in - y*) ;; - *) myhostname='';; - esac -fi - -: bad guess or no guess -while $test "X$myhostname" = X ; do - dflt='' - rp="Please type the (one word) name of your host:" - . ./myread - myhostname="$ans" -done - -: translate upper to lower if necessary -case "$myhostname" in -*[A-Z]*) - echo "(Normalizing case in your host name)" - myhostname=`echo $myhostname | ./tr '[A-Z]' '[a-z]'` - ;; -esac - -case "$myhostname" in -*.*) - dflt=`expr "X$myhostname" : "X[^.]*\(\..*\)"` - myhostname=`expr "X$myhostname" : "X\([^.]*\)\."` - echo "(Trimming domain name from host name--host name is now $myhostname)" - ;; -*) case "$mydomain" in - '') - { - : If we use NIS, try ypmatch. - : Is there some reason why this was not done before? - test "X$hostcat" = "Xypcat hosts" && - ypmatch "$myhostname" hosts 2>/dev/null |\ - $sed -e 's/[ ]*#.*//; s/$/ /' > hosts && \ - $test -s hosts - } || { - : Extract only the relevant hosts, reducing file size, - : remove comments, insert trailing space for later use. - $hostcat | $sed -n -e "s/[ ]*#.*//; s/\$/ / - /[ ]$myhostname[ . ]/p" > hosts - } - tmp_re="[ . ]" - $test x`$awk "/[0-9].*[ ]$myhostname$tmp_re/ { sum++ } - END { print sum }" hosts` = x1 || tmp_re="[ ]" - dflt=.`$awk "/[0-9].*[ ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \ - hosts | $sort | $uniq | \ - $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"` - case `$echo X$dflt` in - X*\ *) echo "(Several hosts in /etc/hosts matched hostname)" - dflt=. - ;; - X.) echo "(You do not have fully-qualified names in /etc/hosts)" - ;; - esac - case "$dflt" in - .) - tans=`./loc resolv.conf X /etc /usr/etc` - if $test -f "$tans"; then - echo "(Attempting domain name extraction from $tans)" - : Why was there an Egrep here, when Sed works? - : Look for either a search or a domain directive. - dflt=.`$sed -n -e 's/ / /g' \ - -e 's/^search *\([^ ]*\).*/\1/p' $tans \ - | ./tr '[A-Z]' '[a-z]' 2>/dev/null` - case "$dflt" in - .) dflt=.`$sed -n -e 's/ / /g' \ - -e 's/^domain *\([^ ]*\).*/\1/p' $tans \ - | ./tr '[A-Z]' '[a-z]' 2>/dev/null` - ;; - esac - fi - ;; - esac - case "$dflt" in - .) echo "(No help from resolv.conf either -- attempting clever guess)" - dflt=.`sh -c domainname 2>/dev/null` - case "$dflt" in - '') dflt='.';; - .nis.*|.yp.*|.main.*) dflt=`echo $dflt | $sed -e 's/^\.[^.]*//'`;; - esac - ;; - esac - case "$dflt" in - .) echo "(Lost all hope -- silly guess then)" - dflt='.uucp' - ;; - esac - $rm -f hosts - ;; - *) dflt="$mydomain";; - esac;; -esac -echo " " -rp="What is your domain name?" -. ./myread -tans="$ans" -case "$ans" in -'') ;; -.*) ;; -*) tans=".$tans";; -esac -mydomain="$tans" - -: translate upper to lower if necessary -case "$mydomain" in -*[A-Z]*) - echo "(Normalizing case in your domain name)" - mydomain=`echo $mydomain | ./tr '[A-Z]' '[a-z]'` - ;; -esac - -: a little sanity check here -case "$phostname" in -'') ;; -*) - case `$phostname | ./tr '[A-Z]' '[a-z]'` in - $myhostname$mydomain|$myhostname) ;; - *) - case "$phostname" in - sed*) - echo "(That doesn't agree with your whoami.h file, by the way.)" - ;; - *) - echo "(That doesn't agree with your $phostname command, by the way.)" - ;; - esac - ;; - esac - ;; -esac - -$cat <&4 <. Versions 5.003_02 and later of perl allow alternate IO -mechanisms via a "PerlIO" abstraction, but the stdio mechanism is still -the default and is the only supported mechanism. This abstraction -layer can use AT&T's sfio (if you already have sfio installed) or -fall back on standard IO. This PerlIO abstraction layer is -experimental and may cause problems with some extension modules. - -If this doesn't make any sense to you, just accept the default 'n'. -EOM -case "$useperlio" in -$define|true|[yY]*) dflt='y';; -*) dflt='n';; -esac -rp='Use the experimental PerlIO abstraction layer?' -. ./myread -case "$ans" in -y|Y) - val="$define" - ;; -*) - echo "Ok, doing things the stdio way" - val="$undef" - ;; -esac -set useperlio -eval $setvar - -: Check how to convert floats to strings. -echo " " -echo "Checking for an efficient way to convert floats to strings." -$cat >try.c <<'EOP' -#ifdef TRY_gconvert -#define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b)) -char *myname = "gconvert"; -#endif -#ifdef TRY_gcvt -#define Gconvert(x,n,t,b) gcvt((x),(n),(b)) -char *myname = "gcvt"; -#endif -#ifdef TRY_sprintf -#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) -char *myname = "sprintf"; -#endif - -#include - -int -checkit(expect, got) -char *expect; -char *got; -{ - if (strcmp(expect, got)) { - printf("%s oddity: Expected %s, got %s\n", - myname, expect, got); - exit(1); - } -} - -int -main() -{ - char buf[64]; - buf[63] = '\0'; - - /* This must be 1st test on (which?) platform */ - /* Alan Burlison */ - Gconvert(0.1, 8, 0, buf); - checkit("0.1", buf); - - Gconvert(1.0, 8, 0, buf); - checkit("1", buf); - - Gconvert(0.0, 8, 0, buf); - checkit("0", buf); - - Gconvert(-1.0, 8, 0, buf); - checkit("-1", buf); - - /* Some Linux gcvt's give 1.e+5 here. */ - Gconvert(100000.0, 8, 0, buf); - checkit("100000", buf); - - /* Some Linux gcvt's give -1.e+5 here. */ - Gconvert(-100000.0, 8, 0, buf); - checkit("-100000", buf); - - exit(0); -} -EOP -case "$d_Gconvert" in -gconvert*) xxx_list='gconvert gcvt sprintf' ;; -gcvt*) xxx_list='gcvt gconvert sprintf' ;; -sprintf*) xxx_list='sprintf gconvert gcvt' ;; -*) xxx_list='gconvert gcvt sprintf' ;; -esac - -for xxx_convert in $xxx_list; do - echo "Trying $xxx_convert" - $rm -f try try.o - if $cc $ccflags -DTRY_$xxx_convert $ldflags -o try \ - try.c $libs > /dev/null 2>&1 ; then - echo "$xxx_convert" found. >&4 - if ./try; then - echo "I'll use $xxx_convert to convert floats into a string." >&4 - break; - else - echo "...But $xxx_convert didn't work as I expected." - fi - else - echo "$xxx_convert NOT found." >&4 - fi -done - -case "$xxx_convert" in -gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;; -gcvt) d_Gconvert='gcvt((x),(n),(b))' ;; -*) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;; -esac - -: Initialize h_fcntl -h_fcntl=false - -: Initialize h_sysfile -h_sysfile=false - -: access call always available on UNIX -set access d_access -eval $inlibc - -: locate the flags for 'access()' -case "$d_access" in -"$define") - echo " " - $cat >access.c <<'EOCP' -#include -#ifdef I_FCNTL -#include -#endif -#ifdef I_SYS_FILE -#include -#endif -#ifdef I_UNISTD -#include -#endif -main() { - exit(R_OK); -} -EOCP - : check sys/file.h first, no particular reason here - if $test `./findhdr sys/file.h` && \ - $cc $cppflags -DI_SYS_FILE access.c -o access >/dev/null 2>&1 ; then - h_sysfile=true; - echo " defines the *_OK access constants." >&4 - elif $test `./findhdr fcntl.h` && \ - $cc $cppflags -DI_FCNTL access.c -o access >/dev/null 2>&1 ; then - h_fcntl=true; - echo " defines the *_OK access constants." >&4 - elif $test `./findhdr unistd.h` && \ - $cc $cppflags -DI_UNISTD access.c -o access >/dev/null 2>&1 ; then - echo " defines the *_OK access constants." >&4 - else - echo "I can't find the four *_OK access constants--I'll use mine." >&4 - fi - ;; -esac -$rm -f access* - -: see if alarm exists -set alarm d_alarm -eval $inlibc - -: Look for GNU-cc style attribute checking -echo " " -echo "Checking whether your compiler can handle __attribute__ ..." >&4 -$cat >attrib.c <<'EOCP' -#include -void croak (char* pat,...) __attribute__((format(printf,1,2),noreturn)); -EOCP -if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then - if $contains 'warning' attrib.out >/dev/null 2>&1; then - echo "Your C compiler doesn't fully support __attribute__." - val="$undef" - else - echo "Your C compiler supports __attribute__." - val="$define" - fi -else - echo "Your C compiler doesn't seem to understand __attribute__ at all." - val="$undef" -fi -set d_attribut -eval $setvar -$rm -f attrib* - -: see if bcmp exists -set bcmp d_bcmp -eval $inlibc - -: see if bcopy exists -set bcopy d_bcopy -eval $inlibc - -: see if this is a unistd.h system -set unistd.h i_unistd -eval $inhdr - -: see if getpgrp exists -set getpgrp d_getpgrp -eval $inlibc - -echo "Checking to see which flavor of getpgrp is in use . . . " -case "$d_getpgrp" in -"$define") - echo " " - $cat >set.c < -#ifdef I_UNISTD -# include -#endif -main() -{ - if (getuid() == 0) { - printf("(I see you are running Configure as super-user...)\n"); - setuid(1); - } -#ifdef TRY_BSD_PGRP - if (getpgrp(1) == 0) - exit(0); -#else - if (getpgrp() > 0) - exit(0); -#endif - exit(1); -} -EOP - if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then - echo "You have to use getpgrp(pid) instead of getpgrp()." >&4 - val="$define" - elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then - echo "You have to use getpgrp() instead of getpgrp(pid)." >&4 - val="$undef" - else - echo "I can't seem to compile and run the test program." - if ./usg; then - xxx="a USG one, i.e. you use getpgrp()." - else - # SVR4 systems can appear rather BSD-ish. - case "$i_unistd" in - $undef) - xxx="a BSD one, i.e. you use getpgrp(pid)." - val="$define" - ;; - $define) - xxx="probably a USG one, i.e. you use getpgrp()." - val="$undef" - ;; - esac - fi - echo "Assuming your getpgrp is $xxx" >&4 - fi - ;; -*) val="$undef";; -esac -set d_bsdgetpgrp -eval $setvar -$rm -f set set.c - -: see if setpgrp exists -set setpgrp d_setpgrp -eval $inlibc - -echo "Checking to see which flavor of setpgrp is in use . . . " -case "$d_setpgrp" in -"$define") - echo " " - $cat >set.c < -#ifdef I_UNISTD -# include -#endif -main() -{ - if (getuid() == 0) { - printf("(I see you are running Configure as super-user...)\n"); - setuid(1); - } -#ifdef TRY_BSD_PGRP - if (-1 == setpgrp(1, 1)) - exit(0); -#else - if (setpgrp() != -1) - exit(0); -#endif - exit(1); -} -EOP - if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then - echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4 - val="$define" - elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then - echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4 - val="$undef" - else - echo "I can't seem to compile and run the test program." - if ./usg; then - xxx="a USG one, i.e. you use setpgrp()." - else - # SVR4 systems can appear rather BSD-ish. - case "$i_unistd" in - $undef) - xxx="a BSD one, i.e. you use setpgrp(pid,pgrp)." - val="$define" - ;; - $define) - xxx="probably a USG one, i.e. you use setpgrp()." - val="$undef" - ;; - esac - fi - echo "Assuming your setpgrp is $xxx" >&4 - fi - ;; -*) val="$undef";; -esac -set d_bsdsetpgrp -eval $setvar -d_bsdpgrp=$d_bsdsetpgrp -$rm -f set set.c -: see if bzero exists -set bzero d_bzero -eval $inlibc - -: check for lengths of integral types -echo " " -case "$intsize" in -'') - echo "Checking to see how big your integers are..." >&4 - $cat >intsize.c <<'EOCP' -#include -main() -{ - printf("intsize=%d;\n", sizeof(int)); - printf("longsize=%d;\n", sizeof(long)); - printf("shortsize=%d;\n", sizeof(short)); - fflush(stdout); - exit(0); -} -EOCP -# If $libs contains -lsfio, and sfio is mis-configured, then it -# sometimes (apparently) runs and exits with a 0 status, but with no -# output!. Thus we check with test -s whether we actually got any -# output. I think it has to do with sfio's use of _exit vs. exit, -# but I don't know for sure. --Andy Dougherty 1/27/97. - if $cc $optimize $ccflags $ldflags -o intsize intsize.c $libs >/dev/null 2>&1 && - ./intsize > intsize.out 2>/dev/null && test -s intsize.out ; then - eval `$cat intsize.out` - echo "Your integers are $intsize bytes long." - echo "Your long integers are $longsize bytes long." - echo "Your short integers are $shortsize bytes long." - else - $cat >&4 <$$.tmp 2>/dev/null -if $contains 'int.*\*[ ]*signal' $$.tmp >/dev/null 2>&1 ; then - echo "You have int (*signal())() instead of void." >&4 - val="$undef" -elif $contains 'void.*\*[ ]*signal' $$.tmp >/dev/null 2>&1 ; then - echo "You have void (*signal())() instead of int." >&4 - val="$define" -elif $contains 'extern[ ]*[(\*]*signal' $$.tmp >/dev/null 2>&1 ; then - echo "You have int (*signal())() instead of void." >&4 - val="$undef" -else - case "$d_voidsig" in - '') - echo "I can't determine whether signal handler returns void or int..." >&4 - dflt=void - rp="What type does your signal handler return?" - . ./myread - case "$ans" in - v*) val="$define";; - *) val="$undef";; - esac;; - "$define") - echo "As you already told me, signal handler returns void." >&4;; - *) - echo "As you already told me, signal handler returns int." >&4;; - esac -fi -set d_voidsig -eval $setvar -case "$d_voidsig" in -"$define") signal_t="void";; -*) signal_t="int";; -esac -$rm -f $$.tmp - -: check for ability to cast large floats to 32-bit ints. -echo " " -echo 'Checking whether your C compiler can cast large floats to int32.' >&4 -if $test "$intsize" -eq 4; then - xxx=int -else - xxx=long -fi -$cat >try.c < -#include -$signal_t blech() { exit(3); } -main() -{ - $xxx i32; - double f; - int result = 0; - signal(SIGFPE, blech); - - f = (double) 0x7fffffff; - f = 10 * f; - i32 = ($xxx) f; - - if (i32 != ($xxx) f) - result |= 1; - exit(result); -} -EOCP -if $cc -o try $ccflags try.c >/dev/null 2>&1; then - ./try - yyy=$? -else - echo "(I can't seem to compile the test program--assuming it can't)" - yyy=1 -fi -case "$yyy" in -0) val="$define" - echo "Yup, it can." - ;; -*) val="$undef" - echo "Nope, it can't." - ;; -esac -set d_casti32 -eval $setvar -$rm -f try try.* - -: check for ability to cast negative floats to unsigned -echo " " -echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4 -$cat >try.c < -#include -$signal_t blech() { exit(7); } -$signal_t blech_in_list() { exit(4); } -unsigned long dummy_long(p) unsigned long p; { return p; } -unsigned int dummy_int(p) unsigned int p; { return p; } -unsigned short dummy_short(p) unsigned short p; { return p; } -main() -{ - double f = -123.; - unsigned long along; - unsigned int aint; - unsigned short ashort; - int result = 0; - - signal(SIGFPE, blech); - along = (unsigned long)f; - aint = (unsigned int)f; - ashort = (unsigned short)f; - if (along != (unsigned long)-123) - result |= 1; - if (aint != (unsigned int)-123) - result |= 1; - if (ashort != (unsigned short)-123) - result |= 1; - f = (double)0x40000000; - f = f + f; - along = 0; - along = (unsigned long)f; - if (along != 0x80000000) - result |= 2; - f -= 1.; - along = 0; - along = (unsigned long)f; - if (along != 0x7fffffff) - result |= 1; - f += 2.; - along = 0; - along = (unsigned long)f; - if (along != 0x80000001) - result |= 2; - if (result) - exit(result); - signal(SIGFPE, blech_in_list); - f = 123.; - along = dummy_long((unsigned long)f); - aint = dummy_int((unsigned int)f); - ashort = dummy_short((unsigned short)f); - if (along != (unsigned long)123) - result |= 4; - if (aint != (unsigned int)123) - result |= 4; - if (ashort != (unsigned short)123) - result |= 4; - exit(result); - -} -EOCP -if $cc -o try $ccflags try.c >/dev/null 2>&1; then - ./try - castflags=$? -else - echo "(I can't seem to compile the test program--assuming it can't)" - castflags=7 -fi -case "$castflags" in -0) val="$define" - echo "Yup, it can." - ;; -*) val="$undef" - echo "Nope, it can't." - ;; -esac -set d_castneg -eval $setvar -$rm -f try.* - -: see if vprintf exists -echo " " -if set vprintf val -f d_vprintf; eval $csym; $val; then - echo 'vprintf() found.' >&4 - val="$define" - $cat >vprintf.c <<'EOF' -#include - -main() { xxx("foo"); } - -xxx(va_alist) -va_dcl -{ - va_list args; - char buf[10]; - - va_start(args); - exit((unsigned long)vsprintf(buf,"%s",args) > 10L); -} -EOF - if $cc $ccflags vprintf.c -o vprintf >/dev/null 2>&1 && ./vprintf; then - echo "Your vsprintf() returns (int)." >&4 - val2="$undef" - else - echo "Your vsprintf() returns (char*)." >&4 - val2="$define" - fi -else - echo 'vprintf() NOT found.' >&4 - val="$undef" - val2="$undef" -fi -set d_vprintf -eval $setvar -val=$val2 -set d_charvspr -eval $setvar - -: see if chown exists -set chown d_chown -eval $inlibc - -: see if chroot exists -set chroot d_chroot -eval $inlibc - -: see if chsize exists -set chsize d_chsize -eval $inlibc - -: check for const keyword -echo " " -echo 'Checking to see if your C compiler knows about "const"...' >&4 -$cat >const.c <<'EOCP' -typedef struct spug { int drokk; } spug; -main() -{ - const char *foo; - const spug y; -} -EOCP -if $cc -c $ccflags const.c >/dev/null 2>&1 ; then - val="$define" - echo "Yup, it does." -else - val="$undef" - echo "Nope, it doesn't." -fi -set d_const -eval $setvar - -: see if crypt exists -echo " " -if set crypt val -f d_crypt; eval $csym; $val; then - echo 'crypt() found.' >&4 - val="$define" - cryptlib='' -else - cryptlib=`./loc Slibcrypt$lib_ext "" $xlibpth` - if $test -z "$cryptlib"; then - cryptlib=`./loc Mlibcrypt$lib_ext "" $xlibpth` - else - cryptlib=-lcrypt - fi - if $test -z "$cryptlib"; then - cryptlib=`./loc Llibcrypt$lib_ext "" $xlibpth` - else - cryptlib=-lcrypt - fi - if $test -z "$cryptlib"; then - cryptlib=`./loc libcrypt$lib_ext "" $libpth` - else - cryptlib=-lcrypt - fi - if $test -z "$cryptlib"; then - echo 'crypt() NOT found.' >&4 - val="$undef" - else - val="$define" - fi -fi -set d_crypt -eval $setvar - -: get csh whereabouts -case "$csh" in -'csh') val="$undef" ;; -*) val="$define" ;; -esac -set d_csh -eval $setvar -: Respect a hint or command line value for full_csh. -case "$full_csh" in -'') full_csh=$csh ;; -esac - -: see if cuserid exists -set cuserid d_cuserid -eval $inlibc - -: see if this is a limits.h system -set limits.h i_limits -eval $inhdr - -: see if this is a float.h system -set float.h i_float -eval $inhdr - -: See if number of significant digits in a double precision number is known -echo " " -$cat >dbl_dig.c < -#endif -#ifdef I_FLOAT -#include -#endif -#ifdef DBL_DIG -printf("Contains DBL_DIG"); -#endif -EOM -$cppstdin $cppflags $cppminus < dbl_dig.c >dbl_dig.E 2>/dev/null -if $contains 'DBL_DIG' dbl_dig.E >/dev/null 2>&1; then - echo "DBL_DIG found." >&4 - val="$define" -else - echo "DBL_DIG NOT found." >&4 - val="$undef" -fi -$rm -f dbl_dig.? -set d_dbl_dig -eval $setvar - -: see if difftime exists -set difftime d_difftime -eval $inlibc - -: see if this is a dirent system -echo " " -if xinc=`./findhdr dirent.h`; $test "$xinc"; then - val="$define" - echo " found." >&4 -else - val="$undef" - if xinc=`./findhdr sys/dir.h`; $test "$xinc"; then - echo " found." >&4 - echo " " - else - xinc=`./findhdr sys/ndir.h` - fi - echo " NOT found." >&4 -fi -set i_dirent -eval $setvar - -: Look for type of directory structure. -echo " " -$cppstdin $cppflags $cppminus < "$xinc" > try.c - -case "$direntrytype" in -''|' ') - case "$i_dirent" in - $define) guess1='struct dirent' ;; - *) guess1='struct direct' ;; - esac - ;; -*) guess1="$direntrytype" - ;; -esac - -case "$guess1" in -'struct dirent') guess2='struct direct' ;; -*) guess2='struct dirent' ;; -esac - -if $contains "$guess1" try.c >/dev/null 2>&1; then - direntrytype="$guess1" - echo "Your directory entries are $direntrytype." >&4 -elif $contains "$guess2" try.c >/dev/null 2>&1; then - direntrytype="$guess2" - echo "Your directory entries seem to be $direntrytype." >&4 -else - echo "I don't recognize your system's directory entries." >&4 - rp="What type is used for directory entries on this system?" - dflt="$guess1" - . ./myread - direntrytype="$ans" -fi -$rm -f try.c - - -: see if the directory entry stores field length -echo " " -$cppstdin $cppflags $cppminus < "$xinc" > try.c -if $contains 'd_namlen' try.c >/dev/null 2>&1; then - echo "Good, your directory entry keeps length information in d_namlen." >&4 - val="$define" -else - echo "Your directory entry does not know about the d_namlen field." >&4 - val="$undef" -fi -set d_dirnamlen -eval $setvar -$rm -f try.c - -: see if dlerror exists -xxx_runnm="$runnm" -runnm=false -set dlerror d_dlerror -eval $inlibc -runnm="$xxx_runnm" - -: see if dlfcn is available -set dlfcn.h i_dlfcn -eval $inhdr - -case "$usedl" in -$define|y|true) - $cat << EOM - -On a few systems, the dynamically loaded modules that perl generates and uses -will need a different extension then shared libs. The default will probably -be appropriate. - -EOM - case "$dlext" in - '') dflt="$so" ;; - *) dflt="$dlext" ;; - esac - rp='What is the extension of dynamically loaded modules' - . ./myread - dlext="$ans" - ;; -*) - dlext="none" - ;; -esac - -: Check if dlsym need a leading underscore -echo " " -val="$undef" - -case "$dlsrc" in -dl_dlopen.xs) - echo "Checking whether your dlsym() needs a leading underscore ..." >&4 - $cat >dyna.c <<'EOM' -fred () { } -EOM - -$cat >fred.c< -#$i_dlfcn I_DLFCN -#ifdef I_DLFCN -#include /* the dynamic linker include file for Sunos/Solaris */ -#else -#include -#include -#include -#endif - -extern int fred() ; - -main() -{ - void * handle ; - void * symbol ; -#ifndef RTLD_LAZY - int mode = 1 ; -#else - int mode = RTLD_LAZY ; -#endif - handle = dlopen("./dyna.$dlext", mode) ; - if (handle == NULL) { - printf ("1\n") ; - fflush (stdout) ; - exit(0); - } - symbol = dlsym(handle, "fred") ; - if (symbol == NULL) { - /* try putting a leading underscore */ - symbol = dlsym(handle, "_fred") ; - if (symbol == NULL) { - printf ("2\n") ; - fflush (stdout) ; - exit(0); - } - printf ("3\n") ; - } - else - printf ("4\n") ; - fflush (stdout) ; - exit(0); -} -EOM - : Call the object file tmp-dyna.o in case dlext=o. - if $cc $ccflags $cccdlflags -c dyna.c > /dev/null 2>&1 && - mv dyna${obj_ext} tmp-dyna${obj_ext} > /dev/null 2>&1 && - $ld $lddlflags -o dyna.$dlext tmp-dyna${obj_ext} > /dev/null 2>&1 && - $cc $ccflags $ldflags $cccdlflags $ccdlflags fred.c -o fred $libs > /dev/null 2>&1; then - xxx=`./fred` - case $xxx in - 1) echo "Test program failed using dlopen." >&4 - echo "Perhaps you should not use dynamic loading." >&4;; - 2) echo "Test program failed using dlsym." >&4 - echo "Perhaps you should not use dynamic loading." >&4;; - 3) echo "dlsym needs a leading underscore" >&4 - val="$define" ;; - 4) echo "dlsym doesn't need a leading underscore." >&4;; - esac - else - echo "I can't compile and run the test program." >&4 - fi - ;; -esac - -$rm -f fred fred.? dyna.$dlext dyna.? tmp-dyna.? - -set d_dlsymun -eval $setvar - -: see if dup2 exists -set dup2 d_dup2 -eval $inlibc - -: Locate the flags for 'open()' -echo " " -$cat >open3.c <<'EOCP' -#include -#ifdef I_FCNTL -#include -#endif -#ifdef I_SYS_FILE -#include -#endif -main() { - if(O_RDONLY); -#ifdef O_TRUNC - exit(0); -#else - exit(1); -#endif -} -EOCP -: check sys/file.h first to get FREAD on Sun -if $test `./findhdr sys/file.h` && \ - $cc $cppflags "-DI_SYS_FILE" open3.c -o open3 >/dev/null 2>&1 ; then - h_sysfile=true; - echo " defines the O_* constants..." >&4 - if ./open3; then - echo "and you have the 3 argument form of open()." >&4 - val="$define" - else - echo "but not the 3 argument form of open(). Oh, well." >&4 - val="$undef" - fi -elif $test `./findhdr fcntl.h` && \ - $cc "-DI_FCNTL" open3.c -o open3 >/dev/null 2>&1 ; then - h_fcntl=true; - echo " defines the O_* constants..." >&4 - if ./open3; then - echo "and you have the 3 argument form of open()." >&4 - val="$define" - else - echo "but not the 3 argument form of open(). Oh, well." >&4 - val="$undef" - fi -else - val="$undef" - echo "I can't find the O_* constant definitions! You got problems." >&4 -fi -set d_open3 -eval $setvar -$rm -f open3* - -: check for non-blocking I/O stuff -case "$h_sysfile" in -true) echo "#include " > head.c;; -*) - case "$h_fcntl" in - true) echo "#include " > head.c;; - *) echo "#include " > head.c;; - esac - ;; -esac -echo " " -echo "Figuring out the flag used by open() for non-blocking I/O..." >&4 -case "$o_nonblock" in -'') - $cat head.c > try.c - $cat >>try.c <<'EOCP' -main() { -#ifdef O_NONBLOCK - printf("O_NONBLOCK\n"); - exit(0); -#endif -#ifdef O_NDELAY - printf("O_NDELAY\n"); - exit(0); -#endif -#ifdef FNDELAY - printf("FNDELAY\n"); - exit(0); -#endif - exit(0); -} -EOCP - if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1; then - o_nonblock=`./try` - case "$o_nonblock" in - '') echo "I can't figure it out, assuming O_NONBLOCK will do.";; - *) echo "Seems like we can use $o_nonblock.";; - esac - else - echo "(I can't compile the test program; pray O_NONBLOCK is right!)" - fi - ;; -*) echo "Using $hint value $o_nonblock.";; -esac -$rm -f try try.* .out core - -echo " " -echo "Let's see what value errno gets from read() on a $o_nonblock file..." >&4 -case "$eagain" in -'') - $cat head.c > try.c - $cat >>try.c < -#include -#include -#define MY_O_NONBLOCK $o_nonblock -extern int errno; -$signal_t blech(x) int x; { exit(3); } -EOCP - $cat >> try.c <<'EOCP' -main() -{ - int pd[2]; - int pu[2]; - char buf[1]; - char string[100]; - - pipe(pd); /* Down: child -> parent */ - pipe(pu); /* Up: parent -> child */ - if (0 != fork()) { - int ret; - close(pd[1]); /* Parent reads from pd[0] */ - close(pu[0]); /* Parent writes (blocking) to pu[1] */ - if (-1 == fcntl(pd[0], F_SETFL, MY_O_NONBLOCK)) - exit(1); - signal(SIGALRM, blech); - alarm(5); - if ((ret = read(pd[0], buf, 1)) > 0) /* Nothing to read! */ - exit(2); - sprintf(string, "%d\n", ret); - write(2, string, strlen(string)); - alarm(0); -#ifdef EAGAIN - if (errno == EAGAIN) { - printf("EAGAIN\n"); - goto ok; - } -#endif -#ifdef EWOULDBLOCK - if (errno == EWOULDBLOCK) - printf("EWOULDBLOCK\n"); -#endif - ok: - write(pu[1], buf, 1); /* Unblocks child, tell it to close our pipe */ - sleep(2); /* Give it time to close our pipe */ - alarm(5); - ret = read(pd[0], buf, 1); /* Should read EOF */ - alarm(0); - sprintf(string, "%d\n", ret); - write(3, string, strlen(string)); - exit(0); - } - - close(pd[0]); /* We write to pd[1] */ - close(pu[1]); /* We read from pu[0] */ - read(pu[0], buf, 1); /* Wait for parent to signal us we may continue */ - close(pd[1]); /* Pipe pd is now fully closed! */ - exit(0); /* Bye bye, thank you for playing! */ -} -EOCP - if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1; then - echo "$startsh" >mtry - echo "./try >try.out 2>try.ret 3>try.err || exit 4" >>mtry - chmod +x mtry - ./mtry >/dev/null 2>&1 - case $? in - 0) eagain=`$cat try.out`;; - 1) echo "Could not perform non-blocking setting!";; - 2) echo "I did a successful read() for something that was not there!";; - 3) echo "Hmm... non-blocking I/O does not seem to be working!";; - *) echo "Something terribly wrong happened during testing.";; - esac - rd_nodata=`$cat try.ret` - echo "A read() system call with no data present returns $rd_nodata." - case "$rd_nodata" in - 0|-1) ;; - *) - echo "(That's peculiar, fixing that to be -1.)" - rd_nodata=-1 - ;; - esac - case "$eagain" in - '') - echo "Forcing errno EAGAIN on read() with no data available." - eagain=EAGAIN - ;; - *) - echo "Your read() sets errno to $eagain when no data is available." - ;; - esac - status=`$cat try.err` - case "$status" in - 0) echo "And it correctly returns 0 to signal EOF.";; - -1) echo "But it also returns -1 to signal EOF, so be careful!";; - *) echo "However, your read() returns '$status' on EOF??";; - esac - val="$define" - if test "$status" = "$rd_nodata"; then - echo "WARNING: you can't distinguish between EOF and no data!" - val="$undef" - fi - else - echo "I can't compile the test program--assuming errno EAGAIN will do." - eagain=EAGAIN - fi - set d_eofnblk - eval $setvar - ;; -*) - echo "Using $hint value $eagain." - echo "Your read() returns $rd_nodata when no data is present." - case "$d_eofnblk" in - "$define") echo "And you can see EOF because read() returns 0.";; - "$undef") echo "But you can't see EOF status from read() returned value.";; - *) - echo "(Assuming you can't see EOF status from read anyway.)" - d_eofnblk=$undef - ;; - esac - ;; -esac -$rm -f try try.* .out core head.c mtry - -: see if fchmod exists -set fchmod d_fchmod -eval $inlibc - -: see if fchown exists -set fchown d_fchown -eval $inlibc - -: see if this is an fcntl system -set fcntl d_fcntl -eval $inlibc - -: see if fgetpos exists -set fgetpos d_fgetpos -eval $inlibc - -: see if flock exists -set flock d_flock -eval $inlibc - -: see if fork exists -set fork d_fork -eval $inlibc - -: see if pathconf exists -set pathconf d_pathconf -eval $inlibc - -: see if fpathconf exists -set fpathconf d_fpathconf -eval $inlibc - -: see if fsetpos exists -set fsetpos d_fsetpos -eval $inlibc - -: see if gethostent exists -set gethostent d_gethent -eval $inlibc - -: see if getlogin exists -set getlogin d_getlogin -eval $inlibc - -: see if getpgid exists -set getpgid d_getpgid -eval $inlibc - -: see if getpgrp2 exists -set getpgrp2 d_getpgrp2 -eval $inlibc - -: see if getppid exists -set getppid d_getppid -eval $inlibc - -: see if getpriority exists -set getpriority d_getprior -eval $inlibc - -: see if gettimeofday or ftime exists -set gettimeofday d_gettimeod -eval $inlibc -case "$d_gettimeod" in -"$undef") - set ftime d_ftime - eval $inlibc - ;; -*) - val="$undef"; set d_ftime; eval $setvar - ;; -esac -case "$d_gettimeod$d_ftime" in -"$undef$undef") - echo " " - echo 'No ftime() nor gettimeofday() -- timing may be less accurate.' >&4 - ;; -esac - -: see if this is a netinet/in.h or sys/in.h system -set netinet/in.h i_niin sys/in.h i_sysin -eval $inhdr - -: see if htonl --and friends-- exists -val='' -set htonl val -eval $inlibc - -: Maybe they are macros. -case "$val" in -$undef) - $cat >htonl.c < -#include -#$i_niin I_NETINET_IN -#$i_sysin I_SYS_IN -#ifdef I_NETINET_IN -#include -#endif -#ifdef I_SYS_IN -#include -#endif -#ifdef htonl -printf("Defined as a macro."); -#endif -EOM - $cppstdin $cppflags $cppminus < htonl.c >htonl.E 2>/dev/null - if $contains 'Defined as a macro' htonl.E >/dev/null 2>&1; then - val="$define" - echo "But it seems to be defined as a macro." >&4 - fi - $rm -f htonl.? - ;; -esac -set d_htonl -eval $setvar - -: see which of string.h or strings.h is needed -echo " " -strings=`./findhdr string.h` -if $test "$strings" && $test -r "$strings"; then - echo "Using instead of ." >&4 - val="$define" -else - val="$undef" - strings=`./findhdr strings.h` - if $test "$strings" && $test -r "$strings"; then - echo "Using instead of ." >&4 - else - echo "No string header found -- You'll surely have problems." >&4 - fi -fi -set i_string -eval $setvar -case "$i_string" in -"$undef") strings=`./findhdr strings.h`;; -*) strings=`./findhdr string.h`;; -esac - -: index or strchr -echo " " -if set index val -f; eval $csym; $val; then - if set strchr val -f d_strchr; eval $csym; $val; then - if $contains strchr "$strings" >/dev/null 2>&1 ; then - val="$define" - vali="$undef" - echo "strchr() found." >&4 - else - val="$undef" - vali="$define" - echo "index() found." >&4 - fi - else - val="$undef" - vali="$define" - echo "index() found." >&4 - fi -else - if set strchr val -f d_strchr; eval $csym; $val; then - val="$define" - vali="$undef" - echo "strchr() found." >&4 - else - echo "No index() or strchr() found!" >&4 - val="$undef" - vali="$undef" - fi -fi -set d_strchr; eval $setvar -val="$vali" -set d_index; eval $setvar - -: check whether inet_aton exists -set inet_aton d_inetaton -eval $inlibc - -: Look for isascii -echo " " -$cat >isascii.c <<'EOCP' -#include -#include -main() { - int c = 'A'; - if (isascii(c)) - exit(0); - else - exit(1); -} -EOCP -if $cc $ccflags $ldflags -o isascii isascii.c $libs >/dev/null 2>&1 ; then - echo "isascii() found." >&4 - val="$define" -else - echo "isascii() NOT found." >&4 - val="$undef" -fi -set d_isascii -eval $setvar -$rm -f isascii* - -: see if killpg exists -set killpg d_killpg -eval $inlibc - -: see if link exists -set link d_link -eval $inlibc - -: see if localeconv exists -set localeconv d_locconv -eval $inlibc - -: see if lockf exists -set lockf d_lockf -eval $inlibc - -: see if lstat exists -set lstat d_lstat -eval $inlibc - -: see if mblen exists -set mblen d_mblen -eval $inlibc - -: see if mbstowcs exists -set mbstowcs d_mbstowcs -eval $inlibc - -: see if mbtowc exists -set mbtowc d_mbtowc -eval $inlibc - -: see if memcmp exists -set memcmp d_memcmp -eval $inlibc - -: see if memcpy exists -set memcpy d_memcpy -eval $inlibc - -: see if memmove exists -set memmove d_memmove -eval $inlibc - -: see if memset exists -set memset d_memset -eval $inlibc - -: see if mkdir exists -set mkdir d_mkdir -eval $inlibc - -: see if mkfifo exists -set mkfifo d_mkfifo -eval $inlibc - -: see if mktime exists -set mktime d_mktime -eval $inlibc - -: see if msgctl exists -set msgctl d_msgctl -eval $inlibc - -: see if msgget exists -set msgget d_msgget -eval $inlibc - -: see if msgsnd exists -set msgsnd d_msgsnd -eval $inlibc - -: see if msgrcv exists -set msgrcv d_msgrcv -eval $inlibc - -: see how much of the 'msg*(2)' library is present. -h_msg=true -echo " " -case "$d_msgctl$d_msgget$d_msgsnd$d_msgrcv" in -*"$undef"*) h_msg=false;; -esac -: we could also check for sys/ipc.h ... -if $h_msg && $test `./findhdr sys/msg.h`; then - echo "You have the full msg*(2) library." >&4 - val="$define" -else - echo "You don't have the full msg*(2) library." >&4 - val="$undef" -fi -set d_msg -eval $setvar - -: see if this is a malloc.h system -set malloc.h i_malloc -eval $inhdr - -: see if stdlib is available -set stdlib.h i_stdlib -eval $inhdr - -: determine which malloc to compile in -echo " " -case "$usemymalloc" in -''|y*|true) dflt='y' ;; -n*|false) dflt='n' ;; -*) dflt="$usemymalloc" ;; -esac -rp="Do you wish to attempt to use the malloc that comes with $package?" -. ./myread -usemymalloc="$ans" -case "$ans" in -y*|true) - usemymalloc='y' - mallocsrc='malloc.c' - mallocobj='malloc.o' - d_mymalloc="$define" - case "$libs" in - *-lmalloc*) - : Remove malloc from list of libraries to use - echo "Removing unneeded -lmalloc from library list" >&4 - set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'` - shift - libs="$*" - echo "libs = $libs" >&4 - ;; - esac - ;; -*) - usemymalloc='n' - mallocsrc='' - mallocobj='' - d_mymalloc="$undef" - ;; -esac - -: compute the return types of malloc and free -echo " " -$cat >malloc.c < -#include -#ifdef I_MALLOC -#include -#endif -#ifdef I_STDLIB -#include -#endif -#ifdef TRY_MALLOC -void *malloc(); -#endif -#ifdef TRY_FREE -void free(); -#endif -END -case "$malloctype" in -'') - if $cc $ccflags -c -DTRY_MALLOC malloc.c >/dev/null 2>&1; then - malloctype='void *' - else - malloctype='char *' - fi - ;; -esac -echo "Your system wants malloc to return '$malloctype', it would seem." >&4 - -case "$freetype" in -'') - if $cc $ccflags -c -DTRY_FREE malloc.c >/dev/null 2>&1; then - freetype='void' - else - freetype='int' - fi - ;; -esac -echo "Your system uses $freetype free(), it would seem." >&4 -$rm -f malloc.[co] -: see if nice exists -set nice d_nice -eval $inlibc - -: see if pause exists -set pause d_pause -eval $inlibc - -: see if pipe exists -set pipe d_pipe -eval $inlibc - -: see if poll exists -set poll d_poll -eval $inlibc - -: see if this is a pwd.h system -set pwd.h i_pwd -eval $inhdr - -case "$i_pwd" in -$define) - xxx=`./findhdr pwd.h` - $cppstdin $cppflags $cppminus < $xxx >$$.h - - if $contains 'pw_quota' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwquota - eval $setvar - - if $contains 'pw_age' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwage - eval $setvar - - if $contains 'pw_change' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwchange - eval $setvar - - if $contains 'pw_class' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwclass - eval $setvar - - if $contains 'pw_expire' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwexpire - eval $setvar - - if $contains 'pw_comment' $$.h >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - set d_pwcomment - eval $setvar - - $rm -f $$.h - ;; -*) - val="$undef"; - set d_pwquota; eval $setvar - set d_pwage; eval $setvar - set d_pwchange; eval $setvar - set d_pwclass; eval $setvar - set d_pwexpire; eval $setvar - set d_pwcomment; eval $setvar - ;; -esac - -: see if readdir and friends exist -set readdir d_readdir -eval $inlibc -set seekdir d_seekdir -eval $inlibc -set telldir d_telldir -eval $inlibc -set rewinddir d_rewinddir -eval $inlibc - -: see if readlink exists -set readlink d_readlink -eval $inlibc - -: see if rename exists -set rename d_rename -eval $inlibc - -: see if rmdir exists -set rmdir d_rmdir -eval $inlibc - -: see if memory.h is available. -val='' -set memory.h val -eval $inhdr - -: See if it conflicts with string.h -case "$val" in -$define) - case "$strings" in - '') ;; - *) - $cppstdin $cppflags $cppminus < $strings > mem.h - if $contains 'memcpy' mem.h >/dev/null 2>&1; then - echo " " - echo "We won't be including ." - val="$undef" - fi - $rm -f mem.h - ;; - esac -esac -set i_memory -eval $setvar - -: can bcopy handle overlapping blocks? -val="$undef" -case "$d_bcopy" in -"$define") - echo " " - echo "Checking to see if your bcopy() can do overlapping copies..." >&4 - $cat >foo.c <>foo.c <<'EOCP' -#include - -#ifdef I_MEMORY -# include -#endif -#ifdef I_STDLIB -# include -#endif -#ifdef I_STRING -# include -#else -# include -#endif -#ifdef I_UNISTD -# include /* Needed for NetBSD */ -#endif -main() -{ -char buf[128], abc[128]; -char *b; -int len; -int off; -int align; - -/* Copy "abcde..." string to char abc[] so that gcc doesn't - try to store the string in read-only memory. */ -bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36); - -for (align = 7; align >= 0; align--) { - for (len = 36; len; len--) { - b = buf+align; - bcopy(abc, b, len); - for (off = 1; off <= len; off++) { - bcopy(b, b+off, len); - bcopy(b+off, b, len); - if (bcmp(b, abc, len)) - exit(1); - } - } -} -exit(0); -} -EOCP - if $cc $optimize $ccflags $ldflags foo.c \ - -o safebcpy $libs >/dev/null 2>&1; then - if ./safebcpy 2>/dev/null; then - echo "Yes, it can." - val="$define" - else - echo "It can't, sorry." - case "$d_memmove" in - "$define") echo "But that's Ok since you have memmove()." ;; - esac - fi - else - echo "(I can't compile the test program, so we'll assume not...)" - case "$d_memmove" in - "$define") echo "But that's Ok since you have memmove()." ;; - esac - fi - ;; -esac -$rm -f foo.* safebcpy core -set d_safebcpy -eval $setvar - -: can memcpy handle overlapping blocks? -val="$undef" -case "$d_memcpy" in -"$define") - echo " " - echo "Checking to see if your memcpy() can do overlapping copies..." >&4 - $cat >foo.c <>foo.c <<'EOCP' -#include - -#ifdef I_MEMORY -# include -#endif -#ifdef I_STDLIB -# include -#endif -#ifdef I_STRING -# include -#else -# include -#endif -#ifdef I_UNISTD -# include /* Needed for NetBSD */ -#endif -main() -{ -char buf[128], abc[128]; -char *b; -int len; -int off; -int align; - -/* Copy "abcde..." string to char abc[] so that gcc doesn't - try to store the string in read-only memory. */ -memcpy(abc, "abcdefghijklmnopqrstuvwxyz0123456789", 36); - -for (align = 7; align >= 0; align--) { - for (len = 36; len; len--) { - b = buf+align; - memcpy(b, abc, len); - for (off = 1; off <= len; off++) { - memcpy(b+off, b, len); - memcpy(b, b+off, len); - if (memcmp(b, abc, len)) - exit(1); - } - } -} -exit(0); -} -EOCP - if $cc $optimize $ccflags $ldflags foo.c \ - -o safemcpy $libs >/dev/null 2>&1; then - if ./safemcpy 2>/dev/null; then - echo "Yes, it can." - val="$define" - else - echo "It can't, sorry." - case "$d_memmove" in - "$define") echo "But that's Ok since you have memmove()." ;; - esac - fi - else - echo "(I can't compile the test program, so we'll assume not...)" - case "$d_memmove" in - "$define") echo "But that's Ok since you have memmove()." ;; - esac - fi - ;; -esac -$rm -f foo.* safemcpy core -set d_safemcpy -eval $setvar - -: can memcmp be trusted to compare relative magnitude? -val="$undef" -case "$d_memcmp" in -"$define") - echo " " - echo "Checking to see if your memcmp() can compare relative magnitude..." >&4 - $cat >foo.c <>foo.c <<'EOCP' -#include - -#ifdef I_MEMORY -# include -#endif -#ifdef I_STDLIB -# include -#endif -#ifdef I_STRING -# include -#else -# include -#endif -#ifdef I_UNISTD -# include /* Needed for NetBSD */ -#endif -main() -{ -char a = -1; -char b = 0; -if ((a < b) && memcmp(&a, &b, 1) < 0) - exit(1); -exit(0); -} -EOCP - if $cc $optimize $ccflags $ldflags foo.c \ - -o sanemcmp $libs >/dev/null 2>&1; then - if ./sanemcmp 2>/dev/null; then - echo "Yes, it can." - val="$define" - else - echo "No, it can't (it uses signed chars)." - fi - else - echo "(I can't compile the test program, so we'll assume not...)" - fi - ;; -esac -$rm -f foo.* sanemcmp core -set d_sanemcmp -eval $setvar - -: see if select exists -set select d_select -eval $inlibc - -: see if semctl exists -set semctl d_semctl -eval $inlibc - -: see if semget exists -set semget d_semget -eval $inlibc - -: see if semop exists -set semop d_semop -eval $inlibc - -: see how much of the 'sem*(2)' library is present. -h_sem=true -echo " " -case "$d_semctl$d_semget$d_semop" in -*"$undef"*) h_sem=false;; -esac -: we could also check for sys/ipc.h ... -if $h_sem && $test `./findhdr sys/sem.h`; then - echo "You have the full sem*(2) library." >&4 - val="$define" -else - echo "You don't have the full sem*(2) library." >&4 - val="$undef" -fi -set d_sem -eval $setvar - -: see if setegid exists -set setegid d_setegid -eval $inlibc - -: see if seteuid exists -set seteuid d_seteuid -eval $inlibc - -: see if setlinebuf exists -set setlinebuf d_setlinebuf -eval $inlibc - -: see if setlocale exists -set setlocale d_setlocale -eval $inlibc - -: see if setpgid exists -set setpgid d_setpgid -eval $inlibc - -: see if setpgrp2 exists -set setpgrp2 d_setpgrp2 -eval $inlibc - -: see if setpriority exists -set setpriority d_setprior -eval $inlibc - -: see if setregid exists -set setregid d_setregid -eval $inlibc -set setresgid d_setresgid -eval $inlibc - -: see if setreuid exists -set setreuid d_setreuid -eval $inlibc -set setresuid d_setresuid -eval $inlibc - -: see if setrgid exists -set setrgid d_setrgid -eval $inlibc - -: see if setruid exists -set setruid d_setruid -eval $inlibc - -: see if setsid exists -set setsid d_setsid -eval $inlibc - -: see if sfio.h is available -set sfio.h i_sfio -eval $inhdr - - -: see if sfio library is available -case "$i_sfio" in -$define) - val='' - set sfreserve val - eval $inlibc - ;; -*) - val="$undef" - ;; -esac -: Ok, but do we want to use it. -case "$val" in -$define) - case "$usesfio" in - true|$define|[yY]*) dflt='y';; - *) dflt='n';; - esac - echo "$package can use the sfio library, but it is experimental." - rp="You seem to have sfio available, do you want to try using it?" - . ./myread - case "$ans" in - y|Y) ;; - *) echo "Ok, avoiding sfio this time. I'll use stdio instead." - val="$undef" - : Remove sfio from list of libraries to use - set `echo X $libs | $sed -e 's/-lsfio / /' -e 's/-lsfio$//'` - shift - libs="$*" - echo "libs = $libs" >&4 - ;; - esac - ;; -*) case "$usesfio" in - true|$define|[yY]*) - echo "Sorry, cannot find sfio on this machine" >&4 - echo "Ignoring your setting of usesfio=$usesfio" >&4 - ;; - esac - ;; -esac -set d_sfio -eval $setvar -case "$d_sfio" in -$define) usesfio='true';; -*) usesfio='false';; -esac - -: see if shmctl exists -set shmctl d_shmctl -eval $inlibc - -: see if shmget exists -set shmget d_shmget -eval $inlibc - -: see if shmat exists -set shmat d_shmat -eval $inlibc -: see what shmat returns -case "$d_shmat" in -"$define") - $cat >shmat.c <<'END' -#include -void *shmat(); -END - if $cc $ccflags -c shmat.c >/dev/null 2>&1; then - shmattype='void *' - else - shmattype='char *' - fi - echo "and it returns ($shmattype)." >&4 - : see if a prototype for shmat is available - xxx=`./findhdr sys/shm.h` - $cppstdin $cppflags $cppminus < $xxx > shmat.c 2>/dev/null - if $contains 'shmat.*(' shmat.c >/dev/null 2>&1; then - val="$define" - else - val="$undef" - fi - $rm -f shmat.[co] - ;; -*) - val="$undef" - ;; -esac -set d_shmatprototype -eval $setvar - -: see if shmdt exists -set shmdt d_shmdt -eval $inlibc - -: see how much of the 'shm*(2)' library is present. -h_shm=true -echo " " -case "$d_shmctl$d_shmget$d_shmat$d_shmdt" in -*"$undef"*) h_shm=false;; -esac -: we could also check for sys/ipc.h ... -if $h_shm && $test `./findhdr sys/shm.h`; then - echo "You have the full shm*(2) library." >&4 - val="$define" -else - echo "You don't have the full shm*(2) library." >&4 - val="$undef" -fi -set d_shm -eval $setvar - -echo " " -: see if we have sigaction -if set sigaction val -f d_sigaction; eval $csym; $val; then - echo 'sigaction() found.' >&4 - val="$define" -else - echo 'sigaction NOT found.' >&4 - val="$undef" -fi - -$cat > set.c <<'EOP' -/* Solaris 2.5_x86 with SunWorks Pro C 3.0.1 doesn't have a complete - sigaction structure if compiled with cc -Xc. This compile test - will fail then. -*/ -#include -#include -#include -main() -{ - struct sigaction act, oact; -} -EOP - -if $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1; then - : -else - echo "But you don't seem to have a useable struct sigaction." >&4 - val="$undef" -fi -set d_sigaction; eval $setvar -$rm -f set set.o set.c - -: see if sigsetjmp exists -echo " " -case "$d_sigsetjmp" in -'') - $cat >set.c <<'EOP' -#include -sigjmp_buf env; -int set = 1; -main() -{ - if (sigsetjmp(env,1)) - exit(set); - set = 0; - siglongjmp(env, 1); - exit(1); -} -EOP - if $cc $ccflags $ldflags -o set set.c $libs > /dev/null 2>&1 ; then - if ./set >/dev/null 2>&1; then - echo "POSIX sigsetjmp found." >&4 - val="$define" - else - $cat >&4 <&4 - val="$undef" - fi - ;; -*) val="$d_sigsetjmp" - case "$d_sigsetjmp" in - $define) echo "POSIX sigsetjmp found." >&4;; - $undef) echo "sigsetjmp not found." >&4;; - esac - ;; -esac -set d_sigsetjmp -eval $setvar -$rm -f set.c set - -socketlib='' -sockethdr='' -: see whether socket exists -echo " " -$echo $n "Hmm... $c" >&4 -if set socket val -f d_socket; eval $csym; $val; then - echo "Looks like you have Berkeley networking support." >&4 - d_socket="$define" - if set setsockopt val -f; eval $csym; $val; then - d_oldsock="$undef" - else - echo "...but it uses the old 4.1c interface, rather than 4.2" >&4 - d_oldsock="$define" - fi -else - if $contains socklib libc.list >/dev/null 2>&1; then - echo "Looks like you have Berkeley networking support." >&4 - d_socket="$define" - : we will have to assume that it supports the 4.2 BSD interface - d_oldsock="$undef" - else - echo "You don't have Berkeley networking in libc$lib_ext..." >&4 - if test -f /usr/lib/libnet$lib_ext; then - ( (nm $nm_opt /usr/lib/libnet$lib_ext | eval $nm_extract) || \ - ar t /usr/lib/libnet$lib_ext) 2>/dev/null >> libc.list - if $contains socket libc.list >/dev/null 2>&1; then - echo "...but the Wollongong group seems to have hacked it in." >&4 - socketlib="-lnet" - sockethdr="-I/usr/netinclude" - d_socket="$define" - if $contains setsockopt libc.list >/dev/null 2>&1; then - d_oldsock="$undef" - else - echo "...using the old 4.1c interface, rather than 4.2" >&4 - d_oldsock="$define" - fi - else - echo "or even in libnet$lib_ext, which is peculiar." >&4 - d_socket="$undef" - d_oldsock="$undef" - fi - else - echo "or anywhere else I see." >&4 - d_socket="$undef" - d_oldsock="$undef" - fi - fi -fi - -: see if socketpair exists -set socketpair d_sockpair -eval $inlibc - -: see if stat knows about block sizes -echo " " -xxx=`./findhdr sys/stat.h` -if $contains 'st_blocks;' "$xxx" >/dev/null 2>&1 ; then - if $contains 'st_blksize;' "$xxx" >/dev/null 2>&1 ; then - echo "Your stat() knows about block sizes." >&4 - val="$define" - else - echo "Your stat() doesn't know about block sizes." >&4 - val="$undef" - fi -else - echo "Your stat() doesn't know about block sizes." >&4 - val="$undef" -fi -set d_statblks -eval $setvar - -: see if _ptr and _cnt from stdio act std -echo " " -if $contains '_IO_fpos_t' `./findhdr stdio.h` >/dev/null 2>&1 ; then - echo "(Looks like you have stdio.h from Linux.)" - case "$stdio_ptr" in - '') stdio_ptr='((fp)->_IO_read_ptr)' - ptr_lval=$define - ;; - *) ptr_lval=$d_stdio_ptr_lval;; - esac - case "$stdio_cnt" in - '') stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)' - cnt_lval=$undef - ;; - *) cnt_lval=$d_stdio_cnt_lval;; - esac - case "$stdio_base" in - '') stdio_base='((fp)->_IO_read_base)';; - esac - case "$stdio_bufsiz" in - '') stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)';; - esac -else - case "$stdio_ptr" in - '') stdio_ptr='((fp)->_ptr)' - ptr_lval=$define - ;; - *) ptr_lval=$d_stdio_ptr_lval;; - esac - case "$stdio_cnt" in - '') stdio_cnt='((fp)->_cnt)' - cnt_lval=$define - ;; - *) cnt_lval=$d_stdio_cnt_lval;; - esac - case "$stdio_base" in - '') stdio_base='((fp)->_base)';; - esac - case "$stdio_bufsiz" in - '') stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)';; - esac -fi -: test whether _ptr and _cnt really work -echo "Checking how std your stdio is..." >&4 -$cat >try.c < -#define FILE_ptr(fp) $stdio_ptr -#define FILE_cnt(fp) $stdio_cnt -main() { - FILE *fp = fopen("try.c", "r"); - char c = getc(fp); - if ( - 18 <= FILE_cnt(fp) && - strncmp(FILE_ptr(fp), "include \n", 18) == 0 - ) - exit(0); - exit(1); -} -EOP -val="$undef" -if $cc $ccflags $ldflags -o try try.c $libs >/dev/null 2>&1; then - if ./try; then - echo "Your stdio acts pretty std." - val="$define" - else - echo "Your stdio isn't very std." - fi -else - echo "Your stdio doesn't appear very std." -fi -$rm -f try.c try -set d_stdstdio -eval $setvar - -: Can _ptr be used as an lvalue? -case "$d_stdstdio$ptr_lval" in -$define$define) val=$define ;; -*) val=$undef ;; -esac -set d_stdio_ptr_lval -eval $setvar - -: Can _cnt be used as an lvalue? -case "$d_stdstdio$cnt_lval" in -$define$define) val=$define ;; -*) val=$undef ;; -esac -set d_stdio_cnt_lval -eval $setvar - - -: see if _base is also standard -val="$undef" -case "$d_stdstdio" in -$define) - $cat >try.c < -#define FILE_base(fp) $stdio_base -#define FILE_bufsiz(fp) $stdio_bufsiz -main() { - FILE *fp = fopen("try.c", "r"); - char c = getc(fp); - if ( - 19 <= FILE_bufsiz(fp) && - strncmp(FILE_base(fp), "#include \n", 19) == 0 - ) - exit(0); - exit(1); -} -EOP - if $cc $ccflags $ldflags -o try try.c $libs > /dev/null 2>&1; then - if ./try; then - echo "And its _base field acts std." - val="$define" - else - echo "But its _base field isn't std." - fi - else - echo "However, it seems to be lacking the _base field." - fi - $rm -f try.c try - ;; -esac -set d_stdiobase -eval $setvar - -: see if strcoll exists -set strcoll d_strcoll -eval $inlibc - -: check for structure copying -echo " " -echo "Checking to see if your C compiler can copy structs..." >&4 -$cat >try.c <<'EOCP' -main() -{ - struct blurfl { - int dyick; - } foo, bar; - - foo = bar; -} -EOCP -if $cc -c try.c >/dev/null 2>&1 ; then - val="$define" - echo "Yup, it can." -else - val="$undef" - echo "Nope, it can't." -fi -set d_strctcpy -eval $setvar -$rm -f try.* - -: see if strerror and/or sys_errlist[] exist -echo " " -if set strerror val -f d_strerror; eval $csym; $val; then - echo 'strerror() found.' >&4 - d_strerror="$define" - d_strerrm='strerror(e)' - if set sys_errlist val -a d_syserrlst; eval $csym; $val; then - echo "(You also have sys_errlist[], so we could roll our own strerror.)" - d_syserrlst="$define" - else - echo "(Since you don't have sys_errlist[], sterror() is welcome.)" - d_syserrlst="$undef" - fi -elif xxx=`./findhdr string.h`; test "$xxx" || xxx=`./findhdr strings.h`; \ - $contains '#[ ]*define.*strerror' "$xxx" >/dev/null 2>&1; then - echo 'strerror() found in string header.' >&4 - d_strerror="$define" - d_strerrm='strerror(e)' - if set sys_errlist val -a d_syserrlst; eval $csym; $val; then - echo "(Most probably, strerror() uses sys_errlist[] for descriptions.)" - d_syserrlst="$define" - else - echo "(You don't appear to have any sys_errlist[], how can this be?)" - d_syserrlst="$undef" - fi -elif set sys_errlist val -a d_syserrlst; eval $csym; $val; then -echo "strerror() not found, but you have sys_errlist[] so we'll use that." >&4 - d_strerror="$undef" - d_syserrlst="$define" - d_strerrm='((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e])' -else - echo 'strerror() and sys_errlist[] NOT found.' >&4 - d_strerror="$undef" - d_syserrlst="$undef" - d_strerrm='"unknown"' -fi - -: see if strtod exists -set strtod d_strtod -eval $inlibc - -: see if strtol exists -set strtol d_strtol -eval $inlibc - -: see if strtoul exists -set strtoul d_strtoul -eval $inlibc - -: see if strxfrm exists -set strxfrm d_strxfrm -eval $inlibc - -: see if symlink exists -set symlink d_symlink -eval $inlibc - -: see if syscall exists -set syscall d_syscall -eval $inlibc - -: see if sysconf exists -set sysconf d_sysconf -eval $inlibc - -: see if system exists -set system d_system -eval $inlibc - -: see if tcgetpgrp exists -set tcgetpgrp d_tcgetpgrp -eval $inlibc - -: see if tcsetpgrp exists -set tcsetpgrp d_tcsetpgrp -eval $inlibc - -: define an is-a-typedef? function -typedef='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@; -case "$inclist" in -"") inclist="sys/types.h";; -esac; -eval "varval=\$$var"; -case "$varval" in -"") - $rm -f temp.c; - for inc in $inclist; do - echo "#include <$inc>" >>temp.c; - done; - $cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null; - if $contains $type temp.E >/dev/null 2>&1; then - eval "$var=\$type"; - else - eval "$var=\$def"; - fi; - $rm -f temp.?;; -*) eval "$var=\$varval";; -esac' - -: see if this is a sys/times.h system -set sys/times.h i_systimes -eval $inhdr - -: see if times exists -echo " " -if set times val -f d_times; eval $csym; $val; then - echo 'times() found.' >&4 - d_times="$define" - inc='' - case "$i_systimes" in - "$define") inc='sys/times.h';; - esac - set clock_t clocktype long stdio.h sys/types.h $inc - eval $typedef - dflt="$clocktype" - echo " " - rp="What type is returned by times() on this system?" - . ./myread - clocktype="$ans" -else - echo 'times() NOT found, hope that will do.' >&4 - d_times="$undef" - clocktype='int' -fi - -: see if truncate exists -set truncate d_truncate -eval $inlibc - -: see if tzname[] exists -echo " " -if set tzname val -a d_tzname; eval $csym; $val; then - val="$define" - echo 'tzname[] found.' >&4 -else - val="$undef" - echo 'tzname[] NOT found.' >&4 -fi -set d_tzname -eval $setvar - -: see if umask exists -set umask d_umask -eval $inlibc - -: see how we will look up host name -echo " " -if false; then - : dummy stub to allow use of elif -elif set uname val -f d_uname; eval $csym; $val; then - if ./xenix; then - $cat <<'EOM' -uname() was found, but you're running xenix, and older versions of xenix -have a broken uname(). If you don't really know whether your xenix is old -enough to have a broken system call, use the default answer. - -EOM - dflt=y - case "$d_uname" in - "$define") dflt=n;; - esac - rp='Is your uname() broken?' - . ./myread - case "$ans" in - n*) d_uname="$define"; call=uname;; - esac - else - echo 'uname() found.' >&4 - d_uname="$define" - call=uname - fi -fi -case "$d_gethname" in -'') d_gethname="$undef";; -esac -case "$d_uname" in -'') d_uname="$undef";; -esac -case "$d_phostname" in -'') d_phostname="$undef";; -esac - -: backward compatibility for d_hvfork -if test X$d_hvfork != X; then - d_vfork="$d_hvfork" - d_hvfork='' -fi -: see if there is a vfork -val='' -set vfork val -eval $inlibc - -: Ok, but do we want to use it. vfork is reportedly unreliable in -: perl on Solaris 2.x, and probably elsewhere. -case "$val" in -$define) - echo " " - case "$usevfork" in - false) dflt='n';; - *) dflt='y';; - esac - rp="Some systems have problems with vfork(). Do you want to use it?" - . ./myread - case "$ans" in - y|Y) ;; - *) - echo "Ok, we won't use vfork()." - val="$undef" - ;; - esac - ;; -esac -set d_vfork -eval $setvar -case "$d_vfork" in -$define) usevfork='true';; -*) usevfork='false';; -esac - -: see if this is an sysdir system -set sys/dir.h i_sysdir -eval $inhdr - -: see if this is an sysndir system -set sys/ndir.h i_sysndir -eval $inhdr - -: see if closedir exists -set closedir d_closedir -eval $inlibc - -case "$d_closedir" in -"$define") - echo " " - echo "Checking whether closedir() returns a status..." >&4 - cat > closedir.c < -#if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */ -#include -#endif -#else -#ifdef I_SYS_NDIR -#include -#else -#ifdef I_SYS_DIR -#ifdef hp9000s500 -#include /* may be wrong in the future */ -#else -#include -#endif -#endif -#endif -#endif -int main() { return closedir(opendir(".")); } -EOM - if $cc $ccflags $ldflags -o closedir closedir.c $libs > /dev/null 2>&1; then - if ./closedir > /dev/null 2>&1 ; then - echo "Yes, it does." - val="$undef" - else - echo "No, it doesn't." - val="$define" - fi - else - echo "(I can't seem to compile the test program--assuming it doesn't)" - val="$define" - fi - ;; -*) - val="$undef"; - ;; -esac -set d_void_closedir -eval $setvar -$rm -f closedir* -: check for volatile keyword -echo " " -echo 'Checking to see if your C compiler knows about "volatile"...' >&4 -$cat >try.c <<'EOCP' -main() -{ - typedef struct _goo_struct goo_struct; - goo_struct * volatile goo = ((goo_struct *)0); - struct _goo_struct { - long long_int; - int reg_int; - char char_var; - }; - typedef unsigned short foo_t; - char *volatile foo; - volatile int bar; - volatile foo_t blech; - foo = foo; -} -EOCP -if $cc -c $ccflags try.c >/dev/null 2>&1 ; then - val="$define" - echo "Yup, it does." -else - val="$undef" - echo "Nope, it doesn't." -fi -set d_volatile -eval $setvar -$rm -f try.* - -: see if there is a wait4 -set wait4 d_wait4 -eval $inlibc - -: see if waitpid exists -set waitpid d_waitpid -eval $inlibc - -: see if wcstombs exists -set wcstombs d_wcstombs -eval $inlibc - -: see if wctomb exists -set wctomb d_wctomb -eval $inlibc - -: preserve RCS keywords in files with variable substitution, grrr -Date='$Date' -Id='$Id' -Log='$Log' -RCSfile='$RCSfile' -Revision='$Revision' - -: check for alignment requirements -echo " " -case "$alignbytes" in -'') echo "Checking alignment constraints..." >&4 - $cat >try.c <<'EOCP' -struct foobar { - char foo; - double bar; -} try; -main() -{ - printf("%d\n", (char *)&try.bar - (char *)&try.foo); -} -EOCP - if $cc $ccflags try.c -o try >/dev/null 2>&1; then - dflt=`./try` - else - dflt='8' - echo "(I can't seem to compile the test program...)" - fi - ;; -*) dflt="$alignbytes" - ;; -esac -rp="Doubles must be aligned on a how-many-byte boundary?" -. ./myread -alignbytes="$ans" -$rm -f try.c try - -: check for ordering of bytes in a long -case "$byteorder" in -'') - $cat <<'EOM' - -In the following, larger digits indicate more significance. A big-endian -machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A -little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other -machines may have weird orders like 3412. A Cray will report 87654321. If -the test program works the default is probably right. -I'm now running the test program... -EOM - $cat >try.c <<'EOCP' -#include -main() -{ - int i; - union { - unsigned long l; - char c[sizeof(long)]; - } u; - - if (sizeof(long) > 4) - u.l = (0x08070605L << 32) | 0x04030201L; - else - u.l = 0x04030201L; - for (i = 0; i < sizeof(long); i++) - printf("%c", u.c[i]+'0'); - printf("\n"); - exit(0); -} -EOCP - xxx_prompt=y - if $cc $ccflags try.c -o try >/dev/null 2>&1 && ./try > /dev/null; then - dflt=`./try` - case "$dflt" in - [1-4][1-4][1-4][1-4]|12345678|87654321) - echo "(The test program ran ok.)" - echo "byteorder=$dflt" - xxx_prompt=n - ;; - ????|????????) echo "(The test program ran ok.)" ;; - *) echo "(The test program didn't run right for some reason.)" ;; - esac - else - dflt='4321' - cat <<'EOM' -(I can't seem to compile the test program. Guessing big-endian...) -EOM - fi - case "$xxx_prompt" in - y) - rp="What is the order of bytes in a long?" - . ./myread - byteorder="$ans" - ;; - *) byteorder=$dflt - ;; - esac - ;; -esac -$rm -f try.c try - -: how do we catenate cpp tokens here? -echo " " -echo "Checking to see how your cpp does stuff like catenate tokens..." >&4 -$cat >cpp_stuff.c <<'EOCP' -#define RCAT(a,b)a/**/b -#define ACAT(a,b)a ## b -RCAT(Rei,ser) -ACAT(Cir,cus) -EOCP -$cppstdin $cppflags $cppminus cpp_stuff.out 2>&1 -if $contains 'Circus' cpp_stuff.out >/dev/null 2>&1; then - echo "Oh! Smells like ANSI's been here." - echo "We can catify or stringify, separately or together!" - cpp_stuff=42 -elif $contains 'Reiser' cpp_stuff.out >/dev/null 2>&1; then - echo "Ah, yes! The good old days!" - echo "However, in the good old days we don't know how to stringify and" - echo "catify at the same time." - cpp_stuff=1 -else - $cat >&4 <&4 - $cat >try.c < -#include -#include -main() -{ -#ifdef DB_VERSION_MAJOR /* DB version >= 2: not yet. */ - printf("You have Berkeley DB Version %d.%d\n", - DB_VERSION_MAJOR, DB_VERSION_MINOR); - printf("Perl currently only supports up to version 1.86.\n"); - exit(2); -#else -#if defined(_DB_H_) && defined(BTREEMAGIC) && defined(HASHMAGIC) - exit(0); /* DB version < 2: the coast is clear. */ -#else - exit(1); /* not Berkeley DB? */ -#endif -#endif -} -EOCP - if $cc $optimize $ccflags $ldflags -o try try.c $libs && ./try; then - echo 'Looks OK. (Perl supports up to version 1.86).' >&4 - else - echo "I can't use your Berkeley DB. I'll disable it." >&4 - i_db=$undef - case " $libs " in - *"-ldb "*) - : Remove db from list of libraries to use - echo "Removing unusable -ldb from library list" >&4 - set `echo X $libs | $sed -e 's/-ldb / /' -e 's/-ldb$//'` - shift - libs="$*" - echo "libs = $libs" >&4 - ;; - esac - fi - $rm -f try.* - ;; -esac - -case "$i_db" in -define) - : Check the return type needed for hash - echo " " - echo "Checking return type needed for hash for Berkeley DB ..." >&4 - $cat >try.c < -#include -u_int32_t hash_cb (ptr, size) -const void *ptr; -size_t size; -{ -} -HASHINFO info; -main() -{ - info.hash = hash_cb; -} -EOCP - if $cc $ccflags -c try.c >try.out 2>&1 ; then - if $contains warning try.out >>/dev/null 2>&1 ; then - db_hashtype='int' - else - db_hashtype='u_int32_t' - fi - else - : XXX Maybe we should just give up here. - db_hashtype=u_int32_t - echo "Help: I can't seem to compile the db test program." >&4 - echo "Something's wrong, but I'll assume you use $db_hashtype." >&4 - fi - $rm -f try.* - echo "Your version of Berkeley DB uses $db_hashtype for hash." - ;; -*) db_hashtype=u_int32_t - ;; -esac - -case "$i_db" in -define) - : Check the return type needed for prefix - echo " " - echo "Checking return type needed for prefix for Berkeley DB ..." >&4 - cat >try.c < -#include -size_t prefix_cb (key1, key2) -const DBT *key1; -const DBT *key2; -{ -} -BTREEINFO info; -main() -{ - info.prefix = prefix_cb; -} -EOCP - if $cc $ccflags -c try.c >try.out 2>&1 ; then - if $contains warning try.out >>/dev/null 2>&1 ; then - db_prefixtype='int' - else - db_prefixtype='size_t' - fi - else - db_prefixtype='size_t' - : XXX Maybe we should just give up here. - echo "Help: I can't seem to compile the db test program." >&4 - echo "Something's wrong, but I'll assume you use $db_prefixtype." >&4 - fi - $rm -f try.* - echo "Your version of Berkeley DB uses $db_prefixtype for prefix." - ;; -*) db_prefixtype='size_t' - ;; -esac - -: check for void type -echo " " -echo "Checking to see how well your C compiler groks the void type..." >&4 -echo " " -$cat >&4 <try.c <<'EOCP' -#if TRY & 1 -void sub() { -#else -sub() { -#endif - extern void moo(); /* function returning void */ - void (*goo)(); /* ptr to func returning void */ -#if TRY & 8 - void *hue; /* generic ptr */ -#endif -#if TRY & 2 - void (*foo[10])(); -#endif - -#if TRY & 4 - if(goo == moo) { - exit(0); - } -#endif - exit(0); -} -main() { sub(); } -EOCP - if $cc $ccflags -c -DTRY=$defvoidused try.c >.out 2>&1 ; then - voidflags=$defvoidused - echo "It appears to support void to the level $package wants ($defvoidused)." - if $contains warning .out >/dev/null 2>&1; then - echo "However, you might get some warnings that look like this:" - $cat .out - fi - else -echo "Hmm, your compiler has some difficulty with void. Checking further..." >&4 - if $cc $ccflags -c -DTRY=1 try.c >/dev/null 2>&1; then - echo "It supports 1..." - if $cc $ccflags -c -DTRY=3 try.c >/dev/null 2>&1; then - echo "It also supports 2..." - if $cc $ccflags -c -DTRY=7 try.c >/dev/null 2>&1; then - voidflags=7 - echo "And it supports 4 but not 8 definitely." - else - echo "It doesn't support 4..." - if $cc $ccflags -c -DTRY=11 try.c >/dev/null 2>&1; then - voidflags=11 - echo "But it supports 8." - else - voidflags=3 - echo "Neither does it support 8." - fi - fi - else - echo "It does not support 2..." - if $cc $ccflags -c -DTRY=13 try.c >/dev/null 2>&1; then - voidflags=13 - echo "But it supports 4 and 8." - else - if $cc $ccflags -c -DTRY=5 try.c >/dev/null 2>&1; then - voidflags=5 - echo "And it supports 4 but has not heard about 8." - else - echo "However it supports 8 but not 4." - fi - fi - fi - else - echo "There is no support at all for void." - voidflags=0 - fi - fi -esac -: Only prompt user if support does not match the level we want -case "$voidflags" in -"$defvoidused") ;; -*) - dflt="$voidflags"; - rp="Your void support flags add up to what?" - . ./myread - voidflags="$ans" - ;; -esac -$rm -f try.* .out - -: see what type file positions are declared as in the library -set fpos_t fpostype long stdio.h sys/types.h -eval $typedef -echo " " -dflt="$fpostype" -rp="What is the type for file position used by fsetpos()?" -. ./myread -fpostype="$ans" - -: Store the full pathname to the sed program for use in the C program -full_sed=$sed - -: see what type gids are declared as in the kernel -set gid_t gidtype xxx stdio.h sys/types.h -eval $typedef -case "$gidtype" in -xxx) - xxx=`./findhdr sys/user.h` - set `grep 'groups\[NGROUPS\];' "$xxx" 2>/dev/null` unsigned short - case $1 in - unsigned) dflt="$1 $2" ;; - *) dflt="$1" ;; - esac - ;; -*) dflt="$gidtype";; -esac -echo " " -rp="What is the type for group ids returned by getgid()?" -. ./myread -gidtype="$ans" - -: see if getgroups exists -set getgroups d_getgrps -eval $inlibc - -: see if setgroups exists -set setgroups d_setgrps -eval $inlibc - -: Find type of 2nd arg to 'getgroups()' and 'setgroups()' -echo " " -case "$d_getgrps$d_setgrps" in -*define*) - case "$groupstype" in - '') dflt="$gidtype" ;; - *) dflt="$groupstype" ;; - esac - $cat <&4 - echo "Go find a make program or fix your PATH setting!" >&4 - exit 1 - ;; - esac - ;; -*) echo make is in $make. ;; -esac - -$echo $n "Checking if your $make program sets \$(MAKE)... $c" >&4 -case "$make_set_make" in -'') - $sed 's/^X //' > testmake.mak << 'EOF' -Xall: -X @echo 'ac_maketemp="$(MAKE)"' -EOF - : GNU make sometimes prints "make[1]: Entering...", which would confuse us. - case "`$make -f testmake.mak 2>/dev/null`" in - *ac_maketemp=*) make_set_make='#' ;; - *) make_set_make="MAKE=$make" ;; - esac - $rm -f testmake.mak - ;; -esac -case "$make_set_make" in -'#') echo "Yup, it does." >&4 ;; -*) echo "Nope, it doesn't." >&4 ;; -esac - -: see what type is used for mode_t -set mode_t modetype int stdio.h sys/types.h -eval $typedef -dflt="$modetype" -echo " " -rp="What type is used for file modes?" -. ./myread -modetype="$ans" - -: locate the preferred pager for this system -case "$pager" in -'') - dflt='' - case "$pg" in - /*) dflt=$pg;; - esac - case "$more" in - /*) dflt=$more;; - esac - case "$less" in - /*) dflt=$less;; - esac - case "$dflt" in - '') dflt=/usr/ucb/more;; - esac - ;; -*) dflt="$pager";; -esac -echo " " -fn=f/ -rp='What pager is used on your system?' -. ./getfile -pager="$ans" - -: Cruising for prototypes -echo " " -echo "Checking out function prototypes..." >&4 -$cat >prototype.c <<'EOCP' -main(int argc, char *argv[]) { - exit(0);} -EOCP -if $cc $ccflags -c prototype.c >prototype.out 2>&1 ; then - echo "Your C compiler appears to support function prototypes." - val="$define" -else - echo "Your C compiler doesn't seem to understand function prototypes." - val="$undef" -fi -set prototype -eval $setvar -$rm -f prototype* - -: check for size of random number generator -echo " " -case "$randbits" in -'') - echo "Checking to see how many bits your rand function produces..." >&4 - $cat >try.c < -#ifdef I_UNISTD -# include -#endif -#ifdef I_STDLIB -# include -#endif -EOCP - $cat >>try.c <<'EOCP' -main() -{ - register int i; - register unsigned long tmp; - register unsigned long max = 0L; - - for (i = 1000; i; i--) { - tmp = (unsigned long)rand(); - if (tmp > max) max = tmp; - } - for (i = 0; max; i++) - max /= 2; - printf("%d\n",i); - fflush(stdout); -} -EOCP - if $cc $ccflags $ldflags -o try try.c $libs >/dev/null 2>&1 ; then - dflt=`try` - else - dflt='?' - echo "(I can't seem to compile the test program...)" - fi - ;; -*) - dflt="$randbits" - ;; -esac -rp='How many bits does your rand() function produce?' -. ./myread -randbits="$ans" -$rm -f try.c try.o try - -: see if ar generates random libraries by itself -echo " " -echo "Checking how to generate random libraries on your machine..." >&4 -echo 'int bar1() { return bar2(); }' > bar1.c -echo 'int bar2() { return 2; }' > bar2.c -$cat > foo.c <<'EOP' -main() { printf("%d\n", bar1()); exit(0); } -EOP -$cc $ccflags -c bar1.c >/dev/null 2>&1 -$cc $ccflags -c bar2.c >/dev/null 2>&1 -$cc $ccflags -c foo.c >/dev/null 2>&1 -ar rc bar$lib_ext bar2.o bar1.o >/dev/null 2>&1 -if $cc $ccflags $ldflags -o foobar foo.o bar$lib_ext $libs > /dev/null 2>&1 && - ./foobar >/dev/null 2>&1; then - echo "ar appears to generate random libraries itself." - orderlib=false - ranlib=":" -elif ar ts bar$lib_ext >/dev/null 2>&1 && - $cc $ccflags $ldflags -o foobar foo.o bar$lib_ext $libs > /dev/null 2>&1 && - ./foobar >/dev/null 2>&1; then - echo "a table of contents needs to be added with 'ar ts'." - orderlib=false - ranlib="ar ts" -else - case "$ranlib" in - :) ranlib='';; - '') - ranlib=`./loc ranlib X /usr/bin /bin /usr/local/bin` - $test -f $ranlib || ranlib='' - ;; - esac - if $test -n "$ranlib"; then - echo "your system has '$ranlib'; we'll use that." - orderlib=false - else - echo "your system doesn't seem to support random libraries" - echo "so we'll use lorder and tsort to order the libraries." - orderlib=true - ranlib=":" - fi -fi -$rm -f foo* bar* - -: see if sys/select.h has to be included -set sys/select.h i_sysselct -eval $inhdr - -: see if we should include time.h, sys/time.h, or both -echo " " -echo "Testing to see if we should include , or both." >&4 -$echo $n "I'm now running the test program...$c" -$cat >try.c <<'EOCP' -#include -#ifdef I_TIME -#include -#endif -#ifdef I_SYSTIME -#ifdef SYSTIMEKERNEL -#define KERNEL -#endif -#include -#endif -#ifdef I_SYSSELECT -#include -#endif -main() -{ - struct tm foo; -#ifdef S_TIMEVAL - struct timeval bar; -#endif -#ifdef S_TIMEZONE - struct timezone tzp; -#endif - if (foo.tm_sec == foo.tm_sec) - exit(0); -#ifdef S_TIMEVAL - if (bar.tv_sec == bar.tv_sec) - exit(0); -#endif - exit(1); -} -EOCP -flags='' -for s_timezone in '-DS_TIMEZONE' ''; do -sysselect='' -for s_timeval in '-DS_TIMEVAL' ''; do -for i_systimek in '' '-DSYSTIMEKERNEL'; do -for i_time in '' '-DI_TIME'; do -for i_systime in '-DI_SYSTIME' ''; do - case "$flags" in - '') $echo $n ".$c" - if $cc $ccflags \ - $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone \ - try.c -o try >/dev/null 2>&1 ; then - set X $i_time $i_systime $i_systimek $sysselect $s_timeval - shift - flags="$*" - echo " " - $echo $n "Succeeded with $flags$c" - fi - ;; - esac -done -done -done -done -done -timeincl='' -echo " " -case "$flags" in -*SYSTIMEKERNEL*) i_systimek="$define" - timeincl=`./findhdr sys/time.h` - echo "We'll include with KERNEL defined." >&4;; -*) i_systimek="$undef";; -esac -case "$flags" in -*I_TIME*) i_time="$define" - timeincl=`./findhdr time.h`" $timeincl" - echo "We'll include ." >&4;; -*) i_time="$undef";; -esac -case "$flags" in -*I_SYSTIME*) i_systime="$define" - timeincl=`./findhdr sys/time.h`" $timeincl" - echo "We'll include ." >&4;; -*) i_systime="$undef";; -esac -$rm -f try.c try - -: check for fd_set items -$cat <fd_set.c < -#ifdef HAS_SOCKET -#include /* Might include */ -#endif -#ifdef I_SYS_TIME -#include -#endif -#ifdef I_SYS_SELECT -#include -#endif -main() { - fd_set fds; - -#ifdef TRYBITS - if(fds.fds_bits); -#endif - -#if defined(FD_SET) && defined(FD_CLR) && defined(FD_ISSET) && defined(FD_ZERO) - exit(0); -#else - exit(1); -#endif -} -EOCP -if $cc $ccflags -DTRYBITS fd_set.c -o fd_set >fd_set.out 2>&1 ; then - d_fds_bits="$define" - d_fd_set="$define" - echo "Well, your system knows about the normal fd_set typedef..." >&4 - if ./fd_set; then - echo "and you have the normal fd_set macros (just as I'd expect)." >&4 - d_fd_macros="$define" - else - $cat >&4 <<'EOM' -but not the normal fd_set macros! Gaaack! I'll have to cover for you. -EOM - d_fd_macros="$undef" - fi -else - $cat <<'EOM' -Hmm, your compiler has some difficulty with fd_set. Checking further... -EOM - if $cc $ccflags fd_set.c -o fd_set >fd_set.out 2>&1 ; then - d_fds_bits="$undef" - d_fd_set="$define" - echo "Well, your system has some sort of fd_set available..." >&4 - if ./fd_set; then - echo "and you have the normal fd_set macros." >&4 - d_fd_macros="$define" - else - $cat <<'EOM' -but not the normal fd_set macros! Gross! More work for me... -EOM - d_fd_macros="$undef" - fi - else - echo "Well, you got zip. That's OK, I can roll my own fd_set stuff." >&4 - d_fd_set="$undef" - d_fds_bits="$undef" - d_fd_macros="$undef" - fi -fi -$rm -f fd_set* - - -: check for type of arguments to select. This will only really -: work if the system supports prototypes and provides one for -: select. -case "$d_select" in -$define) - : Make initial guess - case "$selecttype" in - ''|' ') - case "$d_fd_set" in - $define) xxx='fd_set *' ;; - *) xxx='int *' ;; - esac - ;; - *) xxx="$selecttype" - ;; - esac - : backup guess - case "$xxx" in - 'fd_set *') yyy='int *' ;; - 'int *') yyy='fd_set *' ;; - esac - - $cat <try.c < -#ifdef HAS_SOCKET -#include /* Might include */ -#endif -#ifdef I_SYS_TIME -#include -#endif -#ifdef I_SYS_SELECT -#include -#endif -main() -{ - int width; - Select_fd_set_t readfds; - Select_fd_set_t writefds; - Select_fd_set_t exceptfds; - struct timeval timeout; - select(width, readfds, writefds, exceptfds, &timeout); - exit(0); -} -EOCP - if $cc $ccflags -c -DSelect_fd_set_t="$xxx" try.c >/dev/null 2>&1 ; then - selecttype="$xxx" - echo "Your system uses $xxx for the arguments to select." >&4 - elif $cc $ccflags -c -DSelect_fd_set_t="$yyy" try.c >/dev/null 2>&1 ; then - selecttype="$yyy" - echo "Your system uses $yyy for the arguments to select." >&4 - else - rp='What is the type for the 2nd, 3rd, and 4th arguments to select?' - dflt="$xxx" - . ./myread - selecttype="$ans" - fi - $rm -f try.[co] - ;; -*) selecttype='int *' - ;; -esac - -: Trace out the files included by signal.h, then look for SIGxxx names. -: Remove SIGARRAYSIZE used by HPUX. -: Remove SIGTYP void lines used by OS2. -xxx=`echo '#include ' | - $cppstdin $cppminus $cppflags 2>/dev/null | - $grep '^[ ]*#.*include' | - $awk "{print \\$$fieldn}" | $sed 's!"!!g' | $sort | $uniq` -: Check this list of files to be sure we have parsed the cpp output ok. -: This will also avoid potentially non-existent files, such -: as ../foo/bar.h -xxxfiles='' -for xx in $xxx /dev/null ; do - $test -f "$xx" && xxxfiles="$xxxfiles $xx" -done -: If we have found no files, at least try signal.h -case "$xxxfiles" in -'') xxxfiles=`./findhdr signal.h` ;; -esac -xxx=`awk ' -$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $3 !~ /void/ { - print substr($2, 4, 20) -} -$1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ { - print substr($3, 4, 20) -}' $xxxfiles` -: Append some common names just in case the awk scan failed. -xxx="$xxx ABRT ALRM BUS CHLD CLD CONT DIL EMT FPE HUP ILL INT IO IOT KILL" -xxx="$xxx LOST PHONE PIPE POLL PROF PWR QUIT SEGV STKFLT STOP SYS TERM TRAP" -xxx="$xxx TSTP TTIN TTOU URG USR1 USR2 USR3 USR4 VTALRM" -xxx="$xxx WINCH WIND WINDOW XCPU XFSZ" -: generate a few handy files for later -$cat > signal.c <<'EOP' -#include -#include -int main() { - -/* Strange style to avoid deeply-nested #if/#else/#endif */ -#ifndef NSIG -# ifdef _NSIG -# define NSIG (_NSIG) -# endif -#endif - -#ifndef NSIG -# ifdef SIGMAX -# define NSIG (SIGMAX+1) -# endif -#endif - -#ifndef NSIG -# ifdef SIG_MAX -# define NSIG (SIG_MAX+1) -# endif -#endif - -#ifndef NSIG -# ifdef MAXSIG -# define NSIG (MAXSIG+1) -# endif -#endif - -#ifndef NSIG -# ifdef MAX_SIG -# define NSIG (MAX_SIG+1) -# endif -#endif - -#ifndef NSIG -# ifdef SIGARRAYSIZE -# define NSIG (SIGARRAYSIZE+1) /* Not sure of the +1 */ -# endif -#endif - -#ifndef NSIG -# ifdef _sys_nsig -# define NSIG (_sys_nsig) /* Solaris 2.5 */ -# endif -#endif - -/* Default to some arbitrary number that's big enough to get most - of the common signals. -*/ -#ifndef NSIG -# define NSIG 50 -#endif - -printf("NSIG %d\n", NSIG); - -EOP -echo $xxx | $tr ' ' '\012' | $sort | $uniq | $awk ' -{ - printf "#ifdef SIG"; printf $1; printf "\n" - printf "printf(\""; printf $1; printf " %%d\\n\",SIG"; - printf $1; printf ");\n" - printf "#endif\n" -} -END { - printf "}\n"; -} -' >>signal.c -$cat >signal.awk <<'EOP' -BEGIN { ndups = 0 } -$1 ~ /^NSIG$/ { nsig = $2 } -($1 !~ /^NSIG$/) && (NF == 2) { - if ($2 > maxsig) { maxsig = $2 } - if (sig_name[$2]) { - dup_name[ndups] = $1 - dup_num[ndups] = $2 - ndups++ - } - else { - sig_name[$2] = $1 - sig_num[$2] = $2 - } - -} -END { - if (nsig == 0) { nsig = maxsig + 1 } - for (n = 1; n < nsig; n++) { - if (sig_name[n]) { - printf("%s %d\n", sig_name[n], sig_num[n]) - } - else { - printf("NUM%d %d\n", n, n) - } - } - for (n = 0; n < ndups; n++) { - printf("%s %d\n", dup_name[n], dup_num[n]) - } -} -EOP -$cat >signal_cmd </dev/null 2>&1; then - ./signal | $sort -n +1 | $uniq | $awk -f signal.awk >signal.lst -else - echo "(I can't seem be able to compile the test program -- Guessing)" - echo 'kill -l' >signal - set X \`csh -f signal.lst -fi -$rm -f signal.c signal signal.o -EOS -chmod a+x signal_cmd -$eunicefix signal_cmd - -: generate list of signal names -echo " " -case "$sig_name" in -'') sig_num='' ;; -esac -case "$sig_num" in -'') sig_name='' ;; -esac -case "$sig_name" in -'') - echo "Generating a list of signal names and numbers..." >&4 - ./signal_cmd - sig_name=`$awk '{printf "%s ", $1}' signal.lst` - sig_name="ZERO $sig_name" - sig_num=`$awk '{printf "%d ", $2}' signal.lst` - sig_num="0 $sig_num" - ;; -esac -echo "The following signals are available:" -echo " " -echo $sig_name | $awk \ -'BEGIN { linelen = 0 } -{ - for (i = 1; i <= NF; i++) { - name = "SIG" $i " " - linelen = linelen + length(name) - if (linelen > 70) { - printf "\n" - linelen = length(name) - } - printf "%s", name - } - printf "\n" -}' -$rm -f signal signal.c signal.awk signal.lst signal_cmd - -: see what type is used for size_t -set size_t sizetype 'unsigned int' stdio.h sys/types.h -eval $typedef -dflt="$sizetype" -echo " " -rp="What type is used for the length parameter for string functions?" -. ./myread -sizetype="$ans" - -: see what type is used for signed size_t -set ssize_t ssizetype int stdio.h sys/types.h -eval $typedef -dflt="$ssizetype" -$cat > ssize.c < -#include -#define Size_t $sizetype -#define SSize_t $dflt -main() -{ - if (sizeof(Size_t) == sizeof(SSize_t)) - printf("$dflt\n"); - else if (sizeof(Size_t) == sizeof(int)) - printf("int\n"); - else - printf("long\n"); - fflush(stdout); - exit(0); -} -EOM -echo " " -# If $libs contains -lsfio, and sfio is mis-configured, then it -# sometimes (apparently) runs and exits with a 0 status, but with no -# output!. Thus we check with test -s whether we actually got any -# output. I think it has to do with sfio's use of _exit vs. exit, -# but I don't know for sure. --Andy Dougherty 1/27/97. -if $cc $optimize $ccflags $ldflags -o ssize ssize.c $libs > /dev/null 2>&1 && - ./ssize > ssize.out 2>/dev/null && test -s ssize.out ; then - ssizetype=`$cat ssize.out` - echo "I'll be using $ssizetype for functions returning a byte count." >&4 -else - $cat >&4 </dev/null 2>&1 ; then - echo "Your stdio uses unsigned chars." >&4 - stdchar="unsigned char" -else - echo "Your stdio uses signed chars." >&4 - stdchar="char" -fi - -: see if time exists -echo " " -if set time val -f d_time; eval $csym; $val; then - echo 'time() found.' >&4 - val="$define" - set time_t timetype long stdio.h sys/types.h - eval $typedef - dflt="$timetype" - echo " " - rp="What type is returned by time() on this system?" - . ./myread - timetype="$ans" -else - echo 'time() not found, hope that will do.' >&4 - val="$undef" - timetype='int'; -fi -set d_time -eval $setvar - -: see what type uids are declared as in the kernel -set uid_t uidtype xxx stdio.h sys/types.h -eval $typedef -case "$uidtype" in -xxx) - xxx=`./findhdr sys/user.h` - set `grep '_ruid;' "$xxx" 2>/dev/null` unsigned short - case $1 in - unsigned) dflt="$1 $2" ;; - *) dflt="$1" ;; - esac - ;; -*) dflt="$uidtype";; -esac -echo " " -rp="What is the type for user ids returned by getuid()?" -. ./myread -uidtype="$ans" - -: see if dbm.h is available -: see if dbmclose exists -set dbmclose d_dbmclose -eval $inlibc - -case "$d_dbmclose" in -$define) - set dbm.h i_dbm - eval $inhdr - case "$i_dbm" in - $define) - val="$undef" - set i_rpcsvcdbm - eval $setvar - ;; - *) set rpcsvc/dbm.h i_rpcsvcdbm - eval $inhdr - ;; - esac - ;; -*) echo "We won't be including " - val="$undef" - set i_dbm - eval $setvar - val="$undef" - set i_rpcsvcdbm - eval $setvar - ;; -esac - -: see if this is a sys/file.h system -val='' -set sys/file.h val -eval $inhdr - -: do we need to include sys/file.h ? -case "$val" in -"$define") - echo " " - if $h_sysfile; then - val="$define" - echo "We'll be including ." >&4 - else - val="$undef" - echo "We won't be including ." >&4 - fi - ;; -*) - h_sysfile=false - ;; -esac -set i_sysfile -eval $setvar - -: see if fcntl.h is there -val='' -set fcntl.h val -eval $inhdr - -: see if we can include fcntl.h -case "$val" in -"$define") - echo " " - if $h_fcntl; then - val="$define" - echo "We'll be including ." >&4 - else - val="$undef" - if $h_sysfile; then - echo "We don't need to include if we include ." >&4 - else - echo "We won't be including ." >&4 - fi - fi - ;; -*) - h_fcntl=false - val="$undef" - ;; -esac -set i_fcntl -eval $setvar - -: see if this is an grp system -set grp.h i_grp -eval $inhdr - -: see if locale.h is available -set locale.h i_locale -eval $inhdr - -: see if this is a math.h system -set math.h i_math -eval $inhdr - -: see if ndbm.h is available -set ndbm.h t_ndbm -eval $inhdr -case "$t_ndbm" in -$define) - : see if dbm_open exists - set dbm_open d_dbm_open - eval $inlibc - case "$d_dbm_open" in - $undef) - t_ndbm="$undef" - echo "We won't be including " - ;; - esac - ;; -esac -val="$t_ndbm" -set i_ndbm -eval $setvar - -: see if net/errno.h is available -val='' -set net/errno.h val -eval $inhdr - -: Unfortunately, it causes problems on some systems. Arrgh. -case "$val" in -$define) - cat > try.c <<'EOM' -#include -#include -#include -int func() -{ - return ENOTSOCK; -} -EOM - if $cc $ccflags -c try.c >/dev/null 2>&1; then - echo "We'll be including ." >&4 - else - echo "We won't be including ." >&4 - val="$undef" - fi - $rm -f try.* try - ;; -esac -set i_neterrno -eval $setvar - -: get C preprocessor symbols handy -echo " " -$echo $n "Hmm... $c" -echo $al | $tr ' ' '\012' >Cppsym.know -$cat <Cppsym -$startsh -case "\$1" in --l) list=true - shift - ;; -esac -unknown='' -case "\$list\$#" in -1|2) - for sym do - if $contains "^\$1$" Cppsym.true >/dev/null 2>&1; then - exit 0 - elif $contains "^\$1$" Cppsym.know >/dev/null 2>&1; then - : - else - unknown="\$unknown \$sym" - fi - done - set X \$unknown - shift - ;; -esac -case \$# in -0) exit 1;; -esac -echo \$* | $tr ' ' '\012' | $sed -e 's/\(.*\)/\\ -#ifdef \1\\ -exit 0; _ _ _ _\1\\ \1\\ -#endif\\ -/' >Cppsym\$\$ -echo "exit 1; _ _ _" >>Cppsym\$\$ -$cppstdin $cppminus Cppsym2\$\$ -case "\$list" in -true) $awk 'NF > 5 {print substr(\$6,2,100)}' Cppsym.true - -: now check the C compiler for additional symbols -$cat >ccsym <tmp.c <&1\` -do - case "\$i" in - -D*) echo "\$i" | $sed 's/^-D//';; - -A*) $test "$gccversion" && echo "\$i" | $sed 's/^-A\(.*\)(\(.*\))/\1=\2/';; - esac -done -$rm -f try.c -EOS -chmod +x ccsym -$eunicefix ccsym -./ccsym | $sort | $uniq >ccsym.raw -$awk '/\=/ { print $0; next } - { print $0"=1" }' ccsym.raw >ccsym.list -$awk '{ print $0"=1" }' Cppsym.true >ccsym.true -$comm -13 ccsym.true ccsym.list >ccsym.own -$comm -12 ccsym.true ccsym.list >ccsym.com -$comm -23 ccsym.true ccsym.list >ccsym.cpp -also='' -symbols='symbols' -if $test -z ccsym.raw; then - echo "Your C compiler doesn't seem to define any symbol!" >&4 - echo " " - echo "However, your C preprocessor defines the following ones:" - $cat Cppsym.true -else - if $test -s ccsym.com; then - echo "Your C compiler and pre-processor define these symbols:" - $sed -e 's/\(.*\)=.*/\1/' ccsym.com - also='also ' - symbols='ones' - $test "$silent" || sleep 1 - fi - if $test -s ccsym.cpp; then - $test "$also" && echo " " - echo "Your C pre-processor ${also}defines the following $symbols:" - $sed -e 's/\(.*\)=.*/\1/' ccsym.cpp - also='further ' - $test "$silent" || sleep 1 - fi - if $test -s ccsym.own; then - $test "$also" && echo " " - echo "Your C compiler ${also}defines the following cpp variables:" - $sed -e 's/\(.*\)=1/\1/' ccsym.own - $sed -e 's/\(.*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true - $test "$silent" || sleep 1 - fi -fi -$rm -f ccsym* - -: see if this is a termio system -val="$undef" -val2="$undef" -val3="$undef" -if $test `./findhdr termios.h`; then - set tcsetattr i_termios - eval $inlibc - val3="$i_termios" -fi -echo " " -case "$val3" in -"$define") echo "You have POSIX termios.h... good!" >&4;; -*) if ./Cppsym pyr; then - case "`/bin/universe`" in - ucb) if $test `./findhdr sgtty.h`; then - val2="$define" - echo " found." >&4 - else - echo "System is pyramid with BSD universe." - echo " not found--you could have problems." >&4 - fi;; - *) if $test `./findhdr termio.h`; then - val="$define" - echo " found." >&4 - else - echo "System is pyramid with USG universe." - echo " not found--you could have problems." >&4 - fi;; - esac - elif ./usg; then - if $test `./findhdr termio.h`; then - echo " found." >&4 - val="$define" - elif $test `./findhdr sgtty.h`; then - echo " found." >&4 - val2="$define" - else -echo "Neither nor found--you could have problems." >&4 - fi - else - if $test `./findhdr sgtty.h`; then - echo " found." >&4 - val2="$define" - elif $test `./findhdr termio.h`; then - echo " found." >&4 - val="$define" - else -echo "Neither nor found--you could have problems." >&4 - fi - fi;; -esac -set i_termio; eval $setvar -val=$val2; set i_sgtty; eval $setvar -val=$val3; set i_termios; eval $setvar - -: see if stdarg is available -echo " " -if $test `./findhdr stdarg.h`; then - echo " found." >&4 - valstd="$define" -else - echo " NOT found." >&4 - valstd="$undef" -fi - -: see if varags is available -echo " " -if $test `./findhdr varargs.h`; then - echo " found." >&4 -else - echo " NOT found, but that's ok (I hope)." >&4 -fi - -: set up the varargs testing programs -$cat > varargs.c < -#endif -#ifdef I_VARARGS -#include -#endif - -#ifdef I_STDARG -int f(char *p, ...) -#else -int f(va_alist) -va_dcl -#endif -{ - va_list ap; -#ifndef I_STDARG - char *p; -#endif -#ifdef I_STDARG - va_start(ap,p); -#else - va_start(ap); - p = va_arg(ap, char *); -#endif - va_end(ap); -} -EOP -$cat > varargs </dev/null 2>&1; then - echo "true" -else - echo "false" -fi -$rm -f varargs.o -EOP -chmod +x varargs - -: now check which varargs header should be included -echo " " -i_varhdr='' -case "$valstd" in -"$define") - if `./varargs I_STDARG`; then - val='stdarg.h' - elif `./varargs I_VARARGS`; then - val='varargs.h' - fi - ;; -*) - if `./varargs I_VARARGS`; then - val='varargs.h' - fi - ;; -esac -case "$val" in -'') -echo "I could not find the definition for va_dcl... You have problems..." >&4 - val="$undef"; set i_stdarg; eval $setvar - val="$undef"; set i_varargs; eval $setvar - ;; -*) - set i_varhdr - eval $setvar - case "$i_varhdr" in - stdarg.h) - val="$define"; set i_stdarg; eval $setvar - val="$undef"; set i_varargs; eval $setvar - ;; - varargs.h) - val="$undef"; set i_stdarg; eval $setvar - val="$define"; set i_varargs; eval $setvar - ;; - esac - echo "We'll include <$i_varhdr> to get va_dcl definition." >&4;; -esac -$rm -f varargs* - -: see if stddef is available -set stddef.h i_stddef -eval $inhdr - -: see if ioctl defs are in sgtty, termio, sys/filio or sys/ioctl -set sys/filio.h i_sysfilio -eval $inhdr -echo " " -if $test `./findhdr sys/ioctl.h`; then - val="$define" - echo ' found.' >&4 -else - val="$undef" - if $test $i_sysfilio = "$define"; then - echo ' NOT found.' >&4 - else - $test $i_sgtty = "$define" && xxx="sgtty.h" - $test $i_termio = "$define" && xxx="termio.h" - $test $i_termios = "$define" && xxx="termios.h" -echo "No found, assuming ioctl args are defined in <$xxx>." >&4 - fi -fi -set i_sysioctl -eval $setvar - -: see if this is a sys/param system -set sys/param.h i_sysparam -eval $inhdr - -: see if sys/resource.h has to be included -set sys/resource.h i_sysresrc -eval $inhdr - -: see if sys/stat.h is available -set sys/stat.h i_sysstat -eval $inhdr - -: see if sys/types.h has to be included -set sys/types.h i_systypes -eval $inhdr - -: see if this is a sys/un.h system -set sys/un.h i_sysun -eval $inhdr - -: see if this is a syswait system -set sys/wait.h i_syswait -eval $inhdr - -: see if this is an utime system -set utime.h i_utime -eval $inhdr - -: see if this is a values.h system -set values.h i_values -eval $inhdr - -: see if this is a vfork system -case "$d_vfork" in -"$define") - set vfork.h i_vfork - eval $inhdr - ;; -*) - i_vfork="$undef" - ;; -esac - -: see if gdbm.h is available -set gdbm.h t_gdbm -eval $inhdr -case "$t_gdbm" in -$define) - : see if gdbm_open exists - set gdbm_open d_gdbm_open - eval $inlibc - case "$d_gdbm_open" in - $undef) - t_gdbm="$undef" - echo "We won't be including " - ;; - esac - ;; -esac -val="$t_gdbm" -set i_gdbm -eval $setvar - -echo " " -echo "Looking for extensions..." >&4 -cd ../ext -: If we are using the old config.sh, known_extensions may contain -: old or inaccurate or duplicate values. -known_extensions='' -: We do not use find because it might not be available. -: We do not just use MANIFEST because the user may have dropped -: some additional extensions into the source tree and expect them -: to be built. -for xxx in * ; do - case "$xxx" in - DynaLoader) ;; - *) if $test -f $xxx/$xxx.xs; then - known_extensions="$known_extensions $xxx" - else - if $test -d $xxx; then - cd $xxx - for yyy in * ; do - if $test -f $yyy/$yyy.xs; then - known_extensions="$known_extensions $xxx/$yyy" - fi - done - cd .. - fi - fi ;; - esac -done -set X $known_extensions -shift -known_extensions="$*" -cd ../UU - -: Now see which are supported on this system. -avail_ext='' -for xxx in $known_extensions ; do - case "$xxx" in - DB_File) case "$i_db" in - $define) avail_ext="$avail_ext $xxx" ;; - esac - ;; - GDBM_File) case "$i_gdbm" in - $define) avail_ext="$avail_ext $xxx" ;; - esac - ;; - NDBM_File) case "$i_ndbm" in - $define) avail_ext="$avail_ext $xxx" ;; - esac - ;; - ODBM_File) case "${i_dbm}${i_rpcsvcdbm}" in - *"${define}"*) avail_ext="$avail_ext $xxx" ;; - esac - ;; - POSIX) case "$useposix" in - true|define|y) avail_ext="$avail_ext $xxx" ;; - esac - ;; - Opcode) case "$useopcode" in - true|define|y) avail_ext="$avail_ext $xxx" ;; - esac - ;; - Socket) case "$d_socket" in - $define) avail_ext="$avail_ext $xxx" ;; - esac - ;; - *) avail_ext="$avail_ext $xxx" - ;; - esac -done - -set X $avail_ext -shift -avail_ext="$*" - -case $usedl in -$define) - $cat <&4 - for file in $loclist $trylist; do - eval $file="\$file" - done - ;; -esac - -: create config.sh file -echo " " -echo "Creating config.sh..." >&4 -$spitshell <config.sh -$startsh -# -# This file was produced by running the Configure script. It holds all -# the definitions figured out by Configure. Should you modify any of -# these values, do not forget to propagate your changes by running -# "Configure -S"; or, equivalently, you may run each .SH file yourself. -# - -# Configuration time: $cf_time -# Configured by: $cf_by -# Target system: $myuname - -Author='$Author' -Date='$Date' -Header='$Header' -Id='$Id' -Locker='$Locker' -Log='$Log' -Mcc='$Mcc' -RCSfile='$RCSfile' -Revision='$Revision' -Source='$Source' -State='$State' -afs='$afs' -alignbytes='$alignbytes' -aphostname='$aphostname' -ar='$ar' -archlib='$archlib' -archlibexp='$archlibexp' -archname='$archname' -archobjs='$archobjs' -awk='$awk' -baserev='$baserev' -bash='$bash' -bin='$bin' -bincompat3='$bincompat3' -binexp='$binexp' -bison='$bison' -byacc='$byacc' -byteorder='$byteorder' -c='$c' -castflags='$castflags' -cat='$cat' -cc='$cc' -cccdlflags='$cccdlflags' -ccdlflags='$ccdlflags' -ccflags='$ccflags' -cf_by='$cf_by' -cf_email='$cf_email' -cf_time='$cf_time' -chgrp='$chgrp' -chmod='$chmod' -chown='$chown' -clocktype='$clocktype' -comm='$comm' -compress='$compress' -contains='$contains' -cp='$cp' -cpio='$cpio' -cpp='$cpp' -cpp_stuff='$cpp_stuff' -cppflags='$cppflags' -cpplast='$cpplast' -cppminus='$cppminus' -cpprun='$cpprun' -cppstdin='$cppstdin' -cryptlib='$cryptlib' -csh='$csh' -d_Gconvert='$d_Gconvert' -d_access='$d_access' -d_alarm='$d_alarm' -d_archlib='$d_archlib' -d_attribut='$d_attribut' -d_bcmp='$d_bcmp' -d_bcopy='$d_bcopy' -d_bincompat3='$d_bincompat3' -d_bsd='$d_bsd' -d_bsdgetpgrp='$d_bsdgetpgrp' -d_bsdpgrp='$d_bsdpgrp' -d_bsdsetpgrp='$d_bsdsetpgrp' -d_bzero='$d_bzero' -d_casti32='$d_casti32' -d_castneg='$d_castneg' -d_charvspr='$d_charvspr' -d_chown='$d_chown' -d_chroot='$d_chroot' -d_chsize='$d_chsize' -d_closedir='$d_closedir' -d_const='$d_const' -d_crypt='$d_crypt' -d_csh='$d_csh' -d_cuserid='$d_cuserid' -d_dbl_dig='$d_dbl_dig' -d_difftime='$d_difftime' -d_dirnamlen='$d_dirnamlen' -d_dlerror='$d_dlerror' -d_dlopen='$d_dlopen' -d_dlsymun='$d_dlsymun' -d_dosuid='$d_dosuid' -d_dup2='$d_dup2' -d_eofnblk='$d_eofnblk' -d_eunice='$d_eunice' -d_fchmod='$d_fchmod' -d_fchown='$d_fchown' -d_fcntl='$d_fcntl' -d_fd_macros='$d_fd_macros' -d_fd_set='$d_fd_set' -d_fds_bits='$d_fds_bits' -d_fgetpos='$d_fgetpos' -d_flexfnam='$d_flexfnam' -d_flock='$d_flock' -d_fork='$d_fork' -d_fpathconf='$d_fpathconf' -d_fsetpos='$d_fsetpos' -d_ftime='$d_ftime' -d_getgrps='$d_getgrps' -d_setgrps='$d_setgrps' -d_gethent='$d_gethent' -d_gethname='$d_gethname' -d_getlogin='$d_getlogin' -d_getpgid='$d_getpgid' -d_getpgrp2='$d_getpgrp2' -d_getpgrp='$d_getpgrp' -d_getppid='$d_getppid' -d_getprior='$d_getprior' -d_gettimeod='$d_gettimeod' -d_gnulibc='$d_gnulibc' -d_htonl='$d_htonl' -d_index='$d_index' -d_inetaton='$d_inetaton' -d_isascii='$d_isascii' -d_killpg='$d_killpg' -d_link='$d_link' -d_locconv='$d_locconv' -d_lockf='$d_lockf' -d_lstat='$d_lstat' -d_mblen='$d_mblen' -d_mbstowcs='$d_mbstowcs' -d_mbtowc='$d_mbtowc' -d_memcmp='$d_memcmp' -d_memcpy='$d_memcpy' -d_memmove='$d_memmove' -d_memset='$d_memset' -d_mkdir='$d_mkdir' -d_mkfifo='$d_mkfifo' -d_mktime='$d_mktime' -d_msg='$d_msg' -d_msgctl='$d_msgctl' -d_msgget='$d_msgget' -d_msgrcv='$d_msgrcv' -d_msgsnd='$d_msgsnd' -d_mymalloc='$d_mymalloc' -d_nice='$d_nice' -d_oldarchlib='$d_oldarchlib' -d_oldsock='$d_oldsock' -d_open3='$d_open3' -d_pathconf='$d_pathconf' -d_pause='$d_pause' -d_phostname='$d_phostname' -d_pipe='$d_pipe' -d_poll='$d_poll' -d_portable='$d_portable' -d_pwage='$d_pwage' -d_pwchange='$d_pwchange' -d_pwclass='$d_pwclass' -d_pwcomment='$d_pwcomment' -d_pwexpire='$d_pwexpire' -d_pwquota='$d_pwquota' -d_readdir='$d_readdir' -d_readlink='$d_readlink' -d_rename='$d_rename' -d_rewinddir='$d_rewinddir' -d_rmdir='$d_rmdir' -d_safebcpy='$d_safebcpy' -d_safemcpy='$d_safemcpy' -d_sanemcmp='$d_sanemcmp' -d_seekdir='$d_seekdir' -d_select='$d_select' -d_sem='$d_sem' -d_semctl='$d_semctl' -d_semget='$d_semget' -d_semop='$d_semop' -d_setegid='$d_setegid' -d_seteuid='$d_seteuid' -d_setlinebuf='$d_setlinebuf' -d_setlocale='$d_setlocale' -d_setpgid='$d_setpgid' -d_setpgrp2='$d_setpgrp2' -d_setpgrp='$d_setpgrp' -d_setprior='$d_setprior' -d_setregid='$d_setregid' -d_setresgid='$d_setresgid' -d_setresuid='$d_setresuid' -d_setreuid='$d_setreuid' -d_setrgid='$d_setrgid' -d_setruid='$d_setruid' -d_setsid='$d_setsid' -d_sfio='$d_sfio' -d_shm='$d_shm' -d_shmat='$d_shmat' -d_shmatprototype='$d_shmatprototype' -d_shmctl='$d_shmctl' -d_shmdt='$d_shmdt' -d_shmget='$d_shmget' -d_sigaction='$d_sigaction' -d_sigsetjmp='$d_sigsetjmp' -d_socket='$d_socket' -d_sockpair='$d_sockpair' -d_statblks='$d_statblks' -d_stdio_cnt_lval='$d_stdio_cnt_lval' -d_stdio_ptr_lval='$d_stdio_ptr_lval' -d_stdiobase='$d_stdiobase' -d_stdstdio='$d_stdstdio' -d_strchr='$d_strchr' -d_strcoll='$d_strcoll' -d_strctcpy='$d_strctcpy' -d_strerrm='$d_strerrm' -d_strerror='$d_strerror' -d_strtod='$d_strtod' -d_strtol='$d_strtol' -d_strtoul='$d_strtoul' -d_strxfrm='$d_strxfrm' -d_suidsafe='$d_suidsafe' -d_symlink='$d_symlink' -d_syscall='$d_syscall' -d_sysconf='$d_sysconf' -d_sysernlst='$d_sysernlst' -d_syserrlst='$d_syserrlst' -d_system='$d_system' -d_tcgetpgrp='$d_tcgetpgrp' -d_tcsetpgrp='$d_tcsetpgrp' -d_telldir='$d_telldir' -d_time='$d_time' -d_times='$d_times' -d_truncate='$d_truncate' -d_tzname='$d_tzname' -d_umask='$d_umask' -d_uname='$d_uname' -d_vfork='$d_vfork' -d_void_closedir='$d_void_closedir' -d_voidsig='$d_voidsig' -d_voidtty='$d_voidtty' -d_volatile='$d_volatile' -d_vprintf='$d_vprintf' -d_wait4='$d_wait4' -d_waitpid='$d_waitpid' -d_wcstombs='$d_wcstombs' -d_wctomb='$d_wctomb' -d_xenix='$d_xenix' -date='$date' -db_hashtype='$db_hashtype' -db_prefixtype='$db_prefixtype' -defvoidused='$defvoidused' -direntrytype='$direntrytype' -dlext='$dlext' -dlsrc='$dlsrc' -dynamic_ext='$dynamic_ext' -eagain='$eagain' -echo='$echo' -egrep='$egrep' -emacs='$emacs' -eunicefix='$eunicefix' -exe_ext='$exe_ext' -expr='$expr' -extensions='$extensions' -find='$find' -firstmakefile='$firstmakefile' -flex='$flex' -fpostype='$fpostype' -freetype='$freetype' -full_csh='$full_csh' -full_sed='$full_sed' -gcc='$gcc' -gccversion='$gccversion' -gidtype='$gidtype' -glibpth='$glibpth' -grep='$grep' -groupcat='$groupcat' -groupstype='$groupstype' -gzip='$gzip' -h_fcntl='$h_fcntl' -h_sysfile='$h_sysfile' -hint='$hint' -hostcat='$hostcat' -huge='$huge' -i_bsdioctl='$i_bsdioctl' -i_db='$i_db' -i_dbm='$i_dbm' -i_dirent='$i_dirent' -i_dld='$i_dld' -i_dlfcn='$i_dlfcn' -i_fcntl='$i_fcntl' -i_float='$i_float' -i_gdbm='$i_gdbm' -i_grp='$i_grp' -i_limits='$i_limits' -i_locale='$i_locale' -i_malloc='$i_malloc' -i_math='$i_math' -i_memory='$i_memory' -i_ndbm='$i_ndbm' -i_neterrno='$i_neterrno' -i_niin='$i_niin' -i_pwd='$i_pwd' -i_rpcsvcdbm='$i_rpcsvcdbm' -i_sfio='$i_sfio' -i_sgtty='$i_sgtty' -i_stdarg='$i_stdarg' -i_stddef='$i_stddef' -i_stdlib='$i_stdlib' -i_string='$i_string' -i_sysdir='$i_sysdir' -i_sysfile='$i_sysfile' -i_sysfilio='$i_sysfilio' -i_sysin='$i_sysin' -i_sysioctl='$i_sysioctl' -i_sysndir='$i_sysndir' -i_sysparam='$i_sysparam' -i_sysresrc='$i_sysresrc' -i_sysselct='$i_sysselct' -i_syssockio='$i_syssockio' -i_sysstat='$i_sysstat' -i_systime='$i_systime' -i_systimek='$i_systimek' -i_systimes='$i_systimes' -i_systypes='$i_systypes' -i_sysun='$i_sysun' -i_syswait='$i_syswait' -i_termio='$i_termio' -i_termios='$i_termios' -i_time='$i_time' -i_unistd='$i_unistd' -i_utime='$i_utime' -i_values='$i_values' -i_varargs='$i_varargs' -i_varhdr='$i_varhdr' -i_vfork='$i_vfork' -incpath='$incpath' -inews='$inews' -installarchlib='$installarchlib' -installbin='$installbin' -installman1dir='$installman1dir' -installman3dir='$installman3dir' -installprivlib='$installprivlib' -installscript='$installscript' -installsitearch='$installsitearch' -installsitelib='$installsitelib' -intsize='$intsize' -known_extensions='$known_extensions' -ksh='$ksh' -large='$large' -ld='$ld' -lddlflags='$lddlflags' -ldflags='$ldflags' -less='$less' -lib_ext='$lib_ext' -libc='$libc' -libperl='$libperl' -libpth='$libpth' -libs='$libs' -libswanted='$libswanted' -line='$line' -lint='$lint' -lkflags='$lkflags' -ln='$ln' -lns='$lns' -locincpth='$locincpth' -loclibpth='$loclibpth' -longsize='$longsize' -lp='$lp' -lpr='$lpr' -ls='$ls' -lseektype='$lseektype' -mail='$mail' -mailx='$mailx' -make='$make' -make_set_make='$make_set_make' -mallocobj='$mallocobj' -mallocsrc='$mallocsrc' -malloctype='$malloctype' -man1dir='$man1dir' -man1direxp='$man1direxp' -man1ext='$man1ext' -man3dir='$man3dir' -man3direxp='$man3direxp' -man3ext='$man3ext' -medium='$medium' -mips='$mips' -mips_type='$mips_type' -mkdir='$mkdir' -models='$models' -modetype='$modetype' -more='$more' -mv='$mv' -myarchname='$myarchname' -mydomain='$mydomain' -myhostname='$myhostname' -myuname='$myuname' -n='$n' -nm_opt='$nm_opt' -nm_so_opt='$nm_so_opt' -nroff='$nroff' -o_nonblock='$o_nonblock' -obj_ext='$obj_ext' -oldarchlib='$oldarchlib' -oldarchlibexp='$oldarchlibexp' -optimize='$optimize' -orderlib='$orderlib' -osname='$osname' -osvers='$osvers' -package='$package' -pager='$pager' -passcat='$passcat' -patchlevel='$patchlevel' -path_sep='$path_sep' -perl='$perl' -perladmin='$perladmin' -perlpath='$perlpath' -pg='$pg' -phostname='$phostname' -plibpth='$plibpth' -pmake='$pmake' -pr='$pr' -prefix='$prefix' -prefixexp='$prefixexp' -privlib='$privlib' -privlibexp='$privlibexp' -prototype='$prototype' -randbits='$randbits' -ranlib='$ranlib' -rd_nodata='$rd_nodata' -rm='$rm' -rmail='$rmail' -runnm='$runnm' -scriptdir='$scriptdir' -scriptdirexp='$scriptdirexp' -sed='$sed' -selecttype='$selecttype' -sendmail='$sendmail' -sh='$sh' -shar='$shar' -sharpbang='$sharpbang' -shmattype='$shmattype' -shortsize='$shortsize' -shrpenv='$shrpenv' -shsharp='$shsharp' -sig_name='$sig_name' -sig_num='$sig_num' -signal_t='$signal_t' -sitearch='$sitearch' -sitearchexp='$sitearchexp' -sitelib='$sitelib' -sitelibexp='$sitelibexp' -sizetype='$sizetype' -sleep='$sleep' -smail='$smail' -small='$small' -so='$so' -sockethdr='$sockethdr' -socketlib='$socketlib' -sort='$sort' -spackage='$spackage' -spitshell='$spitshell' -split='$split' -ssizetype='$ssizetype' -startperl='$startperl' -startsh='$startsh' -static_ext='$static_ext' -stdchar='$stdchar' -stdio_base='$stdio_base' -stdio_bufsiz='$stdio_bufsiz' -stdio_cnt='$stdio_cnt' -stdio_ptr='$stdio_ptr' -strings='$strings' -submit='$submit' -subversion='$subversion' -sysman='$sysman' -tail='$tail' -tar='$tar' -tbl='$tbl' -test='$test' -timeincl='$timeincl' -timetype='$timetype' -touch='$touch' -tr='$tr' -troff='$troff' -uidtype='$uidtype' -uname='$uname' -uniq='$uniq' -usedl='$usedl' -usemymalloc='$usemymalloc' -usenm='$usenm' -useopcode='$useopcode' -useperlio='$useperlio' -useposix='$useposix' -usesfio='$usesfio' -useshrplib='$useshrplib' -usevfork='$usevfork' -usrinc='$usrinc' -uuname='$uuname' -vi='$vi' -voidflags='$voidflags' -xlibpth='$xlibpth' -zcat='$zcat' -zip='$zip' -EOT - -: add special variables -$test -f patchlevel.h && \ -awk '/^#define/ {printf "%s=%s\n",$2,$3}' patchlevel.h >>config.sh -echo "CONFIG=true" >>config.sh - -: propagate old symbols -if $test -f UU/config.sh; then - UU/oldconfig.sh - sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' config.sh config.sh UU/oldconfig.sh |\ - sort | uniq -u >UU/oldsyms - set X `cat UU/oldsyms` - shift - case $# in - 0) ;; - *) - cat <>config.sh - for sym in `cat UU/oldsyms`; do - echo " Propagating $hint variable "'$'"$sym..." - eval 'tmp="$'"${sym}"'"' - echo "$tmp" | \ - sed -e "s/'/'\"'\"'/g" -e "s/^/$sym='/" -e "s/$/'/" >>config.sh - done - ;; - esac -fi - -: Finish up by extracting the .SH files -case "$alldone" in -exit) - $rm -rf UU - echo "Done." - exit 0 - ;; -cont) - ;; -'') - dflt='' - nostick=true - $cat <&4 -c "$ans";; - esac - ;; -esac - -: if this fails, just run all the .SH files by hand -. ./config.sh - -echo " " -exec 1>&4 -. ./UU/extract - -if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then - dflt=y - case "$silent" in - true) ;; - *) - $cat < makedepend.out &" -It can take a while, so you might not want to run it right now. - -EOM - ;; - esac - rp="Run make depend now?" - . UU/myread - case "$ans" in - y*) - make depend && echo "Now you must run a make." - ;; - *) - echo "You must run 'make depend' then 'make'." - ;; - esac -elif test -f [Mm]akefile; then - echo " " - echo "Now you must run a make." -else - echo "Done." -fi - -$rm -f kit*isdone ark*isdone -$rm -rf UU - -: End of Configure - diff --git a/Configure.rej b/Configure.rej deleted file mode 100644 index 7adccb5..0000000 --- a/Configure.rej +++ /dev/null @@ -1,17 +0,0 @@ -*************** -*** 2994,3000 **** - #endif - } - EOP -! (cc -o pdp11 pdp11.c) >/dev/null 2>&1 - if ./pdp11 2>/dev/null; then - dflt='unsplit split' - else ---- 2994,3000 ---- - #endif - } - EOP -! cc -o pdp11 pdp11.c >/dev/null 2>&1 - if ./pdp11 2>/dev/null; then - dflt='unsplit split' - else diff --git a/README.win32 b/README.win32 index 8f1ff1b..fe5d85a 100644 --- a/README.win32 +++ b/README.win32 @@ -49,7 +49,7 @@ compilers that can generally be used to build Win32 applications. This port currently supports MakeMaker (the set of modules that is used to build extensions to perl). Therefore, you should be able to build and install most extensions found in the CPAN sites. -See the L section for general hints about this. +See L below for general hints about this. =head2 Setting Up @@ -59,8 +59,9 @@ See the L section for general hints about this. Use the default "cmd" shell that comes with NT. In particular, do *not* use the 4DOS/NT shell. The Makefile has commands that are not -compatible with that shell. You are mostly on your own if you can -muster the temerity to attempt this with Windows95. +compatible with that shell. The Makefile also has known +incompatibilites with the default shell that comes with Windows95, +so building under Windows95 should be considered "unsupported". =item * @@ -98,10 +99,22 @@ versions of NMAKE that come with Visual C++ ver. 2.0 and above. Edit the Makefile and change the values of INST_DRV and INST_TOP if you want perl to be installed in a location other than "C:\PERL". +If you want to build a perl capable of running on the Windows95 +platform, you will have to uncomment the line that sets "RUNTIME=-MT". +(The default settings use the Microsoft-recommended -MD option for +compiling, which uses the DLL version of the C RunTime Library. There +currently exists a bug in the Microsoft CRTL that causes failure of +the socket calls only on the Windows95 platform. This bug cannot be +worked around if the DLL version of the CRTL is used, which is why you +need to enable the -MT flag.) Perl compiled with -MT can be used on +both Windows NT and Windows95. + +If you are using Visual C++ ver. 2.0, uncomment the line that +sets "CCTYPE=MSVC20". + =item * -If you are using Visual C++ ver. 4.0 and above: type "nmake". -If you are using a Visual C++ ver. 2.0: type "nmake CCTYPE=MSVC20". +Type "nmake". This should build everything. Specifically, it will create perl.exe, perl.dll, and perlglob.exe at the perl toplevel, and various other @@ -221,7 +234,7 @@ This pipes "foo" to the pager and writes "bar" in the file "blurch": perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less -Discovering the usage of the "command.com" shell on Windows 95 +Discovering the usage of the "command.com" shell on Windows95 is left as an exercise to the reader :) =item Building Extensions @@ -253,6 +266,33 @@ it looks like the extension building support is at fault, report that with full details of how the build failed using the perlbug utility. +=item Win32 Specific Extensions + +A number of extensions specific to the Win32 platform are available +from CPAN. You may find that many of these extensions are meant to +be used under the Activeware port of Perl, which used to be the only +native port for the Win32 platform. Since the Activeware port does not +have adequate support for Perl's extension building tools, these +extensions typically do not support those tools either, and therefore +cannot be built using the generic steps shown in the previous section. + +To ensure smooth transitioning of existing code that uses the +Activeware port, there is a bundle of Win32 extensions that contains +all of the Activeware extensions and most other Win32 extensions from +CPAN in source form, along with many added bugfixes, and with MakeMaker +support. This bundle is available at: + + http://www.perl.com/CPAN/authors/id/GSAR/libwin32-0.06.tar.gz + +See the README in that distribution for building and installation +instructions. Look for later versions that may be available at the +same location. + +It is expected that authors of Win32 specific extensions will begin +distributing their work in MakeMaker compatible form subsequent to +the 5.004 release of perl, at which point the need for a dedicated +bundle such as the above should diminish. + =item Miscellaneous Things A full set of HTML documentation is installed, so you should be @@ -379,6 +419,6 @@ at the time. Nick Ing-Simmons and Gurusamy Sarathy have made numerous and sundry hacks since then. -Last updated: 13 April 1997 +Last updated: 15 May 1997 =cut diff --git a/cop.h b/cop.h index 3383ceb..baedc5a 100644 --- a/cop.h +++ b/cop.h @@ -210,7 +210,7 @@ struct subst { char * sbu_s; char * sbu_m; char * sbu_strend; - char * sbu_subbase; + void * sbu_rxres; REGEXP * sbu_rx; }; #define sb_iters cx_u.cx_subst.sbu_iters @@ -225,7 +225,7 @@ struct subst { #define sb_s cx_u.cx_subst.sbu_s #define sb_m cx_u.cx_subst.sbu_m #define sb_strend cx_u.cx_subst.sbu_strend -#define sb_subbase cx_u.cx_subst.sbu_subbase +#define sb_rxres cx_u.cx_subst.sbu_rxres #define sb_rx cx_u.cx_subst.sbu_rx #define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix], \ @@ -241,11 +241,13 @@ struct subst { cx->sb_s = s, \ cx->sb_m = m, \ cx->sb_strend = strend, \ - cx->sb_subbase = Nullch, \ + cx->sb_rxres = Null(void*), \ cx->sb_rx = rx, \ - cx->cx_type = CXt_SUBST + cx->cx_type = CXt_SUBST; \ + rxres_save(&cx->sb_rxres, rx) -#define POPSUBST(cx) cxstack_ix-- +#define POPSUBST(cx) cx = &cxstack[cxstack_ix--]; \ + rxres_free(&cx->sb_rxres) struct context { I32 cx_type; /* what kind of context this is */ diff --git a/dump.c b/dump.c index 2a45e75..9bd51ac 100644 --- a/dump.c +++ b/dump.c @@ -354,7 +354,11 @@ register PMOP *pm; else ch = '/'; if (pm->op_pmregexp) - dump("PMf_PRE %c%s%c\n",ch,pm->op_pmregexp->precomp,ch); + dump("PMf_PRE %c%s%c%s\n", + ch, pm->op_pmregexp->precomp, ch, + (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : ""); + else + dump("PMf_PRE (RUNTIME)\n"); if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) { dump("PMf_REPL = "); dump_op(pm->op_pmreplroot); @@ -380,8 +384,8 @@ register PMOP *pm; sv_catpv(tmpsv, ",KEEP"); if (pm->op_pmflags & PMf_GLOBAL) sv_catpv(tmpsv, ",GLOBAL"); - if (pm->op_pmflags & PMf_RUNTIME) - sv_catpv(tmpsv, ",RUNTIME"); + if (pm->op_pmflags & PMf_CONTINUE) + sv_catpv(tmpsv, ",CONTINUE"); if (pm->op_pmflags & PMf_EVAL) sv_catpv(tmpsv, ",EVAL"); dump("PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : ""); diff --git a/embed.h b/embed.h index 7246cf2..0ad53a7 100644 --- a/embed.h +++ b/embed.h @@ -903,6 +903,9 @@ #define rsignal_save Perl_rsignal_save #define rsignal_state Perl_rsignal_state #define runops Perl_runops +#define rxres_free Perl_rxres_free +#define rxres_restore Perl_rxres_restore +#define rxres_save Perl_rxres_save #define same_dirent Perl_same_dirent #define save_I16 Perl_save_I16 #define save_I32 Perl_save_I32 diff --git a/global.sym b/global.sym index 49d6df0..50f8c53 100644 --- a/global.sym +++ b/global.sym @@ -997,6 +997,9 @@ rsignal_save rsignal_state rsignal_restore runops +rxres_free +rxres_restore +rxres_save safecalloc safemalloc safefree diff --git a/installperl b/installperl index ad1ad91..9686bfb 100755 --- a/installperl +++ b/installperl @@ -1,7 +1,7 @@ #!./perl BEGIN { - require 5.003_90; + require 5.004; @INC = 'lib'; $ENV{PERL5LIB} = 'lib'; } diff --git a/op.c b/op.c index 75d7583..6c85530 100644 --- a/op.c +++ b/op.c @@ -831,8 +831,11 @@ OP *op; for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling) scalarvoid(kid); break; + case OP_ENTEREVAL: + scalarkids(op); + break; case OP_REQUIRE: - /* since all requires must return a value, they're never void */ + /* all requires must return a boolean value */ op->op_flags &= ~OPf_WANT; return scalar(op); case OP_SPLIT: @@ -918,6 +921,10 @@ OP *op; } curcop = &compiling; break; + case OP_REQUIRE: + /* all requires must return a boolean value */ + op->op_flags &= ~OPf_WANT; + return scalar(op); } return op; } @@ -4276,8 +4283,7 @@ OP * ck_match(op) OP *op; { - cPMOP->op_pmflags |= PMf_RUNTIME; - cPMOP->op_pmpermflags |= PMf_RUNTIME; + op->op_private |= OPpRUNTIME; return op; } diff --git a/op.h b/op.h index 961ebcf..d58f825 100644 --- a/op.h +++ b/op.h @@ -89,6 +89,9 @@ typedef U32 PADOFFSET; /* Private for OP_SASSIGN */ #define OPpASSIGN_BACKWARDS 64 /* Left & right switched. */ +/* Private for OP_MATCH and OP_SUBST{,CONST} */ +#define OPpRUNTIME 64 /* Pattern coming in on the stack */ + /* Private for OP_TRANS */ #define OPpTRANS_SQUASH 16 #define OPpTRANS_DELETE 32 @@ -185,7 +188,7 @@ struct pmop { #define PMf_CONST 0x0040 /* subst replacement is constant */ #define PMf_KEEP 0x0080 /* keep 1st runtime pattern forever */ #define PMf_GLOBAL 0x0100 /* pattern had a g modifier */ -#define PMf_RUNTIME 0x0200 /* pattern coming in on the stack */ +#define PMf_CONTINUE 0x0200 /* don't reset pos() if //g fails */ #define PMf_EVAL 0x0400 /* evaluating replacement as expr */ #define PMf_WHITE 0x0800 /* pattern is \s+ */ #define PMf_MULTILINE 0x1000 /* assume multiple lines */ diff --git a/patchlevel.h b/patchlevel.h index 4d3c4dd..6d795a0 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -1,5 +1,5 @@ -#define PATCHLEVEL 3 -#define SUBVERSION 99 +#define PATCHLEVEL 4 +#define SUBVERSION 0 /* local_patches -- list of locally applied less-than-subversion patches. @@ -38,7 +38,6 @@ */ static char *local_patches[] = { NULL - ,"Dev99A - First post-gamma development patch" ,NULL }; diff --git a/perl.c b/perl.c index e2ceb9e..3b57a48 100644 --- a/perl.c +++ b/perl.c @@ -1710,7 +1710,8 @@ SV *sv; #ifndef DOSISH && cando(S_IXUSR,TRUE,&statbuf) #endif - ) { + ) + { xfound = tokenbuf; /* bingo! */ break; } @@ -2391,7 +2392,7 @@ init_perllib() #endif /* VMS */ } -/* Use the ~-expanded versions of APPLIB (undocumented), +/* Use the ~-expanded versions of APPLLIB (undocumented), ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB */ #ifdef APPLLIB_EXP diff --git a/plan9/buildinfo b/plan9/buildinfo index f2d685c..9ec2c59 100644 --- a/plan9/buildinfo +++ b/plan9/buildinfo @@ -1 +1 @@ -p9pvers = 5.003_99 +p9pvers = 5.004 diff --git a/pod/perldelta.pod b/pod/perldelta.pod index a8c0909..9c85450 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -16,8 +16,8 @@ cannot be built there, for lack of a reasonable command interpreter. =head1 Core Changes -Most importantly, many bugs were fixed. See the F -file in the distribution for details. +Most importantly, many bugs were fixed, including several security +problems. See the F file in the distribution for details. =head2 Compilation option: Binary compatibility with 5.003 @@ -36,7 +36,7 @@ variable as if its contents had appeared on a "#!perl" line at the beginning of your script, except that hyphens are optional. PERL5OPT may only be used to set the following switches: B<-[DIMUdmw]>. -=head2 Limitations on B<-M>, and C<-m>, and B<-T> options +=head2 Limitations on B<-M>, B<-m>, and B<-T> options The C<-M> and C<-m> options are no longer allowed on the C<#!> line of a script. If a script needs a module, it should invoke it with the @@ -158,6 +158,33 @@ previously-working script to now fail -- which should be construed as a blessing, since that indicates a potentially-serious security hole was just plugged. +The new restrictions when tainting include: + +=over + +=item No glob() or <*> + +These operators may spawn the C shell (csh), which cannot be made +safe. This restriction will be lifted in a future version of Perl +when globbing is implemented without the use of an external program. + +=item No spawning if tainted $CDPATH, $ENV, $BASH_ENV + +These environment variables may alter the behavior of spawned programs +(especially shells) in ways that subvert security. So now they are +treated as dangerous, in the manner of $IFS and $PATH. + +=item No spawning if tainted $TERM doesn't look like a terminal name + +Some termcap libraries do unsafe things with $TERM. However, it would be +unnecessarily harsh to treat all $TERM values as unsafe, since only shell +metacharacters can cause trouble in $TERM. So a tainted $TERM is +considered to be safe if it contains only alphanumerics, underscores, +dashes, and colons, and unsafe if it contains other characters (including +whitespace). + +=back + =head2 New Opcode module and revised Safe module A new Opcode module supports the creation, manipulation and @@ -182,8 +209,8 @@ it is now merely a front end to the IO::* modules -- specifically, IO::Handle, IO::Seekable, and IO::File. We suggest, but do not require, that you use the IO::* modules in new code. -In harmony with this change, C<*GLOB{FILEHANDLE}> is now a -backward-compatible synonym for C<*STDOUT{IO}>. +In harmony with this change, C<*GLOB{FILEHANDLE}> is now just a +backward-compatible synonym for C<*GLOB{IO}>. =head2 Internal change: PerlIO abstraction interface @@ -415,25 +442,16 @@ of course, or if you want a seed other than the default. Functions documented in the Camel to default to $_ now in fact do, and all those that do are so documented in L. -=item C does not reset search position on failure +=item C does not reset search position on failure -The C match iteration construct used to reset its target string's -search position (which is visible through the C operator) when a -match failed; as a result, the next C match would start at the -beginning of the string). With Perl 5.004, the search position must be -reset explicitly, as with C, or by modifying the target -string. This change in Perl makes it possible to chain matches together -in conjunction with the C<\G> zero-width assertion. See L and -L. - -Here is an illustration of what it takes to get the old behavior: - - for ( qw(this and that are not what you think you got) ) { - while ( /(\w*t\w*)/g ) { print "t word is: $1\n" } - pos = 0; # REQUIRED FOR 5.004 - while ( /(\w*a\w*)/g ) { print "a word is: $1\n" } - print "\n"; - } +The C match iteration construct has always reset its target +string's search position (which is visible through the C operator) +when a match fails; as a result, the next C match after a failure +starts again at the beginning of the string. With Perl 5.004, this +reset may be disabled by adding the "c" (for "continue") modifier, +i.e. C. This feature, in conjunction with the C<\G> zero-width +assertion, makes it possible to chain matches together. See L +and L. =item C ignores whitespace before ?*+{} @@ -452,16 +470,16 @@ right. They do now. Just like anonymous functions that contain lexical variables that change (like a lexical index variable for a C loop), formats now work properly. For example, this silently failed -before, and is fine now: +before (printed only zeros), but is fine now: my $i; foreach $i ( 1 .. 10 ) { - format = + write; + } + format = my i is @# $i . - write; - } =back @@ -1057,6 +1075,10 @@ new pods are included in section 1: This document. +=item L + +Frequently asked questions. + =item L Locale support (internationalization and localization). @@ -1069,6 +1091,11 @@ Tutorial on Perl OO programming. Perl internal IO abstraction interface. +=item L + +Perl module library and recommended practice for module creation. +Extracted from L (which is much smaller as a result). + =item L Although not new, this has been massively updated. @@ -1519,4 +1546,4 @@ Constructed by Tom Christiansen, grabbing material with permission from innumerable contributors, with kibitzing by more than a few Perl porters. -Last update: Sat Mar 8 19:51:26 EST 1997 +Last update: Wed May 14 11:14:09 EDT 1997 diff --git a/pod/perlfaq1.pod b/pod/perlfaq1.pod index 6af40ae..a9a5fd4 100644 --- a/pod/perlfaq1.pod +++ b/pod/perlfaq1.pod @@ -50,12 +50,12 @@ users the informal support will more than suffice. See the answer to =head2 Which version of Perl should I use? You should definitely use version 5. Version 4 is old, limited, and -no longer maintained. Its last patch (4.036) was in 1992. The last -production release was 5.003, and the current experimental release for -those at the bleeding edge (as of 27/03/97) is 5.003_92, considered a beta -for production release 5.004, which will probably be out by the time -you read this. Further references to the Perl language in this document -refer to the current production release unless otherwise specified. +no longer maintained; its last patch (4.036) was in 1992. The most +recent production release is 5.004. Further references to the Perl +language in this document refer to this production release unless +otherwise specified. There may be one or more official bug fixes for +5.004 by the time you read this, and also perhaps some experimental +versions on the way to the next release. =head2 What are perl4 and perl5? diff --git a/pod/perlfaq6.pod b/pod/perlfaq6.pod index d21a111..535e464 100644 --- a/pod/perlfaq6.pod +++ b/pod/perlfaq6.pod @@ -479,15 +479,17 @@ Or, using C<\G>, the much simpler (and faster): A more sophisticated use might involve a tokenizer. The following lex-like example is courtesy of Jeffrey Friedl. It did not work in -5.003 due to bugs in that release, but does work in 5.004 or better: +5.003 due to bugs in that release, but does work in 5.004 or better. +(Note the use of C, which prevents a failed match with C from +resetting the search position back to the beginning of the string.) while (<>) { chomp; PARSER: { - m/ \G( \d+\b )/gx && do { print "number: $1\n"; redo; }; - m/ \G( \w+ )/gx && do { print "word: $1\n"; redo; }; - m/ \G( \s+ )/gx && do { print "space: $1\n"; redo; }; - m/ \G( [^\w\d]+ )/gx && do { print "other: $1\n"; redo; }; + m/ \G( \d+\b )/gcx && do { print "number: $1\n"; redo; }; + m/ \G( \w+ )/gcx && do { print "word: $1\n"; redo; }; + m/ \G( \s+ )/gcx && do { print "space: $1\n"; redo; }; + m/ \G( [^\w\d]+ )/gcx && do { print "other: $1\n"; redo; }; } } @@ -496,19 +498,19 @@ Of course, that could have been written as while (<>) { chomp; PARSER: { - if ( /\G( \d+\b )/gx { + if ( /\G( \d+\b )/gcx { print "number: $1\n"; redo PARSER; } - if ( /\G( \w+ )/gx { + if ( /\G( \w+ )/gcx { print "word: $1\n"; redo PARSER; } - if ( /\G( \s+ )/gx { + if ( /\G( \s+ )/gcx { print "space: $1\n"; redo PARSER; } - if ( /\G( [^\w\d]+ )/gx { + if ( /\G( [^\w\d]+ )/gcx { print "other: $1\n"; redo PARSER; } diff --git a/pod/perlop.pod b/pod/perlop.pod index 7f39b9d..d853865 100644 --- a/pod/perlop.pod +++ b/pod/perlop.pod @@ -697,18 +697,22 @@ If there are no parentheses, it returns a list of all the matched strings, as if there were parentheses around the whole pattern. In a scalar context, C iterates through the string, returning TRUE -each time it matches, and FALSE when it eventually runs out of -matches. (In other words, it remembers where it left off last time and -restarts the search at that point. You can actually find the current -match position of a string or set it using the pos() function--see -L.) Note that you can use this feature to stack C -matches or intermix C matches with C. Note that -the C<\G> zero-width assertion is not supported without the C -modifier; currently, without C, C<\G> behaves just like C<\A>, but -that's accidental and may change in the future. - -If you modify the string in any way, the match position is reset to the -beginning. Examples: +each time it matches, and FALSE when it eventually runs out of matches. +(In other words, it remembers where it left off last time and restarts +the search at that point. You can actually find the current match +position of a string or set it using the pos() function; see +L.) A failed match normally resets the search position to +the beginning of the string, but you can avoid that by adding the "c" +modifier (e.g. C). Modifying the target string also resets the +search position. + +You can intermix C matches with C, where C<\G> is a +zero-width assertion that matches the exact position where the previous +C, if any, left off. The C<\G> assertion is not supported without +the C modifier; currently, without C, C<\G> behaves just like +C<\A>, but that's accidental and may change in the future. + +Examples: # list context ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g); @@ -722,15 +726,15 @@ beginning. Examples: } print "$sentences\n"; - # using m//g with \G + # using m//gc with \G $_ = "ppooqppqq"; while ($i++ < 2) { print "1: '"; - print $1 while /(o)/g; print "', pos=", pos, "\n"; + print $1 while /(o)/gc; print "', pos=", pos, "\n"; print "2: '"; - print $1 if /\G(q)/g; print "', pos=", pos, "\n"; + print $1 if /\G(q)/gc; print "', pos=", pos, "\n"; print "3: '"; - print $1 while /(p)/g; print "', pos=", pos, "\n"; + print $1 while /(p)/gc; print "', pos=", pos, "\n"; } The last example should print: @@ -742,23 +746,23 @@ The last example should print: 2: 'q', pos=8 3: '', pos=8 -A useful idiom for C-like scanners is C. You can +A useful idiom for C-like scanners is C. You can combine several regexps like this to process a string part-by-part, -doing different actions depending on which regexp matched. The next -regexp would step in at the place the previous one left off. +doing different actions depending on which regexp matched. Each +regexp tries to match where the previous one leaves off. $_ = <<'EOL'; $url = new URI::URL "http://www/"; die if $url eq "xXx"; EOL LOOP: { - print(" digits"), redo LOOP if /\G\d+\b[,.;]?\s*/g; - print(" lowercase"), redo LOOP if /\G[a-z]+\b[,.;]?\s*/g; - print(" UPPERCASE"), redo LOOP if /\G[A-Z]+\b[,.;]?\s*/g; - print(" Capitalized"), redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/g; - print(" MiXeD"), redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/g; - print(" alphanumeric"), redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/g; - print(" line-noise"), redo LOOP if /\G[^A-Za-z0-9]+/g; + print(" digits"), redo LOOP if /\G\d+\b[,.;]?\s*/gc; + print(" lowercase"), redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc; + print(" UPPERCASE"), redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc; + print(" Capitalized"), redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc; + print(" MiXeD"), redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc; + print(" alphanumeric"), redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc; + print(" line-noise"), redo LOOP if /\G[^A-Za-z0-9]+/gc; print ". That's all!\n"; } diff --git a/pod/perlrun.pod b/pod/perlrun.pod index 6d8ee20..c4679e1 100644 --- a/pod/perlrun.pod +++ b/pod/perlrun.pod @@ -593,8 +593,5 @@ honest: $ENV{PATH} = '/bin:/usr/bin'; # or whatever you need $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL}; - delete $ENV{IFS}; - delete $ENV{ENV}; - delete $ENV{CDPATH}; - $ENV{TERM} = 'dumb' if exists $ENV{TERM}; + delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; diff --git a/pod/perlsec.pod b/pod/perlsec.pod index 29a9167..1a1ae21 100644 --- a/pod/perlsec.pod +++ b/pod/perlsec.pod @@ -58,10 +58,7 @@ For example: $path = $ENV{'PATH'}; # $path now tainted $ENV{'PATH'} = '/bin:/usr/bin'; - delete $ENV{'IFS'}; - delete $ENV{'CDPATH'}; - delete $ENV{'ENV'}; - $ENV{'TERM'} = 'dumb'; + delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; $path = $ENV{'PATH'}; # $path now NOT tainted system "echo $data"; # Is secure now! diff --git a/pod/perltoc.pod b/pod/perltoc.pod index 0340059..d58f12c 100644 --- a/pod/perltoc.pod +++ b/pod/perltoc.pod @@ -898,7 +898,7 @@ CGI script to do bad things? =item $PERL5OPT environment variable -=item Limitations on B<-M>, and C<-m>, and B<-T> options +=item Limitations on B<-M>, B<-m>, and B<-T> options =item More precise warnings @@ -916,6 +916,9 @@ CGI script to do bad things? =item Changes to tainting checks +No glob() or <*>, No spawning if tainted $CDPATH, $ENV, $BASH_ENV, No +spawning if tainted $TERM doesn't look like a terminal name + =item New Opcode module and revised Safe module =item Embedding improvements @@ -940,7 +943,7 @@ $^E, $^H, $^M delete on slices, flock, printf and sprintf, keys as an lvalue, my() in Control Structures, pack() and unpack(), sysseek(), use VERSION, use Module -VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C does not +VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C does not reset search position on failure, C ignores whitespace before ?*+{}, nested C closures work now, formats work right on changing lexicals @@ -1027,8 +1030,8 @@ manipulating hashes =item Documentation Changes -L, L, L, L, L, -L +L, L, L, L, L, +L, L, L =item New Diagnostics @@ -1941,7 +1944,7 @@ safe subprocesses, sockets, and semaphores) =item Safe Pipe Opens -=item Bidirectional Communication +=item Bidirectional Communication with Another Process =back @@ -1953,13 +1956,29 @@ safe subprocesses, sockets, and semaphores) =item Unix-Domain TCP Clients and Servers -=item UDP: Message Passing +=back + +=item TCP Clients with IO::Socket + +=over + +=item A Simple Client + +C, C, C + +=item A Webget Client + +=item Interactive Client with IO::Socket =back -=item SysV IPC +=item TCP Servers with IO::Socket -=item WARNING +Proto, LocalPort, Listen, Reuse + +=item UDP: Message Passing + +=item SysV IPC =item NOTES @@ -3005,6 +3024,8 @@ B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure> document in the HTTP header, 3. Specify the destination for the document in the
tag +=item LIMITED SUPPORT FOR CASCADING STYLE SHEETS + =item DEBUGGING =over diff --git a/pp_ctl.c b/pp_ctl.c index c14c2c3..bc3ebb1 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -94,7 +94,7 @@ PP(pp_regcomp) { pm->op_pmflags |= PMf_WHITE; if (pm->op_pmflags & PMf_KEEP) { - pm->op_pmflags &= ~PMf_RUNTIME; /* no point compiling again */ + pm->op_private &= ~OPpRUNTIME; /* no point compiling again */ hoistmust(pm); cLOGOP->op_first->op_next = op->op_next; } @@ -112,6 +112,8 @@ PP(pp_substcont) char *orig = cx->sb_orig; register REGEXP *rx = cx->sb_rx; + rxres_restore(&cx->sb_rxres, rx); + if (cx->sb_iters++) { if (cx->sb_iters > cx->sb_maxiters) DIE("Substitution loop"); @@ -157,9 +159,75 @@ PP(pp_substcont) sv_catpvn(dstr, s, m-s); cx->sb_s = rx->endp[0]; cx->sb_rxtainted |= rx->exec_tainted; + rxres_save(&cx->sb_rxres, rx); RETURNOP(pm->op_pmreplstart); } +void +rxres_save(rsp, rx) +void **rsp; +REGEXP *rx; +{ + UV *p = (UV*)*rsp; + U32 i; + + if (!p || p[1] < rx->nparens) { + i = 6 + rx->nparens * 2; + if (!p) + New(501, p, i, UV); + else + Renew(p, i, UV); + *rsp = (void*)p; + } + + *p++ = (UV)rx->subbase; + rx->subbase = Nullch; + + *p++ = rx->nparens; + + *p++ = (UV)rx->subbeg; + *p++ = (UV)rx->subend; + for (i = 0; i <= rx->nparens; ++i) { + *p++ = (UV)rx->startp[i]; + *p++ = (UV)rx->endp[i]; + } +} + +void +rxres_restore(rsp, rx) +void **rsp; +REGEXP *rx; +{ + UV *p = (UV*)*rsp; + U32 i; + + Safefree(rx->subbase); + rx->subbase = (char*)(*p); + *p++ = 0; + + rx->nparens = *p++; + + rx->subbeg = (char*)(*p++); + rx->subend = (char*)(*p++); + for (i = 0; i <= rx->nparens; ++i) { + rx->startp[i] = (char*)(*p++); + rx->endp[i] = (char*)(*p++); + } +} + +void +rxres_free(rsp) +void **rsp; +{ + UV *p = (UV*)*rsp; + + if (p) { + Safefree((char*)(*p)); + Safefree(p); + *rsp = Null(void*); + } +} + PP(pp_formline) { dSP; dMARK; dORIGMARK; @@ -926,11 +994,14 @@ I32 cxix; I32 optype; while (cxstack_ix > cxix) { - cx = &cxstack[cxstack_ix--]; - DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n", (long) cxstack_ix+1, - block_type[cx->cx_type])); + cx = &cxstack[cxstack_ix]; + DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n", + (long) cxstack_ix+1, block_type[cx->cx_type])); /* Note: we don't need to restore the base context info till the end. */ switch (cx->cx_type) { + case CXt_SUBST: + POPSUBST(cx); + continue; /* not break */ case CXt_SUB: POPSUB(cx); break; @@ -941,9 +1012,9 @@ I32 cxix; POPLOOP(cx); break; case CXt_NULL: - case CXt_SUBST: break; } + cxstack_ix--; } } diff --git a/pp_hot.c b/pp_hot.c index d8b1976..e48a010 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -964,6 +964,13 @@ nope: ++BmUSEFUL(pm->op_pmshort); ret_no: + if (global && !(pm->op_pmflags & PMf_CONTINUE)) { + if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) { + MAGIC* mg = mg_find(TARG, 'g'); + if (mg) + mg->mg_len = -1; + } + } LEAVE_SCOPE(oldsave); if (gimme == G_ARRAY) RETURN; diff --git a/pp_sys.c b/pp_sys.c index 200db75..03a10fe 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -224,6 +224,7 @@ PP(pp_glob) OP *result; ENTER; +#ifndef VMS if (tainting) { /* * The external globbing program may use things we can't control, @@ -232,6 +233,7 @@ PP(pp_glob) TAINT; taint_proper(no_security, "glob"); } +#endif /* !VMS */ SAVESPTR(last_in_gv); /* We don't want this to be permanent. */ last_in_gv = (GV*)*stack_sp--; @@ -3213,7 +3215,7 @@ PP(pp_setpgrp) #ifdef BSD_SETPGRP SETi( BSD_SETPGRP(pid, pgrp) >= 0 ); #else - if ((pgrp != 0 && pgrp != getpid())) || (pid != 0 && pid != getpid())) + if ((pgrp != 0 && pgrp != getpid()) || (pid != 0 && pid != getpid())) DIE("POSIX setpgrp can't take an argument"); SETi( setpgrp() >= 0 ); #endif /* USE_BSDPGRP */ @@ -3684,7 +3686,7 @@ PP(pp_gnetent) PUSHs(sv = sv_mortalcopy(&sv_no)); sv_setpv(sv, nent->n_name); PUSHs(sv = sv_mortalcopy(&sv_no)); - for (elem = nent->n_aliases; *elem; elem++) { + for (elem = nent->n_aliases; elem && *elem; elem++) { sv_catpv(sv, *elem); if (elem[1]) sv_catpvn(sv, " ", 1); @@ -3754,7 +3756,7 @@ PP(pp_gprotoent) PUSHs(sv = sv_mortalcopy(&sv_no)); sv_setpv(sv, pent->p_name); PUSHs(sv = sv_mortalcopy(&sv_no)); - for (elem = pent->p_aliases; *elem; elem++) { + for (elem = pent->p_aliases; elem && *elem; elem++) { sv_catpv(sv, *elem); if (elem[1]) sv_catpvn(sv, " ", 1); @@ -3841,7 +3843,7 @@ PP(pp_gservent) PUSHs(sv = sv_mortalcopy(&sv_no)); sv_setpv(sv, sent->s_name); PUSHs(sv = sv_mortalcopy(&sv_no)); - for (elem = sent->s_aliases; *elem; elem++) { + for (elem = sent->s_aliases; elem && *elem; elem++) { sv_catpv(sv, *elem); if (elem[1]) sv_catpvn(sv, " ", 1); @@ -4121,7 +4123,7 @@ PP(pp_ggrent) PUSHs(sv = sv_mortalcopy(&sv_no)); sv_setiv(sv, (IV)grent->gr_gid); PUSHs(sv = sv_mortalcopy(&sv_no)); - for (elem = grent->gr_mem; *elem; elem++) { + for (elem = grent->gr_mem; elem && *elem; elem++) { sv_catpv(sv, *elem); if (elem[1]) sv_catpvn(sv, " ", 1); diff --git a/proto.h b/proto.h index 732aa3d..654e51b 100644 --- a/proto.h +++ b/proto.h @@ -381,6 +381,9 @@ int rsignal_restore _((int, Sigsave_t*)); int rsignal_save _((int, Sighandler_t, Sigsave_t*)); Sighandler_t rsignal_state _((int)); int runops _((void)); +void rxres_free _((void** rsp)); +void rxres_restore _((void** rsp, REGEXP* rx)); +void rxres_save _((void** rsp, REGEXP* rx)); #ifndef HAS_RENAME I32 same_dirent _((char* a, char* b)); #endif diff --git a/regcomp.c b/regcomp.c index 9b0d4fc..d3788c8 100644 --- a/regcomp.c +++ b/regcomp.c @@ -469,7 +469,7 @@ I32 *flagp; return NULL; default: --regparse; - while (*regparse && strchr("iogmsx", *regparse)) + while (*regparse && strchr("iogcmsx", *regparse)) pmflag(®flags, *regparse++); if (*regparse != ')') croak("Sequence (?%c...) not recognized", *regparse); diff --git a/scope.c b/scope.c index f7835b7..0487ebe 100644 --- a/scope.c +++ b/scope.c @@ -697,8 +697,8 @@ CONTEXT* cx; (long)cx->sb_m); PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%lx\n", (long)cx->sb_strend); - PerlIO_printf(Perl_debug_log, "SB_SUBBASE = 0x%lx\n", - (long)cx->sb_subbase); + PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%lx\n", + (long)cx->sb_rxres); break; } } diff --git a/t/op/pat.t b/t/op/pat.t index d9941fa..0478911 100755 --- a/t/op/pat.t +++ b/t/op/pat.t @@ -2,7 +2,7 @@ # $RCSfile: pat.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:12 $ -print "1..61\n"; +print "1..62\n"; $x = "abc\ndef\n"; @@ -211,6 +211,9 @@ print scalar @x == 2 ? "ok 60\n" : "not ok 60\n"; $_ = "abdc"; pos $_ = 2; -/\Gc/g; +/\Gc/gc; print "not " if (pos $_) != 2; print "ok 61\n"; +/\Gc/g; +print "not " if defined pos $_; +print "ok 62\n"; diff --git a/t/op/taint.t b/t/op/taint.t index a33edde..1667152 100755 --- a/t/op/taint.t +++ b/t/op/taint.t @@ -19,7 +19,7 @@ my $Is_VMS = $^O eq 'VMS'; my $Is_MSWin32 = $^O eq 'MSWin32'; my $Invoke_Perl = $Is_VMS ? 'MCR Sys$Disk:[]Perl.' : $Is_MSWin32 ? '.\perl' : './perl'; -my @MoreEnv = qw/IFS ENV CDPATH TERM/; +my @MoreEnv = qw/IFS CDPATH ENV BASH_ENV/; if ($Is_VMS) { my (%old, $x); @@ -82,7 +82,7 @@ print PROG 'print "@ARGV\n"', "\n"; close PROG; my $echo = "$Invoke_Perl $ECHO"; -print "1..132\n"; +print "1..135\n"; # First, let's make sure that Perl is checking the dangerous # environment variables. Maybe they aren't set yet, so we'll @@ -91,16 +91,14 @@ print "1..132\n"; $ENV{'DCL$PATH'} = '' if $Is_VMS; $ENV{PATH} = ''; - delete $ENV{IFS}; - delete $ENV{ENV}; - delete $ENV{CDPATH}; + delete @ENV{@MoreEnv}; $ENV{TERM} = 'dumb'; test 1, eval { `$echo 1` } eq "1\n"; if ($Is_MSWin32) { print "# Environment tainting tests skipped\n"; - for (2) { print "ok $_\n" } + for (2..5) { print "ok $_\n" } } else { my @vars = ('PATH', @MoreEnv); @@ -111,6 +109,14 @@ print "1..132\n"; shift @vars; } test 2, !@vars, "\$$vars[0]"; + + # tainted $TERM is unsafe only if it contains metachars + local $ENV{TERM}; + $ENV{TERM} = 'e=mc2'; + test 3, eval { `$echo 1` } eq "1\n"; + $ENV{TERM} = 'e=mc2' . $TAINT; + test 4, eval { `$echo 1` } eq ''; + test 5, $@ =~ /^Insecure \$ENV{TERM}/, $@; } my $tmp; @@ -126,68 +132,68 @@ print "1..132\n"; if ($tmp) { local $ENV{PATH} = $tmp; - test 3, eval { `$echo 1` } eq ''; - test 4, $@ =~ /^Insecure directory in \$ENV{PATH}/, $@; + test 6, eval { `$echo 1` } eq ''; + test 7, $@ =~ /^Insecure directory in \$ENV{PATH}/, $@; } else { - for (3..4) { print "ok $_\n" } + for (6..7) { print "ok $_\n" } } if ($Is_VMS) { $ENV{'DCL$PATH'} = $TAINT; - test 5, eval { `$echo 1` } eq ''; - test 6, $@ =~ /^Insecure \$ENV{DCL\$PATH}/, $@; + test 8, eval { `$echo 1` } eq ''; + test 9, $@ =~ /^Insecure \$ENV{DCL\$PATH}/, $@; if ($tmp) { $ENV{'DCL$PATH'} = $tmp; - test 7, eval { `$echo 1` } eq ''; - test 8, $@ =~ /^Insecure directory in \$ENV{DCL\$PATH}/, $@; + test 10, eval { `$echo 1` } eq ''; + test 11, $@ =~ /^Insecure directory in \$ENV{DCL\$PATH}/, $@; } else { print "# can't find world-writeable directory to test DCL\$PATH\n"; - for (7..8) { print "ok $_\n" } + for (10..11) { print "ok $_\n" } } $ENV{'DCL$PATH'} = ''; } else { print "# This is not VMS\n"; - for (5..8) { print "ok $_\n"; } + for (8..11) { print "ok $_\n"; } } } # Let's see that we can taint and untaint as needed. { my $foo = $TAINT; - test 9, tainted $foo; + test 12, tainted $foo; # That was a sanity check. If it failed, stop the insanity! die "Taint checks don't seem to be enabled" unless tainted $foo; $foo = "foo"; - test 10, not tainted $foo; + test 13, not tainted $foo; taint_these($foo); - test 11, tainted $foo; + test 14, tainted $foo; my @list = 1..10; - test 12, not any_tainted @list; + test 15, not any_tainted @list; taint_these @list[1,3,5,7,9]; - test 13, any_tainted @list; - test 14, all_tainted @list[1,3,5,7,9]; - test 15, not any_tainted @list[0,2,4,6,8]; + test 16, any_tainted @list; + test 17, all_tainted @list[1,3,5,7,9]; + test 18, not any_tainted @list[0,2,4,6,8]; ($foo) = $foo =~ /(.+)/; - test 16, not tainted $foo; + test 19, not tainted $foo; $foo = $1 if ('bar' . $TAINT) =~ /(.+)/; - test 17, not tainted $foo; - test 18, $foo eq 'bar'; + test 20, not tainted $foo; + test 21, $foo eq 'bar'; my $pi = 4 * atan2(1,1) + $TAINT0; - test 19, tainted $pi; + test 22, tainted $pi; ($pi) = $pi =~ /(\d+\.\d+)/; - test 20, not tainted $pi; - test 21, sprintf("%.5f", $pi) eq '3.14159'; + test 23, not tainted $pi; + test 24, sprintf("%.5f", $pi) eq '3.14159'; } # How about command-line arguments? The problem is that we don't @@ -203,150 +209,150 @@ print "1..132\n"; }; close PROG; print `$Invoke_Perl "-T" $arg and some suspect arguments`; - test 22, !$?, "Exited with status $?"; + test 25, !$?, "Exited with status $?"; unlink $arg; } # Reading from a file should be tainted { my $file = './TEST'; - test 23, open(FILE, $file), "Couldn't open '$file': $!"; + test 26, open(FILE, $file), "Couldn't open '$file': $!"; my $block; sysread(FILE, $block, 100); my $line = ; close FILE; - test 24, tainted $block; - test 25, tainted $line; + test 27, tainted $block; + test 28, tainted $line; } -# Globs should be forbidden. -{ - # Some glob implementations need to spawn system programs. - local $ENV{PATH} = ''; - $ENV{PATH} = (-l '/bin' ? '' : '/bin:') . '/usr/bin' unless $Is_VMS; - +# Globs should be forbidden, except under VMS, +# which doesn't spawn an external program. +if ($Is_VMS) { + for (29..30) { print "ok $_\n"; } +} +else { my @globs = eval { <*> }; - test 26, @globs == 0 && $@ =~ /^Insecure dependency/; + test 29, @globs == 0 && $@ =~ /^Insecure dependency/; @globs = eval { glob '*' }; - test 27, @globs == 0 && $@ =~ /^Insecure dependency/; + test 30, @globs == 0 && $@ =~ /^Insecure dependency/; } # Output of commands should be tainted { my $foo = `$echo abc`; - test 28, tainted $foo; + test 31, tainted $foo; } # Certain system variables should be tainted { - test 29, all_tainted $^X, $0; + test 32, all_tainted $^X, $0; } # Results of matching should all be untainted { my $foo = "abcdefghi" . $TAINT; - test 30, tainted $foo; + test 33, tainted $foo; $foo =~ /def/; - test 31, not any_tainted $`, $&, $'; + test 34, not any_tainted $`, $&, $'; $foo =~ /(...)(...)(...)/; - test 32, not any_tainted $1, $2, $3, $+; + test 35, not any_tainted $1, $2, $3, $+; my @bar = $foo =~ /(...)(...)(...)/; - test 33, not any_tainted @bar; + test 36, not any_tainted @bar; - test 34, tainted $foo; # $foo should still be tainted! - test 35, $foo eq "abcdefghi"; + test 37, tainted $foo; # $foo should still be tainted! + test 38, $foo eq "abcdefghi"; } # Operations which affect files can't use tainted data. { - test 36, eval { chmod 0, $TAINT } eq '', 'chmod'; - test 37, $@ =~ /^Insecure dependency/, $@; + test 39, eval { chmod 0, $TAINT } eq '', 'chmod'; + test 40, $@ =~ /^Insecure dependency/, $@; # There is no feature test in $Config{} for truncate, # so we allow for the possibility that it's missing. - test 38, eval { truncate 'NoSuChFiLe', $TAINT0 } eq '', 'truncate'; - test 39, $@ =~ /^(?:Insecure dependency|truncate not implemented)/, $@; + test 41, eval { truncate 'NoSuChFiLe', $TAINT0 } eq '', 'truncate'; + test 42, $@ =~ /^(?:Insecure dependency|truncate not implemented)/, $@; - test 40, eval { rename '', $TAINT } eq '', 'rename'; - test 41, $@ =~ /^Insecure dependency/, $@; + test 43, eval { rename '', $TAINT } eq '', 'rename'; + test 44, $@ =~ /^Insecure dependency/, $@; - test 42, eval { unlink $TAINT } eq '', 'unlink'; - test 43, $@ =~ /^Insecure dependency/, $@; + test 45, eval { unlink $TAINT } eq '', 'unlink'; + test 46, $@ =~ /^Insecure dependency/, $@; - test 44, eval { utime $TAINT } eq '', 'utime'; - test 45, $@ =~ /^Insecure dependency/, $@; + test 47, eval { utime $TAINT } eq '', 'utime'; + test 48, $@ =~ /^Insecure dependency/, $@; if ($Config{d_chown}) { - test 46, eval { chown -1, -1, $TAINT } eq '', 'chown'; - test 47, $@ =~ /^Insecure dependency/, $@; + test 49, eval { chown -1, -1, $TAINT } eq '', 'chown'; + test 50, $@ =~ /^Insecure dependency/, $@; } else { print "# chown() is not available\n"; - for (46..47) { print "ok $_\n" } + for (49..50) { print "ok $_\n" } } if ($Config{d_link}) { - test 48, eval { link $TAINT, '' } eq '', 'link'; - test 49, $@ =~ /^Insecure dependency/, $@; + test 51, eval { link $TAINT, '' } eq '', 'link'; + test 52, $@ =~ /^Insecure dependency/, $@; } else { print "# link() is not available\n"; - for (48..49) { print "ok $_\n" } + for (51..52) { print "ok $_\n" } } if ($Config{d_symlink}) { - test 50, eval { symlink $TAINT, '' } eq '', 'symlink'; - test 51, $@ =~ /^Insecure dependency/, $@; + test 53, eval { symlink $TAINT, '' } eq '', 'symlink'; + test 54, $@ =~ /^Insecure dependency/, $@; } else { print "# symlink() is not available\n"; - for (50..51) { print "ok $_\n" } + for (53..54) { print "ok $_\n" } } } # Operations which affect directories can't use tainted data. { - test 52, eval { mkdir $TAINT0, $TAINT } eq '', 'mkdir'; - test 53, $@ =~ /^Insecure dependency/, $@; + test 55, eval { mkdir $TAINT0, $TAINT } eq '', 'mkdir'; + test 56, $@ =~ /^Insecure dependency/, $@; - test 54, eval { rmdir $TAINT } eq '', 'rmdir'; - test 55, $@ =~ /^Insecure dependency/, $@; + test 57, eval { rmdir $TAINT } eq '', 'rmdir'; + test 58, $@ =~ /^Insecure dependency/, $@; - test 56, eval { chdir $TAINT } eq '', 'chdir'; - test 57, $@ =~ /^Insecure dependency/, $@; + test 59, eval { chdir $TAINT } eq '', 'chdir'; + test 60, $@ =~ /^Insecure dependency/, $@; if ($Config{d_chroot}) { - test 58, eval { chroot $TAINT } eq '', 'chroot'; - test 59, $@ =~ /^Insecure dependency/, $@; + test 61, eval { chroot $TAINT } eq '', 'chroot'; + test 62, $@ =~ /^Insecure dependency/, $@; } else { print "# chroot() is not available\n"; - for (58..59) { print "ok $_\n" } + for (61..62) { print "ok $_\n" } } } # Some operations using files can't use tainted data. { my $foo = "imaginary library" . $TAINT; - test 60, eval { require $foo } eq '', 'require'; - test 61, $@ =~ /^Insecure dependency/, $@; + test 63, eval { require $foo } eq '', 'require'; + test 64, $@ =~ /^Insecure dependency/, $@; my $filename = "./taintB$$"; # NB: $filename isn't tainted! END { unlink $filename if defined $filename } $foo = $filename . $TAINT; unlink $filename; # in any case - test 62, eval { open FOO, $foo } eq '', 'open for read'; - test 63, $@ eq '', $@; # NB: This should be allowed - test 64, $! == 2; # File not found + test 65, eval { open FOO, $foo } eq '', 'open for read'; + test 66, $@ eq '', $@; # NB: This should be allowed + test 67, $! == 2; # File not found - test 65, eval { open FOO, "> $foo" } eq '', 'open for write'; - test 66, $@ =~ /^Insecure dependency/, $@; + test 68, eval { open FOO, "> $foo" } eq '', 'open for write'; + test 69, $@ =~ /^Insecure dependency/, $@; } # Commands to the system can't use tainted data @@ -355,71 +361,70 @@ print "1..132\n"; if ($^O eq 'amigaos') { print "# open(\"|\") is not available\n"; - for (67..70) { print "ok $_\n" } + for (70..73) { print "ok $_\n" } } else { - test 67, eval { open FOO, "| $foo" } eq '', 'popen to'; - test 68, $@ =~ /^Insecure dependency/, $@; + test 70, eval { open FOO, "| $foo" } eq '', 'popen to'; + test 71, $@ =~ /^Insecure dependency/, $@; - test 69, eval { open FOO, "$foo |" } eq '', 'popen from'; - test 70, $@ =~ /^Insecure dependency/, $@; + test 72, eval { open FOO, "$foo |" } eq '', 'popen from'; + test 73, $@ =~ /^Insecure dependency/, $@; } - test 71, eval { exec $TAINT } eq '', 'exec'; - test 72, $@ =~ /^Insecure dependency/, $@; + test 74, eval { exec $TAINT } eq '', 'exec'; + test 75, $@ =~ /^Insecure dependency/, $@; - test 73, eval { system $TAINT } eq '', 'system'; - test 74, $@ =~ /^Insecure dependency/, $@; + test 76, eval { system $TAINT } eq '', 'system'; + test 77, $@ =~ /^Insecure dependency/, $@; $foo = "*"; taint_these $foo; - test 75, eval { `$echo 1$foo` } eq '', 'backticks'; - test 76, $@ =~ /^Insecure dependency/, $@; + test 78, eval { `$echo 1$foo` } eq '', 'backticks'; + test 79, $@ =~ /^Insecure dependency/, $@; if ($Is_VMS) { # wildcard expansion doesn't invoke shell, so is safe - test 77, join('', eval { glob $foo } ) ne '', 'globbing'; - test 78, $@ eq '', $@; + test 80, join('', eval { glob $foo } ) ne '', 'globbing'; + test 81, $@ eq '', $@; } else { - test 77, join('', eval { glob $foo } ) eq '', 'globbing'; - test 78, $@ =~ /^Insecure dependency/, $@; + for (80..81) { print "ok $_\n"; } } } # Operations which affect processes can't use tainted data. { - test 79, eval { kill 0, $TAINT } eq '', 'kill'; - test 80, $@ =~ /^Insecure dependency/, $@; + test 82, eval { kill 0, $TAINT } eq '', 'kill'; + test 83, $@ =~ /^Insecure dependency/, $@; if ($Config{d_setpgrp}) { - test 81, eval { setpgrp 0, $TAINT } eq '', 'setpgrp'; - test 82, $@ =~ /^Insecure dependency/, $@; + test 84, eval { setpgrp 0, $TAINT } eq '', 'setpgrp'; + test 85, $@ =~ /^Insecure dependency/, $@; } else { print "# setpgrp() is not available\n"; - for (81..82) { print "ok $_\n" } + for (84..85) { print "ok $_\n" } } if ($Config{d_setprior}) { - test 83, eval { setpriority 0, $TAINT, $TAINT } eq '', 'setpriority'; - test 84, $@ =~ /^Insecure dependency/, $@; + test 86, eval { setpriority 0, $TAINT, $TAINT } eq '', 'setpriority'; + test 87, $@ =~ /^Insecure dependency/, $@; } else { print "# setpriority() is not available\n"; - for (83..84) { print "ok $_\n" } + for (86..87) { print "ok $_\n" } } } # Some miscellaneous operations can't use tainted data. { if ($Config{d_syscall}) { - test 85, eval { syscall $TAINT } eq '', 'syscall'; - test 86, $@ =~ /^Insecure dependency/, $@; + test 88, eval { syscall $TAINT } eq '', 'syscall'; + test 89, $@ =~ /^Insecure dependency/, $@; } else { print "# syscall() is not available\n"; - for (85..86) { print "ok $_\n" } + for (88..89) { print "ok $_\n" } } { @@ -428,18 +433,18 @@ print "1..132\n"; local *FOO; my $temp = "./taintC$$"; END { unlink $temp } - test 87, open(FOO, "> $temp"), "Couldn't open $temp for write: $!"; + test 90, open(FOO, "> $temp"), "Couldn't open $temp for write: $!"; - test 88, eval { ioctl FOO, $TAINT, $foo } eq '', 'ioctl'; - test 89, $@ =~ /^Insecure dependency/, $@; + test 91, eval { ioctl FOO, $TAINT, $foo } eq '', 'ioctl'; + test 92, $@ =~ /^Insecure dependency/, $@; if ($Config{d_fcntl}) { - test 90, eval { fcntl FOO, $TAINT, $foo } eq '', 'fcntl'; - test 91, $@ =~ /^Insecure dependency/, $@; + test 93, eval { fcntl FOO, $TAINT, $foo } eq '', 'fcntl'; + test 94, $@ =~ /^Insecure dependency/, $@; } else { print "# fcntl() is not available\n"; - for (90..91) { print "ok $_\n" } + for (93..94) { print "ok $_\n" } } close FOO; @@ -450,63 +455,63 @@ print "1..132\n"; { my $foo = 'abc' . $TAINT; my $fooref = \$foo; - test 92, not tainted $fooref; - test 93, tainted $$fooref; - test 94, tainted $foo; + test 95, not tainted $fooref; + test 96, tainted $$fooref; + test 97, tainted $foo; } # Some tests involving assignment { my $foo = $TAINT0; my $bar = $foo; - test 95, all_tainted $foo, $bar; - test 96, tainted($foo = $bar); - test 97, tainted($bar = $bar); - test 98, tainted($bar += $bar); - test 99, tainted($bar -= $bar); - test 100, tainted($bar *= $bar); - test 101, tainted($bar++); - test 102, tainted($bar /= $bar); - test 103, tainted($bar += 0); - test 104, tainted($bar -= 2); - test 105, tainted($bar *= -1); - test 106, tainted($bar /= 1); - test 107, tainted($bar--); - test 108, $bar == 0; + test 98, all_tainted $foo, $bar; + test 99, tainted($foo = $bar); + test 100, tainted($bar = $bar); + test 101, tainted($bar += $bar); + test 102, tainted($bar -= $bar); + test 103, tainted($bar *= $bar); + test 104, tainted($bar++); + test 105, tainted($bar /= $bar); + test 106, tainted($bar += 0); + test 107, tainted($bar -= 2); + test 108, tainted($bar *= -1); + test 109, tainted($bar /= 1); + test 110, tainted($bar--); + test 111, $bar == 0; } # Test assignment and return of lists { my @foo = ("A", "tainted" . $TAINT, "B"); - test 109, not tainted $foo[0]; - test 110, tainted $foo[1]; - test 111, not tainted $foo[2]; + test 112, not tainted $foo[0]; + test 113, tainted $foo[1]; + test 114, not tainted $foo[2]; my @bar = @foo; - test 112, not tainted $bar[0]; - test 113, tainted $bar[1]; - test 114, not tainted $bar[2]; + test 115, not tainted $bar[0]; + test 116, tainted $bar[1]; + test 117, not tainted $bar[2]; my @baz = eval { "A", "tainted" . $TAINT, "B" }; - test 115, not tainted $baz[0]; - test 116, tainted $baz[1]; - test 117, not tainted $baz[2]; + test 118, not tainted $baz[0]; + test 119, tainted $baz[1]; + test 120, not tainted $baz[2]; my @plugh = eval q[ "A", "tainted" . $TAINT, "B" ]; - test 118, not tainted $plugh[0]; - test 119, tainted $plugh[1]; - test 120, not tainted $plugh[2]; + test 121, not tainted $plugh[0]; + test 122, tainted $plugh[1]; + test 123, not tainted $plugh[2]; my $nautilus = sub { "A", "tainted" . $TAINT, "B" }; - test 121, not tainted ((&$nautilus)[0]); - test 122, tainted ((&$nautilus)[1]); - test 123, not tainted ((&$nautilus)[2]); + test 124, not tainted ((&$nautilus)[0]); + test 125, tainted ((&$nautilus)[1]); + test 126, not tainted ((&$nautilus)[2]); my @xyzzy = &$nautilus; - test 124, not tainted $xyzzy[0]; - test 125, tainted $xyzzy[1]; - test 126, not tainted $xyzzy[2]; + test 127, not tainted $xyzzy[0]; + test 128, tainted $xyzzy[1]; + test 129, not tainted $xyzzy[2]; my $red_october = sub { return "A", "tainted" . $TAINT, "B" }; - test 127, not tainted ((&$red_october)[0]); - test 128, tainted ((&$red_october)[1]); - test 129, not tainted ((&$red_october)[2]); + test 130, not tainted ((&$red_october)[0]); + test 131, tainted ((&$red_october)[1]); + test 132, not tainted ((&$red_october)[2]); my @corge = &$red_october; - test 130, not tainted $corge[0]; - test 131, tainted $corge[1]; - test 132, not tainted $corge[2]; + test 133, not tainted $corge[0]; + test 134, tainted $corge[1]; + test 135, not tainted $corge[2]; } diff --git a/taint.c b/taint.c index eda48d4..cd9e4ec 100644 --- a/taint.c +++ b/taint.c @@ -39,9 +39,9 @@ taint_env() char** e; static char* misc_env[] = { "IFS", /* most shells' inter-field separators */ - "ENV", /* ksh dain bramage #1 */ - "CDPATH", /* ksh dain bramage #2 */ - "TERM", /* some termcap libraries' dain bramage */ + "CDPATH", /* ksh dain bramage #1 */ + "ENV", /* ksh dain bramage #2 */ + "BASH_ENV", /* bash dain bramage -- I guess it's contagious */ NULL }; @@ -79,6 +79,25 @@ taint_env() } } +#ifndef VMS + /* tainted $TERM is okay if it contains no metachars */ + svp = hv_fetch(GvHVn(envgv),"TERM",4,FALSE); + if (svp && *svp && SvTAINTED(*svp)) { + bool was_tainted = tainted; + char *t = SvPV(*svp, na); + char *e = t + na; + tainted = was_tainted; + if (t < e && isALNUM(*t)) + t++; + while (t < e && (isALNUM(*t) || *t == '-' || *t == ':')) + t++; + if (t < e) { + TAINT; + taint_proper("Insecure $ENV{%s}%s", "TERM"); + } + } +#endif /* !VMS */ + for (e = misc_env; *e; e++) { svp = hv_fetch(GvHVn(envgv), *e, strlen(*e), FALSE); if (svp && *svp != &sv_undef && SvTAINTED(*svp)) { diff --git a/toke.c b/toke.c index 9c4f487..b443bb2 100644 --- a/toke.c +++ b/toke.c @@ -4482,6 +4482,8 @@ int ch; *pmfl |= PMf_FOLD; else if (ch == 'g') *pmfl |= PMf_GLOBAL; + else if (ch == 'c') + *pmfl |= PMf_CONTINUE; else if (ch == 'o') *pmfl |= PMf_KEEP; else if (ch == 'm') @@ -4510,7 +4512,7 @@ char *start; pm = (PMOP*)newPMOP(OP_MATCH, 0); if (multi_open == '?') pm->op_pmflags |= PMf_ONCE; - while (*s && strchr("iogmsx", *s)) + while (*s && strchr("iogcmsx", *s)) pmflag(&pm->op_pmflags,*s++); pm->op_pmpermflags = pm->op_pmflags; @@ -4556,7 +4558,7 @@ char *start; multi_start = first_start; /* so whole substitution is taken together */ pm = (PMOP*)newPMOP(OP_SUBST, 0); - while (*s && strchr("iogmsex", *s)) { + while (*s && strchr("iogcmsex", *s)) { if (*s == 'e') { s++; es++; diff --git a/win32/Makefile b/win32/Makefile index 80e37e3..8c99ef7 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -9,11 +9,20 @@ # # Set these to wherever you want "nmake install" to put your # newly built perl. -# - INST_DRV=c: INST_TOP=$(INST_DRV)\perl +# +# uncomment next line if you wish perl to run on Windows95 also +#RUNTIME=-MT + +# +# uncomment next line if you are using Visual C++ 2.x +#CCTYPE=MSVC20 + +# +# uncomment next line if you want debug version of perl (big,slow) +#CFG=Debug ##################### CHANGE THESE ONLY IF YOU MUST ##################### @@ -28,7 +37,9 @@ LIB32=$(LINK32) -lib # Options # PERLDLL = -D "PERLDLL" +!IF "$(RUNTIME)" == "" RUNTIME = -MD +!ENDIF INCLUDES = -I ".\include" -I "." -I ".." #PCHFLAGS = -Fp"$(INTDIR)/modules.pch" -YX DEFINES = -D "WIN32" -D "_CONSOLE" -D "PERLDLL" @@ -98,7 +109,8 @@ MINIMOD=..\lib\ExtUtils\Miniperl.pm PL2BAT=bin\PL2BAT.BAT MAKE=nmake -nologo -XCOPY=xcopy /i /d /f /r +XCOPY=xcopy /f /r /i /d +RCOPY=xcopy /f /r /i /e /d NULL= # @@ -256,11 +268,11 @@ perlglob.obj : perlglob.c $(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL ..\minimod.pl cd .. && miniperl configpm - if exist lib\* $(XCOPY) /e lib\*.* ..\lib\$(NULL) + if exist lib\* $(RCOPY) lib\*.* ..\lib\$(NULL) $(XCOPY) ..\*.h ..\lib\CORE\*.* $(XCOPY) *.h ..\lib\CORE\*.* - $(XCOPY) /S include ..\lib\CORE\*.* - $(MINIPERL) -I..\lib config_h.PL || $(MAKE) RUNTIME=$(RUNTIME) CFG=$(CFG) $(CONFIGPM) + $(RCOPY) include ..\lib\CORE\*.* + $(MINIPERL) -I..\lib config_h.PL || $(MAKE) CCTYPE=$(CCTYPE) RUNTIME=$(RUNTIME) CFG=$(CFG) $(CONFIGPM) $(MINIPERL) : ..\miniperlmain.obj $(CORE_OBJ) $(WIN32_OBJ) $(LINK32) -subsystem:console -out:$@ @<< @@ -374,7 +386,7 @@ install : ALL doc utils $(XCOPY) $(GLOBEXE) $(INST_BIN)\*.* $(XCOPY) $(PERLDLL) $(INST_BIN)\*.* $(XCOPY) bin\*.* $(INST_BIN)\*.* - $(XCOPY) /e ..\lib $(INST_LIB)\*.* + $(RCOPY) ..\lib $(INST_LIB)\*.* $(XCOPY) ..\pod\*.bat $(INST_BIN)\*.* $(XCOPY) ..\pod\*.pod $(INST_POD)\*.* $(XCOPY) ..\pod\*.html $(INST_HTML)\*.* @@ -382,7 +394,7 @@ install : ALL doc utils inst_lib : $(CONFIGPM) copy splittree.pl .. $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto" - $(XCOPY) /e ..\lib $(INST_LIB)\*.* + $(RCOPY) ..\lib $(INST_LIB)\*.* minitest : $(MINIPERL) $(GLOBEXE) $(CONFIGPM) $(XCOPY) $(MINIPERL) ..\t\perl.exe diff --git a/win32/config.H b/win32/config.H index e375c56..2018198 100644 --- a/win32/config.H +++ b/win32/config.H @@ -1414,7 +1414,7 @@ * in programs that are not prepared to deal with ~ expansion at run-time. */ #define ARCHLIB "c:\\perl\\lib" /**/ -#define ARCHLIB_EXP "c:\\perl\\lib" /**/ +#define ARCHLIB_EXP (win32PerlLibPath()) /**/ /* BINCOMPAT3: * This symbol, if defined, indicates that Perl 5.004 should be @@ -1776,5 +1776,6 @@ #endif #include -#define ARCHLIBEXP (win32PerlLibPath()) +#ifndef DEBUGGING #define DEBUGGING +#endif diff --git a/win32/config_h.PL b/win32/config_h.PL index d266f65..98b474a 100644 --- a/win32/config_h.PL +++ b/win32/config_h.PL @@ -35,14 +35,16 @@ while () munge(); s/\\\$/\$/g; s#/[ *\*]*\*/#/**/#; - if (/#define\s+ARCHLIBEXP/) + if (/^\s*#define\s+ARCHLIB_EXP/) { + $_ = "#define ARCHLIB_EXP (win32PerlLibPath())\t/**/\n"; } print H; } print H "#include -#define ARCHLIBEXP (win32PerlLibPath()) +#ifndef DEBUGGING #define DEBUGGING +#endif "; close(H); close(SH); diff --git a/win32/config_sh.PL b/win32/config_sh.PL index e62e47f..020485d 100644 --- a/win32/config_sh.PL +++ b/win32/config_sh.PL @@ -5,7 +5,11 @@ while (@ARGV && $ARGV[0] =~ /^([\w_]+)=(.*)$/) shift(@ARGV); } -@opt{'PATCHLEVEL','SUBVERSION'} = ($] =~ /\.0*([1-9]+)(\d\d)$/); +if ($] =~ /\.(\d\d\d)?(\d\d)?$/) { # should always be true + $opt{PATCHLEVEL} = int($1 || 0); + $opt{SUBVERSION} = $2 || '00'; +} + while (<>) { s/~([\w_]+)~/$opt{$1}/g; diff --git a/win32/makedef.pl b/win32/makedef.pl index a0a0536..f868203 100644 --- a/win32/makedef.pl +++ b/win32/makedef.pl @@ -264,6 +264,7 @@ win32_spawnle win32_mkdir win32_rmdir win32_chdir +win32_flock win32_htons win32_ntohs win32_htonl diff --git a/win32/win32.c b/win32/win32.c index 9a0f910..7fb0416 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1121,56 +1121,17 @@ stolen_get_osfhandle(int fd) return pIOSubSystem->pfn_get_osfhandle(fd); } - /* * Extras. */ -/* simulate flock by locking a range on the file */ - -#define LK_ERR(f,i) ((f) ? (i = 0) : (errno = GetLastError())) -#define LK_LEN 0xffff0000 - DllExport int win32_flock(int fd, int oper) { - OVERLAPPED o; - int i = -1; - HANDLE fh; - if (!IsWinNT()) { croak("flock() unimplemented on this platform"); return -1; } - - fh = (HANDLE)stolen_get_osfhandle(fd); - memset(&o, 0, sizeof(o)); - - switch(oper) { - case LOCK_SH: /* shared lock */ - LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i); - break; - case LOCK_EX: /* exclusive lock */ - LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i); - break; - case LOCK_SH|LOCK_NB: /* non-blocking shared lock */ - LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i); - break; - case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */ - LK_ERR(LockFileEx(fh, - LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, - 0, LK_LEN, 0, &o),i); - break; - case LOCK_UN: /* unlock lock */ - LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); - break; - default: /* unknown */ - errno = EINVAL; - break; - } - return i; + return pIOSubSystem->pfnflock(fd, oper); } -#undef LK_ERR -#undef LK_LEN - diff --git a/win32/win32.h b/win32/win32.h index 7114033..ec9eb7c 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -65,20 +65,13 @@ extern FILE *myfdopen(int, char *); #undef alarm #define alarm myalarm -#undef flock -#define flock(fd,o) win32_flock(fd,o) -#define LOCK_SH 1 -#define LOCK_EX 2 -#define LOCK_NB 4 -#define LOCK_UN 8 - struct tms { long tms_utime; long tms_stime; long tms_cutime; long tms_cstime; }; - + unsigned int sleep(unsigned int); char *win32PerlLibPath(); int mytimes(struct tms *timebuf); diff --git a/win32/win32io.c b/win32/win32io.c index e75754a..db156cf 100644 --- a/win32/win32io.c +++ b/win32/win32io.c @@ -190,6 +190,52 @@ my_get_osfhandle( int filehandle ) return _get_osfhandle(filehandle); } + +/* simulate flock by locking a range on the file */ + + +#define LK_ERR(f,i) ((f) ? (i = 0) : (errno = GetLastError())) +#define LK_LEN 0xffff0000 + +int +my_flock(int fd, int oper) +{ + OVERLAPPED o; + int i = -1; + HANDLE fh; + + fh = (HANDLE)my_get_osfhandle(fd); + memset(&o, 0, sizeof(o)); + + switch(oper) { + case LOCK_SH: /* shared lock */ + LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i); + break; + case LOCK_EX: /* exclusive lock */ + LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i); + break; + case LOCK_SH|LOCK_NB: /* non-blocking shared lock */ + LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i); + break; + case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */ + LK_ERR(LockFileEx(fh, + LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, + 0, LK_LEN, 0, &o),i); + break; + case LOCK_UN: /* unlock lock */ + LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); + break; + default: /* unknown */ + errno = EINVAL; + break; + } + return i; +} + +#undef LK_ERR +#undef LK_LEN + + #ifdef PERLDLL __declspec(dllexport) #endif @@ -247,6 +293,7 @@ WIN32_IOSUBSYSTEM win32stdio = { _mkdir, _rmdir, _chdir, + my_flock, /* (*pfunc_flock)(int fd, int oper) */ 87654321L, /* end of structure */ }; diff --git a/win32/win32io.h b/win32/win32io.h index 4955973..45a31f7 100644 --- a/win32/win32io.h +++ b/win32/win32io.h @@ -55,6 +55,7 @@ int (*pfnspawnvpe)(int mode, const char *cmdname, const char *const *argv, const int (*pfnmkdir)(const char *path); int (*pfnrmdir)(const char *path); int (*pfnchdir)(const char *path); +int (*pfnflock)(int fd, int oper); int signature_end; } WIN32_IOSUBSYSTEM; diff --git a/win32/win32iop.h b/win32/win32iop.h index f630000..c33d944 100644 --- a/win32/win32iop.h +++ b/win32/win32iop.h @@ -63,6 +63,7 @@ EXT int win32_spawnle(int mode, const char *cmdname, const char *,...); EXT int win32_mkdir(const char *dir, int mode); EXT int win32_rmdir(const char *dir); EXT int win32_chdir(const char *dir); +EXT int win32_flock(int fd, int oper); /* * these two are win32 specific but still io related @@ -70,6 +71,14 @@ EXT int win32_chdir(const char *dir); int stolen_open_osfhandle(long handle, int flags); long stolen_get_osfhandle(int fd); +/* + * defines for flock emulation + */ +#define LOCK_SH 1 +#define LOCK_EX 2 +#define LOCK_NB 4 +#define LOCK_UN 8 + #include /* pull in the io sub system structure */ void * SetIOSubSystem(void *piosubsystem); @@ -140,6 +149,7 @@ void * SetIOSubSystem(void *piosubsystem); #define mkdir win32_mkdir #define rmdir win32_rmdir #define chdir win32_chdir +#define flock(fd,o) win32_flock(fd,o) #endif /* WIN32IO_IS_STDIO */ #endif /* WIN32IOP_H */