1
2
3
4
5
6
7
8
9
10
11#include "libbb.h"
12
13
14enum { KDGKBTYPE = 0x4B33 };
15
16static int open_a_console(const char *fnam)
17{
18 int fd;
19
20
21 fd = open(fnam, O_RDWR);
22
23
24 if (fd < 0 && errno == EACCES)
25 fd = open(fnam, O_RDONLY);
26
27
28 if (fd < 0 && errno == EACCES)
29 fd = open(fnam, O_WRONLY);
30
31 return fd;
32}
33
34
35
36
37
38
39int FAST_FUNC get_console_fd_or_die(void)
40{
41 static const char *const console_names[] = {
42 DEV_CONSOLE, CURRENT_VC, CURRENT_TTY
43 };
44
45 int fd;
46
47 for (fd = 2; fd >= 0; fd--) {
48 int fd4name;
49 int choice_fd;
50 char arg;
51
52 fd4name = open_a_console(console_names[fd]);
53 chk_std:
54 choice_fd = (fd4name >= 0 ? fd4name : fd);
55
56 arg = 0;
57 if (ioctl(choice_fd, KDGKBTYPE, &arg) == 0)
58 return choice_fd;
59 if (fd4name >= 0) {
60 close(fd4name);
61 fd4name = -1;
62 goto chk_std;
63 }
64 }
65
66 bb_error_msg_and_die("can't open console");
67
68}
69
70
71enum {
72 VT_ACTIVATE = 0x5606,
73 VT_WAITACTIVE = 0x5607
74};
75
76void FAST_FUNC console_make_active(int fd, const int vt_num)
77{
78 xioctl(fd, VT_ACTIVATE, (void *)(ptrdiff_t)vt_num);
79 xioctl(fd, VT_WAITACTIVE, (void *)(ptrdiff_t)vt_num);
80}
81