2 * UVT - Userspace Virtual Terminals
4 * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
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.
51 enum uvt_tty_event_type {
57 struct uvt_tty_event {
61 typedef void (*uvt_tty_cb) (void *tty, struct uvt_tty_event *ev, void *data);
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);
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);
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, ...);
96 /* virtual terminals */
98 enum uvt_vt_event_type {
103 struct uvt_vt_event {
107 struct uvt_tty_event tty;
111 typedef void (*uvt_vt_cb) (void *vt, struct uvt_vt_event *ev, void *data);
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);
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);
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, ...);
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, ...);
209 /* client sessions */
211 void uvt_client_ref(struct uvt_client *client);
212 void uvt_client_unref(struct uvt_client *client);
214 int uvt_client_set_vt(struct uvt_client *client, const struct uvt_vt_ops *vt,
216 void uvt_client_kill(struct uvt_client *client);
217 bool uvt_client_is_dead(struct uvt_client *client);
219 /* character devices */
221 enum uvt_cdev_event_type {
226 struct uvt_cdev_event {
230 struct uvt_client *client;
234 typedef void (*uvt_cdev_cb) (struct uvt_cdev *cdev,
235 struct uvt_cdev_event *ev,
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);
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);
248 typedef void (*uvt_log_t) (void *data,
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);
261 int uvt_ctx_get_fd(struct uvt_ctx *ctx);
262 void uvt_ctx_dispatch(struct uvt_ctx *ctx);
264 /* pty tty implementation */
267 extern const struct uvt_tty_ops uvt_tty_null_ops;
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);