annotate old/framebuffer/cp_vt.c @ 982:b29547a5b85b

avoid WAIT in virtual console
author root@henri.cr.ie.u-ryukyu.ac.jp
date Fri, 01 Oct 2010 00:26:02 +0900
parents e0c254a9a865
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
979
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 // cp_vt.c
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // Copyright (c) 2006, Mike Acton <macton@cellperformance.com>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // documentation files (the "Software"), to deal in the Software without restriction, including without
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 // limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 // the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // conditions:
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // The above copyright notice and this permission notice shall be included in all copies or substantial
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 // portions of the Software.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 // EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 // AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // OR OTHER DEALINGS IN THE SOFTWARE.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 // NOTES:
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 // From http://www.linuxjournal.com/article/2597
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 // "Console ttys are used when the keyboard and monitor are directly connected to the system without running
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 // the X Window System. Since you can have several virtual consoles, the devices are tty0 through tty63. In
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 // theory you can have 64 virtual consoles, but most people use only a few. The device /dev/console is
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 // identical to tty0 and is needed for historical reasons. If your system lets you log in on consoles 1
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 // through 6, then when you run X Windows System, X uses console 7, so you'll need /dev/tty1 through /dev/
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 // tty7 on your system. I recommend having files up through /dev/tty12. For more information on using
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 // virtual consoles, see the article Keyboards, Consoles and VT Cruising by John Fisk in the November 1996
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 // issue of Linux Journal"
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 #include <stdio.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 #include <stdint.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 #include <fcntl.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 #include <unistd.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 #include <sys/ioctl.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #include <linux/vt.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 #include <linux/kd.h>
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #include "cp_vt.h"
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 static inline const char*
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 select_error_str( int existing_error, const char* const existing_error_str, int new_error, const char* const new_error_str )
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 // Only report the first error found - any error that follows is probably just a cascading effect.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 const char* error_str = (char*)( (~(intptr_t)existing_error & (intptr_t)new_error & (intptr_t)new_error_str)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 | ((intptr_t)existing_error & (intptr_t)existing_error_str) );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 return (error_str);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 }
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 int
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 cp_vt_open_graphics(cp_vt* restrict vt)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 const char* error_str = NULL;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 int error = 0;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 // Open the current tty
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 // From http://tldp.org/HOWTO/Text-Terminal-HOWTO-6.html#ss6.3
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 // (An excellent overview by David S. Lawyer)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 // "In Linux the PC monitor is usually called the console and has several device special files associated
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 // with it: vc/0 (tty0), vc/1 (tty1), vc/2 (tty2), etc. When you log in you are on vc/1. To go to vc/2
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 // (on the same screen) press down the 2 keys Alt(left)-F3. For vc/3 use Left Alt-F3, etc. These (vc/1,
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 // vc/2, vc/3, etc.) are called "virtual terminals". vc/0 (tty0) is just an alias for the current virtual
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 // terminal and it's where messages from the system are sent. Thus messages from the system will be seen
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 // on the console (monitor) regardless of which virtual terminal it is displaying."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 const int cur_tty = open( "/dev/tty0", O_RDWR );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 const int open_cur_tty_error = (cur_tty >> ((sizeof(int)*8)-1));
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 const char* open_cur_tty_error_str = "Could not open /dev/tty0. Check permissions.";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 error_str = select_error_str( error, error_str, open_cur_tty_error, open_cur_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 error = error | open_cur_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 // From: http://www.linuxjournal.com/article/2783
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 // (A little out of date, but a nice primer.)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 // "VT_GETSTATE returns the state of all VT's in the kernel in the structure:
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 // struct vt_stat {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 // ushort v_active;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 // ushort v_signal;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 // ushort v_state;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 // };
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 // v_active the currently active VT
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 // v_state mask of all the opened VT's
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 // v_active holds the number of the active VT (starting from 1), while v_state
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 // holds a mask where there is a 1 for each VT that has been opened by some process.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 // Note that VT 0 is always opened in this scenario, since it refers to the current VT.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 // Bugs:
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 // The v_signal member is unsupported."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 struct vt_stat vts;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 const int get_state_error = ioctl( cur_tty, VT_GETSTATE, &vts );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 const char* get_state_error_str = "VT_GETSTATE failed on /dev/tty0";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 error_str = select_error_str( error, error_str, get_state_error, get_state_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 error = error | get_state_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 vt->prev_tty_ndx = vts.v_active;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 // From: http://opensolaris.org/os/project/vconsole/vt.7i.txt
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 // (Close enough to Linux and a pretty good source of documentation.)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 // "VT_OPENQRY
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 // This call is used to find an available VT. The argu-
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 // ment to the ioctl is a pointer to an integer. The integer
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 // will be filled in with the number of the first avail-
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 // able VT that no other process has open (and hence, is
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 // available to be opened). If there are no available
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 // VTs, then -1 will be filled in."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 const int open_query_error = ioctl( cur_tty, VT_OPENQRY, &vt->tty_ndx);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 const char* open_query_error_str = "No open ttys available";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 error_str = select_error_str( error, error_str, open_query_error, open_query_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 error = error | open_query_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 const int close_cur_tty_error = close( cur_tty );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 const char* close_cur_tty_error_str = "Could not close parent tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 error_str = select_error_str( error, error_str, close_cur_tty_error, close_cur_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 error = error | close_cur_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 char tty_file_name[11];
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 (void)snprintf( tty_file_name, 11, "/dev/tty%d", vt->tty_ndx );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 const int tty = open( tty_file_name, O_RDWR );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 const int open_tty_error = (cur_tty >> ((sizeof(int)*8)-1));
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 const char* open_tty_error_str = "Could not open tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 error_str = select_error_str( error, error_str, open_tty_error, open_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 error = error | open_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 vt->tty = tty;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 // From: http://opensolaris.org/os/project/vconsole/vt.7i.txt
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 // (Close enough to Linux and a pretty good source of documentation.)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 // "VT_ACTIVATE
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 // This call has the effect of making the VT specified in
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 // the argument the active VT. The VT manager will cause
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 // a switch to occur in the same manner as if a hotkey had
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 // initiated the switch. If the specified VT is not open
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 // or does not exist the call will fail and errno will be
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 // set to ENXIO."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 // "VT_WAITACTIVE
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 // If the specified VT is already active, this call
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 // returns immediately. Otherwise, it will sleep until
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 // the specified VT becomes active, at which point it will
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 // return."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 const int activate_tty_error = ioctl( vt->tty, VT_ACTIVATE, vt->tty_ndx );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 const char* activate_tty_error_str = "Could not activate tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 error_str = select_error_str( error, error_str, activate_tty_error, activate_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 error = error | activate_tty_error;
982
b29547a5b85b avoid WAIT in virtual console
root@henri.cr.ie.u-ryukyu.ac.jp
parents: 979
diff changeset
168 #if 0
979
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 const int waitactive_tty_error = ioctl( vt->tty, VT_WAITACTIVE, vt->tty_ndx );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 const char* waitactive_tty_error_str = "Could not switch to tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 error_str = select_error_str( error, error_str, waitactive_tty_error, waitactive_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 error = error | waitactive_tty_error;
982
b29547a5b85b avoid WAIT in virtual console
root@henri.cr.ie.u-ryukyu.ac.jp
parents: 979
diff changeset
174 #endif
979
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 // From: http://opensolaris.org/os/project/vconsole/vt.7i.txt
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 // (Close enough to Linux and a pretty good source of documentation.)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 // "KDSETMODE
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 // This call is used to set the text/graphics mode to the VT.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 // KD_TEXT indicates that console text will be displayed on the screen
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 // with this VT. Normally KD_TEXT is combined with VT_AUTO mode for
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 // text console terminals, so that the console text display will
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 // automatically be saved and restored on the hot key screen switches.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 // KD_GRAPHICS indicates that the user/application, usually Xserver,
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 // will have direct control of the display for this VT in graphics
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 // mode. Normally KD_GRAPHICS is combined with VT_PROCESS mode for
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 // this VT indicating direct control of the display in graphics mode.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 // In this mode, all writes to this VT using the write system call are
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 // ignored, and the user is responsible for saving and restoring the
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 // display on the hot key screen switches."
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 // Save the current VT mode. This is most likely KD_TEXT.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 const int kdgetmode_error = ioctl( vt->tty, KDGETMODE, &vt->prev_kdmode );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 const char* kdgetmode_error_str = "Could not get mode for tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 error_str = select_error_str( error, error_str, kdgetmode_error, kdgetmode_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 error = error | kdgetmode_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 // Set VT to GRAPHICS (user draw) mode
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 const int kdsetmode_graphics_error = ioctl( vt->tty, KDSETMODE, KD_GRAPHICS );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 const char* kdsetmode_graphics_error_str = "Could not set graphics mode for tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 error_str = select_error_str( error, error_str, kdsetmode_graphics_error, kdsetmode_graphics_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 error = error | kdsetmode_graphics_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 // Not bothering with VT_PROCESS, VT_AUTO is fine for our purposes.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 // If vt blanking is active, for example when running this program from a remote terminal,
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 // setting KD_GRAPHICS will not disable the blanking. Reset to KD_TEXT from KD_GRAPHICS will
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 // force disable blanking. Then return to KD_GRAPHICS for drawing.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 //
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 // Note: KD_TEXT (default) to KD_TEXT will do nothing, so blanking will not be disable unless
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 // the mode is changing. i.e. the initial set to KD_GRAPHICS above is useful.
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 const int kdsetmode_text_error = ioctl( vt->tty, KDSETMODE, KD_TEXT );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 const char* kdsetmode_text_error_str = "Could not set text mode for tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 error_str = select_error_str( error, error_str, kdsetmode_text_error, kdsetmode_text_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 error = error | kdsetmode_text_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 const int kdsetmode_graphics_reset_error = ioctl( vt->tty, KDSETMODE, KD_GRAPHICS );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 const char* kdsetmode_graphics_reset_error_str = "Could not reset graphics mode for tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 error_str = select_error_str( error, error_str, kdsetmode_graphics_reset_error, kdsetmode_graphics_reset_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 error = error | kdsetmode_graphics_reset_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 if ( error == -1 )
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 printf("ERROR: vt_graphics_open: %s\n",error_str);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 return (-1);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 }
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 return (0);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 }
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 int
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 cp_vt_close(cp_vt* restrict vt)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 const char* error_str = NULL;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 int error = 0;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 // Reset previous mode on tty (likely KD_TEXT)
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 const int kdsetmode_error = ioctl( vt->tty, KDSETMODE, vt->prev_kdmode );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 const char* kdsetmode_error_str = "Could not reset previous mode for tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 error_str = select_error_str( error, error_str, kdsetmode_error, kdsetmode_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 error = error | kdsetmode_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 // Restore previous tty
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 const int activate_tty_error = ioctl( vt->tty, VT_ACTIVATE, vt->prev_tty_ndx );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 const char* activate_tty_error_str = "Could not activate previous tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 error_str = select_error_str( error, error_str, activate_tty_error, activate_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 error = error | activate_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 const int waitactive_tty_error = ioctl( vt->tty, VT_WAITACTIVE, vt->prev_tty_ndx );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 const char* waitactive_tty_error_str = "Could not switch to previous tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 error_str = select_error_str( error, error_str, waitactive_tty_error, waitactive_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 error = error | waitactive_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 // Close tty
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 const int close_tty_error = close( vt->tty );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 const char* close_tty_error_str = "Could not close tty";
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 error_str = select_error_str( error, error_str, close_tty_error, close_tty_error_str );
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 error = error | close_tty_error;
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 if ( error == -1 )
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 {
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 printf("ERROR: vt_close: %s\n",error_str);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 return (-1);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 }
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 return (0);
e0c254a9a865 add rest
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 }