xsimon@its63b.UUCP (06/09/87)
There would seem to be a rather serious flaw in the System V setpgrp()
system call (for disassociating oneself from a terminal and setting oneself
up as a process-group header). Setpgrp is pretty much like:
setpgrp()
{
...
if (p->p_pid != p->p_pgrp)
u.u_ttyp = NULL;
p->p_pgrp = p->p_pid;
}
The problem occurs when you try to grab yourself a new terminal with open().
In openi(), it sees if what you are opening is a character-special, and if
so uses its open routine (and sets the indirect tty to be this, if you don't
have a tty already):
openi(...)
{
...
case IFCHR:
...
if (u.u_ttyp == NULL) u.u_ttyd = dev;
(*cswdev[major(dev).open)(...);
...
...
}
And of course, in ttopen (and also sxtopen, for opening an SXT device):
if ( p->p_pid == p->p_pgrp
&& u.u_ttyp == NULL
&& tp->t_pgrp == 0 ) {
u.u_ttyp = &tp->t_pgrp;
tp->t_pgrp = u.u_procp->p_pgrp;
}
So, the acquiring of a new controlling terminal (with u.u_ttyp and u.u_ttyd)
only occurs when opening a new device (which isn't already somebody else's
controlling tty), when you are a process-group header (ie, pid==pgrp), and
when your u.u_ttyp is NULL.
********** THE COMPLAINT ... ***********
BUT... setpgrp() only sets u.u_ttyp to be NULL if pid!=pgrp (ie, you weren't
already a process-group leader)! This means that any process that is a
process group leader already (such as a login-shell) CANNOT change its
controlling terminal. WHY SHOULD THIS BE?
****************************************
(I came across this problem when I wanted to change the controlling terminal
of a login-shell to be an SXT device, so that job-control would work).
Any suggestions why setpgrp() is done this way? Is it a bug, or is it actually
necessary? Somebody must have deliberately decided to make the test for
"if (p->p_pid != p->p_pgrp) ..." in setpgrp(), so it would seem a strange
sort of bug to creep in unnoticed!
--
----------------------------------
| Simon Brown | UUCP: seismo!mcvax!ukc!{its63b,cstvax}!simon
| Department of Computer Science | JANET: simon@uk.ac.ed.{its63b,cstvax}
| University of Edinburgh, | ARPA: simon%{its63b,cstvax}.ed.ac.uk ...
| Scotland, UK. | @cs.ucl.ac.uk
---------------------------------- "Life's like that, you know"