From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by befuddled.reisers.ca (Postfix, from userid 65534) id 9AF1E1EFCBB; Sun, 11 Dec 2016 15:22:53 -0500 (EST) Received: from hera.aquilenet.fr (hera.aquilenet.fr [141.255.128.1]) by befuddled.reisers.ca (Postfix) with ESMTP id D71121EFAF6 for ; Sun, 11 Dec 2016 15:22:50 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 361CCA42A; Sun, 11 Dec 2016 21:22:46 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id huIekY_3h2vp; Sun, 11 Dec 2016 21:22:45 +0100 (CET) Received: from var.youpi.perso.aquilenet.fr (unknown [IPv6:2a01:cb19:181:c200:3602:86ff:fe2c:6a19]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 136A9A416; Sun, 11 Dec 2016 21:22:45 +0100 (CET) Received: from samy by var.youpi.perso.aquilenet.fr with local (Exim 4.88) (envelope-from ) id 1cGAdw-0007hP-Ed; Sun, 11 Dec 2016 21:22:44 +0100 Date: Sun, 11 Dec 2016 21:22:44 +0100 From: Samuel Thibault To: Okash Khawaja Cc: "Speakup is a screen review system for Linux." Subject: Re: Line discipline Message-ID: <20161211202244.GU3884@var.home> References: <20161121223631.GY2755@var.home> <20161123145659.GB3012@var.bordeaux.inria.fr> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="8tZVdKiiYitVG083" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: speakup@linux-speakup.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Speakup is a screen review system for Linux." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Dec 2016 20:22:53 -0000 --8tZVdKiiYitVG083 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hello, Okash Khawaja, on Sun 27 Nov 2016 20:41:50 +0000, wrote: > Thanks for explanation. I have not been able to work on this recently - pulled > away for something urgent. As soon as it's over, I'll be back on it. Probably > third week of December. I've taken some time to have a look, I have attached the result: - tty_NULL is a patch against the kernel to make tty functions accept being called with filp == NULL - mymodule.tgz is a dumb module which opens ttyS0 (major 4 minor 64), and writes to it through the tty write operation. So this, combined with your work on the line discipline, should get something working, and opening other serial ports (e.g. ttyUSB0) is a matter of changing the major/minor pair (e.g. 188, 0). Samuel --8tZVdKiiYitVG083 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=tty_NULL Index: linux-4.8/drivers/tty/tty_port.c =================================================================== --- linux-4.8.orig/drivers/tty/tty_port.c +++ linux-4.8/drivers/tty/tty_port.c @@ -335,7 +335,7 @@ EXPORT_SYMBOL(tty_port_lower_dtr_rts); * tty_port_block_til_ready - Waiting logic for tty open * @port: the tty port being opened * @tty: the tty device being bound - * @filp: the file pointer of the opener + * @filp: the file pointer of the opener or NULL * * Implement the core POSIX/SuS tty behaviour when opening a tty device. * Handles: @@ -369,7 +369,7 @@ int tty_port_block_til_ready(struct tty_ tty_port_set_active(port, 1); return 0; } - if (filp->f_flags & O_NONBLOCK) { + if (filp == NULL || filp->f_flags & O_NONBLOCK) { /* Indicate we are open */ if (C_BAUD(tty)) tty_port_raise_dtr_rts(port); Index: linux-4.8/drivers/tty/tty_io.c =================================================================== --- linux-4.8.orig/drivers/tty/tty_io.c +++ linux-4.8/drivers/tty/tty_io.c @@ -855,7 +855,7 @@ static void tty_vhangup_session(struct t int tty_hung_up_p(struct file *filp) { - return (filp->f_op == &hung_up_tty_fops); + return (filp && filp->f_op == &hung_up_tty_fops); } EXPORT_SYMBOL(tty_hung_up_p); @@ -1368,7 +1368,10 @@ static struct tty_struct *tty_driver_loo struct tty_struct *tty; if (driver->ops->lookup) - tty = driver->ops->lookup(driver, file, idx); + if (!file) + tty = ERR_PTR(-EIO); + else + tty = driver->ops->lookup(driver, file, idx); else tty = driver->ttys[idx]; @@ -1986,7 +1989,7 @@ static struct tty_driver *tty_lookup_dri struct tty_driver *console_driver = console_device(index); if (console_driver) { driver = tty_driver_kref_get(console_driver); - if (driver) { + if (driver && filp) { /* Don't let /dev/console block */ filp->f_flags |= O_NONBLOCK; break; @@ -2019,7 +2022,7 @@ static struct tty_driver *tty_lookup_dri * - concurrent tty driver removal w/ lookup * - concurrent tty removal from driver table */ -static struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, +struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, struct file *filp) { struct tty_struct *tty; @@ -2064,6 +2067,7 @@ out: tty_driver_kref_put(driver); return tty; } +EXPORT_SYMBOL(tty_open_by_driver); /** * tty_open - open a tty device Index: linux-4.8/include/linux/tty.h =================================================================== --- linux-4.8.orig/include/linux/tty.h +++ linux-4.8/include/linux/tty.h @@ -394,6 +394,8 @@ extern struct tty_struct *get_current_tt /* tty_io.c */ extern int __init tty_init(void); extern const char *tty_name(const struct tty_struct *tty); +extern struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, + struct file *filp); #else static inline void console_init(void) { } --8tZVdKiiYitVG083--