PipeStream.st
author claus
Thu, 09 Mar 1995 00:40:27 +0100
changeset 302 1f76060d58a4
parent 269 93162487a94b
child 308 f04744ef7b5d
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
269
93162487a94b *** empty log message ***
claus
parents: 255
diff changeset
    13
NonPositionableExternalStream subclass:#PipeStream
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 32
diff changeset
    14
       instanceVariableNames:'commandString'
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
    15
       classVariableNames:'BrokenPipeSignal'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Streams-External'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
PipeStream comment:'
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    21
COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    22
	      All Rights Reserved
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
    23
302
1f76060d58a4 *** empty log message ***
claus
parents: 269
diff changeset
    24
$Header: /cvs/stx/stx/libbasic/PipeStream.st,v 1.20 1995-03-08 23:39:02 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    27
!PipeStream class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    32
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    42
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
"
302
1f76060d58a4 *** empty log message ***
claus
parents: 269
diff changeset
    45
$Header: /cvs/stx/stx/libbasic/PipeStream.st,v 1.20 1995-03-08 23:39:02 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    47
!
2
claus
parents: 1
diff changeset
    48
claus
parents: 1
diff changeset
    49
documentation
claus
parents: 1
diff changeset
    50
"
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    51
    Pipestreams allow reading or writing from/to a unix command.
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    52
    For example, to get a stream reading the output of an 'ls -l'
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    53
    command, a PipeStream can be created with:
2
claus
parents: 1
diff changeset
    54
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    55
	PipeStream readingFrom:'ls -l'
2
claus
parents: 1
diff changeset
    56
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    57
    the characters of the commands output can be read using the
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    58
    standard stream messages as next, nextLine etc.
2
claus
parents: 1
diff changeset
    59
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    60
    If a writing pipeStream is written to, after the command has finished,
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    61
    UNIX will generate an error-signal (SIGPIPE), which will raise the
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    62
    BrokenPipeSignal. 
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    63
    Thus, to handle this condition correctly, the following code is suggested:
2
claus
parents: 1
diff changeset
    64
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    65
	|p|
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    66
	p := PipeStream writingTo:'echo hello'.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    67
	PipeStream brokenPipeSignal handle:[:ex |
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    68
	    'broken pipe' printNewline.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    69
	    p shutDown.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    70
	    ex return
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    71
	] do:[
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    72
	    p nextPutLine:'oops'.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    73
	   'after write' printNewline.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    74
	    p close.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    75
	   'after close' printNewline
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
    76
	]
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
    77
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    78
    Notice, that if the Stream is buffered, the Signal may occur some time after
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    79
    the write - or even at close time; to avoid a recursive signal in the exception
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
    80
    handler, a shutDown is useful there.
2
claus
parents: 1
diff changeset
    81
"
claus
parents: 1
diff changeset
    82
! !
claus
parents: 1
diff changeset
    83
217
a0400fdbc933 *** empty log message ***
claus
parents: 180
diff changeset
    84
!PipeStream primitiveDefinitions!
180
c488255bd0be *** empty log message ***
claus
parents: 159
diff changeset
    85
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    86
%{
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    87
#include <stdio.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    88
#include <errno.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    89
#ifndef transputer
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    90
# include <sys/types.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    91
# include <sys/stat.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    92
#endif
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    93
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    94
extern int __immediateInterrupt__;
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    95
/*
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    96
 * on some systems errno is a macro ... check for it here
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    97
 */
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    98
#ifndef errno
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    99
 extern errno;
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   100
#endif
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   101
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
   102
%}
180
c488255bd0be *** empty log message ***
claus
parents: 159
diff changeset
   103
! !
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
   104
2
claus
parents: 1
diff changeset
   105
!PipeStream class methodsFor:'initialization'!
claus
parents: 1
diff changeset
   106
claus
parents: 1
diff changeset
   107
initialize
claus
parents: 1
diff changeset
   108
    "setup the signal"
claus
parents: 1
diff changeset
   109
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   110
    BrokenPipeSignal isNil ifTrue:[
302
1f76060d58a4 *** empty log message ***
claus
parents: 269
diff changeset
   111
	ErrorSignal isNil ifTrue:[super initialize].
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   112
302
1f76060d58a4 *** empty log message ***
claus
parents: 269
diff changeset
   113
	BrokenPipeSignal := ErrorSignal newSignalMayProceed:true.
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   114
	BrokenPipeSignal nameClass:self message:#brokenPipeSignal.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   115
	BrokenPipeSignal notifierString:'write on a pipe with no one to read'.
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   116
    ]
2
claus
parents: 1
diff changeset
   117
! !
claus
parents: 1
diff changeset
   118
claus
parents: 1
diff changeset
   119
!PipeStream class methodsFor:'signal access'!
claus
parents: 1
diff changeset
   120
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   121
brokenPipeSignal
2
claus
parents: 1
diff changeset
   122
    "return the signal used to handle SIGPIPE unix-signals"
claus
parents: 1
diff changeset
   123
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   124
    ^ BrokenPipeSignal
2
claus
parents: 1
diff changeset
   125
! !
claus
parents: 1
diff changeset
   126
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
!PipeStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
2
claus
parents: 1
diff changeset
   129
writingTo:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    "create and return a new pipeStream which can write to the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
2
claus
parents: 1
diff changeset
   133
    ^ (self basicNew) writingTo:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    "PipeStream writingTo:'sort'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
2
claus
parents: 1
diff changeset
   138
readingFrom:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    "create and return a new pipeStream which can read from the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
2
claus
parents: 1
diff changeset
   142
    ^ (self basicNew) readingFrom:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
2
claus
parents: 1
diff changeset
   144
    "PipeStream readingFrom:'ls -l'"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
99
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   147
!PipeStream methodsFor:'accessing'!
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   148
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   149
commandString
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   150
    "return the command string"
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   151
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   152
    ^ commandString
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   153
! !
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   154
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
!PipeStream methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   157
disposed
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   158
    "redefined to avoid blocking in close."
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   159
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   160
    self shutDown
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   161
!
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   162
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   163
shutDown
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   164
    "close the Stream, ignoring any broken-pipe errors"
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   165
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   166
    BrokenPipeSignal catch:[self closeFileDescriptor]
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   167
!
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   168
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
closeFile
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   170
    "low level close - redefined since we close a pipe here.
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   171
     This waits for the command to finish. 
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   172
     Use shutDown for a fast (nonBlocking) close."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   174
%{  /* UNLIMITEDSTACK */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
#ifndef transputer
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   176
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   177
    if (_INST(filePointer) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   178
	/*
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   179
	 * allow interrupt even when blocking here ...
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   180
	 */
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   181
	__immediateInterrupt__ = 1;
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   182
	pclose(MKFD(_INST(filePointer)));
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   183
	__immediateInterrupt__ = 0;
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   184
	_INST(filePointer) = nil;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   185
    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
!PipeStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   192
XXatEnd
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   193
    "return true, if position is at end"
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   194
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   195
%{  /* NOCONTEXT */
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   196
#ifdef IRIX5
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   197
    FILE *f;
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   198
    OBJ t;
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   199
    OBJ _true = true;
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   200
    int c;
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   201
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   202
    if (_INST(hitEOF) == _true) {
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   203
	RETURN (_true);
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   204
    }
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   205
    if ((t = _INST(filePointer)) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   206
	f = MKFD(t);
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   207
	if (feof(f)) {
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   208
	    _INST(hitEOF) = true;
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   209
	    RETURN (true);
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   210
	}
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   211
	RETURN ( false );
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   212
    }
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   213
#endif
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   214
%}
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   215
.
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   216
    ^ super atEnd
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   217
! !
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   218
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   219
!PipeStream methodsFor:'private'!
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   220
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 32
diff changeset
   221
openPipeFor:aCommandString withMode:mode
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   222
    "open a pipe to the unix command in aCcommandString; 
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   223
     mode may be 'r' or 'w'"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
    |retVal|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   227
    filePointer notNil ifTrue:[^ self errorOpen].
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   228
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   229
%{  /* STACK: 32000 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
#ifndef transputer
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   231
    FILE *f;
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   232
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   233
    _INST(lastErrorNumber) = nil;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   235
    if (__isString(aCommandString) && __isString(mode)) {
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   236
	__immediateInterrupt__ = 1;
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   237
	do {
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   238
#ifdef LINUX
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   239
	    /* LINUX returns a non-NULL f even when interrupted */
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   240
	    errno = 0;
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   241
	    f = (FILE *)popen((char *) _stringVal(aCommandString),
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   242
			      (char *) _stringVal(mode));
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   243
	    if (errno == EINTR)
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   244
		f = NULL;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   245
#else
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   246
	    f = (FILE *)popen((char *) _stringVal(aCommandString),
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   247
			      (char *) _stringVal(mode));
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   248
#endif
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   249
	} while ((f == NULL) && (errno == EINTR));
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   250
	__immediateInterrupt__ = 0;
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   251
	if (f == NULL) {
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   252
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   253
	} else {
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   254
	    _INST(filePointer) = MKOBJ(f);
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   255
	    retVal = self;
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   256
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
#endif
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   259
%}.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
    retVal notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   261
	commandString := aCommandString.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   262
	buffered := true.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   263
	hitEOF := false.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   264
	Lobby register:self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
    ].
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   266
    lastErrorNumber notNil ifTrue:[
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   267
	"
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   268
	 the open failed for some reason ...
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   269
	"
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   270
	^ self openError
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   271
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
    ^ retVal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
readingFrom:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
    "setup the receiver to read from command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   278
    self readonly. didWrite := false.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
    ^ self openPipeFor:command withMode:'r'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
writingTo:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
    "setup the receiver to write to command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   285
    self writeonly. didWrite := true.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
    ^ self openPipeFor:command withMode:'w'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
! !