# HG changeset patch # User Chris Cannam # Date 1290420195 0 # Node ID 07405f3a428b4221e30d001241b7c303b6ebe9d9 # Parent b522aaa2c053507e3140b314dbdc5944136d6937 * Use fork/setsid/fork to escape our controlling terminal, to ensure the pty we create is used for password requests diff -r b522aaa2c053 -r 07405f3a428b common.cpp --- a/common.cpp Sat Nov 20 11:40:19 2010 +0000 +++ b/common.cpp Mon Nov 22 10:03:15 2010 +0000 @@ -30,7 +30,9 @@ #include #include #else +#include #include +#include #endif QString findExecutable(QString name) @@ -143,3 +145,35 @@ #endif #endif +void loseControllingTerminal() +{ +#ifndef Q_OS_WIN32 + pid_t sid; + switch (fork()) { + case 0: + sid = setsid(); + if (sid != (pid_t)-1) { + DEBUG << "setsid() succeeded, session ID is " << sid << endl; + } else { + perror("setsid failed"); + DEBUG << "setsid() failed (errno = " << errno << ")" << endl; + } + switch (fork()) { + case 0: + return; + case -1: + perror("fork failed"); + DEBUG << "second fork failed (errno = " << errno << ")" << endl; + return; + default: + exit(0); + } + case -1: + perror("fork failed"); + DEBUG << "fork failed (errno = " << errno << ")" << endl; + return; + default: + exit(0); + } +#endif +} diff -r b522aaa2c053 -r 07405f3a428b common.h --- a/common.h Sat Nov 20 11:40:19 2010 +0000 +++ b/common.h Mon Nov 22 10:03:15 2010 +0000 @@ -48,6 +48,8 @@ extern QString getUserRealName(); +extern void loseControllingTerminal(); + #endif //COMMON_H diff -r b522aaa2c053 -r 07405f3a428b main.cpp --- a/main.cpp Sat Nov 20 11:40:19 2010 +0000 +++ b/main.cpp Mon Nov 22 10:03:15 2010 +0000 @@ -18,6 +18,8 @@ #include #include "mainwindow.h" +#include "common.h" +#include "debug.h" int main(int argc, char *argv[]) { @@ -25,6 +27,10 @@ QApplication::setOrganizationDomain("easymercurial.org"); QApplication::setApplicationName(QApplication::tr("EasyMercurial")); + // Lose our controlling terminal (so we can provide a new pty to + // capture password requests) + loseControllingTerminal(); + QApplication app(argc, argv); MainWindow mainWin; mainWin.show();