uvt: new library implementing VTs in user-space
[platform/upstream/kmscon.git] / src / uvt.h
1 /*
2  * UVT - Userspace Virtual Terminals
3  *
4  * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files
8  * (the "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included
15  * in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25
26 /*
27  * Userspace Virtual Terminals
28  * Virtual terminals were historically implemented in the kernel via a
29  * character-device. This layer provides a user-space implementation via
30  * CUSE/FUSE that can be used to provide the same API from user-space.
31  */
32
33 #ifndef UVT_H
34 #define UVT_H
35
36 #include <linux/kd.h>
37 #include <linux/vt.h>
38 #include <stdbool.h>
39 #include <stdlib.h>
40 #include <termio.h>
41 #include <termios.h>
42
43 /* UVT types */
44
45 struct uvt_client;
46 struct uvt_cdev;
47 struct uvt_ctx;
48
49 /* TTYs */
50
51 enum uvt_tty_event_type {
52         UVT_TTY_HUP             = 0x01,
53         UVT_TTY_READ            = 0x02,
54         UVT_TTY_WRITE           = 0x04,
55 };
56
57 struct uvt_tty_event {
58         unsigned int type;
59 };
60
61 typedef void (*uvt_tty_cb) (void *tty, struct uvt_tty_event *ev, void *data);
62
63 struct uvt_tty_ops {
64         void (*ref) (void *data);
65         void (*unref) (void *data);
66         int (*register_cb) (void *data, uvt_tty_cb cb, void *cb_data);
67         void (*unregister_cb) (void *data, uvt_tty_cb cb, void *cb_data);
68
69         int (*read) (void *data, uint8_t *mem, size_t len);
70         int (*write) (void *data, const uint8_t *mem, size_t len);
71         unsigned int (*poll) (void *data);
72
73 /*
74         int (*ioctl_TIOCPKT) (void *data, ...);
75         int (*ioctl_TCFLSH) (void *data, long arg);
76         int (*ioctl_TCXONC) (void *data, ...);
77         int (*ioctl_TCGETS) (void *data, struct termios *arg);
78         int (*ioctl_TCSETS) (void *data, const struct termios *arg);
79         int (*ioctl_TCSETSF) (void *data, const struct termios *arg);
80         int (*ioctl_TCSETSW) (void *data, const struct termios *arg);
81         int (*ioctl_TCGETA) (void *data, ...);
82         int (*ioctl_TCSETA) (void *data, ...);
83         int (*ioctl_TCSETAF) (void *data, ...);
84         int (*ioctl_TCSETAW) (void *data, ...);
85         int (*ioctl_TIOCGLCKTRMIOS) (void *data, ...);
86         int (*ioctl_TIOCSLCKTRMIOS) (void *data, ...);
87         int (*ioctl_TCGETX) (void *data, ...);
88         int (*ioctl_TCSETX) (void *data, ...);
89         int (*ioctl_TCSETXW) (void *data, ...);
90         int (*ioctl_TCSETXF) (void *data, ...);
91         int (*ioctl_TIOCGSOFTCAR) (void *data, ...);
92         int (*ioctl_TIOCSSOFTCAR) (void *data, ...);
93 */
94 };
95
96 /* virtual terminals */
97
98 enum uvt_vt_event_type {
99         UVT_VT_HUP              = 0x01,
100         UVT_VT_TTY              = 0x02,
101 };
102
103 struct uvt_vt_event {
104         unsigned int type;
105
106         union {
107                 struct uvt_tty_event tty;
108         };
109 };
110
111 typedef void (*uvt_vt_cb) (void *vt, struct uvt_vt_event *ev, void *data);
112
113 struct uvt_vt_ops {
114         void (*ref) (void *data);
115         void (*unref) (void *data);
116         int (*register_cb) (void *data, uvt_vt_cb cb, void *cb_data);
117         void (*unregister_cb) (void *data, uvt_vt_cb cb, void *cb_data);
118
119         int (*read) (void *data, uint8_t *mem, size_t len);
120         int (*write) (void *data, const uint8_t *mem, size_t len);
121         unsigned int (*poll) (void *data);
122
123 /*
124         int (*ioctl_TIOCLINUX) (void *data, ...);
125         int (*ioctl_KIOCSOUND) (void *data, ...);
126         int (*ioctl_KDMKTONE) (void *data, ...);
127         int (*ioctl_KDGKBTYPE) (void *data, char *arg);
128         int (*ioctl_KDADDIO) (void *data, unsigned long arg);
129         int (*ioctl_KDDELIO) (void *data, unsigned long arg);
130         int (*ioctl_KDENABIO) (void *data);
131         int (*ioctl_KDDISABIO) (void *data);
132         int (*ioctl_KDKBDREP) (void *data, struct kbd_repeat *arg);
133         int (*ioctl_KDGETMODE) (void *data, long *arg);
134         int (*ioctl_KDSETMODE) (void *data, long arg);
135         int (*ioctl_KDMAPDISP) (void *data);
136         int (*ioctl_KDUNMAPDISP) (void *data);
137         int (*ioctl_KDGKBMODE) (void *data, long *arg);
138         int (*ioctl_KDSKBMODE) (void *data, long arg);
139         int (*ioctl_KDGKBMETA) (void *data, long *arg);
140         int (*ioctl_KDSKBMETA) (void *data, long arg);
141         int (*ioctl_KDGETKEYCODE) (void *data, ...);
142         int (*ioctl_KDSETKEYCODE) (void *data, ...);
143         int (*ioctl_KDGKBENT) (void *data, ...);
144         int (*ioctl_KDSKBENT) (void *data, ...);
145         int (*ioctl_KDGKBSENT) (void *data, ...);
146         int (*ioctl_KDSKBSENT) (void *data, ...);
147         int (*ioctl_KDGKBDIACR) (void *data, ...);
148         int (*ioctl_KDSKBDIACR) (void *data, ...);
149         int (*ioctl_KDGKBDIACRUC) (void *data, ...);
150         int (*ioctl_KDSKBDIACRUC) (void *data, ...);
151         int (*ioctl_KDGETLED) (void *data, char *arg);
152         int (*ioctl_KDSETLED) (void *data, long arg);
153         int (*ioctl_KDGKBLED) (void *data, char *arg);
154         int (*ioctl_KDSKBLED) (void *data, long arg);
155         int (*ioctl_KDSIGACCEPT) (void *data, ...);
156         int (*ioctl_VT_GETMODE) (void *data, struct vt_mode *arg);
157         int (*ioctl_VT_SETMODE) (void *data, const struct vt_mode *arg);
158         int (*ioctl_VT_GETSTATE) (void *data, struct vt_stat *arg);
159         int (*ioctl_VT_OPENQRY) (void *data, int *arg);
160         int (*ioctl_VT_ACTIVATE) (void *data, long arg);
161         int (*ioctl_VT_SETACTIVATE) (void *data, ...);
162         int (*ioctl_VT_WAITACTIVE) (void *data, long arg);
163         int (*ioctl_VT_RELDISP) (void *data, long arg);
164         int (*ioctl_VT_DISALLOCATE) (void *data, ...);
165         int (*ioctl_VT_RESIZE) (void *data, ...);
166         int (*ioctl_VT_RESIZEX) (void *data, ...);
167         int (*ioctl_GIO_FONT) (void *data, ...);
168         int (*ioctl_PIO_FONT) (void *data, ...);
169         int (*ioctl_GIO_CMAP) (void *data, ...);
170         int (*ioctl_PIO_CMAP) (void *data, ...);
171         int (*ioctl_GIO_FONTX) (void *data, ...);
172         int (*ioctl_PIO_FONTX) (void *data, ...);
173         int (*ioctl_PIO_FONTRESET) (void *data, ...);
174         int (*ioctl_KDFONTOP) (void *data, ...);
175         int (*ioctl_GIO_SCRNMAP) (void *data, ...);
176         int (*ioctl_PIO_SCRNMAP) (void *data, ...);
177         int (*ioctl_GIO_UNISCRNMAP) (void *data, ...);
178         int (*ioctl_PIO_UNISCRNMAP) (void *data, ...);
179         int (*ioctl_PIO_UNIMAPCLR) (void *data, ...);
180         int (*ioctl_GIO_UNIMAP) (void *data, ...);
181         int (*ioctl_PIO_UNIMAP) (void *data, ...);
182         int (*ioctl_VT_LOCKSWITCH) (void *data);
183         int (*ioctl_VT_UNLOCKSWITCH) (void *data);
184         int (*ioctl_VT_GETHIFONTMASK) (void *data, ...);
185         int (*ioctl_VT_WAITEVENT) (void *data, ...);
186
187         int (*ioctl_TIOCPKT) (void *data, ...);
188         int (*ioctl_TCFLSH) (void *data, long arg);
189         int (*ioctl_TCXONC) (void *data, ...);
190         int (*ioctl_TCGETS) (void *data, struct termios *arg);
191         int (*ioctl_TCSETS) (void *data, const struct termios *arg);
192         int (*ioctl_TCSETSF) (void *data, const struct termios *arg);
193         int (*ioctl_TCSETSW) (void *data, const struct termios *arg);
194         int (*ioctl_TCGETA) (void *data, ...);
195         int (*ioctl_TCSETA) (void *data, ...);
196         int (*ioctl_TCSETAF) (void *data, ...);
197         int (*ioctl_TCSETAW) (void *data, ...);
198         int (*ioctl_TIOCGLCKTRMIOS) (void *data, ...);
199         int (*ioctl_TIOCSLCKTRMIOS) (void *data, ...);
200         int (*ioctl_TCGETX) (void *data, ...);
201         int (*ioctl_TCSETX) (void *data, ...);
202         int (*ioctl_TCSETXW) (void *data, ...);
203         int (*ioctl_TCSETXF) (void *data, ...);
204         int (*ioctl_TIOCGSOFTCAR) (void *data, ...);
205         int (*ioctl_TIOCSSOFTCAR) (void *data, ...);
206 */
207 };
208
209 /* client sessions */
210
211 void uvt_client_ref(struct uvt_client *client);
212 void uvt_client_unref(struct uvt_client *client);
213
214 int uvt_client_set_vt(struct uvt_client *client, const struct uvt_vt_ops *vt,
215                       void *vt_data);
216 void uvt_client_kill(struct uvt_client *client);
217 bool uvt_client_is_dead(struct uvt_client *client);
218
219 /* character devices */
220
221 enum uvt_cdev_event_type {
222         UVT_CDEV_HUP,
223         UVT_CDEV_OPEN,
224 };
225
226 struct uvt_cdev_event {
227         unsigned int type;
228
229         union {
230                 struct uvt_client *client;
231         };
232 };
233
234 typedef void (*uvt_cdev_cb) (struct uvt_cdev *cdev,
235                              struct uvt_cdev_event *ev,
236                              void *data);
237
238 int uvt_cdev_new(struct uvt_cdev **out, struct uvt_ctx *ctx,
239                  const char *name, unsigned int major, unsigned int minor);
240 void uvt_cdev_ref(struct uvt_cdev *cdev);
241 void uvt_cdev_unref(struct uvt_cdev *cdev);
242
243 int uvt_cdev_register_cb(struct uvt_cdev *cdev, uvt_cdev_cb cb, void *data);
244 void uvt_cdev_unregister_cb(struct uvt_cdev *cdev, uvt_cdev_cb cb, void *data);
245
246 /* contexts */
247
248 typedef void (*uvt_log_t) (void *data,
249                            const char *file,
250                            int line,
251                            const char *func,
252                            const char *subs,
253                            unsigned int sev,
254                            const char *format,
255                            va_list args);
256
257 int uvt_ctx_new(struct uvt_ctx **out, uvt_log_t log, void *log_data);
258 void uvt_ctx_ref(struct uvt_ctx *ctx);
259 void uvt_ctx_unref(struct uvt_ctx *ctx);
260
261 int uvt_ctx_get_fd(struct uvt_ctx *ctx);
262 void uvt_ctx_dispatch(struct uvt_ctx *ctx);
263
264 /* pty tty implementation */
265
266 struct uvt_tty_null;
267 extern const struct uvt_tty_ops uvt_tty_null_ops;
268
269 int uvt_tty_null_new(struct uvt_tty_null **out, struct uvt_ctx *ctx);
270 void uvt_tty_null_ref(struct uvt_tty_null *tty);
271 void uvt_tty_null_unref(struct uvt_tty_null *tty);
272
273 #endif /* UVT_H */