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 }