home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / 3b1-ptys-v2 < prev    next >
Internet Message Format  |  1991-08-07  |  31KB

  1. From: eric@e.ms.uky.edu (Eric Herrin)
  2. Newsgroups: comp.sources.misc
  3. Subject: v02i062: New Version of the UnixPC pty driver
  4. Message-ID: <7447@ncoast.UUCP>
  5. Date: 29 Feb 88 01:14:27 GMT
  6. Approved: allbery@ncoast.UUCP
  7.  
  8. Comp.sources.misc: Volume 2, Issue 62
  9. Submitted-By: Eric Herrin <eric@e.ms.uky.edu>
  10. Archive-Name: 3b1-ptys-v2
  11.  
  12. Here's the latest version of the pty driver for the UnixPC, with all the
  13. known bugs/problems fixed.  If anyone has any problems, let me know,
  14. I have been pretty careful to make sure this one works without any
  15. hitches.  Hope everyone enjoys it as much as I do.
  16.  
  17.             eric
  18.  
  19.  
  20. |  Eric Herrin II: {cbosgd!ukma!eric, eric@UKMA.BITNET, eric@ms.uky.edu}      |
  21. |  "But I soon noticed that while I thus wished to                            |
  22. |   think everything false, it was necessarily true                           |
  23. |   that I who thought so was something"   - Rene Descartes                   |
  24. -------------------------  cut here -------------------------------------------
  25. #! /bin/sh
  26. : This is a shell archive, meaning:
  27. : 1. Remove everything above the '#! /bin/sh' line.
  28. : 2. Save the resulting text in a file.
  29. : 3. Execute the file with /bin/sh '(not csh)' to create the files:
  30. :    'Files'
  31. :    'Install'
  32. :    'MKflop'
  33. :    'Makefile'
  34. :    'Name'
  35. :    'README.3b1'
  36. :    'READ_ME'
  37. :    'Remove'
  38. :    'Remove.orig'
  39. :    'Size'
  40. :    'Version'
  41. :    'number-ptys.h'
  42. :    'pty.c'
  43. :    'pty.h'
  44. : This archive created: 'Sun Feb 28 13:52:08 1988
  45. '
  46. export PATH; PATH=/bin:$PATH
  47. echo shar: extracting "'Files'" '(118 characters)'
  48. if test -f 'Files'
  49. then
  50.     echo shar: will not over-write existing file "'Files'"
  51. else
  52. sed 's/^X//'  >'Files' <<'SHAR_EOF'
  53. XSize
  54. XName
  55. XRemove
  56. XInstall
  57. XFiles
  58. XMKflop
  59. XMakefile
  60. Xpty.o
  61. XREADME.3b1
  62. XREAD_ME
  63. XRemove.orig
  64. XVersion
  65. Xnumber-ptys.h
  66. Xpty.c
  67. Xpty.h
  68. SHAR_EOF
  69. if test 118 -ne "`wc -c < 'Files'`"
  70. then
  71.     echo shar: error transmitting "'Files'" '(should have been 118 characters)'
  72. fi
  73. fi # end of overwriting check
  74. echo shar: extracting "'Install'" '(1929 characters)'
  75. if test -f 'Install'
  76. then
  77.     echo shar: will not over-write existing file "'Install'"
  78. else
  79. sed 's/^X//'  >'Install' <<'SHAR_EOF'
  80. X# Eric H. Herrin II
  81. X# University of Kentucky Mathematical Sciences
  82. X# eric@ms.uky.edu, !cbosgd!ukma!eric
  83. X#
  84. X# Install script for System V Pty driver
  85. XMODULE=pty
  86. X# put the module in the appropriate place
  87. Xcp ${MODULE}.o /etc/lddrv/${MODULE}.o
  88. X# add the entry to the /etc/master file
  89. X/etc/masterupd -a char open release close read write ioctl ${MODULE}
  90. X# get the assigned device number
  91. XMODULEDEVNO=`/etc/masterupd -c ${MODULE}`
  92. Xif [  ! ${MODULEDEVNO} ]
  93. Xthen 
  94. X    echo "${MODULEDEVNO} cannot be added to the /etc/master file"
  95. X    exit 1
  96. Xfi
  97. X# NOTE!!!!!!!!!!!!!!
  98. X# To change the number of ptys, change the value in number-ptys.h.
  99. X# VVVVVVV
  100. XPTYCNT=`grep NUMBER_OF_PTYS number-ptys.h | \
  101. Xsed -e "s/#define//" -e "s/NUMBER_OF_PTYS//" -e "s/ //g"`
  102. Xecho "PTYCNT=$PTYCNT" > Remove
  103. Xcat Remove.orig >> Remove
  104. X# make the pty device files
  105. Xecho "Making pty pseudo device files"
  106. Xcnt=0
  107. Xfor x in p q r s t u v w x y z
  108. Xdo
  109. X    for y in 0 1 2 3 4 5 6 7 8 9 a b c d e f
  110. X    do
  111. X        i=$x$y
  112. X        if [ $cnt -ge ${PTYCNT} ] 
  113. X        then 
  114. X            break
  115. X        fi
  116. X        /etc/mknod /dev/pty$i c ${MODULEDEVNO}\
  117. X `expr $cnt + $PTYCNT`
  118. X        /etc/mknod /dev/tty$i c ${MODULEDEVNO} $cnt
  119. X        chown root /dev/tty$i /dev/pty$i
  120. X        chgrp root /dev/tty$i /dev/pty$i
  121. X        chmod 0666 /dev/tty$i /dev/pty$i
  122. X        cnt=`expr $cnt + 1`
  123. X    done
  124. Xdone
  125. X
  126. Xecho "Putting entry into InstDrv"
  127. X# put an entry in /etc/lddrv/InstDrv for ${MODULE}
  128. XV=`cat Version`
  129. Xecho "Name=${MODULE} driver: Version ${V}"     >> /etc/lddrv/InstDrv
  130. Xecho "File=${MODULE}"                 >> /etc/lddrv/InstDrv
  131. Xecho "Comment=Pseudo tty driver (ptys!!)"     >> /etc/lddrv/InstDrv
  132. Xcd /etc/lddrv
  133. X# allocate and load the module
  134. Xecho "Allocating pty module with lddrv"
  135. X./lddrv -av -o ${MODULE}.o ${MODULE} > /dev/null 2>&1
  136. Xif [ $? -eq 0 ]
  137. Xthen
  138. X    echo "Driver ${MODULE} successfully loaded"
  139. Xelse
  140. X    echo "Error: Driver ${MODULE} failed loading stage"
  141. X    exit 1
  142. Xfi
  143. X
  144. X# load the ${MODULE} at boot time
  145. Xecho ${MODULE} >> /etc/lddrv/drivers
  146. X
  147. Xecho "Pseudo tty drivers are now installed"
  148. Xexit 0
  149. SHAR_EOF
  150. if test 1929 -ne "`wc -c < 'Install'`"
  151. then
  152.     echo shar: error transmitting "'Install'" '(should have been 1929 characters)'
  153. fi
  154. chmod +x 'Install'
  155. fi # end of overwriting check
  156. echo shar: extracting "'MKflop'" '(120 characters)'
  157. if test -f 'MKflop'
  158. then
  159.     echo shar: will not over-write existing file "'MKflop'"
  160. else
  161. sed 's/^X//'  >'MKflop' <<'SHAR_EOF'
  162. Xecho "Insert floppy disk and press return"
  163. Xread junk
  164. X/usr/bin/fdfmt.nl
  165. Xfind `cat Files` -print | cpio -oBc > /dev/fp021
  166. SHAR_EOF
  167. if test 120 -ne "`wc -c < 'MKflop'`"
  168. then
  169.     echo shar: error transmitting "'MKflop'" '(should have been 120 characters)'
  170. fi
  171. chmod +x 'MKflop'
  172. fi # end of overwriting check
  173. echo shar: extracting "'Makefile'" '(403 characters)'
  174. if test -f 'Makefile'
  175. then
  176.     echo shar: will not over-write existing file "'Makefile'"
  177. else
  178. sed 's/^X//'  >'Makefile' <<'SHAR_EOF'
  179. X#       Eric H. Herrin II
  180. X#    University of Kentucky Mathematical Sciences Laboratories
  181. X#     915 Patterson Office Tower
  182. X#    University of Kentucky
  183. X#    Lexington, KY 40506
  184. X#    eric@ms.uky.edu, ..!cbosgd!ukma!eric 
  185. XDEFS=   -UDEBUG
  186. XCFLAGS= -O -c ${DEFS}
  187. XSHELL= /bin/sh
  188. X
  189. X.c.o:
  190. X    ${CC} ${CFLAGS} $<
  191. X
  192. Xall: pty.o
  193. X
  194. Xinstall: all
  195. X    ${SHELL} ./Install
  196. X
  197. Xclean: 
  198. X    rm -f pty.o
  199. X
  200. Xclobber: clean
  201. X    ${SHELL} ./Remove
  202. X
  203. Xremove: clobber
  204. SHAR_EOF
  205. if test 403 -ne "`wc -c < 'Makefile'`"
  206. then
  207.     echo shar: error transmitting "'Makefile'" '(should have been 403 characters)'
  208. fi
  209. fi # end of overwriting check
  210. echo shar: extracting "'Name'" '(24 characters)'
  211. if test -f 'Name'
  212. then
  213.     echo shar: will not over-write existing file "'Name'"
  214. else
  215. sed 's/^X//'  >'Name' <<'SHAR_EOF'
  216. XPty Driver Version 2.1 
  217. SHAR_EOF
  218. if test 24 -ne "`wc -c < 'Name'`"
  219. then
  220.     echo shar: error transmitting "'Name'" '(should have been 24 characters)'
  221. fi
  222. fi # end of overwriting check
  223. echo shar: extracting "'README.3b1'" '(5891 characters)'
  224. if test -f 'README.3b1'
  225. then
  226.     echo shar: will not over-write existing file "'README.3b1'"
  227. else
  228. sed 's/^X//'  >'README.3b1' <<'SHAR_EOF'
  229. XREADME: Eric H. Herrin II
  230. X    University of Kentucky Mathematical Sciences Laboratories
  231. X     915 Patterson Office Tower
  232. X    University of Kentucky
  233. X    Lexington, KY 40506
  234. X    eric@ms.uky.edu, ..!cbosgd!ukma!eric 
  235. X
  236. XVersion 2.1
  237. X
  238. XThanks to 
  239. X1.  Mike "Ford" Ditto
  240. X    kenobi!ford@crash.CTS.COM, ...!crash!kenobi!ford
  241. X    for his bug fix in the ptyrelease routine.
  242. X2.  Michael Bloom 
  243. X    mb@ttidca.tti.com
  244. X    for his bug fix to the master read routine in the original driver.
  245. X    I incorporated this fix and it seems to work fine.
  246. X
  247. XThis directory contains the PD pty driver for System V, modified for
  248. Xuse with the AT&T UnixPC or Convergent Technologies Safari 4 computers,
  249. Xrunning Version 3.51 of the UNIX System V OS (it may also work on
  250. Xearlier versions, but I have no way of verifying this).  Anyone using
  251. Xthis driver should have no problems, but I will provide little support.
  252. XQuestions should be sent to the above address, either with ground mail
  253. Xor real (e-)mail.
  254. X
  255. X
  256. XThis README is intended to mark the changes made to the PD pty driver to
  257. Xsatisfy the author's request.  It was not easy or feasible to clearly mark
  258. Xevery change in the code, thus it was decided that an explanation of the
  259. Xprocedure would probably be enough.  A brief introduction to UnixPC 
  260. Xdevice drivers is followed by the list of changes made.  A couple of
  261. Xhacks will also be explained.
  262. X
  263. XNOTE: The #ifdef DEBUG statements use eprintf() instead of printf().
  264. X      This puts any messages into the error icon's queue of system 
  265. X      errors (the icon is the !! icon at the top of the console).
  266. X
  267. X
  268. XUnixPC device drivers:
  269. X
  270. X    The UnixPC has a different kind of device driver from other 
  271. XSystem V machines.  They can be loaded while the machine is running or
  272. Xat boot time, but are always linked into the OS while the kernel is
  273. Xactive.  However nice this may be, there ARE some problems.  
  274. X
  275. X    1.  Loadable device drivers CANNOT communicate with one another.
  276. X        That is, one driver cannot use a data structure defined in 
  277. X        another driver (IE. they are not in the same identifier
  278. X        name space).  
  279. X    2.  Conf.c doesn't exist, it is redone by the /etc/lddrv -av 
  280. X        program and relinked into the kernel.  Thus, one can't
  281. X        declare common structures this way.
  282. X    
  283. X
  284. XChanges to the PD pty driver:
  285. X
  286. X    The following changes (hacks?) were made to the PD pty driver for
  287. Xthe purpose of making it usable on the UnixPC.
  288. X
  289. X       Problem 1 & 2 influenced me to try to make a single driver
  290. X       (there were two, ptm and pts).  How could one do this?
  291. X       My solution (and I would be very interested if you can
  292. X       think of a better one) was to create the slave devices
  293. X       /dev/tty[p-z][0-f] with minor numbers 0-(PTYCNT/2-1) and
  294. X       master devices /dev/pty[p-z][0-f] with minor numbers 
  295. X       (PTYCNT/2)-(PTYCNT-1).  Major numbers of both types of devices
  296. X       are the same. I can then simply define a macro to determine 
  297. X       whether the dev_t passed to the driver was a slave or master 
  298. X       pty.  Once determined, I can perform the appropriate duties.  
  299. X       Also, it was more readable to merge the ptm and pts modules 
  300. X       into a single set of pty[open, close, ioctl, read, write]
  301. X       routines.  I added a release routine so that the kernel will
  302. X       know the device has properly released if one deallocates
  303. X       the driver. 
  304. X       Another modification was the addition of ptystate[], which
  305. X       holds the MRWAIT, MWWAIT, MOPEN flags.  This was necessary
  306. X       because the original author insisted upon using 3 UNUSED
  307. X       bits in the t_state field of the tty.  The UnixPC does not
  308. X       have any free bits here.
  309. X       A check for TTIOW was added due to the fix by Michael
  310. X       Bloom in the master section of the ptyread() routine.  Note 
  311. X       his original fixes were for the original pty driver and
  312. X       most of the changes were already incorporated into this driver.
  313. X
  314. XMaking alterations to the number of ptys, etc.
  315. X       The number of ptys is defined in the file number-ptys.h.  This 
  316. X       number should not exceed the maximum minor device number divided by
  317. X       two.  Ie. a maximum minor device number of 128 would allow
  318. X       a maximum of 64 ptys.  It is currently defined at only 32, but
  319. X       I believe this is quite liberal, especially for a machine as
  320. X       small as a 3b1.  One could load the driver multiple times by
  321. X       calling it a different name in the /etc/master file.  One could
  322. X       have the first 64 ptys with major number 10, the next 64 with
  323. X       major number 11, etc.  I think 64 should do fine for any reasonable
  324. X       UNIX PC user (good grief, how would one use 64 ptys on a max
  325. X          5 user machine?  Better yet, how would one get 5 users on the
  326. X         thing?  Yuch!).  At any rate, we don't use that many ptys on
  327. X       a large system with lots of users.... so I really don't see this
  328. X       as a problem.
  329. X       
  330. X
  331. XPty driver generation and installation procedure.
  332. X       Put the number of ptys you want in the file number-ptys.h.
  333. X       Type "make"
  334. X       Type "/bin/sh MKflop"
  335. X       Insert a floppy diskette.
  336. X       Use the UA to install the diskette.
  337. X       (you can skip the floppy part and simply run the Install script 
  338. X       in the same directory the pty.o object is located.  But you
  339. X       won't be able to uninstall it from the UA.  There is a
  340. X       Remove script to do this which you will have to run manually.)
  341. X
  342. XAcknowledgement:  I realize the usage of a single major device number is
  343. Xa supreme hack, and I welcome any improvements/solutions.  I do not assume
  344. Xany responsibility for the changes I have made, nor do I imply any 
  345. Xliability on the part of the original author.  I include a complete set
  346. Xof {Install, Remove, etc, etc} scripts so that binary floppies may be
  347. Xmade to be installed by the UnixPC user agent.  I do not assume any
  348. Xresponsibility for these either.  I don't assume any responsibility for
  349. Xanything even remotely related to this stuff.
  350. X
  351. X
  352. X        Eric H. Herrin II
  353. X        University of Kentucky Mathematical Sciences Laboratories
  354. X        eric@ms.uky.edu, !cbosgd!ukma!eric
  355. X
  356. SHAR_EOF
  357. if test 5891 -ne "`wc -c < 'README.3b1'`"
  358. then
  359.     echo shar: error transmitting "'README.3b1'" '(should have been 5891 characters)'
  360. fi
  361. fi # end of overwriting check
  362. echo shar: extracting "'READ_ME'" '(1624 characters)'
  363. if test -f 'READ_ME'
  364. then
  365.     echo shar: will not over-write existing file "'READ_ME'"
  366. else
  367. sed 's/^X//'  >'READ_ME' <<'SHAR_EOF'
  368. XThis is a pseudo tty driver for system V machines. It works very
  369. Xsimilar to ptys on BSD, for instance emacs works fine. To install this
  370. Xdriver you will need to modify your `master' and `dfile' file which
  371. Xcontains your driver specifications. As these vary from machine to machine,
  372. Xyou will have to look up in your manual how to do that. Here is an example
  373. Xfor a sperry s5050 alias ncr tower 32 :
  374. X
  375. XAdd the following two lines to the driver description section in master:
  376. Xpts    0    237    244    pts    0    0    28    32    0    tty
  377. Xptm    0    37    344    ptm    0    0    29    0    0
  378. X
  379. XThis says there are max 32 pts devices at major number 28 having associated
  380. Xtty structures and 0 ptm devices having major number 29 with no associated
  381. Xdata. The number of ptm devices is not configurable, as this depends on the
  382. Xnumber of pts's.
  383. X
  384. XThe following two lines go in the dfile:
  385. Xpts    0    0    0
  386. Xptm    0    0    0
  387. X
  388. XProbably you will also want to increase the NCLIST parameter.
  389. X
  390. XIf your configuration procedure is different, you must change the shell
  391. Xscript mkpty, which is used to create the device nodes in /dev.
  392. X
  393. XThe ptm devices (/dev/pty[p-z][0-9a-f]) are the controlling ones, everything
  394. Xwritten there will show up at the associated pts device
  395. X(/dev/tty[p-z][0-9a-f]), as well as erverything which is written on the pts
  396. Xdevice will show up on the ptm device. The pts side will accept the usual
  397. Xtermio ioctl calls. The master side is a bit different, as ioctl calls which
  398. Xnormally wait for output to drain flush output. The reason for this funny
  399. Xbehaviour is that otherwise the master side will hang. Also the master side
  400. Xmay be opened only once, further open calls will result in an EBUSY error.
  401. SHAR_EOF
  402. if test 1624 -ne "`wc -c < 'READ_ME'`"
  403. then
  404.     echo shar: error transmitting "'READ_ME'" '(should have been 1624 characters)'
  405. fi
  406. fi # end of overwriting check
  407. echo shar: extracting "'Remove'" '(1065 characters)'
  408. if test -f 'Remove'
  409. then
  410.     echo shar: will not over-write existing file "'Remove'"
  411. else
  412. sed 's/^X//'  >'Remove' <<'SHAR_EOF'
  413. XPTYCNT=32
  414. X# Eric H. Herrin II
  415. X# University of Kentucky Mathematical Sciences
  416. X# eric@ms.uky.edu, eric@ms.uky.csnet, !cbosgd!ukma!eric
  417. X#
  418. X# Remove script for pty driver.
  419. XMODULE=pty
  420. Xecho "Removing /etc/lddrv entries and /etc/master entries"
  421. X/etc/lddrv/lddrv -d ${MODULE}
  422. X/etc/masterupd -d ${MODULE}
  423. X# remove the pty device files
  424. Xcnt=0
  425. Xecho "Removing the pty device files"
  426. Xfor x in p q r s t u v w x y z
  427. Xdo
  428. X    for y in 0 1 2 3 4 5 6 7 8 9 a b c d e f
  429. X    do
  430. X        i=$x$y
  431. X        if [ ${cnt} -ge ${PTYCNT} ] 
  432. X        then 
  433. X            break
  434. X        fi
  435. X        /bin/rm -f /dev/pty$i
  436. X        /bin/rm -f /dev/tty$i
  437. X        cnt=`expr ${cnt} + 1`
  438. X    done
  439. Xdone
  440. X# get rid of stuff in /etc/lddrv
  441. Xecho "removing InstDrv entries, etc."
  442. X/bin/rm -f /etc/lddrv/${MODULE}.o /etc/lddrv/${MODULE} \
  443. X    /etc/lddrv/ifile.${MODULE}
  444. Xgrep -v "^${MODULE}" /etc/lddrv/drivers > /tmp/XXX$$
  445. Xmv /tmp/XXX$$ /etc/lddrv/drivers
  446. Xgrep -v "${MODULE}" /etc/lddrv/InstDrv > /tmp/XXX$$
  447. Xmv /tmp/XXX$$ /etc/lddrv/InstDrv
  448. Xchmod +r /etc/lddrv/drivers /etc/lddrv/InstDrv
  449. Xchmod go-w /etc/lddrv/drivers /etc/lddrv/InstDrv
  450. Xchown root /etc/lddrv/drivers /etc/lddrv/InstDrv
  451. SHAR_EOF
  452. if test 1065 -ne "`wc -c < 'Remove'`"
  453. then
  454.     echo shar: error transmitting "'Remove'" '(should have been 1065 characters)'
  455. fi
  456. chmod +x 'Remove'
  457. fi # end of overwriting check
  458. echo shar: extracting "'Remove.orig'" '(1055 characters)'
  459. if test -f 'Remove.orig'
  460. then
  461.     echo shar: will not over-write existing file "'Remove.orig'"
  462. else
  463. sed 's/^X//'  >'Remove.orig' <<'SHAR_EOF'
  464. X# Eric H. Herrin II
  465. X# University of Kentucky Mathematical Sciences
  466. X# eric@ms.uky.edu, eric@ms.uky.csnet, !cbosgd!ukma!eric
  467. X#
  468. X# Remove script for pty driver.
  469. XMODULE=pty
  470. Xecho "Removing /etc/lddrv entries and /etc/master entries"
  471. X/etc/lddrv/lddrv -d ${MODULE}
  472. X/etc/masterupd -d ${MODULE}
  473. X# remove the pty device files
  474. Xcnt=0
  475. Xecho "Removing the pty device files"
  476. Xfor x in p q r s t u v w x y z
  477. Xdo
  478. X    for y in 0 1 2 3 4 5 6 7 8 9 a b c d e f
  479. X    do
  480. X        i=$x$y
  481. X        if [ ${cnt} -ge ${PTYCNT} ] 
  482. X        then 
  483. X            break
  484. X        fi
  485. X        /bin/rm -f /dev/pty$i
  486. X        /bin/rm -f /dev/tty$i
  487. X        cnt=`expr ${cnt} + 1`
  488. X    done
  489. Xdone
  490. X# get rid of stuff in /etc/lddrv
  491. Xecho "removing InstDrv entries, etc."
  492. X/bin/rm -f /etc/lddrv/${MODULE}.o /etc/lddrv/${MODULE} \
  493. X    /etc/lddrv/ifile.${MODULE}
  494. Xgrep -v "^${MODULE}" /etc/lddrv/drivers > /tmp/XXX$$
  495. Xmv /tmp/XXX$$ /etc/lddrv/drivers
  496. Xgrep -v "${MODULE}" /etc/lddrv/InstDrv > /tmp/XXX$$
  497. Xmv /tmp/XXX$$ /etc/lddrv/InstDrv
  498. Xchmod +r /etc/lddrv/drivers /etc/lddrv/InstDrv
  499. Xchmod go-w /etc/lddrv/drivers /etc/lddrv/InstDrv
  500. Xchown root /etc/lddrv/drivers /etc/lddrv/InstDrv
  501. SHAR_EOF
  502. if test 1055 -ne "`wc -c < 'Remove.orig'`"
  503. then
  504.     echo shar: error transmitting "'Remove.orig'" '(should have been 1055 characters)'
  505. fi
  506. chmod +x 'Remove.orig'
  507. fi # end of overwriting check
  508. echo shar: extracting "'Size'" '(3 characters)'
  509. if test -f 'Size'
  510. then
  511.     echo shar: will not over-write existing file "'Size'"
  512. else
  513. sed 's/^X//'  >'Size' <<'SHAR_EOF'
  514. X61
  515. SHAR_EOF
  516. if test 3 -ne "`wc -c < 'Size'`"
  517. then
  518.     echo shar: error transmitting "'Size'" '(should have been 3 characters)'
  519. fi
  520. fi # end of overwriting check
  521. echo shar: extracting "'Version'" '(4 characters)'
  522. if test -f 'Version'
  523. then
  524.     echo shar: will not over-write existing file "'Version'"
  525. else
  526. sed 's/^X//'  >'Version' <<'SHAR_EOF'
  527. X2.1
  528. SHAR_EOF
  529. if test 4 -ne "`wc -c < 'Version'`"
  530. then
  531.     echo shar: error transmitting "'Version'" '(should have been 4 characters)'
  532. fi
  533. fi # end of overwriting check
  534. echo shar: extracting "'number-ptys.h'" '(176 characters)'
  535. if test -f 'number-ptys.h'
  536. then
  537.     echo shar: will not over-write existing file "'number-ptys.h'"
  538. else
  539. sed 's/^X//'  >'number-ptys.h' <<'SHAR_EOF'
  540. X/* number-ptys.h - Eric H. Herrin II
  541. X *
  542. X * define the number of ptys here so the actual number only has to be in
  543. X * one place.
  544. X * 
  545. X * Version 2.1
  546. X */
  547. X#define NUMBER_OF_PTYS 32
  548. SHAR_EOF
  549. if test 176 -ne "`wc -c < 'number-ptys.h'`"
  550. then
  551.     echo shar: error transmitting "'number-ptys.h'" '(should have been 176 characters)'
  552. fi
  553. fi # end of overwriting check
  554. echo shar: extracting "'pty.c'" '(9946 characters)'
  555. if test -f 'pty.c'
  556. then
  557.     echo shar: will not over-write existing file "'pty.c'"
  558. else
  559. sed 's/^X//'  >'pty.c' <<'SHAR_EOF'
  560. X/*
  561. X * pty.c - Berkeley style pseudo tty driver for system V
  562. X *
  563. X * Copyright (c) 1987, Jens-Uwe Mager, FOCUS Computer GmbH
  564. X * Not derived from licensed software.
  565. X *
  566. X * Permission is granted to freely use, copy, modify, and redistribute
  567. X * this software, provided that no attempt is made to gain profit from it,
  568. X * the author is not construed to be liable for any results of using the
  569. X * software, alterations are clearly marked as such, and this notice is
  570. X * not modified.
  571. X */
  572. X
  573. X/*
  574. X * Modified for use on the UnixPC by:
  575. X * Eric H. Herrin II
  576. X * University of Kentucky Mathematical Sciences Laboratories
  577. X * eric@ms.uky.edu, eric@ms.uky.csnet, !cbosgd!ukma!eric
  578. X *
  579. X * See README.3b1 for details of port and installation.
  580. X * Version 2.1
  581. X */
  582. X
  583. X/*
  584. X * the following are arbitrary 3 unused bits from t_state
  585. X * in sys/tty.h
  586. X */
  587. X/* The UnixPC does not have any extra bits in t_state, thus
  588. X * one must provide other means of storing the state.
  589. X */
  590. X#define MRWAIT    01    /* master waiting in read */
  591. X#define t_rloc    t_cc[0]        /* wchannel */
  592. X#define MWWAIT    02    /* master waiting in write */
  593. X#define t_wloc    t_cc[1]        /* wchannel */
  594. X#define MOPEN    04    /* master is open */
  595. X
  596. X#include "pty.h"
  597. X#include "sys/param.h"
  598. X#include "sys/types.h"
  599. X#include "sys/sysmacros.h"
  600. X#include "sys/systm.h"
  601. X#include "sys/file.h"
  602. X#include "sys/conf.h"
  603. X#include "sys/proc.h"
  604. X#include "sys/dir.h"
  605. X#include "sys/tty.h"
  606. X#include "sys/signal.h"
  607. X#include "sys/user.h"
  608. X#include "sys/errno.h"
  609. X#include "sys/termio.h"
  610. X#include "sys/ttold.h"
  611. X
  612. X/* The tty structures must be local to this driver.  One doesn't have
  613. X * conf.c
  614. X */
  615. Xstruct tty pts_tty[PTYCNT];
  616. Xint pts_cnt = PTYCNT;
  617. Xint ptystate[PTYCNT];
  618. X
  619. Xptyopen(dev, flag)
  620. X    register dev_t        dev;
  621. X    register int        flag;
  622. X{
  623. X    register struct tty *tp;
  624. X
  625. X    dev = minor(dev);
  626. X    if (Master(dev) == True) {
  627. X#        ifdef DEBUG
  628. X        eprintf("open(master): \n");
  629. X#        endif
  630. X        dev -= PTYCNT; 
  631. X        tp = &pts_tty[dev];
  632. X        if (dev >= pts_cnt) {
  633. X            u.u_error = ENXIO;
  634. X            return;
  635. X        }
  636. X        /*
  637. X         * allow only one controlling process
  638. X         */
  639. X        if (ptystate[dev] & MOPEN) {
  640. X            u.u_error = EBUSY;
  641. X            return;
  642. X        }
  643. X        if (tp->t_state & WOPEN)
  644. X            wakeup((caddr_t)&tp->t_canq);
  645. X        tp->t_state |= CARR_ON;
  646. X        ptystate[dev] |= MOPEN;
  647. X    } else {
  648. X#        ifdef DEBUG
  649. X        eprintf("open(slave): \n");
  650. X#        endif
  651. X        tp = &pts_tty[dev];
  652. X        if (dev >= pts_cnt) {
  653. X            u.u_error = ENXIO;
  654. X            return;
  655. X        }
  656. X        if ((tp->t_state & (ISOPEN|WOPEN)) == 0) {
  657. X            ttinit(tp);
  658. X            tp->t_proc = ptsproc;
  659. X        }
  660. X        /*
  661. X           * if master is still open, don't wait for carrier
  662. X          */
  663. X        if (ptystate[dev] & MOPEN)
  664. X            tp->t_state |= CARR_ON;
  665. X        if (!(flag & FNDELAY)) {
  666. X            while ((tp->t_state & CARR_ON) == 0) {
  667. X                tp->t_state |= WOPEN;
  668. X                sleep((caddr_t)&tp->t_canq, TTIPRI);
  669. X            }
  670. X        }
  671. X        (*linesw[tp->t_line].l_open)(tp);
  672. X    }
  673. X}
  674. X
  675. Xptyclose(dev, flag)
  676. X    register dev_t        dev;
  677. X    register int        flag;
  678. X{
  679. X        register struct tty     *tp;
  680. X
  681. X    dev = minor(dev);
  682. X    if (Master(dev) == True) {
  683. X#        ifdef DEBUG
  684. X        eprintf("close(master): \n");
  685. X#        endif
  686. X        dev -= PTYCNT;
  687. X        tp = &pts_tty[dev];
  688. X        if (tp->t_state & ISOPEN) {
  689. X            signal(tp->t_pgrp, SIGHUP);
  690. X            ttyflush(tp, FREAD|FWRITE);
  691. X        }
  692. X        /*
  693. X          * virtual carrier gone
  694. X          */
  695. X        tp->t_state &= ~(CARR_ON);
  696. X        ptystate[dev] &= ~MOPEN;
  697. X    } else {
  698. X#        ifdef DEBUG
  699. X        eprintf("close(slave): \n");
  700. X#        endif
  701. X        tp = &pts_tty[dev];
  702. X        (*linesw[tp->t_line].l_close)(tp);
  703. X        tp->t_state &= ~CARR_ON;
  704. X    }
  705. X}
  706. X
  707. Xptyread(dev)
  708. X        register dev_t        dev;
  709. X{
  710. X    register struct tty     *tp;
  711. X    register                n;
  712. X
  713. X    dev = minor(dev);
  714. X    if (Master(dev) == True) {
  715. X#        ifdef DEBUG
  716. X        eprintf("read(master): \n");
  717. X#        endif
  718. X        dev -= PTYCNT;        
  719. X                tp = &pts_tty[dev];
  720. X
  721. X        /* added fix for hanging master side when the slave hangs
  722. X         * up too early.  Fix by Michael Bloom (mb@ttidca.tti.com).
  723. X         */
  724. X        if ((tp->t_state & (ISOPEN|TTIOW)) == 0) {
  725. X            u.u_error = EIO;
  726. X            return;
  727. X        }
  728. X        while (u.u_count > 0) {
  729. X            ptsproc(tp, T_OUTPUT);
  730. X            if ((tp->t_state & (TTSTOP|TIMEOUT))
  731. X                || tp->t_tbuf.c_ptr == NULL || tp->t_tbuf.c_count == 0) {
  732. X                if (u.u_fmode & FNDELAY)
  733. X                    break;
  734. X#                ifdef DEBUG
  735. X                eprintf("read(master): master going to sleep\n");
  736. X#                endif
  737. X                ptystate[dev] |= MRWAIT;
  738. X                sleep((caddr_t)&tp->t_rloc, TTIPRI);
  739. X#                ifdef DEBUG
  740. X                eprintf("read(master): master woke up\n");
  741. X#                endif
  742. X
  743. X                continue;
  744. X            }
  745. X            n = min(u.u_count, tp->t_tbuf.c_count);
  746. X            if (n) {
  747. X#                ifdef DEBUG
  748. X                eprintf("read(master): got some stuff\n");
  749. X#                endif
  750. X                if (copyout(tp->t_tbuf.c_ptr, u.u_base, n)) {
  751. X                    u.u_error = EFAULT;
  752. X                    break;
  753. X                }
  754. X                tp->t_tbuf.c_count -= n;
  755. X                tp->t_tbuf.c_ptr += n;
  756. X                u.u_base += n;
  757. X                u.u_count -= n;
  758. X            }
  759. X        }
  760. X    } else {
  761. X#        ifdef DEBUG
  762. X        eprintf("read(slave): \n");
  763. X#        endif
  764. X        tp = &pts_tty[dev];
  765. X#        ifdef DEBUG
  766. X        eprintf("read(slave): got some stuff\n");
  767. X#        endif
  768. X        (*linesw[tp->t_line].l_read)(tp);
  769. X    }
  770. X}
  771. X    
  772. Xptywrite(dev)
  773. X    register dev_t        dev;
  774. X{
  775. X    register struct tty     *tp;
  776. X    register                n;
  777. X
  778. X    dev = minor(dev);
  779. X    if (Master(dev) == True) {
  780. X#        ifdef DEBUG
  781. X        eprintf("write(master): \n");
  782. X#        endif
  783. X        dev -= PTYCNT;
  784. X        tp = &pts_tty[dev];
  785. X        
  786. X        if ((tp->t_state & ISOPEN) == 0) {
  787. X            u.u_error = EIO;
  788. X            return;
  789. X        }
  790. X        while (u.u_count > 0) {
  791. X            if ((tp->t_state & TBLOCK) || tp->t_rbuf.c_ptr == NULL) {
  792. X                if (u.u_fmode & FNDELAY)
  793. X                    break;
  794. X                ptystate[dev] |= MWWAIT;
  795. X#                ifdef DEBUG
  796. X                eprintf("write(master): going to sleep\n");
  797. X#                endif
  798. X
  799. X                sleep((caddr_t)&tp->t_wloc, TTOPRI);
  800. X
  801. X#                ifdef DEBUG
  802. X                eprintf("write: waking up\n");
  803. X#                endif
  804. X
  805. X                continue;
  806. X            }
  807. X            n = min(u.u_count, tp->t_rbuf.c_count);
  808. X            if (n) {
  809. X#                ifdef DEBUG
  810. X                eprintf("write(master): sending some stuff\n");
  811. X#                endif
  812. X                if (copyin(u.u_base,tp->t_rbuf.c_ptr, n)) {
  813. X                    u.u_error = EFAULT;
  814. X                    break;
  815. X                }
  816. X                tp->t_rbuf.c_count -= n;
  817. X                u.u_base += n;
  818. X                u.u_count -= n;
  819. X            }
  820. X            (*linesw[tp->t_line].l_input)(tp);
  821. X        }
  822. X    } else {
  823. X#        ifdef DEBUG
  824. X        eprintf("write(slave): \n");
  825. X#        endif
  826. X        tp = &pts_tty[dev];
  827. X#        ifdef DEBUG
  828. X        eprintf("write(slave): sending some stuff\n");
  829. X#        endif
  830. X        (*linesw[tp->t_line].l_write)(tp);
  831. X    }
  832. X}
  833. X
  834. Xptyioctl(dev, cmd, arg, mode)
  835. X    dev_t        dev;
  836. X    int        cmd, arg, mode;
  837. X{
  838. X    register struct tty *tp;
  839. X
  840. X    dev = minor(dev);
  841. X    if (Master(dev) == True) {
  842. X#        ifdef DEBUG
  843. X        eprintf("ioctl(master): \n");
  844. X#        endif
  845. X        dev -= PTYCNT;
  846. X        tp = &pts_tty[dev];
  847. X        /*
  848. X          * sorry, but we can't fiddle with the tty struct without
  849. X          * having done LDOPEN
  850. X          */
  851. X        if (tp->t_state & ISOPEN) {
  852. X            if (cmd == TCSBRK && arg ==  NULL) {
  853. X                signal(tp->t_pgrp, SIGINT);
  854. X                if ((tp->t_iflag & NOFLSH) == 0)
  855. X                    ttyflush(tp, FREAD|FWRITE);
  856. X            } else {
  857. X                /*
  858. X                  * we must flush output to avoid hang in ttywait
  859. X                  */
  860. X                if (cmd == TCSETAW || cmd == TCSETAF || 
  861. X                   cmd == TCSBRK || cmd == TIOCSETP)
  862. X                    ttyflush(tp, FWRITE);
  863. X                ttiocom(tp, cmd, arg, mode);
  864. X            }
  865. X        }
  866. X    } else {
  867. X#        ifdef DEBUG
  868. X        eprintf("ioctl(slave): \n");
  869. X#        endif
  870. X        tp = &pts_tty[dev];
  871. X        ttiocom(tp, cmd, arg, mode);
  872. X    }
  873. X}
  874. X
  875. Xptsproc(tp, cmd)
  876. Xregister struct tty *tp;
  877. X{
  878. X    register struct ccblock *tbuf;
  879. X    extern ttrstrt();
  880. X
  881. X    switch (cmd) {
  882. X    case T_TIME:
  883. X#        ifdef DEBUG
  884. X        eprintf("ptsproc: T_TIME:\n");
  885. X#        endif
  886. X        tp->t_state &= ~TIMEOUT;
  887. X        goto start;
  888. X    case T_WFLUSH:
  889. X#        ifdef DEBUG
  890. X        eprintf("ptsproc: T_WFLUSH:\n");
  891. X#        endif
  892. X        tp->t_tbuf.c_size  -= tp->t_tbuf.c_count;
  893. X        tp->t_tbuf.c_count = 0;
  894. X        /* fall through */
  895. X    case T_RESUME:
  896. X#        ifdef DEBUG
  897. X        eprintf("ptsproc: T_RESUME:\n");
  898. X#        endif
  899. X        tp->t_state &= ~TTSTOP;
  900. X        /* fall through */
  901. X    case T_OUTPUT:
  902. Xstart:
  903. X#        ifdef DEBUG
  904. X        eprintf("ptsproc: T_OUTPUT:\n");
  905. X#        endif
  906. X        if (tp->t_state & (TTSTOP|TIMEOUT))
  907. X            break;
  908. X#        ifdef DEBUG
  909. X        eprintf("ptsproc: T_OUTPUT: past(TTSTOP|TIMEOUT)");
  910. X#        endif
  911. X        tbuf = &tp->t_tbuf;
  912. X        if (tbuf->c_ptr == NULL || tbuf->c_count == 0) {
  913. X#        ifdef DEBUG
  914. X        eprintf("ptsproc: T_OUTPUT: tbuf empty, may break\n");
  915. X#        endif
  916. X            if (tbuf->c_ptr)
  917. X                tbuf->c_ptr -= tbuf->c_size;
  918. X            if (!(CPRES & (*linesw[tp->t_line].l_output)(tp)))
  919. X                break;
  920. X        }
  921. X        if (tbuf->c_count && (ptystate[tp-pts_tty] & MRWAIT)) {
  922. X#        ifdef DEBUG
  923. X        eprintf("ptsproc: T_OUTPUT: waking up master\n");
  924. X#        endif
  925. X            ptystate[tp-pts_tty] &= ~MRWAIT;
  926. X            wakeup((caddr_t)&tp->t_rloc);
  927. X        }
  928. X#        ifdef DEBUG
  929. X        eprintf("ptsproc: T_OUTPUT: leaving end\n");
  930. X#        endif
  931. X        break;
  932. X    case T_SUSPEND:
  933. X#        ifdef DEBUG
  934. X        eprintf("ptsproc: T_SUSPEND:\n");
  935. X#        endif
  936. X        tp->t_state |= TTSTOP;
  937. X        break;
  938. X    case T_BLOCK:
  939. X#        ifdef DEBUG
  940. X        eprintf("ptsproc: T_BLOCK:\n");
  941. X#        endif
  942. X        /*
  943. X         * the check for ICANON appears to be neccessary
  944. X         * to avoid a hang when overflowing input
  945. X         */
  946. X        if ((tp->t_iflag & ICANON) == 0)
  947. X            tp->t_state |= TBLOCK;
  948. X        break;
  949. X    case T_BREAK:
  950. X#        ifdef DEBUG
  951. X        eprintf("ptsproc: T_BREAK:\n");
  952. X#        endif
  953. X        tp->t_state |= TIMEOUT;
  954. X        timeout(ttrstrt, tp, HZ/4);
  955. X        break;
  956. X#ifdef T_LOG_FLUSH
  957. X    case T_LOG_FLUSH:
  958. X#endif
  959. X    case T_RFLUSH:
  960. X#        ifdef DEBUG
  961. X        eprintf("ptsproc: T_RFLUSH:\n");
  962. X#        endif
  963. X        if (!(tp->t_state & TBLOCK))
  964. X            break;
  965. X        /* fall through */
  966. X    case T_UNBLOCK:
  967. X#        ifdef DEBUG
  968. X        eprintf("ptsproc: T_UNBLOCK:\n");
  969. X#        endif
  970. X        tp->t_state &= ~(TTXOFF|TBLOCK);
  971. X        /* fall through */
  972. X    case T_INPUT:
  973. X#        ifdef DEBUG
  974. X        eprintf("ptsproc: T_INPUT:\n");
  975. X#        endif
  976. X        if (ptystate[tp-pts_tty] & MWWAIT) {
  977. X            ptystate[tp-pts_tty] &= ~MWWAIT;
  978. X#            ifdef DEBUG
  979. X            eprintf("ptsproc: T_INPUT: waking up master\n");
  980. X#            endif
  981. X            wakeup((caddr_t)&tp->t_wloc);
  982. X        }
  983. X        break;
  984. X    default:
  985. X#        ifdef DEBUG
  986. X        eprintf("ptsproc: default:\n");
  987. X#        else
  988. X        ;
  989. X#        endif
  990. X    }
  991. X}
  992. X    
  993. X/* This routine used to be a stub, however, an industrious soul found
  994. X * the release routine caused a panic whenever the driver is released
  995. X * and some ptys are still open.  The simple 'for' loop fixes this 
  996. X * problem.
  997. X *
  998. X * Credit should be given to:
  999. X * Mike "Ford" Ditto
  1000. X * kenobi!ford@crash.CTS.COM, ...!crash!kenobi!ford
  1001. X * for finding the bug and writing the for loop.
  1002. X *
  1003. X * [Eric H. Herrin II, 10-7-87]
  1004. X */
  1005. Xptyrelease()
  1006. X{
  1007. X    register int     i;
  1008. X
  1009. X#    ifdef DEBUG
  1010. X    eprintf("ptyrelease:\n");
  1011. X#    endif
  1012. X    for (i=0; i<PTYCNT; i++)
  1013. X        if ((ptystate[i] & (ISOPEN|MOPEN)) || 
  1014. X                   (pts_tty[i].t_state & WOPEN)) {
  1015. X            u.u_error = EBUSY;
  1016. X            return;
  1017. X        }
  1018. X    return;
  1019. X}
  1020. SHAR_EOF
  1021. if test 9946 -ne "`wc -c < 'pty.c'`"
  1022. then
  1023.     echo shar: error transmitting "'pty.c'" '(should have been 9946 characters)'
  1024. fi
  1025. fi # end of overwriting check
  1026. echo shar: extracting "'pty.h'" '(854 characters)'
  1027. if test -f 'pty.h'
  1028. then
  1029.     echo shar: will not over-write existing file "'pty.h'"
  1030. else
  1031. sed 's/^X//'  >'pty.h' <<'SHAR_EOF'
  1032. X/* pty.h - Eric H. Herrin II (eric@ms.uky.edu)
  1033. X * 
  1034. X * some elementary definitions for the pty driver (UnixPC version)
  1035. X *
  1036. X * Version 2.1
  1037. X */
  1038. X
  1039. Xint ptsproc();
  1040. X
  1041. X#define True  (1 == 1)
  1042. X#define False (0 == 1)
  1043. X
  1044. X/*  This is the total number of ptys.  Note the maximum number here is
  1045. X *  currently 64 for the UnixPC (128 minor devices/2 minor devices per pty
  1046. X *  yields 64 total ptys).  I really don't see the need for more than 32
  1047. X *  on the 3B1, however, if someone does, then (s)he can change it.
  1048. X */
  1049. X#include "number-ptys.h"
  1050. X#define PTYCNT (dev_t)NUMBER_OF_PTYS
  1051. X
  1052. X/* some definitions to include kernel info from system header files.
  1053. X */
  1054. X#define KERNEL 1
  1055. X#define defined_io 1
  1056. X#define NOSTREAMS 1
  1057. X
  1058. X#define UNIXPC 1
  1059. X
  1060. X/* This macro returns True if the parameter is a master minor device number,
  1061. X * False otherwise.
  1062. X */
  1063. X#define Master( dev )    (minor(dev) >= PTYCNT)
  1064. SHAR_EOF
  1065. if test 854 -ne "`wc -c < 'pty.h'`"
  1066. then
  1067.     echo shar: error transmitting "'pty.h'" '(should have been 854 characters)'
  1068. fi
  1069. fi # end of overwriting check
  1070. :    End of shell archive
  1071. exit 0
  1072. -- 
  1073. |  Eric Herrin II: {cbosgd!ukma!eric, eric@UKMA.BITNET, eric@ms.uky.edu}      |
  1074. |  "But I soon noticed that while I thus wished to                            |
  1075. |   think everything false, it was necessarily true                           |
  1076. |   that I who thought so was something"   - Rene Descartes                   |
  1077.