1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 19:52:20 +00:00

dtterm: fixes so job control will work.

This commit is contained in:
Jon Trulson 2012-06-18 16:01:17 -06:00
parent 62b669a6af
commit 91f7988cf3
2 changed files with 48 additions and 5 deletions

View 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)
{

View 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);