1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 19:52:20 +00:00

Don't use fstat for readable pipe chars in dtexec.

The dtexec code assumes that fstat reports pipe's readable chars.
Linux always reports 0 for st_size of a pipe.
Instead read one character when select reports readable.
Note EOF when select says readable but read returns 0.
This commit is contained in:
Mike Stroyan 2012-09-09 15:44:45 -06:00 committed by Jon Trulson
parent bd70163b09
commit f0a60e47b1

View file

@ -1163,7 +1163,6 @@ main (
int junki,i;
char *tmpBuffer;
int errorBytes;
struct stat statBuffer;
int firstPass, tmpi;
char *tmpProgName = NULL;
@ -1390,28 +1389,31 @@ main (
firstPass = 1;
while (1) {
if ( fstat(errorpipeG[0], &statBuffer) ) {
break;
char buf;
nfound =select(MAXSOCKS, FD_SET_CAST(&readfds), FD_SET_CAST(NULL),
FD_SET_CAST(NULL), &timeoutShort);
if (nfound > 0) {
tmpi = read (errorpipeG[0], &buf, 1);
} else {
tmpi = 0;
}
else if ( statBuffer.st_size > 0 ) {
if ( tmpi > 0 ) {
/*
* Grow buffer to hold entire error stream.
*/
firstPass = 0;
if (tmpBuffer == NULL)
tmpBuffer = (char *) malloc(
statBuffer.st_size + 1);
tmpi + 1);
else
tmpBuffer = (char *) realloc( tmpBuffer,
errorBytes +
statBuffer.st_size + 1);
errorBytes + tmpi + 1);
/*
* Drain error pipe.
*/
tmpi = read (errorpipeG[0], &tmpBuffer[errorBytes],
statBuffer.st_size);
if (tmpi > 0) /* else let fstat() redetect problem */
errorBytes += tmpi;
tmpBuffer[errorBytes] = buf;
errorBytes += tmpi;
tmpBuffer[errorBytes] = '\0';
if (errorBytes < 65535) {