PipeStream.st
author Claus Gittinger <cg@exept.de>
Sat, 25 Jan 1997 00:19:50 +0100
changeset 2266 a94af740c68a
parent 2121 36ba8ccae9a2
child 2498 eb0bad72f05e
permissions -rw-r--r--
checkin from browser
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
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
    14
	instanceVariableNames:'commandString pid exitStatus exitSema'
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    15
	classVariableNames:'BrokenPipeSignal'
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    16
	poolDictionaries:''
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    17
	category:'Streams-External'
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    18
!
2
claus
parents: 1
diff changeset
    19
217
a0400fdbc933 *** empty log message ***
claus
parents: 180
diff changeset
    20
!PipeStream primitiveDefinitions!
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    21
%{
437
claus
parents: 410
diff changeset
    22
793
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    23
#if defined(NT) || defined(WIN32) || defined(MSDOS)
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    24
# undef UNIX_LIKE
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    25
# define MSDOS_LIKE
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    26
#endif
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    27
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
#include <stdio.h>
437
claus
parents: 410
diff changeset
    29
#define _STDIO_H_INCLUDED_
claus
parents: 410
diff changeset
    30
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
#include <errno.h>
437
claus
parents: 410
diff changeset
    32
#define _ERRNO_H_INCLUDED_
claus
parents: 410
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
#ifndef transputer
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
# include <sys/types.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
# include <sys/stat.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
#endif
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    38
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    39
/*
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    40
 * on some systems errno is a macro ... check for it here
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    41
 */
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    42
#ifndef errno
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    43
 extern errno;
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    44
#endif
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    45
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    46
#ifdef LINUX
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    47
# define BUGGY_STDIO_LIB
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    48
#endif
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    49
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    50
%}
180
c488255bd0be *** empty log message ***
claus
parents: 159
diff changeset
    51
! !
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    52
325
claus
parents: 308
diff changeset
    53
!PipeStream primitiveFunctions!
claus
parents: 308
diff changeset
    54
%{
claus
parents: 308
diff changeset
    55
claus
parents: 308
diff changeset
    56
/*
claus
parents: 308
diff changeset
    57
 * some systems (i.e. ultrix) use fork;
claus
parents: 308
diff changeset
    58
 * were better off with a popen based on vfork ...
claus
parents: 308
diff changeset
    59
 */
claus
parents: 308
diff changeset
    60
#ifdef NEED_POPEN_WITH_VFORK
claus
parents: 308
diff changeset
    61
claus
parents: 308
diff changeset
    62
static int popen_pid = 0;
claus
parents: 308
diff changeset
    63
claus
parents: 308
diff changeset
    64
FILE *
claus
parents: 308
diff changeset
    65
popen(command, type)
claus
parents: 308
diff changeset
    66
/* const */ char *command;
claus
parents: 308
diff changeset
    67
/* const */ char *type;
claus
parents: 308
diff changeset
    68
{
claus
parents: 308
diff changeset
    69
    int pipes[2];
claus
parents: 308
diff changeset
    70
    int itype = (strcmp(type, "w") == 0 ? 1 : 0);
claus
parents: 308
diff changeset
    71
claus
parents: 308
diff changeset
    72
    if (pipe(pipes) == -1)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    73
	return NULL;
325
claus
parents: 308
diff changeset
    74
claus
parents: 308
diff changeset
    75
    switch (popen_pid = vfork()) {
claus
parents: 308
diff changeset
    76
    case -1:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    77
	(void)close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    78
	(void)close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    79
	return NULL;
325
claus
parents: 308
diff changeset
    80
claus
parents: 308
diff changeset
    81
    case 0:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    82
	if (itype) {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    83
	    dup2(pipes[0], fileno(stdin));
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    84
	    close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    85
	} else {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    86
	    dup2(pipes[1], fileno(stdout));
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    87
	    close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    88
	}
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    89
	execl("/bin/sh", "/bin/sh", "-c", command, 0);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    90
	fprintf(stderr, "XRN Error: failed the execlp\n");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    91
	_exit(-1);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    92
	/* NOTREACHED */
325
claus
parents: 308
diff changeset
    93
claus
parents: 308
diff changeset
    94
    default:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    95
	    if (itype) {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    96
		close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    97
		return fdopen(pipes[1], "w");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    98
	    } else {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    99
		close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   100
		return fdopen(pipes[0], "r");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   101
	    }
325
claus
parents: 308
diff changeset
   102
    }
claus
parents: 308
diff changeset
   103
}
claus
parents: 308
diff changeset
   104
claus
parents: 308
diff changeset
   105
int
claus
parents: 308
diff changeset
   106
pclose(str)
claus
parents: 308
diff changeset
   107
FILE *str;
claus
parents: 308
diff changeset
   108
{
claus
parents: 308
diff changeset
   109
    int pd = 0;
claus
parents: 308
diff changeset
   110
    int status;
claus
parents: 308
diff changeset
   111
    int err;
claus
parents: 308
diff changeset
   112
claus
parents: 308
diff changeset
   113
    err = fclose(str);
claus
parents: 308
diff changeset
   114
claus
parents: 308
diff changeset
   115
    do {
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   116
	if ((pd = wait(&status)) == -1)
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   117
	{
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   118
		err = EOF;
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   119
		break;
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   120
	}
325
claus
parents: 308
diff changeset
   121
    } while (pd !=  popen_pid);
claus
parents: 308
diff changeset
   122
claus
parents: 308
diff changeset
   123
    if (err == EOF)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   124
	return  -1;
325
claus
parents: 308
diff changeset
   125
claus
parents: 308
diff changeset
   126
    if (status)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   127
	status >>= 8;   /* exit status in high byte */
325
claus
parents: 308
diff changeset
   128
claus
parents: 308
diff changeset
   129
    return status;
claus
parents: 308
diff changeset
   130
}
claus
parents: 308
diff changeset
   131
claus
parents: 308
diff changeset
   132
#endif
claus
parents: 308
diff changeset
   133
claus
parents: 308
diff changeset
   134
%}
claus
parents: 308
diff changeset
   135
! !
claus
parents: 308
diff changeset
   136
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   137
!PipeStream class methodsFor:'documentation'!
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   138
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   139
copyright
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   140
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   141
 COPYRIGHT (c) 1989 by Claus Gittinger
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   142
	      All Rights Reserved
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   143
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   144
 This software is furnished under a license and may be used
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   145
 only in accordance with the terms of that license and with the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   146
 inclusion of the above copyright notice.   This software may not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   147
 be provided or otherwise made available to, or used by, any
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   148
 other person.  No title to or ownership of the software is
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   149
 hereby transferred.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   150
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   151
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   152
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   153
documentation
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   154
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   155
    Pipestreams allow reading or writing from/to a unix command.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   156
    For example, to get a stream reading the output of an 'ls -l'
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   157
    command, a PipeStream can be created with:
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   158
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   159
        PipeStream readingFrom:'ls -l'
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   160
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   161
    the characters of the commands output can be read using the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   162
    standard stream messages as next, nextLine etc.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   163
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   164
    If a writing pipeStream is written to, after the command has finished,
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   165
    UNIX will generate an error-signal (SIGPIPE), which will raise the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   166
    BrokenPipeSignal. 
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   167
    Thus, to handle this condition correctly, the following code is suggested:
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   168
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   169
        |p|
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   170
        p := PipeStream writingTo:'echo hello'.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   171
        PipeStream brokenPipeSignal handle:[:ex |
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   172
            'broken pipe' printNewline.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   173
            p shutDown.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   174
            ex return
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   175
        ] do:[
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   176
            p nextPutLine:'oops'.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   177
           'after write' printNewline.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   178
            p close.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   179
           'after close' printNewline
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   180
        ]
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   181
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
   182
    Notice, that iff the Stream is buffered, the Signal may occur some time after
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   183
    the write - or even at close time; to avoid a recursive signal in the exception
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   184
    handler, a shutDown is useful there.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   185
1662
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   186
    Buffered pipes do not work with Linux - the stdio library seems to be
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   187
    buggy (trying to restart the read ...)
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   188
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   189
    [author:]
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   190
        Claus Gittinger
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   191
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   192
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   193
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   194
!PipeStream class methodsFor:'initialization'!
2
claus
parents: 1
diff changeset
   195
claus
parents: 1
diff changeset
   196
initialize
claus
parents: 1
diff changeset
   197
    "setup the signal"
claus
parents: 1
diff changeset
   198
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   199
    BrokenPipeSignal isNil ifTrue:[
582
21f08116b28d BrokenPipeSignal now a child of WriteErrorSignal
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   200
	BrokenPipeSignal := WriteErrorSignal newSignalMayProceed:true.
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   201
	BrokenPipeSignal nameClass:self message:#brokenPipeSignal.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   202
	BrokenPipeSignal notifierString:'write on a pipe with no one to read'.
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   203
    ]
2
claus
parents: 1
diff changeset
   204
! !
claus
parents: 1
diff changeset
   205
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   206
!PipeStream class methodsFor:'instance creation'!
2
claus
parents: 1
diff changeset
   207
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   208
readingFrom:commandString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   209
    "create and return a new pipeStream which can read from the unix command
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   210
     given by command."
2
claus
parents: 1
diff changeset
   211
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   212
    ^ (self basicNew) readingFrom:commandString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   213
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   214
    "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   215
        PipeStream readingFrom:'ls -l'
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   216
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   217
        |s|
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   218
        s := PipeStream readingFrom:'sh -c sleep\ 600'.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   219
        (Delay forSeconds:2) wait.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   220
        s shutDown
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   221
    "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   222
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   223
    "Modified: 24.4.1996 / 09:09:25 / stefan"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   224
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
2
claus
parents: 1
diff changeset
   226
writingTo:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
    "create and return a new pipeStream which can write to the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
2
claus
parents: 1
diff changeset
   230
    ^ (self basicNew) writingTo:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
    "PipeStream writingTo:'sort'"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   233
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   234
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   235
!PipeStream class methodsFor:'Signal constants'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   237
brokenPipeSignal
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   238
    "return the signal used to handle SIGPIPE unix-signals"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   240
    ^ BrokenPipeSignal
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
99
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   243
!PipeStream methodsFor:'accessing'!
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   244
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   245
commandString
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   246
    "return the command string"
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   247
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   248
    ^ commandString
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   249
!
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   250
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   251
exitStatus
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   252
    "return exitStatus"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   253
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   254
    ^ exitStatus
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   255
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   256
    "Created: 28.12.1995 / 14:54:41 / stefan"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   257
!
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   258
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   259
pid
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   260
    "return pid"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   261
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   262
    ^ pid
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   263
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   264
    "Created: 28.12.1995 / 14:54:30 / stefan"
99
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   265
! !
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   266
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
!PipeStream methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
closeFile
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   270
    "low level close
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   271
     This waits for the command to finish. 
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   272
     Use shutDown for a fast (nonBlocking) close."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   274
    filePointer notNil ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   275
        super closeFile.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   276
        filePointer := nil.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   277
        pid notNil ifTrue:[
2119
3bb34bc533e6 care for a child to finish right in close
Claus Gittinger <cg@exept.de>
parents: 1984
diff changeset
   278
	    [
3bb34bc533e6 care for a child to finish right in close
Claus Gittinger <cg@exept.de>
parents: 1984
diff changeset
   279
                pid notNil ifTrue:[
3bb34bc533e6 care for a child to finish right in close
Claus Gittinger <cg@exept.de>
parents: 1984
diff changeset
   280
                    exitSema wait.
3bb34bc533e6 care for a child to finish right in close
Claus Gittinger <cg@exept.de>
parents: 1984
diff changeset
   281
		]
3bb34bc533e6 care for a child to finish right in close
Claus Gittinger <cg@exept.de>
parents: 1984
diff changeset
   282
	    ] valueUninterruptably
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   283
        ].
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   284
    ].
369
claus
parents: 362
diff changeset
   285
!
claus
parents: 362
diff changeset
   286
claus
parents: 362
diff changeset
   287
closeFileDescriptor
claus
parents: 362
diff changeset
   288
    "alternative very low level close 
claus
parents: 362
diff changeset
   289
     This closes the underlying OS-fileDescriptor 
claus
parents: 362
diff changeset
   290
     - and will NOT write any buffered data to the stream.
claus
parents: 362
diff changeset
   291
     You have been warned."
claus
parents: 362
diff changeset
   292
claus
parents: 362
diff changeset
   293
%{  /* NOCONTEXT */
793
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   294
#if !defined(transputer) && !defined(MSDOS_LIKE)
369
claus
parents: 362
diff changeset
   295
claus
parents: 362
diff changeset
   296
    OBJ fp;
claus
parents: 362
diff changeset
   297
    FILE *f;
claus
parents: 362
diff changeset
   298
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 793
diff changeset
   299
    if ((fp = __INST(filePointer)) != nil) {
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 793
diff changeset
   300
	__INST(filePointer) = nil;
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   301
	f = __FILEVal(fp);
369
claus
parents: 362
diff changeset
   302
	__BEGIN_INTERRUPTABLE__
claus
parents: 362
diff changeset
   303
	close(fileno(f));
claus
parents: 362
diff changeset
   304
	__END_INTERRUPTABLE__
claus
parents: 362
diff changeset
   305
    }
793
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   306
#endif /* not transputer && not MSDOS_LIKE */
369
claus
parents: 362
diff changeset
   307
%}
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   308
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   309
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   310
disposed
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   311
    "redefined to avoid blocking in close."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   312
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   313
    self shutDown
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   314
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   315
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   316
shutDown
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   317
    "close the Stream, ignoring any broken-pipe errors.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   318
     Terminate the command"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   319
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   320
    BrokenPipeSignal catch:[
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   321
        |tpid|
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   322
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   323
        Lobby unregister:self.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   324
        self closeFileDescriptor.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   325
        tpid := pid.                    "copy pid to avoid race"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   326
        tpid notNil ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   327
            "/
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   328
            "/ Terminate both the process and group, just in case the
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   329
            "/ operating system does not support process groups.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   330
            "/
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   331
            OperatingSystem terminateProcess:tpid.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   332
            OperatingSystem terminateProcessGroup:tpid.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   333
            pid := nil.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   334
        ].
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   335
    ]
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   336
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   337
    "Modified: 23.5.1996 / 09:15:41 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
!PipeStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 32
diff changeset
   342
openPipeFor:aCommandString withMode:mode
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   343
    "open a pipe to the unix command in commandString; 
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   344
     mode may be 'r' or 'w'"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   346
    |blocked pipeFdArray execFdArray execFd myFd|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   348
    filePointer notNil ifTrue:[
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   349
        "the pipe was already open ...
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   350
         this should (can) not happen."
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   351
        ^ self errorOpen
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   352
    ].
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   353
    lastErrorNumber := nil.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   354
    exitStatus := nil.
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   355
    exitSema := Semaphore new name:'pipe exitSema'.
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   356
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   357
    pipeFdArray := OperatingSystem makePipe.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   358
    pipeFdArray isNil ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   359
        lastErrorNumber := OperatingSystem currentErrorNumber.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   360
        ^ self openError
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   361
    ].
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   362
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   363
    mode = 'r' ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   364
        execFd := pipeFdArray at:2.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   365
        execFdArray := Array with:0 with:execFd with:2.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   366
        myFd := pipeFdArray at:1.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   367
    ] ifFalse:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   368
        execFd := pipeFdArray at:1.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   369
        execFdArray := Array with:execFd with:1 with:2.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   370
        myFd := pipeFdArray at:2.
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   371
    ].
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   372
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   373
    blocked := OperatingSystem blockInterrupts.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   374
    pid := OperatingSystem exec:'/bin/sh'
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   375
                           withArguments:(Array with:'sh' with:'-c' with:aCommandString)
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   376
                           fileDescriptors:execFdArray
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   377
                           closeDescriptors:(Array with:myFd)
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   378
                           fork:true
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   379
                           newPgrp:true.
362
claus
parents: 360
diff changeset
   380
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   381
    OperatingSystem closeFd:execFd.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   382
    pid > 0 ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   383
        self fileDescriptor:myFd withMode:mode.
1984
153ce9f56b05 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1663
diff changeset
   384
        Processor monitorPid:pid action:[ :status |
153ce9f56b05 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1663
diff changeset
   385
            exitStatus := status.
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   386
            pid := nil.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   387
            exitSema signal.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   388
        ].
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   389
    ] ifFalse:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   390
        pid := nil.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   391
        lastErrorNumber := OperatingSystem currentErrorNumber.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   392
        OperatingSystem closeFd:myFd.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   393
    ].
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   394
    blocked ifFalse:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   395
        OperatingSystem unblockInterrupts
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
    ].
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   397
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   398
    lastErrorNumber isNil ifTrue:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   399
        commandString := aCommandString.
1662
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   400
%{
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   401
        /* LINUX stdio is corrupt here ... */
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
   402
#ifdef BUGGY_STDIO_LIB
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   403
        __INST(buffered) = false;
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
   404
#else
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   405
        __INST(buffered) = true;
1662
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   406
#endif
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   407
%}.
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   408
        hitEOF := false.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   409
        binary := false.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   410
        Lobby register:self
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   411
    ] ifFalse:[
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   412
        "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   413
         the pipe open failed for some reason ...
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   414
         ... this may be either due to an invalid command string,
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   415
         or due to the system running out of memory (when forking
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   416
         the unix process)
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   417
        "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   418
        ^ self openError
255
2b2c5c0facab *** empty log message ***
claus
parents: 230
diff changeset
   419
    ].
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   420
    ^ self
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   421
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   422
    "Modified: 23.4.1996 / 17:05:59 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
readingFrom:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    "setup the receiver to read from command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   428
    mode := #readonly. didWrite := false.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
    ^ self openPipeFor:command withMode:'r'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
writingTo:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
    "setup the receiver to write to command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   435
    mode := #writeonly. didWrite := true.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
    ^ self openPipeFor:command withMode:'w'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
! !
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   438
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   439
!PipeStream class methodsFor:'documentation'!
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   440
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   441
version
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   442
    ^ '$Header: /cvs/stx/stx/libbasic/PipeStream.st,v 1.50 1997-01-24 23:18:40 cg Exp $'
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   443
! !
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   444
PipeStream initialize!