BSD & Sys5 Job Control
ECSC68 S Brown CS
simon at its63b.ed.ac.uk
Thu Feb 5 21:26:56 AEST 1987
In article <164 at myab.UUCP> lars at myab.UUCP (Lars Pensj|) writes:
>
>It is quite possible to make csh use the sxt devices. We have done
>such an implementation, and are now using csh in place of sh.
Strangely enough, I've done the same for sh (and of course am using
it in place of csh :-) ).
>
>Result:
>
>++++ Possibilities to switch between 7 jobs and let them
> run in the background.
Seven because the shell itself is using channel 0 for input/output of
commands - but in that case, there is a little problem with terminal
groups; namely:
The shell can't just keep its old "real" tty as its controlling terminal
because this cannot be accessed (via read(2)) any more once an sxt
cluster has been multiplexed onto it, so the shell will have to take
over sxt channel 0 for its own purposes. The only way of getting a
new terminal as your controller is to do the following:
1. Do a setpgrp().
2. Open a new terminal.
So, you would naturally think that the way to get an sxt chan 0 for your
shell's controller would be to do this:
1. setpgrp();
2. open("/dev/sxt??0",2);
All well and fine - until you try to multiplex the rest of the cluster
onto chan 0 (SXTIOCLINK ioctl) - for this to work, your controlling
terminal must be a "real device" (not an sxt), so you can't put the
setpgrp() there. And if you don't do that, then sxt??0 is not set up
to be your controller.
Ok, next attempt is probably
1. fd=open("/dev/sxt??0",2);
2. ioctl(fd,SXTIOCLINK,...);
3. setpgrp();
4. open("/dev/sxt??0",2);
ie, re-open the chan-0 device. But this falls over because of the
"ownership" problem with sxt's.
[Brief summary:
A standard non-priviliged user will need to be able to open
these sxt devices in read/write mode. But once they have done
so, nobody else had better be able to do so! (for obvious
security reasons). Also, programs such as shl are pretty untidy
about the mess they leave behind them - shl chown()'s the sxt's
to the userid of whoever is using them, but doesn't chown back
to some standard user (root?) afterwards. So, if 16 people logged
in and ran shl and logged out again, then all the sxt devices
will be owned by them and only them - nobody else ('cept root)
has a hope of ever being able to access them again.
(Subsiduary remark:
My solution to this (pretty crappy, I know), is to have a setuid
service-program which "allocates" sxt's by chowning them to the
real-uid of the caller. The job-control shell will then access
an sxt device cluster by doing
a) execute this "sxt-allocator".
b) go through all the sxt's, trying to open each cluster's
channel-0. If the open succeeds, then you've got one.
It it fails with errno==EBUSY then keep on trying.
If it fails with errno anything else, then give up and
that particular instance of the shell can't have any
job-control.
c) multiplex the subchannels.
d) set chan-0 to exclusive-use (TIOCEXCL ioctl) to stop
anyone else from stealing it from under you.
e) ......
Another advantage of this is that the setuid allocator can
then modify utmp (you can't, 'cos you aren't root). If the
shell calls the allocator again (when its finished being a
shell), then utmp can be changed back again - its all pretty
transparent.
)
]
Or perhaps its not, actually. I'll have to think about this again :-)
Anyway to get back to the original argument... you could fix this
by making channel-1 the controlling terminal - but then you can only
have 6 remaining subchannels, which isn't too many..
>
>- Csh doesn't modify tty name in wtmp. We "hacked" getlogin() to
> do it another way, and relinking all programs using it.
You'd also have to "hack" all the functions in the getut(3) family.
>
>- Csh have problems handling type ahead, because typed characters
> are associated to the sxt device attached to the current
> process. When the process exits, csh has to read them back from
> this device.
That's ptetty straightforward - it means that anything typed while a
process is getting 'round to dying off can be picked up by the shell
and read as part of the next command - but you can't type further input
and expect it to get picked up by the next command, 'cos it won't be:
Example:
$ ex filename # edit (or whatever) something)
:q # quit
mail fred # while its dying, start typing next command
hello # ... and type some data as input?
hi fred, this is mail.....
^D
$ # shell-prompt, then it executes "mail"
Subject: # ... huh? why is it waiting? I thought
# ... I'd given it some input, it seems
# ... to have forgotten that!
^D
$ hello: not found # oh look! it stored up what I typed in
$ hi: not found # the _shell_'s input buffer!
Of course, if SysV provided a TIOCSTI ioctl call like BSD does, then this
could be fixed by the shell's sticking the extra characters into the
input queue of whatever sxt device is running next :-)
>
>- A process can not know whether it is blocked or not.
Well...., if the sxt controller channel (chan 0) were left open, then
processes could do a SXTIOCSTAT ioctl on it and look for themselves.
But this would be gross. :-)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Simon Brown
Department of Computer Science, University of Edinburgh, Scotland, UK.
UUCP: ...!decvax!seismo!mcvax!ukc!{cstvax,its63b}!simon
JANET: simon at uk.ac.ed.{cstvax,its63b}
More information about the Comp.unix.questions
mailing list