PipeStream.st
author Claus Gittinger <cg@exept.de>
Mon, 17 Mar 2003 17:47:00 +0100
changeset 7114 acc13967229e
parent 7079 07625dfffcbf
child 7663 cb09eede524f
permissions -rw-r--r--
position fixes
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
5388
bef4d52749a4 terminate command on close (also under unix)
Claus Gittinger <cg@exept.de>
parents: 5243
diff changeset
    13
"{ Package: 'stx:libbasic' }"
bef4d52749a4 terminate command on close (also under unix)
Claus Gittinger <cg@exept.de>
parents: 5243
diff changeset
    14
269
93162487a94b *** empty log message ***
claus
parents: 255
diff changeset
    15
NonPositionableExternalStream subclass:#PipeStream
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
    16
	instanceVariableNames:'commandString pid exitStatus exitSema exitAction'
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    17
	classVariableNames:'BrokenPipeSignal'
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    18
	poolDictionaries:''
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
    19
	category:'Streams-External'
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    20
!
2
claus
parents: 1
diff changeset
    21
217
a0400fdbc933 *** empty log message ***
claus
parents: 180
diff changeset
    22
!PipeStream primitiveDefinitions!
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    23
%{
437
claus
parents: 410
diff changeset
    24
4616
64dd3a9bebf5 *** empty log message ***
ps
parents: 4526
diff changeset
    25
#if defined(WIN32)
793
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    26
# undef UNIX_LIKE
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    27
# define MSDOS_LIKE
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    28
#endif
3d441d66beeb NT changes
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
    29
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
#include <stdio.h>
437
claus
parents: 410
diff changeset
    31
#define _STDIO_H_INCLUDED_
claus
parents: 410
diff changeset
    32
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    33
#include <errno.h>
437
claus
parents: 410
diff changeset
    34
#define _ERRNO_H_INCLUDED_
claus
parents: 410
diff changeset
    35
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
#ifndef transputer
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
# include <sys/types.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
# include <sys/stat.h>
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
#endif
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    40
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    41
/*
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    42
 * on some systems errno is a macro ... check for it here
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    43
 */
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    44
#ifndef errno
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    45
 extern errno;
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    46
#endif
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
    47
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    48
#ifdef LINUX
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    49
# define BUGGY_STDIO_LIB
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    50
#endif
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
    51
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    52
%}
180
c488255bd0be *** empty log message ***
claus
parents: 159
diff changeset
    53
! !
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    54
325
claus
parents: 308
diff changeset
    55
!PipeStream primitiveFunctions!
claus
parents: 308
diff changeset
    56
%{
claus
parents: 308
diff changeset
    57
claus
parents: 308
diff changeset
    58
/*
2925
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    59
 * no longer needed - popen is useless ...
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    60
 */
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    61
#undef NEED_POPEN_WITH_VFORK
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    62
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    63
/*
325
claus
parents: 308
diff changeset
    64
 * some systems (i.e. ultrix) use fork;
claus
parents: 308
diff changeset
    65
 * were better off with a popen based on vfork ...
claus
parents: 308
diff changeset
    66
 */
claus
parents: 308
diff changeset
    67
#ifdef NEED_POPEN_WITH_VFORK
claus
parents: 308
diff changeset
    68
claus
parents: 308
diff changeset
    69
static int popen_pid = 0;
claus
parents: 308
diff changeset
    70
claus
parents: 308
diff changeset
    71
FILE *
claus
parents: 308
diff changeset
    72
popen(command, type)
claus
parents: 308
diff changeset
    73
/* const */ char *command;
claus
parents: 308
diff changeset
    74
/* const */ char *type;
claus
parents: 308
diff changeset
    75
{
claus
parents: 308
diff changeset
    76
    int pipes[2];
claus
parents: 308
diff changeset
    77
    int itype = (strcmp(type, "w") == 0 ? 1 : 0);
claus
parents: 308
diff changeset
    78
claus
parents: 308
diff changeset
    79
    if (pipe(pipes) == -1)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    80
	return NULL;
325
claus
parents: 308
diff changeset
    81
claus
parents: 308
diff changeset
    82
    switch (popen_pid = vfork()) {
claus
parents: 308
diff changeset
    83
    case -1:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    84
	(void)close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    85
	(void)close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    86
	return NULL;
325
claus
parents: 308
diff changeset
    87
claus
parents: 308
diff changeset
    88
    case 0:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    89
	if (itype) {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    90
	    dup2(pipes[0], fileno(stdin));
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    91
	    close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    92
	} else {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    93
	    dup2(pipes[1], fileno(stdout));
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    94
	    close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    95
	}
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    96
	execl("/bin/sh", "/bin/sh", "-c", command, 0);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    97
	fprintf(stderr, "XRN Error: failed the execlp\n");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    98
	_exit(-1);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
    99
	/* NOTREACHED */
325
claus
parents: 308
diff changeset
   100
claus
parents: 308
diff changeset
   101
    default:
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   102
	    if (itype) {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   103
		close(pipes[0]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   104
		return fdopen(pipes[1], "w");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   105
	    } else {
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   106
		close(pipes[1]);
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   107
		return fdopen(pipes[0], "r");
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   108
	    }
325
claus
parents: 308
diff changeset
   109
    }
claus
parents: 308
diff changeset
   110
}
claus
parents: 308
diff changeset
   111
claus
parents: 308
diff changeset
   112
int
claus
parents: 308
diff changeset
   113
pclose(str)
claus
parents: 308
diff changeset
   114
FILE *str;
claus
parents: 308
diff changeset
   115
{
claus
parents: 308
diff changeset
   116
    int pd = 0;
claus
parents: 308
diff changeset
   117
    int status;
claus
parents: 308
diff changeset
   118
    int err;
claus
parents: 308
diff changeset
   119
claus
parents: 308
diff changeset
   120
    err = fclose(str);
claus
parents: 308
diff changeset
   121
claus
parents: 308
diff changeset
   122
    do {
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   123
	if ((pd = wait(&status)) == -1)
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   124
	{
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   125
		err = EOF;
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   126
		break;
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   127
	}
325
claus
parents: 308
diff changeset
   128
    } while (pd !=  popen_pid);
claus
parents: 308
diff changeset
   129
claus
parents: 308
diff changeset
   130
    if (err == EOF)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   131
	return  -1;
325
claus
parents: 308
diff changeset
   132
claus
parents: 308
diff changeset
   133
    if (status)
326
d2902942491d *** empty log message ***
claus
parents: 325
diff changeset
   134
	status >>= 8;   /* exit status in high byte */
325
claus
parents: 308
diff changeset
   135
claus
parents: 308
diff changeset
   136
    return status;
claus
parents: 308
diff changeset
   137
}
claus
parents: 308
diff changeset
   138
2925
1a64228425ca *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
   139
#endif /* NEED_POPEN_WITH_VFORK */
325
claus
parents: 308
diff changeset
   140
claus
parents: 308
diff changeset
   141
%}
claus
parents: 308
diff changeset
   142
! !
claus
parents: 308
diff changeset
   143
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   144
!PipeStream class methodsFor:'documentation'!
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   145
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   146
copyright
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   147
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   148
 COPYRIGHT (c) 1989 by Claus Gittinger
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   149
	      All Rights Reserved
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
 This software is furnished under a license and may be used
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   152
 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
   153
 inclusion of the above copyright notice.   This software may not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   154
 be provided or otherwise made available to, or used by, any
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   155
 other person.  No title to or ownership of the software is
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   156
 hereby transferred.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   157
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   158
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   159
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   160
documentation
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   161
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   162
    Pipestreams allow reading or writing from/to a unix command.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   163
    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
   164
    command, a PipeStream can be created with:
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   165
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   166
        PipeStream readingFrom:'ls -l'
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   167
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   168
    the characters of the commands output can be read using the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   169
    standard stream messages as next, nextLine etc.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   170
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   171
    If a writing pipeStream is written to, after the command has finished,
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   172
    UNIX will generate an error-signal (SIGPIPE), which will raise the BrokenPipeSignal. 
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   173
    Thus, to handle this condition correctly, the following code is suggested:
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   174
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   175
        |p|
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   176
        p := PipeStream writingTo:'echo hello'.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   177
        PipeStream brokenPipeSignal handle:[:ex |
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   178
            'broken pipe' printNewline.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   179
            p shutDown.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   180
            ex return
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   181
        ] do:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   182
            p nextPutLine:'oops'.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   183
           'after write' printNewline.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   184
            p close.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   185
           'after close' printNewline
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   186
        ]
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   187
1663
dd111ec142da *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1662
diff changeset
   188
    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
   189
    the write - or even at close time; to avoid a recursive signal in the exception
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   190
    handler, a #shutDown is useful there; if you use close in the handler, this would
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   191
    try to send any buffered output to the pipe, leading to another brokenPipe exception.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   192
1662
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   193
    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
   194
    buggy (trying to restart the read ...)
ce26ca3d837c linux stdio does not work with buffered pipes
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
   195
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   196
    Currently, no filtering pipeStreams (i.e. both reading AND writing) are provided.
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   197
    Use OperatingSystem>>executeCommand:inputFrom:outputTo:errorTo:inDirectory:lineWise:onError: 
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   198
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   199
    [author:]
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   200
        Claus Gittinger
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   201
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   202
    [see also:]
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   203
        ExternalStream FileStream Socket
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   204
        OperatingSystem
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   205
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   206
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   207
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   208
!PipeStream class methodsFor:'initialization'!
2
claus
parents: 1
diff changeset
   209
claus
parents: 1
diff changeset
   210
initialize
claus
parents: 1
diff changeset
   211
    "setup the signal"
claus
parents: 1
diff changeset
   212
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   213
    BrokenPipeSignal isNil ifTrue:[
582
21f08116b28d BrokenPipeSignal now a child of WriteErrorSignal
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   214
	BrokenPipeSignal := WriteErrorSignal newSignalMayProceed:true.
159
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   215
	BrokenPipeSignal nameClass:self message:#brokenPipeSignal.
514c749165c3 *** empty log message ***
claus
parents: 99
diff changeset
   216
	BrokenPipeSignal notifierString:'write on a pipe with no one to read'.
57
db9677479d35 *** empty log message ***
claus
parents: 49
diff changeset
   217
    ]
2
claus
parents: 1
diff changeset
   218
! !
claus
parents: 1
diff changeset
   219
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   220
!PipeStream class methodsFor:'instance creation'!
2
claus
parents: 1
diff changeset
   221
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   222
readingFrom:commandString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   223
    "create and return a new pipeStream which can read from the unix command
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   224
     given by command. 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   225
     The commands error output is send to my own error output."
2
claus
parents: 1
diff changeset
   226
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   227
    ^ self 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   228
	readingFrom:commandString 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   229
	errorDisposition:#stderr 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   230
	inDirectory:nil
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   231
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   232
    "unix:
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   233
	PipeStream readingFrom:'ls -l'.
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   234
    "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   235
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   236
    "
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   237
	p := PipeStream readingFrom:'ls -l'.
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   238
	Transcript showCR:p nextLine.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   239
	p close
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   240
    "
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   241
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   242
    "
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   243
	|s|
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   244
	s := PipeStream readingFrom:'sh -c sleep\ 600'.
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   245
	(Delay forSeconds:2) wait.
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   246
	s shutDown
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   247
    "
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   248
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   249
    "vms:
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   250
	PipeStream readingFrom:'dir'.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   251
    "
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   252
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   253
    "
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   254
	|p|
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   255
	p := PipeStream readingFrom:'dir'.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   256
	Transcript showCR:p nextLine.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   257
	p close
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   258
    "
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   259
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   260
    "msdos:
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   261
	PipeStream readingFrom:'dir'.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   262
    "
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   263
    "
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   264
	|p|
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   265
	p := PipeStream readingFrom:'dir'.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   266
	Transcript showCR:p nextLine.
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   267
	p close
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   268
    "
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   269
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   270
    "Modified: 24.4.1996 / 09:09:25 / stefan"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   271
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   273
readingFrom:commandString errorDisposition:errorDisposition inDirectory:aDirectory
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   274
    "similar to #readingFrom, but changes the directory while
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   275
     executing the command. Use this if a command is to be
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   276
     executed in another directory, to avoid any OS dependencies
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   277
     in your code.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   278
     errorDisposition may be one of #discard, #inline or #stderr (default).
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   279
     #discard causes stderr to be discarded (/dev/null), 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   280
     #inline causes it to be merged into the PipeStream and
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   281
     #stderr causes it to be written to smalltalks own stderr.
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   282
     Nil is treated like #stderr"
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   283
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   284
    ^ self basicNew
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   285
	openPipeFor:commandString 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   286
	withMode:'r' 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   287
	errorDisposition:errorDisposition 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   288
	inDirectory:aDirectory
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   289
!
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   290
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   291
readingFrom:commandString inDirectory:aDirectory
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   292
    "similar to #readingFrom, but changes the directory while
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   293
     executing the command. Use this if a command is to be
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   294
     executed in another directory, to avoid any OS dependencies
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   295
     in your code.
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   296
     The commands error output is send to my own error output."
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   297
3563
16ccd4cefcbe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3533
diff changeset
   298
     ^ self 
16ccd4cefcbe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3533
diff changeset
   299
	readingFrom:commandString
16ccd4cefcbe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3533
diff changeset
   300
	errorDisposition:#stderr 
16ccd4cefcbe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3533
diff changeset
   301
	inDirectory:aDirectory
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   302
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   303
    "Modified: 24.9.1997 / 09:33:48 / stefan"
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   304
!
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   305
2
claus
parents: 1
diff changeset
   306
writingTo:commandString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    "create and return a new pipeStream which can write to the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   310
    ^ self 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   311
	writingTo:commandString errorDisposition:#stderr inDirectory:nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   313
    "unix:
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   314
	 PipeStream writingTo:'sort'
2966
856dfc8a294a lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2961
diff changeset
   315
    "
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   316
!
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   317
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   318
writingTo:commandString errorDisposition:errorDisposition inDirectory:aDirectory
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   319
    "similar to #writingTo, but changes the directory while
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   320
     executing the command. Use this if a command is to be
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   321
     executed in another directory, to avoid any OS dependencies
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   322
     in your code.
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   323
     errorDisposition may be one of #discard, #inline or #stderr (default).
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   324
     #discard causes stderr to be discarded (/dev/null), 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   325
     #inline causes it to be written to smalltalks own stdout and
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   326
     #stderr causes it to be written to smalltalks own stderr.
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   327
     Nil is treated like #stderr"
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   328
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   329
    ^ self basicNew
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   330
	openPipeFor:commandString 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   331
	withMode:'w' 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   332
	errorDisposition:errorDisposition 
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   333
	inDirectory:aDirectory
4526
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   334
!
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   335
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   336
writingTo:commandString inDirectory:aDirectory
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   337
    "create and return a new pipeStream which can write to the unix command
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   338
     given by command. The command is executed in the given directory."
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   339
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   340
    ^ self 
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   341
	writingTo:commandString errorDisposition:#stderr inDirectory:aDirectory
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   342
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   343
    "unix:
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   344
	 PipeStream writingTo:'sort'
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4202
diff changeset
   345
    "
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   346
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   347
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   348
!PipeStream class methodsFor:'Signal constants'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   350
brokenPipeSignal
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   351
    "return the signal used to handle SIGPIPE unix-signals.
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   352
     Since SIGPIPE is asynchronous, we can't decide which smalltalk process
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   353
     should handle BrokenPipeSignal. So the system doesn't raise 
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   354
     BrokenPipeSignal for SIGPIPE any longer."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   356
    ^ BrokenPipeSignal
2985
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   357
eff9e86dd2f9 New method #readingFrom:errorDisposition:inDirectory.
Stefan Vogel <sv@exept.de>
parents: 2976
diff changeset
   358
    "Modified: 24.9.1997 / 09:43:23 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
99
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   361
!PipeStream methodsFor:'accessing'!
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   362
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   363
commandString
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   364
    "return the command string"
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   365
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   366
    ^ commandString
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   367
!
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   368
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   369
exitStatus
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   370
    "return exitStatus"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   371
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   372
    ^ exitStatus
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   373
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   374
    "Created: 28.12.1995 / 14:54:41 / stefan"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   375
!
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   376
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   377
pid
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   378
    "return pid"
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   379
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   380
    ^ pid
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   381
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   382
    "Created: 28.12.1995 / 14:54:30 / stefan"
99
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   383
! !
afba01fbe15c added access method for commandString
claus
parents: 93
diff changeset
   384
5243
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   385
!PipeStream methodsFor:'finalization'!
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   386
6439
0f841258ec4a Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6267
diff changeset
   387
finalize
5243
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   388
    "redefined to avoid blocking in close."
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   389
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   390
    self shutDown
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   391
! !
d3b509746522 category change
Claus Gittinger <cg@exept.de>
parents: 5205
diff changeset
   392
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
!PipeStream methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
closeFile
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   396
    "low level close
230
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   397
     This waits for the command to finish. 
0300c6797890 interrupt & blocking close
claus
parents: 217
diff changeset
   398
     Use shutDown for a fast (nonBlocking) close."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
7027
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   400
    filePointer notNil ifTrue:[
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   401
        super closeFile.
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   402
        OperatingSystem isMSDOSlike ifTrue:[
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   403
            self terminatePipeCommand.
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   404
        ].
3834
93ec07316a98 oops - must nil pid when terminating the process
Claus Gittinger <cg@exept.de>
parents: 3833
diff changeset
   405
7027
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   406
        filePointer := nil.
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   407
        pid notNil ifTrue:[
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   408
            "/ wait for the pipe-command to terminate.
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   409
            self waitForPipeCommandWithTimeout:nil.
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   410
        ].
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   411
    ].
3833
3ae90f8da01a terminate process BEFORE closing the pipe under win32
Claus Gittinger <cg@exept.de>
parents: 3791
diff changeset
   412
3834
93ec07316a98 oops - must nil pid when terminating the process
Claus Gittinger <cg@exept.de>
parents: 3833
diff changeset
   413
    "Modified: / 12.9.1998 / 16:51:04 / cg"
369
claus
parents: 362
diff changeset
   414
!
claus
parents: 362
diff changeset
   415
claus
parents: 362
diff changeset
   416
closeFileDescriptor
claus
parents: 362
diff changeset
   417
    "alternative very low level close 
claus
parents: 362
diff changeset
   418
     This closes the underlying OS-fileDescriptor 
claus
parents: 362
diff changeset
   419
     - and will NOT write any buffered data to the stream.
claus
parents: 362
diff changeset
   420
     You have been warned."
claus
parents: 362
diff changeset
   421
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   422
    |action|
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   423
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   424
%{  
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   425
#if !defined(transputer)
369
claus
parents: 362
diff changeset
   426
    OBJ fp;
claus
parents: 362
diff changeset
   427
    FILE *f;
4616
64dd3a9bebf5 *** empty log message ***
ps
parents: 4526
diff changeset
   428
    extern close();
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   429
    int retVal;
369
claus
parents: 362
diff changeset
   430
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 793
diff changeset
   431
    if ((fp = __INST(filePointer)) != nil) {
6487
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   432
        __INST(filePointer) = nil;
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   433
        f = __FILEVal(fp);
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   434
        if (@global(FileOpenTrace) == true) {
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   435
            fprintf(stderr, "close [PipeStream] %x fd=%d\n", f, fileno(f));
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   436
        }
3744
e2c57149f3b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3563
diff changeset
   437
#ifdef WIN32
6487
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   438
        do {
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   439
            __threadErrno = 0;
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   440
            retVal = __STX_C_CALL1( "close", (void*)close, (void*)fileno(f) );
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   441
        } while ((retVal < 0) && (__threadErrno == EINTR));
3744
e2c57149f3b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3563
diff changeset
   442
#else
6487
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   443
        __BEGIN_INTERRUPTABLE__
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   444
        close(fileno(f));
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   445
        __END_INTERRUPTABLE__
3744
e2c57149f3b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3563
diff changeset
   446
#endif
369
claus
parents: 362
diff changeset
   447
    }
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   448
#endif /* not transputer  */
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   449
%}.
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   450
    exitAction notNil ifTrue:[
6487
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   451
        action := exitAction.
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   452
        exitAction := nil.
78c18e4cb6ff @global stuff for classvars
Stefan Vogel <sv@exept.de>
parents: 6439
diff changeset
   453
        action value.
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   454
    ]
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   455
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   456
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   457
shutDown
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   458
    "close the Stream, ignoring any broken-pipe errors.
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   459
     Terminate the command"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   460
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   461
    BrokenPipeSignal catch:[
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   462
	Lobby unregister:self.
3833
3ae90f8da01a terminate process BEFORE closing the pipe under win32
Claus Gittinger <cg@exept.de>
parents: 3791
diff changeset
   463
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   464
	"/ terminate first under windows.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   465
	OperatingSystem isMSDOSlike ifTrue:[
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   466
	    self terminatePipeCommand.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   467
	].
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   468
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   469
	self closeFileDescriptor.
3834
93ec07316a98 oops - must nil pid when terminating the process
Claus Gittinger <cg@exept.de>
parents: 3833
diff changeset
   470
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   471
	"/ terminate last under unix.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   472
	OperatingSystem isMSDOSlike ifFalse:[
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   473
	    self terminatePipeCommand.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   474
	].
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   475
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   476
    ]
1648
faa891d2c1b0 Use OperatingSystem executeCommand:... instead of popen().
Stefan Vogel <sv@exept.de>
parents: 1295
diff changeset
   477
3833
3ae90f8da01a terminate process BEFORE closing the pipe under win32
Claus Gittinger <cg@exept.de>
parents: 3791
diff changeset
   478
    "Modified: / 23.5.1996 / 09:15:41 / stefan"
3834
93ec07316a98 oops - must nil pid when terminating the process
Claus Gittinger <cg@exept.de>
parents: 3833
diff changeset
   479
    "Modified: / 12.9.1998 / 16:50:18 / cg"
5456
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   480
!
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   481
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   482
terminatePipeCommand
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   483
    |tpid|
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   484
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   485
    (tpid := pid) notNil ifTrue:[
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   486
	OperatingSystem terminateProcess:tpid.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   487
	OperatingSystem terminateProcessGroup:tpid.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   488
	pid := nil.
5456
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   489
    ].
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   490
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   491
!
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   492
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   493
waitForPipeCommandWithTimeout:seconds
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   494
    "wait for the pipe command to terminate itself.
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   495
     Return true, if a timeout occurred."
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   496
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   497
    pid notNil ifTrue:[
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   498
	[
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   499
	    pid notNil ifTrue:[
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   500
		exitSema waitWithTimeout:seconds.
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   501
	    ]
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 5880
diff changeset
   502
	] valueUninterruptably
5456
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   503
    ].
a96c23f8da35 pipe-command termination fix
ca
parents: 5388
diff changeset
   504
    ^ pid notNil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
!PipeStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
2969
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   509
exitAction:aBlock
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   510
    "define a block to be evaluated when the pipe is closed.
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   511
     This is only used with VMS, to remove any temporary COM file.
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   512
     (see readingFrom:inDirectory:)"
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   513
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   514
    exitAction := aBlock
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   515
!
1fcf6dfb6004 VMS pipes in another directory
Claus Gittinger <cg@exept.de>
parents: 2966
diff changeset
   516
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   517
openPipeFor:aCommandString withMode:rwMode errorDisposition:errorDisposition inDirectory:aDirectory
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   518
    "open a pipe to the OS command in commandString; 
5481
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   519
     rwMode may be 'r' or 'w'.
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   520
     errorDisposition controls where the stdErr output should go,
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   521
     and may be one of #discard, #inline or #stderr (default).
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   522
     #discard causes stderr to be discarded (/dev/null), 
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   523
     #inline causes it to be written to smalltalks own stdout and
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   524
     #stderr causes it to be written to smalltalks own stderr.
680d6de80808 comment
Claus Gittinger <cg@exept.de>
parents: 5456
diff changeset
   525
     Nil is treated like #stderr"
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   526
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   527
    |blocked pipeFdArray execFdArray execFd myFd shellAndArgs
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   528
     shellPath shellArgs mbx mbxName 
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   529
     realCmd execDirectory tmpComFile nullOutput|
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   530
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   531
    filePointer notNil ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   532
        "the pipe was already open ...
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   533
         this should (can) not happen."
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   534
        ^ self errorAlreadyOpen
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   535
    ].
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   536
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   537
    rwMode = 'r' ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   538
        mode := #readonly. didWrite := false.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   539
    ] ifFalse:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   540
        mode := #writeonly. didWrite := true.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   541
    ].
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   542
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   543
    lastErrorNumber := nil.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   544
    exitStatus := nil.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   545
    exitSema := Semaphore new name:'pipe exitSema'.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   546
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   547
    realCmd := aCommandString.
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   548
    execDirectory := aDirectory.
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   549
    execFdArray := #(0 1 2) copy.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   550
3791
76ea6c85ca1f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3773
diff changeset
   551
    OperatingSystem isVMSlike ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   552
        "/
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   553
        "/ the generated COM-file includes a 'set default'
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   554
        "/
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   555
        tmpComFile := OperatingSystem createCOMFileForVMSCommand:aCommandString in:aDirectory.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   556
        realCmd := '@' , tmpComFile osName.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   557
        execDirectory := nil.
4616
64dd3a9bebf5 *** empty log message ***
ps
parents: 4526
diff changeset
   558
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   559
        mbx := OperatingSystem createMailBox.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   560
        mbx isNil ifTrue:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   561
            lastErrorNumber := OperatingSystem currentErrorNumber.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   562
            tmpComFile delete.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   563
            ^ self openError
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   564
        ].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   565
        mbxName := OperatingSystem mailBoxNameOf:mbx.
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   566
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   567
        "/ 'mailBox is ' print. mbx print. ' name is ' print. mbxName printCR.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   568
        shellPath := ''.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   569
        shellArgs := realCmd.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   570
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   571
        rwMode = 'r' ifTrue:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   572
            "redirect stdout of subprocess to write to mailbox"
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   573
            execFdArray at:2 put:mbx.
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   574
        ] ifFalse:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   575
            "redirect stdin of subprocess to read from mailbox"
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   576
            execFdArray at:1 put:mbx.
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   577
        ].
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   578
    ] ifFalse:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   579
        pipeFdArray := OperatingSystem makePipe.
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   580
        pipeFdArray isNil ifTrue:[
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   581
            lastErrorNumber := OperatingSystem currentErrorNumber.
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   582
            ^ self openError
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   583
        ].
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   584
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   585
        OperatingSystem isUNIXlike ifTrue:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   586
            "why??
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   587
             Maybe because we want to find the command
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   588
             in the current directory??
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   589
             This is ugly!!"
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   590
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   591
            aDirectory notNil ifTrue:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   592
                "/ unix - prepend a 'cd' to the command
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   593
                realCmd := 'cd "' , aDirectory asFilename name, '"; ' , aCommandString.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   594
            ] ifFalse:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   595
                realCmd := aCommandString
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   596
            ].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   597
            execDirectory := nil.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   598
        ].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   599
        shellAndArgs := OperatingSystem commandAndArgsForOSCommand:realCmd.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   600
        shellPath := shellAndArgs at:1.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   601
        shellArgs := shellAndArgs at:2.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   602
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   603
        rwMode = 'r' ifTrue:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   604
            "redirect stdout of subprocess to write to pipe"
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   605
            myFd := pipeFdArray at:1.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   606
            execFd := pipeFdArray at:2.
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   607
            execFdArray at:2 put:execFd.
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   608
        ] ifFalse:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   609
            "redirect stdin of subprocess to read from pipe"
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   610
            myFd := pipeFdArray at:2.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   611
            execFd := pipeFdArray at:1.
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   612
            execFdArray at:1 put:execFd.
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   613
        ].
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   614
    ].
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   615
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   616
    errorDisposition == #discard ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   617
        nullOutput := Filename nullDevice writeStream.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   618
        execFdArray at:3 put:nullOutput fileDescriptor
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   619
    ] ifFalse:[(errorDisposition == #inline or:[errorDisposition == #stdout]) ifTrue:[
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   620
        execFdArray at:3 put:1
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   621
    ]].
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   622
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   623
    "/ must block here, to avoid races due to early finishing
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   624
    "/ subprocesses ...
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   625
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   626
    blocked := OperatingSystem blockInterrupts.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   627
3563
16ccd4cefcbe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3533
diff changeset
   628
    pid := Processor 
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   629
               monitor:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   630
                  OperatingSystem 
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   631
                      exec:shellPath
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   632
                      withArguments:shellArgs
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   633
                      environment:nil
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   634
                      fileDescriptors:execFdArray
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   635
                      fork:true
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   636
                      newPgrp:true
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   637
                      inDirectory:execDirectory.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   638
               ]
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   639
               action:[:status |
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   640
                  status stillAlive ifFalse:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   641
                      exitStatus := status.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   642
                      OperatingSystem closePid:pid.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   643
                      pid := nil.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   644
                      exitSema signal.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   645
                  ].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   646
               ].
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   647
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   648
    "subprocess has been created.
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   649
     close unused filedescriptors"
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   650
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   651
    execFd notNil ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   652
        OperatingSystem closeFd:execFd.
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   653
    ].
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   654
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   655
    nullOutput notNil ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   656
        nullOutput close
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   657
    ].
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   658
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   659
    pid notNil ifTrue:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   660
        "successfull creation of subprocesss"
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   661
        OperatingSystem isVMSlike ifTrue:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   662
            "/
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   663
            "/ reopen the mailbox as a file ...
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   664
            "/
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   665
            mbxName := OperatingSystem mailBoxNameOf:mbx.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   666
            mbxName notNil ifTrue:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   667
                super open:mbxName withMode:rwMode.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   668
                exitAction := [tmpComFile delete].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   669
            ].
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   670
        ] ifFalse:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   671
            self setFileDescriptor:myFd mode:rwMode.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   672
        ]
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   673
    ] ifFalse:[
7079
07625dfffcbf Cleanup filedescriptor closing on #exec:withArguments:....
Stefan Vogel <sv@exept.de>
parents: 7060
diff changeset
   674
        "creation of subprocesss failed"
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   675
        lastErrorNumber := OperatingSystem currentErrorNumber.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   676
        OperatingSystem isVMSlike ifTrue:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   677
            OperatingSystem destroyMailBox:mbx.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   678
            tmpComFile delete.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   679
        ] ifFalse:[
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   680
            OperatingSystem closeFd:myFd.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   681
        ].
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   682
    ].
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   683
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   684
    blocked ifFalse:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   685
        OperatingSystem unblockInterrupts
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   686
    ].
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   687
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   688
    lastErrorNumber notNil ifTrue:[
7060
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   689
        "
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   690
         the pipe open failed for some reason ...
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   691
         ... this may be either due to an invalid command string,
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   692
         or due to the system running out of memory (when forking
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   693
         the unix process)
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   694
        "
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   695
        exitAction value.
7e1eec6ab21e Call 'final' method #executeCommand:....
Stefan Vogel <sv@exept.de>
parents: 7027
diff changeset
   696
        ^ self openError
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   697
    ].
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   698
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   699
    commandString := realCmd.
5673
58ebbb50cd3a Set to unbuffered, sincestdio does not work with pipes.
Stefan Vogel <sv@exept.de>
parents: 5624
diff changeset
   700
58ebbb50cd3a Set to unbuffered, sincestdio does not work with pipes.
Stefan Vogel <sv@exept.de>
parents: 5624
diff changeset
   701
    "stdio lib does not work with blocking pipes and interrupts
58ebbb50cd3a Set to unbuffered, sincestdio does not work with pipes.
Stefan Vogel <sv@exept.de>
parents: 5624
diff changeset
   702
     for WIN, Linux, Solaris and probably any other UNIX"
58ebbb50cd3a Set to unbuffered, sincestdio does not work with pipes.
Stefan Vogel <sv@exept.de>
parents: 5624
diff changeset
   703
    buffered := false.
7114
acc13967229e position fixes
Claus Gittinger <cg@exept.de>
parents: 7079
diff changeset
   704
    position := ZeroPosition.
3296
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   705
    hitEOF := false.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   706
    binary := false.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   707
    Lobby register:self.
bd2da537678b md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 3196
diff changeset
   708
4202
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   709
    "Modified: / 23.4.1996 / 17:05:59 / stefan"
b9f85ebd2e38 generalized errorDisposition (for other OS's);
Claus Gittinger <cg@exept.de>
parents: 4125
diff changeset
   710
    "Modified: / 28.1.1998 / 14:47:34 / md"
6439
0f841258ec4a Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6267
diff changeset
   711
    "Created: / 19.5.1999 / 12:28:54 / cg"
0f841258ec4a Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6267
diff changeset
   712
! !
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   713
2266
a94af740c68a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2121
diff changeset
   714
!PipeStream class methodsFor:'documentation'!
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   715
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   716
version
7114
acc13967229e position fixes
Claus Gittinger <cg@exept.de>
parents: 7079
diff changeset
   717
    ^ '$Header: /cvs/stx/stx/libbasic/PipeStream.st,v 1.96 2003-03-17 16:47:00 cg Exp $'
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   718
! !
7027
0efa9d55fa04 Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   719
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 582
diff changeset
   720
PipeStream initialize!