UnixPTYStream.st
author Claus Gittinger <cg@exept.de>
Thu, 09 Jul 1998 22:19:56 +0200
changeset 668 6cab3f583c93
parent 667 f7f96fedf2ea
child 669 7c81234c0fb9
permissions -rw-r--r--
checkin from browser
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1998 by eXept Software AG
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
PipeStream subclass:#UnixPTYStream
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'OS-Unix'
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!UnixPTYStream class methodsFor:'documentation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
copyright
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 COPYRIGHT (c) 1998 by eXept Software AG
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
              All Rights Reserved
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
 This software is furnished under a license and may be used
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 only in accordance with the terms of that license and with the
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 be provided or otherwise made available to, or used by, any
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 other person.  No title to or ownership of the software is
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 hereby transferred.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
documentation
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    These are much like PipeStreams, but allow bi-directional communication
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    with a Unix command. (i.e. everything written to the PTYStream is seen
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    by the commands standard-input, everything written by the command to its
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    stdErr or stdOut can be read from me.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    In addition, sending control characters (such as INTR or QUIT),
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    will be handled by the command as a signal (unless the command changed
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    its standard input to raw mode).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    [author:]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
        Claus Gittinger
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    [see also:]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
        TerminalView
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        PipeStream ExternalStream FileStream Socket
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        OperatingSystem
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
examples
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
  that one is not special (could be done with a PipeStream):
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    |pty|
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    pty := UnixPTYStream to:'ls -l'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
                                                                [exEnd]
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    72
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    73
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    74
  prove (done with a PipeStream):
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    |pty|
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    pty := PipeStream readingFrom:'ls -l'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
        Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
                                                                [exEnd]
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    84
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    86
  but that one is not possible with a PipeStream
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    87
  (simulating an editor session):
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    |pty|
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    pty := UnixPTYStream to:'ed'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    [
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
        pty readWait.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
        [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
            Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
            pty readWait.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
        ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
        pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    ] forkAt:9.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    pty nextPutLine:'r Makefile'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    pty nextPutLine:'1,2d'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    pty nextPutLine:'$d'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    pty nextPutLine:'w xxx'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    pty nextPutLine:'q'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
                                                                [exEnd]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   108
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   109
  and that one is even better ...
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   110
  (simulating a login session):
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   111
                                                                [exBegin]
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   112
    |pty password command|
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   113
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   114
    pty := UnixPTYStream to:'rlogin ' , OperatingSystem getHostName.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   115
    [
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   116
        pty readWait.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   117
        [pty atEnd] whileFalse:[
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   118
            Transcript show:(pty next).
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   119
            pty readWait.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   120
        ].
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   121
        pty close.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   122
    ] forkAt:9.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   123
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   124
    password := Dialog request:'password'.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   125
    pty nextPutLine:password.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   126
    command := Dialog request:'command'.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   127
    pty nextPutLine:command.
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   128
                                                                [exEnd]
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   129
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
!UnixPTYStream class methodsFor:'instance creation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
to:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    "create and return a new ptyStream which can read/write to the unix command
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
     given by commandString."
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ^ (self basicNew) to:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    "unix:
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
         UnixPTYStream to:'sh'
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    "
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    "Modified: / 9.7.1998 / 18:26:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
!UnixPTYStream class methodsFor:'blocked instance creation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
readingFrom:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    "Created: / 9.7.1998 / 18:25:09 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    "Modified: / 9.7.1998 / 18:25:34 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
readingFrom:commandString errorDisposition:handleError inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    "Modified: / 9.7.1998 / 18:25:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
readingFrom:commandString inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    "Created: / 9.7.1998 / 18:25:38 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
writingTo:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "Created: / 9.7.1998 / 18:25:42 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
writingTo:commandString inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
    "Created: / 9.7.1998 / 18:25:46 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
!UnixPTYStream methodsFor:'private'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
openPTYFor:aCommandString withMode:mode inDirectory:aDirectrory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    "open a pty to the unix command in commandString"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    |blocked ptyFdArray execFdArray slaveFd masterFd shellAndArgs
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
     osType shellPath shellArgs closeFdArray mbx mbxName
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
     env shell args|
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    filePointer notNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
        "the pipe was already open ...
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
         this should (can) not happen."
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
        ^ self errorOpen
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    lastErrorNumber := nil.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    exitStatus := nil.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    exitSema := Semaphore new name:'pty exitSema'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    osType := OperatingSystem platformName.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    osType == #vms ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
        mbx := OperatingSystem createMailBox.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
        mbx isNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
            lastErrorNumber := OperatingSystem currentErrorNumber.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
            ^ self openError
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
        mbxName := OperatingSystem mailBoxNameOf:mbx.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
        "/ 'mailBox is ' print. mbx print. ' name is ' print. mbxName printCR.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
        shellPath := ''.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
        shellArgs := aCommandString.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
        execFdArray := Array with:mbx with:mbx with:mbx.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
        closeFdArray := nil.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ] ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
        ptyFdArray := OperatingSystem makePTYPair.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
        ptyFdArray isNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
            lastErrorNumber := OperatingSystem currentErrorNumber.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
            ^ self openError
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
        ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
        shellAndArgs := OperatingSystem commandAndArgsForOSCommand:aCommandString.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
        shellPath := shellAndArgs at:1.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
        shellArgs := shellAndArgs at:2.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
        masterFd := ptyFdArray at:1.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
        slaveFd := ptyFdArray at:2.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
        execFdArray := Array with:slaveFd with:slaveFd with:slaveFd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        closeFdArray := Array with:masterFd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    env := Dictionary new.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    env at:'TERM'     put:'dumb'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    env at:'SHELL' put:shellPath.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
    "/ must block here, to avoid races due to early finishing
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "/ subprocesses ...
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    blocked := OperatingSystem blockInterrupts.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    pid := Processor 
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
               monitor:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
                  OperatingSystem 
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
                      exec:shellPath
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
                      withArguments:shellArgs
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
                      environment:env
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
                      fileDescriptors:execFdArray
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
                      closeDescriptors:closeFdArray
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
                      fork:true
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
                      newPgrp:true
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
"/                      inDirectory:aDirectrory.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
               ]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
               action:[:status |
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
                  status stillAlive ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
                      exitStatus := status.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
                      OperatingSystem closePid:pid.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
                      pid := nil.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
                      exitSema signal.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
                  ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
               ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    (osType ~~ #vms) ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
        OperatingSystem closeFd:slaveFd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    pid notNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
        (osType == #win32) ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
            self setFileDescriptor:masterFd mode:mode.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
            "/ self setFileHandle:masterFd mode:mode
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
        ] ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
            (osType == #vms) ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
                "/
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
                "/ reopen the mailbox as a file ...
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
                "/
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
                mbxName := OperatingSystem mailBoxNameOf:mbx.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
                mbxName notNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
                    super open:mbxName withMode:mode
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
                ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
            ] ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
                self setFileDescriptor:masterFd mode:mode.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
            ]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
        ]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    ] ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
        lastErrorNumber := OperatingSystem currentErrorNumber.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
        osType == #vms ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
            OperatingSystem destroyMailBox:mbx
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
        ] ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
            OperatingSystem closeFd:masterFd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
        ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    blocked ifFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
        OperatingSystem unblockInterrupts
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    lastErrorNumber notNil ifTrue:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
        "
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
         the pipe open failed for some reason ...
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
         ... this may be either due to an invalid command string,
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
         or due to the system running out of memory (when forking
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
         the unix process)
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
        "
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
        ^ self openError
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    commandString := aCommandString.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    buffered := false.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    position := 1.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    hitEOF := false.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    binary := false.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    Lobby register:self.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    "Created: / 9.7.1998 / 20:21:42 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    "Modified: / 9.7.1998 / 20:28:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
to:command
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    "setup the receiver to read/write to command"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    mode := #readwrite. didWrite := true.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    ^ self openPTYFor:command withMode:ReadWriteMode inDirectory:nil
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    "Created: / 9.7.1998 / 18:27:40 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    "Modified: / 9.7.1998 / 20:22:39 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
!UnixPTYStream methodsFor:'testing'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
atEnd
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    ReadErrorSignal handle:[:ex |
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
        ex return
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    ] do:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
        ^ super atEnd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    ^ true
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    "Created: / 9.7.1998 / 20:29:03 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    "Modified: / 9.7.1998 / 20:29:48 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
!UnixPTYStream class methodsFor:'documentation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
version
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   345
    ^ '$Header: /cvs/stx/stx/libbasic2/UnixPTYStream.st,v 1.2 1998-07-09 20:19:56 cg Exp $'
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
! !