From 7eb12ee68bae99472b02edc0bd6be92fae3e00bb Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Sat, 17 Dec 2022 17:22:41 -0800 Subject: [PATCH] Revert "Lmm cleanup new shell device (#1006)" (#1033) This reverts commit 97cb04be46c9762ed2cb8776d26bf2e00ead63b4. --- library/UNIXCOMM | 295 +++++++++++++++++++++++++++++++----------- library/UNIXCOMM.LCOM | Bin 6981 -> 8367 bytes 2 files changed, 216 insertions(+), 79 deletions(-) diff --git a/library/UNIXCOMM b/library/UNIXCOMM index a55afd6b..5251821f 100644 --- a/library/UNIXCOMM +++ b/library/UNIXCOMM @@ -1,12 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "11-Oct-2022 10:18:47" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;4 14580 +(FILECREATED " 8-Oct-2022 16:06:36" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;2 20352 - :CHANGES-TO (FNS CREATE-SHELL-STREAM CREATE-PROCESS-STREAM UNIXCOMM-AROUNDEXITFN - CREATE-UNIX-SOCKET-STREAM ACCEPT-UNIX-SOCKET-STREAM INITIALIZE-SHELL-DEVICE) - (VARS UNIXCOMMCOMS) + :CHANGES-TO (FNS CREATE-PROCESS-STREAM) - :PREVIOUS-DATE " 8-Oct-2022 16:06:36" + :PREVIOUS-DATE " 7-Jul-2022 10:42:46" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;1) @@ -27,10 +25,10 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (FNS FORK-SHELL FORK-UNIX UNIX-KILL UNIX-WRITE CREATE-SHELL-STREAM CREATE-PROCESS-STREAM UNIXCOMM-AROUNDEXITFN)) [COMS (* ; "Operations on the shell device") - (FNS INITIALIZE-SHELL-DEVICE UNIX-GET-NEXT-BUFFER UNIX-BACKFILEPTR-NEW + (FNS INITIALIZE-NEW-SHELL-DEVICE UNIX-GET-NEXT-BUFFER UNIX-BACKFILEPTR-NEW UNIX-STREAM-EOFP-NEW UNIX-STREAM-OUT UNIX-STREAM-CLOSE) - (GLOBALVARS *SHELL-DEVICE*) - (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITIALIZE-SHELL-DEVICE)) + (GLOBALVARS *NEW-SHELL-DEVICE*) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITIALIZE-NEW-SHELL-DEVICE)) (ADDVARS (AROUNDEXITFNS UNIXCOMM-AROUNDEXITFN] (COMS (* ;  "Stuff for direct manipulation of Unix sockets") @@ -38,6 +36,14 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS UNIX-CHANNEL) (P (CHECKIMPORTS '(FILEIO LLSUBRS) T))) + [COMS + (* ;; "Obsolete stuff. This is for pre-Medley1.2, where there wasn't support for buffered input on the shell device") + + (FNS UNIX-BACKFILEPTR UNIX-READ INITIALIZE-SHELL-DEVICE UNIX-STREAM-IN UNIX-STREAM-EOFP + UNIX-STREAM-PEEK) + (GLOBALVARS *SHELL-DEVICE*) + (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS UNIX-PEEKEDCHAR UNIX-LASTCHAR)) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITIALIZE-SHELL-DEVICE] (PROP FILETYPE UNIXCOMM))) @@ -101,17 +107,24 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (RETURN LENGTH-WRITTEN]) (CREATE-SHELL-STREAM - [LAMBDA (TERMTYPE COMMAND) (* ; "Edited 11-Oct-2022 09:56 by lmm") - (* ; "Edited 21-May-90 15:39 by jrb:") - (LET ((CHAN (FORK-SHELL TERMTYPE COMMAND))) + [LAMBDA (TERMTYPE COMMAND) (* ; "Edited 21-May-90 15:39 by jrb:") + (LET ((CHAN (FORK-SHELL TERMTYPE COMMAND)) + (SHELL-DEV (if (SUBRCALL UNIX-HANDLECOMM 8) + then (* ; + "SUBRCALL tests that this is supported") + *NEW-SHELL-DEVICE* + else *SHELL-DEVICE*))) (COND (CHAN (LET ((STR (create STREAM ACCESS _ 'BOTH - DEVICE _ *SHELL-DEVICE*))) + DEVICE _ SHELL-DEV))) (CL:SETF (UNIX-CHANNEL STR) CHAN) + + (* ;; "JRB - In a future release, make *SHELL-DEVICE* below SHELL-DEV, or just remove *SHELL-DEVICE* altogether. Must also hack UNIX-STREAM-CLOSE and the aroundexitfn for Unix streams.") + (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) - STR) + STR) (STREAMPROP STR 'SENDSCREENPARAMS (FUNCTION UNIX.SENDSCREENPARAMS)) (STREAMPROP STR 'SETDISPLAYTYPE (FUNCTION UNIX.SETDISPLAYTYPE)) STR]) @@ -119,40 +132,49 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (CREATE-PROCESS-STREAM [LAMBDA (COMM) - (* ;; "Edited 11-Oct-2022 10:05 by lmm") - (* ;; "Edited 8-Oct-2022 16:04 by lmm") (* ;; "Edited 3-Jul-2022 16:04 by rmk: Removed external format here, the device has the environmental defaultg") + (* ;; "Edited 26-Jun-2022 13:52 by larry") + + (* ;; "Edited 26-Jun-2022 13:31 by lmm - set external format of shell stream to utf-8 ??") + (* ;; "Edited 21-May-90 15:39 by jrb:") - (LET ((CHAN (FORK-UNIX COMM))) - (if CHAN - then (LET ((STR (create STREAM - ACCESS _ 'BOTH - DEVICE _ *SHELL-DEVICE* - EOLCONVENTION _ LF.EOLC))) - (CL:SETF (UNIX-CHANNEL STR) - CHAN) - (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) - STR) - STR]) + (LET* ((SHELL-DEV (if (AND (BOUNDP '*NEW-SHELL-DEVICE*) + (SUBRCALL UNIX-HANDLECOMM 8)) + then (* ; + "SUBRCALL tests that this is supported") + *NEW-SHELL-DEVICE* + else *SHELL-DEVICE*)) + (STR (create STREAM + ACCESS _ 'BOTH + DEVICE _ SHELL-DEV + EOLCONVENTION _ LF.EOLC)) + (CHAN (FORK-UNIX COMM))) + (if CHAN + then (CL:SETF (UNIX-CHANNEL STR) + CHAN) + + (* ;; "JRB - In a future release, make *SHELL-DEVICE* below SHELL-DEV, or just remove *SHELL-DEVICE* altogether. Must also hack UNIX-STREAM-CLOSE and the aroundexitfn for Unix streams.") + + (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) + STR) + STR + else NIL]) (UNIXCOMM-AROUNDEXITFN - [LAMBDA (EVENT) (* ; "Edited 11-Oct-2022 10:07 by lmm") - - (* ;; - "only using *NEW-SHELL-DEVICE* for creation; *SHELL-DEVICE* -- will cleanup in another pass") - (* ; "Edited 2-Jul-90 16:35 by jrb:") + [LAMBDA (EVENT) (* ; "Edited 2-Jul-90 16:35 by jrb:") (CASE EVENT - ((AFTERLOGOUT AFTERMAKESYS AFTERSAVEVM AFTERSYSOUT) - (for STREAM in (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) do (CLOSEF STREAM)) - (REPLACE (FDEV DEFAULTEXTERNALFORMAT) OF *SHELL-DEVICE* WITH (SYSTEM-EXTERNALFORMAT))) + ((AFTERLOGOUT AFTERMAKESYS AFTERSAVEVM AFTERSYSOUT) (for STREAM + in (fetch (FDEV OPENFILELST) + of *SHELL-DEVICE*) + do (CLOSEF STREAM))) ((BEFORELOGOUT BEFOREMAKESYS BEFORESYSOUT) - (* ;; - "Make sure any Unix sockets get closed here, so their file system handles get closed as well") + (* ;; + "Make sure any Unix sockets get closed here, so their file system handles get closed as well") (for STREAM in (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) when (EQ -3 (SUBRCALL UNIX-HANDLECOMM 14 (UNIX-CHANNEL STREAM))) @@ -165,24 +187,25 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (DEFINEQ -(INITIALIZE-SHELL-DEVICE - [LAMBDA NIL (* ; "Edited 11-Oct-2022 09:35 by lmm") - - (* ;; "only using for holding open list") - (* ; "Edited 3-Jul-2022 16:15 by rmk") - (* ; "Edited 14-Dec-88 10:45 by bane") - (SETQ *SHELL-DEVICE* (create FDEV - NODIRECTORIES _ T - DEVICENAME _ 'UNIX-PTY - BIN _ 'UNIX-STREAM-IN - BOUT _ 'UNIX-STREAM-OUT - PEEKBIN _ 'UNIX-STREAM-PEEK - CLOSEFILE _ 'UNIX-STREAM-CLOSE - GETFILEINFO _ 'NILL - SETFILEINFO _ 'NILL - EOFP _ 'UNIX-STREAM-EOFP - BACKFILEPTR _ 'UNIX-BACKFILEPTR - DEFAULTEXTERNALFORMAT _ (SYSTEM-EXTERNALFORMAT]) +(INITIALIZE-NEW-SHELL-DEVICE + [LAMBDA NIL (* ; "Edited 7-Jul-2022 10:41 by rmk") + (* ; "Edited 3-Jul-2022 16:04 by rmk") + (* ; "Edited 12-Feb-90 17:00 by bvm") + (SETQ *NEW-SHELL-DEVICE* (create FDEV + FDBINABLE _ T + NODIRECTORIES _ T + DEVICENAME _ (FUNCTION UNIX-PTY-NEW) + BIN _ (FUNCTION \BUFFERED.BIN) + BOUT _ (FUNCTION UNIX-STREAM-OUT) + PEEKBIN _ (FUNCTION \BUFFERED.PEEKBIN) + CLOSEFILE _ (FUNCTION UNIX-STREAM-CLOSE) + GETFILEINFO _ (FUNCTION NILL) + SETFILEINFO _ (FUNCTION NILL) + EOFP _ (FUNCTION UNIX-STREAM-EOFP-NEW) + BACKFILEPTR _ (FUNCTION UNIX-BACKFILEPTR-NEW) + GETNEXTBUFFER _ (FUNCTION UNIX-GET-NEXT-BUFFER) + BLOCKIN _ (FUNCTION \BUFFERED.BINS) + DEFAULTEXTERNALFORMAT _ (SYSTEM-EXTERNALFORMAT]) (UNIX-GET-NEXT-BUFFER [LAMBDA (STREAM WHATFOR NOERRORFLG) (* ; @@ -257,11 +280,11 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS *SHELL-DEVICE*) +(GLOBALVARS *NEW-SHELL-DEVICE*) ) (DECLARE%: DONTEVAL@LOAD DOCOPY -(INITIALIZE-SHELL-DEVICE) +(INITIALIZE-NEW-SHELL-DEVICE) (ADDTOVAR AROUNDEXITFNS UNIXCOMM-AROUNDEXITFN) @@ -274,23 +297,25 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (DEFINEQ (CREATE-UNIX-SOCKET-STREAM - [LAMBDA (PATHNAME) (* ; "Edited 11-Oct-2022 10:11 by lmm") - (* ; "Edited 29-May-90 16:23 by jrb:") - (LET [(CHAN (SUBRCALL UNIX-HANDLECOMM 12 (\DTEST PATHNAME 'ONED-ARRAY] + [LAMBDA (PATHNAME) (* ; "Edited 29-May-90 16:23 by jrb:") + (LET [(STR (create STREAM + ACCESS _ 'BOTH + DEVICE _ *NEW-SHELL-DEVICE* + EOLCONVENTION _ LF.EOLC)) + (CHAN (SUBRCALL UNIX-HANDLECOMM 12 (\DTEST PATHNAME 'ONED-ARRAY] (if CHAN - then (LET ((STR (create STREAM - ACCESS _ 'BOTH - DEVICE _ *SHELL-DEVICE* - EOLCONVENTION _ LF.EOLC))) - (CL:SETF (UNIX-CHANNEL STR) - CHAN) - (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) - STR) - STR]) + then (CL:SETF (UNIX-CHANNEL STR) + CHAN) + + (* ;; "JRB - In a future release, make *SHELL-DEVICE* below SHELL-DEV, or just remove *SHELL-DEVICE* altogether. Must also hack UNIX-STREAM-CLOSE and the aroundexitfn for Unix streams.") + + (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) + STR) + STR + else NIL]) (ACCEPT-UNIX-SOCKET-STREAM - [LAMBDA (SOCKSTREAM) (* ; "Edited 11-Oct-2022 10:12 by lmm") - (* ; "Edited 29-May-90 16:31 by jrb:") + [LAMBDA (SOCKSTREAM) (* ; "Edited 29-May-90 16:31 by jrb:") (LET ((CHAN (UNIX-CHANNEL SOCKSTREAM)) NEWCHAN) (SELECTQ (SETQ NEWCHAN (SUBRCALL UNIX-HANDLECOMM 13 CHAN)) @@ -298,12 +323,15 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. NEWCHAN) (LET ((NEWSTREAM (create STREAM ACCESS _ 'BOTH - DEVICE _ *SHELL-DEVICE* + DEVICE _ *NEW-SHELL-DEVICE* EOLCONVENTION _ LF.EOLC))) (CL:SETF (UNIX-CHANNEL NEWSTREAM) NEWCHAN) + + (* ;; "JRB - In a future release, make *SHELL-DEVICE* below SHELL-DEV, or just remove *SHELL-DEVICE* altogether. Must also hack UNIX-STREAM-CLOSE and the aroundexitfn for Unix streams.") + (push (fetch (FDEV OPENFILELST) of *SHELL-DEVICE*) - NEWSTREAM) + NEWSTREAM) NEWSTREAM]) ) (DECLARE%: EVAL@COMPILE DONTCOPY @@ -318,13 +346,122 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. T) ) -(PUTPROPS UNIXCOMM FILETYPE COMPILE-FILE) + + +(* ;; +"Obsolete stuff. This is for pre-Medley1.2, where there wasn't support for buffered input on the shell device" +) + +(DEFINEQ + +(UNIX-BACKFILEPTR + [LAMBDA (STREAM) (* ; "Edited 14-Dec-88 09:52 by bane") + + (* ;; "The trick here is to use the existing mechanisms for UNIX-PEEKCHAR") + + (COND + ((UNIX-PEEKEDCHAR STREAM) + (ERROR "Can only back up one character" STREAM)) + ((NOT (UNIX-LASTCHAR STREAM)) + (ERROR "Can't back up past beginning of stream" STREAM)) + (T (CL:SETF (UNIX-PEEKEDCHAR STREAM) + (UNIX-LASTCHAR STREAM]) + +(UNIX-READ + [LAMBDA (STREAM NO-ERROR) (* ; "Edited 14-Dec-88 09:18 by bane") + (LET* [(CONN (UNIX-CHANNEL STREAM)) + (CH (AND CONN (SUBRCALL UNIX-HANDLECOMM 2 (\DTEST CONN 'SMALLP) + 0] + (COND + ((EQ CH T) + NIL) + [(EQ CH NIL) + (COND + (NO-ERROR NIL) + (T (\EOF.ACTION STREAM] + (T (CL:SETF (UNIX-LASTCHAR STREAM) + CH]) + +(INITIALIZE-SHELL-DEVICE + [LAMBDA NIL (* ; "Edited 3-Jul-2022 16:15 by rmk") + (* ; "Edited 14-Dec-88 10:45 by bane") + (SETQ *SHELL-DEVICE* (create FDEV + NODIRECTORIES _ T + DEVICENAME _ 'UNIX-PTY + BIN _ 'UNIX-STREAM-IN + BOUT _ 'UNIX-STREAM-OUT + PEEKBIN _ 'UNIX-STREAM-PEEK + CLOSEFILE _ 'UNIX-STREAM-CLOSE + GETFILEINFO _ 'NILL + SETFILEINFO _ 'NILL + EOFP _ 'UNIX-STREAM-EOFP + BACKFILEPTR _ 'UNIX-BACKFILEPTR + DEFAULTEXTERNALFORMAT _ (AND (STRPOS ".UTF-8" (UNIX-GETENV "LANG")) + :UTF-8]) + +(UNIX-STREAM-IN + [LAMBDA (STREAM) (* ; "Edited 9-May-88 15:05 by ") + (LET (CH) + (if (SETQ CH (UNIX-PEEKEDCHAR STREAM)) + then (CL:SETF (UNIX-PEEKEDCHAR STREAM) + NIL) + else (while (NOT (SETQ CH (UNIX-READ STREAM))) do (BLOCK))) + CH]) + +(UNIX-STREAM-EOFP + [LAMBDA (STREAM) (* ; "Edited 2-Apr-90 11:51 by jds") + + (* ;; "EOFP method for unix-shell streams. Notices when there are chars yet to read and doesn't set EOFP.") + + (AND (NOT (UNIX-PEEKEDCHAR STREAM)) + (LET* [(CONN (UNIX-CHANNEL STREAM)) + (CH (AND CONN (SUBRCALL UNIX-HANDLECOMM 2 (\DTEST CONN 'SMALLP) + 0] + (COND + ((EQ CH T) + NIL) + ((EQ CH NIL) + T) + (T (CL:SETF (UNIX-PEEKEDCHAR STREAM) + CH) + (CL:SETF (UNIX-LASTCHAR STREAM) + CH) + NIL]) + +(UNIX-STREAM-PEEK + [LAMBDA (STREAM NO-ERROR) (* ; "Edited 24-Jun-88 15:07 by drc:") + (OR (UNIX-PEEKEDCHAR STREAM) + (CL:SETF (UNIX-PEEKEDCHAR STREAM) + (UNIX-READ STREAM NO-ERROR]) +) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS *SHELL-DEVICE*) +) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS UNIX-PEEKEDCHAR MACRO ((STR) + (FETCH (STREAM F2) OF STR))) + +(PUTPROPS UNIX-LASTCHAR MACRO ((STR) + (FETCH (STREAM F3) OF STR))) +) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(INITIALIZE-SHELL-DEVICE) +) + +(PUTPROPS UNIXCOMM FILETYPE FAKE-COMPILE-FILE) (PUTPROPS UNIXCOMM COPYRIGHT ("Venue & Xerox Corporation" 1988 1989 1990 2018 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2139 7214 (FORK-SHELL 2149 . 3346) (FORK-UNIX 3348 . 3524) (UNIX-KILL 3526 . 3715) ( -UNIX-WRITE 3717 . 4428) (CREATE-SHELL-STREAM 4430 . 5314) (CREATE-PROCESS-STREAM 5316 . 6155) ( -UNIXCOMM-AROUNDEXITFN 6157 . 7212)) (7262 12248 (INITIALIZE-SHELL-DEVICE 7272 . 8363) ( -UNIX-GET-NEXT-BUFFER 8365 . 10565) (UNIX-BACKFILEPTR-NEW 10567 . 11046) (UNIX-STREAM-EOFP-NEW 11048 . -11594) (UNIX-STREAM-OUT 11596 . 11852) (UNIX-STREAM-CLOSE 11854 . 12246)) (12496 14202 ( -CREATE-UNIX-SOCKET-STREAM 12506 . 13312) (ACCEPT-UNIX-SOCKET-STREAM 13314 . 14200))))) + (FILEMAP (NIL (2467 8489 (FORK-SHELL 2477 . 3674) (FORK-UNIX 3676 . 3852) (UNIX-KILL 3854 . 4043) ( +UNIX-WRITE 4045 . 4756) (CREATE-SHELL-STREAM 4758 . 6074) (CREATE-PROCESS-STREAM 6076 . 7586) ( +UNIXCOMM-AROUNDEXITFN 7588 . 8487)) (8537 13831 (INITIALIZE-NEW-SHELL-DEVICE 8547 . 9946) ( +UNIX-GET-NEXT-BUFFER 9948 . 12148) (UNIX-BACKFILEPTR-NEW 12150 . 12629) (UNIX-STREAM-EOFP-NEW 12631 . +13177) (UNIX-STREAM-OUT 13179 . 13435) (UNIX-STREAM-CLOSE 13437 . 13829)) (14087 15952 ( +CREATE-UNIX-SOCKET-STREAM 14097 . 14958) (ACCEPT-UNIX-SOCKET-STREAM 14960 . 15950)) (16301 19761 ( +UNIX-BACKFILEPTR 16311 . 16809) (UNIX-READ 16811 . 17333) (INITIALIZE-SHELL-DEVICE 17335 . 18355) ( +UNIX-STREAM-IN 18357 . 18733) (UNIX-STREAM-EOFP 18735 . 19509) (UNIX-STREAM-PEEK 19511 . 19759))))) STOP diff --git a/library/UNIXCOMM.LCOM b/library/UNIXCOMM.LCOM index 37aa51d2ef30c82c91e2345ede6d34b5a893e114..ad46fce167b5ce3dce08e3cffd5cc47704c4e7d5 100644 GIT binary patch literal 8367 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 D%n2*k literal 6981 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