jmc@ptsfa.UUCP (Jerry Carlin) (01/14/86)
On the 3B2 (and maybe other computers), ttyname(3C) has a bug. When you 'shutdown' the system from other than the console, /dev/syscon is linked to the /dev/tty from which you are running shutdown. ttyname() will return /dev/syscon after the system is rebooted if 'syscon' is before the tty in /dev. This is a problem since ttyslot(3C) uses the name returned by ttyname() to find the utmp entry. There will be no utmp entry for /dev/syscon and ttyslot() will return -1 (not 0 as the manual incorrectly states). Since getlogin(3C) uses ttyslot() (which uses ttyname()), it will erroneously return NULL (process not attached to a terminal). This is a classic "for want of a nail the shoe was lost; for want of a shoe the horse was lost...". If you are just looking for the login name, cuserid(3C) works fine as it does not go thru this process. Alternatively, one could either diddle /etc/rc to relink /dev/syscon or you could 'rm' and 'mknod' as necessary to force syscon to come after all the regular tty's in /dev. Or, for those with source, change ttyname.c to check for multiple links and take some sane action (like checking if any of them are in utmp) if such a condition is found. -- voice= 415 823-2441 uucp={ihnp4,dual,qantel}!ptsfa!jmc
jsdy@hadron.UUCP (01/28/86)
The problem, as stated, was that shutdown's ln /dev/________ /dev/syscon put syscon earlier in /dev than the tty that was being linked. To fix this permanently, you must make sure that there are no empty slots in /dev before all the tty names. Here are two ways to do this. To do either, you must first have an idea how many empty slots there are and where they are. If you say 'od -c /dev', you will get output that looks something like: 0000000 \9 \0 . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000020 \2 \0 . . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 \0 \0 r p 2 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 d \2 c o n s o l e \0 \0 \0 \0 \0 \0 \0 0000100 c \2 t t y 0 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 ... The slots that have "\0 \0" in the first two columns are your empty slots. One example is "rp20" above. This gives you how many and where. One thing you could do is to create new device or regular files to fill these empty slots. You could (if you trust yourself) remove device files that are at the end of /dev and re-mknod them, so that they will re-appear at the beginning. Or you could just 'tee x y z <RET><CTL-D>'. This creates empty regular files. Or, if you don't want to create useless files in /dev, but are not sure you want to remove device files (after all, even _I_ make mistakes! [;-)]), you can change the links. Since (presumably) they already have the names you want them to have, you'll have to make an extra link or two as intermediates: ln ttyz8 x # right slot, wrong name ln x y # wrong slot, wrong name rm ttyz8 x ln y ttyz8 # right slot, right name rm y Of course, you will want to do both of these techniques single-user so that you can remove /dev/syscon b e f o r e you do any of this. -- Joe Yao hadron!jsdy@seismo.{CSS.GOV,ARPA,UUCP}