diff options
Diffstat (limited to 'x11/kdebase3/files/patch-konsole-konsole-TEPty.cpp')
-rw-r--r-- | x11/kdebase3/files/patch-konsole-konsole-TEPty.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/x11/kdebase3/files/patch-konsole-konsole-TEPty.cpp b/x11/kdebase3/files/patch-konsole-konsole-TEPty.cpp new file mode 100644 index 000000000000..44642dc8aebc --- /dev/null +++ b/x11/kdebase3/files/patch-konsole-konsole-TEPty.cpp @@ -0,0 +1,172 @@ +--- konsole/konsole/TEPty.cpp 22 Nov 2002 13:17:57 -0000 1.75 ++++ konsole/konsole/TEPty.cpp 24 Aug 2003 21:44:00 -0000 +@@ -65,6 +65,9 @@ + #include <config.h> + #endif + ++// Get the Q_OS_* defines ++#include <qglobal.h> ++ + #ifdef __sgi + #define __svr4__ + #endif +@@ -88,6 +91,10 @@ + #include <sys/types.h> + #endif + ++#ifdef Q_OS_FREEBSD ++#include <sys/param.h> ++#endif ++ + #include <stdlib.h> + #include <stdio.h> + +@@ -198,9 +205,30 @@ public: + + FILE* syslog_file = NULL; //stdout; + +-#define PTY_FILENO 3 ++#define DEFAULT_PTY_FILENO 3 ++int PTY_FILENO = -1; // None allocated yet. ++ + #define BASE_CHOWN "konsole_grantpty" + ++void TEPtyInit() ++{ ++/* ++** FreeBSD can't dup2(fd,3) because fd 3 is already in use by ++** some weird pipe. So instead, we get a new throwaway fd ++** that's not in use by anyone. ++*/ ++#ifdef Q_OS_FREEBSD ++ PTY_FILENO = open("/dev/null",O_RDWR); ++ if (PTY_FILENO == -1) { ++ perror("konsole:open PTY"); ++ /* This won't work either, but hey .. */ ++ PTY_FILENO = DEFAULT_PTY_FILENO; ++ } ++#else ++ PTY_FILENO = DEFAULT_PTY_FILENO; ++#endif ++} ++ + int chownpty(int fd, bool grant) + // param fd: the fd of a master pty. + // param grant: true to grant, false to revoke +@@ -212,6 +240,8 @@ int chownpty(int fd, bool grant) + newsa.sa_flags = 0; + sigaction(SIGCHLD, &newsa, &oldsa); + ++ if (PTY_FILENO == -1) TEPtyInit(); ++ + pid_t pid = fork(); + if (pid < 0) + { +@@ -225,7 +255,12 @@ int chownpty(int fd, bool grant) + /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */ + if (fd != PTY_FILENO && dup2(fd, PTY_FILENO) < 0) exit(1); + QString path = locate("exe", BASE_CHOWN); +- execle(path.ascii(), BASE_CHOWN, grant?"--grant":"--revoke", NULL, NULL); ++ /* ++ ** Because konsole_grantpty now can't expect the fd ++ ** to be constant, we need an additional parameter. ++ */ ++ QString fdnumber = QString::number(PTY_FILENO); ++ execle(path.ascii(), BASE_CHOWN, grant?"--grant":"--revoke", fdnumber.ascii(), NULL, NULL); + exit(1); // should not be reached + } + +@@ -486,6 +521,16 @@ int TEPty::makePty(bool _addutmp) + // open and set all standard files to slave tty + int tt = m_SlaveFd; // Already opened? + ++#ifdef Q_OS_FREEBSD ++ /* ++ ** It seems to be possible for SlaveFd to be closed in error ++ ** somewhere along the line. So check it for "liveness". ++ */ ++ struct stat sb; ++ if (fstat(tt,&sb)!=0) ++ tt=-1; // Apparently not alive. ++#endif ++ + if (tt < 0) + tt = open(ttynam, O_RDWR); + +@@ -524,14 +569,57 @@ int TEPty::makePty(bool _addutmp) + } + strncpy(l_struct.ut_name, str_ptr, UT_NAMESIZE); + ++#ifdef Q_OS_FREEBSD ++ /* FreeBSD until august 22, 2003 returned ENOMEM for too-long ++ ** hostnames. Then sanity prevailed (?) and the error was changed ++ ** to NAMETOOLONG, but this breaks konsole .. again. ++ ** ++ ** Instead of bailing out with long hostnames, put in partial ++ ** hostnames (the first UT_HOSTSIZE characters) instead. ++ */ ++ char hostnamebuffer[MAXHOSTNAMELEN+1]; ++ memset(hostnamebuffer,0,MAXHOSTNAMELEN+1); ++ if (gethostname(hostnamebuffer, MAXHOSTNAMELEN) == -1) ++ { ++ if ( (errno==ENOMEM) || (errno==ENAMETOOLONG) ) { ++ /* ignore it, but very odd */ ++ } ++ else { ++ /* Not much chance of this being visible anywhere ... */ ++ perror("konsole:gethostname"); ++ abort(); ++ } ++ } ++ /* Copy hostname, possibly only partially */ ++ memset(l_struct.ut_host,0,UT_HOSTSIZE); ++ strncpy(l_struct.ut_host,hostnamebuffer,UT_HOSTSIZE); ++ l_struct.ut_host[UT_HOSTSIZE]=0; ++#else ++ /* Non-FreeBSD systems */ + if (gethostname(l_struct.ut_host, UT_HOSTSIZE) == -1) { +- if (errno != ENOMEM) ++ if (errno != ENOMEM) + abort(); + l_struct.ut_host[UT_HOSTSIZE]=0; + } ++#endif + + if (! (str_ptr=ttyname(tt)) ) { ++#ifdef Q_OS_FREEBSD ++ /* ++ ** In FreeBSD, the ttyname() call always returns NULL ++ ** for the kinds of devices (ptys) we have opened, ++ ** so don't abort, use a foolish default value instead. ++ ** The call to login() probably won't work _anyway_, ++ ** since normally users can't update the wtmp file. ++ ** ++ ** If we were real sticklers for accuracy, we'd copy the ++ ** code from konsole_grantpty that does it's darndest to ++ ** file out the right tty name. ++ */ ++ str_ptr = const_cast<char *>("/dev/konsole"); ++#else + abort(); ++#endif + } + if (strncmp(str_ptr, "/dev/", 5) == 0) + str_ptr += 5; +@@ -607,7 +695,7 @@ void TEPty::startPgm(const char* pgm, QV + // #define CERASE 0177 + // #endif + +-#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) ++#if defined (Q_OS_FREEBSD) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) + ioctl(0,TIOCGETA,(char *)&ttmode); + #else + # if defined (_HPUX_SOURCE) || defined(__Lynx__) +@@ -621,7 +709,7 @@ void TEPty::startPgm(const char* pgm, QV + ttmode.c_cc[VINTR] = CTRL('C'); + ttmode.c_cc[VQUIT] = CTRL('\\'); + ttmode.c_cc[VERASE] = 0177; +-#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) ++#if defined (Q_OS_FREEBSD) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) + ioctl(0,TIOCSETA,(char *)&ttmode); + #else + # ifdef _HPUX_SOURCE
\ No newline at end of file |