home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / screen35 / part07 < prev    next >
Encoding:
Text File  |  1993-07-25  |  109.1 KB  |  4,635 lines

  1. Newsgroups: comp.sources.unix
  2. From: mlschroe@immd4.informatik.uni-erlangen.de (Michael Schroeder)
  3. Subject: v26i306: screen-3.5 - screen manager with VT100/ANSI terminal emulation, V3.5, Part07/10
  4. Sender: unix-sources-moderator@gw.home.vix.com
  5. Approved: vixie@gw.home.vix.com
  6.  
  7. Submitted-By: mlschroe@immd4.informatik.uni-erlangen.de (Michael Schroeder)
  8. Posting-Number: Volume 26, Issue 306
  9. Archive-Name: screen-3.5/part07
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 7 (of 10)."
  18. # Contents:  configure process.c
  19. # Wrapped by vixie@gw.home.vix.com on Sun Jul 25 12:57:23 1993
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'configure' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'configure'\"
  23. else
  24. echo shar: Extracting \"'configure'\" \(52835 characters\)
  25. sed "s/^X//" >'configure' <<'END_OF_FILE'
  26. X#!/bin/sh
  27. X# Guess values for system-dependent variables and create Makefiles.
  28. X# Generated automatically using autoconf.
  29. X# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
  30. X
  31. X# This program is free software; you can redistribute it and/or modify
  32. X# it under the terms of the GNU General Public License as published by
  33. X# the Free Software Foundation; either version 2, or (at your option)
  34. X# any later version.
  35. X
  36. X# This program is distributed in the hope that it will be useful,
  37. X# but WITHOUT ANY WARRANTY; without even the implied warranty of
  38. X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  39. X# GNU General Public License for more details.
  40. X
  41. X# You should have received a copy of the GNU General Public License
  42. X# along with this program; if not, write to the Free Software
  43. X# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  44. X
  45. X# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create]
  46. X#        [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET]
  47. X# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and
  48. X# --with-PACKAGE unless this script has special code to handle it.
  49. X
  50. X
  51. Xfor arg
  52. Xdo
  53. X  # Handle --exec-prefix with a space before the argument.
  54. X  if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix=
  55. X  # Handle --host with a space before the argument.
  56. X  elif test x$next_host = xyes; then next_host=
  57. X  # Handle --prefix with a space before the argument.
  58. X  elif test x$next_prefix = xyes; then prefix=$arg; next_prefix=
  59. X  # Handle --srcdir with a space before the argument.
  60. X  elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir=
  61. X  else
  62. X    case $arg in
  63. X     # For backward compatibility, also recognize exact --exec_prefix.
  64. X     -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*)
  65. X    exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
  66. X     -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e)
  67. X    next_exec_prefix=yes ;;
  68. X
  69. X     -gas | --gas | --ga | --g) ;;
  70. X
  71. X     -host=* | --host=* | --hos=* | --ho=* | --h=*) ;;
  72. X     -host | --host | --hos | --ho | --h)
  73. X    next_host=yes ;;
  74. X
  75. X     -nfp | --nfp | --nf) ;;
  76. X
  77. X     -no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no)
  78. X        no_create=1 ;;
  79. X
  80. X     -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
  81. X    prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
  82. X     -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
  83. X    next_prefix=yes ;;
  84. X
  85. X     -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*)
  86. X    srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;;
  87. X     -srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s)
  88. X    next_srcdir=yes ;;
  89. X
  90. X     -with-* | --with-*)
  91. X       package=`echo $arg|sed 's/-*with-//'`
  92. X       # Delete all the valid chars; see if any are left.
  93. X       if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then
  94. X         echo "configure: $package: invalid package name" >&2; exit 1
  95. X       fi
  96. X       eval "with_`echo $package|sed s/-/_/g`=1" ;;
  97. X
  98. X     *) ;;
  99. X    esac
  100. X  fi
  101. Xdone
  102. X
  103. Xtrap 'rm -f conftest* core; exit 1' 1 3 15
  104. X
  105. Xrm -f conftest*
  106. Xcompile='${CC-cc} $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1'
  107. X
  108. X# A filename unique to this package, relative to the directory that
  109. X# configure is in, which we can look for to find out if srcdir is correct.
  110. Xunique_file=screen.c
  111. X
  112. X# Find the source files, if location was not specified.
  113. Xif test -z "$srcdir"; then
  114. X  srcdirdefaulted=yes
  115. X  # Try the directory containing this script, then `..'.
  116. X  prog=$0
  117. X  confdir=`echo $prog|sed 's%/[^/][^/]*$%%'`
  118. X  test "X$confdir" = "X$prog" && confdir=.
  119. X  srcdir=$confdir
  120. X  if test ! -r $srcdir/$unique_file; then
  121. X    srcdir=..
  122. X  fi
  123. Xfi
  124. Xif test ! -r $srcdir/$unique_file; then
  125. X  if test x$srcdirdefaulted = xyes; then
  126. X    echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2
  127. X  else
  128. X    echo "configure: Can not find sources in \`${srcdir}'." 1>&2
  129. X  fi
  130. X  exit 1
  131. Xfi
  132. X# Preserve a srcdir of `.' to avoid automounter screwups with pwd.
  133. X# But we can't avoid them for `..', to make subdirectories work.
  134. Xcase $srcdir in
  135. X  .|/*|~*) ;;
  136. X  *) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute.
  137. Xesac
  138. X
  139. X
  140. X
  141. X
  142. Xrev=`sed < patchlevel.h -n -e '/#define REV/s/#define REV  *//p'`
  143. Xvers=`sed < patchlevel.h -n -e '/#define VERS/s/#define VERS  *//p'`
  144. Xpat=`sed < patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL  *//p'`
  145. XVERSION="$rev.$vers.$pat"
  146. Xecho "this is screen version $VERSION"
  147. X
  148. X
  149. Xif test -z "$CC"; then
  150. X  echo checking for gcc
  151. X  saveifs="$IFS"; IFS="${IFS}:"
  152. X  for dir in $PATH; do
  153. X    test -z "$dir" && dir=.
  154. X    if test -f $dir/gcc; then
  155. X      CC="gcc"
  156. X      break
  157. X    fi
  158. X  done
  159. X  IFS="$saveifs"
  160. Xfi
  161. Xtest -z "$CC" && CC="cc"
  162. X
  163. X# Find out if we are using GNU C, under whatever name.
  164. Xcat > conftest.c <<EOF
  165. X#ifdef __GNUC__
  166. X  yes
  167. X#endif
  168. XEOF
  169. X${CC-cc} -E conftest.c > conftest.out 2>&1
  170. Xif egrep yes conftest.out >/dev/null 2>&1; then
  171. X  GCC=1 # For later tests.
  172. Xfi
  173. Xrm -f conftest*
  174. X
  175. Xecho checking how to run the C preprocessor
  176. Xif test -z "$CPP"; then
  177. X  CPP='${CC-cc} -E'
  178. X  cat > conftest.c <<EOF
  179. X#include <stdio.h>
  180. XEOF
  181. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  182. Xif test -z "$err"; then
  183. X  :
  184. Xelse
  185. X  CPP=/lib/cpp
  186. Xfi
  187. Xrm -f conftest*
  188. Xfi
  189. X
  190. Xif test -n "$GCC"; then
  191. X  echo checking whether -traditional is needed
  192. X  pattern="Autoconf.*'x'"
  193. X  prog='#include <sgtty.h>
  194. XAutoconf TIOCGETP'
  195. X  cat > conftest.c <<EOF
  196. X$prog
  197. XEOF
  198. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  199. Xif egrep "$pattern" conftest.out >/dev/null 2>&1; then
  200. X  need_trad=1
  201. Xfi
  202. Xrm -f conftest*
  203. X
  204. X
  205. X  if test -z "$need_trad"; then
  206. X    prog='#include <termio.h>
  207. XAutoconf TCGETA'
  208. X    cat > conftest.c <<EOF
  209. X$prog
  210. XEOF
  211. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  212. Xif egrep "$pattern" conftest.out >/dev/null 2>&1; then
  213. X  need_trad=1
  214. Xfi
  215. Xrm -f conftest*
  216. X
  217. X  fi
  218. X  test -n "$need_trad" && CC="$CC -traditional"
  219. Xfi
  220. X
  221. Xecho checking for POSIXized ISC
  222. Xif test -d /etc/conf/kconfig.d &&
  223. X  grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
  224. Xthen
  225. X  ISC=1 # If later tests want to check for ISC.
  226. X  DEFS="$DEFS -D_POSIX_SOURCE=1"
  227. XSEDDEFS="${SEDDEFS}\${SEDdA}_POSIX_SOURCE\${SEDdB}_POSIX_SOURCE\${SEDdC}1\${SEDdD}
  228. X\${SEDuA}_POSIX_SOURCE\${SEDuB}_POSIX_SOURCE\${SEDuC}1\${SEDuD}
  229. X\${SEDeA}_POSIX_SOURCE\${SEDeB}_POSIX_SOURCE\${SEDeC}1\${SEDeD}
  230. X"
  231. X  if test -n "$GCC"; then
  232. X    CC="$CC -posix"
  233. X  else
  234. X    CC="$CC -Xp"
  235. X  fi
  236. Xfi
  237. X
  238. X
  239. X
  240. Xcat > conftest.c <<EOF
  241. Xmain(){exit(0);}
  242. XEOF
  243. Xeval $compile
  244. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  245. X  :
  246. Xelse
  247. X  echo "Can't run the compiler - sorry";exit
  248. Xfi
  249. Xrm -f conftest*
  250. Xfor p in mawk gawk nawk awk
  251. Xdo
  252. Xif test -z "$AWK"; then
  253. X  echo checking for $p
  254. X  saveifs="$IFS"; IFS="${IFS}:"
  255. X  for dir in $PATH; do
  256. X    test -z "$dir" && dir=.
  257. X    if test -f $dir/$p; then
  258. X      AWK="$p"
  259. X      break
  260. X    fi
  261. X  done
  262. X  IFS="$saveifs"
  263. Xfi
  264. Xtest -z "$AWK" && AWK=""
  265. X
  266. Xtest -n "$AWK" && break
  267. Xdone
  268. X
  269. X
  270. X# Make sure to not get the incompatible SysV /etc/install and
  271. X# /usr/sbin/install, which might be in PATH before a BSD-like install,
  272. X# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
  273. X# or the AFS install, which mishandles nonexistent args.  (Sigh.)
  274. Xif test -z "$INSTALL"; then
  275. X  echo checking for install
  276. X  saveifs="$IFS"; IFS="${IFS}:"
  277. X  for dir in $PATH; do
  278. X    test -z "$dir" && dir=.
  279. X    case $dir in
  280. X    /etc|/usr/sbin|/usr/etc|/usr/afsws/bin) ;;
  281. X    *)
  282. X      if test -f $dir/install; then
  283. X    if grep dspmsg $dir/install >/dev/null 2>&1; then
  284. X      : # AIX
  285. X    else
  286. X      INSTALL="$dir/install -c"
  287. X      INSTALL_PROGRAM='$(INSTALL)'
  288. X      INSTALL_DATA='$(INSTALL) -m 644'
  289. X      break
  290. X    fi
  291. X      fi
  292. X      ;;
  293. X    esac
  294. X  done
  295. X  IFS="$saveifs"
  296. Xfi
  297. XINSTALL=${INSTALL-cp}
  298. XINSTALL_PROGRAM=${INSTALL_PROGRAM-'$(INSTALL)'}
  299. XINSTALL_DATA=${INSTALL_DATA-'$(INSTALL)'}
  300. X
  301. X
  302. Xif test -n "$ISC"; then
  303. X  DEFS="$DEFS -DISC=1"
  304. XSEDDEFS="${SEDDEFS}\${SEDdA}ISC\${SEDdB}ISC\${SEDdC}1\${SEDdD}
  305. X\${SEDuA}ISC\${SEDuB}ISC\${SEDuC}1\${SEDuD}
  306. X\${SEDeA}ISC\${SEDeB}ISC\${SEDeC}1\${SEDeD}
  307. X" LIBS="$LIBS -linet"
  308. Xfi
  309. X
  310. Xecho checking for MIPS
  311. Xif test -f /lib/libmld.a || test -f /usr/lib/libmld.a || test -f /usr/lib/cmplrs/cc/libmld.a; then
  312. XDEFS="$DEFS -DMIPS=1"
  313. XSEDDEFS="${SEDDEFS}\${SEDdA}MIPS\${SEDdB}MIPS\${SEDdC}1\${SEDdD}
  314. X\${SEDuA}MIPS\${SEDuB}MIPS\${SEDuC}1\${SEDuD}
  315. X\${SEDeA}MIPS\${SEDeB}MIPS\${SEDeC}1\${SEDeD}
  316. X" LIBS="$LIBS -lmld" # for nlist.
  317. Xecho checking for wait3
  318. Xcat > conftest.c <<EOF
  319. X
  320. Xmain() { exit(0); } 
  321. Xt() { wait3(); }
  322. XEOF
  323. Xif eval $compile; then
  324. X  :
  325. Xelse
  326. X  echo checking for wait2
  327. Xcat > conftest.c <<EOF
  328. X
  329. Xmain() { exit(0); } 
  330. Xt() { wait2(); }
  331. XEOF
  332. Xif eval $compile; then
  333. X  DEFS="$DEFS -DUSE_WAIT2=1"
  334. XSEDDEFS="${SEDDEFS}\${SEDdA}USE_WAIT2\${SEDdB}USE_WAIT2\${SEDdC}1\${SEDdD}
  335. X\${SEDuA}USE_WAIT2\${SEDuB}USE_WAIT2\${SEDuC}1\${SEDuD}
  336. X\${SEDeA}USE_WAIT2\${SEDeB}USE_WAIT2\${SEDeC}1\${SEDeD}
  337. X" LIBS="$LIBS -lbsd" ; CC="$CC -I/usr/include/bsd"
  338. X
  339. Xfi
  340. Xrm -f conftest*
  341. X
  342. Xfi
  343. Xrm -f conftest*
  344. X
  345. Xfi
  346. X
  347. Xecho checking for Ultrix
  348. Xcat > conftest.c <<EOF
  349. X#if defined(ultrix) || defined(__ultrix)
  350. X  yes
  351. X#endif
  352. X
  353. XEOF
  354. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  355. Xif egrep "yes" conftest.out >/dev/null 2>&1; then
  356. X  ULTRIX=1
  357. Xfi
  358. Xrm -f conftest*
  359. X
  360. X
  361. Xif test -n "$ULTRIX"; then
  362. X  test -z "$GCC" && CC="$CC -YBSD"
  363. Xelse
  364. X  # POSIX termios is broken on Ultrix so don't look for it.
  365. Xecho checking for POSIX.1
  366. Xcat > conftest.c <<EOF
  367. X#include <sys/types.h>
  368. X#include <unistd.h>
  369. Xmain () {
  370. X#ifdef _POSIX_VERSION
  371. X  yes
  372. X#endif
  373. X
  374. XEOF
  375. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  376. Xif egrep "yes" conftest.out >/dev/null 2>&1; then
  377. X  echo "- you have a POSIX system";DEFS="$DEFS -DPOSIX=1"
  378. XSEDDEFS="${SEDDEFS}\${SEDdA}POSIX\${SEDdB}POSIX\${SEDdC}1\${SEDdD}
  379. X\${SEDuA}POSIX\${SEDuB}POSIX\${SEDuC}1\${SEDuD}
  380. X\${SEDeA}POSIX\${SEDeB}POSIX\${SEDeC}1\${SEDeD}
  381. X"
  382. Xfi
  383. Xrm -f conftest*
  384. X
  385. Xfi
  386. X
  387. Xecho checking for System V
  388. Xcat > conftest.c <<EOF
  389. X#include <sys/types.h>
  390. X#include <signal.h>
  391. X#include <fcntl.h>
  392. Xmain() { exit(0); } 
  393. Xt() { int x = SIGCHLD | FNDELAY; }
  394. XEOF
  395. Xif eval $compile; then
  396. X  :
  397. Xelse
  398. X  DEFS="$DEFS -DSYSV=1"
  399. XSEDDEFS="${SEDDEFS}\${SEDdA}SYSV\${SEDdB}SYSV\${SEDdC}1\${SEDdD}
  400. X\${SEDuA}SYSV\${SEDuB}SYSV\${SEDuC}1\${SEDuD}
  401. X\${SEDeA}SYSV\${SEDeB}SYSV\${SEDeC}1\${SEDeD}
  402. X"
  403. Xfi
  404. Xrm -f conftest*
  405. X
  406. X
  407. Xecho checking for sequent/ptx
  408. Xcat > conftest.c <<EOF
  409. X#ifdef _SEQUENT_
  410. X  yes
  411. X#endif
  412. X
  413. XEOF
  414. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  415. Xif egrep "yes" conftest.out >/dev/null 2>&1; then
  416. X  LIBS="$LIBS -lsocket -linet";seqptx=1
  417. Xfi
  418. Xrm -f conftest*
  419. X
  420. X
  421. Xoldlibs="$LIBS"
  422. XLIBS="$LIBS -lelf"
  423. Xecho checking for SVR4
  424. Xcat > conftest.c <<EOF
  425. X
  426. Xmain() { exit(0); } 
  427. Xt() {  }
  428. XEOF
  429. Xif eval $compile; then
  430. X  echo checking for dwarf.h
  431. Xcat > conftest.c <<EOF
  432. X#include <dwarf.h>
  433. XEOF
  434. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  435. Xif test -z "$err"; then
  436. X  DEFS="$DEFS -DSVR4=1"
  437. XSEDDEFS="${SEDDEFS}\${SEDdA}SVR4\${SEDdB}SVR4\${SEDdC}1\${SEDdD}
  438. X\${SEDuA}SVR4\${SEDuB}SVR4\${SEDuC}1\${SEDuD}
  439. X\${SEDeA}SVR4\${SEDeB}SVR4\${SEDeC}1\${SEDeD}
  440. X" ; DEFS="$DEFS -DBUGGYGETLOGIN=1"
  441. XSEDDEFS="${SEDDEFS}\${SEDdA}BUGGYGETLOGIN\${SEDdB}BUGGYGETLOGIN\${SEDdC}1\${SEDdD}
  442. X\${SEDuA}BUGGYGETLOGIN\${SEDuB}BUGGYGETLOGIN\${SEDuC}1\${SEDuD}
  443. X\${SEDeA}BUGGYGETLOGIN\${SEDeB}BUGGYGETLOGIN\${SEDeC}1\${SEDeD}
  444. X" ; LIBS="$LIBS -lelf"
  445. Xelse
  446. X  echo checking for elf.h
  447. Xcat > conftest.c <<EOF
  448. X#include <elf.h>
  449. XEOF
  450. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  451. Xif test -z "$err"; then
  452. X  DEFS="$DEFS -DSVR4=1"
  453. XSEDDEFS="${SEDDEFS}\${SEDdA}SVR4\${SEDdB}SVR4\${SEDdC}1\${SEDdD}
  454. X\${SEDuA}SVR4\${SEDuB}SVR4\${SEDuC}1\${SEDuD}
  455. X\${SEDeA}SVR4\${SEDeB}SVR4\${SEDeC}1\${SEDeD}
  456. X" ; DEFS="$DEFS -DBUGGYGETLOGIN=1"
  457. XSEDDEFS="${SEDDEFS}\${SEDdA}BUGGYGETLOGIN\${SEDdB}BUGGYGETLOGIN\${SEDdC}1\${SEDdD}
  458. X\${SEDuA}BUGGYGETLOGIN\${SEDuB}BUGGYGETLOGIN\${SEDuC}1\${SEDuD}
  459. X\${SEDeA}BUGGYGETLOGIN\${SEDeB}BUGGYGETLOGIN\${SEDeC}1\${SEDeD}
  460. X" ; LIBS="$LIBS -lelf"
  461. Xfi
  462. Xrm -f conftest*
  463. X
  464. Xfi
  465. Xrm -f conftest*
  466. X
  467. X
  468. Xelse
  469. X  LIBS="$oldlibs"
  470. Xfi
  471. Xrm -f conftest*
  472. X
  473. X
  474. X
  475. X
  476. Xecho checking for putenv declaration
  477. Xcat > conftest.c <<EOF
  478. X#include <sys/types.h>
  479. X#include <unistd.h>
  480. X#include <stdlib.h>
  481. X
  482. XEOF
  483. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  484. Xif egrep "putenv( |    |\()" conftest.out >/dev/null 2>&1; then
  485. X  DEFS="$DEFS -DPUTENV_DECLARED=1"
  486. XSEDDEFS="${SEDDEFS}\${SEDdA}PUTENV_DECLARED\${SEDdB}PUTENV_DECLARED\${SEDdC}1\${SEDdD}
  487. X\${SEDuA}PUTENV_DECLARED\${SEDuB}PUTENV_DECLARED\${SEDuC}1\${SEDuD}
  488. X\${SEDeA}PUTENV_DECLARED\${SEDeB}PUTENV_DECLARED\${SEDeC}1\${SEDeD}
  489. X"
  490. Xfi
  491. Xrm -f conftest*
  492. X
  493. X
  494. Xecho checking for getdtablesize declaration
  495. Xcat > conftest.c <<EOF
  496. X#include <sys/types.h>
  497. X#include <unistd.h>
  498. X
  499. XEOF
  500. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  501. Xif egrep "getdtablesize( |    |\()" conftest.out >/dev/null 2>&1; then
  502. X  DEFS="$DEFS -DGETDTABLESIZE_DECLARED=1"
  503. XSEDDEFS="${SEDDEFS}\${SEDdA}GETDTABLESIZE_DECLARED\${SEDdB}GETDTABLESIZE_DECLARED\${SEDdC}1\${SEDdD}
  504. X\${SEDuA}GETDTABLESIZE_DECLARED\${SEDuB}GETDTABLESIZE_DECLARED\${SEDuC}1\${SEDuD}
  505. X\${SEDeA}GETDTABLESIZE_DECLARED\${SEDeB}GETDTABLESIZE_DECLARED\${SEDeC}1\${SEDeD}
  506. X"
  507. Xfi
  508. Xrm -f conftest*
  509. X
  510. X
  511. Xecho checking for select declaration
  512. Xcat > conftest.c <<EOF
  513. X#include <sys/types.h>
  514. X#include <sys/time.h>
  515. X#include <unistd.h>
  516. X
  517. XEOF
  518. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  519. Xif egrep "select( |    |\()" conftest.out >/dev/null 2>&1; then
  520. X  DEFS="$DEFS -DSELECT_DECLARED=1"
  521. XSEDDEFS="${SEDDEFS}\${SEDdA}SELECT_DECLARED\${SEDdB}SELECT_DECLARED\${SEDdC}1\${SEDdD}
  522. X\${SEDuA}SELECT_DECLARED\${SEDuB}SELECT_DECLARED\${SEDuC}1\${SEDuD}
  523. X\${SEDeA}SELECT_DECLARED\${SEDeB}SELECT_DECLARED\${SEDeC}1\${SEDeD}
  524. X"
  525. Xfi
  526. Xrm -f conftest*
  527. X
  528. X
  529. Xecho checking for vsprintf declaration
  530. Xcat > conftest.c <<EOF
  531. X#include <sys/types.h>
  532. X#include <stdio.h>
  533. X#ifdef __STDC__
  534. X#include <stdarg.h>
  535. X#else
  536. X#include <varargs.h>
  537. X#endif
  538. X
  539. XEOF
  540. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  541. Xif egrep "vsprintf( |    |\()" conftest.out >/dev/null 2>&1; then
  542. X  DEFS="$DEFS -DVPRNT_DECLARED=1"
  543. XSEDDEFS="${SEDDEFS}\${SEDdA}VPRNT_DECLARED\${SEDdB}VPRNT_DECLARED\${SEDdC}1\${SEDdD}
  544. X\${SEDuA}VPRNT_DECLARED\${SEDuB}VPRNT_DECLARED\${SEDuC}1\${SEDuD}
  545. X\${SEDeA}VPRNT_DECLARED\${SEDeB}VPRNT_DECLARED\${SEDeC}1\${SEDeD}
  546. X"
  547. Xfi
  548. Xrm -f conftest*
  549. X
  550. X
  551. Xecho checking for setreuid declaration
  552. Xcat > conftest.c <<EOF
  553. X#include <sys/types.h>
  554. X#include <unistd.h>
  555. X
  556. XEOF
  557. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  558. Xif egrep "setres?uid( |    |\()" conftest.out >/dev/null 2>&1; then
  559. X  DEFS="$DEFS -DREUID_DECLARED=1"
  560. XSEDDEFS="${SEDDEFS}\${SEDdA}REUID_DECLARED\${SEDdB}REUID_DECLARED\${SEDdC}1\${SEDdD}
  561. X\${SEDuA}REUID_DECLARED\${SEDuB}REUID_DECLARED\${SEDuC}1\${SEDuD}
  562. X\${SEDeA}REUID_DECLARED\${SEDeB}REUID_DECLARED\${SEDeC}1\${SEDeD}
  563. X"
  564. Xfi
  565. Xrm -f conftest*
  566. X
  567. X
  568. Xecho checking for wait declaration
  569. Xcat > conftest.c <<EOF
  570. X#include <sys/types.h>
  571. X#include <signal.h>
  572. X#include <sys/wait.h>
  573. X
  574. XEOF
  575. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  576. Xif egrep "wait( |    |\()" conftest.out >/dev/null 2>&1; then
  577. X  DEFS="$DEFS -DWAITSTUFF_DECLARED=1"
  578. XSEDDEFS="${SEDDEFS}\${SEDdA}WAITSTUFF_DECLARED\${SEDdB}WAITSTUFF_DECLARED\${SEDdC}1\${SEDdD}
  579. X\${SEDuA}WAITSTUFF_DECLARED\${SEDuB}WAITSTUFF_DECLARED\${SEDuC}1\${SEDuD}
  580. X\${SEDeA}WAITSTUFF_DECLARED\${SEDeB}WAITSTUFF_DECLARED\${SEDeC}1\${SEDeD}
  581. X"
  582. Xfi
  583. Xrm -f conftest*
  584. X
  585. X
  586. Xecho checking for memfuncs declaration
  587. Xcat > conftest.c <<EOF
  588. X#include <sys/types.h>
  589. X#include <unistd.h>
  590. X#include <string.h>
  591. X#include <strings.h>
  592. X
  593. XEOF
  594. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  595. Xif egrep "(memcpy|memmove|bcopy)( |    |\()" conftest.out >/dev/null 2>&1; then
  596. X  DEFS="$DEFS -DMEMFUNCS_DECLARED=1"
  597. XSEDDEFS="${SEDDEFS}\${SEDdA}MEMFUNCS_DECLARED\${SEDdB}MEMFUNCS_DECLARED\${SEDdC}1\${SEDdD}
  598. X\${SEDuA}MEMFUNCS_DECLARED\${SEDuB}MEMFUNCS_DECLARED\${SEDuC}1\${SEDuD}
  599. X\${SEDeA}MEMFUNCS_DECLARED\${SEDeB}MEMFUNCS_DECLARED\${SEDeC}1\${SEDeD}
  600. X"
  601. Xfi
  602. Xrm -f conftest*
  603. X
  604. X
  605. Xecho checking for index declaration
  606. Xcat > conftest.c <<EOF
  607. X#include <sys/types.h>
  608. X#include <strings.h>
  609. X
  610. XEOF
  611. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  612. Xif egrep "index( |    |\()" conftest.out >/dev/null 2>&1; then
  613. X  DEFS="$DEFS -DINDEX_DECLARED=1"
  614. XSEDDEFS="${SEDDEFS}\${SEDdA}INDEX_DECLARED\${SEDdB}INDEX_DECLARED\${SEDdC}1\${SEDdD}
  615. X\${SEDuA}INDEX_DECLARED\${SEDuB}INDEX_DECLARED\${SEDuC}1\${SEDuD}
  616. X\${SEDeA}INDEX_DECLARED\${SEDeB}INDEX_DECLARED\${SEDeC}1\${SEDeD}
  617. X"
  618. Xfi
  619. Xrm -f conftest*
  620. X
  621. X
  622. Xecho checking for crypt declaration
  623. Xcat > conftest.c <<EOF
  624. X#include <sys/types.h>
  625. X#include <unistd.h>
  626. X
  627. XEOF
  628. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  629. Xif egrep "crypt( |    |\()" conftest.out >/dev/null 2>&1; then
  630. X  DEFS="$DEFS -DCRYPT_DECLARED=1"
  631. XSEDDEFS="${SEDDEFS}\${SEDdA}CRYPT_DECLARED\${SEDdB}CRYPT_DECLARED\${SEDdC}1\${SEDdD}
  632. X\${SEDuA}CRYPT_DECLARED\${SEDuB}CRYPT_DECLARED\${SEDuC}1\${SEDuD}
  633. X\${SEDeA}CRYPT_DECLARED\${SEDeB}CRYPT_DECLARED\${SEDeC}1\${SEDeD}
  634. X"
  635. Xfi
  636. Xrm -f conftest*
  637. X
  638. X
  639. Xecho checking for mknod declaration
  640. Xcat > conftest.c <<EOF
  641. X#include <sys/types.h>
  642. X#include <sys/stat.h>
  643. X
  644. XEOF
  645. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  646. Xif egrep "mknod( |    |\()" conftest.out >/dev/null 2>&1; then
  647. X  DEFS="$DEFS -DMKNOD_DECLARED=1"
  648. XSEDDEFS="${SEDDEFS}\${SEDdA}MKNOD_DECLARED\${SEDdB}MKNOD_DECLARED\${SEDdC}1\${SEDdD}
  649. X\${SEDuA}MKNOD_DECLARED\${SEDuB}MKNOD_DECLARED\${SEDuC}1\${SEDuD}
  650. X\${SEDeA}MKNOD_DECLARED\${SEDeB}MKNOD_DECLARED\${SEDeC}1\${SEDeD}
  651. X"
  652. Xfi
  653. Xrm -f conftest*
  654. X
  655. X
  656. Xecho checking for setpgid declaration
  657. Xcat > conftest.c <<EOF
  658. X#include <sys/types.h>
  659. X#include <unistd.h>
  660. X
  661. XEOF
  662. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  663. Xif egrep "setpgid( |    |\()" conftest.out >/dev/null 2>&1; then
  664. X  DEFS="$DEFS -DSETPGID_DECLARED=1"
  665. XSEDDEFS="${SEDDEFS}\${SEDdA}SETPGID_DECLARED\${SEDdB}SETPGID_DECLARED\${SEDdC}1\${SEDdD}
  666. X\${SEDuA}SETPGID_DECLARED\${SEDuB}SETPGID_DECLARED\${SEDuC}1\${SEDuD}
  667. X\${SEDeA}SETPGID_DECLARED\${SEDeB}SETPGID_DECLARED\${SEDeC}1\${SEDeD}
  668. X"
  669. Xfi
  670. Xrm -f conftest*
  671. X
  672. X
  673. Xecho checking for kill declaration
  674. Xcat > conftest.c <<EOF
  675. X#include <sys/types.h>
  676. X#include <unistd.h>
  677. X#include <signal.h>
  678. X
  679. XEOF
  680. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  681. Xif egrep "kill( |    |\()" conftest.out >/dev/null 2>&1; then
  682. X  DEFS="$DEFS -DKILLSTUFF_DECLARED=1"
  683. XSEDDEFS="${SEDDEFS}\${SEDdA}KILLSTUFF_DECLARED\${SEDdB}KILLSTUFF_DECLARED\${SEDdC}1\${SEDdD}
  684. X\${SEDuA}KILLSTUFF_DECLARED\${SEDuB}KILLSTUFF_DECLARED\${SEDuC}1\${SEDuD}
  685. X\${SEDeA}KILLSTUFF_DECLARED\${SEDeB}KILLSTUFF_DECLARED\${SEDeC}1\${SEDeD}
  686. X"
  687. Xfi
  688. Xrm -f conftest*
  689. X
  690. X
  691. Xecho checking for gethostname declaration
  692. Xcat > conftest.c <<EOF
  693. X#include <sys/types.h>
  694. X#include <unistd.h>
  695. X
  696. XEOF
  697. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  698. Xif egrep "gethostname( |    |\()" conftest.out >/dev/null 2>&1; then
  699. X  DEFS="$DEFS -DGETHOSTNAME_DECLARED=1"
  700. XSEDDEFS="${SEDDEFS}\${SEDdA}GETHOSTNAME_DECLARED\${SEDdB}GETHOSTNAME_DECLARED\${SEDdC}1\${SEDdD}
  701. X\${SEDuA}GETHOSTNAME_DECLARED\${SEDuB}GETHOSTNAME_DECLARED\${SEDuC}1\${SEDuD}
  702. X\${SEDeA}GETHOSTNAME_DECLARED\${SEDeB}GETHOSTNAME_DECLARED\${SEDeC}1\${SEDeD}
  703. X"
  704. Xfi
  705. Xrm -f conftest*
  706. X
  707. X
  708. Xecho checking for pid_t
  709. Xcat > conftest.c <<EOF
  710. X#include <sys/types.h>
  711. X
  712. XEOF
  713. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  714. Xif egrep "pid_t" conftest.out >/dev/null 2>&1; then
  715. X  DEFS="$DEFS -DPID_T_DEFINED=1"
  716. XSEDDEFS="${SEDDEFS}\${SEDdA}PID_T_DEFINED\${SEDdB}PID_T_DEFINED\${SEDdC}1\${SEDdD}
  717. X\${SEDuA}PID_T_DEFINED\${SEDuB}PID_T_DEFINED\${SEDuC}1\${SEDuD}
  718. X\${SEDeA}PID_T_DEFINED\${SEDeB}PID_T_DEFINED\${SEDeC}1\${SEDeD}
  719. X"
  720. Xfi
  721. Xrm -f conftest*
  722. X
  723. X
  724. Xecho checking for sig_t
  725. Xcat > conftest.c <<EOF
  726. X#include <sys/types.h>
  727. X#include <signal.h>
  728. X
  729. XEOF
  730. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  731. Xif egrep "sig_t" conftest.out >/dev/null 2>&1; then
  732. X  DEFS="$DEFS -DSIG_T_DEFINED=1"
  733. XSEDDEFS="${SEDDEFS}\${SEDdA}SIG_T_DEFINED\${SEDdB}SIG_T_DEFINED\${SEDdC}1\${SEDdD}
  734. X\${SEDuA}SIG_T_DEFINED\${SEDuB}SIG_T_DEFINED\${SEDuC}1\${SEDuD}
  735. X\${SEDeA}SIG_T_DEFINED\${SEDeB}SIG_T_DEFINED\${SEDeC}1\${SEDeD}
  736. X"
  737. Xfi
  738. Xrm -f conftest*
  739. X
  740. X
  741. Xecho checking for uid_t
  742. Xcat > conftest.c <<EOF
  743. X#include <sys/types.h>
  744. X
  745. XEOF
  746. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  747. Xif egrep "uid_t" conftest.out >/dev/null 2>&1; then
  748. X  DEFS="$DEFS -DUID_T_DEFINED=1"
  749. XSEDDEFS="${SEDDEFS}\${SEDdA}UID_T_DEFINED\${SEDdB}UID_T_DEFINED\${SEDdC}1\${SEDdD}
  750. X\${SEDuA}UID_T_DEFINED\${SEDuB}UID_T_DEFINED\${SEDuC}1\${SEDuD}
  751. X\${SEDeA}UID_T_DEFINED\${SEDeB}UID_T_DEFINED\${SEDeC}1\${SEDeD}
  752. X"
  753. Xfi
  754. Xrm -f conftest*
  755. X
  756. X
  757. X
  758. Xecho checking for BSD job control
  759. Xcat > conftest.c <<EOF
  760. X#include <sys/types.h>
  761. X#include <sys/ioctl.h>
  762. X
  763. Xmain() { exit(0); } 
  764. Xt() { 
  765. X#ifdef POSIX
  766. Xtcsetpgrp(0, 0);
  767. X#else
  768. Xint x = TIOCSPGRP;
  769. X#ifdef SYSV
  770. Xsetpgrp();
  771. X#else
  772. Xint y = TIOCNOTTY;
  773. X#endif
  774. X#endif
  775. X }
  776. XEOF
  777. Xif eval $compile; then
  778. X  echo "- you have jobcontrol";DEFS="$DEFS -DBSDJOBS=1"
  779. XSEDDEFS="${SEDDEFS}\${SEDdA}BSDJOBS\${SEDdB}BSDJOBS\${SEDdC}1\${SEDdD}
  780. X\${SEDuA}BSDJOBS\${SEDuB}BSDJOBS\${SEDuC}1\${SEDuD}
  781. X\${SEDeA}BSDJOBS\${SEDeB}BSDJOBS\${SEDeC}1\${SEDeD}
  782. X"
  783. Xelse
  784. X  echo "- you don't have jobcontrol"
  785. Xfi
  786. Xrm -f conftest*
  787. X
  788. X
  789. Xecho checking for setreuid
  790. Xcat > conftest.c <<EOF
  791. X
  792. Xmain() { exit(0); } 
  793. Xt() { 
  794. X#ifdef hpux
  795. Xsetresuid(0, 0, 0);
  796. X#else
  797. Xsetreuid(0, 0);
  798. X#endif
  799. X }
  800. XEOF
  801. Xif eval $compile; then
  802. X  :
  803. Xelse
  804. X  DEFS="$DEFS -DNOREUID=1"
  805. XSEDDEFS="${SEDDEFS}\${SEDdA}NOREUID\${SEDdB}NOREUID\${SEDdC}1\${SEDdD}
  806. X\${SEDuA}NOREUID\${SEDuB}NOREUID\${SEDuC}1\${SEDuD}
  807. X\${SEDeA}NOREUID\${SEDeB}NOREUID\${SEDeC}1\${SEDeD}
  808. X"
  809. Xfi
  810. Xrm -f conftest*
  811. X
  812. X
  813. X
  814. X
  815. Xecho checking for select
  816. Xcat > conftest.c <<EOF
  817. X
  818. Xmain() { exit(0); } 
  819. Xt() { select(0, 0, 0, 0, 0); }
  820. XEOF
  821. Xif eval $compile; then
  822. X  :
  823. Xelse
  824. X  LIBS="$LIBS -lnet -lnsl"
  825. Xecho checking for select with $LIBS
  826. Xcat > conftest.c <<EOF
  827. X
  828. Xmain() { exit(0); } 
  829. Xt() { select(0, 0, 0, 0, 0); }
  830. XEOF
  831. Xif eval $compile; then
  832. X  :
  833. Xelse
  834. X  echo '!!! no select - no screen';exit
  835. Xfi
  836. Xrm -f conftest*
  837. X
  838. X
  839. Xfi
  840. Xrm -f conftest*
  841. X
  842. X
  843. Xecho checking fifos
  844. Xcat > conftest.c <<EOF
  845. X
  846. X#include <sys/types.h>
  847. X#include <sys/stat.h>
  848. X#include <fcntl.h>
  849. X
  850. X#ifndef O_NDELAY
  851. X#define O_NDELAY O_NONBLOCK
  852. X#endif
  853. X#ifndef S_IFIFO
  854. X#define S_IFIFO 0010000
  855. X#endif
  856. X
  857. Xchar *fin = "/tmp/conftest$$";
  858. X
  859. Xmain()
  860. X{
  861. X  struct stat stb;
  862. X  int f;
  863. X
  864. X  (void)alarm(5);
  865. X  if (mknod(fin, S_IFIFO|0777, 0))
  866. X    exit(1);
  867. X  if (stat(fin, &stb) || (stb.st_mode & S_IFIFO) != S_IFIFO)
  868. X    exit(1);
  869. X  close(0);
  870. X  if (open(fin, O_RDWR | O_NDELAY))
  871. X    exit(1);
  872. X  if (write(0, "TEST", 4) == -1)
  873. X    exit(1);
  874. X  f = 1;
  875. X  if (select(1, &f, 0, 0, 0) == -1)
  876. X    exit(1);
  877. X  exit(0);
  878. X}
  879. X
  880. XEOF
  881. Xeval $compile
  882. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  883. X  echo "- your fifos are usable"; fifo=1
  884. Xelse
  885. X  echo "- your fifos are not usable"
  886. Xfi
  887. Xrm -f conftest*
  888. Xrm -f /tmp/conftest*
  889. X
  890. Xif test -n "$fifo"; then
  891. Xecho "checking for broken fifo implementation"
  892. Xcat > conftest.c <<EOF
  893. X
  894. X#include <sys/types.h>
  895. X#include <fcntl.h>
  896. X#include <sys/time.h>
  897. X#include <sys/stat.h>
  898. X
  899. X#ifndef O_NDELAY
  900. X#define O_NDELAY O_NONBLOCK
  901. X#endif
  902. X#ifndef S_IFIFO
  903. X#define S_IFIFO 0010000
  904. X#endif
  905. X
  906. Xchar *fin = "/tmp/conftest$$";
  907. X
  908. Xmain()
  909. X{
  910. X  struct timeval tv;
  911. X  int r, x;
  912. X
  913. X  if (mknod(fin, S_IFIFO|0600))
  914. X    exit(1);
  915. X  close(0);
  916. X  if (open(fin, O_RDONLY|O_NDELAY))
  917. X    exit(1);
  918. X  r = 1;
  919. X  tv.tv_sec = 1;
  920. X  tv.tv_usec = 0;
  921. X  if (select(1, &r, 0, 0, &tv))
  922. X    exit(1);
  923. X  exit(0);
  924. X}
  925. X
  926. XEOF
  927. Xeval $compile
  928. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  929. X  echo "- your implementation is ok"
  930. Xelse
  931. X  echo "- you have a broken implementation";DEFS="$DEFS -DBROKEN_PIPE=1"
  932. XSEDDEFS="${SEDDEFS}\${SEDdA}BROKEN_PIPE\${SEDdB}BROKEN_PIPE\${SEDdC}1\${SEDdD}
  933. X\${SEDuA}BROKEN_PIPE\${SEDuB}BROKEN_PIPE\${SEDuC}1\${SEDuD}
  934. X\${SEDeA}BROKEN_PIPE\${SEDeB}BROKEN_PIPE\${SEDeC}1\${SEDeD}
  935. X";fifobr=1
  936. Xfi
  937. Xrm -f conftest*
  938. Xrm -f /tmp/conftest*
  939. Xfi
  940. X
  941. X
  942. Xecho checking sockets
  943. Xcat > conftest.c <<EOF
  944. X
  945. X#include <sys/types.h>
  946. X#include <sys/socket.h>
  947. X#include <sys/un.h>
  948. X#include <fcntl.h>
  949. X
  950. X#ifndef O_NDELAY
  951. X#define O_NDELAY O_NONBLOCK
  952. X#endif
  953. X#ifndef FNDELAY
  954. X#define FNDELAY O_NDELAY
  955. X#endif
  956. X
  957. Xchar *son = "/tmp/conftest$$";
  958. X
  959. Xmain()
  960. X{
  961. X  int s1, s2, s3, l;
  962. X  struct sockaddr_un a;
  963. X
  964. X  (void)alarm(5);
  965. X  if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  966. X    exit(1);
  967. X  a.sun_family = AF_UNIX;
  968. X  strcpy(a.sun_path, son);
  969. X  (void) unlink(son);
  970. X  if (bind(s1, (struct sockaddr *) &a, strlen(son)+2) == -1)
  971. X    exit(1);
  972. X  if (listen(s1, 2))
  973. X    exit(1);
  974. X  if (fork() == 0)
  975. X    {
  976. X      if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  977. X    kill(getppid(), 3);
  978. X      (void)connect(s2, &a, strlen(son) + 2);
  979. X      if (write(s2, "HELLO", 5) == -1)
  980. X    kill(getppid(), 3);
  981. X      exit(0);
  982. X    }
  983. X  l = sizeof(a);
  984. X  close(0);
  985. X  if (accept(s1, &a, &l))
  986. X    exit(1);
  987. X  l = 1;
  988. X  if (select(1, &l, 0, 0, 0) == -1)
  989. X    exit(1);
  990. X  exit(0);
  991. X}
  992. X
  993. XEOF
  994. Xeval $compile
  995. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  996. X  echo "- your sockets are usable"; sock=1
  997. Xelse
  998. X  echo "- your sockets are not usable"
  999. Xfi
  1000. Xrm -f conftest*
  1001. Xrm -f /tmp/conftest*
  1002. X
  1003. Xif test -n "$sock"; then
  1004. Xecho "checking socket implementation"
  1005. Xcat > conftest.c <<EOF
  1006. X
  1007. X#include <sys/types.h>
  1008. X#include <sys/stat.h>
  1009. X#include <sys/socket.h>
  1010. X#include <sys/un.h>
  1011. X
  1012. Xchar *son = "/tmp/conftest$$";
  1013. X
  1014. Xmain()
  1015. X{
  1016. X  int s;
  1017. X  struct stat stb;
  1018. X  struct sockaddr_un a;
  1019. X  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  1020. X    exit(0);
  1021. X  a.sun_family = AF_UNIX;
  1022. X  strcpy(a.sun_path, son);
  1023. X  (void) unlink(son);
  1024. X  if (bind(s, (struct sockaddr *) &a, strlen(son)+2) == -1)
  1025. X    exit(0);
  1026. X  if (stat(son, &stb))
  1027. X    exit(1);
  1028. X  close(s);
  1029. X  exit(0);
  1030. X}
  1031. X
  1032. XEOF
  1033. Xeval $compile
  1034. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1035. X  echo "- you are normal"
  1036. Xelse
  1037. X  echo "- unix domain sockets are not kept in the filesystem";DEFS="$DEFS -DSOCK_NOT_IN_FS=1"
  1038. XSEDDEFS="${SEDDEFS}\${SEDdA}SOCK_NOT_IN_FS\${SEDdB}SOCK_NOT_IN_FS\${SEDdC}1\${SEDdD}
  1039. X\${SEDuA}SOCK_NOT_IN_FS\${SEDuB}SOCK_NOT_IN_FS\${SEDuC}1\${SEDuD}
  1040. X\${SEDeA}SOCK_NOT_IN_FS\${SEDeB}SOCK_NOT_IN_FS\${SEDeC}1\${SEDeD}
  1041. X";socknofs=1
  1042. Xfi
  1043. Xrm -f conftest*
  1044. Xrm -f /tmp/conftest*
  1045. Xfi
  1046. X
  1047. X
  1048. Xif test -n "$fifo"; then
  1049. X  if test -n "$sock"; then
  1050. X    if test -n "$nore"; then
  1051. X      echo "- hmmm... better take the fifos"
  1052. X      DEFS="$DEFS -DNAMEDPIPE=1"
  1053. XSEDDEFS="${SEDDEFS}\${SEDdA}NAMEDPIPE\${SEDdB}NAMEDPIPE\${SEDdC}1\${SEDdD}
  1054. X\${SEDuA}NAMEDPIPE\${SEDuB}NAMEDPIPE\${SEDuC}1\${SEDuD}
  1055. X\${SEDeA}NAMEDPIPE\${SEDeB}NAMEDPIPE\${SEDeC}1\${SEDeD}
  1056. X"
  1057. X    elif test -n "$fifobr"; then
  1058. X      echo "- as your fifos are broken lets use the sockets."
  1059. X    else
  1060. X      echo "- both sockets and fifos usable. let's take fifos."
  1061. X      DEFS="$DEFS -DNAMEDPIPE=1"
  1062. XSEDDEFS="${SEDDEFS}\${SEDdA}NAMEDPIPE\${SEDdB}NAMEDPIPE\${SEDdC}1\${SEDdD}
  1063. X\${SEDuA}NAMEDPIPE\${SEDuB}NAMEDPIPE\${SEDuC}1\${SEDuD}
  1064. X\${SEDeA}NAMEDPIPE\${SEDeB}NAMEDPIPE\${SEDeC}1\${SEDeD}
  1065. X"
  1066. X    fi
  1067. X  else
  1068. X    echo "- using named pipes, of course"
  1069. X    DEFS="$DEFS -DNAMEDPIPE=1"
  1070. XSEDDEFS="${SEDDEFS}\${SEDdA}NAMEDPIPE\${SEDdB}NAMEDPIPE\${SEDdC}1\${SEDdD}
  1071. X\${SEDuA}NAMEDPIPE\${SEDuB}NAMEDPIPE\${SEDuC}1\${SEDuD}
  1072. X\${SEDeA}NAMEDPIPE\${SEDeB}NAMEDPIPE\${SEDeC}1\${SEDeD}
  1073. X"
  1074. X  fi
  1075. Xelif test -n "$sock"; then
  1076. X  echo "- using unix-domain sockets, of course"
  1077. Xelse
  1078. X  echo "!!! you have neither usable sockets nor usable pipes -> no screen"
  1079. X  exit
  1080. Xfi
  1081. X
  1082. X
  1083. Xecho "checking select return value"
  1084. Xcat > conftest.c <<EOF
  1085. X
  1086. X#include <sys/types.h>
  1087. X#include <sys/stat.h>
  1088. X#include <fcntl.h>
  1089. X
  1090. Xchar *nam = "/tmp/conftest$$";
  1091. X
  1092. X#ifdef NAMEDPIPE
  1093. X
  1094. X#ifndef O_NDELAY
  1095. X#define O_NDELAY O_NONBLOCK
  1096. X#endif
  1097. X#ifndef S_IFIFO
  1098. X#define S_IFIFO 0010000
  1099. X#endif
  1100. X
  1101. X
  1102. Xmain()
  1103. X{
  1104. X  int l;
  1105. X
  1106. X  (void)alarm(5);
  1107. X  if (mknod(nam, S_IFIFO|0777, 0))
  1108. X    exit(1);
  1109. X  close(0);
  1110. X  if (open(nam, O_RDWR | O_NDELAY))
  1111. X    exit(1);
  1112. X  if (write(0, "TEST", 4) == -1)
  1113. X    exit(1);
  1114. X
  1115. X#else
  1116. X
  1117. X#include <sys/types.h>
  1118. X#include <sys/socket.h>
  1119. X#include <sys/un.h>
  1120. X
  1121. Xmain()
  1122. X{
  1123. X  int s1, s2, s3, l;
  1124. X  struct sockaddr_un a;
  1125. X
  1126. X  (void)alarm(5);
  1127. X  if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  1128. X    exit(1);
  1129. X  a.sun_family = AF_UNIX;
  1130. X  strcpy(a.sun_path, nam);
  1131. X  (void) unlink(nam);
  1132. X  if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
  1133. X    exit(1);
  1134. X  if (listen(s1, 2))
  1135. X    exit(1);
  1136. X  if (fork() == 0)
  1137. X    {
  1138. X      if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  1139. X    kill(getppid(), 3);
  1140. X      (void)connect(s2, &a, strlen(nam) + 2);
  1141. X      if (write(s2, "HELLO", 5) == -1)
  1142. X    kill(getppid(), 3);
  1143. X      exit(0);
  1144. X    }
  1145. X  l = sizeof(a);
  1146. X  close(0);
  1147. X  if (accept(s1, &a, &l))
  1148. X    exit(1);
  1149. X#endif
  1150. X
  1151. X
  1152. X  l = 1;
  1153. X  if (select(1, &l, 0, 0, 0) == -1)
  1154. X    exit(1);
  1155. X  if (select(1, &l, &l, 0, 0) != 2)
  1156. X    exit(1);
  1157. X  exit(0);
  1158. X}
  1159. X
  1160. XEOF
  1161. Xeval $compile
  1162. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1163. X  echo "- select is ok"
  1164. Xelse
  1165. X  echo "- it is not usable";DEFS="$DEFS -DSELECT_BROKEN=1"
  1166. XSEDDEFS="${SEDDEFS}\${SEDdA}SELECT_BROKEN\${SEDdB}SELECT_BROKEN\${SEDdC}1\${SEDdD}
  1167. X\${SEDuA}SELECT_BROKEN\${SEDuB}SELECT_BROKEN\${SEDuC}1\${SEDuD}
  1168. X\${SEDeA}SELECT_BROKEN\${SEDeB}SELECT_BROKEN\${SEDeC}1\${SEDeD}
  1169. X"
  1170. Xfi
  1171. Xrm -f conftest*
  1172. X
  1173. Xecho searching for tgetent
  1174. Xolibs="$LIBS"
  1175. XLIBS="-ltermcap $LIBS"
  1176. Xecho checking for libtermcap
  1177. Xcat > conftest.c <<EOF
  1178. X
  1179. Xmain() { exit(0); } 
  1180. Xt() { tgetent((char *)0, (char *)0); }
  1181. XEOF
  1182. Xif eval $compile; then
  1183. X  :
  1184. Xelse
  1185. X  LIBS="-lcurses $olibs"
  1186. Xecho checking for libcurses
  1187. Xcat > conftest.c <<EOF
  1188. X
  1189. Xmain() { exit(0); } 
  1190. Xt() { tgetent((char *)0, (char *)0); }
  1191. XEOF
  1192. Xif eval $compile; then
  1193. X  :
  1194. Xelse
  1195. X  echo "!!! no tgetent - no screen";exit
  1196. Xfi
  1197. Xrm -f conftest*
  1198. X
  1199. X
  1200. Xfi
  1201. Xrm -f conftest*
  1202. X
  1203. XTERMCAP="xx|scrdumm:xx:"
  1204. XTERM=scrdumm
  1205. Xexport TERMCAP
  1206. Xexport TERM
  1207. Xcat > conftest.c <<EOF
  1208. X
  1209. Xmain()
  1210. X{
  1211. X  char buf[1024];
  1212. X  if (tgetent(buf, "scrdumm") != 1)
  1213. X    exit(1);
  1214. X  exit(0);
  1215. X}
  1216. XEOF
  1217. Xeval $compile
  1218. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1219. X  echo "- you use the termcap database"
  1220. Xelse
  1221. X  echo "- you use the terminfo database";DEFS="$DEFS -DTERMINFO=1"
  1222. XSEDDEFS="${SEDDEFS}\${SEDdA}TERMINFO\${SEDdB}TERMINFO\${SEDdC}1\${SEDdD}
  1223. X\${SEDuA}TERMINFO\${SEDuB}TERMINFO\${SEDuC}1\${SEDuD}
  1224. X\${SEDeA}TERMINFO\${SEDeB}TERMINFO\${SEDeC}1\${SEDeD}
  1225. X"
  1226. Xfi
  1227. Xrm -f conftest*
  1228. Xecho checking for ospeed
  1229. Xcat > conftest.c <<EOF
  1230. Xextern short ospeed;
  1231. Xmain() { exit(0); } 
  1232. Xt() { ospeed=5; }
  1233. XEOF
  1234. Xif eval $compile; then
  1235. X  :
  1236. Xelse
  1237. X  DEFS="$DEFS -DNEED_OSPEED=1"
  1238. XSEDDEFS="${SEDDEFS}\${SEDdA}NEED_OSPEED\${SEDdB}NEED_OSPEED\${SEDdC}1\${SEDdD}
  1239. X\${SEDuA}NEED_OSPEED\${SEDuB}NEED_OSPEED\${SEDuC}1\${SEDuD}
  1240. X\${SEDeA}NEED_OSPEED\${SEDeB}NEED_OSPEED\${SEDeC}1\${SEDeD}
  1241. X"
  1242. Xfi
  1243. Xrm -f conftest*
  1244. X
  1245. X
  1246. Xecho checking for ptyranges
  1247. Xif test -d /dev/ptym ; then
  1248. Xpdir='/dev/ptym'
  1249. Xelse
  1250. Xpdir='/dev'
  1251. Xfi
  1252. Xptys=`echo $pdir/pty??`
  1253. Xif test "$ptys" != "$pdir/pty??" ; then
  1254. Xp0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | tr ' ' '\012' | sort -u | sed -n -e H -e g -e 's/\n//g' -e '$p'`
  1255. Xp1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | tr ' ' '\012' | sort -u | sed -n -e H -e g -e 's/\n//g' -e '$p'`
  1256. XDEFS="$DEFS -DPTYRANGE0=\"$p0\""
  1257. XSEDDEFS="${SEDDEFS}\${SEDdA}PTYRANGE0\${SEDdB}PTYRANGE0\${SEDdC}\"$p0\"\${SEDdD}
  1258. X\${SEDuA}PTYRANGE0\${SEDuB}PTYRANGE0\${SEDuC}\"$p0\"\${SEDuD}
  1259. X\${SEDeA}PTYRANGE0\${SEDeB}PTYRANGE0\${SEDeC}\"$p0\"\${SEDeD}
  1260. X"
  1261. XDEFS="$DEFS -DPTYRANGE1=\"$p1\""
  1262. XSEDDEFS="${SEDDEFS}\${SEDdA}PTYRANGE1\${SEDdB}PTYRANGE1\${SEDdC}\"$p1\"\${SEDdD}
  1263. X\${SEDuA}PTYRANGE1\${SEDuB}PTYRANGE1\${SEDuC}\"$p1\"\${SEDuD}
  1264. X\${SEDeA}PTYRANGE1\${SEDeB}PTYRANGE1\${SEDeC}\"$p1\"\${SEDeD}
  1265. X"
  1266. Xfi
  1267. X
  1268. X
  1269. Xecho checking for getutent
  1270. Xcat > conftest.c <<EOF
  1271. X#include <time.h> /* to get time_t on SCO */
  1272. X#include <sys/types.h>
  1273. X#ifdef SVR4
  1274. X#include <utmpx.h>
  1275. X#else
  1276. X#include <utmp.h>
  1277. X#endif
  1278. X#ifdef hpux
  1279. X#define pututline _pututline
  1280. X#endif
  1281. X
  1282. Xmain() { exit(0); } 
  1283. Xt() { int x = DEAD_PROCESS; struct utmp *y = pututline((struct utmp *)0); getutent(); }
  1284. XEOF
  1285. Xif eval $compile; then
  1286. X  DEFS="$DEFS -DGETUTENT=1"
  1287. XSEDDEFS="${SEDDEFS}\${SEDdA}GETUTENT\${SEDdB}GETUTENT\${SEDdC}1\${SEDdD}
  1288. X\${SEDuA}GETUTENT\${SEDuB}GETUTENT\${SEDuC}1\${SEDuD}
  1289. X\${SEDeA}GETUTENT\${SEDeB}GETUTENT\${SEDeC}1\${SEDeD}
  1290. X"
  1291. Xfi
  1292. Xrm -f conftest*
  1293. X
  1294. Xecho checking for ut_host
  1295. Xcat > conftest.c <<EOF
  1296. X#include <time.h>
  1297. X#include <sys/types.h>
  1298. X#ifdef SVR4
  1299. X#include <utmpx.h>
  1300. X#else
  1301. X#include <utmp.h>
  1302. X#endif
  1303. X
  1304. Xmain() { exit(0); } 
  1305. Xt() { struct utmp u; u.ut_host[0] = 0; }
  1306. XEOF
  1307. Xif eval $compile; then
  1308. X  DEFS="$DEFS -DUTHOST=1"
  1309. XSEDDEFS="${SEDDEFS}\${SEDdA}UTHOST\${SEDdB}UTHOST\${SEDdC}1\${SEDdD}
  1310. X\${SEDuA}UTHOST\${SEDuB}UTHOST\${SEDuC}1\${SEDuD}
  1311. X\${SEDeA}UTHOST\${SEDeB}UTHOST\${SEDeC}1\${SEDeD}
  1312. X"
  1313. Xfi
  1314. Xrm -f conftest*
  1315. X
  1316. X
  1317. X
  1318. Xecho "checking for libutil(s)"
  1319. Xtest -f /usr/lib/libutils.a && LIBS="$LIBS -lutils"
  1320. Xtest -f /usr/lib/libutil.a && LIBS="$LIBS -lutil"
  1321. X
  1322. Xecho checking for getloadavg
  1323. Xcat > conftest.c <<EOF
  1324. X
  1325. Xmain() { exit(0); } 
  1326. Xt() { getloadavg((double *)0, 0); }
  1327. XEOF
  1328. Xif eval $compile; then
  1329. X  DEFS="$DEFS -DLOADAV_GETLOADAVG=1"
  1330. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_GETLOADAVG\${SEDdB}LOADAV_GETLOADAVG\${SEDdC}1\${SEDdD}
  1331. X\${SEDuA}LOADAV_GETLOADAVG\${SEDuB}LOADAV_GETLOADAVG\${SEDuC}1\${SEDuD}
  1332. X\${SEDeA}LOADAV_GETLOADAVG\${SEDeB}LOADAV_GETLOADAVG\${SEDeC}1\${SEDeD}
  1333. X";load=1
  1334. Xfi
  1335. Xrm -f conftest*
  1336. X
  1337. Xif test -z "$load" ; then
  1338. Xcat > conftest.c <<EOF
  1339. X#if defined(NeXT) || defined(apollo) || defined(linux)
  1340. X  yes
  1341. X#endif
  1342. X
  1343. XEOF
  1344. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  1345. Xif egrep "yes" conftest.out >/dev/null 2>&1; then
  1346. X  load=1
  1347. Xfi
  1348. Xrm -f conftest*
  1349. X
  1350. Xfi
  1351. Xif test -z "$load" ; then
  1352. Xecho "searching for kernelfile"
  1353. Xfor core in /unix /vmunix /dynix /hp-ux /xelos /386bsd /kernel/unix ; do
  1354. X  if test -f $core ; then
  1355. X    break
  1356. X  fi
  1357. Xdone
  1358. Xif test ! -f $core ; then
  1359. X  echo "- no kernelfile found"
  1360. Xelse
  1361. X  echo "- using kernelfile '$core'"
  1362. X  DEFS="$DEFS -DLOADAV_UNIX=\"$core\""
  1363. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_UNIX\${SEDdB}LOADAV_UNIX\${SEDdC}\"$core\"\${SEDdD}
  1364. X\${SEDuA}LOADAV_UNIX\${SEDuB}LOADAV_UNIX\${SEDuC}\"$core\"\${SEDuD}
  1365. X\${SEDeA}LOADAV_UNIX\${SEDeB}LOADAV_UNIX\${SEDeC}\"$core\"\${SEDeD}
  1366. X"
  1367. X  echo checking for nlist.h
  1368. Xcat > conftest.c <<EOF
  1369. X#include <nlist.h>
  1370. XEOF
  1371. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1372. Xif test -z "$err"; then
  1373. X  DEFS="$DEFS -DNLIST_STRUCT=1"
  1374. XSEDDEFS="${SEDDEFS}\${SEDdA}NLIST_STRUCT\${SEDdB}NLIST_STRUCT\${SEDdC}1\${SEDdD}
  1375. X\${SEDuA}NLIST_STRUCT\${SEDuB}NLIST_STRUCT\${SEDuC}1\${SEDuD}
  1376. X\${SEDeA}NLIST_STRUCT\${SEDeB}NLIST_STRUCT\${SEDeC}1\${SEDeD}
  1377. X"
  1378. X     echo checking for n_un in struct nlist
  1379. Xcat > conftest.c <<EOF
  1380. X#include <nlist.h>
  1381. Xmain() { exit(0); } 
  1382. Xt() { struct nlist n; n.n_un.n_name = 0; }
  1383. XEOF
  1384. Xif eval $compile; then
  1385. X  DEFS="$DEFS -DNLIST_NAME_UNION=1"
  1386. XSEDDEFS="${SEDDEFS}\${SEDdA}NLIST_NAME_UNION\${SEDdB}NLIST_NAME_UNION\${SEDdC}1\${SEDdD}
  1387. X\${SEDuA}NLIST_NAME_UNION\${SEDuB}NLIST_NAME_UNION\${SEDuC}1\${SEDuD}
  1388. X\${SEDeA}NLIST_NAME_UNION\${SEDeB}NLIST_NAME_UNION\${SEDeC}1\${SEDeD}
  1389. X"
  1390. Xfi
  1391. Xrm -f conftest*
  1392. X
  1393. Xfi
  1394. Xrm -f conftest*
  1395. X
  1396. X
  1397. X  echo checking for nlist declaration
  1398. X  cat > conftest.c <<EOF
  1399. X
  1400. X#ifdef NLIST_STRUCT
  1401. X# include <nlist.h>
  1402. X#else
  1403. X# include <a.out.h>
  1404. X#endif
  1405. X
  1406. XEOF
  1407. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  1408. Xif egrep "nlist( |    |\()" conftest.out >/dev/null 2>&1; then
  1409. X  DEFS="$DEFS -DNLIST_DECLARED=1"
  1410. XSEDDEFS="${SEDDEFS}\${SEDdA}NLIST_DECLARED\${SEDdB}NLIST_DECLARED\${SEDdC}1\${SEDdD}
  1411. X\${SEDuA}NLIST_DECLARED\${SEDuB}NLIST_DECLARED\${SEDuC}1\${SEDuD}
  1412. X\${SEDeA}NLIST_DECLARED\${SEDeB}NLIST_DECLARED\${SEDeC}1\${SEDeD}
  1413. X"
  1414. Xfi
  1415. Xrm -f conftest*
  1416. X
  1417. X
  1418. X  echo searching for avenrun symbol
  1419. X  for av in avenrun _avenrun _Loadavg ; do
  1420. X  cat > conftest.c <<EOF
  1421. X
  1422. X#include <sys/types.h>
  1423. X#ifdef NLIST_STRUCT
  1424. X#include <nlist.h>
  1425. X#else
  1426. X#include <a.out.h>
  1427. X#endif
  1428. X
  1429. Xstruct nlist nl[2];
  1430. X
  1431. Xmain()
  1432. X{
  1433. X#ifdef NLIST_NAME_UNION
  1434. X  nl[0].n_un.n_name = "$av";
  1435. X#else
  1436. X  nl[0].n_name = "$av";
  1437. X#endif
  1438. X  nlist(LOADAV_UNIX, nl);
  1439. X  if (nl[0].n_value == 0)
  1440. X    exit(1);
  1441. X  exit(0);
  1442. X}
  1443. X  
  1444. XEOF
  1445. Xeval $compile
  1446. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1447. X  avensym=$av;break
  1448. Xfi
  1449. Xrm -f conftest*
  1450. X  done
  1451. X  if test -z "$avensym" ; then
  1452. X    echo "- no avenrun symbol found"
  1453. X  else
  1454. X    echo "- using avenrun symbol '$avensym'"
  1455. X    DEFS="$DEFS -DLOADAV_AVENRUN=\"$avensym\""
  1456. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_AVENRUN\${SEDdB}LOADAV_AVENRUN\${SEDdC}\"$avensym\"\${SEDdD}
  1457. X\${SEDuA}LOADAV_AVENRUN\${SEDuB}LOADAV_AVENRUN\${SEDuC}\"$avensym\"\${SEDuD}
  1458. X\${SEDeA}LOADAV_AVENRUN\${SEDeB}LOADAV_AVENRUN\${SEDeC}\"$avensym\"\${SEDeD}
  1459. X";
  1460. X    load=1
  1461. X  fi
  1462. Xfi
  1463. Xfi
  1464. X
  1465. Xcat > conftest.c <<EOF
  1466. X
  1467. X#include <sys/types.h>
  1468. X#include <sys/param.h>
  1469. X
  1470. X_CUT_HERE_
  1471. X
  1472. X#if ((defined(hp300) && !defined(hpux)) || defined(sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || defined(SVR4) || defined(sony_news))
  1473. Xloadtype=long
  1474. X# ifdef apollo
  1475. Xloadscale=65536
  1476. X# else
  1477. X#  ifdef FSCALE
  1478. X#   undef FSCALE
  1479. Xloadscale=FSCALE
  1480. X#  else
  1481. X#   ifdef sgi
  1482. Xloadscale=1024
  1483. X#   else
  1484. X#    if defined(MIPS) || defined(SVR4)
  1485. Xloadscale=256
  1486. X#    else /* not MIPS */
  1487. Xloadscale=1000     /* our default value */
  1488. X#    endif /* MIPS */
  1489. X#   endif /* sgi */
  1490. X#  endif /* not FSCALE */
  1491. X# endif /* not apollo */
  1492. X#else
  1493. Xloadtype=double
  1494. Xloadscale=1
  1495. X#endif
  1496. X#ifdef alliant
  1497. Xloadnum=4
  1498. X#else
  1499. Xloadnum=3
  1500. X#endif
  1501. X
  1502. XEOF
  1503. Xeval "$CPP $DEFS conftest.c 2>/dev/null | sed -e '1,/_CUT_HERE_/d' > conftest.out"
  1504. X. ./conftest.out
  1505. Xrm -f conftest*
  1506. X
  1507. X
  1508. Xif test -n "$load" ; then DEFS="$DEFS -DLOADAV=1"
  1509. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV\${SEDdB}LOADAV\${SEDdC}1\${SEDdD}
  1510. X\${SEDuA}LOADAV\${SEDuB}LOADAV\${SEDuC}1\${SEDuD}
  1511. X\${SEDeA}LOADAV\${SEDeB}LOADAV\${SEDeC}1\${SEDeD}
  1512. X" ; fi
  1513. Xif test -n "$loadtype" ; then DEFS="$DEFS -DLOADAV_TYPE=$loadtype"
  1514. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_TYPE\${SEDdB}LOADAV_TYPE\${SEDdC}$loadtype\${SEDdD}
  1515. X\${SEDuA}LOADAV_TYPE\${SEDuB}LOADAV_TYPE\${SEDuC}$loadtype\${SEDuD}
  1516. X\${SEDeA}LOADAV_TYPE\${SEDeB}LOADAV_TYPE\${SEDeC}$loadtype\${SEDeD}
  1517. X" ; fi
  1518. Xif test -n "$loadnum" ; then DEFS="$DEFS -DLOADAV_NUM=$loadnum"
  1519. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_NUM\${SEDdB}LOADAV_NUM\${SEDdC}$loadnum\${SEDdD}
  1520. X\${SEDuA}LOADAV_NUM\${SEDuB}LOADAV_NUM\${SEDuC}$loadnum\${SEDuD}
  1521. X\${SEDeA}LOADAV_NUM\${SEDeB}LOADAV_NUM\${SEDeC}$loadnum\${SEDeD}
  1522. X" ; fi
  1523. Xif test -n "$loadscale" ; then DEFS="$DEFS -DLOADAV_SCALE=$loadscale"
  1524. XSEDDEFS="${SEDDEFS}\${SEDdA}LOADAV_SCALE\${SEDdB}LOADAV_SCALE\${SEDdC}$loadscale\${SEDdD}
  1525. X\${SEDuA}LOADAV_SCALE\${SEDuB}LOADAV_SCALE\${SEDuC}$loadscale\${SEDuD}
  1526. X\${SEDeA}LOADAV_SCALE\${SEDeB}LOADAV_SCALE\${SEDeC}$loadscale\${SEDeD}
  1527. X" ; fi
  1528. X
  1529. X
  1530. Xecho '#include <signal.h>' > conftest.c
  1531. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  1532. Xif egrep "(void|sighandler_t).*signal" conftest.out >/dev/null 2>&1; then
  1533. X  DEFS="$DEFS -DSIGVOID=1"
  1534. XSEDDEFS="${SEDDEFS}\${SEDdA}SIGVOID\${SEDdB}SIGVOID\${SEDdC}1\${SEDdD}
  1535. X\${SEDuA}SIGVOID\${SEDuB}SIGVOID\${SEDuC}1\${SEDuD}
  1536. X\${SEDeA}SIGVOID\${SEDeB}SIGVOID\${SEDeC}1\${SEDeD}
  1537. X"
  1538. Xfi
  1539. Xrm -f conftest*
  1540. X
  1541. Xecho checking for sigset
  1542. Xcat > conftest.c <<EOF
  1543. X
  1544. X#include <sys/types.h>
  1545. X#include <signal.h>
  1546. X
  1547. Xmain() { exit(0); } 
  1548. Xt() { 
  1549. X#ifdef SIGVOID
  1550. Xsigset(0, (void (*)())0);
  1551. X#else
  1552. Xsigset(0, (int (*)())0);
  1553. X#endif
  1554. X }
  1555. XEOF
  1556. Xif eval $compile; then
  1557. X  DEFS="$DEFS -DUSESIGSET=1"
  1558. XSEDDEFS="${SEDDEFS}\${SEDdA}USESIGSET\${SEDdB}USESIGSET\${SEDdC}1\${SEDdD}
  1559. X\${SEDuA}USESIGSET\${SEDuB}USESIGSET\${SEDuC}1\${SEDuD}
  1560. X\${SEDeA}USESIGSET\${SEDeB}USESIGSET\${SEDeC}1\${SEDeD}
  1561. X"
  1562. Xfi
  1563. Xrm -f conftest*
  1564. X
  1565. Xecho checking signal implementation
  1566. Xcat > conftest.c <<EOF
  1567. X
  1568. X#include <sys/types.h>
  1569. X#include <signal.h>
  1570. X
  1571. X#ifndef SIGCHLD
  1572. X#define SIGCHLD SIGCLD
  1573. X#endif
  1574. X#ifdef USESIGSET
  1575. X#define signal sigset
  1576. X#endif
  1577. X
  1578. Xint got;
  1579. X
  1580. X#ifdef SIGVOID
  1581. Xvoid
  1582. X#endif
  1583. Xhand()
  1584. X{
  1585. X  got++;
  1586. X}
  1587. X
  1588. Xmain()
  1589. X{
  1590. X  (void)signal(SIGCHLD, hand);
  1591. X  kill(getpid(), SIGCHLD);
  1592. X  kill(getpid(), SIGCHLD);
  1593. X  if (got < 2)
  1594. X    exit(1);
  1595. X  exit(0);
  1596. X}
  1597. X
  1598. XEOF
  1599. Xeval $compile
  1600. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1601. X  :
  1602. Xelse
  1603. X  DEFS="$DEFS -DSYSVSIGS=1"
  1604. XSEDDEFS="${SEDDEFS}\${SEDdA}SYSVSIGS\${SEDdB}SYSVSIGS\${SEDdC}1\${SEDdD}
  1605. X\${SEDuA}SYSVSIGS\${SEDuB}SYSVSIGS\${SEDuC}1\${SEDuD}
  1606. X\${SEDeA}SYSVSIGS\${SEDeB}SYSVSIGS\${SEDeC}1\${SEDeD}
  1607. X"
  1608. Xfi
  1609. Xrm -f conftest*
  1610. X
  1611. X
  1612. Xecho checking for crypt and sec libraries
  1613. Xtest -f /lib/libcrypt_d.a || test -f /usr/lib/libcrypt_d.a && LIBS="$LIBS -lcrypt_d"
  1614. Xtest -f /lib/libcrypt.a || test -f /usr/lib/libcrypt.a && LIBS="$LIBS -lcrypt"
  1615. Xtest -f /lib/libsec.a || test -f /usr/lib/libsec.a && LIBS="$LIBS -lsec"
  1616. X
  1617. Xoldlibs="$LIBS"
  1618. XLIBS="$LIBS -lsun"
  1619. Xecho checking for IRIX sun library
  1620. Xcat > conftest.c <<EOF
  1621. X
  1622. Xmain() { exit(0); } 
  1623. Xt() {  }
  1624. XEOF
  1625. Xif eval $compile; then
  1626. X  :
  1627. Xelse
  1628. X  LIBS="$oldlibs"
  1629. Xfi
  1630. Xrm -f conftest*
  1631. X
  1632. X
  1633. X
  1634. Xecho checking for wait union
  1635. Xcat > conftest.c <<EOF
  1636. X#include <sys/types.h>
  1637. X#include <sys/wait.h>
  1638. X
  1639. Xmain() { exit(0); } 
  1640. Xt() { 
  1641. X  union wait x;
  1642. X  int y;
  1643. X#ifdef WEXITSTATUS
  1644. X  y = WEXITSTATUS(x);
  1645. X#endif
  1646. X }
  1647. XEOF
  1648. Xif eval $compile; then
  1649. X  DEFS="$DEFS -DBSDWAIT=1"
  1650. XSEDDEFS="${SEDDEFS}\${SEDdA}BSDWAIT\${SEDdB}BSDWAIT\${SEDdC}1\${SEDdD}
  1651. X\${SEDuA}BSDWAIT\${SEDuB}BSDWAIT\${SEDuC}1\${SEDuD}
  1652. X\${SEDeA}BSDWAIT\${SEDeB}BSDWAIT\${SEDeC}1\${SEDeD}
  1653. X"
  1654. Xfi
  1655. Xrm -f conftest*
  1656. X
  1657. X
  1658. Xecho checking for termio or termios
  1659. Xcat > conftest.c <<EOF
  1660. X#include <termios.h>
  1661. XEOF
  1662. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1663. Xif test -z "$err"; then
  1664. X  DEFS="$DEFS -DTERMIO=1"
  1665. XSEDDEFS="${SEDDEFS}\${SEDdA}TERMIO\${SEDdB}TERMIO\${SEDdC}1\${SEDdD}
  1666. X\${SEDuA}TERMIO\${SEDuB}TERMIO\${SEDuC}1\${SEDuD}
  1667. X\${SEDeA}TERMIO\${SEDeB}TERMIO\${SEDeC}1\${SEDeD}
  1668. X"
  1669. Xelse
  1670. X  cat > conftest.c <<EOF
  1671. X#include <termio.h>
  1672. XEOF
  1673. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1674. Xif test -z "$err"; then
  1675. X  DEFS="$DEFS -DTERMIO=1"
  1676. XSEDDEFS="${SEDDEFS}\${SEDdA}TERMIO\${SEDdB}TERMIO\${SEDdC}1\${SEDdD}
  1677. X\${SEDuA}TERMIO\${SEDuB}TERMIO\${SEDuC}1\${SEDuD}
  1678. X\${SEDeA}TERMIO\${SEDeB}TERMIO\${SEDeC}1\${SEDeD}
  1679. X"
  1680. Xfi
  1681. Xrm -f conftest*
  1682. Xfi
  1683. Xrm -f conftest*
  1684. X
  1685. Xecho checking for getspnam
  1686. Xcat > conftest.c <<EOF
  1687. X#include <shadow.h>
  1688. Xmain() { exit(0); } 
  1689. Xt() { getspnam(); }
  1690. XEOF
  1691. Xif eval $compile; then
  1692. X  DEFS="$DEFS -DSHADOWPW=1"
  1693. XSEDDEFS="${SEDDEFS}\${SEDdA}SHADOWPW\${SEDdB}SHADOWPW\${SEDdC}1\${SEDdD}
  1694. X\${SEDuA}SHADOWPW\${SEDuB}SHADOWPW\${SEDuC}1\${SEDuD}
  1695. X\${SEDeA}SHADOWPW\${SEDeB}SHADOWPW\${SEDeC}1\${SEDeD}
  1696. X"
  1697. Xfi
  1698. Xrm -f conftest*
  1699. X
  1700. X
  1701. Xecho checking for getttyent
  1702. Xcat > conftest.c <<EOF
  1703. X
  1704. Xmain() { exit(0); } 
  1705. Xt() { getttyent(); }
  1706. XEOF
  1707. Xif eval $compile; then
  1708. X  DEFS="$DEFS -DGETTTYENT=1"
  1709. XSEDDEFS="${SEDDEFS}\${SEDdA}GETTTYENT\${SEDdB}GETTTYENT\${SEDdC}1\${SEDdD}
  1710. X\${SEDuA}GETTTYENT\${SEDuB}GETTTYENT\${SEDuC}1\${SEDuD}
  1711. X\${SEDeA}GETTTYENT\${SEDeB}GETTTYENT\${SEDeC}1\${SEDeD}
  1712. X"
  1713. Xfi
  1714. Xrm -f conftest*
  1715. X
  1716. X
  1717. Xecho checking whether memcpy/memmove/bcopy handles overlapping arguments
  1718. Xcat > conftest.c <<EOF
  1719. X
  1720. Xmain() {
  1721. X  char buf[10];
  1722. X  strcpy(buf, "abcdefghi");
  1723. X  bcopy(buf, buf + 2, 3);
  1724. X  if (strncmp(buf, "ababcf", 6))
  1725. X    exit(1);
  1726. X  strcpy(buf, "abcdefghi");
  1727. X  bcopy(buf + 2, buf, 3);
  1728. X  if (strncmp(buf, "cdedef", 6))
  1729. X    exit(1);
  1730. X  exit(0); /* libc version works properly.  */
  1731. X}
  1732. XEOF
  1733. Xeval $compile
  1734. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1735. X  DEFS="$DEFS -DUSEBCOPY=1"
  1736. XSEDDEFS="${SEDDEFS}\${SEDdA}USEBCOPY\${SEDdB}USEBCOPY\${SEDdC}1\${SEDdD}
  1737. X\${SEDuA}USEBCOPY\${SEDuB}USEBCOPY\${SEDuC}1\${SEDuD}
  1738. X\${SEDeA}USEBCOPY\${SEDeB}USEBCOPY\${SEDeC}1\${SEDeD}
  1739. X"
  1740. Xfi
  1741. Xrm -f conftest*
  1742. X
  1743. Xcat > conftest.c <<EOF
  1744. X
  1745. X#define bcopy(s,d,l) memmove(d,s,l)
  1746. Xmain() {
  1747. X  char buf[10];
  1748. X  strcpy(buf, "abcdefghi");
  1749. X  bcopy(buf, buf + 2, 3);
  1750. X  if (strncmp(buf, "ababcf", 6))
  1751. X    exit(1);
  1752. X  strcpy(buf, "abcdefghi");
  1753. X  bcopy(buf + 2, buf, 3);
  1754. X  if (strncmp(buf, "cdedef", 6))
  1755. X    exit(1);
  1756. X  exit(0); /* libc version works properly.  */
  1757. X}
  1758. XEOF
  1759. Xeval $compile
  1760. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1761. X  DEFS="$DEFS -DUSEMEMMOVE=1"
  1762. XSEDDEFS="${SEDDEFS}\${SEDdA}USEMEMMOVE\${SEDdB}USEMEMMOVE\${SEDdC}1\${SEDdD}
  1763. X\${SEDuA}USEMEMMOVE\${SEDuB}USEMEMMOVE\${SEDuC}1\${SEDuD}
  1764. X\${SEDeA}USEMEMMOVE\${SEDeB}USEMEMMOVE\${SEDeC}1\${SEDeD}
  1765. X"
  1766. Xfi
  1767. Xrm -f conftest*
  1768. X
  1769. X
  1770. Xcat > conftest.c <<EOF
  1771. X
  1772. X#define bcopy(s,d,l) memcpy(d,s,l)
  1773. Xmain() {
  1774. X  char buf[10];
  1775. X  strcpy(buf, "abcdefghi");
  1776. X  bcopy(buf, buf + 2, 3);
  1777. X  if (strncmp(buf, "ababcf", 6))
  1778. X    exit(1);
  1779. X  strcpy(buf, "abcdefghi");
  1780. X  bcopy(buf + 2, buf, 3);
  1781. X  if (strncmp(buf, "cdedef", 6))
  1782. X    exit(1);
  1783. X  exit(0); /* libc version works properly.  */
  1784. X}
  1785. XEOF
  1786. Xeval $compile
  1787. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1788. X  DEFS="$DEFS -DUSEMEMCPY=1"
  1789. XSEDDEFS="${SEDDEFS}\${SEDdA}USEMEMCPY\${SEDdB}USEMEMCPY\${SEDdC}1\${SEDdD}
  1790. X\${SEDuA}USEMEMCPY\${SEDuB}USEMEMCPY\${SEDuC}1\${SEDuD}
  1791. X\${SEDeA}USEMEMCPY\${SEDeB}USEMEMCPY\${SEDeC}1\${SEDeD}
  1792. X"
  1793. Xfi
  1794. Xrm -f conftest*
  1795. X
  1796. Xecho checking for long file names
  1797. X(echo 1 > /tmp/conftest9012345) 2>/dev/null
  1798. X(echo 2 > /tmp/conftest9012346) 2>/dev/null
  1799. Xval=`cat /tmp/conftest9012345 2>/dev/null`
  1800. Xif test -f /tmp/conftest9012345 && test "$val" = 1; then :
  1801. Xelse DEFS="$DEFS -DNAME_MAX=14"
  1802. XSEDDEFS="${SEDDEFS}\${SEDdA}NAME_MAX\${SEDdB}NAME_MAX\${SEDdC}14\${SEDdD}
  1803. X\${SEDuA}NAME_MAX\${SEDuB}NAME_MAX\${SEDuC}14\${SEDuD}
  1804. X\${SEDeA}NAME_MAX\${SEDeB}NAME_MAX\${SEDeC}14\${SEDeD}
  1805. X"
  1806. Xfi
  1807. Xrm -f /tmp/conftest*
  1808. X
  1809. Xecho checking for vsprintf
  1810. Xcat > conftest.c <<EOF
  1811. X#include <varargs.h>
  1812. X#include <stdio.h>
  1813. Xmain() { exit(0); } 
  1814. Xt() { vsprintf(); }
  1815. XEOF
  1816. Xif eval $compile; then
  1817. X  DEFS="$DEFS -DUSEVARARGS=1"
  1818. XSEDDEFS="${SEDDEFS}\${SEDdA}USEVARARGS\${SEDdB}USEVARARGS\${SEDdC}1\${SEDdD}
  1819. X\${SEDuA}USEVARARGS\${SEDuB}USEVARARGS\${SEDuC}1\${SEDuD}
  1820. X\${SEDeA}USEVARARGS\${SEDeB}USEVARARGS\${SEDeC}1\${SEDeD}
  1821. X"
  1822. Xfi
  1823. Xrm -f conftest*
  1824. X
  1825. X
  1826. Xecho checking for directory library header
  1827. Xecho checking for dirent.h
  1828. Xcat > conftest.c <<EOF
  1829. X#include <dirent.h>
  1830. XEOF
  1831. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1832. Xif test -z "$err"; then
  1833. X  DEFS="$DEFS -DDIRENT=1"
  1834. XSEDDEFS="${SEDDEFS}\${SEDdA}DIRENT\${SEDdB}DIRENT\${SEDdC}1\${SEDdD}
  1835. X\${SEDuA}DIRENT\${SEDuB}DIRENT\${SEDuC}1\${SEDuD}
  1836. X\${SEDeA}DIRENT\${SEDeB}DIRENT\${SEDeC}1\${SEDeD}
  1837. X" dirheader=dirent.h
  1838. Xfi
  1839. Xrm -f conftest*
  1840. X
  1841. Xif test -z "$dirheader"; then
  1842. Xecho checking for sys/ndir.h
  1843. Xcat > conftest.c <<EOF
  1844. X#include <sys/ndir.h>
  1845. XEOF
  1846. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1847. Xif test -z "$err"; then
  1848. X  DEFS="$DEFS -DSYSNDIR=1"
  1849. XSEDDEFS="${SEDDEFS}\${SEDdA}SYSNDIR\${SEDdB}SYSNDIR\${SEDdC}1\${SEDdD}
  1850. X\${SEDuA}SYSNDIR\${SEDuB}SYSNDIR\${SEDuC}1\${SEDuD}
  1851. X\${SEDeA}SYSNDIR\${SEDeB}SYSNDIR\${SEDeC}1\${SEDeD}
  1852. X" dirheader=sys/ndir.h
  1853. Xfi
  1854. Xrm -f conftest*
  1855. X
  1856. Xfi
  1857. Xif test -z "$dirheader"; then
  1858. Xecho checking for sys/dir.h
  1859. Xcat > conftest.c <<EOF
  1860. X#include <sys/dir.h>
  1861. XEOF
  1862. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1863. Xif test -z "$err"; then
  1864. X  DEFS="$DEFS -DSYSDIR=1"
  1865. XSEDDEFS="${SEDDEFS}\${SEDdA}SYSDIR\${SEDdB}SYSDIR\${SEDdC}1\${SEDdD}
  1866. X\${SEDuA}SYSDIR\${SEDuB}SYSDIR\${SEDuC}1\${SEDuD}
  1867. X\${SEDeA}SYSDIR\${SEDeB}SYSDIR\${SEDeC}1\${SEDeD}
  1868. X" dirheader=sys/dir.h
  1869. Xfi
  1870. Xrm -f conftest*
  1871. X
  1872. Xfi
  1873. Xif test -z "$dirheader"; then
  1874. Xecho checking for ndir.h
  1875. Xcat > conftest.c <<EOF
  1876. X#include <ndir.h>
  1877. XEOF
  1878. Xerr=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
  1879. Xif test -z "$err"; then
  1880. X  DEFS="$DEFS -DNDIR=1"
  1881. XSEDDEFS="${SEDDEFS}\${SEDdA}NDIR\${SEDdB}NDIR\${SEDdC}1\${SEDdD}
  1882. X\${SEDuA}NDIR\${SEDuB}NDIR\${SEDuC}1\${SEDuD}
  1883. X\${SEDeA}NDIR\${SEDeB}NDIR\${SEDeC}1\${SEDeD}
  1884. X" dirheader=ndir.h
  1885. Xfi
  1886. Xrm -f conftest*
  1887. X
  1888. Xfi
  1889. X
  1890. Xecho checking for closedir return value
  1891. Xcat > conftest.c <<EOF
  1892. X#include <sys/types.h>
  1893. X#include <$dirheader>
  1894. Xint closedir(); main() { exit(0); }
  1895. XEOF
  1896. Xeval $compile
  1897. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1898. X  :
  1899. Xelse
  1900. X  DEFS="$DEFS -DVOID_CLOSEDIR=1"
  1901. XSEDDEFS="${SEDDEFS}\${SEDdA}VOID_CLOSEDIR\${SEDdB}VOID_CLOSEDIR\${SEDdC}1\${SEDdD}
  1902. X\${SEDuA}VOID_CLOSEDIR\${SEDuB}VOID_CLOSEDIR\${SEDuC}1\${SEDuD}
  1903. X\${SEDeA}VOID_CLOSEDIR\${SEDeB}VOID_CLOSEDIR\${SEDeC}1\${SEDeD}
  1904. X"
  1905. Xfi
  1906. Xrm -f conftest*
  1907. X
  1908. Xecho checking for Xenix
  1909. Xcat > conftest.c <<EOF
  1910. X#if defined(M_XENIX) && !defined(M_UNIX)
  1911. X  yes
  1912. X#endif
  1913. X
  1914. XEOF
  1915. Xeval "$CPP $DEFS conftest.c > conftest.out 2>&1"
  1916. Xif egrep "yes" conftest.out >/dev/null 2>&1; then
  1917. X  XENIX=1
  1918. Xfi
  1919. Xrm -f conftest*
  1920. X
  1921. Xif test -n "$XENIX"; then
  1922. X  DEFS="$DEFS -DVOID_CLOSEDIR=1"
  1923. XSEDDEFS="${SEDDEFS}\${SEDdA}VOID_CLOSEDIR\${SEDdB}VOID_CLOSEDIR\${SEDdC}1\${SEDdD}
  1924. X\${SEDuA}VOID_CLOSEDIR\${SEDuB}VOID_CLOSEDIR\${SEDuC}1\${SEDuD}
  1925. X\${SEDeA}VOID_CLOSEDIR\${SEDeB}VOID_CLOSEDIR\${SEDeC}1\${SEDeD}
  1926. X"
  1927. X  LIBS="$LIBS -lx"
  1928. X  case "$DEFS" in
  1929. X  *SYSNDIR*) ;;
  1930. X  *) LIBS="-ldir $LIBS" ;; # Make sure -ldir precedes any -lx.
  1931. X  esac
  1932. Xfi
  1933. X
  1934. X
  1935. Xecho checking for setenv
  1936. Xcat > conftest.c <<EOF
  1937. X
  1938. Xmain() { exit(0); } 
  1939. Xt() { setenv((char *)0,(char *)0);unsetenv((char *)0); }
  1940. XEOF
  1941. Xif eval $compile; then
  1942. X  DEFS="$DEFS -DUSESETENV=1"
  1943. XSEDDEFS="${SEDDEFS}\${SEDdA}USESETENV\${SEDdB}USESETENV\${SEDdC}1\${SEDdD}
  1944. X\${SEDuA}USESETENV\${SEDuB}USESETENV\${SEDuC}1\${SEDuD}
  1945. X\${SEDeA}USESETENV\${SEDeB}USESETENV\${SEDeC}1\${SEDeD}
  1946. X"
  1947. Xelse
  1948. X  echo checking for putenv
  1949. Xcat > conftest.c <<EOF
  1950. X
  1951. Xmain() { exit(0); } 
  1952. Xt() { putenv((char *)0);unsetenv((char *)0); }
  1953. XEOF
  1954. Xif eval $compile; then
  1955. X  :
  1956. Xelse
  1957. X  DEFS="$DEFS -DNEEDPUTENV=1"
  1958. XSEDDEFS="${SEDDEFS}\${SEDdA}NEEDPUTENV\${SEDdB}NEEDPUTENV\${SEDdC}1\${SEDdD}
  1959. X\${SEDuA}NEEDPUTENV\${SEDuB}NEEDPUTENV\${SEDuC}1\${SEDuD}
  1960. X\${SEDeA}NEEDPUTENV\${SEDeB}NEEDPUTENV\${SEDeC}1\${SEDeD}
  1961. X"
  1962. X
  1963. Xfi
  1964. Xrm -f conftest*
  1965. X
  1966. Xfi
  1967. Xrm -f conftest*
  1968. X
  1969. X
  1970. Xtest -n "$seqptx" && LIBS="-ltermcap -lc -lsocket -linet -lsec -lseq"
  1971. X
  1972. Xcat > conftest.c <<EOF
  1973. Xmain(){exit(0);}
  1974. XEOF
  1975. Xeval $compile
  1976. Xif test -s conftest && (./conftest; exit) 2>/dev/null; then
  1977. X  :
  1978. Xelse
  1979. X  echo "Can't run the compiler - internal error. Sorry.";exit
  1980. Xfi
  1981. Xrm -f conftest*
  1982. Xif test -n "$prefix"; then
  1983. X  test -z "$exec_prefix" && exec_prefix='${prefix}'
  1984. X  prsub="s%^prefix\\([     ]*\\)=\\([     ]*\\).*$%prefix\\1=\\2$prefix%"
  1985. Xfi
  1986. Xif test -n "$exec_prefix"; then
  1987. X  prsub="$prsub
  1988. Xs%^exec_prefix\\([     ]*\\)=\\([     ]*\\).*$%\
  1989. Xexec_prefix\\1=\\2$exec_prefix%"
  1990. Xfi
  1991. X
  1992. Xtrap 'rm -f config.status; exit 1' 1 3 15
  1993. Xecho creating config.status
  1994. Xrm -f config.status
  1995. Xcat > config.status <<EOF
  1996. X#!/bin/sh
  1997. X# Generated automatically by configure.
  1998. X# Run this file to recreate the current configuration.
  1999. X# This directory was configured as follows,
  2000. X# on host `(hostname || uname -n) 2>/dev/null`:
  2001. X#
  2002. X# $0 $*
  2003. X
  2004. Xfor arg
  2005. Xdo
  2006. X  case "\$arg" in
  2007. X    -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
  2008. X    exec /bin/sh $0 $* ;;
  2009. X    *) echo "Usage: config.status --recheck" 2>&1; exit 1 ;;
  2010. X  esac
  2011. Xdone
  2012. X
  2013. Xtrap 'rm -f Makefile config.h conftest*; exit 1' 1 3 15
  2014. XVERSION='$VERSION'
  2015. XCC='$CC'
  2016. XCPP='$CPP'
  2017. XAWK='$AWK'
  2018. XINSTALL='$INSTALL'
  2019. XINSTALL_PROGRAM='$INSTALL_PROGRAM'
  2020. XINSTALL_DATA='$INSTALL_DATA'
  2021. XLIBS='$LIBS'
  2022. Xsrcdir='$srcdir'
  2023. Xprefix='$prefix'
  2024. Xexec_prefix='$exec_prefix'
  2025. Xprsub='$prsub'
  2026. XEOF
  2027. Xcat >> config.status <<\EOF
  2028. X
  2029. Xtop_srcdir=$srcdir
  2030. Xfor file in .. Makefile; do if [ "x$file" != "x.." ]; then
  2031. X  srcdir=$top_srcdir
  2032. X  # Remove last slash and all that follows it.  Not all systems have dirname.
  2033. X  dir=`echo $file|sed 's%/[^/][^/]*$%%'`
  2034. X  if test "$dir" != "$file"; then
  2035. X    test "$top_srcdir" != . && srcdir=$top_srcdir/$dir
  2036. X    test ! -d $dir && mkdir $dir
  2037. X  fi
  2038. X  echo creating $file
  2039. X  rm -f $file
  2040. X  echo "# Generated automatically from `echo $file|sed 's|.*/||'`.in by configure." > $file
  2041. X  sed -e "
  2042. X$prsub
  2043. Xs%@VERSION@%$VERSION%g
  2044. Xs%@CC@%$CC%g
  2045. Xs%@CPP@%$CPP%g
  2046. Xs%@AWK@%$AWK%g
  2047. Xs%@INSTALL@%$INSTALL%g
  2048. Xs%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
  2049. Xs%@INSTALL_DATA@%$INSTALL_DATA%g
  2050. Xs%@LIBS@%$LIBS%g
  2051. Xs%@srcdir@%$srcdir%g
  2052. Xs%@DEFS@%-DHAVE_CONFIG_H%" $top_srcdir/${file}.in >> $file
  2053. Xfi; done
  2054. X
  2055. Xecho creating config.h
  2056. X# These sed commands are put into SEDDEFS when defining a macro.
  2057. X# They are broken into pieces to make the sed script easier to manage.
  2058. X# They are passed to sed as "A NAME B NAME C VALUE D", where NAME
  2059. X# is the cpp macro being defined and VALUE is the value it is being given.
  2060. X# Each defining turns into a single global substitution command.
  2061. X#
  2062. X# SEDd sets the value in "#define NAME VALUE" lines.
  2063. XSEDdA='s@^\([     ]*\)#\([     ]*define[     ][     ]*\)'
  2064. XSEDdB='\([     ][     ]*\)[^     ]*@\1#\2'
  2065. XSEDdC='\3'
  2066. XSEDdD='@g'
  2067. X# SEDu turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
  2068. XSEDuA='s@^\([     ]*\)#\([     ]*\)undef\([     ][     ]*\)'
  2069. XSEDuB='\([     ]\)@\1#\2define\3'
  2070. XSEDuC=' '
  2071. XSEDuD='\4@g'
  2072. X# SEDe turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
  2073. XSEDeA='s@^\([     ]*\)#\([     ]*\)undef\([     ][     ]*\)'
  2074. XSEDeB='$@\1#\2define\3'
  2075. XSEDeC=' '
  2076. XSEDeD='@g'
  2077. Xrm -f conftest.sed
  2078. Xcat > conftest.sed <<CONFEOF
  2079. XEOF
  2080. X# Turn off quoting long enough to insert the sed commands.
  2081. Xcat >> config.status <<EOF
  2082. X$SEDDEFS
  2083. XEOF
  2084. Xcat >> config.status <<\EOF
  2085. XCONFEOF
  2086. Xrm -f conftest.h
  2087. X# Break up the sed commands because old seds have small limits.
  2088. Xcp $top_srcdir/config.h.in conftest.h1
  2089. Xwhile :
  2090. Xdo
  2091. X  lines=`grep -c . conftest.sed`
  2092. X  if test -z "$lines" || test "$lines" -eq 0; then break; fi
  2093. X  rm -f conftest.s1 conftest.s2 conftest.h2
  2094. X  sed 30q conftest.sed > conftest.s1 # Like head -30.
  2095. X  sed 1,30d conftest.sed > conftest.s2 # Like tail +31.
  2096. X  sed -f conftest.s1 < conftest.h1 > conftest.h2
  2097. X  rm -f conftest.s1 conftest.h1 conftest.sed
  2098. X  mv conftest.h2 conftest.h1
  2099. X  mv conftest.s2 conftest.sed
  2100. Xdone
  2101. Xrm -f conftest.sed conftest.h
  2102. Xecho "/* config.h.  Generated automatically by configure.  */" > conftest.h
  2103. Xcat conftest.h1 >> conftest.h
  2104. Xrm -f conftest.h1
  2105. Xif cmp -s config.h conftest.h 2>/dev/null; then
  2106. X  # The file exists and we would not be changing it.
  2107. X  rm -f conftest.h
  2108. Xelse
  2109. X  rm -f config.h
  2110. X  mv conftest.h config.h
  2111. Xfi
  2112. X
  2113. XEOF
  2114. Xchmod +x config.status
  2115. Xtest -n "$no_create" || ./config.status
  2116. X
  2117. X
  2118. X# a hook for preserving undef directive in config.h
  2119. Xif test -z "$no_create" ; then
  2120. Xmv config.h conftest
  2121. Xsed -e 's@^\(.*\)defin.\( .*\) .*/\*\(.*KEEP_UNDEF_HERE\)@\1undef\2    /\*\3@' < conftest > config.h
  2122. Xrm -f conftest
  2123. Xfi
  2124. Xcat >> config.status << EOF
  2125. Xmv config.h conftest
  2126. Xsed -e 's@^\(.*\)defin.\( .*\) .*/\*\(.*KEEP_UNDEF_HERE\)@\1undef\2    /\*\3@' < conftest > config.h
  2127. Xrm -f conftest
  2128. XEOF
  2129. X
  2130. Xecho ""
  2131. Xif test -z "$AWK"; then
  2132. Xecho "!!! Since you have no awk you must copy the files 'comm.h.dist'"
  2133. Xecho "!!! and 'term.h.dist' to 'comm.h' and 'term.h'."
  2134. Xecho "!!! Do _not_ change the user configuration section in config.h!"
  2135. Xecho "Please check the pathnames in the Makefile."
  2136. Xelse
  2137. Xecho "Now please check the pathnames in the Makefile and the user"
  2138. Xecho "configuration section in config.h."
  2139. Xfi
  2140. Xecho "Then type 'make' to make screen. Good luck."
  2141. Xecho ""
  2142. END_OF_FILE
  2143. if test 52835 -ne `wc -c <'configure'`; then
  2144.     echo shar: \"'configure'\" unpacked with wrong size!
  2145. fi
  2146. chmod +x 'configure'
  2147. # end of 'configure'
  2148. fi
  2149. if test -f 'process.c' -a "${1}" != "-c" ; then 
  2150.   echo shar: Will not clobber existing file \"'process.c'\"
  2151. else
  2152. echo shar: Extracting \"'process.c'\" \(52175 characters\)
  2153. sed "s/^X//" >'process.c' <<'END_OF_FILE'
  2154. X/* Copyright (c) 1993
  2155. X *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
  2156. X *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
  2157. X * Copyright (c) 1987 Oliver Laumann
  2158. X *
  2159. X * This program is free software; you can redistribute it and/or modify
  2160. X * it under the terms of the GNU General Public License as published by
  2161. X * the Free Software Foundation; either version 2, or (at your option)
  2162. X * any later version.
  2163. X *
  2164. X * This program is distributed in the hope that it will be useful,
  2165. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  2166. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2167. X * GNU General Public License for more details.
  2168. X *
  2169. X * You should have received a copy of the GNU General Public License
  2170. X * along with this program (see the file COPYING); if not, write to the
  2171. X * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2172. X *
  2173. X ****************************************************************
  2174. X */
  2175. X
  2176. X#include "rcs.h"
  2177. XRCS_ID("$Id: process.c,v 1.12 1993/07/21 15:43:19 mlschroe Exp $ FAU")
  2178. X
  2179. X#include <sys/types.h>
  2180. X#include <sys/stat.h>
  2181. X#include <signal.h>
  2182. X#include <fcntl.h>
  2183. X#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
  2184. X# include <time.h>
  2185. X#endif
  2186. X#include <sys/time.h>
  2187. X#ifndef sun
  2188. X#include <sys/ioctl.h>
  2189. X#endif
  2190. X
  2191. X
  2192. X#include "config.h"
  2193. X#include "screen.h"
  2194. X#include "extern.h"
  2195. X
  2196. X#if defined(sun) && defined(SVR4)
  2197. X# include <sys/stropts.h>
  2198. X#endif
  2199. X
  2200. Xextern struct comm comms[];
  2201. Xextern char *rc_name;
  2202. Xextern char *RcFileName, *home, *extra_incap, *extra_outcap;
  2203. Xextern char *BellString, *ActivityString, *ShellProg, *ShellArgs[];
  2204. Xextern char *hardcopydir, *screenlogdir;
  2205. Xextern char *VisualBellString;
  2206. Xextern int VBellWait, MsgWait, MsgMinWait, SilenceWait;
  2207. Xextern char Esc, MetaEsc;
  2208. Xextern char SockPath[], *SockNamePtr;
  2209. Xextern int TtyMode, auto_detach;
  2210. Xextern int iflag;
  2211. Xextern int default_wrap;
  2212. Xextern int use_hardstatus, visual_bell, default_monitor;
  2213. Xextern int default_startup;
  2214. Xextern int slowpaste, defobuflimit;
  2215. X#ifdef AUTO_NUKE
  2216. Xextern int defautonuke;
  2217. X#endif
  2218. Xextern char screenterm[];
  2219. Xextern int intrc, origintrc; /* display? */
  2220. Xextern struct NewWindow nwin_default, nwin_undef;
  2221. X#ifdef COPY_PASTE
  2222. Xextern int join_with_cr;
  2223. Xextern char mark_key_tab[];
  2224. Xextern char *BufferFile;
  2225. X#endif
  2226. X#ifdef POW_DETACH
  2227. Xextern char *BufferFile, *PowDetachString;
  2228. X#endif
  2229. Xextern time_t Now;
  2230. X
  2231. X
  2232. Xstatic int  CheckArgNum __P((int, char **));
  2233. Xstatic void FreeKey __P((int));
  2234. Xstatic int  NextWindow __P((void));
  2235. Xstatic int  PreviousWindow __P((void));
  2236. Xstatic int  MoreWindows __P((void));
  2237. Xstatic void LogToggle __P((int));
  2238. Xstatic void ShowTime __P((void));
  2239. Xstatic void ShowInfo __P((void));
  2240. Xstatic void SwitchWindow __P((int));
  2241. Xstatic char **SaveArgs __P((char **));
  2242. Xstatic struct win *WindowByName __P((char *));
  2243. Xstatic int  ParseSwitch __P((struct action *, int *));
  2244. Xstatic int  ParseOnOff __P((struct action *, int *));
  2245. Xstatic int  ParseSaveStr __P((struct action *act, char **));
  2246. Xstatic int  ParseNum __P((struct action *act, int *));
  2247. Xstatic int  ParseWinNum __P((struct action *act, int *));
  2248. Xstatic int  ParseOct __P((struct action *act, int *));
  2249. Xstatic char *ParseChar __P((char *, char *));
  2250. Xstatic int  IsNum __P((char *, int));
  2251. Xstatic int  IsNumColon __P((char *, int, char *, int));
  2252. Xstatic void InputColon __P((void));
  2253. Xstatic void Colonfin __P((char *, int));
  2254. Xstatic void InputSelect __P((void));
  2255. Xstatic void InputAKA __P((void));
  2256. Xstatic void AKAfin __P((char *, int));
  2257. X#ifdef COPY_PASTE
  2258. Xstatic void copy_reg_fn __P((char *, int));
  2259. Xstatic void ins_reg_fn __P((char *, int));
  2260. X#endif
  2261. Xstatic void process_fn __P((char *, int));
  2262. X#ifdef PASSWORD
  2263. Xstatic void pass1 __P((char *, int));
  2264. Xstatic void pass2 __P((char *, int));
  2265. X#endif
  2266. X#ifdef POW_DETACH
  2267. Xstatic void pow_detach_fn __P((char *, int));
  2268. X#endif
  2269. X
  2270. X
  2271. X
  2272. Xextern struct display *display, *displays;
  2273. Xextern struct win *fore, *console_window, *windows;
  2274. X
  2275. Xextern char screenterm[], HostName[], version[];
  2276. Xextern struct NewWindow nwin_undef, nwin_default;
  2277. Xextern struct LayFuncs WinLf;
  2278. Xextern struct layer BlankLayer;
  2279. X
  2280. Xextern int Z0width, Z1width;
  2281. Xextern int real_uid, real_gid;
  2282. Xextern int visual_bell, default_monitor;
  2283. X
  2284. X#ifdef NETHACK
  2285. Xextern int nethackflag;
  2286. X#endif
  2287. X
  2288. X
  2289. Xstruct win *wtab[MAXWIN];    /* window table */
  2290. Xstruct action ktab[256];    /* command key translation table */
  2291. X
  2292. X
  2293. X#ifdef MULTIUSER
  2294. Xextern char *multi;
  2295. X#endif
  2296. X#ifdef PASSWORD
  2297. Xint CheckPassword;
  2298. Xchar Password[20];
  2299. X#endif
  2300. X
  2301. X#define MAX_PLOP_DEFS 256
  2302. X
  2303. Xstatic struct plop
  2304. X{
  2305. X  char *buf;
  2306. X  int len;
  2307. X} plop_tab[MAX_PLOP_DEFS];
  2308. X
  2309. X
  2310. Xchar Esc = Ctrl('a');
  2311. Xchar MetaEsc = 'a';
  2312. X#ifdef PTYMODE
  2313. Xint TtyMode = PTYMODE;
  2314. X#else
  2315. Xint TtyMode = 0622;
  2316. X#endif
  2317. Xint hardcopy_append = 0;
  2318. Xint all_norefresh = 0;
  2319. X
  2320. X
  2321. Xchar *noargs[1];
  2322. X
  2323. Xvoid
  2324. XInitKeytab()
  2325. X{
  2326. X  register unsigned int i;
  2327. X
  2328. X  for (i = 0; i < sizeof(ktab)/sizeof(*ktab); i++)
  2329. X    {
  2330. X      ktab[i].nr = RC_ILLEGAL;
  2331. X      ktab[i].args = noargs;
  2332. X    }
  2333. X
  2334. X  ktab['h'].nr = ktab[Ctrl('h')].nr = RC_HARDCOPY;
  2335. X#ifdef BSDJOBS
  2336. X  ktab['z'].nr = ktab[Ctrl('z')].nr = RC_SUSPEND;
  2337. X#endif
  2338. X  ktab['c'].nr = ktab[Ctrl('c')].nr = RC_SCREEN;
  2339. X  ktab[' '].nr = ktab[Ctrl(' ')].nr =
  2340. X    ktab['n'].nr = ktab[Ctrl('n')].nr = RC_NEXT;
  2341. X  ktab['N'].nr = RC_NUMBER;
  2342. X  ktab[Ctrl('h')].nr = ktab[0177].nr = ktab['p'].nr = ktab[Ctrl('p')].nr = RC_PREV;
  2343. X  ktab['k'].nr = ktab[Ctrl('k')].nr = RC_KILL;
  2344. X  ktab['l'].nr = ktab[Ctrl('l')].nr = RC_REDISPLAY;
  2345. X  ktab['w'].nr = ktab[Ctrl('w')].nr = RC_WINDOWS;
  2346. X  ktab['v'].nr = ktab[Ctrl('v')].nr = RC_VERSION;
  2347. X  ktab['q'].nr = ktab[Ctrl('q')].nr = RC_XON;
  2348. X  ktab['s'].nr = ktab[Ctrl('s')].nr = RC_XOFF;
  2349. X  ktab['t'].nr = ktab[Ctrl('t')].nr = RC_TIME;
  2350. X  ktab['i'].nr = ktab[Ctrl('i')].nr = RC_INFO;
  2351. X  ktab['m'].nr = ktab[Ctrl('m')].nr = RC_LASTMSG;
  2352. X  ktab['A'].nr = RC_AKA;
  2353. X#ifdef UTMPOK
  2354. X  ktab['L'].nr = RC_LOGIN;
  2355. X#endif
  2356. X  ktab[','].nr = RC_LICENSE;
  2357. X  ktab['W'].nr = RC_WIDTH;
  2358. X  ktab['.'].nr = RC_DUMPTERMCAP;
  2359. X  ktab[Ctrl('\\')].nr = RC_QUIT;
  2360. X  ktab['d'].nr = ktab[Ctrl('d')].nr = RC_DETACH;
  2361. X  ktab['r'].nr = ktab[Ctrl('r')].nr = RC_WRAP;
  2362. X  ktab['f'].nr = ktab[Ctrl('f')].nr = RC_FLOW;
  2363. X  ktab['C'].nr = RC_CLEAR;
  2364. X  ktab['Z'].nr = RC_RESET;
  2365. X  ktab['H'].nr = RC_LOG;
  2366. X  ktab[(unsigned int)Esc].nr = RC_OTHER;
  2367. X  ktab[(unsigned int)MetaEsc].nr = RC_META;
  2368. X  ktab['M'].nr = RC_MONITOR;
  2369. X  ktab['?'].nr = RC_HELP;
  2370. X  for (i = 0; i < ((MAXWIN < 10) ? MAXWIN : 10); i++)
  2371. X    {
  2372. X      char *args[2], arg1[10];
  2373. X      args[0] = arg1;
  2374. X      args[1] = 0;
  2375. X      sprintf(arg1, "%d", i);
  2376. X      ktab['0' + i].nr = RC_SELECT;
  2377. X      ktab['0' + i].args = SaveArgs(args);
  2378. X    }
  2379. X  ktab[Ctrl('G')].nr = RC_VBELL;
  2380. X  ktab[':'].nr = RC_COLON;
  2381. X#ifdef COPY_PASTE
  2382. X  ktab['['].nr = ktab[Ctrl('[')].nr = RC_COPY;
  2383. X  ktab[']'].nr = ktab[Ctrl(']')].nr = RC_PASTE;
  2384. X  ktab['{'].nr = RC_HISTORY;
  2385. X  ktab['}'].nr = RC_HISTORY;
  2386. X  ktab['>'].nr = RC_WRITEBUF;
  2387. X  ktab['<'].nr = RC_READBUF;
  2388. X  ktab['='].nr = RC_REMOVEBUF;
  2389. X  ktab['\''].nr = ktab['"'].nr = RC_SELECT; /* calling a window by name */
  2390. X#endif
  2391. X#ifdef POW_DETACH
  2392. X  ktab['D'].nr = RC_POW_DETACH;
  2393. X#endif
  2394. X#ifdef LOCK
  2395. X  ktab['x'].nr = ktab[Ctrl('x')].nr = RC_LOCKSCREEN;
  2396. X#endif
  2397. X  ktab['b'].nr = ktab[Ctrl('b')].nr = RC_BREAK;
  2398. X  ktab['B'].nr = RC_POW_BREAK;
  2399. X  ktab['_'].nr = RC_SILENCE;
  2400. X}
  2401. X
  2402. Xstatic void
  2403. XFreeKey(key)
  2404. Xint key;
  2405. X{
  2406. X  char **p;
  2407. X
  2408. X  struct action *act = &ktab[key];
  2409. X  if (act->nr == RC_ILLEGAL)
  2410. X    return;
  2411. X  act->nr = RC_ILLEGAL;
  2412. X  if (act->args == noargs)
  2413. X    return;
  2414. X  for (p = act->args; *p; p++)
  2415. X    free(*p);
  2416. X  free(act->args);
  2417. X  act->args = noargs;
  2418. X}
  2419. X
  2420. Xvoid
  2421. XProcessInput(ibuf, ilen)
  2422. Xchar *ibuf;
  2423. Xint ilen;
  2424. X{
  2425. X  char *s;
  2426. X  int slen;
  2427. X
  2428. X  while (display)
  2429. X    {
  2430. X      fore = d_fore;
  2431. X      slen = ilen;
  2432. X      s = ibuf;
  2433. X      while (ilen > 0)
  2434. X    {
  2435. X      if (*s++ == Esc)
  2436. X        break;
  2437. X      ilen--;
  2438. X    }
  2439. X      slen -= ilen;
  2440. X      while (slen)
  2441. X    Process(&ibuf, &slen);
  2442. X      if (--ilen == 0)
  2443. X    d_ESCseen = 1;
  2444. X      if (ilen <= 0)
  2445. X    return;
  2446. X      DoAction(&ktab[(int)(unsigned char)*s], (int)(unsigned char)*s);
  2447. X      ibuf = s + 1;
  2448. X      ilen--;
  2449. X    }
  2450. X}
  2451. X
  2452. Xint
  2453. XFindCommnr(str)
  2454. Xchar *str;
  2455. X{
  2456. X  int x, m, l = 0, r = RC_LAST;
  2457. X  while (l <= r)
  2458. X    {
  2459. X      m = (l + r) / 2;
  2460. X      x = strcmp(str, comms[m].name);
  2461. X      if (x > 0)
  2462. X    l = m + 1;
  2463. X      else if (x < 0)
  2464. X    r = m - 1;
  2465. X      else
  2466. X    return m;
  2467. X    }
  2468. X  return RC_ILLEGAL;
  2469. X}
  2470. X
  2471. Xstatic int
  2472. XCheckArgNum(nr, args)
  2473. Xint nr;
  2474. Xchar **args;
  2475. X{
  2476. X  int i, n;
  2477. X  static char *argss[] = {"no", "one", "two", "three"};
  2478. X
  2479. X  n = comms[nr].flags & ARGS_MASK;
  2480. X  for (i = 0; args[i]; i++)
  2481. X    ;
  2482. X  if (comms[nr].flags & ARGS_ORMORE)
  2483. X    {
  2484. X      if (i < n)
  2485. X    {
  2486. X      Msg(0, "%s: %s: at least %s argument%s required", rc_name, comms[nr].name, argss[n], n != 1 ? "s" : "");
  2487. X      return -1;
  2488. X    }
  2489. X    }
  2490. X  else if (comms[nr].flags & ARGS_PLUSONE)
  2491. X    {
  2492. X      if (i != n && i != n + 1)
  2493. X    {
  2494. X      Msg(0, "%s: %s: %s or %s argument%s required", rc_name, comms[nr].name, argss[n], argss[n + 1], n != 0 ? "s" : "");
  2495. X          return -1;
  2496. X    }
  2497. X    }
  2498. X  else if (i != n)
  2499. X    {
  2500. X      Msg(0, "%s: %s: %s argument%s required", rc_name, comms[nr].name, argss[n], n != 1 ? "s" : "");
  2501. X      return -1;
  2502. X    }
  2503. X  return 0;
  2504. X}
  2505. X
  2506. X/*ARGSUSED*/
  2507. Xvoid
  2508. XDoAction(act, key)
  2509. Xstruct action *act;
  2510. Xint key;
  2511. X{
  2512. X  int nr = act->nr;
  2513. X  char **args = act->args;
  2514. X  struct win *p;
  2515. X  int i, n, msgok;
  2516. X  char *s;
  2517. X  char ch;
  2518. X
  2519. X  if (nr == RC_ILLEGAL)
  2520. X    {
  2521. X      debug1("key '%c': No action\n", key);
  2522. X      return;
  2523. X    }
  2524. X  n = comms[nr].flags;
  2525. X  if ((n & NEED_DISPLAY) && display == 0)
  2526. X    {
  2527. X      Msg(0, "%s: %s: display required", rc_name, comms[nr].name);
  2528. X      return;
  2529. X    }
  2530. X  if ((n & NEED_FORE) && fore == 0)
  2531. X    {
  2532. X      Msg(0, "%s: %s: window required", rc_name, comms[nr].name);
  2533. X      return;
  2534. X    }
  2535. X  if (CheckArgNum(nr, args))
  2536. X    return;
  2537. X#ifdef MULTIUSER
  2538. X  if (multi && display)
  2539. X    {
  2540. X      if (AclCheckPermCmd(d_user, ACL_EXEC, &comms[nr]))
  2541. X    return;
  2542. X    }
  2543. X#endif /* MULTIUSER */
  2544. X  msgok = display && !*rc_name;
  2545. X  switch(nr)
  2546. X    {
  2547. X    case RC_SELECT:
  2548. X      if (!*args)
  2549. X        InputSelect();
  2550. X      else if (ParseWinNum(act, &n) == 0)
  2551. X        SwitchWindow(n);
  2552. X      break;
  2553. X#ifdef AUTO_NUKE
  2554. X    case RC_DEFAUTONUKE:
  2555. X      if (ParseOnOff(act, &defautonuke) == 0 && msgok)
  2556. X    Msg(0, "Default autonuke turned %s", defautonuke ? "on" : "off");
  2557. X      if (display && *rc_name)
  2558. X    d_auto_nuke = defautonuke;
  2559. X      break;
  2560. X    case RC_AUTONUKE:
  2561. X      if (ParseOnOff(act, &d_auto_nuke) == 0 && msgok)
  2562. X    Msg(0, "Autonuke turned %s", d_auto_nuke ? "on" : "off");
  2563. X      break;
  2564. X#endif
  2565. X    case RC_DUPLICATE:
  2566. X      if (!*args)
  2567. X    {
  2568. X      if (fore->w_dupto >= 0)
  2569. X        Msg(0, "Duplicating output to window %d", fore->w_dupto);
  2570. X      else
  2571. X        Msg(0, "No duplicate from here\n");
  2572. X      break;
  2573. X    }
  2574. X      if (!strcmp(*args, "off"))
  2575. X        {
  2576. X      fore->w_dupto = -1;
  2577. X      break;
  2578. X    }
  2579. X      while (*args)
  2580. X        {
  2581. X      n = WindowByNoN(*args++);
  2582. X          if (n < 0)
  2583. X        {
  2584. X          Msg(0, "Invalid window description");
  2585. X          continue;
  2586. X        }
  2587. X      if ((p = wtab[n]) == 0)
  2588. X        {
  2589. X          Msg(0, "Window %d does not exist", n);
  2590. X          continue;
  2591. X        }
  2592. X      for (nr = fore->w_number; wtab[nr] && wtab[nr]->w_dupto >= 0;nr = wtab[nr]->w_dupto)
  2593. X        {
  2594. X          if (wtab[nr]->w_dupto == n)
  2595. X        {
  2596. X          Msg(0, "Cyclic dup detected\n");
  2597. X          return;
  2598. X        }
  2599. X        }
  2600. X      wtab[n]->w_dupto = fore->w_number;
  2601. X    }
  2602. X      break;
  2603. X    case RC_DEFOBUFLIMIT:
  2604. X      if (ParseNum(act, &defobuflimit) == 0 && msgok)
  2605. X    Msg(0, "Default limit set to %d", defobuflimit);
  2606. X      if (display && *rc_name)
  2607. X    d_obufmax = defobuflimit;
  2608. X      break;
  2609. X    case RC_OBUFLIMIT:
  2610. X      if (*args == 0)
  2611. X    Msg(0, "Limit is %d, current buffer size is %d", d_obufmax, d_obuflen);
  2612. X      else if (ParseNum(act, &d_obufmax) == 0 && msgok)
  2613. X    Msg(0, "Limit set to %d", d_obufmax);
  2614. X      break;
  2615. X    case RC_DUMPTERMCAP:
  2616. X      WriteFile(DUMP_TERMCAP);
  2617. X      break;
  2618. X    case RC_HARDCOPY:
  2619. X      WriteFile(DUMP_HARDCOPY);
  2620. X      break;
  2621. X    case RC_LOG:
  2622. X      n = fore->w_logfp ? 1 : 0;
  2623. X      ParseSwitch(act, &n);
  2624. X      LogToggle(n);
  2625. X      break;
  2626. X#ifdef BSDJOBS
  2627. X    case RC_SUSPEND:
  2628. X      Detach(D_STOP);
  2629. X      break;
  2630. X#endif
  2631. X    case RC_NEXT:
  2632. X      if (MoreWindows())
  2633. X    SwitchWindow(NextWindow());
  2634. X      break;
  2635. X    case RC_PREV:
  2636. X      if (MoreWindows())
  2637. X    SwitchWindow(PreviousWindow());
  2638. X      break;
  2639. X    case RC_KILL:
  2640. X      {
  2641. X    char *name;
  2642. X
  2643. X    n = fore->w_number;
  2644. X#ifdef PSEUDOS
  2645. X    if (fore->w_pwin)
  2646. X      {
  2647. X        FreePseudowin(fore);
  2648. X#ifdef NETHACK
  2649. X        if (nethackflag)
  2650. X          Msg(0, "You have a sad feeling for a moment...");
  2651. X        else
  2652. X#endif
  2653. X        Msg(0, "Filter removed.");
  2654. X        break;
  2655. X      }
  2656. X#endif
  2657. X    name = SaveStr(fore->w_aka);
  2658. X    KillWindow(fore);
  2659. X#ifdef NETHACK
  2660. X    if (nethackflag)
  2661. X      Msg(0, "You destroy poor window %d (%s).", n, name);
  2662. X    else
  2663. X#endif
  2664. X    Msg(0, "Window %d (%s) killed.", n, name);
  2665. X    if (name)
  2666. X      free(name);
  2667. X    break;
  2668. X      }
  2669. X    case RC_QUIT:
  2670. X      Finit(0);
  2671. X      /* NOTREACHED */
  2672. X    case RC_DETACH:
  2673. X      Detach(D_DETACH);
  2674. X      break;
  2675. X#ifdef POW_DETACH
  2676. X    case RC_POW_DETACH:
  2677. X      if (key >= 0)
  2678. X    {
  2679. X      static char buf[2];
  2680. X
  2681. X      buf[0] = key;
  2682. X      Input(buf, 1, pow_detach_fn, INP_RAW);
  2683. X    }
  2684. X      else
  2685. X        Detach(D_POWER); /* detach and kill Attacher's parent */
  2686. X      break;
  2687. X#endif
  2688. X#ifdef COPY_PASTE
  2689. X    case RC_COPY_REG:
  2690. X      if ((s = *args) == NULL)
  2691. X    {
  2692. X      Input("Copy to register:", 1, copy_reg_fn, INP_RAW);
  2693. X      break;
  2694. X    }
  2695. X      if ((s = ParseChar(s, &ch)) == NULL || *s)
  2696. X    {
  2697. X      Msg(0, "%s: copy_reg: character, ^x, or (octal) \\032 expected.",
  2698. X          rc_name);
  2699. X      break;
  2700. X    }
  2701. X      copy_reg_fn(&ch, 0);
  2702. X      break;
  2703. X    case RC_INS_REG:
  2704. X      if ((s = *args) == NULL)
  2705. X    {
  2706. X      Input("Insert from register:", 1, ins_reg_fn, INP_RAW);
  2707. X      break;
  2708. X    }
  2709. X      if ((s = ParseChar(s, &ch)) == NULL || *s)
  2710. X    {
  2711. X      Msg(0, "%s: ins_reg: character, ^x, or (octal) \\032 expected.",
  2712. X          rc_name);
  2713. X      break;
  2714. X    }
  2715. X      ins_reg_fn(&ch, 0);
  2716. X      break;
  2717. X#endif
  2718. X    case RC_REGISTER:
  2719. X      if ((s = ParseChar(*args, &ch)) == NULL || *s)
  2720. X    Msg(0, "%s: register: character, ^x, or (octal) \\032 expected.",
  2721. X        rc_name);
  2722. X      else
  2723. X    {
  2724. X      struct plop *plp = plop_tab + (int)(unsigned char)ch;
  2725. X
  2726. X      if (plp->buf)
  2727. X        free(plp->buf);
  2728. X      plp->buf = SaveStr(args[1]);
  2729. X      plp->len = strlen(args[1]);
  2730. X    }
  2731. X      break;
  2732. X    case RC_PROCESS:
  2733. X      if ((s = *args) == NULL)
  2734. X    {
  2735. X      Input("Process register:", 1, process_fn, INP_RAW);
  2736. X      break;
  2737. X    }
  2738. X      if ((s = ParseChar(s, &ch)) == NULL || *s)
  2739. X    {
  2740. X      Msg(0, "%s: process: character, ^x, or (octal) \\032 expected.",
  2741. X          rc_name);
  2742. X      break;
  2743. X    }
  2744. X      process_fn(&ch, 0);
  2745. X      break;
  2746. X    case RC_REDISPLAY:
  2747. X      Activate(-1);
  2748. X      break;
  2749. X    case RC_WINDOWS:
  2750. X      ShowWindows();
  2751. X      break;
  2752. X    case RC_VERSION:
  2753. X      Msg(0, "screen %s", version);
  2754. X      break;
  2755. X    case RC_TIME:
  2756. X      ShowTime();
  2757. X      break;
  2758. X    case RC_INFO:
  2759. X      ShowInfo();
  2760. X      break;
  2761. X    case RC_OTHER:
  2762. X      if (MoreWindows())
  2763. X    SwitchWindow(d_other ? d_other->w_number : NextWindow());
  2764. X      break;
  2765. X    case RC_META:
  2766. X      ch = Esc;
  2767. X      s = &ch;
  2768. X      n = 1;
  2769. X      Process(&s, &n);
  2770. X      break;
  2771. X    case RC_XON:
  2772. X      ch = Ctrl('q');
  2773. X      s = &ch;
  2774. X      n = 1;
  2775. X      Process(&s, &n);
  2776. X      break;
  2777. X    case RC_XOFF:
  2778. X      ch = Ctrl('s');
  2779. X      s = &ch;
  2780. X      n = 1;
  2781. X      Process(&s, &n);
  2782. X      break;
  2783. X    case RC_POW_BREAK:
  2784. X    case RC_BREAK:
  2785. X      n = 0;
  2786. X      if (*args && ParseNum(act, &n))
  2787. X    break;
  2788. X      SendBreak(fore, n, nr == RC_POW_BREAK);
  2789. X      break;
  2790. X#ifdef LOCK
  2791. X    case RC_LOCKSCREEN:
  2792. X      Detach(D_LOCK);
  2793. X      break;
  2794. X#endif
  2795. X    case RC_WIDTH:
  2796. X      if (*args)
  2797. X    {
  2798. X      if (ParseNum(act, &n))
  2799. X        break;
  2800. X    }
  2801. X      else
  2802. X    {
  2803. X      if (d_width == Z0width)
  2804. X        n = Z1width;
  2805. X      else if (d_width == Z1width)
  2806. X        n = Z0width;
  2807. X      else if (d_width > (Z0width + Z1width) / 2)
  2808. X        n = Z0width;
  2809. X      else
  2810. X        n = Z1width;
  2811. X    }
  2812. X      if (n <= 0)
  2813. X        {
  2814. X      Msg(0, "Illegal width");
  2815. X      break;
  2816. X    }
  2817. X      if (n == d_width)
  2818. X    break;
  2819. X      if (ResizeDisplay(n, d_height) == 0)
  2820. X    {
  2821. X      DoResize(d_width, d_height);
  2822. X      Activate(d_fore ? d_fore->w_norefresh : 0);
  2823. X    }
  2824. X      else
  2825. X    Msg(0, "Your termcap does not specify how to change the terminal's width to %d.", n);
  2826. X      break;
  2827. X    case RC_HEIGHT:
  2828. X      if (*args)
  2829. X    {
  2830. X      if (ParseNum(act, &n))
  2831. X        break;
  2832. X    }
  2833. X      else
  2834. X    {
  2835. X#define H0height 42
  2836. X#define H1height 24
  2837. X      if (d_height == H0height)
  2838. X        n = H1height;
  2839. X      else if (d_height == H1height)
  2840. X        n = H0height;
  2841. X      else if (d_height > (H0height + H1height) / 2)
  2842. X        n = H0height;
  2843. X      else
  2844. X        n = H1height;
  2845. X    }
  2846. X      if (n <= 0)
  2847. X        {
  2848. X      Msg(0, "Illegal height");
  2849. X      break;
  2850. X    }
  2851. X      if (n == d_height)
  2852. X    break;
  2853. X      if (ResizeDisplay(d_width, n) == 0)
  2854. X    {
  2855. X      DoResize(d_width, d_height);
  2856. X      Activate(d_fore ? d_fore->w_norefresh : 0);
  2857. X    }
  2858. X      else
  2859. X    Msg(0, "Your termcap does not specify how to change the terminal's height to %d.", n);
  2860. X      break;
  2861. X    case RC_AKA:
  2862. X      if (*args == 0)
  2863. X    InputAKA();
  2864. X      else
  2865. X    ChangeAKA(fore, *args, 20);
  2866. X      break;
  2867. X    case RC_COLON:
  2868. X      InputColon();
  2869. X      break;
  2870. X    case RC_LASTMSG:
  2871. X      if (d_status_lastmsg)
  2872. X    Msg(0, "%s", d_status_lastmsg);
  2873. X      break;
  2874. X    case RC_SCREEN:
  2875. X      DoScreen("key", args);
  2876. X      break;
  2877. X    case RC_WRAP:
  2878. X      if (ParseSwitch(act, &fore->w_wrap) == 0 && msgok)
  2879. X        Msg(0, "%cwrap", fore->w_wrap ? '+' : '-');
  2880. X      break;
  2881. X    case RC_FLOW:
  2882. X      if (*args)
  2883. X    {
  2884. X      if (args[0][0] == 'a')
  2885. X        {
  2886. X          fore->w_flow = (fore->w_flow & FLOW_AUTO) ? FLOW_AUTOFLAG |FLOW_AUTO|FLOW_NOW : FLOW_AUTOFLAG;
  2887. X        }
  2888. X      else
  2889. X        {
  2890. X          if (ParseOnOff(act, &n))
  2891. X        break;
  2892. X          fore->w_flow = (fore->w_flow & FLOW_AUTO) | n;
  2893. X        }
  2894. X    }
  2895. X      else
  2896. X    {
  2897. X      if (fore->w_flow & FLOW_AUTOFLAG)
  2898. X        fore->w_flow = (fore->w_flow & FLOW_AUTO) | FLOW_NOW;
  2899. X      else if (fore->w_flow & FLOW_NOW)
  2900. X        fore->w_flow &= ~FLOW_NOW;
  2901. X      else
  2902. X        fore->w_flow = fore->w_flow ? FLOW_AUTOFLAG|FLOW_AUTO|FLOW_NOW : FLOW_AUTOFLAG;
  2903. X    }
  2904. X      SetFlow(fore->w_flow & FLOW_NOW);
  2905. X      if (msgok)
  2906. X    Msg(0, "%cflow%s", (fore->w_flow & FLOW_NOW) ? '+' : '-',
  2907. X        (fore->w_flow & FLOW_AUTOFLAG) ? "(auto)" : "");
  2908. X      break;
  2909. X    case RC_WRITELOCK:
  2910. X      if (*args)
  2911. X    {
  2912. X      if (args[0][0] == 'a')
  2913. X        {
  2914. X          fore->w_wlock = WLOCK_AUTO;
  2915. X        }
  2916. X      else
  2917. X        {
  2918. X          if (ParseOnOff(act, &n))
  2919. X        break;
  2920. X          fore->w_wlock = n ? WLOCK_ON : WLOCK_OFF;
  2921. X        }
  2922. X    }
  2923. X      fore->w_wlockuser = d_user;
  2924. X      Msg(0, "writelock %s", (fore->w_wlock == WLOCK_AUTO) ? "auto" :
  2925. X      ((fore->w_wlock == WLOCK_OFF) ? "off" : "on"));
  2926. X      break;
  2927. X    case RC_CLEAR:
  2928. X      if (fore->w_state == LIT)
  2929. X    WriteString(fore, "\033[H\033[J", 6);
  2930. X      break;
  2931. X    case RC_RESET:
  2932. X      if (fore->w_state == LIT)
  2933. X    WriteString(fore, "\033c", 2);
  2934. X      break;
  2935. X    case RC_MONITOR:
  2936. X      n = fore->w_monitor == MON_ON;
  2937. X      if (ParseSwitch(act, &n))
  2938. X    break;
  2939. X      if (n)
  2940. X    {
  2941. X      fore->w_monitor = MON_ON;
  2942. X#ifdef NETHACK
  2943. X      if (nethackflag)
  2944. X        Msg(0, "You feel like someone is watching you...");
  2945. X      else
  2946. X#endif
  2947. X        Msg(0, "Window %d (%s) is now being monitored for all activity.", 
  2948. X        fore->w_number, fore->w_aka);
  2949. X    }
  2950. X      else
  2951. X    {
  2952. X      fore->w_monitor = MON_OFF;
  2953. X#ifdef NETHACK
  2954. X      if (nethackflag)
  2955. X        Msg(0, "You no longer sense the watcher's presence.");
  2956. X      else
  2957. X#endif
  2958. X        Msg(0, "Window %d (%s) is no longer being monitored for activity.", 
  2959. X        fore->w_number, fore->w_aka);
  2960. X    }
  2961. X      break;
  2962. X    case RC_HELP:
  2963. X      display_help();
  2964. X      break;
  2965. X    case RC_LICENSE:
  2966. X      display_copyright();
  2967. X      break;
  2968. X#ifdef COPY_PASTE
  2969. X    case RC_COPY:
  2970. X      if (d_layfn != &WinLf)
  2971. X    {
  2972. X      Msg(0, "Must be on a window layer");
  2973. X      break;
  2974. X    }
  2975. X      MarkRoutine();
  2976. X      break;
  2977. X    case RC_HISTORY:
  2978. X      if (d_layfn != &WinLf)
  2979. X    {
  2980. X      Msg(0, "Must be on a window layer");
  2981. X      break;
  2982. X    }
  2983. X      if (GetHistory())
  2984. X    if (d_copybuffer != NULL)
  2985. X      {
  2986. X        fore->w_pastebuffer = d_copybuffer;
  2987. X        fore->w_pastelen = d_copylen;
  2988. X      }
  2989. X      break;
  2990. X    case RC_PASTE:
  2991. X      if (d_copybuffer == NULL)
  2992. X    {
  2993. X#ifdef NETHACK
  2994. X      if (nethackflag)
  2995. X        Msg(0, "Nothing happens.");
  2996. X      else
  2997. X#endif
  2998. X      Msg(0, "empty buffer");
  2999. X      break;
  3000. X    }
  3001. X      fore->w_pastebuffer = d_copybuffer;
  3002. X      fore->w_pastelen = d_copylen;
  3003. X      break;
  3004. X    case RC_WRITEBUF:
  3005. X      if (d_copybuffer == NULL)
  3006. X    {
  3007. X#ifdef NETHACK
  3008. X      if (nethackflag)
  3009. X        Msg(0, "Nothing happens.");
  3010. X      else
  3011. X#endif
  3012. X      Msg(0, "empty buffer");
  3013. X      break;
  3014. X    }
  3015. X      WriteFile(DUMP_EXCHANGE);
  3016. X      break;
  3017. X    case RC_READBUF:
  3018. X      ReadFile();
  3019. X      break;
  3020. X    case RC_REMOVEBUF:
  3021. X      KillBuffers();
  3022. X      break;
  3023. X#endif                /* COPY_PASTE */
  3024. X    case RC_ESCAPE:
  3025. X      FreeKey((int)(unsigned char)Esc);
  3026. X      FreeKey((int)(unsigned char)MetaEsc);
  3027. X      if (ParseEscape(*args))
  3028. X    {
  3029. X      Msg(0, "%s: two characters required after escape.", rc_name);
  3030. X      break;
  3031. X    }
  3032. X      FreeKey((int)(unsigned char)Esc);
  3033. X      FreeKey((int)(unsigned char)MetaEsc);
  3034. X      ktab[(int)(unsigned char)Esc].nr = RC_OTHER;
  3035. X      ktab[(int)(unsigned char)MetaEsc].nr = RC_META;
  3036. X      break;
  3037. X    case RC_CHDIR:
  3038. X      s = *args ? *args : home;
  3039. X      if (chdir(s) == -1)
  3040. X    Msg(errno, "%s", s);
  3041. X      break;
  3042. X    case RC_SHELL:
  3043. X      if (ParseSaveStr(act, &ShellProg) == 0)
  3044. X        ShellArgs[0] = ShellProg;
  3045. X      break;
  3046. X    case RC_HARDCOPYDIR:
  3047. X      (void)ParseSaveStr(act, &hardcopydir);
  3048. X      break;
  3049. X    case RC_LOGDIR:
  3050. X      (void)ParseSaveStr(act, &screenlogdir);
  3051. X      break;
  3052. X    case RC_SHELLAKA:
  3053. X      (void)ParseSaveStr(act, &nwin_default.aka);
  3054. X      break;
  3055. X    case RC_SLEEP:
  3056. X    case RC_TERMCAP:
  3057. X    case RC_TERMINFO:
  3058. X      break;            /* Already handled */
  3059. X    case RC_TERM:
  3060. X      s = NULL;
  3061. X      if (ParseSaveStr(act, &s))
  3062. X    break;
  3063. X      if (strlen(s) >= 20)
  3064. X    {
  3065. X      Msg(0,"%s: term: argument too long ( < 20)", rc_name);
  3066. X      free(s);
  3067. X      break;
  3068. X    }
  3069. X      strcpy(screenterm, s);
  3070. X      free(s);
  3071. X      debug1("screenterm set to %s\n", screenterm);
  3072. X      MakeTermcap(display == 0);
  3073. X      debug("new termcap made\n");
  3074. X      break;
  3075. X    case RC_ECHO:
  3076. X      if (msgok)
  3077. X    {
  3078. X      /*
  3079. X       * d_user typed ^A:echo... well, echo isn't FinishRc's job,
  3080. X       * but as he wanted to test us, we show good will
  3081. X       */
  3082. X      if (*args && (args[1] == 0 || (strcmp(args[1], "-n") == 0 && args[2] == 0)))
  3083. X        Msg(0, "%s", args[1] ? args[1] : *args);
  3084. X      else
  3085. X         Msg(0, "%s: 'echo [-n] \"string\"' expected.", rc_name);
  3086. X    }
  3087. X      break;
  3088. X    case RC_BELL:
  3089. X      (void)ParseSaveStr(act, &BellString);
  3090. X      break;
  3091. X#ifdef COPY_PASTE
  3092. X    case RC_BUFFERFILE:
  3093. X      if (*args == 0)
  3094. X    BufferFile = SaveStr(DEFAULT_BUFFERFILE);
  3095. X      else if (ParseSaveStr(act, &BufferFile))
  3096. X        break;
  3097. X      if (msgok)
  3098. X        Msg(0, "Bufferfile is now '%s'\n", BufferFile);
  3099. X      break;
  3100. X#endif
  3101. X    case RC_ACTIVITY:
  3102. X      (void)ParseSaveStr(act, &ActivityString);
  3103. X      break;
  3104. X#ifdef POW_DETACH
  3105. X    case RC_POW_DETACH_MSG:
  3106. X      (void)ParseSaveStr(act, &PowDetachString);
  3107. X      break;
  3108. X#endif
  3109. X#ifdef UTMPOK
  3110. X    case RC_DEFLOGIN:
  3111. X      (void)ParseOnOff(act, &nwin_default.lflag);
  3112. X      break;
  3113. X    case RC_LOGIN:
  3114. X      n = fore->w_slot != (slot_t)-1;
  3115. X      if (ParseSwitch(act, &n) == 0)
  3116. X        SlotToggle(n);
  3117. X      break;
  3118. X#endif
  3119. X    case RC_DEFFLOW:
  3120. X      if (args[0] && args[1] && args[1][0] == 'i')
  3121. X    {
  3122. X      iflag = 1;
  3123. X      if ((intrc == VDISABLE) && (origintrc != VDISABLE))
  3124. X        {
  3125. X#if defined(TERMIO) || defined(POSIX)
  3126. X          intrc = d_NewMode.tio.c_cc[VINTR] = origintrc;
  3127. X          d_NewMode.tio.c_lflag |= ISIG;
  3128. X#else /* TERMIO || POSIX */
  3129. X          intrc = d_NewMode.m_tchars.t_intrc = origintrc;
  3130. X#endif /* TERMIO || POSIX */
  3131. X
  3132. X          if (display)
  3133. X        SetTTY(d_userfd, &d_NewMode);
  3134. X        }
  3135. X    }
  3136. X      if (args[0] && args[0][0] == 'a')
  3137. X    nwin_default.flowflag = FLOW_AUTOFLAG;
  3138. X      else
  3139. X    (void)ParseOnOff(act, &nwin_default.flowflag);
  3140. X      break;
  3141. X    case RC_DEFWRAP:
  3142. X      (void)ParseOnOff(act, &default_wrap);
  3143. X      break;
  3144. X    case RC_HARDSTATUS:
  3145. X      RemoveStatus();
  3146. X      (void)ParseSwitch(act, &use_hardstatus);
  3147. X      break;
  3148. X    case RC_DEFMONITOR:
  3149. X      if (ParseOnOff(act, &n) == 0)
  3150. X        default_monitor = (n == 0) ? MON_OFF : MON_ON;
  3151. X      break;
  3152. X    case RC_CONSOLE:
  3153. X      n = (console_window != 0);
  3154. X      if (ParseSwitch(act, &n))
  3155. X        break;
  3156. X      if (TtyGrabConsole(fore->w_ptyfd, n, rc_name))
  3157. X    break;
  3158. X      if (n == 0)
  3159. X      Msg(0, "%s: releasing console %s", rc_name, HostName);
  3160. X      else if (console_window)
  3161. X      Msg(0, "%s: stealing console %s from window %d (%s)", rc_name, 
  3162. X          HostName, console_window->w_number, console_window->w_aka);
  3163. X      else
  3164. X      Msg(0, "%s: grabbing console %s", rc_name, HostName);
  3165. X      console_window = n ? fore : 0;
  3166. X      break;
  3167. X    case RC_ALLPARTIAL:
  3168. X      if (ParseOnOff(act, &all_norefresh))
  3169. X    break;
  3170. X      if (all_norefresh)
  3171. X    Msg(0, "No refresh on window change!\n");
  3172. X      else
  3173. X    {
  3174. X      if (fore)
  3175. X        Activate(-1);
  3176. X      Msg(0, "Window specific refresh\n");
  3177. X    }
  3178. X      break;
  3179. X    case RC_PARTIAL:
  3180. X      (void)ParseSwitch(act, &n);
  3181. X      fore->w_norefresh = n;
  3182. X      break;
  3183. X    case RC_VBELL:
  3184. X      if (ParseSwitch(act, &visual_bell) || !msgok)
  3185. X        break;
  3186. X      if (visual_bell == 0)
  3187. X    {
  3188. X#ifdef NETHACK
  3189. X      if (nethackflag)
  3190. X        Msg(0, "Suddenly you can't see your bell!");
  3191. X      else
  3192. X#endif
  3193. X      Msg(0, "switched to audible bell.");
  3194. X    }
  3195. X      else
  3196. X    {
  3197. X#ifdef NETHACK
  3198. X      if (nethackflag)
  3199. X        Msg(0, "Your bell is no longer invisible.");
  3200. X      else
  3201. X#endif
  3202. X      Msg(0, "switched to visual bell.");
  3203. X    }
  3204. X      break;
  3205. X    case RC_VBELLWAIT:
  3206. X      if (ParseNum(act, &VBellWait) == 0 && msgok)
  3207. X        Msg(0, "vbellwait set to %d seconds", VBellWait);
  3208. X      break;
  3209. X    case RC_MSGWAIT:
  3210. X      if (ParseNum(act, &MsgWait) == 0 && msgok)
  3211. X        Msg(0, "msgwait set to %d seconds", MsgWait);
  3212. X      break;
  3213. X    case RC_MSGMINWAIT:
  3214. X      if (ParseNum(act, &MsgMinWait) == 0 && msgok)
  3215. X        Msg(0, "msgminwait set to %d seconds", MsgMinWait);
  3216. X      break;
  3217. X    case RC_SILENCEWAIT:
  3218. X      if ((ParseNum(act, &SilenceWait) == 0) && msgok)
  3219. X        {
  3220. X      if (SilenceWait < 1)
  3221. X        SilenceWait = 1;
  3222. X      for (p = windows; p; p = p->w_next)
  3223. X        if (p->w_tstamp.seconds)
  3224. X          p->w_tstamp.seconds = SilenceWait;
  3225. X      Msg(0, "silencewait set to %d seconds", SilenceWait);
  3226. X    }
  3227. X      break;
  3228. X    case RC_NUMBER:
  3229. X      if (*args == 0)
  3230. X        Msg(0, "This is window %d (%s).\n", fore->w_number, fore->w_aka);
  3231. X      else
  3232. X        {
  3233. X      int old = fore->w_number;
  3234. X
  3235. X      if (ParseNum(act, &n) || n >= MAXWIN)
  3236. X        break;
  3237. X      p = wtab[n];
  3238. X      wtab[n] = fore;
  3239. X      fore->w_number = n;
  3240. X      wtab[old] = p;
  3241. X      if (p)
  3242. X        p->w_number = old;
  3243. X#ifdef MULTIUSER
  3244. X      AclWinSwap(old, n);
  3245. X#endif
  3246. X    }
  3247. X      break;
  3248. X    case RC_SILENCE:
  3249. X      n = fore->w_tstamp.seconds != 0;
  3250. X      i = SilenceWait;
  3251. X      if (args[0] && 
  3252. X          (args[0][0] == '-' || (args[0][0] >= '0' && args[0][0] <= '9')))
  3253. X        {
  3254. X      if (ParseNum(act, &i))
  3255. X        break;
  3256. X      n = i;
  3257. X    }
  3258. X      else if (ParseSwitch(act, &n))
  3259. X        break;
  3260. X      if (n)
  3261. X        {
  3262. X      fore->w_tstamp.lastio = time(0);
  3263. X      fore->w_tstamp.seconds = i;
  3264. X      if (!msgok)
  3265. X        break;
  3266. X#ifdef NETHACK
  3267. X      if (nethackflag)
  3268. X        Msg(0, "You feel like someone is waiting for %d sec. silence...",
  3269. X            fore->w_tstamp.seconds);
  3270. X      else
  3271. X#endif
  3272. X        Msg(0, "Window %d (%s) is now being monitored for %d sec. silence.",
  3273. X            fore->w_number, fore->w_aka, fore->w_tstamp.seconds);
  3274. X    }
  3275. X      else
  3276. X        {
  3277. X      fore->w_tstamp.lastio = (time_t)0;
  3278. X      fore->w_tstamp.seconds = 0;
  3279. X      if (!msgok)
  3280. X        break;
  3281. X#ifdef NETHACK
  3282. X      if (nethackflag)
  3283. X        Msg(0, "You no longer sense the watcher's silence.");
  3284. X      else
  3285. X#endif
  3286. X        Msg(0, "Window %d (%s) is no longer being monitored for silence.", 
  3287. X        fore->w_number, fore->w_aka);
  3288. X    }
  3289. X      break;
  3290. X#ifdef COPY_PASTE
  3291. X    case RC_DEFSCROLLBACK:
  3292. X      (void)ParseNum(act, &nwin_default.histheight);
  3293. X      break;
  3294. X    case RC_SCROLLBACK:
  3295. X      (void)ParseNum(act, &n);
  3296. X      ChangeScrollback(fore, n, d_width);
  3297. X      if (msgok)
  3298. X    Msg(0, "scrollback set to %d", fore->w_histheight);
  3299. X      break;
  3300. X#endif
  3301. X    case RC_SESSIONNAME:
  3302. X      if (*args == 0)
  3303. X    Msg(0, "This session is named '%s'\n", SockNamePtr);
  3304. X      else
  3305. X    {
  3306. X      char buf[MAXPATHLEN];
  3307. X
  3308. X      s = NULL;
  3309. X      if (ParseSaveStr(act, &s))
  3310. X        break;
  3311. X      if (!*s || strlen(s) > MAXPATHLEN - 13)
  3312. X        {
  3313. X          Msg(0, "%s: bad session name '%s'\n", rc_name, s);
  3314. X          free(s);
  3315. X          break;
  3316. X        }
  3317. X      sprintf(buf, "%s", SockPath);
  3318. X      sprintf(buf + (SockNamePtr - SockPath), "%d.%s", getpid(), s); 
  3319. X      free(s);
  3320. X      if ((access(buf, F_OK) == 0) || (errno != ENOENT))
  3321. X        {
  3322. X          Msg(0, "%s: inappropriate path: '%s'.", rc_name, buf);
  3323. X          break;
  3324. X        }
  3325. X      if (rename(SockPath, buf))
  3326. X        {
  3327. X          Msg(errno, "%s: failed to rename(%s, %s)", rc_name, SockPath, buf);
  3328. X          break;
  3329. X        }
  3330. X      debug2("rename(%s, %s) done\n", SockPath, buf);
  3331. X      sprintf(SockPath, "%s", buf);
  3332. X      MakeNewEnv();
  3333. X    }
  3334. X      break;
  3335. X    case RC_SETENV:
  3336. X#ifndef USESETENV
  3337. X    {
  3338. X      char *buf;
  3339. X      int l;
  3340. X
  3341. X      if ((buf = (char *)malloc((l = strlen(args[0])) + 
  3342. X                     strlen(args[1]) + 2)) == NULL)
  3343. X        {
  3344. X          Msg(0, strnomem);
  3345. X          break;
  3346. X        }
  3347. X      strcpy(buf, args[0]);
  3348. X      buf[l] = '=';
  3349. X      strcpy(buf + l + 1, args[1]);
  3350. X      putenv(buf);
  3351. X# ifdef NEEDPUTENV
  3352. X      /*
  3353. X       * we use our own putenv(), knowing that it does a malloc()
  3354. X       * the string space, we can free our buf now. 
  3355. X       */
  3356. X      free(buf);
  3357. X# else /* NEEDSETENV */
  3358. X      /*
  3359. X       * For all sysv-ish systems that link a standard putenv() 
  3360. X       * the string-space buf is added to the environment and must not
  3361. X       * be freed, or modified.
  3362. X       * We are sorry to say that memory is lost here, when setting 
  3363. X       * the same variable again and again.
  3364. X       */
  3365. X# endif /* NEEDSETENV */
  3366. X    }
  3367. X#else /* USESETENV */
  3368. X# if defined(linux) || defined(__386BSD__) || defined(BSDI)
  3369. X      setenv(args[0], args[1], 0);
  3370. X# else
  3371. X      setenv(args[0], args[1]);
  3372. X# endif /* linux || __386BSD__ || BSDI */
  3373. X#endif /* USESETENV */
  3374. X      MakeNewEnv();
  3375. X      break;
  3376. X    case RC_UNSETENV:
  3377. X      unsetenv(*args);
  3378. X      MakeNewEnv();
  3379. X      break;
  3380. X    case RC_SLOWPASTE:
  3381. X      if (ParseNum(act, &slowpaste) == 0 && msgok)
  3382. X    Msg(0, "slowpaste set to %d milliseconds", slowpaste);
  3383. X      break;
  3384. X#ifdef COPY_PASTE
  3385. X    case RC_MARKKEYS:
  3386. X      s = NULL;
  3387. X      if (ParseSaveStr(act, &s))
  3388. X        break;
  3389. X      if (CompileKeys(s, mark_key_tab))
  3390. X    {
  3391. X      Msg(0, "%s: markkeys: syntax error.", rc_name);
  3392. X      free(s);
  3393. X      break;
  3394. X    }
  3395. X      debug1("markkeys %s\n", *args);
  3396. X      free(s);
  3397. X      break;
  3398. X#endif
  3399. X#ifdef NETHACK
  3400. X    case RC_NETHACK:
  3401. X      (void)ParseOnOff(act, &nethackflag);
  3402. X      break;
  3403. X#endif
  3404. X    case RC_HARDCOPY_APPEND:
  3405. X      (void)ParseOnOff(act, &hardcopy_append);
  3406. X      break;
  3407. X    case RC_VBELL_MSG:
  3408. X      (void)ParseSaveStr(act, &VisualBellString);
  3409. X      debug1(" new vbellstr '%s'\n", VisualBellString);
  3410. X      break;
  3411. X    case RC_DEFMODE:
  3412. X      if (ParseOct(act, &n))
  3413. X        break;
  3414. X      if (n < 0 || n > 0777)
  3415. X    {
  3416. X      Msg(0, "%s: mode: Invalid tty mode %o", rc_name, n);
  3417. X          break;
  3418. X    }
  3419. X      TtyMode = n;
  3420. X      if (msgok)
  3421. X    Msg(0, "Ttymode set to %03o", TtyMode);
  3422. X      break;
  3423. X#ifdef COPY_PASTE
  3424. X    case RC_CRLF:
  3425. X      (void)ParseOnOff(act, &join_with_cr);
  3426. X      break;
  3427. X#endif
  3428. X    case RC_AUTODETACH:
  3429. X      (void)ParseOnOff(act, &auto_detach);
  3430. X      break;
  3431. X    case RC_STARTUP_MESSAGE:
  3432. X      (void)ParseOnOff(act, &default_startup);
  3433. X      break;
  3434. X#ifdef PASSWORD
  3435. X    case RC_PASSWORD:
  3436. X      CheckPassword = 1;
  3437. X      if (*args)
  3438. X    {
  3439. X      strncpy(Password, *args, sizeof(Password) - 1);
  3440. X      if (!strcmp(Password, "none"))
  3441. X        CheckPassword = 0;
  3442. X    }
  3443. X      else
  3444. X    {
  3445. X      if (display == 0)
  3446. X        {
  3447. X          debug("prompting for password on no display???\n");
  3448. X          break;
  3449. X        }
  3450. X      Input("New screen password:", sizeof(Password) - 1, pass1, 
  3451. X        INP_NOECHO);
  3452. X    }
  3453. X      break;
  3454. X#endif                /* PASSWORD */
  3455. X    case RC_BIND:
  3456. X      if ((s = ParseChar(*args, &ch)) == NULL || *s)
  3457. X    {
  3458. X      Msg(0, "%s: bind: character, ^x, or (octal) \\032 expected.",
  3459. X          rc_name);
  3460. X      break;
  3461. X    }
  3462. X      n = (unsigned char)ch;
  3463. X      FreeKey(n);
  3464. X      if (args[1])
  3465. X    {
  3466. X      if ((i = FindCommnr(args[1])) == RC_ILLEGAL)
  3467. X        {
  3468. X          Msg(0, "%s: bind: unknown command '%s'", rc_name, args[1]);
  3469. X          break;
  3470. X        }
  3471. X      if (CheckArgNum(i, args + 2))
  3472. X        break;
  3473. X      ktab[n].nr = i;
  3474. X      if (args[2])
  3475. X        ktab[n].args = SaveArgs(args + 2);
  3476. X    }
  3477. X      break;
  3478. X#ifdef MULTIUSER
  3479. X    case RC_ACLCHG:
  3480. X    case RC_ACLADD:
  3481. X    {
  3482. X      struct user **u;
  3483. X      
  3484. X      u = FindUserPtr(args[0]);
  3485. X      UserAdd(args[0], NULL, u);
  3486. X      if (args[1] && args[2])
  3487. X        AclSetPerm(*u, args[1], args[2]);
  3488. X      else
  3489. X        AclSetPerm(*u, "+rwx", "#?"); 
  3490. X      break;
  3491. X    }
  3492. X    case RC_ACLDEL:
  3493. X        {
  3494. X      if (UserDel(args[0], NULL))
  3495. X        break;
  3496. X      if (msgok)
  3497. X        Msg(0, "%s removed from acl database", args[0]);
  3498. X      break;
  3499. X        }
  3500. X    case RC_ACLGRP:
  3501. X        {
  3502. X      break;
  3503. X    }
  3504. X    case RC_MULTIUSER:
  3505. X      if (ParseOnOff(act, &n))
  3506. X    break;
  3507. X      multi = n ? "" : 0;
  3508. X      chsock();
  3509. X      if (msgok)
  3510. X    Msg(0, "Multiuser mode %s", multi ? "enabled" : "disabled");
  3511. X      break;
  3512. X#endif /* MULTIUSER */
  3513. X#ifdef PSEUDOS
  3514. X    case RC_EXEC:
  3515. X      winexec(args);
  3516. X      break;
  3517. X#endif
  3518. X#ifdef MULTI
  3519. X    case RC_CLONE:
  3520. X      execclone(args);
  3521. X      break;
  3522. X#endif
  3523. X    default:
  3524. X      break;
  3525. X    }
  3526. X}
  3527. X
  3528. Xstatic char **
  3529. XSaveArgs(args)
  3530. Xchar **args;
  3531. X{
  3532. X  register char **ap, **pp;
  3533. X  register int argc = 0;
  3534. X
  3535. X  while (args[argc])
  3536. X    argc++;
  3537. X  if ((pp = ap = (char **) malloc((unsigned) (argc + 1) * sizeof(char **))) == 0)
  3538. X    Panic(0, strnomem);
  3539. X  while (argc--)
  3540. X    {
  3541. X      *pp++ = SaveStr(*args++);
  3542. X    }
  3543. X  *pp = 0;
  3544. X  return ap;
  3545. X}
  3546. X
  3547. Xint 
  3548. XParse(buf, args)
  3549. Xchar *buf, **args;
  3550. X{
  3551. X  register char *p = buf, **ap = args;
  3552. X  register int delim, argc;
  3553. X
  3554. X  argc = 0;
  3555. X  for (;;)
  3556. X    {
  3557. X      while (*p && (*p == ' ' || *p == '\t'))
  3558. X    ++p;
  3559. X#ifdef PSEUDOS
  3560. X      if (argc == 0 && (*p == '!' || *p == '|'))
  3561. X    {
  3562. X      *ap++ = "exec";
  3563. X      if (*p == '!')
  3564. X        p++;
  3565. X      while (*p == ' ')
  3566. X        p++;
  3567. X      argc++;
  3568. X    }
  3569. X#endif
  3570. X      if (*p == '\0' || *p == '#')
  3571. X    {
  3572. X      *p = '\0';
  3573. X      args[argc] = 0;
  3574. X      return argc;
  3575. X    }
  3576. X      if (++argc >= MAXARGS)
  3577. X    {
  3578. X      Msg(0, "%s: too many tokens.", rc_name);
  3579. X      return 0;
  3580. X    }
  3581. X      delim = 0;
  3582. X      if (*p == '"' || *p == '\'')
  3583. X    delim = *p++;
  3584. X      *ap++ = p;
  3585. X      while (*p && !(delim ? *p == delim : (*p == ' ' || *p == '\t')))
  3586. X    ++p;
  3587. X      if (*p == '\0')
  3588. X    {
  3589. X      if (delim)
  3590. X        {
  3591. X          Msg(0, "%s: Missing quote.", rc_name);
  3592. X          return 0;
  3593. X        }
  3594. X    }
  3595. X      else
  3596. X        *p++ = '\0';
  3597. X    }
  3598. X}
  3599. X
  3600. Xint 
  3601. XParseEscape(p)
  3602. Xchar *p;
  3603. X{
  3604. X  if ((p = ParseChar(p, &Esc)) == NULL ||
  3605. X      (p = ParseChar(p, &MetaEsc)) == NULL || *p)
  3606. X    return -1;
  3607. X  return 0;
  3608. X}
  3609. X
  3610. Xstatic int
  3611. XParseSwitch(act, var)
  3612. Xstruct action *act;
  3613. Xint *var;
  3614. X{
  3615. X  if (*act->args == 0)
  3616. X    {
  3617. X      *var ^= 1;
  3618. X      return 0;
  3619. X    }
  3620. X  return ParseOnOff(act, var);
  3621. X}
  3622. X
  3623. Xstatic int
  3624. XParseOnOff(act, var)
  3625. Xstruct action *act;
  3626. Xint *var;
  3627. X{
  3628. X  register int num = -1;
  3629. X  char **args = act->args;
  3630. X
  3631. X  if (args[1] == 0)
  3632. X    {
  3633. X      if (strcmp(args[0], "on") == 0)
  3634. X    num = 1;
  3635. X      else if (strcmp(args[0], "off") == 0)
  3636. X    num = 0;
  3637. X    }
  3638. X  if (num < 0)
  3639. X    {
  3640. X      Msg(0, "%s: %s: invalid argument. Give 'on' or 'off'", rc_name, comms[act->nr].name);
  3641. X      return -1;
  3642. X    }
  3643. X  *var = num;
  3644. X  return 0;
  3645. X}
  3646. X
  3647. Xstatic int
  3648. XParseSaveStr(act, var)
  3649. Xstruct action *act;
  3650. Xchar **var;
  3651. X{
  3652. X  char **args = act->args;
  3653. X  if (*args == 0 || args[1])
  3654. X    {
  3655. X      Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name);
  3656. X      return -1;
  3657. X    }
  3658. X  if (*var)
  3659. X    free(*var);
  3660. X  *var = SaveStr(*args);
  3661. X  return 0;
  3662. X}
  3663. X
  3664. Xstatic int
  3665. XParseNum(act, var)
  3666. Xstruct action *act;
  3667. Xint *var;
  3668. X{
  3669. X  int i;
  3670. X  char *p, **args = act->args;
  3671. X
  3672. X  p = *args;
  3673. X  if (p == 0 || *p == 0 || args[1])
  3674. X    {
  3675. X      Msg(0, "%s: %s: invalid argument. Give one argument.",
  3676. X          rc_name, comms[act->nr].name);
  3677. X      return -1;
  3678. X    }
  3679. X  i = 0; 
  3680. X  while (*p)
  3681. X    {
  3682. X      if (*p >= '0' && *p <= '9')
  3683. X    i = 10 * i + (*p - '0');
  3684. X      else
  3685. X    {
  3686. X      Msg(0, "%s: %s: invalid argument. Give numeric argument.",
  3687. X          rc_name, comms[act->nr].name);
  3688. X      return -1;
  3689. X    }    
  3690. X      p++;
  3691. X    }
  3692. X  debug1("ParseNum got %d\n", i);
  3693. X  *var = i;
  3694. X  return 0;
  3695. X}
  3696. X
  3697. Xstatic struct win *
  3698. XWindowByName(s)
  3699. Xchar *s;
  3700. X{
  3701. X  struct win *p;
  3702. X
  3703. X  for (p = windows; p; p = p->w_next)
  3704. X    if (!strncmp(p->w_aka, s, strlen(s)))
  3705. X      return p;
  3706. X  return NULL;
  3707. X}
  3708. X
  3709. X/* 
  3710. X * Get window number from Name or Number string.
  3711. X * Numbers are tried first, then names, a prefix match suffices.
  3712. X * Be careful when assigning numeric strings as WindowTitles.
  3713. X */
  3714. Xint
  3715. XWindowByNoN(str)
  3716. Xchar *str;
  3717. X{
  3718. X  int i;
  3719. X  char *s;
  3720. X  struct win *p;
  3721. X  
  3722. X  for (i = 0, s = str; *s; s++)
  3723. X    {
  3724. X      if (*s < '0' || *s > '9')
  3725. X    break;
  3726. X      i = i * 10 + (*s - '0');
  3727. X    }
  3728. X  if (*s || i < 0 || i >= MAXWIN)
  3729. X    {
  3730. X      if ((p = WindowByName(str)))
  3731. X    return p->w_number;
  3732. X      return -1;
  3733. X    }
  3734. X  return i;
  3735. X}
  3736. X
  3737. Xstatic int
  3738. XParseWinNum(act, var)
  3739. Xstruct action *act;
  3740. Xint *var;
  3741. X{
  3742. X  char **args = act->args;
  3743. X  int i = 0;
  3744. X
  3745. X  if (*args == 0 || args[1])
  3746. X    {
  3747. X      Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name);
  3748. X      return -1;
  3749. X    }
  3750. X  
  3751. X  i = WindowByNoN(*args);
  3752. X  if (i < 0)
  3753. X    {
  3754. X      Msg(0, "%s: %s: invalid argument. Give window number or name.",
  3755. X          rc_name, comms[act->nr].name);
  3756. X      return -1;
  3757. X    }
  3758. X  debug1("ParseWinNum got %d\n", i);
  3759. X  *var = i;
  3760. X  return 0;
  3761. X}
  3762. X
  3763. Xstatic int
  3764. XParseOct(act, var)
  3765. Xstruct action *act;
  3766. Xint *var;
  3767. X{
  3768. X  char *p, **args = act->args;
  3769. X  int i = 0; 
  3770. X
  3771. X  p = *args;
  3772. X  if (p == 0 || *p == 0 || args[1])
  3773. X    {
  3774. X      Msg(0, "%s: %s: invalid argument. Give one octal argument.",
  3775. X          rc_name, comms[act->nr].name);
  3776. X      return -1;
  3777. X    }
  3778. X  while (*p)
  3779. X    {
  3780. X      if (*p >= '0' && *p <= '7')
  3781. X    i = 8 * i + (*p - '0');
  3782. X      else
  3783. X    {
  3784. X      Msg(0, "%s: %s: invalid argument. Give octal argument.",
  3785. X          rc_name, comms[act->nr].name);
  3786. X      return -1;
  3787. X    }    
  3788. X      p++;
  3789. X    }
  3790. X  debug1("ParseOct got %d\n", i);
  3791. X  *var = i;
  3792. X  return 0;
  3793. X}
  3794. X
  3795. Xstatic char *
  3796. XParseChar(p, cp)
  3797. Xchar *p, *cp;
  3798. X{
  3799. X  if (*p == 0)
  3800. X    return 0;
  3801. X  if (*p == '^')
  3802. X    {
  3803. X      if (*++p == '?')
  3804. X        *cp = '\177';
  3805. X      else if (*p >= '@')
  3806. X        *cp = Ctrl(*p);
  3807. X      else
  3808. X        return 0;
  3809. X      ++p;
  3810. X    }
  3811. X  else if (*p == '\\' && *++p <= '7' && *p >= '0')
  3812. X    {
  3813. X      *cp = 0;
  3814. X      do
  3815. X        *cp = *cp * 8 + *p - '0';
  3816. X      while (*++p <= '7' && *p >= '0');
  3817. X    }
  3818. X  else
  3819. X    *cp = *p++;
  3820. X  return p;
  3821. X}
  3822. X
  3823. X
  3824. Xstatic
  3825. Xint IsNum(s, base)
  3826. Xregister char *s;
  3827. Xregister int base;
  3828. X{
  3829. X  for (base += '0'; *s; ++s)
  3830. X    if (*s < '0' || *s > base)
  3831. X      return 0;
  3832. X  return 1;
  3833. X}
  3834. X
  3835. Xstatic int
  3836. XIsNumColon(s, base, p, psize)
  3837. Xint base, psize;
  3838. Xchar *s, *p;
  3839. X{
  3840. X  char *q;
  3841. X  if ((q = rindex(s, ':')) != NULL)
  3842. X    {
  3843. X      strncpy(p, q + 1, psize - 1);
  3844. X      p[psize - 1] = '\0';
  3845. X      *q = '\0';
  3846. X    }
  3847. X  else
  3848. X    *p = '\0';
  3849. X  return IsNum(s, base);
  3850. X}
  3851. X
  3852. Xstatic void
  3853. XSwitchWindow(n)
  3854. Xint n;
  3855. X{
  3856. X  struct win *p;
  3857. X
  3858. X  debug1("SwitchWindow %d\n", n);
  3859. X  if (display == 0)
  3860. X    return;
  3861. X  if (n < 0 || n >= MAXWIN || (p = wtab[n]) == 0)
  3862. X    {
  3863. X      ShowWindows();
  3864. X      return;
  3865. X    }
  3866. X  if (p == d_fore)
  3867. X    {
  3868. X      Msg(0, "This IS window %d (%s).", n, p->w_aka);
  3869. X      return;
  3870. X    }
  3871. X  if (p->w_display)
  3872. X    {
  3873. X      Msg(0, "Window %d (%s) is on another display.", n, p->w_aka);
  3874. X      return;
  3875. X    }
  3876. X  SetForeWindow(p);
  3877. X  Activate(fore->w_norefresh);  
  3878. X}  
  3879. X
  3880. Xvoid
  3881. XSetForeWindow(wi)
  3882. Xstruct win *wi;
  3883. X{
  3884. X  struct win *p, **pp;
  3885. X  struct layer *l;
  3886. X  /*
  3887. X   * If we come from another window, make it inactive.
  3888. X   */
  3889. X  if (display)
  3890. X    {
  3891. X      fore = d_fore;
  3892. X      if (fore)
  3893. X    {
  3894. X      /* release auto writelock when user has no other display here */
  3895. X      if (fore->w_wlock == WLOCK_AUTO && fore->w_wlockuser == d_user)
  3896. X        {
  3897. X          struct display *d;
  3898. X
  3899. X          for (d = displays; d; d = d->_d_next)
  3900. X            if (( d != display) && (d->_d_fore == fore))
  3901. X          break;
  3902. X          debug3("%s %s autolock on win %d\n", 
  3903. X                 d_user->u_name, d?"keeps":"releases", fore->w_number);
  3904. X          if (!d)
  3905. X            fore->w_wlockuser = NULL;
  3906. X        }
  3907. X      /* deactivate old window. */
  3908. X      if (fore->w_tstamp.seconds)
  3909. X        fore->w_tstamp.lastio = Now;
  3910. X      d_other = fore;
  3911. X      fore->w_active = 0;
  3912. X      fore->w_display = 0;
  3913. X    }
  3914. X      else
  3915. X    {
  3916. X      /* put all the display layers on the window. */
  3917. X      for (l = d_lay; l; l = l->l_next)
  3918. X        if (l->l_next == &BlankLayer)
  3919. X          {
  3920. X        l->l_next = wi->w_lay;
  3921. X        wi->w_lay = d_lay;
  3922. X        for (l = d_lay; l != wi->w_lay; l = l->l_next)
  3923. X          l->l_block |= wi->w_lay->l_block;
  3924. X        break;
  3925. X          }
  3926. X    }
  3927. X      d_fore = wi;
  3928. X      if (d_other == wi)
  3929. X    d_other = 0;
  3930. X      d_lay = wi->w_lay;
  3931. X      d_layfn = d_lay->l_layfn;
  3932. X      if ((wi->w_wlock == WLOCK_AUTO) && !wi->w_wlockuser)
  3933. X        {
  3934. X      debug2("%s obtained auto writelock for window %d\n",
  3935. X           d_user->u_name, wi->w_number);
  3936. X          wi->w_wlockuser = d_user;
  3937. X        }
  3938. X    }
  3939. X  fore = wi;
  3940. X  fore->w_display = display;
  3941. X  if (!fore->w_lay)
  3942. X    fore->w_active = 1;
  3943. X  /*
  3944. X   * Place the window at the head of the most-recently-used list.
  3945. X   */
  3946. X  for (pp = &windows; (p = *pp); pp = &p->w_next)
  3947. X    if (p == wi)
  3948. X      break;
  3949. X  ASSERT(p);
  3950. X  *pp = p->w_next;
  3951. X  p->w_next = windows;
  3952. X  windows = p;
  3953. X}
  3954. X
  3955. Xstatic int
  3956. XNextWindow()
  3957. X{
  3958. X  register struct win **pp;
  3959. X  int n = fore ? fore->w_number : 0;
  3960. X
  3961. X  for (pp = wtab + n + 1; pp != wtab + n; pp++)
  3962. X    {
  3963. X      if (pp == wtab + MAXWIN)
  3964. X    pp = wtab;
  3965. X      if (*pp)
  3966. X    break;
  3967. X    }
  3968. X  return pp - wtab;
  3969. X}
  3970. X
  3971. Xstatic int
  3972. XPreviousWindow()
  3973. X{
  3974. X  register struct win **pp;
  3975. X  int n = fore ? fore->w_number : MAXWIN - 1;
  3976. X
  3977. X  for (pp = wtab + n - 1; pp != wtab + n; pp--)
  3978. X    {
  3979. X      if (pp < wtab)
  3980. X    pp = wtab + MAXWIN - 1;
  3981. X      if (*pp)
  3982. X    break;
  3983. X    }
  3984. X  return pp - wtab;
  3985. X}
  3986. X
  3987. Xstatic int
  3988. XMoreWindows()
  3989. X{
  3990. X  if (windows && windows->w_next)
  3991. X    return 1;
  3992. X  if (fore == 0)
  3993. X    {
  3994. X      Msg(0, "No window available");
  3995. X      return 0;
  3996. X    }
  3997. X#ifdef NETHACK
  3998. X  if (nethackflag)
  3999. X    Msg(0, "You cannot escape from window %d!", fore->w_number);
  4000. X  else
  4001. X#endif
  4002. X  Msg(0, "No other window.");
  4003. X  return 0;
  4004. X}
  4005. X
  4006. Xvoid
  4007. XKillWindow(wi)
  4008. Xstruct win *wi;
  4009. X{
  4010. X  struct win **pp, *p;
  4011. X
  4012. X  display = wi->w_display;
  4013. X  if (display)
  4014. X    {
  4015. X      if (wi == d_fore)
  4016. X    {
  4017. X      RemoveStatus();
  4018. X      if (d_lay != &wi->w_winlay)
  4019. X        ExitOverlayPage();
  4020. X      d_fore = 0;
  4021. X      d_lay = &BlankLayer;
  4022. X      d_layfn = BlankLayer.l_layfn;
  4023. X    }
  4024. X    }
  4025. X
  4026. X  for (pp = &windows; (p = *pp); pp = &p->w_next)
  4027. X    if (p == wi)
  4028. X      break;
  4029. X  ASSERT(p);
  4030. X  *pp = p->w_next;
  4031. X  /*
  4032. X   * Remove window from linked list.
  4033. X   */
  4034. X  wi->w_inlen = 0;
  4035. X  wtab[wi->w_number] = 0;
  4036. X  FreeWindow(wi);
  4037. X  /*
  4038. X   * If the foreground window disappeared check the head of the linked list
  4039. X   * of windows for the most recently used window. If no window is alive at
  4040. X   * all, exit.
  4041. X   */
  4042. X  if (display && d_fore)
  4043. X    return;
  4044. X  if (windows == 0)
  4045. X    Finit(0);
  4046. X  SwitchWindow(windows->w_number);
  4047. X}
  4048. X
  4049. Xstatic void
  4050. XLogToggle(on)
  4051. Xint on;
  4052. X{
  4053. X  char buf[1024];
  4054. X
  4055. X  if ((fore->w_logfp != 0) == on)
  4056. X    {
  4057. X      if (display && !*rc_name)
  4058. X    Msg(0, "You are %s logging.", on ? "already" : "not");
  4059. X      return;
  4060. X    }
  4061. X  if (screenlogdir)
  4062. X    sprintf(buf, "%s/screenlog.%d", screenlogdir, fore->w_number);
  4063. X  else
  4064. X    sprintf(buf, "screenlog.%d", fore->w_number);
  4065. X  if (fore->w_logfp != NULL)
  4066. X    {
  4067. X#ifdef NETHACK
  4068. X      if (nethackflag)
  4069. X    Msg(0, "You put away your scroll of logging named \"%s\".", buf);
  4070. X      else
  4071. X#endif
  4072. X      Msg(0, "Logfile \"%s\" closed.", buf);
  4073. X      fclose(fore->w_logfp);
  4074. X      fore->w_logfp = NULL;
  4075. X      return;
  4076. X    }
  4077. X  if ((fore->w_logfp = secfopen(buf, "a")) == NULL)
  4078. X    {
  4079. X#ifdef NETHACK
  4080. X      if (nethackflag)
  4081. X    Msg(0, "You don't seem to have a scroll of logging named \"%s\".", buf);
  4082. X      else
  4083. X#endif
  4084. X      Msg(errno, "Error opening logfile \"%s\"", buf);
  4085. X      return;
  4086. X    }
  4087. X#ifdef NETHACK
  4088. X  if (nethackflag)
  4089. X    Msg(0, "You %s your scroll of logging named \"%s\".",
  4090. X    ftell(fore->w_logfp) ? "add to" : "start writing on", buf);
  4091. X  else
  4092. X#endif
  4093. X  Msg(0, "%s logfile \"%s\"", ftell(fore->w_logfp) ? "Appending to" : "Creating", buf);
  4094. X}
  4095. X
  4096. Xvoid
  4097. XShowWindows()
  4098. X{
  4099. X  char buf[1024];
  4100. X  register char *s, *ss;
  4101. X  register struct win **pp, *p;
  4102. X  register char *cmd;
  4103. X
  4104. X  ASSERT(display);
  4105. X  s = ss = buf;
  4106. X  for (pp = wtab; pp < wtab + MAXWIN; pp++)
  4107. X    {
  4108. X      if ((p = *pp) == 0)
  4109. X    continue;
  4110. X
  4111. X      cmd = p->w_aka;
  4112. X      if (s - buf + strlen(cmd) > sizeof(buf) - 6)
  4113. X    break;
  4114. X      if (s > buf)
  4115. X    {
  4116. X      *s++ = ' ';
  4117. X      *s++ = ' ';
  4118. X    }
  4119. X      sprintf(s, "%d", p->w_number);
  4120. X      s += strlen(s);
  4121. X      if (p == fore)
  4122. X    {
  4123. X      ss = s;
  4124. X      *s++ = '*';
  4125. X    }
  4126. X      else if (p == d_other)
  4127. X    *s++ = '-';
  4128. X      if (p->w_display && p->w_display != display)
  4129. X    *s++ = '&';
  4130. X      if (p->w_monitor == MON_DONE || p->w_monitor == MON_MSG)
  4131. X    *s++ = '@';
  4132. X      if (p->w_bell == BELL_DONE || p->w_bell == BELL_MSG)
  4133. X    *s++ = '!';
  4134. X#ifdef UTMPOK
  4135. X      if (p->w_slot != (slot_t) 0 && p->w_slot != (slot_t) -1)
  4136. X    *s++ = '$';
  4137. X#endif
  4138. X      if (p->w_logfp != NULL)
  4139. X    {
  4140. X      strcpy(s, "(L)");
  4141. X      s += 3;
  4142. X    }
  4143. X      *s++ = ' ';
  4144. X      strcpy(s, cmd);
  4145. X      s += strlen(s);
  4146. X      if (p == fore)
  4147. X    {
  4148. X      /* 
  4149. X       * this is usually done by Activate(), but when looking
  4150. X       * on your current window, you may get annoyed, as there is still
  4151. X       * that temporal '!' and '@' displayed.
  4152. X       * So we remove that after displaying it once.
  4153. X       */
  4154. X      p->w_bell = BELL_OFF;
  4155. X      if (p->w_monitor != MON_OFF)
  4156. X        p->w_monitor = MON_ON;
  4157. X    }
  4158. X    }
  4159. X  *s++ = ' ';
  4160. X  *s = '\0';
  4161. X  if (ss - buf > d_width / 2)
  4162. X    {
  4163. X      ss -= d_width / 2;
  4164. X      if (s - ss < d_width)
  4165. X    {
  4166. X      ss = s - d_width;
  4167. X      if (ss < buf)
  4168. X        ss = buf;
  4169. X    }
  4170. X    }
  4171. X  else
  4172. X    ss = buf;
  4173. X  Msg(0, "%s", ss);
  4174. X}
  4175. X
  4176. X
  4177. Xstatic void
  4178. XShowTime()
  4179. X{
  4180. X  char buf[512];
  4181. X  struct tm *tp;
  4182. X  time_t now;
  4183. X
  4184. X  (void) time(&now);
  4185. X  tp = localtime(&now);
  4186. X  sprintf(buf, "%2d:%02d:%02d %s", tp->tm_hour, tp->tm_min, tp->tm_sec,
  4187. X      HostName);
  4188. X#ifdef LOADAV
  4189. X  AddLoadav(buf + strlen(buf));
  4190. X#endif /* LOADAV */
  4191. X  Msg(0, "%s", buf);
  4192. X}
  4193. X
  4194. Xstatic void
  4195. XShowInfo()
  4196. X{
  4197. X  char buf[512], *p;
  4198. X  register struct win *wp = fore;
  4199. X  register int i;
  4200. X
  4201. X  if (wp == 0)
  4202. X    {
  4203. X      Msg(0, "(%d,%d)/(%d,%d) no window", d_x + 1, d_y + 1, d_width, d_height);
  4204. X      return;
  4205. X    }
  4206. X#ifdef COPY_PASTE
  4207. X  sprintf(buf, "(%d,%d)/(%d,%d)+%d %c%sflow %cins %corg %cwrap %capp %clog %cmon %cr",
  4208. X#else
  4209. X  sprintf(buf, "(%d,%d)/(%d,%d) %c%sflow %cins %corg %cwrap %capp %clog %cmon %cr",
  4210. X#endif
  4211. X      wp->w_x + 1, wp->w_y + 1, wp->w_width, wp->w_height,
  4212. X#ifdef COPY_PASTE
  4213. X      wp->w_histheight,
  4214. X#endif
  4215. X      (wp->w_flow & FLOW_NOW) ? '+' : '-',
  4216. X      (wp->w_flow & FLOW_AUTOFLAG) ? "" : ((wp->w_flow & FLOW_AUTO) ? "(+)" : "(-)"),
  4217. X      wp->w_insert ? '+' : '-', wp->w_origin ? '+' : '-',
  4218. X      wp->w_wrap ? '+' : '-', wp->w_keypad ? '+' : '-',
  4219. X      (wp->w_logfp != NULL) ? '+' : '-',
  4220. X      (wp->w_monitor != MON_OFF) ? '+' : '-',
  4221. X      wp->w_norefresh ? '-' : '+');
  4222. X  if (CG0)
  4223. X    {
  4224. X      p = buf + strlen(buf);
  4225. X      sprintf(p, " G%1d [", wp->w_Charset);
  4226. X      for (i = 0; i < 4; i++)
  4227. X    p[i + 5] = wp->w_charsets[i] ? wp->w_charsets[i] : 'B';
  4228. X      p[9] = ']';
  4229. X      p[10] = '\0';
  4230. X    }
  4231. X  Msg(0, "%s", buf);
  4232. X}
  4233. X
  4234. X
  4235. Xstatic void
  4236. XAKAfin(buf, len)
  4237. Xchar *buf;
  4238. Xint len;
  4239. X{
  4240. X  ASSERT(display);
  4241. X  if (len && fore)
  4242. X    ChangeAKA(fore, buf, 20);
  4243. X}
  4244. X
  4245. Xstatic void
  4246. XInputAKA()
  4247. X{
  4248. X  Input("Set window's a.k.a. to: ", 20, AKAfin, INP_COOKED);
  4249. X}
  4250. X
  4251. Xstatic void
  4252. XColonfin(buf, len)
  4253. Xchar *buf;
  4254. Xint len;
  4255. X{
  4256. X  if (len)
  4257. X    RcLine(buf);
  4258. X}
  4259. X
  4260. Xstatic void
  4261. XInputColon()
  4262. X{
  4263. X  Input(":", 100, Colonfin, INP_COOKED);
  4264. X}
  4265. X
  4266. Xstatic void
  4267. XSelectFin(buf, len)
  4268. Xchar *buf;
  4269. Xint len;
  4270. X{
  4271. X  int n;
  4272. X
  4273. X  if (!len || !display)
  4274. X    return;
  4275. X  if ((n = WindowByNoN(buf)) < 0)
  4276. X    return;
  4277. X  SwitchWindow(n);
  4278. X}
  4279. X    
  4280. Xstatic void
  4281. XInputSelect()
  4282. X{
  4283. X  Input("Switch to window: ", 20, SelectFin, INP_COOKED);
  4284. X}
  4285. X
  4286. Xvoid
  4287. XDoScreen(fn, av)
  4288. Xchar *fn, **av;
  4289. X{
  4290. X  struct NewWindow nwin;
  4291. X  register int num;
  4292. X  char buf[20];
  4293. X  char termbuf[25];
  4294. X
  4295. X  nwin = nwin_undef;
  4296. X  termbuf[0] = '\0';
  4297. X  while (av && *av && av[0][0] == '-')
  4298. X    {
  4299. X      switch (av[0][1])
  4300. X    {
  4301. X    case 'f':
  4302. X      switch (av[0][2])
  4303. X        {
  4304. X        case 'n':
  4305. X        case '0':
  4306. X          nwin.flowflag = FLOW_NOW * 0;
  4307. X          break;
  4308. X        case 'y':
  4309. X        case '1':
  4310. X        case '\0':
  4311. X          nwin.flowflag = FLOW_NOW * 1;
  4312. X          break;
  4313. X        case 'a':
  4314. X          nwin.flowflag = FLOW_AUTOFLAG;
  4315. X          break;
  4316. X        default:
  4317. X          break;
  4318. X        }
  4319. X      break;
  4320. X    case 'k':
  4321. X    case 't':
  4322. X      if (av[0][2])
  4323. X        nwin.aka = &av[0][2];
  4324. X      else if (*++av)
  4325. X        nwin.aka = *av;
  4326. X      else
  4327. X        --av;
  4328. X      break;
  4329. X    case 'T':
  4330. X      if (av[0][2])
  4331. X        nwin.term = &av[0][2];
  4332. X      else if (*++av)
  4333. X        nwin.term = *av;
  4334. X      else
  4335. X        --av;
  4336. X      break;
  4337. X    case 'h':
  4338. X      if (av[0][2])
  4339. X        nwin.histheight = atoi(av[0] + 2);
  4340. X      else if (*++av)
  4341. X        nwin.histheight = atoi(*av);
  4342. X      else 
  4343. X        --av;
  4344. X      break;
  4345. X    case 'l':
  4346. X      switch (av[0][2])
  4347. X        {
  4348. X        case 'n':
  4349. X        case '0':
  4350. X          nwin.lflag = 0;
  4351. X          break;
  4352. X        case 'y':
  4353. X        case '1':
  4354. X        case '\0':
  4355. X          nwin.lflag = 1;
  4356. X          break;
  4357. X        default:
  4358. X          break;
  4359. X        }
  4360. X      break;
  4361. X    case 'a':
  4362. X      nwin.aflag = 1;
  4363. X      break;
  4364. X    case 'M':
  4365. X      nwin.monitor = MON_ON;
  4366. Xdebug("nwin.monitor = MON_ON;\n");
  4367. X      break;
  4368. X    default:
  4369. X      Msg(0, "%s: screen: invalid option -%c.", fn, av[0][1]);
  4370. X      break;
  4371. X    }
  4372. X      ++av;
  4373. X    }
  4374. X  num = 0;
  4375. X  if (av && *av && IsNumColon(*av, 10, buf, sizeof(buf)))
  4376. X    {
  4377. X      if (*buf != '\0')
  4378. X    nwin.aka = buf;
  4379. X      num = atoi(*av);
  4380. X      if (num < 0 || num > MAXWIN - 1)
  4381. X    {
  4382. X      Msg(0, "%s: illegal screen number %d.", fn, num);
  4383. X      num = 0;
  4384. X    }
  4385. X      nwin.StartAt = num;
  4386. X      ++av;
  4387. X    }
  4388. X  if (av && *av)
  4389. X    {
  4390. X      nwin.args = av;
  4391. X      if (!nwin.aka)
  4392. X        nwin.aka = Filename(*av);
  4393. X    }
  4394. X  MakeWindow(&nwin);
  4395. X}
  4396. X
  4397. X#ifdef COPY_PASTE
  4398. X/*
  4399. X * CompileKeys must be called before Markroutine is first used.
  4400. X * to initialise the keys with defaults, call CompileKeys(NULL, mark_key_tab);
  4401. X *
  4402. X * s is an ascii string in a termcap-like syntax. It looks like
  4403. X *   "j=u:k=d:l=r:h=l: =.:" and so on...
  4404. X * this example rebinds the cursormovement to the keys u (up), d (down),
  4405. X * l (left), r (right). placing a mark will now be done with ".".
  4406. X */
  4407. Xint
  4408. XCompileKeys(s, array)
  4409. Xchar *s, *array;
  4410. X{
  4411. X  int i;
  4412. X  unsigned char key, value;
  4413. X
  4414. X  if (!s || !*s)
  4415. X    {
  4416. X      for (i = 0; i < 256; i++)
  4417. X        array[i] = i;
  4418. X      return 0;
  4419. X    }
  4420. X  debug1("CompileKeys: '%s'\n", s);
  4421. X  while (*s)
  4422. X    {
  4423. X      s = ParseChar(s, (char *) &key);
  4424. X      if (*s != '=')
  4425. X    return -1;
  4426. X      do 
  4427. X    {
  4428. X          s = ParseChar(++s, (char *) &value);
  4429. X      array[value] = key;
  4430. X    }
  4431. X      while (*s == '=');
  4432. X      if (!*s) 
  4433. X    break;
  4434. X      if (*s++ != ':')
  4435. X    return -1;
  4436. X    }
  4437. X  return 0;
  4438. X}
  4439. X#endif /* COPY_PASTE */
  4440. X
  4441. X/*
  4442. X *  Asynchronous input functions
  4443. X */
  4444. X
  4445. X#ifdef POW_DETACH
  4446. Xstatic void
  4447. Xpow_detach_fn(buf, len)
  4448. Xchar *buf;
  4449. Xint len;
  4450. X{
  4451. X  if (len)
  4452. X    {
  4453. X      *buf = 0;
  4454. X      return;
  4455. X    }
  4456. X  if (ktab[(int)(unsigned char)*buf].nr != RC_POW_DETACH)
  4457. X    {
  4458. X      if (display)
  4459. X        write(d_userfd, "\007", 1);
  4460. X#ifdef NETHACK
  4461. X      if (nethackflag)
  4462. X     Msg(0, "The blast of disintegration whizzes by you!");
  4463. X#endif
  4464. X    }
  4465. X  else
  4466. X    Detach(D_POWER);
  4467. X}
  4468. X#endif /* POW_DETACH */
  4469. X
  4470. X#ifdef COPY_PASTE
  4471. Xstatic void
  4472. Xcopy_reg_fn(buf, len)
  4473. Xchar *buf;
  4474. Xint len;
  4475. X{
  4476. X  struct plop *pp = plop_tab + (int)(unsigned char)*buf;
  4477. X
  4478. X  if (len)
  4479. X    {
  4480. X      *buf = 0;
  4481. X      return;
  4482. X    }
  4483. X  if (pp->buf)
  4484. X    free(pp->buf);
  4485. X  if ((pp->buf = (char *)malloc(d_copylen)) == NULL)
  4486. X    {
  4487. X      Msg(0, strnomem);
  4488. X      return;
  4489. X    }
  4490. X  bcopy(d_copybuffer, pp->buf, d_copylen);
  4491. X  pp->len = d_copylen;
  4492. X  Msg(0, "Copied %d characters into register %c", d_copylen, *buf);
  4493. X}
  4494. X
  4495. Xstatic void
  4496. Xins_reg_fn(buf, len)
  4497. Xchar *buf;
  4498. Xint len;
  4499. X{
  4500. X  struct plop *pp = plop_tab + (int)(unsigned char)*buf;
  4501. X
  4502. X  if (len)
  4503. X    {
  4504. X      *buf = 0;
  4505. X      return;
  4506. X    }
  4507. X  if (pp->buf)
  4508. X    {
  4509. X      fore->w_pastebuffer  = pp->buf;
  4510. X      fore->w_pastelen = pp->len;
  4511. X      return;
  4512. X    }
  4513. X#ifdef NETHACK
  4514. X  if (nethackflag)
  4515. X    Msg(0, "Nothing happens.");
  4516. X  else
  4517. X#endif
  4518. X  Msg(0, "Empty register.");
  4519. X}
  4520. X#endif /* COPY_PASTE */
  4521. X
  4522. Xstatic void
  4523. Xprocess_fn(buf, len)
  4524. Xchar *buf;
  4525. Xint len;
  4526. X{
  4527. X  struct plop *pp = plop_tab + (int)(unsigned char)*buf;
  4528. X
  4529. X  if (len)
  4530. X    {
  4531. X      *buf = 0;
  4532. X      return;
  4533. X    }
  4534. X  if (pp->buf)
  4535. X    {
  4536. X      ProcessInput(pp->buf, pp->len);
  4537. X      return;
  4538. X    }
  4539. X#ifdef NETHACK
  4540. X  if (nethackflag)
  4541. X    Msg(0, "Nothing happens.");
  4542. X  else
  4543. X#endif
  4544. X  Msg(0, "Empty register.");
  4545. X}
  4546. X
  4547. X
  4548. X#ifdef PASSWORD
  4549. X
  4550. X/* ARGSUSED */
  4551. Xstatic void
  4552. Xpass1(buf, len)
  4553. Xchar *buf;
  4554. Xint len;
  4555. X{
  4556. X  strncpy(Password, buf, sizeof(Password) - 1);
  4557. X  Input("Retype new password:", sizeof(Password) - 1, pass2, 1);
  4558. X}
  4559. X
  4560. X/* ARGSUSED */
  4561. Xstatic void
  4562. Xpass2(buf, len)
  4563. Xchar *buf;
  4564. Xint len;
  4565. X{
  4566. X  int st;
  4567. X  char salt[2];
  4568. X
  4569. X  if (buf == 0 || strcmp(Password, buf))
  4570. X    {
  4571. X#ifdef NETHACK
  4572. X      if (nethackflag)
  4573. X    Msg(0, "[ Passwords don't match - your armor crumbles away ]");
  4574. X      else
  4575. X#endif /* NETHACK */
  4576. X        Msg(0, "[ Passwords don't match - checking turned off ]");
  4577. X      CheckPassword = 0;
  4578. X    }
  4579. X  if (Password[0] == '\0')
  4580. X    {
  4581. X      Msg(0, "[ No password - no secure ]");
  4582. X      CheckPassword = 0;
  4583. X    }
  4584. X  for (st = 0; st < 2; st++)
  4585. X    salt[st] = 'A' + (int)((time(0) >> 6 * st) % 26);
  4586. X  strncpy(Password, crypt(Password, salt), sizeof(Password));
  4587. X  if (CheckPassword)
  4588. X    {
  4589. X#ifdef COPY_PASTE
  4590. X      if (d_copybuffer)
  4591. X    free(d_copybuffer);
  4592. X      d_copylen = strlen(Password);
  4593. X      if ((d_copybuffer = (char *) malloc(d_copylen + 1)) == NULL)
  4594. X    {
  4595. X      Msg(0, strnomem);
  4596. X          d_copylen = 0;
  4597. X    }
  4598. X      else
  4599. X    {
  4600. X      strcpy(d_copybuffer, Password);
  4601. X      Msg(0, "[ Password moved into copybuffer ]");
  4602. X    }
  4603. X#else                /* COPY_PASTE */
  4604. X      Msg(0, "[ Crypted password is \"%s\" ]", Password);
  4605. X#endif                /* COPY_PASTE */
  4606. X    }
  4607. X  if (buf)
  4608. X    bzero(buf, strlen(buf));
  4609. X}
  4610. X#endif /* PASSWORD */
  4611. X
  4612. END_OF_FILE
  4613. if test 52175 -ne `wc -c <'process.c'`; then
  4614.     echo shar: \"'process.c'\" unpacked with wrong size!
  4615. fi
  4616. # end of 'process.c'
  4617. fi
  4618. echo shar: End of archive 7 \(of 10\).
  4619. cp /dev/null ark7isdone
  4620. MISSING=""
  4621. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  4622.     if test ! -f ark${I}isdone ; then
  4623.     MISSING="${MISSING} ${I}"
  4624.     fi
  4625. done
  4626. if test "${MISSING}" = "" ; then
  4627.     echo You have unpacked all 10 archives.
  4628.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  4629. else
  4630.     echo You still need to unpack the following archives:
  4631.     echo "        " ${MISSING}
  4632. fi
  4633. ##  End of shell archive.
  4634. exit 0
  4635.