UnixPTYStream.st
author Claus Gittinger <cg@exept.de>
Tue, 25 Jun 2019 14:28:51 +0200
changeset 5050 44fa8672d102
parent 4558 6b2a3c9cec9f
child 5197 d86c21e6d1b9
permissions -rw-r--r--
#DOCUMENTATION by cg class: SharedQueue comment/format in: #next #nextWithTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
     1
"{ Encoding: utf8 }"
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
     2
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 1998 by eXept Software AG
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
    14
"{ Package: 'stx:libbasic2' }"
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
    16
"{ NameSpace: Smalltalk }"
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
PipeStream subclass:#UnixPTYStream
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'OS-Unix'
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!UnixPTYStream class methodsFor:'documentation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
copyright
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 1998 by eXept Software AG
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 hereby transferred.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
documentation
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    These are much like PipeStreams, but allow bi-directional communication
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    with a Unix command. (i.e. everything written to the PTYStream is seen
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    by the commands standard-input, everything written by the command to its
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    stdErr or stdOut can be read from me.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    In addition, sending control characters (such as INTR or QUIT),
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    will be handled by the command as a signal (unless the command changed
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    its standard input to raw mode).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    [author:]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        Claus Gittinger
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    [see also:]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        TerminalView
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        PipeStream ExternalStream FileStream Socket
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
        OperatingSystem
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
examples
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
  that one is not special (could be done with a PipeStream):
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    |pty|
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 := UnixPTYStream to:'ls -l'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
                                                                [exEnd]
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    76
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    77
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    78
  prove (done with a PipeStream):
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    |pty|
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 := PipeStream readingFrom:'ls -l'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
        Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
                                                                [exEnd]
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    88
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    90
  but that one is not possible with a PipeStream
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    91
  (simulating an editor session):
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
                                                                [exBegin]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    |pty|
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    pty := UnixPTYStream to:'ed'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    [
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
        [pty atEnd] whileFalse:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
            Transcript showCR:(pty nextLine).
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
        ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
        pty close.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    ] forkAt:9.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
3991
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   103
    pty nextPutLine:'r Make.proto'.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    pty nextPutLine:'1,2d'.
3991
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   105
    pty nextPutLine:'1,$s/#/+++++++/'.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    pty nextPutLine:'w xxx'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    pty nextPutLine:'q'.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
                                                                [exEnd]
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   110
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   111
  and that one is even better ...
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   112
  (simulating a login session):
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   113
                                                                [exBegin]
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   114
    |pty password command|
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   115
3991
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   116
    pty := UnixPTYStream to:'ssh 127.0.0.1'.
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   117
    [
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   118
        [pty atEnd] whileFalse:[
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   119
            Transcript show:(pty next).
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
669
7c81234c0fb9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   124
    password := Dialog requestPassword:'password'.
668
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.
670
83ac3add3862 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 669
diff changeset
   128
    pty nextPutLine:'exit'.
668
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   129
                                                                [exEnd]
6cab3f583c93 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
   130
667
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
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!UnixPTYStream class methodsFor:'instance creation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
to:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    "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
   138
     given by commandString."
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    ^ (self basicNew) to:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "unix:
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
         UnixPTYStream to:'sh'
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    "
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    "Modified: / 9.7.1998 / 18:26:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
!UnixPTYStream class methodsFor:'blocked instance creation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
readingFrom:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    "Created: / 9.7.1998 / 18:25:09 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    "Modified: / 9.7.1998 / 18:25:34 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
readingFrom:commandString errorDisposition:handleError inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    "Modified: / 9.7.1998 / 18:25:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
readingFrom:commandString inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    "Created: / 9.7.1998 / 18:25:38 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
writingTo:commandString
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
    "Created: / 9.7.1998 / 18:25:42 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
writingTo:commandString inDirectory:aDirectory
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    ^ self shouldNotImplement
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
    "Created: / 9.7.1998 / 18:25:46 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
!UnixPTYStream methodsFor:'private'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
3991
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   184
openPTYFor:aCommandString withMode:openMode inDirectory:aDirectory
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    "open a pty to the unix command in commandString"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   187
    |ptyFdArray slaveFd masterFd env remotePipeEnd result|
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
   189
    handle notNil ifTrue:[
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
        "the pipe was already open ...
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
         this should (can) not happen."
3990
a54abbfabec0 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3906
diff changeset
   192
        ^ self errorAlreadyOpen
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    ].
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
   194
        
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    lastErrorNumber := nil.
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   196
    "stdio lib does not work with blocking pipes and interrupts
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   197
     for WIN, Linux, Solaris and probably any other UNIX"
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   198
    buffered := false.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   199
    hitEOF := false.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   200
    binary := false.
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
   201
    
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   202
    ptyFdArray := OperatingSystem makePTYPair.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   203
    ptyFdArray isNil ifTrue:[
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   204
        lastErrorNumber := OperatingSystem lastErrorNumber.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   205
        ^ self openError:lastErrorNumber.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   206
    ].
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   208
    masterFd := ptyFdArray at:1.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   209
    slaveFd := ptyFdArray at:2.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   211
    remotePipeEnd := self class forFileDescriptor:slaveFd mode:#readwrite buffered:false handleType:#pipeFilePointer.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    env := Dictionary new.
3990
a54abbfabec0 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3906
diff changeset
   214
    env at:'TERM'  put:'dumb'.
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   215
    env at:'SHELL' put:'/bin/sh'.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   217
    osProcess := OSProcess new 
4558
6b2a3c9cec9f #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4245
diff changeset
   218
                    command:aCommandString directory:aDirectory;
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   219
                    environment:env;
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   220
                    inStream:remotePipeEnd;
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   221
                    outStream:remotePipeEnd;
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   222
                    errorStream:remotePipeEnd.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   224
    result := osProcess startProcess.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   225
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   226
    remotePipeEnd notNil ifTrue:[
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   227
        remotePipeEnd close.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   230
    result ifTrue:[
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   231
        self setFileHandle:masterFd mode:openMode.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    ] ifFalse:[
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   233
        "the pipe open failed for some reason ...
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   234
         ... this may be either due to an invalid command string,
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   235
         or due to the system running out of memory (when forking
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   236
         the unix process)"
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   237
        lastErrorNumber := OperatingSystem lastErrorNumber.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   238
        OperatingSystem closeFd:masterFd.
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   239
        ^ self openError:lastErrorNumber.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
4245
79cce4a51ea1 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4242
diff changeset
   242
    self registerForFinalization.
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    "Created: / 9.7.1998 / 20:21:42 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    "Modified: / 9.7.1998 / 20:28:31 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
to:command
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    "setup the receiver to read/write to command"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    mode := #readwrite. didWrite := true.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    ^ self openPTYFor:command withMode:ReadWriteMode inDirectory:nil
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    "Created: / 9.7.1998 / 18:27:40 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    "Modified: / 9.7.1998 / 20:22:39 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!UnixPTYStream methodsFor:'testing'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
atEnd
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    ReadErrorSignal handle:[:ex |
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
        ex return
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    ] do:[
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
        ^ super atEnd.
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    ].
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    ^ true
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    "Created: / 9.7.1998 / 20:29:03 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    "Modified: / 9.7.1998 / 20:29:48 / cg"
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
! !
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
!UnixPTYStream class methodsFor:'documentation'!
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
version
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
   275
    ^ '$Header$'
3991
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   276
!
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   277
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   278
version_CVS
b2b58d530860 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 3990
diff changeset
   279
    ^ '$Header$'
667
f7f96fedf2ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
! !
3906
33485a09adff #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 1152
diff changeset
   281