On Mon, Feb 21, 2011 at 04:51:41AM +0100, Guillem Jover wrote:
> found 614049 1.1-2
> notfound 614049 1.0-1
...
> Anyway, the problem here is that init
> starts the agettys from inittab and ngetty starts itself too from the
> new init script. And both gettys fight for the terminal. This will
> happen if one has not deactivated the gettys entries in inittab, it
> might also happen if one has configured inittab to start the ngetty
> helper.
>
> The correct solution here is to remove the init script, and the users
> should change the inittab themselves. This also agrees with the sance
> from the sysvinit maintainer in #613618.
Right! The problem is how to find which ttys are unused. If X-server
or agetty opens /dev/tty1 we should not start ngetty on tty1. I wrote
a simple program which find all free ttys. If this solves the problem
in next release of ngetty I'll include it in the package. Maybe the
name lsfreevt is better ;) Start for example:
tryvt 12
to see which tty <= 12 are free (not in use).
You must start it as root or make it SUID.
How do you find the idea:
ngetty -5
It finds the first 5 free consoles and open them. They could
be for example: 2 5 6 7 9. X-server opens the first free tty.
/nv
----------- tryvt.c ------------
/*
[diet -Os] gcc -Wall -W -o tryvt tryvt.c
usage: tryvt [number]
only first two digits of number are important!
*/
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
int main(int argc, char **argv) {
int vtno, fd, max_consoles;
char tty[12] = "/dev/tty0", *x = tty + 8;
max_consoles = MAX_NR_CONSOLES;
if (argc > 1) {
unsigned char ch;
max_consoles = 0;
if ((ch = argv[1][0] - '0') < 10) max_consoles = ch;
if ((ch = argv[1][1] - '0') < 10) max_consoles = max_consoles*10 + ch;
}
fd = open(tty, O_RDWR, 0);
if (fd < 0) return -1;
do {
char *y = x;
if (ioctl(fd, VT_OPENQRY, &vtno) || vtno > max_consoles) break;
if (vtno >= 10) *y++ = '0' + vtno/10;
*y++ = '0' + vtno%10;
*y++ = ' ';
write(1, x, y-x);
y[-1] = 0;
if (open(tty, O_RDWR | O_NOCTTY) < 0) break;
} while (1);
write(1,"\n",1);
return 0;
}
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]