1 /* 2 * Copyright (C) 1991, 1992 Linus Torvalds 3 * 4 * Added support for a Unix98-style ptmx device. 5 * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998 6 * 7 * When reading this code see also fs/devpts. In particular note that the 8 * driver_data field is used by the devpts side as a binding to the devpts 9 * inode. 10 */ 11 12 #include <linux/module.h> 13 14 #include <linux/errno.h> 15 #include <linux/interrupt.h> 16 #include <linux/tty.h> 17 #include <linux/tty_flip.h> 18 #include <linux/fcntl.h> 19 #include <linux/sched.h> 20 #include <linux/string.h> 21 #include <linux/major.h> 22 #include <linux/mm.h> 23 #include <linux/init.h> 24 #include <linux/device.h> 25 #include <linux/uaccess.h> 26 #include <linux/bitops.h> 27 #include <linux/devpts_fs.h> 28 #include <linux/slab.h> 29 #include <linux/mutex.h> 30 31 32 #ifdef CONFIG_UNIX98_PTYS 33 static struct tty_driver *ptm_driver; 34 static struct tty_driver *pts_driver; 35 static DEFINE_MUTEX(devpts_mutex); 36 #endif 37 38 static void pty_close(struct tty_struct *tty, struct file *filp) 39 { 40 BUG_ON(!tty); 41 if (tty->driver->subtype == PTY_TYPE_MASTER) 42 WARN_ON(tty->count > 1); 43 else { 44 if (tty->count > 2) 45 return; 46 } 47 wake_up_interruptible(&tty->read_wait); 48 wake_up_interruptible(&tty->write_wait); 49 tty->packet = 0; 50 if (!tty->link) 51 return; 52 tty->link->packet = 0; 53 set_bit(TTY_OTHER_CLOSED, &tty->link->flags); 54 wake_up_interruptible(&tty->link->read_wait); 55 wake_up_interruptible(&tty->link->write_wait); 56 if (tty->driver->subtype == PTY_TYPE_MASTER) { 57 set_bit(TTY_OTHER_CLOSED, &tty->flags); 58 #ifdef CONFIG_UNIX98_PTYS 59 if (tty->driver == ptm_driver) { 60 mutex_lock(&devpts_mutex); 61 devpts_pty_kill(tty->link); 62 mutex_unlock(&devpts_mutex); 63 } 64 #endif 65 tty_unlock(); 66 tty_vhangup(tty->link); 67 tty_lock(); 68 } 69 } 70 71 /* 72 * The unthrottle routine is called by the line discipline to signal 73 * that it can receive more characters. For PTY's, the TTY_THROTTLED 74 * flag is always set, to force the line discipline to always call the 75 * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE 76 * characters in the queue. This is necessary since each time this 77 * happens, we need to wake up any sleeping processes that could be 78 * (1) trying to send data to the pty, or (2) waiting in wait_until_sent() 79 * for the pty buffer to be drained. 80 */ 81 static void pty_unthrottle(struct tty_struct *tty) 82 { 83 tty_wakeup(tty->link); 84 set_bit(TTY_THROTTLED, &tty->flags); 85 } 86 87 /** 88 * pty_space - report space left for writing 89 * @to: tty we are writing into 90 * 91 * The tty buffers allow 64K but we sneak a peak and clip at 8K this 92 * allows a lot of overspill room for echo and other fun messes to 93 * be handled properly 94 */ 95 96 static int pty_space(struct tty_struct *to) 97 { 98 int n = 8192 - to->buf.memory_used; 99 if (n < 0) 100 return 0; 101 return n; 102 } 103 104 /** 105 * pty_write - write to a pty 106 * @tty: the tty we write from 107 * @buf: kernel buffer of data 108 * @count: bytes to write 109 * 110 * Our "hardware" write method. Data is coming from the ldisc which 111 * may be in a non sleeping state. We simply throw this at the other 112 * end of the link as if we were an IRQ handler receiving stuff for 113 * the other side of the pty/tty pair. 114 */ 115 116 static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) 117 { 118 struct tty_struct *to = tty->link; 119 120 if (tty->stopped) 121 return 0; 122 123 if (c > 0) { 124 /* Stuff the data into the input queue of the other end */ 125 c = tty_insert_flip_string(to, buf, c); 126 /* And shovel */ 127 if (c) { 128 tty_flip_buffer_push(to); 129 tty_wakeup(tty); 130 } 131 } 132 return c; 133 } 134 135 /** 136 * pty_write_room - write space 137 * @tty: tty we are writing from 138 * 139 * Report how many bytes the ldisc can send into the queue for 140 * the other device. 141 */ 142 143 static int pty_write_room(struct tty_struct *tty) 144 { 145 if (tty->stopped) 146 return 0; 147 return pty_space(tty->link); 148 } 149 150 /** 151 * pty_chars_in_buffer - characters currently in our tx queue 152 * @tty: our tty 153 * 154 * Report how much we have in the transmit queue. As everything is 155 * instantly at the other end this is easy to implement. 156 */ 157 158 static int pty_chars_in_buffer(struct tty_struct *tty) 159 { 160 return 0; 161 } 162 163 /* Set the lock flag on a pty */ 164 static int pty_set_lock(struct tty_struct *tty, int __user *arg) 165 { 166 int val; 167 if (get_user(val, arg)) 168 return -EFAULT; 169 if (val) 170 set_bit(TTY_PTY_LOCK, &tty->flags); 171 else 172 clear_bit(TTY_PTY_LOCK, &tty->flags); 173 return 0; 174 } 175 176 /* Send a signal to the slave */ 177 static int pty_signal(struct tty_struct *tty, int sig) 178 { 179 unsigned long flags; 180 struct pid *pgrp; 181 182 if (tty->link) { 183 spin_lock_irqsave(&tty->link->ctrl_lock, flags); 184 pgrp = get_pid(tty->link->pgrp); 185 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags); 186 187 kill_pgrp(pgrp, sig, 1); 188 put_pid(pgrp); 189 } 190 return 0; 191 } 192 193 static void pty_flush_buffer(struct tty_struct *tty) 194 { 195 struct tty_struct *to = tty->link; 196 unsigned long flags; 197 198 if (!to) 199 return; 200 /* tty_buffer_flush(to); FIXME */ 201 if (to->packet) { 202 spin_lock_irqsave(&tty->ctrl_lock, flags); 203 tty->ctrl_status |= TIOCPKT_FLUSHWRITE; 204 wake_up_interruptible(&to->read_wait); 205 spin_unlock_irqrestore(&tty->ctrl_lock, flags); 206 } 207 } 208 209 static int pty_open(struct tty_struct *tty, struct file *filp) 210 { 211 int retval = -ENODEV; 212 213 if (!tty || !tty->link) 214 goto out; 215 216 retval = -EIO; 217 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) 218 goto out; 219 if (test_bit(TTY_PTY_LOCK, &tty->link->flags)) 220 goto out; 221 if (tty->link->count != 1) 222 goto out; 223 224 clear_bit(TTY_OTHER_CLOSED, &tty->link->flags); 225 set_bit(TTY_THROTTLED, &tty->flags); 226 retval = 0; 227 out: 228 return retval; 229 } 230 231 static void pty_set_termios(struct tty_struct *tty, 232 struct ktermios *old_termios) 233 { 234 tty->termios.c_cflag &= ~(CSIZE | PARENB); 235 tty->termios.c_cflag |= (CS8 | CREAD); 236 } 237 238 /** 239 * pty_do_resize - resize event 240 * @tty: tty being resized 241 * @ws: window size being set. 242 * 243 * Update the termios variables and send the necessary signals to 244 * peform a terminal resize correctly 245 */ 246 247 int pty_resize(struct tty_struct *tty, struct winsize *ws) 248 { 249 struct pid *pgrp, *rpgrp; 250 unsigned long flags; 251 struct tty_struct *pty = tty->link; 252 253 /* For a PTY we need to lock the tty side */ 254 mutex_lock(&tty->termios_mutex); 255 if (!memcmp(ws, &tty->winsize, sizeof(*ws))) 256 goto done; 257 258 /* Get the PID values and reference them so we can 259 avoid holding the tty ctrl lock while sending signals. 260 We need to lock these individually however. */ 261 262 spin_lock_irqsave(&tty->ctrl_lock, flags); 263 pgrp = get_pid(tty->pgrp); 264 spin_unlock_irqrestore(&tty->ctrl_lock, flags); 265 266 spin_lock_irqsave(&pty->ctrl_lock, flags); 267 rpgrp = get_pid(pty->pgrp); 268 spin_unlock_irqrestore(&pty->ctrl_lock, flags); 269 270 if (pgrp) 271 kill_pgrp(pgrp, SIGWINCH, 1); 272 if (rpgrp != pgrp && rpgrp) 273 kill_pgrp(rpgrp, SIGWINCH, 1); 274 275 put_pid(pgrp); 276 put_pid(rpgrp); 277 278 tty->winsize = *ws; 279 pty->winsize = *ws; /* Never used so will go away soon */ 280 done: 281 mutex_unlock(&tty->termios_mutex); 282 return 0; 283 } 284 285 static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty, 286 bool legacy) 287 { 288 struct tty_struct *o_tty; 289 struct tty_port *ports[2]; 290 int idx = tty->index; 291 int retval = -ENOMEM; 292 293 o_tty = alloc_tty_struct(); 294 ports[0] = kmalloc(sizeof **ports, GFP_KERNEL); 295 ports[1] = kmalloc(sizeof **ports, GFP_KERNEL); 296 if (!o_tty || !ports[0] || !ports[1]) 297 goto err_free_tty; 298 if (!try_module_get(driver->other->owner)) { 299 /* This cannot in fact currently happen */ 300 goto err_free_tty; 301 } 302 initialize_tty_struct(o_tty, driver->other, idx); 303 304 if (legacy) { 305 /* We always use new tty termios data so we can do this 306 the easy way .. */ 307 retval = tty_init_termios(tty); 308 if (retval) 309 goto err_deinit_tty; 310 311 retval = tty_init_termios(o_tty); 312 if (retval) 313 goto err_free_termios; 314 315 driver->other->ttys[idx] = o_tty; 316 driver->ttys[idx] = tty; 317 } else { 318 memset(&tty->termios_locked, 0, sizeof(tty->termios_locked)); 319 tty->termios = driver->init_termios; 320 memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked)); 321 o_tty->termios = driver->other->init_termios; 322 } 323 324 /* 325 * Everything allocated ... set up the o_tty structure. 326 */ 327 tty_driver_kref_get(driver->other); 328 if (driver->subtype == PTY_TYPE_MASTER) 329 o_tty->count++; 330 /* Establish the links in both directions */ 331 tty->link = o_tty; 332 o_tty->link = tty; 333 tty_port_init(ports[0]); 334 tty_port_init(ports[1]); 335 o_tty->port = ports[0]; 336 tty->port = ports[1]; 337 338 tty_driver_kref_get(driver); 339 tty->count++; 340 return 0; 341 err_free_termios: 342 if (legacy) 343 tty_free_termios(tty); 344 err_deinit_tty: 345 deinitialize_tty_struct(o_tty); 346 module_put(o_tty->driver->owner); 347 err_free_tty: 348 kfree(ports[0]); 349 kfree(ports[1]); 350 free_tty_struct(o_tty); 351 return retval; 352 } 353 354 static void pty_cleanup(struct tty_struct *tty) 355 { 356 kfree(tty->port); 357 } 358 359 /* Traditional BSD devices */ 360 #ifdef CONFIG_LEGACY_PTYS 361 362 static int pty_install(struct tty_driver *driver, struct tty_struct *tty) 363 { 364 return pty_common_install(driver, tty, true); 365 } 366 367 static int pty_bsd_ioctl(struct tty_struct *tty, 368 unsigned int cmd, unsigned long arg) 369 { 370 switch (cmd) { 371 case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */ 372 return pty_set_lock(tty, (int __user *) arg); 373 case TIOCSIG: /* Send signal to other side of pty */ 374 return pty_signal(tty, (int) arg); 375 } 376 return -ENOIOCTLCMD; 377 } 378 379 static int legacy_count = CONFIG_LEGACY_PTY_COUNT; 380 module_param(legacy_count, int, 0); 381 382 /* 383 * The master side of a pty can do TIOCSPTLCK and thus 384 * has pty_bsd_ioctl. 385 */ 386 static const struct tty_operations master_pty_ops_bsd = { 387 .install = pty_install, 388 .open = pty_open, 389 .close = pty_close, 390 .write = pty_write, 391 .write_room = pty_write_room, 392 .flush_buffer = pty_flush_buffer, 393 .chars_in_buffer = pty_chars_in_buffer, 394 .unthrottle = pty_unthrottle, 395 .set_termios = pty_set_termios, 396 .ioctl = pty_bsd_ioctl, 397 .cleanup = pty_cleanup, 398 .resize = pty_resize 399 }; 400 401 static const struct tty_operations slave_pty_ops_bsd = { 402 .install = pty_install, 403 .open = pty_open, 404 .close = pty_close, 405 .write = pty_write, 406 .write_room = pty_write_room, 407 .flush_buffer = pty_flush_buffer, 408 .chars_in_buffer = pty_chars_in_buffer, 409 .unthrottle = pty_unthrottle, 410 .set_termios = pty_set_termios, 411 .cleanup = pty_cleanup, 412 .resize = pty_resize 413 }; 414 415 static void __init legacy_pty_init(void) 416 { 417 struct tty_driver *pty_driver, *pty_slave_driver; 418 419 if (legacy_count <= 0) 420 return; 421 422 pty_driver = alloc_tty_driver(legacy_count); 423 if (!pty_driver) 424 panic("Couldn't allocate pty driver"); 425 426 pty_slave_driver = alloc_tty_driver(legacy_count); 427 if (!pty_slave_driver) 428 panic("Couldn't allocate pty slave driver"); 429 430 pty_driver->driver_name = "pty_master"; 431 pty_driver->name = "pty"; 432 pty_driver->major = PTY_MASTER_MAJOR; 433 pty_driver->minor_start = 0; 434 pty_driver->type = TTY_DRIVER_TYPE_PTY; 435 pty_driver->subtype = PTY_TYPE_MASTER; 436 pty_driver->init_termios = tty_std_termios; 437 pty_driver->init_termios.c_iflag = 0; 438 pty_driver->init_termios.c_oflag = 0; 439 pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; 440 pty_driver->init_termios.c_lflag = 0; 441 pty_driver->init_termios.c_ispeed = 38400; 442 pty_driver->init_termios.c_ospeed = 38400; 443 pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW; 444 pty_driver->other = pty_slave_driver; 445 tty_set_operations(pty_driver, &master_pty_ops_bsd); 446 447 pty_slave_driver->driver_name = "pty_slave"; 448 pty_slave_driver->name = "ttyp"; 449 pty_slave_driver->major = PTY_SLAVE_MAJOR; 450 pty_slave_driver->minor_start = 0; 451 pty_slave_driver->type = TTY_DRIVER_TYPE_PTY; 452 pty_slave_driver->subtype = PTY_TYPE_SLAVE; 453 pty_slave_driver->init_termios = tty_std_termios; 454 pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; 455 pty_slave_driver->init_termios.c_ispeed = 38400; 456 pty_slave_driver->init_termios.c_ospeed = 38400; 457 pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS | 458 TTY_DRIVER_REAL_RAW; 459 pty_slave_driver->other = pty_driver; 460 tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd); 461 462 if (tty_register_driver(pty_driver)) 463 panic("Couldn't register pty driver"); 464 if (tty_register_driver(pty_slave_driver)) 465 panic("Couldn't register pty slave driver"); 466 } 467 #else 468 static inline void legacy_pty_init(void) { } 469 #endif 470 471 /* Unix98 devices */ 472 #ifdef CONFIG_UNIX98_PTYS 473 474 static struct cdev ptmx_cdev; 475 476 static int pty_unix98_ioctl(struct tty_struct *tty, 477 unsigned int cmd, unsigned long arg) 478 { 479 switch (cmd) { 480 case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */ 481 return pty_set_lock(tty, (int __user *)arg); 482 case TIOCGPTN: /* Get PT Number */ 483 return put_user(tty->index, (unsigned int __user *)arg); 484 case TIOCSIG: /* Send signal to other side of pty */ 485 return pty_signal(tty, (int) arg); 486 } 487 488 return -ENOIOCTLCMD; 489 } 490 491 /** 492 * ptm_unix98_lookup - find a pty master 493 * @driver: ptm driver 494 * @idx: tty index 495 * 496 * Look up a pty master device. Called under the tty_mutex for now. 497 * This provides our locking. 498 */ 499 500 static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, 501 struct inode *ptm_inode, int idx) 502 { 503 /* Master must be open via /dev/ptmx */ 504 return ERR_PTR(-EIO); 505 } 506 507 /** 508 * pts_unix98_lookup - find a pty slave 509 * @driver: pts driver 510 * @idx: tty index 511 * 512 * Look up a pty master device. Called under the tty_mutex for now. 513 * This provides our locking for the tty pointer. 514 */ 515 516 static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, 517 struct inode *pts_inode, int idx) 518 { 519 struct tty_struct *tty; 520 521 mutex_lock(&devpts_mutex); 522 tty = devpts_get_tty(pts_inode, idx); 523 mutex_unlock(&devpts_mutex); 524 /* Master must be open before slave */ 525 if (!tty) 526 return ERR_PTR(-EIO); 527 return tty; 528 } 529 530 static void pty_unix98_shutdown(struct tty_struct *tty) 531 { 532 tty_driver_remove_tty(tty->driver, tty); 533 /* We have our own method as we don't use the tty index */ 534 } 535 536 /* We have no need to install and remove our tty objects as devpts does all 537 the work for us */ 538 539 static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) 540 { 541 return pty_common_install(driver, tty, false); 542 } 543 544 static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) 545 { 546 } 547 548 static const struct tty_operations ptm_unix98_ops = { 549 .lookup = ptm_unix98_lookup, 550 .install = pty_unix98_install, 551 .remove = pty_unix98_remove, 552 .open = pty_open, 553 .close = pty_close, 554 .write = pty_write, 555 .write_room = pty_write_room, 556 .flush_buffer = pty_flush_buffer, 557 .chars_in_buffer = pty_chars_in_buffer, 558 .unthrottle = pty_unthrottle, 559 .set_termios = pty_set_termios, 560 .ioctl = pty_unix98_ioctl, 561 .shutdown = pty_unix98_shutdown, 562 .cleanup = pty_cleanup, 563 .resize = pty_resize 564 }; 565 566 static const struct tty_operations pty_unix98_ops = { 567 .lookup = pts_unix98_lookup, 568 .install = pty_unix98_install, 569 .remove = pty_unix98_remove, 570 .open = pty_open, 571 .close = pty_close, 572 .write = pty_write, 573 .write_room = pty_write_room, 574 .flush_buffer = pty_flush_buffer, 575 .chars_in_buffer = pty_chars_in_buffer, 576 .unthrottle = pty_unthrottle, 577 .set_termios = pty_set_termios, 578 .shutdown = pty_unix98_shutdown, 579 .cleanup = pty_cleanup, 580 }; 581 582 /** 583 * ptmx_open - open a unix 98 pty master 584 * @inode: inode of device file 585 * @filp: file pointer to tty 586 * 587 * Allocate a unix98 pty master device from the ptmx driver. 588 * 589 * Locking: tty_mutex protects the init_dev work. tty->count should 590 * protect the rest. 591 * allocated_ptys_lock handles the list of free pty numbers 592 */ 593 594 static int ptmx_open(struct inode *inode, struct file *filp) 595 { 596 struct tty_struct *tty; 597 int retval; 598 int index; 599 600 nonseekable_open(inode, filp); 601 602 retval = tty_alloc_file(filp); 603 if (retval) 604 return retval; 605 606 /* find a device that is not in use. */ 607 tty_lock(); 608 index = devpts_new_index(inode); 609 tty_unlock(); 610 if (index < 0) { 611 retval = index; 612 goto err_file; 613 } 614 615 mutex_lock(&tty_mutex); 616 mutex_lock(&devpts_mutex); 617 tty = tty_init_dev(ptm_driver, index); 618 mutex_unlock(&devpts_mutex); 619 tty_lock(); 620 mutex_unlock(&tty_mutex); 621 622 if (IS_ERR(tty)) { 623 retval = PTR_ERR(tty); 624 goto out; 625 } 626 627 set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ 628 629 tty_add_file(tty, filp); 630 631 retval = devpts_pty_new(inode, tty->link); 632 if (retval) 633 goto err_release; 634 635 retval = ptm_driver->ops->open(tty, filp); 636 if (retval) 637 goto err_release; 638 639 tty_unlock(); 640 return 0; 641 err_release: 642 tty_unlock(); 643 tty_release(inode, filp); 644 return retval; 645 out: 646 devpts_kill_index(inode, index); 647 tty_unlock(); 648 err_file: 649 tty_free_file(filp); 650 return retval; 651 } 652 653 static struct file_operations ptmx_fops; 654 655 static void __init unix98_pty_init(void) 656 { 657 ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX); 658 if (!ptm_driver) 659 panic("Couldn't allocate Unix98 ptm driver"); 660 pts_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX); 661 if (!pts_driver) 662 panic("Couldn't allocate Unix98 pts driver"); 663 664 ptm_driver->driver_name = "pty_master"; 665 ptm_driver->name = "ptm"; 666 ptm_driver->major = UNIX98_PTY_MASTER_MAJOR; 667 ptm_driver->minor_start = 0; 668 ptm_driver->type = TTY_DRIVER_TYPE_PTY; 669 ptm_driver->subtype = PTY_TYPE_MASTER; 670 ptm_driver->init_termios = tty_std_termios; 671 ptm_driver->init_termios.c_iflag = 0; 672 ptm_driver->init_termios.c_oflag = 0; 673 ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; 674 ptm_driver->init_termios.c_lflag = 0; 675 ptm_driver->init_termios.c_ispeed = 38400; 676 ptm_driver->init_termios.c_ospeed = 38400; 677 ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | 678 TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM; 679 ptm_driver->other = pts_driver; 680 tty_set_operations(ptm_driver, &ptm_unix98_ops); 681 682 pts_driver->driver_name = "pty_slave"; 683 pts_driver->name = "pts"; 684 pts_driver->major = UNIX98_PTY_SLAVE_MAJOR; 685 pts_driver->minor_start = 0; 686 pts_driver->type = TTY_DRIVER_TYPE_PTY; 687 pts_driver->subtype = PTY_TYPE_SLAVE; 688 pts_driver->init_termios = tty_std_termios; 689 pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; 690 pts_driver->init_termios.c_ispeed = 38400; 691 pts_driver->init_termios.c_ospeed = 38400; 692 pts_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | 693 TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM; 694 pts_driver->other = ptm_driver; 695 tty_set_operations(pts_driver, &pty_unix98_ops); 696 697 if (tty_register_driver(ptm_driver)) 698 panic("Couldn't register Unix98 ptm driver"); 699 if (tty_register_driver(pts_driver)) 700 panic("Couldn't register Unix98 pts driver"); 701 702 /* Now create the /dev/ptmx special device */ 703 tty_default_fops(&ptmx_fops); 704 ptmx_fops.open = ptmx_open; 705 706 cdev_init(&ptmx_cdev, &ptmx_fops); 707 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || 708 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) 709 panic("Couldn't register /dev/ptmx driver\n"); 710 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx"); 711 } 712 713 #else 714 static inline void unix98_pty_init(void) { } 715 #endif 716 717 static int __init pty_init(void) 718 { 719 legacy_pty_init(); 720 unix98_pty_init(); 721 return 0; 722 } 723 module_init(pty_init); 724