diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/pty.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index 53761cefa915..e066c4fdf81b 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
@@ -261,6 +261,9 @@ done: | |||
261 | return 0; | 261 | return 0; |
262 | } | 262 | } |
263 | 263 | ||
264 | /* Traditional BSD devices */ | ||
265 | #ifdef CONFIG_LEGACY_PTYS | ||
266 | |||
264 | static int pty_install(struct tty_driver *driver, struct tty_struct *tty) | 267 | static int pty_install(struct tty_driver *driver, struct tty_struct *tty) |
265 | { | 268 | { |
266 | struct tty_struct *o_tty; | 269 | struct tty_struct *o_tty; |
@@ -310,24 +313,6 @@ free_mem_out: | |||
310 | return -ENOMEM; | 313 | return -ENOMEM; |
311 | } | 314 | } |
312 | 315 | ||
313 | |||
314 | static const struct tty_operations pty_ops = { | ||
315 | .install = pty_install, | ||
316 | .open = pty_open, | ||
317 | .close = pty_close, | ||
318 | .write = pty_write, | ||
319 | .write_room = pty_write_room, | ||
320 | .flush_buffer = pty_flush_buffer, | ||
321 | .chars_in_buffer = pty_chars_in_buffer, | ||
322 | .unthrottle = pty_unthrottle, | ||
323 | .set_termios = pty_set_termios, | ||
324 | .resize = pty_resize | ||
325 | }; | ||
326 | |||
327 | /* Traditional BSD devices */ | ||
328 | #ifdef CONFIG_LEGACY_PTYS | ||
329 | static struct tty_driver *pty_driver, *pty_slave_driver; | ||
330 | |||
331 | static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file, | 316 | static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file, |
332 | unsigned int cmd, unsigned long arg) | 317 | unsigned int cmd, unsigned long arg) |
333 | { | 318 | { |
@@ -341,7 +326,12 @@ static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file, | |||
341 | static int legacy_count = CONFIG_LEGACY_PTY_COUNT; | 326 | static int legacy_count = CONFIG_LEGACY_PTY_COUNT; |
342 | module_param(legacy_count, int, 0); | 327 | module_param(legacy_count, int, 0); |
343 | 328 | ||
344 | static const struct tty_operations pty_ops_bsd = { | 329 | /* |
330 | * The master side of a pty can do TIOCSPTLCK and thus | ||
331 | * has pty_bsd_ioctl. | ||
332 | */ | ||
333 | static const struct tty_operations master_pty_ops_bsd = { | ||
334 | .install = pty_install, | ||
345 | .open = pty_open, | 335 | .open = pty_open, |
346 | .close = pty_close, | 336 | .close = pty_close, |
347 | .write = pty_write, | 337 | .write = pty_write, |
@@ -354,8 +344,23 @@ static const struct tty_operations pty_ops_bsd = { | |||
354 | .resize = pty_resize | 344 | .resize = pty_resize |
355 | }; | 345 | }; |
356 | 346 | ||
347 | static const struct tty_operations slave_pty_ops_bsd = { | ||
348 | .install = pty_install, | ||
349 | .open = pty_open, | ||
350 | .close = pty_close, | ||
351 | .write = pty_write, | ||
352 | .write_room = pty_write_room, | ||
353 | .flush_buffer = pty_flush_buffer, | ||
354 | .chars_in_buffer = pty_chars_in_buffer, | ||
355 | .unthrottle = pty_unthrottle, | ||
356 | .set_termios = pty_set_termios, | ||
357 | .resize = pty_resize | ||
358 | }; | ||
359 | |||
357 | static void __init legacy_pty_init(void) | 360 | static void __init legacy_pty_init(void) |
358 | { | 361 | { |
362 | struct tty_driver *pty_driver, *pty_slave_driver; | ||
363 | |||
359 | if (legacy_count <= 0) | 364 | if (legacy_count <= 0) |
360 | return; | 365 | return; |
361 | 366 | ||
@@ -383,7 +388,7 @@ static void __init legacy_pty_init(void) | |||
383 | pty_driver->init_termios.c_ospeed = 38400; | 388 | pty_driver->init_termios.c_ospeed = 38400; |
384 | pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW; | 389 | pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW; |
385 | pty_driver->other = pty_slave_driver; | 390 | pty_driver->other = pty_slave_driver; |
386 | tty_set_operations(pty_driver, &pty_ops); | 391 | tty_set_operations(pty_driver, &master_pty_ops_bsd); |
387 | 392 | ||
388 | pty_slave_driver->owner = THIS_MODULE; | 393 | pty_slave_driver->owner = THIS_MODULE; |
389 | pty_slave_driver->driver_name = "pty_slave"; | 394 | pty_slave_driver->driver_name = "pty_slave"; |
@@ -399,7 +404,7 @@ static void __init legacy_pty_init(void) | |||
399 | pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS | | 404 | pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS | |
400 | TTY_DRIVER_REAL_RAW; | 405 | TTY_DRIVER_REAL_RAW; |
401 | pty_slave_driver->other = pty_driver; | 406 | pty_slave_driver->other = pty_driver; |
402 | tty_set_operations(pty_slave_driver, &pty_ops); | 407 | tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd); |
403 | 408 | ||
404 | if (tty_register_driver(pty_driver)) | 409 | if (tty_register_driver(pty_driver)) |
405 | panic("Couldn't register pty driver"); | 410 | panic("Couldn't register pty driver"); |