162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/types.h>
362306a36Sopenharmony_ci#include <linux/errno.h>
462306a36Sopenharmony_ci#include <linux/tty.h>
562306a36Sopenharmony_ci#include <linux/module.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci *  n_null.c - Null line discipline used in the failure path
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci *  Copyright (C) Intel 2017
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic ssize_t n_null_read(struct tty_struct *tty, struct file *file, u8 *buf,
1462306a36Sopenharmony_ci			   size_t nr, void **cookie, unsigned long offset)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	return -EOPNOTSUPP;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic ssize_t n_null_write(struct tty_struct *tty, struct file *file,
2062306a36Sopenharmony_ci			    const u8 *buf, size_t nr)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	return -EOPNOTSUPP;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic struct tty_ldisc_ops null_ldisc = {
2662306a36Sopenharmony_ci	.owner		=	THIS_MODULE,
2762306a36Sopenharmony_ci	.num		=	N_NULL,
2862306a36Sopenharmony_ci	.name		=	"n_null",
2962306a36Sopenharmony_ci	.read		=	n_null_read,
3062306a36Sopenharmony_ci	.write		=	n_null_write,
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic int __init n_null_init(void)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	BUG_ON(tty_register_ldisc(&null_ldisc));
3662306a36Sopenharmony_ci	return 0;
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic void __exit n_null_exit(void)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	tty_unregister_ldisc(&null_ldisc);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cimodule_init(n_null_init);
4562306a36Sopenharmony_cimodule_exit(n_null_exit);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciMODULE_LICENSE("GPL");
4862306a36Sopenharmony_ciMODULE_AUTHOR("Alan Cox");
4962306a36Sopenharmony_ciMODULE_ALIAS_LDISC(N_NULL);
5062306a36Sopenharmony_ciMODULE_DESCRIPTION("Null ldisc driver");
51