|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | #include <linux/types.h> | 
|  | #include <linux/errno.h> | 
|  | #include <linux/tty.h> | 
|  | #include <linux/module.h> | 
|  |  | 
|  | /* | 
|  | *  n_null.c - Null line discipline used in the failure path | 
|  | * | 
|  | *  Copyright (C) Intel 2017 | 
|  | */ | 
|  |  | 
|  | static int n_null_open(struct tty_struct *tty) | 
|  | { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void n_null_close(struct tty_struct *tty) | 
|  | { | 
|  | } | 
|  |  | 
|  | static ssize_t n_null_read(struct tty_struct *tty, struct file *file, | 
|  | unsigned char __user * buf, size_t nr) | 
|  | { | 
|  | return -EOPNOTSUPP; | 
|  | } | 
|  |  | 
|  | static ssize_t n_null_write(struct tty_struct *tty, struct file *file, | 
|  | const unsigned char *buf, size_t nr) | 
|  | { | 
|  | return -EOPNOTSUPP; | 
|  | } | 
|  |  | 
|  | static void n_null_receivebuf(struct tty_struct *tty, | 
|  | const unsigned char *cp, char *fp, | 
|  | int cnt) | 
|  | { | 
|  | } | 
|  |  | 
|  | static struct tty_ldisc_ops null_ldisc = { | 
|  | .owner		=	THIS_MODULE, | 
|  | .magic		=	TTY_LDISC_MAGIC, | 
|  | .name		=	"n_null", | 
|  | .open		=	n_null_open, | 
|  | .close		=	n_null_close, | 
|  | .read		=	n_null_read, | 
|  | .write		=	n_null_write, | 
|  | .receive_buf	=	n_null_receivebuf | 
|  | }; | 
|  |  | 
|  | static int __init n_null_init(void) | 
|  | { | 
|  | BUG_ON(tty_register_ldisc(N_NULL, &null_ldisc)); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void __exit n_null_exit(void) | 
|  | { | 
|  | tty_unregister_ldisc(N_NULL); | 
|  | } | 
|  |  | 
|  | module_init(n_null_init); | 
|  | module_exit(n_null_exit); | 
|  |  | 
|  | MODULE_LICENSE("GPL"); | 
|  | MODULE_AUTHOR("Alan Cox"); | 
|  | MODULE_ALIAS_LDISC(N_NULL); | 
|  | MODULE_DESCRIPTION("Null ldisc driver"); |