diff options
Diffstat (limited to 'src/libs/installer/adminauthorization_x11.cpp')
-rw-r--r-- | src/libs/installer/adminauthorization_x11.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libs/installer/adminauthorization_x11.cpp b/src/libs/installer/adminauthorization_x11.cpp index 97c6093ae..20eacf1cc 100644 --- a/src/libs/installer/adminauthorization_x11.cpp +++ b/src/libs/installer/adminauthorization_x11.cpp @@ -55,6 +55,7 @@ #include <sys/ioctl.h> #include <sys/types.h> #include <sys/wait.h> +#include <errno.h> #include <iostream> @@ -130,10 +131,14 @@ bool AdminAuthorization::execute(QWidget *parent, const QString &program, const if (pipe(pipedData) != 0) return false; - int flags = ::fcntl(pipedData[0], F_GETFD); + int flags = ::fcntl(pipedData[0], F_GETFL); if (flags != -1) ::fcntl(pipedData[0], F_SETFL, flags | O_NONBLOCK); + flags = ::fcntl(masterFD, F_GETFL); + if (flags != -1) + ::fcntl(masterFD, F_SETFL, flags | O_NONBLOCK); + pid_t child = fork(); if (child < -1) { @@ -151,8 +156,8 @@ bool AdminAuthorization::execute(QWidget *parent, const QString &program, const ::close(pipedData[1]); QRegExp re(QLatin1String("[Pp]assword.*:")); + QByteArray data; QByteArray errData; - flags = ::fcntl(masterFD, F_GETFD); int bytes = 0; int errBytes = 0; char buf[1024]; @@ -162,14 +167,18 @@ bool AdminAuthorization::execute(QWidget *parent, const QString &program, const if (::waitpid(child, &state, WNOHANG) == -1) break; bytes = ::read(masterFD, buf, 1023); + if (bytes == -1 && errno == EAGAIN) + bytes = 0; + else if (bytes > 0) + data.append(buf, bytes); errBytes = ::read(pipedData[0], errBuf, 1023); if (errBytes > 0) { - errData.append(buf, errBytes); + errData.append(errBuf, errBytes); errBytes=0; } if (bytes > 0) { - const QString line = QString::fromLatin1(buf, bytes); + const QString line = QString::fromLatin1(data); if (re.indexIn(line) != -1) { const QString password = getPassword(parent); if (password.isEmpty()) { |