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
--- 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;
_______________________________________________ Speakup mailing list Speakup@xxxxxxxxxxxxxxxxx http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup