Path: csiph.com!eternal-september.org!feeder.eternal-september.org!aioe.org!bofh.it!news.nic.it!robomod From: Okash Khawaja Newsgroups: linux.kernel Subject: [patch v4 1/3] tty: add function to convert device name to number Date: Sun, 25 Jun 2017 20:50:02 +0200 Message-ID: References: X-Original-To: Greg Kroah-Hartman , Jiri Slaby , Samuel Thibault , Andy Shevchenko , linux-kernel@vger.kernel.org Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:user-agent:date:from:to:cc:subject:references :mime-version:content-disposition; bh=TqkMNYwdwtiPxvXUrfswr7m2DQyMhYFvZz8hopn1dME=; b=myZyc0+W4NoPM7SOoFAiJIUwzbh8bsnwcFuuZ8XAgKt35MVXIPVWaccDD4KrRjl1/K TCqhwxlr1/vCH6U+XyDLkJysG1u+DrlqSWVqinGdpfzXL6DIZ4U+xcg3LEeaA8Go5tbp rz4WCXv4xju5BDCWBUw8UErl4thTueDIsn7BcaZ9gWngIOqCRf9HCfmpra5AcpngIMK9 wPy92V3ZBAVgdDhNpj3lWwL1lfIw0Z7lujYmU5QYXrJjBlEwwxzXhfVM5r2t2FuZTm+w rDvNQWBl55P0XIKUWUQfKoa/5CzMUUZHEi2OdKS8WSvqK+Aruurn5mOOwt1ksWOu3eoi mEFg== X-Google-Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:user-agent:date:from:to:cc:subject :references:mime-version:content-disposition; bh=TqkMNYwdwtiPxvXUrfswr7m2DQyMhYFvZz8hopn1dME=; b=QUvVgobf6bGI7mMYyO+X/QxBl7khCBwlFm62GCkJJTesf9DQA+uj5LaEN8kEyWgwXs PfFsjz/5nsKiZPT18foZbl1bXFugEFpc/xJtEjsw4WOowxk767nvNrNGwLxUtBoHFAqd X85lGB0S9gvvil/b/nz3MUL76PZm+qixNMt7PNVcMl6GCzez1RJKnYZEBKkruWyymuah nNWD6+e2PxddTCWBWgLchi0WRvG/rqrFaCwO8X+ok2sQKzNEvzhgJt8URfqtMMJ0sdfs w/n51PFuqmwH4YMXlmLMp8uywhQKu2JI2pnbS9jJZmG0sWwqVbAlofEKY8NZgztlUU0p bwxA== X-Gm-Message-State: AKS2vOz1i7RygCLMUE65QgrLtdoGeu0+jal/FeNEk424lmuVQLb6iTH3 uBA3jATNraWq8A== X-Received: by 10.223.174.147 with SMTP id y19mr12347508wrc.155.1498416340161; Sun, 25 Jun 2017 11:45:40 -0700 (PDT) User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=11_add_tty_dev_name_to_number Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 90 Organization: linux.* mail to news gateway X-Original-Cc: William Hubbs , Chris Brannon , Kirk Reiser , speakup@linux-speakup.org, devel@driverdev.osuosl.org, Okash Khawaja X-Original-Date: Sun, 25 Jun 2017 19:40:00 +0100 X-Original-Message-ID: <20170625184537.542785701@gmail.com> X-Original-References: <20170625181353.GA10487@kroah.com> <20170625183959.270640619@gmail.com> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1674281 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 | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/tty.h | 3 +++ 2 files changed, 53 insertions(+) --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -325,6 +325,56 @@ static struct tty_driver *get_tty_driver return NULL; } +/** + * tty_dev_name_to_number - return dev_t for device name + * @name: user space name of device under /dev + * @number: 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 to protect the tty_drivers list from + * being modified while we are traversing it, and makes sure to + * release it before exiting. + */ +int tty_dev_name_to_number(const char *name, dev_t *number) +{ + struct tty_driver *p; + int ret; + int index, prefix_length = 0; + const char *str; + + for (str = name; *str && !isdigit(*str); str++) + ; + + if (!*str) + return -EINVAL; + + ret = kstrtoint(str, 10, &index); + if (ret) + return ret; + + prefix_length = str - name; + mutex_lock(&tty_mutex); + + list_for_each_entry(p, &tty_drivers, tty_drivers) + if (prefix_length == strlen(p->name) && strncmp(name, + p->name, prefix_length) == 0) { + if (index < p->num) { + *number = MKDEV(p->major, p->minor_start + index); + goto out; + } + } + + /* if here then driver wasn't found */ + ret = -ENODEV; +out: + mutex_unlock(&tty_mutex); + return ret; +} +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(const char *name, dev_t *number); #else static inline void tty_kref_put(struct tty_struct *tty) { } @@ -424,6 +425,8 @@ 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(const char *name, dev_t *number) +{ return -ENOTSUPP; } #endif extern struct ktermios tty_std_termios;