ports/x11/kde4-workspace/files/patch-konsole-konsole-TEPty.cpp
Michael Nottebrock 9683be5fc3 Multiple bugfixes and enhancements for kdebase.
- Add patches for konsole which enable konsole_grantpty to
          properly change permissions on ttys and fix a bug which causes
          konsole to crash on recent builds of -CURRENT.

        - Add a patch for configure that fixes fontconfig detection.

        - Add a patch submitted by Kaarthik Sivakumar <kaarthik@comcast.net>
          which fixes the bug described in PR ports/48334.

        - Add a pkg-message that notifies users about the fonts this port
          installs.

        - Use the USE_OPENLDAP macro.

PR:             ports/48334
Approved by:	arved (Mentor)
2003-08-28 19:39:01 +00:00

172 lines
No EOL
5.3 KiB
C++

--- 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