kpty: prevent to open pseudo ttys twice for openpty(3) platforms

Signed-off-by: OBATA Akio <obache@wizdas.com>
(cherry picked from commit 8f7371cddf)
r14.0.x
OBATA Akio 4 years ago committed by Slávek Banko
parent bde317d2cd
commit ad371ca0b5
No known key found for this signature in database
GPG Key ID: 608F5293A04BE668

@ -217,20 +217,25 @@ bool KPty::setPty(int pty_master)
bool KPty::_attachPty(int pty_master)
{
TQCString ptyName;
if (d->slaveFd < 0 ) {
kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl;
#if defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT)
#if defined(HAVE_PTSNAME)
char *ptsn = ptsname(d->masterFd);
if (ptsn) {
grantpt(d->masterFd);
d->ttyName = ptsn;
} else {
::close(d->masterFd);
d->masterFd = -1;
return false;
}
#endif
#if defined(HAVE_GRANTPT)
if (grantpt(d->masterFd)) {
return false;
}
#else
struct stat st;
if (stat(d->ttyName.data(), &st))
return false; // this just cannot happen ... *cough* Yeah right, I just
@ -241,9 +246,10 @@ bool KPty::_attachPty(int pty_master)
!chownpty(true))
{
kdWarning(175)
<< "KPty::_attachPty(): " << "chownpty failed for device " << ptyName << "::" << d->ttyName << endl
<< "KPty::_attachPty(): " << "chownpty failed for device " << d->ttyName << endl
<< "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl;
}
#endif
#ifdef BSD
revoke(d->ttyName.data());
@ -261,6 +267,11 @@ bool KPty::_attachPty(int pty_master)
d->masterFd = -1;
return false;
}
#ifdef HAVE_OPENPTY
// set screen size
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
#endif
}
#if (defined(__svr4__) || defined(__sgi__))
// Solaris
@ -294,8 +305,10 @@ bool KPty::_attachPty(int pty_master)
_tcsetattr(d->slaveFd, &ttmode);
#ifndef HAVE_OPENPTY
// set screen size
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
#endif
fcntl(d->masterFd, F_SETFD, FD_CLOEXEC);
fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC);

Loading…
Cancel
Save