Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752909AbdFRJfl (ORCPT ); Sun, 18 Jun 2017 05:35:41 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35759 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752752AbdFRJfh (ORCPT ); Sun, 18 Jun 2017 05:35:37 -0400 Message-Id: <20170618093533.134956303@gmail.com> User-Agent: quilt/0.65 Date: Sun, 18 Jun 2017 09:58:26 +0100 From: Okash Khawaja To: Greg Kroah-Hartman , Jiri Slaby , Samuel Thibault , linux-kernel@vger.kernel.org Cc: William Hubbs , Chris Brannon , Kirk Reiser , speakup@linux-speakup.org, devel@driverdev.osuosl.org, Okash Khawaja Subject: [patch v2 1/3] tty: add function to convert device name to number References: <20170618085825.601359240@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=11_add_tty_dev_name_to_number Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2636 Lines: 86 The function converts strings like ttyS0 and ttyUSB0 to dev_t like (4, 64) and (188, 0). It does this by scanning tty_drivers list for corresponding device name and index. If the driver is not registered, this function returns -ENODEV. It also acquires tty_mutex. Signed-off-by: Okash Khawaja --- 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 @@ -401,6 +401,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) { } @@ -424,6 +425,9 @@ static inline const char *tty_name(const static inline struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, struct file *filp) { return NULL; } +static inline int tty_dev_name_to_number(char *dev_name, dev_t *dev_no) +{ return -ENOTSUPP; } + #endif extern struct ktermios tty_std_termios;