home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / pty / part01 next >
Internet Message Format  |  1991-01-08  |  56KB

  1. Path: j.cc.purdue.edu!mentor.cc.purdue.edu!noose.ecn.purdue.edu!samsung!uunet!papaya.bbn.com!rsalz
  2. From: rsalz@bbn.com (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v23i031:  Run a program under a pty session, Part01/06
  5. Message-ID: <2881@litchi.bbn.com>
  6. Date: 10 Oct 90 14:15:59 GMT
  7. Organization: BBN Systems and Technologies, Cambridge MA
  8. Lines: 1671
  9. Approved: rsalz@uunet.UU.NET
  10. X-Checksum-Snefru: c8bfce4a 3a9f2967 7f682eaf c4c836ba
  11.  
  12. Submitted-by: Dan Bernstein <brnstnd@kramden.acf.nyu.edu>
  13. Posting-number: Volume 23, Issue 31
  14. Archive-name: pty/part01
  15.  
  16. [  This is the Ginsu knife (it slices, it dices, it never rusts) that
  17.    Dan has been talking about in comp.unix.wixards/internals for some
  18.    time now.  It is a mind-blower.  --r$  ]
  19.  
  20. pty - run a program under a pty session
  21.  
  22. pty is meant as the sole interface between pseudo-terminals and the rest
  23. of the system. Some features: improved security; over fifty options for
  24. precise control; session disconnecting and reconnecting; full efficiency
  25. after a reconnect; a gradual upgrade path so that all your old utilities
  26. will work without change; support for applications that need full pty
  27. control; and a reasonably smart install script. Also in this package are
  28. twenty-one utilities, including a ``script'' that actually works.
  29.  
  30. pty has been thoroughly tested on several BSD 4.3-based machines and
  31. tested on several BSD 4.2-based machines. It should be easy to port to
  32. any system supporting pseudo-terminals and UNIX-domain sockets. If you
  33. know any application of ptys that this program can't handle, or if you
  34. have a different machine that would benefit from the modularity and
  35. power of a pty port, please let the author know.
  36.  
  37.  
  38. pty does not work under POSIX-based machines (such as SunOS 4.1), even
  39. when it works perfectly under their predecessors (such as SunOS 4.0.3).
  40. The main problem is POSIX's introduction of sessions and the way it
  41. kills a non-orphaned process in an orphaned process group. There are
  42. other incompatibilities, mostly minor but some (like accounting and
  43. setuid problems) important. The author is working on a POSIX port.
  44.  
  45. #! /bin/sh
  46. # This is a shell archive.  Remove anything before this line, then feed it
  47. # into a shell via "sh file" or similar.  To overwrite existing files,
  48. # type "sh file -c".
  49. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  50. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  51. # Contents:  PACKNOTES README MANIFEST FILES INSTALL patch
  52. #   patch/telnetd.90.06.28.patch util
  53. # Wrapped by rsalz@litchi.bbn.com on Wed Oct 10 10:11:35 1990
  54. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  55. echo If this archive is complete, you will see the following message:
  56. echo '          "shar: End of archive 1 (of 6)."'
  57. if test -f 'PACKNOTES' -a "${1}" != "-c" ; then 
  58.   echo shar: Will not clobber existing file \"'PACKNOTES'\"
  59. else
  60.   echo shar: Extracting \"'PACKNOTES'\" \(1756 characters\)
  61.   sed "s/^X//" >'PACKNOTES' <<'END_OF_FILE'
  62. XBad character 010 in line 384 of "INSTALL".
  63. XBad character 010 in line 385 of "INSTALL".
  64. XBad character 010 in line 401 of "INSTALL".
  65. XBad character 010 in line 402 of "INSTALL".
  66. XBad character 010 in line 428 of "INSTALL".
  67. XBad character 010 in line 429 of "INSTALL".
  68. XBad character 010 in line 443 of "INSTALL".
  69. XBad character 010 in line 444 of "INSTALL".
  70. XBad character 010 in line 467 of "INSTALL".
  71. XBad character 010 in line 468 of "INSTALL".
  72. XFound 10 control chars in "INSTALL"
  73. X
  74. XBad character 07 in line 98 of "util/write.c".
  75. XFound 1 control char in "util/write.c"
  76. X
  77. XBad character 07 in line 30 of "util/lock.c".
  78. XBad character 07 in line 30 of "util/lock.c".
  79. XBad character 07 in line 30 of "util/lock.c".
  80. XBad character 07 in line 30 of "util/lock.c".
  81. XBad character 07 in line 30 of "util/lock.c".
  82. XBad character 07 in line 30 of "util/lock.c".
  83. XBad character 07 in line 30 of "util/lock.c".
  84. XBad character 07 in line 30 of "util/lock.c".
  85. XBad character 07 in line 30 of "util/lock.c".
  86. XBad character 07 in line 30 of "util/lock.c".
  87. XBad character 07 in line 30 of "util/lock.c".
  88. XBad character 07 in line 30 of "util/lock.c".
  89. XBad character 07 in line 30 of "util/lock.c".
  90. XBad character 07 in line 30 of "util/lock.c".
  91. XBad character 07 in line 30 of "util/lock.c".
  92. XBad character 07 in line 30 of "util/lock.c".
  93. XBad character 07 in line 30 of "util/lock.c".
  94. XBad character 07 in line 34 of "util/lock.c".
  95. XBad character 07 in line 36 of "util/lock.c".
  96. XBad character 07 in line 38 of "util/lock.c".
  97. XFound 20 control chars in "util/lock.c"
  98. X
  99. XBad character 07 in line 53 of "util/wall.c".
  100. XFound 1 control char in "util/wall.c"
  101. X
  102. XBad character 010 in line 2 of "util/script.tidy".
  103. XBad character 010 in line 2 of "util/script.tidy".
  104. XFound 2 control chars in "util/script.tidy"
  105. END_OF_FILE
  106.   if test 1756 -ne `wc -c <'PACKNOTES'`; then
  107.     echo shar: \"'PACKNOTES'\" unpacked with wrong size!
  108.   fi
  109.   # end of 'PACKNOTES'
  110. fi
  111. if test -f 'README' -a "${1}" != "-c" ; then 
  112.   echo shar: Will not clobber existing file \"'README'\"
  113. else
  114.   echo shar: Extracting \"'README'\" \(3922 characters\)
  115.   sed "s/^X//" >'README' <<'END_OF_FILE'
  116. Xpty - run a program under a pty session
  117. X
  118. Xpty is meant as the sole interface between pseudo-terminals and the rest
  119. Xof the system. Some features: improved security; over fifty options for
  120. Xprecise control; session disconnecting and reconnecting; full efficiency
  121. Xafter a reconnect; a gradual upgrade path so that all your old utilities
  122. Xwill work without change; support for applications that need full pty
  123. Xcontrol; and a reasonably smart install script. Also in this package are
  124. Xtwenty-one utilities, including a ``script'' that actually works.
  125. X
  126. Xpty has been thoroughly tested on several BSD 4.3-based machines and
  127. Xtested on several BSD 4.2-based machines. It should be easy to port to
  128. Xany system supporting pseudo-terminals and UNIX-domain sockets. If you
  129. Xknow any application of ptys that this program can't handle, or if you
  130. Xhave a different machine that would benefit from the modularity and
  131. Xpower of a pty port, please let the author know.
  132. X
  133. X
  134. Xpty does not work under POSIX-based machines (such as SunOS 4.1), even
  135. Xwhen it works perfectly under their predecessors (such as SunOS 4.0.3).
  136. XThe main problem is POSIX's introduction of sessions and the way it
  137. Xkills a non-orphaned process in an orphaned process group. There are
  138. Xother incompatibilities, mostly minor but some (like accounting and
  139. Xsetuid problems) important. The author is working on a POSIX port.
  140. X
  141. X
  142. Xpty version 3.001, August 21, 1990.
  143. XCopyright (c) 1990, Daniel J. Bernstein.
  144. XAll rights reserved.
  145. X
  146. XThis distribution packaged August 22, 1990.
  147. X
  148. XGeneral layout:
  149. XCHANGES         Description of changes since first distributed version
  150. XCOPYRIGHT       A comprehensible copyright notice
  151. XFILES           File list (used by make shar)
  152. XINSTALL         A script to guide you through compilation and installation
  153. XINSTALLREADABLE INSTALL's information, in a format you can reasonably edit
  154. XMANIFEST        Shipping list
  155. XQUESTIONS       Some questions that pty answers
  156. XREADME          This document
  157. XTESTS           A script to guide you through some tests
  158. XMakefile        Installation commands
  159. X*.c             Programs
  160. X*.h             Header files
  161. Xpty.man         Documentation
  162. Xpatch/*         Patches to other programs to better use pty
  163. Xutil/*          Utilities
  164. X
  165. XBefore you do anything else, run the INSTALL script. It'll guide you
  166. Xthrough compiling and installing pty and the utilities. Then run TESTS
  167. Xto exercise a few of pty's features on your system. patch/ is separate;
  168. Xread patch/README at your leisure.
  169. X
  170. XRead CHANGES for a list of changes. pty -C and pty -W give copyright and
  171. Xwarranty information; pty -H prints a help screen.
  172. X
  173. XNote that INSTALL, util/lock.c, util/script.tidy, util/write.c, and
  174. Xutil/wall.c all contain control characters.
  175. X
  176. X
  177. XKnown problems:
  178. X
  179. XPOSIX compatibility---might as well do complete rewrite
  180. Xlast was removed but is mentioned in INSTALL and INSTALLREADABLE
  181. XINSTALL's usleep test is not accurate in Ultrix 3.1C (aargh)
  182. Xchildsig = SIGCONT for TSTP in master.c?
  183. XPIPE should be handled by finish in sigler.c for NO_FDPASSING folks
  184. Xsesslist gives error for a session directory not yet created
  185. Xpty -H lists /etc/wtmp---guaranteed to confuse some people
  186. XQUESTIONS and TESTS list sed ... | more, race; more should be grep x
  187. Xon cannot chdir to session directory, pty does not restore correctly
  188. X  (set up your session directory correctly!)
  189. X
  190. X
  191. XTODO list:
  192. X
  193. XINSTALLSU script, for the final stages of installation
  194. Xfix PTYDIR propagation into utilities
  195. Xvhangup()? this is a sticky issue. probably not but we'll see
  196. Xlocking on /etc/utmp and /usr/adm/wtmp? not necessary if APPEND works
  197. Xgenerally handle signals better in sigler
  198. Xclean up ``last'' and include it in package
  199. X``detach''? not yet, for reasons discussed in paper
  200. Xmust pty really stop on pty -T ... &?
  201. X``utmpinit'', so that pty and login will get along---generally useful
  202. X
  203. X
  204. XMore comprehensive discussion will be available soon in ``The Design,
  205. XImplementation, and Use of a Pseudo-Terminal Manager.''
  206. END_OF_FILE
  207.   if test 3922 -ne `wc -c <'README'`; then
  208.     echo shar: \"'README'\" unpacked with wrong size!
  209.   fi
  210.   # end of 'README'
  211. fi
  212. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  213.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  214. else
  215.   echo shar: Extracting \"'MANIFEST'\" \(2906 characters\)
  216.   sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  217. X   File Name        Archive #    Description
  218. X----------------------------------------------------------
  219. XPACKNOTES                  1    
  220. XREADME                     1    
  221. XMANIFEST                   1    This shipping list
  222. XCHANGES                    5    
  223. XCOPYRIGHT                  4    
  224. XFILES                      1    
  225. XINSTALL                    1    
  226. XINSTALLREADABLE            2    
  227. XMakefile                   5    
  228. XQUESTIONS                  4    
  229. XTESTS                      4    
  230. Xconfig.h                   3    
  231. Xerr.c                      5    
  232. Xerr.h                      6    
  233. Xfile.h                     6    
  234. Xfile.h.new                 6    
  235. Xfile.h.old                 5    
  236. Xgetopt.h                   6    
  237. Xglobals.c                  5    
  238. Xlogs.c                     3    
  239. Xlogs.h                     6    
  240. Xmaster.c                   2    
  241. Xmaster.h                   6    
  242. Xmisc.c                     5    
  243. Xmisc.h                     6    
  244. Xpatch                      1    
  245. Xpatch/Makefile             4    
  246. Xpatch/README               4    
  247. Xpatch/TELNET.FTP           6    
  248. Xpatch/igntt.c              5    
  249. Xpatch/telnetd.90.06.28.patch  1    
  250. Xpty.1                      3    
  251. Xpty.c                      2    
  252. Xpty.h                      5    
  253. Xsig.c                      4    
  254. Xsig.h                      5    
  255. Xsigler.c                   3    
  256. Xsigler.h                   6    
  257. Xslave.c                    4    
  258. Xslave.h                    6    
  259. Xsock.c                     3    
  260. Xsock.h                     5    
  261. Xtexts.c                    4    
  262. Xtexts.h                    6    
  263. Xtty.c                      3    
  264. Xtty.h                      5    
  265. Xutil                       1    
  266. Xutil/Makefile              3    
  267. Xutil/biff.1                5    
  268. Xutil/biff.c                4    
  269. Xutil/condom                6    
  270. Xutil/condom.1              5    
  271. Xutil/disconnect.1          5    
  272. Xutil/disconnect.c          5    
  273. Xutil/excloff.1             6    
  274. Xutil/excloff.c             6    
  275. Xutil/exclon.1              5    
  276. Xutil/exclon.c              6    
  277. Xutil/lock.1                5    
  278. Xutil/lock.c                5    
  279. Xutil/mesg.1                5    
  280. Xutil/mesg.c                5    
  281. Xutil/reconnect.1           5    
  282. Xutil/reconnect.c           5    
  283. Xutil/script                6    
  284. Xutil/script.1              5    
  285. Xutil/script.tidy           6    
  286. Xutil/script.tidy.1         5    
  287. Xutil/sess                  6    
  288. Xutil/sess.1                5    
  289. Xutil/sesskill.1            5    
  290. Xutil/sesskill.c            5    
  291. Xutil/sesslist.1            5    
  292. Xutil/sesslist.c            4    
  293. Xutil/sessname.1            5    
  294. Xutil/sessname.c            5    
  295. Xutil/sessuser.1            4    
  296. Xutil/sessuser.c            4    
  297. Xutil/sessutil.c            4    
  298. Xutil/sessutil.h            5    
  299. Xutil/tiocsti.1             6    
  300. Xutil/tiocsti.c             6    
  301. Xutil/tty.1                 6    
  302. Xutil/tty.c                 6    
  303. Xutil/u.1                   5    
  304. Xutil/u.c                   5    
  305. Xutil/wall.1                5    
  306. Xutil/wall.c                5    
  307. Xutil/who.1                 5    
  308. Xutil/who.c                 5    
  309. Xutil/write.1               5    
  310. Xutil/write.c               4    
  311. Xutil/xsessutil.c           4    
  312. END_OF_FILE
  313.   if test 2906 -ne `wc -c <'MANIFEST'`; then
  314.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  315.   fi
  316.   # end of 'MANIFEST'
  317. fi
  318. if test -f 'FILES' -a "${1}" != "-c" ; then 
  319.   echo shar: Will not clobber existing file \"'FILES'\"
  320. else
  321.   echo shar: Extracting \"'FILES'\" \(1052 characters\)
  322.   sed "s/^X//" >'FILES' <<'END_OF_FILE'
  323. XCHANGES
  324. XREADME
  325. XFILES
  326. XCOPYRIGHT
  327. XMANIFEST
  328. XINSTALL
  329. XINSTALLREADABLE
  330. XTESTS
  331. XQUESTIONS
  332. XMakefile
  333. Xpty.1
  334. Xconfig.h
  335. Xpty.h
  336. Xsigler.h
  337. Xmaster.h
  338. Xslave.h
  339. Xerr.h
  340. Xtty.h
  341. Xgetopt.h
  342. Xtexts.h
  343. Xsig.h
  344. Xlogs.h
  345. Xfile.h
  346. Xfile.h.old
  347. Xfile.h.new
  348. Xsock.h
  349. Xmisc.h
  350. Xpty.c
  351. Xsigler.c
  352. Xmaster.c
  353. Xslave.c
  354. Xerr.c
  355. Xtty.c
  356. Xtexts.c
  357. Xsig.c
  358. Xglobals.c
  359. Xlogs.c
  360. Xsock.c
  361. Xmisc.c
  362. Xpatch
  363. Xpatch/README
  364. Xpatch/TELNET.FTP
  365. Xpatch/Makefile
  366. Xpatch/telnetd.90.06.28.patch
  367. Xpatch/igntt.c
  368. Xutil
  369. Xutil/Makefile
  370. Xutil/biff.1
  371. Xutil/biff.c
  372. Xutil/condom
  373. Xutil/condom.1
  374. Xutil/disconnect.1
  375. Xutil/disconnect.c
  376. Xutil/excloff.1
  377. Xutil/excloff.c
  378. Xutil/exclon.1
  379. Xutil/exclon.c
  380. Xutil/lock.1
  381. Xutil/lock.c
  382. Xutil/mesg.1
  383. Xutil/mesg.c
  384. Xutil/reconnect.1
  385. Xutil/reconnect.c
  386. Xutil/script
  387. Xutil/script.1
  388. Xutil/script.tidy
  389. Xutil/script.tidy.1
  390. Xutil/sess
  391. Xutil/sess.1
  392. Xutil/sesskill.1
  393. Xutil/sesskill.c
  394. Xutil/sesslist.1
  395. Xutil/sesslist.c
  396. Xutil/sessname.1
  397. Xutil/sessname.c
  398. Xutil/sessuser.1
  399. Xutil/sessuser.c
  400. Xutil/sessutil.c
  401. Xutil/sessutil.h
  402. Xutil/tiocsti.1
  403. Xutil/tiocsti.c
  404. Xutil/tty.1
  405. Xutil/tty.c
  406. Xutil/u.1
  407. Xutil/u.c
  408. Xutil/wall.1
  409. Xutil/wall.c
  410. Xutil/who.1
  411. Xutil/who.c
  412. Xutil/write.1
  413. Xutil/write.c
  414. Xutil/xsessutil.c
  415. END_OF_FILE
  416.   if test 1052 -ne `wc -c <'FILES'`; then
  417.     echo shar: \"'FILES'\" unpacked with wrong size!
  418.   fi
  419.   # end of 'FILES'
  420. fi
  421. if test -f 'INSTALL' -a "${1}" != "-c" ; then 
  422.   echo shar: Will not clobber existing file \"'INSTALL'\"
  423. else
  424.   echo shar: Extracting \"'INSTALL'\" \(25242 characters\)
  425.   sed "s/^X//" >'INSTALL' <<'END_OF_FILE'
  426. X#!/bin/sh
  427. X# This is a shell script. Feed it to sh.
  428. Xecho '
  429. XHi, and welcome to the pty install script.
  430. Xpty is a program for managing pseudo-terminals.
  431. X
  432. XI'\''m not actually going to install anything.
  433. XI'\''ll just guide you through what has to be done,
  434. Xfrom compiling through installation.
  435. X
  436. XOne advantage of this hands-off philosophy is that
  437. Xyou can kill and restart this script at any time.
  438. XYou may prefer to read through INSTALLREADABLE,
  439. Xwhich has the same information.
  440. X
  441. XIn the first part of this script, I'\''ll lead you through configuration.
  442. XFor the moment, don'\''t actually change anything in your system. Just
  443. Xalternate between reading this script and fooling around with the
  444. XMakefile, and I'\''ll remind you later, after compilation, of what has
  445. Xto be changed elsewhere.
  446. X
  447. XI need the following programs: echo, tr [-d], man, sed [-n], grep, test.
  448. X'
  449. X
  450. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  451. X
  452. Xecho '
  453. XThe first versions of pty were designed on a BSD 4.2-based system.
  454. XDuring May 1990 pty 3.0 was written completely from scratch,
  455. Xon a BSD 4.3-based system. It has been thoroughly tested on
  456. Xseveral BSD 4.3-based systems, tested with a few Makefile changes
  457. Xon several BSD 4.2-based systems, and run on at least one mutant.
  458. X
  459. XIf you make it through installation and testing and get pty running,
  460. Xplease send a note to the author, Dan Bernstein, on the Internet
  461. Xat brnstnd@nyu.edu. Let him know your computer model, OS version, and
  462. Xwhat changes you had to make. If you have any trouble, please also get
  463. Xin touch with the author. If you have a different kind of system with
  464. Xpseudo-terminal support that could use a pty port, the author would
  465. Xlove to hear about it.
  466. X
  467. XOne note: Like all software, pty comes without warranty, to the extent
  468. Xpermitted by applicable law. Use it at your own risk.
  469. X'
  470. X
  471. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  472. X
  473. Xecho '
  474. XI assume that you don'\''t want to make any major changes
  475. Xto your computer just to take advantage of pty'\''s capabilities.
  476. XYou might not even have a privileged account, for all I know.
  477. X
  478. XThe first major decision you have to make is what privileges to give pty.
  479. XObviously if you don'\''t have privileges then pty won'\''t either;
  480. Xthis is Case UN.
  481. X'
  482. X
  483. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  484. X
  485. Xecho '
  486. XThere are several good reasons for giving programs privileges.
  487. XMost importantly, privileged programs can precisely control access
  488. Xto a shared resource. pty supports an interactive user list in
  489. X/etc/utmp, a login-logout record in /usr/adm/wtmp, and controlled
  490. Xaccess to the pseudo-terminal files themselves, including security and
  491. Xmode changing. None of these are possible if pty isn'\''t setuid.
  492. X
  493. XIf your system has a lot more tty security than usual, you probably
  494. Xwon'\''t be able to run pty without privileges. (However, if your system
  495. Xhas a lot more tty security than usual, it'\''s almost certainly running
  496. Xpty anyway.)
  497. X'
  498. X
  499. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  500. X
  501. Xecho '
  502. XIf you do want pty to have privileges, you have to decide between
  503. Xsetting up pty as root (Case ROOT) or as some other user, say ``pty'\'\''
  504. X(Case PTY). Staying away from root has the advantage that problems
  505. Xcan'\''t possibly destroy all security in one blow. However, root has
  506. Xseveral advantages, mainly because of BSD limitations: 1. A process
  507. Xcan'\''t change ownership of a file between its euid and uid. Only root
  508. Xcan change ownership. It shouldn'\''t be necessary to change ownership
  509. Xof ptys anyway, but that'\''s what many programs assume. 2. MAXUPRC in
  510. X<sys/param.h> limits the number of processes under a given *effective*
  511. Xuid. This absolutely idiotic behavior is a serious problem for programs
  512. Xsetuid to anything other than root. pty tries to work around this
  513. Xproblem, but there are no true solutions. 3. Despite the documentation
  514. Xin kill(2), many machines don'\''t allow non-root processes to send
  515. XCONT to children with a different uid. Unlike almost all other programs,
  516. Xpty sensibly handles its child stopping and restarting; but this won'\''t
  517. Xwork on those machines if pty isn'\''t root.
  518. X
  519. XYou should decide now between Case ROOT and Case PTY.
  520. X'
  521. X
  522. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  523. X
  524. Xecho '
  525. XWhether you'\''ve decided on ROOT, PTY, or UN,
  526. Xnow is the time to check the security of the entire pty package.
  527. XIt'\''d be difficult for anything to slip through the checks by the
  528. Xauthor, testers, and source group moderator, but you should take
  529. Xat least a moment to look for your pet security peeves.
  530. X
  531. XA couple of security notes: The only open(,O_CREAT) in pty is in
  532. Xmaster.c, at the top of master(), of a file with a very restricted
  533. Xform constructed from the filename of a /dev/ttyxx. There are no
  534. Xcreat()s. The only bind() is in sock.c'\''s pty_readsock(), which is
  535. Xcalled only from master.c'\''s master() to create a socket with a
  536. Xsimilarly restricted name. (fnsty is changed in sigler but not in
  537. Xmaster.) The only exec() is in slave.c, after a forced setreuid()
  538. Xto a uid that is only set to getuid(). unlink(), mkdir(), and rename()
  539. Xare only used with restricted pathnames.
  540. X'
  541. X
  542. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  543. X
  544. Xecho '
  545. XIn Case PTY, you have to set up a new uid, say ``pty'\'\'' (or whatever
  546. Xusername you want). pty should not allow logins. Its password should
  547. Xbe an asterisk; its home directory should be /nonexistent; its shell
  548. Xshould be /bin/true. In other words, the only access to user pty
  549. Xshould be through these setuid programs.
  550. X
  551. XIn any privileged case you should have group tty,
  552. Xwhich most BSD 4.3 systems have as gid 4. 
  553. X'
  554. X
  555. Xecho 'Running '\
  556. X'$ ttygroup="`sed -n '\''s/^tty:[^:]*:\(.*\):.*/\1/p'\'' < /etc/group`" ...'
  557. Xttygroup="`sed -n 's/^tty:[^:]*:\(.*\):.*/\1/p' < /etc/group`"
  558. X
  559. Xcase "$ttygroup" in
  560. X4) echo '
  561. XI see that you have a tty group, 4 as usual. Good.
  562. X' ;;
  563. X'') echo '
  564. XYou don'\''t have a tty group. Unless you have a suitable group under a
  565. Xdifferent name, you should add the line
  566. Xtty:*:4:root
  567. Xto /etc/group.
  568. X' ;;
  569. X*) echo '
  570. XI see that you have a tty group, gid '"$ttygroup"' rather than 4. Okay.
  571. X' ;;
  572. Xesac
  573. X
  574. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  575. X
  576. Xecho '
  577. XNext, we'\''re going to drudge through the config.h file.
  578. X
  579. XIn Cases ROOT or PTY, you have to set up a system-wide directory
  580. Xfor storing information about pty sessions. (A session is a program
  581. Xstuck under a pty that you can disconnect and reconnect.) Users can
  582. Xget around this directory, storing the information in ~/.pty and
  583. Xrevoking any privileges, with pty -xS; you can even make this default
  584. Xby setting flagxsetuid = 0 in globals.c. However, a single system-wide
  585. Xdirectory is safer.
  586. X
  587. XAnyway, that directory, PTYDIR, should be mode 0700, owner root in case
  588. XROOT or pty in case PTY, group irrelevant. PTYDIR is defined in config.h
  589. Xas /usr/etc/pty by default; if you choose a different directory, add
  590. X-DPTYDIR=\"/what/ever/dir/ect/ory\" to CCOPTS in the Makefile.
  591. X
  592. XIn Case UN, you may want to set up a directory ~/PTY inside your home
  593. Xdirectory, and set PTYDIR to that; you may want to set flagxsetuid = 0
  594. Xin globals.c; or you may want to just type -xS to pty all the time. I
  595. Xrecommend the first strategy.
  596. X'
  597. X
  598. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  599. X
  600. Xecho '
  601. XNext come pseudo-terminal pathnames. I assume that your ptys are
  602. Xlabelled as /dev/ptyxx and /dev/ttyxx, where xx is any two-letter
  603. Xextension. pty can support any initial strings instead of these,
  604. Xbut some of the utilities have /dev/tty hardcoded, and lots of other
  605. Xprograms running around assume those names. If you'\''re desperate,
  606. Xdefine DEVMTY and DEVSTY in the Makefile, and figure out what has to
  607. Xbe changed in util/*. (Sorry.)
  608. X'
  609. X
  610. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  611. X
  612. Xecho '
  613. XThe extension is traditionally [p-za-o][0-9a-f]. The first letter of the
  614. Xsecond string is special: if /dev/ttyq0 doesn'\''t exist, for example, then
  615. Xnone of /dev/ttyq[0-9a-f] will be used. (That'\''s called a pty bank.)
  616. X
  617. XYou can change those strings by defining, e.g., PTY1=\"ABCDEFG\" or
  618. XPTY2=\"02468abfq\" in the Makefile. You have at least four choices here:
  619. X1. Give pty its own, new, banks of new pseudo-terminals with weird bank
  620. Xnames not including a through z, and define PTY1 appropriately. pty will
  621. Xonly use those new ptys, and older programs will just use the old ptys.
  622. XThis may require reconfiguring your system for the larger number of
  623. Xterminals. 2. Give pty some new banks, and take out some old ones to
  624. Xmake up for it. 3. Give pty a chunk of the old banks. 4. Give pty all
  625. Xthe old banks.
  626. X
  627. XNote that pty searches randomly through PTY1 and PTY2 by default; for
  628. Xefficiency, PTY1 really should reflect exactly the pty banks you have.
  629. X'
  630. X
  631. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  632. X
  633. Xecho '
  634. XSo now you'\''ve decided on new ptys, or set aside some or all of your
  635. Xold ptys, and changed PTY1 and PTY2 appropriately. Because BSD gives a
  636. Xprocess very little control over its controlling terminal, pty has to
  637. Xpass a terminal name explicitly when it reconnects. If any of your tty
  638. X(not just pseudo-tty!) filenames are longer than 30 characters, you have
  639. Xto set -DTTYNAMELEN=60 (or whatever) in the Makefile.
  640. X'
  641. X
  642. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  643. X
  644. Xecho '
  645. X/etc/utmp has traditionally listed all users logged on.
  646. XThis nebulous concept has evolved through the years; given the way
  647. Xthat most programs use utmp, utmp is probably better defined as a
  648. Xlist of all interactive sessions. Anyway, pty supports this file,
  649. Xand will make an entry in it when given -xu. If you have a different
  650. Xfile, add -DPTYUTMP_FILE=\"/foo/bar/utmp\" to DEFINES in the Makefile.
  651. X
  652. XNote that /etc/utmp is unprotected (mode 666) on Suns. This was Sun'\''s
  653. Xattempt to let unprivileged programs manage the file. Unforunately, this
  654. Xerror in judgment opens up a huge security hole, which even on
  655. Xsingle-user machines is an invitation to make mistakes. I advise you to
  656. Xmake /etc/utmp owned by root in Case ROOT or pty in Case PTY, mode 644.
  657. XThere aren'\''t many unprivileged programs that don'\''t understand the
  658. Xpty interface; people on non-Suns have survived so far, and there'\''s
  659. Xno reason for you to keep subscribing to an insecure model of resource
  660. Xsharing.
  661. X'
  662. X
  663. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  664. X
  665. Xecho '
  666. XAlthough pty will put an entry into utmp, it doesn'\''t really support
  667. Xthe remote-host field. There is no logical association between sessions
  668. Xand connections; why should a login require a pty, and why should a
  669. Xsession only stick around for one connection? So pty just puts "pty" in
  670. Xthe host field. You can change this with -DPTYUTMP_HOST=\"foo\"; you may
  671. Xeven want to make PTY_UTMPHOST call a function that you define.
  672. X
  673. X(Similar comments apply to PTYWTMP_HOST. There are also PTYUTMP_SWHOST
  674. Xand PTYWTMP_SWHOST, defaults PTYUTMP_HOST and "pty-sessuser"
  675. Xrespectively; see util/sessuser.1 for more information.)
  676. X'
  677. X
  678. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  679. X
  680. Xecho '
  681. X/usr/adm/wtmp has traditionally recorded all logins, logouts, reboots,
  682. Xftp sessions, and various other interesting events. (The entry for a
  683. Xline in utmp is the last entry for that line in wtmp.) pty supports wtmp
  684. Xfully, in the same way as utmp. You should make wtmp mode 644, owner
  685. Xroot or pty as appropriate. Change PTYWTMP_FILE if /usr/adm/wtmp is
  686. Xsomewhere else.
  687. X'
  688. X
  689. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  690. X
  691. Xecho '
  692. XYou can turn off utmp support by uncommenting the NO_UTMP line in
  693. Xconfig.h. (Just delete the initial /*.) You can also turn off support
  694. Xfor wtmp, disconnectable sessions, or changing pseudo-terminal file
  695. Xownership; just uncomment the appropriate line. You can force use of
  696. Xeach of these features by defining MUST_UTMP, etc., in the same way.
  697. X
  698. XNote that the usual login programs do their own wtmp management, and
  699. Xmany accounting programs incorrectly equate session time with connect
  700. Xtime, so users will rarely want wtmp. As more programs appear using the
  701. Xpty interface, and as login programs start using a more logical system
  702. Xfor accounting, MUST_WTMP may become an appropriate way to monitor
  703. Xpseudo-terminal usage. For the moment, I do not advise setting any NO
  704. Xor MUST.
  705. X'
  706. X
  707. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  708. X
  709. Xecho '
  710. Xpty subscribes (not very willingly) to the BSD 4.3 model of pty
  711. Xprotection, with a few twists. All ptys are under group tty, at all
  712. Xtimes; if you don'\''t have a tty group, all ptys should be under some
  713. Xother protected group at all times. Anyway, pty will change the group of
  714. Xeach pseudo-terminal file to PTYGROUP, default 4, under -xc.
  715. X'
  716. X
  717. Xcase "$ttygroup" in
  718. X4) echo '
  719. XSince you already have a tty group, gid 4, you'\''re fine.
  720. X' ;;
  721. X'') echo '
  722. XYou don'\''t have a tty group. You should pick a gid and define
  723. X-DPTYGROUP=whatever in the Makefile.
  724. X' ;;
  725. X*) echo '
  726. XYou have a tty group, but it'\''s not gid 4. You should define
  727. X-DPTYGROUP='"$ttygroup"' in the Makefile.
  728. X' ;;
  729. Xesac
  730. X
  731. Xecho '
  732. X(Under Case UN, don'\''t worry about all this group stuff. Just leave
  733. XPTYGROUP alone.)
  734. X'
  735. X
  736. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  737. X
  738. Xecho '
  739. XUnder -xc, pty changes the pseudo-terminal owner to the current real
  740. Xuid. The fact that terminals need to be in the file hierarchy reflects a
  741. Xserious failure in the BSD terminal model; but anyway, many programs
  742. Xexpect to be able to fool around with /dev/tty. After pty is done with
  743. Xthe terminal, it sets the owner back to its effective uid. You can
  744. Xmodify this behavior by changing PTYOWNER from euid to something else.
  745. X
  746. XUnder Case UN, PTYOWNER is irrelevant.
  747. X'
  748. X
  749. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  750. X
  751. Xecho '
  752. XWhile a tty is unused, BSD systems traditionally leave it unprotected.
  753. XUnfortunately, this leaves some huge security holes. Here'\''s one of
  754. Xthe biggest advantages of a privileged pty manager: unused ttys don'\''t
  755. Xhave to be left open for any random program to use. After it'\''s done
  756. Xwith a pseudo-terminal, pty changes it to mode UNUSEDPTYMODE, default
  757. X0600. (This is another case of a poor model for kludging pty support
  758. Xinto unprivileged programs. If you haven'\''t set up separate pty banks
  759. Xfor pty, and you really want to allow unprivileged access to unused
  760. Xptys, try mode 0660 and make those other programs setgid to tty.)
  761. X
  762. XA tty that someone'\''s using can be in many different modes. Typically
  763. XUSEDPTYMODE should be 0600, which means user-only access, messages off,
  764. Xbiff off. If you really, really, really want to make the mistake of
  765. Xhaving messages or biff on by default, try 0620, 0700, or 0720. Note
  766. Xthat the world protection should always be 0: the point of the tty group
  767. Xis that only setgid-tty programs can access ttys.
  768. X
  769. XAs usual, you can'\''t do anything about these in Case UN.
  770. X'
  771. X
  772. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  773. X
  774. Xecho '
  775. XNow we'\''re past generic configuration and down to your system'\''s
  776. Xnitty-gritty.
  777. X
  778. XFor purity, pty has SIGRET_TYPE, default int, as the type returned by a
  779. Xsignal handler. On Suns and ANSI-compliant machines, you should define
  780. XSIGRET_TYPE=void. Then you can admire the lint -haxc *.c output.
  781. X'
  782. X
  783. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  784. X
  785. Xecho '
  786. XOUTBUFSIZE, default 16384, is the size of the buffer pty keeps between
  787. Xthe incoming data and the pseudo-tty, and between the pseudo-tty and the
  788. Xoutgoing data. If you want to spare less than 32K per pty just for
  789. Xbuffer space, feel free to change this.
  790. X'
  791. X
  792. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  793. X
  794. Xecho '
  795. XGENERIC is another concession to ANSI taste. GENERIC * should be a
  796. Xpointer type that any other pointer can be safely converted to and back;
  797. XGENERIC is char by default, but on newer machines can be set to void.
  798. XAs it'\''ll be at least five years before ANSI manages to outlaw char *,
  799. Xand as void * is often invalid, I advise you to leave GENERIC alone.
  800. X'
  801. X
  802. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  803. X
  804. Xecho '
  805. Xpty attempts to forward window-size changes transparently. It also
  806. Xsupports the auxiliary characters structure, which lets you type a
  807. Xsingle character to get system and tty status.
  808. X'
  809. X
  810. Xecho 'Running $ man 4 tty | sed '\''s/_//g'\'' | grep -s winsize'
  811. Xif man 4 tty | sed 's/_//g' | grep -s winsize
  812. Xthen havewin=y; echo '
  813. XI see you have window sizes.
  814. X'
  815. Xelse havewin=n; echo '
  816. XI see you don'\''t have window sizes.
  817. XYou'\''ll have to comment out #define TTY_WINSIZE in config.h.
  818. X(This may be inaccurate on Suns; try grep winsize /usr/include/sys/tt*.h.)
  819. X' 
  820. X     case "$ttygroup" in
  821. X     4) ;;
  822. X     '') echo '(Let me guess: This isn'\''t a BSD 4.3 system.)' ;;
  823. X     *) ;;
  824. X     esac
  825. Xfi
  826. X
  827. Xecho 'Running $ man 4 tty | sed '\''s/_//g'\'' | grep -s auxchars'
  828. Xif man 4 tty | sed 's/_//g' | grep -s auxchars
  829. Xthen haveaux=y; echo '
  830. XI see you have auxiliary characters.
  831. XYou should uncomment #define TTY_AUXCHARS in config.h.
  832. X'
  833. Xelse haveaux=n; echo '
  834. XI see you don'\''t have auxiliary characters.
  835. X'
  836. Xfi
  837. X
  838. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  839. X
  840. Xecho '
  841. Xpty also puts siginterrupt() and usleep() to good use in working
  842. Xaround BSD limitations. Without siginterrupt(), there is absolutely
  843. Xno way to get per-process non-blocking I/O, so pty may block when it
  844. Xdoesn'\''t have to (namely, when it has N bytes to write to the output,
  845. Xthe output is a pipe with M bytes of space, and N > M > 0). If you
  846. Xdefine SIGINTERRUPT (as default), pty will take some extra effort to
  847. Xnever, ever, ever block when it doesn'\''t have to.
  848. X
  849. XAt one point, pty pauses to kludge around a common bug in UNIX-domain
  850. Xsockets. With usleep() it will pause much more briefly. This makes
  851. Xreconnects much faster.
  852. X'
  853. X
  854. Xecho 'Running $ man siginterrupt | sed '\''s/_//g'\'' | grep -s siginterrupt'
  855. Xif man siginterrupt | sed 's/_//g' | grep -s siginterrupt
  856. Xthen havesigintr=y; echo '
  857. XI see you have siginterrupt(). Good.
  858. X'
  859. X     case "$ttygroup$havewinsize" in
  860. X     4y) echo 'I'\''ll bet you'\''re a BSD 4.3 system.' ;;
  861. X     *) echo 'Weird, are you BSD 4.3?' ;;
  862. X     esac
  863. Xelse havesigintr=n; echo '
  864. XI see you don'\''t have siginterrupt(). You have to comment out
  865. X#define SIGINTERRUPT in config.h.
  866. X'
  867. Xfi
  868. X
  869. Xecho 'Running $ man usleep | sed '\''s/_//g'\'' | grep -s usleep'
  870. Xif man usleep | sed 's/_//g' | grep -s usleep
  871. Xthen haveusleep=y; echo '
  872. XI see you have usleep(). Good.
  873. X'
  874. Xelse haveusleep=n; echo '
  875. XI see you don'\''t have usleep(). You have to comment out
  876. X#define USLEEP in config.h.
  877. X'
  878. Xfi
  879. X
  880. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  881. X
  882. Xecho '
  883. XFinally (almost done with configuration!), we have to make sure that you
  884. Xhave UNIX-domain sockets, and check whether you have file descriptor
  885. Xpassing.
  886. X'
  887. X
  888. Xecho 'Running $ test -r /usr/include/sys/un.h'
  889. Xif test -r /usr/include/sys/un.h
  890. Xthen haveunsocks=y; echo '
  891. XI see you have UNIX-domain sockets. Good.
  892. X'
  893. X   echo 'Running $ man recvmsg | sed '\''s/_//g'\'' | grep -s rights'
  894. X   if man recvmsg | sed 's/_//g' | grep -s rights
  895. X   then havefdpass=y; echo '
  896. XI see you have file descriptor passing. Good. (Your fd passing may be
  897. Xbuggy, as it'\''s a relatively new, powerful, and rarely exploited
  898. Xfeature. If you have trouble, try defining NO_FDPASSING.)
  899. X'
  900. X   else havefdpass=n; echo '
  901. XI see you don'\''t have file descriptor passing. This isn'\''t a
  902. Xdisaster, though it means that reconnected sessions will be as
  903. Xinefficient as they are in programs other than pty, boo hoo hoo.
  904. XUncomment NO_FDPASSING in config.h.
  905. X'
  906. X   fi
  907. Xelse haveunsocks=n; echo '
  908. XUh-oh. I don'\''t see <sys/un.h>, which means you probably don'\''t have
  909. XUNIX-domain sockets. Without sockets you can'\''t have disconnectable
  910. Xsessions. Sigh. I guess you have to define NO_UNIXSOCKS in config.h.
  911. X'
  912. Xfi
  913. X
  914. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  915. X
  916. Xecho '
  917. XWhew! We'\''ve finally made it through configuration. If you want, try
  918. Xrunning lint -haxc *.c or whatever your favorite code checker is; the
  919. Xlint here gives some bogus errors about correct char * casts, an error
  920. Xbecause the SIG_IGN definition is unportable, and a couple of bzero
  921. Xcomplaints because FD_ZERO isn'\''t defined very well.
  922. X
  923. XIf you'\''re on an old system without FD_ZERO, FD_SET, and FD_ISSET in
  924. X<sys/types.h>, I recommend you upgrade. Try copying file.h.old to file.h
  925. X(the original version is in file.h.new).
  926. X
  927. XWe'\''re nearly at the end. Change CC and CCOPTS in the Makefile for any
  928. Xlast-minute additions; if you'\''re worried, change -s to -g for debugging.
  929. XNow compile! % (date; make) >>& Makelog & and come back to this script.
  930. X'
  931. X
  932. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  933. X
  934. Xecho '
  935. XWhile the program is compiling, let'\''s start providing some support.
  936. X(If the compile finishes or has an error, just ignore it for the
  937. Xmoment.) These are some real changes, so watch out!
  938. X
  939. XFirst---in Case PTY only!---make a new uid, pty, not allowing logins.
  940. X
  941. X/etc/passwd:  pty:*:whatever:4:::/bin/true
  942. X'
  943. X
  944. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  945. X
  946. Xecho '
  947. XSecond, make sure you have a tty group set up.
  948. X
  949. X/etc/group:  tty:*:4:root
  950. X'
  951. X
  952. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  953. X
  954. Xecho '
  955. XThird, make PTYDIR.
  956. X
  957. XROOT: # mkdir /usr/etc/pty; chmod 700 /usr/etc/pty
  958. XPTY: # mkdir /usr/etc/pty; chown pty /usr/etc/pty; chmod 700 /usr/etc/pty
  959. XUN: % mkdir ~/PTY; chmod 700 ~/PTY
  960. X'
  961. X
  962. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  963. X
  964. Xecho '
  965. XFourth, make sure you have all the pseudo-terminal files set up and
  966. Xappropriately configured.
  967. X
  968. XChange each of them to group tty.
  969. X
  970. XChange each of them to owner pty in case PTY or root in case ROOT.
  971. X
  972. XChange each of them to mode UNUSEDPTYMODE (0600).
  973. X'
  974. X
  975. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  976. X
  977. Xecho '
  978. XFifth, make sure /etc/utmp and /usr/adm/wtmp exist, owned by root in
  979. XCase ROOT or pty in Case PTY, each mode 644. (In Case UN, you probably
  980. Xwant to be working on a Sun with its insecure /etc/utmp, so that pty can
  981. Xtake advantage of it. Sigh.)
  982. X'
  983. X
  984. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  985. X
  986. Xecho '
  987. XSixth, I advise that you make a special directory /usr/local/ptybin for
  988. Xpty and its associated utilities, with symbolic links in /usr/local.
  989. XThis choice isn'\''t too important, but it'\''s easier if you know a
  990. Xplace to put programs.
  991. X'
  992. X
  993. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  994. X
  995. Xecho '
  996. XOkay. You'\''ve done about all that can be done before compilation
  997. Xfinishes, so go do something else.
  998. X'
  999. X
  1000. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  1001. X
  1002. Xecho '
  1003. XThe compile should be done now. If all went well, the make should have
  1004. Xexited normally, Makelog should show no errors, and you should have an
  1005. Xexecutable pty program sitting in this directory. Unfortunately, life
  1006. Xisn'\''t always so generous. Here are a few of the more common errors.
  1007. X
  1008. XThe loader complains about missing getopt(), optarg, and optind: These
  1009. Xare all in the getopt library, available in the early volumes of
  1010. Xcomp.sources.unix. If you use GNU getopt, please make sure you
  1011. Xunderstand the implications of its license.
  1012. X
  1013. XThe loader complains about missing FD_ZERO, FD_SET, and FD_ISSET: Try
  1014. Xcopying file.h.old to file.h and recompiling. If the compiler gives
  1015. Xvarious further errors related to these macros, uncomment the
  1016. Xcommented-out lines in file.h.old, copy to file.h, and try once again.
  1017. X
  1018. Xbcopy() isn'\''t defined: In pty.h, change bcopy(src,dst,num) to
  1019. Xmemcpy(dst,src,num). (Note the order.) Try again.
  1020. X
  1021. XIf you still can'\''t get the code to compile, let the author know.
  1022. X'
  1023. X
  1024. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  1025. X
  1026. Xecho '
  1027. XNext, compile the utilities. There isn'\''t much to say about them;
  1028. Xthey'\''re all public domain, some of them clones of or improvements
  1029. Xover standard utilities, some of them clones with special features to
  1030. Xwork with pty, some of them entirely new programs for pty'\''s new
  1031. Xfeatures. Just glance at the top of util/Makefile; then
  1032. X% cd util; (date; make) >>& Makelog & and wait.
  1033. X
  1034. XWarning: The pty session directory is hardcoded in util/sessutil.c.
  1035. XIf you have changed PTYDIR, check through sessutil.c carefully.
  1036. X'
  1037. X
  1038. Xecho '----- Press return to continue. ' | tr -d '\012'; read contline
  1039. X
  1040. Xecho '
  1041. XSo now you should have some executables sitting around collecting dust.
  1042. XIn Cases ROOT and PTY, put {pty,biff,disconnect,mesg,reconnect,sesskill,
  1043. Xsesslist,sessname,sessuser} into a system-wide directory, owner root or
  1044. Xpty, mode 4755. Put wall and write into the same place, group tty, mode
  1045. X2755. Put {condom,excloff,exclon,last,lock,script,script.tidy,sess,tiocsti,
  1046. Xtty,u,who,xdisconnect,xreconnect,xsesskill,xsesslist,xsessname,xsessuser}
  1047. Xinto the same place, mode 755. Make absolutely sure none of the shell
  1048. Xscripts are setuid.
  1049. X
  1050. XIn Case UN, just put all the programs somewhere in your PATH.
  1051. X
  1052. XThat'\''s it! Try running TESTS now.
  1053. X
  1054. X(Two other things you have to do at some point: move your old script,
  1055. Xbiff, mesg, and so on to script.old, biff.old, mesg.old, etc., with
  1056. Xsymbolic links to the new versions in their place; and move the old
  1057. X/usr/man/{script,biff,mesg,...}.1 somewhere else, copy all the *.1
  1058. Xhere to /usr/man/man1, and run /etc/catman.)
  1059. X'
  1060. END_OF_FILE
  1061.   echo shar: 10 control characters may be missing from \"'INSTALL'\"
  1062.   if test 25242 -ne `wc -c <'INSTALL'`; then
  1063.     echo shar: \"'INSTALL'\" unpacked with wrong size!
  1064.   fi
  1065.   chmod +x 'INSTALL'
  1066.   # end of 'INSTALL'
  1067. fi
  1068. if test ! -d 'patch' ; then
  1069.     echo shar: Creating directory \"'patch'\"
  1070.     mkdir 'patch'
  1071. fi
  1072. if test -f 'patch/telnetd.90.06.28.patch' -a "${1}" != "-c" ; then 
  1073.   echo shar: Will not clobber existing file \"'patch/telnetd.90.06.28.patch'\"
  1074. else
  1075.   echo shar: Extracting \"'patch/telnetd.90.06.28.patch'\" \(13647 characters\)
  1076.   sed "s/^X//" >'patch/telnetd.90.06.28.patch' <<'END_OF_FILE'
  1077. X*** pathnames.h.original    Tue Aug 21 15:45:25 1990
  1078. X--- pathnames.h    Tue Aug 21 22:24:30 1990
  1079. X***************
  1080. X*** 35,37 ****
  1081. X--- 35,40 ----
  1082. X  #ifdef BFTPDAEMON
  1083. X  #define        BFTPPATH    "/usr/ucb/bftp"
  1084. X  #endif  /* BFTPDAEMON */
  1085. X+ #ifdef USEPTY
  1086. X+ #define _PATH_PTY "/usr/local/pty"
  1087. X+ #endif
  1088. X*** sys_term.c.original    Tue Aug 21 15:45:31 1990
  1089. X--- sys_term.c    Tue Aug 21 22:00:56 1990
  1090. X***************
  1091. X*** 23,28 ****
  1092. X--- 23,32 ----
  1093. X  
  1094. X  #include "telnetd.h"
  1095. X  #include "pathnames.h"
  1096. X+ #ifdef USEPTY
  1097. X+ #include "sock.h"
  1098. X+ extern char *ttyname();
  1099. X+ #endif
  1100. X  
  1101. X  #ifdef    NEWINIT
  1102. X  #include <initreq.h>
  1103. X***************
  1104. X*** 354,359 ****
  1105. X--- 358,364 ----
  1106. X  
  1107. X  getpty()
  1108. X  {
  1109. X+ #ifndef USEPTY
  1110. X      register int p;
  1111. X  #ifndef CRAY
  1112. X      register char c, *p1, *p2;
  1113. X***************
  1114. X*** 398,403 ****
  1115. X--- 403,416 ----
  1116. X      }
  1117. X  #endif    /* CRAY */
  1118. X      return(-1);
  1119. X+ #else USEPTY
  1120. X+ /* In this new 'n' improved pty-based telnetd, we've already called */
  1121. X+ /* startslave, which in turn waited to grab pseudo-terminals from the */
  1122. X+ /* pty program. Global variable pty (grrrr) already has our tty. line */
  1123. X+ /* has already been filled in by startslave. In fact, there's no point */
  1124. X+ /* in calling getpty() at all. */
  1125. X+  return pty;
  1126. X+ #endif USEPTY
  1127. X  }
  1128. X  
  1129. X  #ifdef    LINEMODE
  1130. X***************
  1131. X*** 764,772 ****
  1132. X--- 777,788 ----
  1133. X   */
  1134. X  getptyslave()
  1135. X  {
  1136. X+ #ifndef USEPTY
  1137. X      register int t = -1;
  1138. X+ #endif
  1139. X  
  1140. X  #ifndef    CRAY
  1141. X+ #ifndef USEPTY
  1142. X      /*
  1143. X       * Disassociate self from control terminal and open ttyp side.
  1144. X       * Set important flags on ttyp and ptyp.
  1145. X***************
  1146. X*** 791,796 ****
  1147. X--- 807,815 ----
  1148. X          fatalperror(net, line);
  1149. X  #endif
  1150. X  
  1151. X+ #else USEPTY
  1152. X+  /* In a pty-based world, this function is rendered similarly useless. */
  1153. X+ #endif USEPTY
  1154. X      init_termbuf();
  1155. X  #ifndef    USE_TERMIO
  1156. X      termbuf.sg.sg_flags |= CRMOD|ANYP|ECHO|XTABS;
  1157. X***************
  1158. X*** 812,821 ****
  1159. X--- 831,846 ----
  1160. X  #endif
  1161. X      set_termbuf();
  1162. X  #else    /* CRAY */
  1163. X+ #ifndef USEPTY
  1164. X      (void) chown(line, 0, 0);
  1165. X      (void) chmod(line, 0600);
  1166. X+ #endif
  1167. X  #endif    /* CRAY */
  1168. X+ #ifndef USEPTY
  1169. X      return(t);
  1170. X+ #else USEPTY
  1171. X+  /* What's there to return? We've thrown away fdsty. */
  1172. X+ #endif
  1173. X  }
  1174. X  
  1175. X  #ifdef    NEWINIT
  1176. X***************
  1177. X*** 829,842 ****
  1178. X--- 854,891 ----
  1179. X   * is necessary to startup the login process on the slave side of the pty.
  1180. X   */
  1181. X  
  1182. X+ #ifdef USEPTY
  1183. X+ int fdpass[2];
  1184. X+ int siglerpid;
  1185. X+ #endif USEPTY
  1186. X  /* ARGSUSED */
  1187. X+ #ifndef USEPTY
  1188. X  startslave(t, host)
  1189. X  int t;
  1190. X+ #else USEPTY
  1191. X+ startslave(host)
  1192. X+ #endif USEPTY
  1193. X  char *host;
  1194. X  {
  1195. X      register int i;
  1196. X      long time();
  1197. X  
  1198. X+ #ifdef USEPTY
  1199. X+  char strfdpass[10];
  1200. X+  char ch;
  1201. X+  int fdmty;
  1202. X+  int fdsty;
  1203. X+  char *ttyn;
  1204. X+  int pgrp;
  1205. X+  int fd;
  1206. X+ #endif USEPTY
  1207. X+ #ifdef USEPTY
  1208. X+  /* Prepare for receiving pseudo-terminal descriptors from pty. */
  1209. X+  if (socketpair(AF_UNIX,SOCK_STREAM,0,fdpass) == -1) /* virtually impossible */
  1210. X+    fatalperror(net,"pty-socketpair");
  1211. X+  (void) sprintf(strfdpass,"%d",fdpass[1]);
  1212. X+ 
  1213. X+ #endif USEPTY
  1214. X  #ifndef    NEWINIT
  1215. X  # ifdef    CRAY
  1216. X      utmp_sig_init();
  1217. X***************
  1218. X*** 845,850 ****
  1219. X--- 894,902 ----
  1220. X      if ((i = fork()) < 0)
  1221. X          fatalperror(net, "fork");
  1222. X      if (i) {
  1223. X+ #ifdef USEPTY
  1224. X+    siglerpid = i;
  1225. X+ #endif
  1226. X  # ifdef    CRAY
  1227. X          /*
  1228. X           * Cray parent will create utmp entry for child and send
  1229. X***************
  1230. X*** 873,881 ****
  1231. X--- 925,972 ----
  1232. X          }
  1233. X          utmp_sig_notify(pid);
  1234. X  # endif    /* CRAY */
  1235. X+ #ifndef USEPTY
  1236. X          (void) close(t);
  1237. X+ #else USEPTY
  1238. X+ /* Now we'll receive the descriptors. */
  1239. X+    (void) close(fdpass[1]);
  1240. X+    (void) sprintf(line,"/NONexistent");
  1241. X+    fdmty = fdsty = -1;
  1242. X+    if (pty_getch(fdpass[0],&ch) == -1)
  1243. X+      cleanup(); /* XXX: telnetd's finishup handling really sucks. */
  1244. X+    if (pty_putgetint(fdpass[0],'G',&siglerpid) == -1)
  1245. X+      cleanup();
  1246. X+    if (pty_getch(fdpass[0],&ch) == -1)
  1247. X+      cleanup();
  1248. X+    if (pty_putgetfd(fdpass[0],'m',&fdmty) == -1)
  1249. X+      cleanup();
  1250. X+    if (pty_getch(fdpass[0],&ch) == -1)
  1251. X+      cleanup();
  1252. X+    if (pty_putgetfd(fdpass[0],'s',&fdsty) == -1)
  1253. X+      cleanup();
  1254. X+    if (!(ttyn = ttyname(fdsty)))
  1255. X+      cleanup();
  1256. X+    (void) strncpy(line,ttyn,14);
  1257. X+    if ((fd = open("/dev/tty",O_RDWR)) != -1)
  1258. X+     {
  1259. X+      (void) ioctl(fd,TIOCNOTTY,0); /* detach */
  1260. X+      (void) close(fd);
  1261. X+     }
  1262. X+    (void) close(open(ttyn,O_RDWR)); /* attach ourselves to tty */
  1263. X+    pty = fdmty;
  1264. X+    (void) ioctl(fdsty,TIOCGPGRP,&pgrp);
  1265. X+    (void) setpgrp(0,pgrp);
  1266. X+    (void) close(fdsty); /* we won't need it for anything else */
  1267. X+    (void) fcntl(fdpass[0],F_SETFL,FNDELAY); /* XXX */
  1268. X+ 
  1269. X+ #endif USEPTY
  1270. X      } else {
  1271. X+ #ifndef USEPTY
  1272. X          start_login(t, host);
  1273. X+ #else USEPTY
  1274. X+    (void) close(fdpass[0]);
  1275. X+         start_login(host,strfdpass);
  1276. X+ #endif USEPTY
  1277. X          /*NOTREACHED*/
  1278. X      }
  1279. X  #else    /* NEWINIT */
  1280. X***************
  1281. X*** 986,994 ****
  1282. X--- 1077,1095 ----
  1283. X   * function will turn us into the login process.
  1284. X   */
  1285. X  
  1286. X+ #ifndef USEPTY
  1287. X  start_login(t, host)
  1288. X  int t;
  1289. X+ #else USEPTY
  1290. X+ /* Added parameter, for dealing with pty: strfdpass, a printable version */
  1291. X+ /* of the file descriptor for passing more descriptors up to us. */
  1292. X+ 
  1293. X+ start_login(host,strfdpass)
  1294. X+ #endif USEPTY
  1295. X  char *host;
  1296. X+ #ifdef USEPTY
  1297. X+ char *strfdpass;
  1298. X+ #endif USEPTY
  1299. X  {
  1300. X      register char *cp;
  1301. X      register char **argv;
  1302. X***************
  1303. X*** 996,1001 ****
  1304. X--- 1097,1103 ----
  1305. X  #ifdef    CRAY
  1306. X      register char **cpp, **cpp2;
  1307. X      utmp_sig_wait();
  1308. X+ #ifndef USEPTY
  1309. X  # ifndef TCVHUP
  1310. X      setpgrp();
  1311. X  # endif
  1312. X***************
  1313. X*** 1028,1038 ****
  1314. X--- 1130,1142 ----
  1315. X      termbuf.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK;
  1316. X      termbuf.c_cflag = EXTB|HUPCL|CS8;
  1317. X      set_termbuf();
  1318. X+ #endif USEPTY
  1319. X  #endif    /* CRAY */
  1320. X  
  1321. X      /*
  1322. X       * set up standard paths before forking to login
  1323. X       */
  1324. X+ #ifndef USEPTY
  1325. X  #ifndef    NO_SETSID
  1326. X      if (setsid() < 0)
  1327. X          fatalperror(net, "setsid");
  1328. X***************
  1329. X*** 1042,1053 ****
  1330. X--- 1146,1167 ----
  1331. X      if (ioctl(t, TIOCSCTTY, (char *)0) < 0)
  1332. X          fatalperror(net, "ioctl(sctty)");
  1333. X  #endif
  1334. X+ #else USEPTY
  1335. X+  /* The POSIXish setsid() handling here is pty's responsibility. */
  1336. X+ #endif USEPTY
  1337. X      (void) close(net);
  1338. X      (void) close(pty);
  1339. X+ #ifndef USEPTY
  1340. X      (void) dup2(t, 0);
  1341. X      (void) dup2(t, 1);
  1342. X      (void) dup2(t, 2);
  1343. X      (void) close(t);
  1344. X+ #else USEPTY
  1345. X+         (void) close(0); /* ahhh, life is easy */
  1346. X+         (void) close(1);
  1347. X+         (void) close(2);
  1348. X+     /* but absolutely don't close fdpass. */
  1349. X+ #endif USEPTY
  1350. X      /*
  1351. X       * -h : pass on name of host.
  1352. X       *        WARNING:  -h is accepted by login if and only if
  1353. X***************
  1354. X*** 1054,1060 ****
  1355. X--- 1168,1183 ----
  1356. X       *            getuid() == 0.
  1357. X       * -p : don't clobber the environment (so terminal type stays set).
  1358. X       */
  1359. X+ #ifdef USEPTY
  1360. X+  /* Stick the pty magic in front. */
  1361. X+  argv = addarg(0,   "pty"); /* this addarg stuff is stupid */
  1362. X+  argv = addarg(argv,"-sdf");
  1363. X+  argv = addarg(argv,strfdpass);
  1364. X+  argv = addarg(argv,"-xRCUWX"); /* XXX: -xr? */
  1365. X+  argv = addarg(argv,_PATH_LOGIN);
  1366. X+ #else
  1367. X      argv = addarg(0, "login");
  1368. X+ #endif
  1369. X      argv = addarg(argv, "-h");
  1370. X      argv = addarg(argv, host);
  1371. X  #if    !defined(CRAY) && !defined(NO_LOGIN_P)
  1372. X***************
  1373. X*** 1084,1090 ****
  1374. X--- 1207,1217 ----
  1375. X      }
  1376. X  #endif
  1377. X  
  1378. X+ #ifdef USEPTY
  1379. X+  execv(_PATH_PTY,argv);
  1380. X+ #else USEPTY
  1381. X      execv(_PATH_LOGIN, argv);
  1382. X+ #endif USEPTY
  1383. X  
  1384. X      syslog(LOG_ERR, "%s: %m\n", _PATH_LOGIN);
  1385. X      fatalperror(net, _PATH_LOGIN);
  1386. X***************
  1387. X*** 1142,1155 ****
  1388. X--- 1269,1294 ----
  1389. X      p = line + sizeof("/dev/") - 1;
  1390. X      if (logout(p))
  1391. X          logwtmp(p, "", "");
  1392. X+ #ifndef USEPTY
  1393. X      (void)chmod(line, 0666);
  1394. X+ #else USEPTY
  1395. X+     (void) chmod(line,0600); /* banish these security holes! */
  1396. X+ #endif USEPTY
  1397. X      (void)chown(line, 0, 0);
  1398. X      *p = 'p';
  1399. X+ #ifndef USEPTY
  1400. X      (void)chmod(line, 0666);
  1401. X+ #else USEPTY
  1402. X+     (void) chmod(line,0600);
  1403. X+ #endif USEPTY
  1404. X      (void)chown(line, 0, 0);
  1405. X  # else
  1406. X      rmut();
  1407. X+ #ifndef USEPTY
  1408. X      vhangup();    /* XXX */
  1409. X+ #else USEPTY
  1410. X+ /*    vhangup();        XXX: This is also pty's responsibility. */
  1411. X+ #endif USEPTY
  1412. X  # endif
  1413. X      (void) shutdown(net, 2);
  1414. X  #else    /* CRAY */
  1415. X***************
  1416. X*** 1156,1162 ****
  1417. X--- 1295,1306 ----
  1418. X  # ifndef NEWINIT
  1419. X      rmut(line);
  1420. X      (void) shutdown(net, 2);
  1421. X+ #ifndef USEPTY
  1422. X      kill(0, SIGHUP);
  1423. X+ #else USEPTY
  1424. X+ /* kill(0, SIGHUP);    The pty master makes this decision. */
  1425. X+  (void) kill(siglerpid,SIGHUP); /* but we do have to tell the sigler. */
  1426. X+ #endif USEPTY
  1427. X  # else    /* NEWINIT */
  1428. X      (void) shutdown(net, 2);
  1429. X  # endif    /* NEWINT */
  1430. X***************
  1431. X*** 1273,1282 ****
  1432. X--- 1417,1434 ----
  1433. X              (void) close(f);
  1434. X          }
  1435. X      }
  1436. X+ #ifndef USEPTY
  1437. X      (void) chmod(line, 0666);
  1438. X+ #else USEPTY
  1439. X+     (void) chmod(line, 0600);
  1440. X+ #endif USEPTY
  1441. X      (void) chown(line, 0, 0);
  1442. X      line[strlen("/dev/")] = 'p';
  1443. X+ #ifndef USEPTY
  1444. X      (void) chmod(line, 0666);
  1445. X+ #else USEPTY
  1446. X+     (void) chmod(line, 0600);
  1447. X+ #endif USEPTY
  1448. X      (void) chown(line, 0, 0);
  1449. X  }  /* end of rmut */
  1450. X  #endif    /* CRAY */
  1451. X*** telnetd.c.original    Tue Aug 21 15:45:36 1990
  1452. X--- telnetd.c    Tue Aug 21 21:27:48 1990
  1453. X***************
  1454. X*** 28,33 ****
  1455. X--- 28,37 ----
  1456. X  #endif /* not lint */
  1457. X  
  1458. X  #include "telnetd.h"
  1459. X+ #ifdef USEPTY
  1460. X+ #include "sock.h"
  1461. X+ extern char *ttyname();
  1462. X+ #endif USEPTY
  1463. X  
  1464. X  /*
  1465. X   * I/O data buffers,
  1466. X***************
  1467. X*** 462,467 ****
  1468. X--- 466,472 ----
  1469. X      int t;
  1470. X      struct hostent *hp;
  1471. X  
  1472. X+ #ifndef USEPTY
  1473. X      /*
  1474. X       * Find an available pty to use.
  1475. X       */
  1476. X***************
  1477. X*** 470,475 ****
  1478. X--- 475,481 ----
  1479. X          fatal(net, "All network ports in use");
  1480. X  
  1481. X      t = getptyslave();
  1482. X+ #endif USEPTY
  1483. X  
  1484. X      /* get name of connected client */
  1485. X      hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr),
  1486. X***************
  1487. X*** 489,500 ****
  1488. X--- 495,533 ----
  1489. X      /*
  1490. X       * Start up the login process on the slave side of the terminal
  1491. X       */
  1492. X+ #ifndef USEPTY
  1493. X      startslave(t, host);
  1494. X+ #else USEPTY
  1495. X+     startslave(host);
  1496. X+ #endif USEPTY
  1497. X  
  1498. X+ #ifdef USEPTY
  1499. X+ /* In this pty-based version of the world, life is easy. startslave() */
  1500. X+ /* actually dumps its process under the pty program, which handles all */
  1501. X+ /* those nasty details of finding a pty and getting it started. pty */
  1502. X+ /* then passes its pty master side up to telnetd (the ``controller'') */
  1503. X+ /* so that we have full control. Joy to the world. */
  1504. X+ 
  1505. X+     /*
  1506. X+      * Find an available pty to use.
  1507. X+      */
  1508. X+     pty = getpty(); /* noop */
  1509. X+     if (pty < 0) /* impossible */
  1510. X+         fatal(net, "All network ports in use");
  1511. X+ 
  1512. X+     getptyslave();
  1513. X+ 
  1514. X+ #endif USEPTY
  1515. X      telnet(net, pty);  /* begin server processing */
  1516. X      /*NOTREACHED*/
  1517. X  }  /* end of doit */
  1518. X  
  1519. X+ #ifdef USEPTY
  1520. X+ extern int fdpass[2];
  1521. X+ extern int siglerpid;
  1522. X+ char ch;
  1523. X+ 
  1524. X+ #endif USEPTY
  1525. X  #ifndef    MAXHOSTNAMELEN
  1526. X  #define    MAXHOSTNAMELEN 64
  1527. X  #endif    MAXHOSTNAMELEN
  1528. X***************
  1529. X*** 775,780 ****
  1530. X--- 808,819 ----
  1531. X          if (!SYNCHing) {
  1532. X              FD_SET(f, &xbits);
  1533. X          }
  1534. X+ #ifdef USEPTY
  1535. X+      FD_SET(fdpass[0],&ibits);
  1536. X+      /* When we get input on fdpass, we're switching ttys. */
  1537. X+      /* This FD_SET seems logical, but it invites bugs under many */
  1538. X+      /* implementations. XXX. */
  1539. X+ #endif USEPTY
  1540. X          if ((c = select(16, &ibits, &obits, &xbits,
  1541. X                          (struct timeval *)0)) < 1) {
  1542. X              if (c == -1) {
  1543. X***************
  1544. X*** 785,791 ****
  1545. X--- 824,899 ----
  1546. X              sleep(5);
  1547. X              continue;
  1548. X          }
  1549. X+ #ifdef USEPTY
  1550. X+         if (pty_getch(fdpass[0],&ch) != -1)
  1551. X+          {
  1552. X+           /* reconnect... */
  1553. X+           int fdmty;
  1554. X+           int fdsty;
  1555. X+           char *ttyn;
  1556. X+           int pgrp;
  1557. X+           int fd;
  1558. X  
  1559. X+           fdmty = fdsty = -1;
  1560. X+           (void) fcntl(fdpass[0],F_SETFL,0); /*XXX*/
  1561. X+           if (ch != 'G')
  1562. X+             if (pty_getch(fdpass[0],&ch) == -1)
  1563. X+               ;
  1564. X+           if (pty_putgetint(fdpass[0],'G',&siglerpid) == -1)
  1565. X+             cleanup();
  1566. X+           if (pty_getch(fdpass[0],&ch) == -1)
  1567. X+             cleanup();
  1568. X+           if (pty_putgetfd(fdpass[0],'m',&fdmty) == -1)
  1569. X+             cleanup();
  1570. X+           if (pty_getch(fdpass[0],&ch) == -1)
  1571. X+             cleanup();
  1572. X+           if (pty_putgetfd(fdpass[0],'s',&fdsty) == -1)
  1573. X+             cleanup();
  1574. X+           if (!(ttyn = ttyname(fdsty)))
  1575. X+             cleanup();
  1576. X+           /* It's impossible to do anything sensible with utmp; */
  1577. X+           /* this shows very clearly why utmp's remote field */
  1578. X+           /* is inconsistent. So we stick to the same ``line.'' */
  1579. X+ 
  1580. X+           fd = 0;
  1581. X+               (void) ioctl(p, TIOCPKT, (char *)&fd);
  1582. X+           /* Packet mode, like NDELAY, is not a polite thing to */
  1583. X+           /* give someone else. One of those unstated conventions */
  1584. X+           /* that people should learn... */
  1585. X+ 
  1586. X+           if ((fd = open("/dev/tty",O_RDWR)) != -1)
  1587. X+            {
  1588. X+             (void) ioctl(fd,TIOCNOTTY,0); /* detach */
  1589. X+             (void) close(fd);
  1590. X+            }
  1591. X+           (void) close(open(ttyn,O_RDWR)); /* attach */
  1592. X+ 
  1593. X+                   (void) close(pty);
  1594. X+           pty = fdmty;
  1595. X+           p = pty; /* XXX: Blame DAB for this. Whither modularity? */
  1596. X+ 
  1597. X+               (void) ioctl(p, TIOCPKT, (char *)&on);
  1598. X+           /* If we didn't do this, telnetd would become very */
  1599. X+           /* confused, because it's expecting packet-mode stuff. */
  1600. X+ 
  1601. X+           (void) fcntl(fdpass[0],F_SETFL,FNDELAY); /* XXX */
  1602. X+           (void) ioctl(fdsty,TIOCGPGRP,&pgrp);
  1603. X+           (void) setpgrp(0,pgrp);
  1604. X+ 
  1605. X+           /* XXX: If this messes up Linemode, TOUGH LUCK! */
  1606. X+               init_termbuf(); /* XXX */
  1607. X+ #ifdef LINEMODE
  1608. X+               localstat(); /* XXX */
  1609. X+ #endif
  1610. X+ 
  1611. X+           FD_ZERO(&xbits);
  1612. X+           FD_ZERO(&ibits); /* XXX */
  1613. X+           FD_ZERO(&obits);
  1614. X+ 
  1615. X+           /* XXX: anything else to do? */
  1616. X+          }
  1617. X+ #endif USEPTY
  1618. X+ 
  1619. X          /*
  1620. X           * Any urgent data?
  1621. X           */
  1622. X***************
  1623. X*** 881,888 ****
  1624. X--- 989,1004 ----
  1625. X              if (pcc < 0 && errno == EWOULDBLOCK)
  1626. X                  pcc = 0;
  1627. X              else {
  1628. X+ #ifndef USEPTY
  1629. X                  if (pcc <= 0)
  1630. X                      break;
  1631. X+ #else USEPTY
  1632. X+                 if (pcc <= 0)
  1633. X+                  {
  1634. X+                   pcc = 0;
  1635. X+                   goto wtfiseofpty;
  1636. X+                  }
  1637. X+ #endif USEPTY
  1638. X  #if    !defined(CRAY2) || !defined(UNICOS5)
  1639. X  #ifdef    LINEMODE
  1640. X                  /*
  1641. X***************
  1642. X*** 932,937 ****
  1643. X--- 1048,1056 ----
  1644. X                      ptyip = ptyibuf;
  1645. X  #endif    /* defined(CRAY2) && defined(UNICOS5) */
  1646. X              }
  1647. X+ #ifdef USEPTY
  1648. X+  wtfiseofpty: ;
  1649. X+ #endif USEPTY
  1650. X          }
  1651. X  
  1652. X          while (pcc > 0) {
  1653. END_OF_FILE
  1654.   if test 13647 -ne `wc -c <'patch/telnetd.90.06.28.patch'`; then
  1655.     echo shar: \"'patch/telnetd.90.06.28.patch'\" unpacked with wrong size!
  1656.   fi
  1657.   # end of 'patch/telnetd.90.06.28.patch'
  1658. fi
  1659. if test ! -d 'util' ; then
  1660.     echo shar: Creating directory \"'util'\"
  1661.     mkdir 'util'
  1662. fi
  1663. echo shar: End of archive 1 \(of 6\).
  1664. cp /dev/null ark1isdone
  1665. MISSING=""
  1666. for I in 1 2 3 4 5 6 ; do
  1667.     if test ! -f ark${I}isdone ; then
  1668.     MISSING="${MISSING} ${I}"
  1669.     fi
  1670. done
  1671. if test "${MISSING}" = "" ; then
  1672.     echo You have unpacked all 6 archives.
  1673.     rm -f ark[1-9]isdone
  1674. else
  1675.     echo You still must unpack the following archives:
  1676.     echo "        " ${MISSING}
  1677. fi
  1678. exit 0
  1679. exit 0 # Just in case...
  1680. -- 
  1681. Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
  1682. Use a domain-based address or give alternate paths, or you may lose out.
  1683.