dtterm: fixes so job control will work.
authorJon Trulson <jon@radscan.com>
Mon, 18 Jun 2012 22:01:17 +0000 (16:01 -0600)
committerJon Trulson <jon@radscan.com>
Mon, 18 Jun 2012 22:01:17 +0000 (16:01 -0600)
cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c
cde/lib/DtTerm/TermPrim/TermPrimSubproc.c

index e6e3eedb48978f7503861c441695300b61060a60..820c62e03d1371740d084854138e457e99f32073 100644 (file)
@@ -67,7 +67,7 @@ static char rcs_id[] = "$XConsortium: TermPrimGetPty-svr4.c /main/1 1996/04/21 1
 #endif /* PTY_CLONE_DEVICE */
 
 
-int _DtTermPrimGetPty(char **ptySlave, char **ptyMaster)
+static int GetPty(char **ptySlave, char **ptyMaster)
 {
     char *c;
     int ptyFd;
@@ -233,8 +233,26 @@ ok:
     return(-1);
 }
 
+/* this is a public wrapper around the previous function that runs the          
+ * previous function setuid root...                                             
+ */
 int
-_DtTermPrimSetupPty(char *ptySlave, int ptyFd)
+_DtTermPrimGetPty(char **ptySlave, char **ptyMaster)
+{
+  int retValue;
+
+  /* this function needs to be suid root... */
+  (void) _DtTermPrimToggleSuidRoot(True);
+  retValue = GetPty(ptySlave, ptyMaster);
+  /* we now need to turn off setuid root... */
+  (void) _DtTermPrimToggleSuidRoot(False);
+
+  return(retValue);
+}
+
+
+static int
+SetupPty(char *ptySlave, int ptyFd)
 {
     /*
      * The following "pushes" were done at GetPty time, but
@@ -262,12 +280,30 @@ _DtTermPrimSetupPty(char *ptySlave, int ptyFd)
     }
 #endif /* USE_STREAMS_TTCOMPAT */
 
+#else /* linux */
+
+    chown(ptySlave, getuid(), getgid());
+    chmod(ptySlave, 0622);
 #endif /* linux */
 
     /* success... */
     return(0);
 }
 
+int
+_DtTermPrimSetupPty(char *ptySlave, int ptyFd)
+{
+  int retValue;
+
+  /* this function needs to be suid root... */
+  (void) _DtTermPrimToggleSuidRoot(True);
+  retValue = SetupPty(ptySlave, ptyFd);
+  /* we now need to turn off setuid root... */
+  (void) _DtTermPrimToggleSuidRoot(False);
+
+  return(retValue);
+}
+
 void
 _DtTermPrimReleasePty(char *ptySlave)
 {
index 73ce82a3dd6c571bd349772ec9ecc1a97384cd0a..b1d706c74c60668a9267902003dd6de139f19dc8 100644 (file)
@@ -38,7 +38,7 @@ static char rcs_id[] = "$TOG: TermPrimSubproc.c /main/11 1998/04/20 12:45:57 mgr
 
 #include "TermHeader.h"
 #include <fcntl.h>
-#ifdef  ALPHA_ARCHITECTURE
+#if defined(ALPHA_ARCHITECTURE) || defined(CSRG_ARCHITECTURE) || defined(LINUX_ARCHITECTURE)
 /* For TIOCSTTY definitions */
 #include <sys/ioctl.h>
 #endif /* ALPHA_ARCHITECTURE */
@@ -461,7 +461,7 @@ _DtTermPrimSubprocExec(Widget                 w,
        /* child...
         */
         _DtTermProcessUnlock();
-#ifdef  ALPHA_ARCHITECTURE
+#if defined(ALPHA_ARCHITECTURE) || defined(CSRG_ARCHITECTURE) || defined(LINUX_ARCHITECTURE)
         /* establish a new session for child */
         setsid();
 #else
@@ -469,6 +469,11 @@ _DtTermPrimSubprocExec(Widget                w,
        (void) setpgrp();
 #endif /* ALPHA_ARCHITECTURE */
 
+#if defined(LINUX_ARCHITECTURE)
+       /* set the ownership and mode of the pty... */
+       (void) _DtTermPrimSetupPty(ptyName, pty);
+#endif
+
        /* open the pty slave as our controlling terminal... */
        pty = open(ptyName, O_RDWR, 0);
 
@@ -477,7 +482,7 @@ _DtTermPrimSubprocExec(Widget                 w,
            (void) _exit(1);
        }
 
-#ifdef  ALPHA_ARCHITECTURE
+#if defined(ALPHA_ARCHITECTURE) || defined(CSRG_ARCHITECTURE) || defined(LINUX_ARCHITECTURE)
         /* BSD needs to do this to acquire pty as controlling terminal */
         if (ioctl(pty, TIOCSCTTY, (char *)NULL) < 0) {
            (void) close(pty);
@@ -490,8 +495,10 @@ _DtTermPrimSubprocExec(Widget                w,
         _DtTermPrimPtyGetDefaultModes();
 #endif /* ALPHA_ARCHITECTURE */
 
+#if !defined(LINUX_ARCHITECTURE)
        /* set the ownership and mode of the pty... */
        (void) _DtTermPrimSetupPty(ptyName, pty);
+#endif /* LINUX_ARCHITECTURE */
 
        /* apply the ttyModes... */
        _DtTermPrimPtyInit(pty, tw->term.ttyModes, tw->term.csWidth);