0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/console.h>
0010 #include <linux/module.h>
0011 #include <linux/tty.h>
0012
0013 static const struct tty_port_operations ttynull_port_ops;
0014 static struct tty_driver *ttynull_driver;
0015 static struct tty_port ttynull_port;
0016
0017 static int ttynull_open(struct tty_struct *tty, struct file *filp)
0018 {
0019 return tty_port_open(&ttynull_port, tty, filp);
0020 }
0021
0022 static void ttynull_close(struct tty_struct *tty, struct file *filp)
0023 {
0024 tty_port_close(&ttynull_port, tty, filp);
0025 }
0026
0027 static void ttynull_hangup(struct tty_struct *tty)
0028 {
0029 tty_port_hangup(&ttynull_port);
0030 }
0031
0032 static int ttynull_write(struct tty_struct *tty, const unsigned char *buf,
0033 int count)
0034 {
0035 return count;
0036 }
0037
0038 static unsigned int ttynull_write_room(struct tty_struct *tty)
0039 {
0040 return 65536;
0041 }
0042
0043 static const struct tty_operations ttynull_ops = {
0044 .open = ttynull_open,
0045 .close = ttynull_close,
0046 .hangup = ttynull_hangup,
0047 .write = ttynull_write,
0048 .write_room = ttynull_write_room,
0049 };
0050
0051 static struct tty_driver *ttynull_device(struct console *c, int *index)
0052 {
0053 *index = 0;
0054 return ttynull_driver;
0055 }
0056
0057 static struct console ttynull_console = {
0058 .name = "ttynull",
0059 .device = ttynull_device,
0060 };
0061
0062 static int __init ttynull_init(void)
0063 {
0064 struct tty_driver *driver;
0065 int ret;
0066
0067 driver = tty_alloc_driver(1,
0068 TTY_DRIVER_RESET_TERMIOS |
0069 TTY_DRIVER_REAL_RAW |
0070 TTY_DRIVER_UNNUMBERED_NODE);
0071 if (IS_ERR(driver))
0072 return PTR_ERR(driver);
0073
0074 tty_port_init(&ttynull_port);
0075 ttynull_port.ops = &ttynull_port_ops;
0076
0077 driver->driver_name = "ttynull";
0078 driver->name = "ttynull";
0079 driver->type = TTY_DRIVER_TYPE_CONSOLE;
0080 driver->init_termios = tty_std_termios;
0081 driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET;
0082 tty_set_operations(driver, &ttynull_ops);
0083 tty_port_link_device(&ttynull_port, driver, 0);
0084
0085 ret = tty_register_driver(driver);
0086 if (ret < 0) {
0087 tty_driver_kref_put(driver);
0088 tty_port_destroy(&ttynull_port);
0089 return ret;
0090 }
0091
0092 ttynull_driver = driver;
0093 register_console(&ttynull_console);
0094
0095 return 0;
0096 }
0097
0098 static void __exit ttynull_exit(void)
0099 {
0100 unregister_console(&ttynull_console);
0101 tty_unregister_driver(ttynull_driver);
0102 tty_driver_kref_put(ttynull_driver);
0103 tty_port_destroy(&ttynull_port);
0104 }
0105
0106 module_init(ttynull_init);
0107 module_exit(ttynull_exit);
0108
0109 MODULE_LICENSE("GPL v2");