|
|
@ -217,49 +217,60 @@ bool KPty::setPty(int pty_master)
|
|
|
|
|
|
|
|
|
|
|
|
bool KPty::_attachPty(int pty_master)
|
|
|
|
bool KPty::_attachPty(int pty_master)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
TQCString ptyName;
|
|
|
|
if (d->slaveFd < 0 ) {
|
|
|
|
|
|
|
|
|
|
|
|
kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl;
|
|
|
|
kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl;
|
|
|
|
#if defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT)
|
|
|
|
#if defined(HAVE_PTSNAME)
|
|
|
|
char *ptsn = ptsname(d->masterFd);
|
|
|
|
char *ptsn = ptsname(d->masterFd);
|
|
|
|
if (ptsn) {
|
|
|
|
if (ptsn) {
|
|
|
|
grantpt(d->masterFd);
|
|
|
|
|
|
|
|
d->ttyName = ptsn;
|
|
|
|
d->ttyName = ptsn;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
::close(d->masterFd);
|
|
|
|
::close(d->masterFd);
|
|
|
|
d->masterFd = -1;
|
|
|
|
d->masterFd = -1;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
struct stat st;
|
|
|
|
#if defined(HAVE_GRANTPT)
|
|
|
|
if (stat(d->ttyName.data(), &st))
|
|
|
|
if (grantpt(d->masterFd)) {
|
|
|
|
return false; // this just cannot happen ... *cough* Yeah right, I just
|
|
|
|
return false;
|
|
|
|
// had it happen when pty #349 was allocated. I guess
|
|
|
|
}
|
|
|
|
// there was some sort of leak? I only had a few open.
|
|
|
|
#else
|
|
|
|
if (((st.st_uid != getuid()) ||
|
|
|
|
struct stat st;
|
|
|
|
(st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) &&
|
|
|
|
if (stat(d->ttyName.data(), &st))
|
|
|
|
!chownpty(true))
|
|
|
|
return false; // this just cannot happen ... *cough* Yeah right, I just
|
|
|
|
{
|
|
|
|
// had it happen when pty #349 was allocated. I guess
|
|
|
|
kdWarning(175)
|
|
|
|
// there was some sort of leak? I only had a few open.
|
|
|
|
<< "KPty::_attachPty(): " << "chownpty failed for device " << ptyName << "::" << d->ttyName << endl
|
|
|
|
if (((st.st_uid != getuid()) ||
|
|
|
|
<< "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl;
|
|
|
|
(st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) &&
|
|
|
|
}
|
|
|
|
!chownpty(true))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
kdWarning(175)
|
|
|
|
|
|
|
|
<< "KPty::_attachPty(): " << "chownpty failed for device " << d->ttyName << endl
|
|
|
|
|
|
|
|
<< "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef BSD
|
|
|
|
#ifdef BSD
|
|
|
|
revoke(d->ttyName.data());
|
|
|
|
revoke(d->ttyName.data());
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_UNLOCKPT
|
|
|
|
#ifdef HAVE_UNLOCKPT
|
|
|
|
unlockpt(d->masterFd);
|
|
|
|
unlockpt(d->masterFd);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY);
|
|
|
|
d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY);
|
|
|
|
if (d->slaveFd < 0)
|
|
|
|
if (d->slaveFd < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl;
|
|
|
|
kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl;
|
|
|
|
::close(d->masterFd);
|
|
|
|
::close(d->masterFd);
|
|
|
|
d->masterFd = -1;
|
|
|
|
d->masterFd = -1;
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef HAVE_OPENPTY
|
|
|
|
|
|
|
|
// set screen size
|
|
|
|
|
|
|
|
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if (defined(__svr4__) || defined(__sgi__))
|
|
|
|
#if (defined(__svr4__) || defined(__sgi__))
|
|
|
@ -294,8 +305,10 @@ bool KPty::_attachPty(int pty_master)
|
|
|
|
|
|
|
|
|
|
|
|
_tcsetattr(d->slaveFd, &ttmode);
|
|
|
|
_tcsetattr(d->slaveFd, &ttmode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HAVE_OPENPTY
|
|
|
|
// set screen size
|
|
|
|
// set screen size
|
|
|
|
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
|
|
|
|
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
fcntl(d->masterFd, F_SETFD, FD_CLOEXEC);
|
|
|
|
fcntl(d->masterFd, F_SETFD, FD_CLOEXEC);
|
|
|
|
fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC);
|
|
|
|
fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC);
|
|
|
|