From 97cb04be46c9762ed2cb8776d26bf2e00ead63b4 Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Fri, 2 Dec 2022 20:48:48 -0800 Subject: [PATCH] Lmm cleanup new shell device (#1006) * reset defaultexternalformat when returning * Replace so *SHELL-DEVICE* is default --- library/UNIXCOMM | 295 +++++++++++------------------------------- library/UNIXCOMM.LCOM | Bin 8367 -> 6981 bytes 2 files changed, 79 insertions(+), 216 deletions(-) diff --git a/library/UNIXCOMM b/library/UNIXCOMM index 5251821f..a55afd6b 100644 --- a/library/UNIXCOMM +++ b/library/UNIXCOMM @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 8-Oct-2022 16:06:36" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;2 20352 +(FILECREATED "11-Oct-2022 10:18:47" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;4 14580 - :CHANGES-TO (FNS CREATE-PROCESS-STREAM) + :CHANGES-TO (FNS CREATE-SHELL-STREAM CREATE-PROCESS-STREAM UNIXCOMM-AROUNDEXITFN + CREATE-UNIX-SOCKET-STREAM ACCEPT-UNIX-SOCKET-STREAM INITIALIZE-SHELL-DEVICE) + (VARS UNIXCOMMCOMS) - :PREVIOUS-DATE " 7-Jul-2022 10:42:46" + :PREVIOUS-DATE " 8-Oct-2022 16:06:36" {DSK}c>Users>Larry>home>medley>library>UNIXCOMM.;1) @@ -25,10 +27,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-NEW-SHELL-DEVICE UNIX-GET-NEXT-BUFFER UNIX-BACKFILEPTR-NEW + (FNS INITIALIZE-SHELL-DEVICE UNIX-GET-NEXT-BUFFER UNIX-BACKFILEPTR-NEW UNIX-STREAM-EOFP-NEW UNIX-STREAM-OUT UNIX-STREAM-CLOSE) - (GLOBALVARS *NEW-SHELL-DEVICE*) - (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITIALIZE-NEW-SHELL-DEVICE)) + (GLOBALVARS *SHELL-DEVICE*) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITIALIZE-SHELL-DEVICE)) (ADDVARS (AROUNDEXITFNS UNIXCOMM-AROUNDEXITFN] (COMS (* ;  "Stuff for direct manipulation of Unix sockets") @@ -36,14 +38,6 @@ 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))) @@ -107,24 +101,17 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (RETURN LENGTH-WRITTEN]) (CREATE-SHELL-STREAM - [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*))) + [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))) (COND (CHAN (LET ((STR (create STREAM ACCESS _ 'BOTH - DEVICE _ SHELL-DEV))) + DEVICE _ *SHELL-DEVICE*))) (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]) @@ -132,49 +119,40 @@ 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* ((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]) + (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]) (UNIXCOMM-AROUNDEXITFN - [LAMBDA (EVENT) (* ; "Edited 2-Jul-90 16:35 by jrb:") + [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:") (CASE EVENT - ((AFTERLOGOUT AFTERMAKESYS AFTERSAVEVM AFTERSYSOUT) (for STREAM - in (fetch (FDEV OPENFILELST) - of *SHELL-DEVICE*) - do (CLOSEF STREAM))) + ((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))) ((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))) @@ -187,25 +165,24 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (DEFINEQ -(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]) +(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]) (UNIX-GET-NEXT-BUFFER [LAMBDA (STREAM WHATFOR NOERRORFLG) (* ; @@ -280,11 +257,11 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS *NEW-SHELL-DEVICE*) +(GLOBALVARS *SHELL-DEVICE*) ) (DECLARE%: DONTEVAL@LOAD DOCOPY -(INITIALIZE-NEW-SHELL-DEVICE) +(INITIALIZE-SHELL-DEVICE) (ADDTOVAR AROUNDEXITFNS UNIXCOMM-AROUNDEXITFN) @@ -297,25 +274,23 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. (DEFINEQ (CREATE-UNIX-SOCKET-STREAM - [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] + [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] (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]) + 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]) (ACCEPT-UNIX-SOCKET-STREAM - [LAMBDA (SOCKSTREAM) (* ; "Edited 29-May-90 16:31 by jrb:") + [LAMBDA (SOCKSTREAM) (* ; "Edited 11-Oct-2022 10:12 by lmm") + (* ; "Edited 29-May-90 16:31 by jrb:") (LET ((CHAN (UNIX-CHANNEL SOCKSTREAM)) NEWCHAN) (SELECTQ (SETQ NEWCHAN (SUBRCALL UNIX-HANDLECOMM 13 CHAN)) @@ -323,15 +298,12 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. NEWCHAN) (LET ((NEWSTREAM (create STREAM ACCESS _ 'BOTH - DEVICE _ *NEW-SHELL-DEVICE* + DEVICE _ *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 @@ -346,122 +318,13 @@ Copyright (c) 1988-1990, 2018, 2022 by Venue & Xerox Corporation. T) ) - - -(* ;; -"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 FILETYPE COMPILE-FILE) (PUTPROPS UNIXCOMM COPYRIGHT ("Venue & Xerox Corporation" 1988 1989 1990 2018 2022)) (DECLARE%: DONTCOPY - (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))))) + (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))))) STOP diff --git a/library/UNIXCOMM.LCOM b/library/UNIXCOMM.LCOM index ad46fce167b5ce3dce08e3cffd5cc47704c4e7d5..37aa51d2ef30c82c91e2345ede6d34b5a893e114 100644 GIT binary patch literal 6981 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 D%n2*k