chvt.c - ubase - suckless linux base utils
(HTM) git clone git://git.suckless.org/ubase
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
chvt.c (1170B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <sys/ioctl.h>
3 #include <sys/types.h>
4
5 #include <fcntl.h>
6 #include <limits.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <unistd.h>
10
11 #include "util.h"
12
13 #define KDGKBTYPE 0x4B33 /* get keyboard type */
14
15 #define VT_ACTIVATE 0x5606 /* make vt active */
16 #define VT_WAITACTIVE 0x5607 /* wait for vt active */
17
18 static char *vt[] = {
19 "/proc/self/fd/0",
20 "/dev/console",
21 "/dev/tty",
22 "/dev/tty0",
23 };
24
25 static void
26 usage(void)
27 {
28 eprintf("usage: %s num\n", argv0);
29 }
30
31 int
32 main(int argc, char *argv[])
33 {
34 unsigned int n, i;
35 int fd;
36 char c;
37
38 ARGBEGIN {
39 default:
40 usage();
41 } ARGEND;
42
43 if (argc != 1)
44 usage();
45
46 n = estrtonum(argv[0], 0, UINT_MAX);
47 for (i = 0; i < LEN(vt); i++) {
48 if ((fd = open(vt[i], O_RDONLY)) < 0)
49 continue;
50 c = 0;
51 if (ioctl(fd, KDGKBTYPE, &c) == 0)
52 goto found;
53 if (close(fd) < 0)
54 eprintf("close %s:", vt[i]);
55 }
56 eprintf("no console found\n");
57
58 found:
59 if (ioctl(fd, VT_ACTIVATE, n) == -1)
60 eprintf("VT_ACTIVATE %u:", n);
61 if (ioctl(fd, VT_WAITACTIVE, n) == -1)
62 eprintf("VT_WAITACTIVE %u:", n);
63 if (close(fd) < 0)
64 eprintf("close %s:", vt[i]);
65
66 return 0;
67 }