From 91f7988cf3a2d50c5ae232d0e6cfe590837e0414 Mon Sep 17 00:00:00 2001 From: Jon Trulson Date: Mon, 18 Jun 2012 16:01:17 -0600 Subject: [PATCH] dtterm: fixes so job control will work. --- cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c | 40 ++++++++++++++++++- cde/lib/DtTerm/TermPrim/TermPrimSubproc.c | 13 ++++-- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c b/cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c index e6e3eedb..820c62e0 100644 --- a/cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c +++ b/cde/lib/DtTerm/TermPrim/TermPrimGetPty-svr4.c @@ -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) { diff --git a/cde/lib/DtTerm/TermPrim/TermPrimSubproc.c b/cde/lib/DtTerm/TermPrim/TermPrimSubproc.c index 73ce82a3..b1d706c7 100644 --- a/cde/lib/DtTerm/TermPrim/TermPrimSubproc.c +++ b/cde/lib/DtTerm/TermPrim/TermPrimSubproc.c @@ -38,7 +38,7 @@ static char rcs_id[] = "$TOG: TermPrimSubproc.c /main/11 1998/04/20 12:45:57 mgr #include "TermHeader.h" #include -#ifdef ALPHA_ARCHITECTURE +#if defined(ALPHA_ARCHITECTURE) || defined(CSRG_ARCHITECTURE) || defined(LINUX_ARCHITECTURE) /* For TIOCSTTY definitions */ #include #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); -- 2.25.1