X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/7ee3f3b8aaf43c8c712ce1c4c1d8b8c52e692e12..948033c2cdf7124a3caed78d7ca8316daa0c77c5:/lib/base/console.cpp diff --git a/lib/base/console.cpp b/lib/base/console.cpp index 2e00804a..0a01094b 100644 --- a/lib/base/console.cpp +++ b/lib/base/console.cpp @@ -7,6 +7,7 @@ #include #include #include +#include int bidirpipe(int pfd[], const char *cmd , const char * const argv[], const char *cwd ) { @@ -176,12 +177,13 @@ int eConsoleAppContainer::execute(const char *cmdline, const char * const argv[] // get one read ,one write and the err pipe to the prog.. pid = bidirpipe(fd, cmdline, argv, m_cwd.length() ? m_cwd.c_str() : 0); - if ( pid == -1 ) return -3; // eDebug("pipe in = %d, out = %d, err = %d", fd[0], fd[1], fd[2]); + ::fcntl(fd[1], F_SETFL, O_NONBLOCK); + ::fcntl(fd[2], F_SETFL, O_NONBLOCK); in = new eSocketNotifier(eApp, fd[0], eSocketNotifier::Read|eSocketNotifier::Priority|eSocketNotifier::Hungup ); out = new eSocketNotifier(eApp, fd[1], eSocketNotifier::Write, false); err = new eSocketNotifier(eApp, fd[2], eSocketNotifier::Read|eSocketNotifier::Priority ); @@ -296,18 +298,17 @@ void eConsoleAppContainer::readyRead(int what) if (what & (eSocketNotifier::Priority|eSocketNotifier::Read)) { // eDebug("what = %d"); - char buf[2048]; + char buf[2049]; int rd; - while((rd = read(fd[0], buf, 2047)) > 0) + while((rd = read(fd[0], buf, 2048)) > 0) { -/* for ( int i = 0; i < rd; i++ ) - eDebug("%d = %c (%02x)", i, buf[i], buf[i] );*/ buf[rd]=0; /*emit*/ dataAvail(buf); if (!hungup) break; } } + readyErrRead(eSocketNotifier::Priority|eSocketNotifier::Read); /* be sure to flush all data which might be already written */ if (hungup) { eDebug("child has terminated"); @@ -334,9 +335,9 @@ void eConsoleAppContainer::readyErrRead(int what) if (what & (eSocketNotifier::Priority|eSocketNotifier::Read)) { // eDebug("what = %d"); - char buf[2048]; + char buf[2049]; int rd; - while((rd = read(fd[2], buf, 2047)) > 0) + while((rd = read(fd[2], buf, 2048)) > 0) { /* for ( int i = 0; i < rd; i++ ) eDebug("%d = %c (%02x)", i, buf[i], buf[i] );*/ @@ -370,18 +371,17 @@ void eConsoleAppContainer::readyWrite(int what) if (what&eSocketNotifier::Write && outbuf.size() ) { queue_data d = outbuf.front(); - outbuf.pop(); - if ( ::write( fd[1], d.data, d.len ) != d.len ) - { - /* emit */ dataSent(-1); -// eDebug("writeError"); - } + int wr = ::write( fd[1], d.data+d.dataSent, d.len-d.dataSent ); + if (wr < 0) + eDebug("eConsoleAppContainer write failed (%m)"); else + d.dataSent += wr; + if (d.dataSent == d.len) { + outbuf.pop(); + delete [] d.data; /* emit */ dataSent(0); -// eDebug("write ok"); } - delete [] d.data; } if ( !outbuf.size() ) out->stop();