diff --git a/Makefile b/Makefile index eaec230..766c686 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ LIB = \ util/tty.o SRC = \ + chvt.c \ df.c \ dmesg.c \ halt.c \ diff --git a/chvt.1 b/chvt.1 new file mode 100644 index 0000000..d3bf63a --- /dev/null +++ b/chvt.1 @@ -0,0 +1,10 @@ +.TH CHVT 1 ubase\-VERSION +.SH NAME +chvt \- change foreground virtual terminal +.SH SYNOPSIS +.B chvt +.I N +.SH DESCRIPTION +.B chvt +brings /dev/ttyN to the foreground. This has the +same effect as Ctrl-Alt-FN. diff --git a/chvt.c b/chvt.c new file mode 100644 index 0000000..6df7a91 --- /dev/null +++ b/chvt.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +char *vts[] = { + "/proc/self/fd/0", + "/dev/console", + "/dev/tty", + "/dev/tty0", +}; + +static void +usage(void) +{ + eprintf("usage: chvt N\n"); +} + +int +main(int argc, char **argv) +{ + int n, i, fd; + char c; + + if(argc!=2 || strspn(argv[1], "1234567890") != strlen(argv[1])) + usage(); + + n = atoi(argv[1]); + for(i = 0; i < LEN(vts); i++) { + fd = open(vts[i], O_RDONLY); + if(fd < 1) + continue; + c = 0; + if(ioctl(fd, KDGKBTYPE, &c) == 0) + goto VTfound; + close(fd); + } + + eprintf("chvt: couldn't find a console.\n"); +VTfound: + if(ioctl(fd, VT_ACTIVATE, n) == -1) + eprintf("chvt: VT_ACTIVATE '%d':", n); + if(ioctl(fd, VT_WAITACTIVE, n) == -1) + eprintf("chvt: VT_WAITACTIVE '%d':", n); + close(fd); + + return 0; +} +