Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752731AbdFQKQv (ORCPT ); Sat, 17 Jun 2017 06:16:51 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:33798 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752289AbdFQKQt (ORCPT ); Sat, 17 Jun 2017 06:16:49 -0400 Date: Sat, 17 Jun 2017 11:16:44 +0100 From: Okash Khawaja To: Greg Kroah-Hartman Cc: Andy Shevchenko , Samuel Thibault , Jiri Slaby , "linux-kernel@vger.kernel.org" , devel@driverdev.osuosl.org, Kirk Reiser , speakup@linux-speakup.org, Chris Brannon Subject: Re: [patch 1/2] staging: speakup: add function to convert dev name to number Message-ID: <20170617101644.GA31565@sanghar> References: <20170613223702.534373529@gmail.com> <20170613224050.646277124@gmail.com> <20170614101326.GA7606@kroah.com> <20170614101541.GA8065@kroah.com> <20170614112609.uqpvl2z5aoi5jchc@var.youpi.perso.aquilenet.fr> <20170614114802.GA23345@kroah.com> <20170614121819.tob426qpysswg5g6@var.youpi.perso.aquilenet.fr> <20170614130418.GA1184@kroah.com> <20170615065251.GB372@sanghar> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="45Z9DzgjV8m4Oswq" Content-Disposition: inline In-Reply-To: <20170615065251.GB372@sanghar> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3323 Lines: 110 --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, On Thu, Jun 15, 2017 at 07:52:51AM +0100, Okash Khawaja wrote: > On Wed, Jun 14, 2017 at 03:04:18PM +0200, Greg Kroah-Hartman wrote: > > The console stuff is odd though, but that is each driver defining the > > name for itself, major/minor does not apply. Also, a separate driver is > > not having to figure this all out. I wonder if we could just add a tty > > core function for this as it does know the name of everything that has > > been registered with it, right? > > I can start working on a patch for this. I'm still new to the tty code > so will follow up with any questions I might have. I've put together this function for converting device name to number. It traverses tty_drivers list looking for corresponding dev name and index. Is this the right approach? Thanks, Okash --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=X_tty_dev_name_to_number --- drivers/tty/tty_io.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/tty.h | 4 ++++ 2 files changed, 49 insertions(+) --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -325,6 +325,51 @@ static struct tty_driver *get_tty_driver return NULL; } +/** + * tty_dev_name_to_number - return dev_t for device name + * @device_name: user space name of device under /dev + * @dev_no: pointer to dev_t that this function will populate + * + * This function converts device names like ttyS0 or ttyUSB1 into dev_t + * like (4, 64) or (188, 1). If no corresponding driver is registered then + * the function returns -ENODEV. + * + * Locking: this acquires tty_mutex + */ +int tty_dev_name_to_number(char *dev_name, dev_t *dev_no) +{ + struct tty_driver *p; + int rv, index, prefix_length = 0; + + while (!isdigit(*(dev_name + prefix_length)) && prefix_length < + strlen(dev_name) ) + prefix_length++; + + if (prefix_length == strlen(dev_name)) + return -EINVAL; + + mutex_lock(&tty_mutex); + + list_for_each_entry(p, &tty_drivers, tty_drivers) + if (prefix_length == strlen(p->name) && strncmp(dev_name, + p->name, prefix_length) == 0) { + rv = kstrtoint(dev_name + prefix_length, 10, &index); + if (rv) { + mutex_unlock(&tty_mutex); + return rv; + } + if (index < p->num) { + *dev_no = MKDEV(p->major, p->minor_start + index); + mutex_unlock(&tty_mutex); + return 0; + } + } + + mutex_unlock(&tty_mutex); + return -ENODEV; +} +EXPORT_SYMBOL_GPL(tty_dev_name_to_number); + #ifdef CONFIG_CONSOLE_POLL /** --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -402,6 +402,7 @@ 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); +extern int tty_dev_name_to_number(char *dev_name, dev_t *dev_no); #else static inline void tty_kref_put(struct tty_struct *tty) { } @@ -422,6 +423,9 @@ static inline int __init tty_init(void) { return 0; } static inline const char *tty_name(const struct tty_struct *tty) { return "(none)"; } +extern int tty_dev_name_to_number(char *dev_name, dev_t *dev_no) +{ return -ENOTSUPP; } + #endif extern struct ktermios tty_std_termios; --45Z9DzgjV8m4Oswq--