Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1665261 > unrolled thread

[patch 1/2] staging: speakup: add function to convert dev name to number

Started byokash.khawaja@gmail.com
First post2017-06-14 00:50 +0200
Last post2017-06-14 13:50 +0200
Articles 15 — 6 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [patch 1/2] staging: speakup: add function to convert dev name to number okash.khawaja@gmail.com - 2017-06-14 00:50 +0200
    Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Dan Carpenter <dan.carpenter@oracle.com> - 2017-06-14 12:00 +0200
      Re: [patch 1/2] staging: speakup: add function to convert dev name to number Okash Khawaja <okash.khawaja@gmail.com> - 2017-06-15 10:20 +0200
    Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2017-06-14 12:20 +0200
      Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2017-06-14 12:20 +0200
        Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2017-06-14 13:50 +0200
          Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-06-14 14:30 +0200
            Re: [patch 1/2] staging: speakup: add function to convert dev name to number Andy Shevchenko <andy.shevchenko@gmail.com> - 2017-06-14 14:40 +0200
              Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-06-14 15:00 +0200
              Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2017-06-14 15:10 +0200
                Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Okash Khawaja <okash.khawaja@gmail.com> - 2017-06-15 09:00 +0200
                  Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Okash Khawaja <okash.khawaja@gmail.com> - 2017-06-17 12:20 +0200
                    Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2017-06-17 12:30 +0200
                      Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Okash Khawaja <okash.khawaja@gmail.com> - 2017-06-17 13:00 +0200
        Re: [patch 1/2] staging: speakup: add function to convert dev name  to number Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-06-14 13:50 +0200

#1665261 — [patch 1/2] staging: speakup: add function to convert dev name to number

Fromokash.khawaja@gmail.com
Date2017-06-14 00:50 +0200
Subject[patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tS2Nj-5pl-5@gated-at.bofh.it>
The function converts strings like ttyS0 and ttyUSB0 to dev_t like
(4, 64) and (188, 0). Subsequent patch in this set will call it to
convert user-supplied device into device number. The function does
some basic sanity checks on the string passed in. It currently supports
ttyS*, ttyUSB* and, for selected synths, lp*.

In order to do this, the patch also introduces a string member variable
named 'dev' to struct spk_synth. 'dev' represents the device name -
ttyUSB0 etc - which needs conversion to dev_t.

Signed-off-by: Okash Khawaja <okash.khawaja@gmail.com>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

---
 drivers/staging/speakup/spk_priv.h  |    2 
 drivers/staging/speakup/spk_ttyio.c |  105 ++++++++++++++++++++++++++++++++++++
 drivers/staging/speakup/spk_types.h |    1 
 3 files changed, 108 insertions(+)

--- a/drivers/staging/speakup/spk_priv.h
+++ b/drivers/staging/speakup/spk_priv.h
@@ -40,6 +40,8 @@
 
 #define KT_SPKUP 15
 #define SPK_SYNTH_TIMEOUT 100000 /* in micro-seconds */
+#define SYNTH_DEFAULT_DEV "ttyS0"
+#define SYNTH_DEFAULT_SER 0
 
 const struct old_serial_port *spk_serial_init(int index);
 void spk_stop_serial_interrupt(void);
--- a/drivers/staging/speakup/spk_ttyio.c
+++ b/drivers/staging/speakup/spk_ttyio.c
@@ -7,6 +7,13 @@
 #include "spk_types.h"
 #include "spk_priv.h"
 
+/* Supported device types */
+#define DEV_PREFIX_TTYS "ttyS"
+#define DEV_PREFIX_TTYUSB "ttyUSB"
+#define DEV_PREFIX_LP "lp"
+
+const char *lp_supported[] = { "acntsa", "bns", "dummy", "txprt" };
+
 struct spk_ldisc_data {
 	char buf;
 	struct semaphore sem;
@@ -16,6 +23,104 @@ struct spk_ldisc_data {
 static struct spk_synth *spk_ttyio_synth;
 static struct tty_struct *speakup_tty;
 
+static int name_to_dev(const char *name, dev_t *dev_no)
+{
+        int maj = -1, min = -1;
+
+        if (strncmp(name, DEV_PREFIX_TTYS, strlen(DEV_PREFIX_TTYS)) == 0) {
+                if (kstrtoint(name + strlen(DEV_PREFIX_TTYS), 10, &min)) {
+			pr_err("speakup: Invalid ser param. Must be \
+					between 0 and 191 inclusive.\n");
+                        return -EINVAL;
+                }
+                maj = 4;
+
+                if (min < 0 || min > 191) {
+			pr_err("speakup: Invalid ser param. Must be \
+					between 0 and 191 inclusive.\n");
+                        return -EINVAL;
+                }
+                min = min + 64;
+        } else if (strncmp(name, DEV_PREFIX_TTYUSB, strlen(DEV_PREFIX_TTYUSB))
+			== 0) {
+                if (kstrtoint(name + strlen(DEV_PREFIX_TTYUSB), 10, &min)) {
+                        pr_err("speakup: Invalid ttyUSB number. \
+					Must be a number from 0 onwards\n");
+                        return -EINVAL;
+                }
+                maj = 188;
+
+                if (min < 0) {
+                        pr_err("speakup: Invalid ttyUSB number. \
+					Must be a number from 0 onwards\n");
+                        return -EINVAL;
+                }
+        } else if (strncmp(name, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
+                if (kstrtoint(name + strlen(DEV_PREFIX_LP), 10, &min)) {
+                        pr_warn("speakup: Invalid lp number. \
+					Must be a number from 0 onwards\n");
+                        return -EINVAL;
+                }
+                maj = 6;
+
+                if (min < 0) {
+                        pr_warn("speakup: Invalid lp number. \
+					Must be a number from 0 onwards\n");
+                        return -EINVAL;
+                }
+        }
+
+        if (maj == -1 || min == -1)
+                return -EINVAL;
+
+        /* if here, maj and min must be valid */
+        *dev_no = MKDEV(maj, min);
+
+        return 0;
+}
+
+int ser_to_dev(int ser, dev_t *dev_no)
+{
+	if (ser < 0 || ser > (255 - 64)) {
+                pr_err("speakup: Invalid ser param. \
+				Must be between 0 and 191 inclusive.\n");
+
+		return -EINVAL;
+        }
+
+	*dev_no = MKDEV(4, (64 + ser));
+	return 0;
+}
+
+static int get_dev_to_use(struct spk_synth *synth, dev_t *dev_no)
+{
+	/* use ser only when dev is not specified */
+	if (strcmp(synth->dev, SYNTH_DEFAULT_DEV) || synth->ser == SYNTH_DEFAULT_SER) {
+		/* for /dev/lp* check if synth is supported */
+		if (strncmp(synth->dev, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
+			int i;
+
+			for (i = 0; i < ARRAY_SIZE(lp_supported); i++) {
+				if (strcmp(synth->name, lp_supported[i]) == 0)
+					break;
+			}
+
+			if (i >= ARRAY_SIZE(lp_supported)) {
+				pr_err("speakup: lp* is only supported on:");
+				for (i = 0; i < ARRAY_SIZE(lp_supported); i++)
+					pr_cont(" %s", lp_supported[i]);
+				pr_cont("\n");
+
+				return -ENOTSUPP;
+			}
+		}
+
+		return name_to_dev(synth->dev, dev_no);
+	}
+
+	return ser_to_dev(synth->ser, dev_no);
+}
+
 static int spk_ttyio_ldisc_open(struct tty_struct *tty)
 {
 	struct spk_ldisc_data *ldisc_data;
--- a/drivers/staging/speakup/spk_types.h
+++ b/drivers/staging/speakup/spk_types.h
@@ -169,6 +169,7 @@ struct spk_synth {
 	int jiffies;
 	int full;
 	int ser;
+	char *dev;
 	short flags;
 	short startup;
 	const int checkval; /* for validating a proper synth module */

[toc] | [next] | [standalone]


#1665662 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromDan Carpenter <dan.carpenter@oracle.com>
Date2017-06-14 12:00 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSdfI-3xZ-25@gated-at.bofh.it>
In reply to#1665261
On Tue, Jun 13, 2017 at 11:37:03PM +0100, okash.khawaja@gmail.com wrote:
> The function converts strings like ttyS0 and ttyUSB0 to dev_t like
> (4, 64) and (188, 0). Subsequent patch in this set will call it to
> convert user-supplied device into device number. The function does
> some basic sanity checks on the string passed in. It currently supports
> ttyS*, ttyUSB* and, for selected synths, lp*.
> 
> In order to do this, the patch also introduces a string member variable
> named 'dev' to struct spk_synth. 'dev' represents the device name -
> ttyUSB0 etc - which needs conversion to dev_t.
> 
> Signed-off-by: Okash Khawaja <okash.khawaja@gmail.com>
> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> ---
>  drivers/staging/speakup/spk_priv.h  |    2 
>  drivers/staging/speakup/spk_ttyio.c |  105 ++++++++++++++++++++++++++++++++++++
>  drivers/staging/speakup/spk_types.h |    1 
>  3 files changed, 108 insertions(+)
> 
> --- a/drivers/staging/speakup/spk_priv.h
> +++ b/drivers/staging/speakup/spk_priv.h
> @@ -40,6 +40,8 @@
>  
>  #define KT_SPKUP 15
>  #define SPK_SYNTH_TIMEOUT 100000 /* in micro-seconds */
> +#define SYNTH_DEFAULT_DEV "ttyS0"
> +#define SYNTH_DEFAULT_SER 0
>  
>  const struct old_serial_port *spk_serial_init(int index);
>  void spk_stop_serial_interrupt(void);
> --- a/drivers/staging/speakup/spk_ttyio.c
> +++ b/drivers/staging/speakup/spk_ttyio.c
> @@ -7,6 +7,13 @@
>  #include "spk_types.h"
>  #include "spk_priv.h"
>  
> +/* Supported device types */
> +#define DEV_PREFIX_TTYS "ttyS"
> +#define DEV_PREFIX_TTYUSB "ttyUSB"
> +#define DEV_PREFIX_LP "lp"
> +
> +const char *lp_supported[] = { "acntsa", "bns", "dummy", "txprt" };
> +
>  struct spk_ldisc_data {
>  	char buf;
>  	struct semaphore sem;
> @@ -16,6 +23,104 @@ struct spk_ldisc_data {
>  static struct spk_synth *spk_ttyio_synth;
>  static struct tty_struct *speakup_tty;
>  
> +static int name_to_dev(const char *name, dev_t *dev_no)
> +{
> +        int maj = -1, min = -1;
> +
> +        if (strncmp(name, DEV_PREFIX_TTYS, strlen(DEV_PREFIX_TTYS)) == 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYS), 10, &min)) {
> +			pr_err("speakup: Invalid ser param. Must be \
> +					between 0 and 191 inclusive.\n");

String needs fixed.

> +                        return -EINVAL;

Preserve the error code from kstrtoint().

> +                }
> +                maj = 4;
> +
> +                if (min < 0 || min > 191) {
> +			pr_err("speakup: Invalid ser param. Must be \
> +					between 0 and 191 inclusive.\n");


This too.

> +                        return -EINVAL;
> +                }
> +                min = min + 64;
> +        } else if (strncmp(name, DEV_PREFIX_TTYUSB, strlen(DEV_PREFIX_TTYUSB))
> +			== 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYUSB), 10, &min)) {
> +                        pr_err("speakup: Invalid ttyUSB number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;

Same.

> +                }
> +                maj = 188;
> +
> +                if (min < 0) {
> +                        pr_err("speakup: Invalid ttyUSB number. \
> +					Must be a number from 0 onwards\n");

Same.

> +                        return -EINVAL;
> +                }
> +        } else if (strncmp(name, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_LP), 10, &min)) {
> +                        pr_warn("speakup: Invalid lp number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;

Same.  Preserve.

> +                }
> +                maj = 6;
> +
> +                if (min < 0) {
> +                        pr_warn("speakup: Invalid lp number. \
> +					Must be a number from 0 onwards\n");

Again.

> +                        return -EINVAL;
> +                }
> +        }
> +
> +        if (maj == -1 || min == -1)
> +                return -EINVAL;
> +
> +        /* if here, maj and min must be valid */
> +        *dev_no = MKDEV(maj, min);
> +
> +        return 0;
> +}
> +
> +int ser_to_dev(int ser, dev_t *dev_no)
> +{
> +	if (ser < 0 || ser > (255 - 64)) {
> +                pr_err("speakup: Invalid ser param. \
> +				Must be between 0 and 191 inclusive.\n");

String.  I feel like 191 and 255 - 64 are the same.  Let's just use 191
everywhere.

> +
> +		return -EINVAL;
> +        }
> +
> +	*dev_no = MKDEV(4, (64 + ser));
> +	return 0;
> +}
> +
> +static int get_dev_to_use(struct spk_synth *synth, dev_t *dev_no)
> +{
> +	/* use ser only when dev is not specified */
> +	if (strcmp(synth->dev, SYNTH_DEFAULT_DEV) || synth->ser == SYNTH_DEFAULT_SER) {
> +		/* for /dev/lp* check if synth is supported */
> +		if (strncmp(synth->dev, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
> +			int i;
> +
> +			for (i = 0; i < ARRAY_SIZE(lp_supported); i++) {
> +				if (strcmp(synth->name, lp_supported[i]) == 0)
> +					break;
> +			}
> +
> +			if (i >= ARRAY_SIZE(lp_supported)) {
> +				pr_err("speakup: lp* is only supported on:");
> +				for (i = 0; i < ARRAY_SIZE(lp_supported); i++)
> +					pr_cont(" %s", lp_supported[i]);
> +				pr_cont("\n");
> +
> +				return -ENOTSUPP;
> +			}
> +		}
> +
> +		return name_to_dev(synth->dev, dev_no);
> +	}
> +
> +	return ser_to_dev(synth->ser, dev_no);
> +}
> +
>  static int spk_ttyio_ldisc_open(struct tty_struct *tty)
>  {
>  	struct spk_ldisc_data *ldisc_data;
> --- a/drivers/staging/speakup/spk_types.h
> +++ b/drivers/staging/speakup/spk_types.h
> @@ -169,6 +169,7 @@ struct spk_synth {
>  	int jiffies;
>  	int full;
>  	int ser;
> +	char *dev;

Could you call it "dev_name" instead?  I normally expect "dev" to be a
device struct.

regards,
dan carpenter

[toc] | [prev] | [next] | [standalone]


#1666549

FromOkash Khawaja <okash.khawaja@gmail.com>
Date2017-06-15 10:20 +0200
Message-ID<tSyat-8uk-9@gated-at.bofh.it>
In reply to#1665662
Hi,

On Wed, Jun 14, 2017 at 9:23 AM, Dan Carpenter <dan.carpenter@oracle.com> wrote:
[...]
>
> Could you call it "dev_name" instead?  I normally expect "dev" to be a
> device struct.

Thanks for the feedback. Will keep these in mind for next version of the patch.

Okash

[toc] | [prev] | [next] | [standalone]


#1665676 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2017-06-14 12:20 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSdz4-3TR-21@gated-at.bofh.it>
In reply to#1665261
On Tue, Jun 13, 2017 at 11:37:03PM +0100, okash.khawaja@gmail.com wrote:
> The function converts strings like ttyS0 and ttyUSB0 to dev_t like
> (4, 64) and (188, 0). Subsequent patch in this set will call it to
> convert user-supplied device into device number. The function does
> some basic sanity checks on the string passed in. It currently supports
> ttyS*, ttyUSB* and, for selected synths, lp*.
> 
> In order to do this, the patch also introduces a string member variable
> named 'dev' to struct spk_synth. 'dev' represents the device name -
> ttyUSB0 etc - which needs conversion to dev_t.
> 
> Signed-off-by: Okash Khawaja <okash.khawaja@gmail.com>
> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> ---
>  drivers/staging/speakup/spk_priv.h  |    2 
>  drivers/staging/speakup/spk_ttyio.c |  105 ++++++++++++++++++++++++++++++++++++
>  drivers/staging/speakup/spk_types.h |    1 
>  3 files changed, 108 insertions(+)
> 
> --- a/drivers/staging/speakup/spk_priv.h
> +++ b/drivers/staging/speakup/spk_priv.h
> @@ -40,6 +40,8 @@
>  
>  #define KT_SPKUP 15
>  #define SPK_SYNTH_TIMEOUT 100000 /* in micro-seconds */
> +#define SYNTH_DEFAULT_DEV "ttyS0"
> +#define SYNTH_DEFAULT_SER 0
>  
>  const struct old_serial_port *spk_serial_init(int index);
>  void spk_stop_serial_interrupt(void);
> --- a/drivers/staging/speakup/spk_ttyio.c
> +++ b/drivers/staging/speakup/spk_ttyio.c
> @@ -7,6 +7,13 @@
>  #include "spk_types.h"
>  #include "spk_priv.h"
>  
> +/* Supported device types */
> +#define DEV_PREFIX_TTYS "ttyS"
> +#define DEV_PREFIX_TTYUSB "ttyUSB"
> +#define DEV_PREFIX_LP "lp"
> +
> +const char *lp_supported[] = { "acntsa", "bns", "dummy", "txprt" };
> +
>  struct spk_ldisc_data {
>  	char buf;
>  	struct semaphore sem;
> @@ -16,6 +23,104 @@ struct spk_ldisc_data {
>  static struct spk_synth *spk_ttyio_synth;
>  static struct tty_struct *speakup_tty;
>  
> +static int name_to_dev(const char *name, dev_t *dev_no)
> +{
> +        int maj = -1, min = -1;
> +
> +        if (strncmp(name, DEV_PREFIX_TTYS, strlen(DEV_PREFIX_TTYS)) == 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYS), 10, &min)) {
> +			pr_err("speakup: Invalid ser param. Must be \
> +					between 0 and 191 inclusive.\n");
> +                        return -EINVAL;
> +                }
> +                maj = 4;
> +
> +                if (min < 0 || min > 191) {
> +			pr_err("speakup: Invalid ser param. Must be \
> +					between 0 and 191 inclusive.\n");
> +                        return -EINVAL;
> +                }
> +                min = min + 64;
> +        } else if (strncmp(name, DEV_PREFIX_TTYUSB, strlen(DEV_PREFIX_TTYUSB))
> +			== 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYUSB), 10, &min)) {
> +                        pr_err("speakup: Invalid ttyUSB number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;
> +                }
> +                maj = 188;
> +
> +                if (min < 0) {
> +                        pr_err("speakup: Invalid ttyUSB number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;
> +                }
> +        } else if (strncmp(name, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
> +                if (kstrtoint(name + strlen(DEV_PREFIX_LP), 10, &min)) {
> +                        pr_warn("speakup: Invalid lp number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;
> +                }
> +                maj = 6;
> +
> +                if (min < 0) {
> +                        pr_warn("speakup: Invalid lp number. \
> +					Must be a number from 0 onwards\n");
> +                        return -EINVAL;
> +                }
> +        }
> +
> +        if (maj == -1 || min == -1)
> +                return -EINVAL;
> +
> +        /* if here, maj and min must be valid */
> +        *dev_no = MKDEV(maj, min);
> +
> +        return 0;
> +}

Eeek, no, let's never try to parse strings like this and "figure out"
what major/minor number it is.  That's madness and will break if we ever
make all char majors dynamic (there's a thread on lkml about that.)

Why would the kernel need to know major/minor?  Is it going to open a
device node?  If so, again, crazy stuff, that's not good...

thanks,

greg k-h

[toc] | [prev] | [next] | [standalone]


#1665677 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2017-06-14 12:20 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSdz4-3TR-19@gated-at.bofh.it>
In reply to#1665676
On Wed, Jun 14, 2017 at 12:13:26PM +0200, Greg Kroah-Hartman wrote:
> On Tue, Jun 13, 2017 at 11:37:03PM +0100, okash.khawaja@gmail.com wrote:
> > The function converts strings like ttyS0 and ttyUSB0 to dev_t like
> > (4, 64) and (188, 0). Subsequent patch in this set will call it to
> > convert user-supplied device into device number. The function does
> > some basic sanity checks on the string passed in. It currently supports
> > ttyS*, ttyUSB* and, for selected synths, lp*.
> > 
> > In order to do this, the patch also introduces a string member variable
> > named 'dev' to struct spk_synth. 'dev' represents the device name -
> > ttyUSB0 etc - which needs conversion to dev_t.
> > 
> > Signed-off-by: Okash Khawaja <okash.khawaja@gmail.com>
> > Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> > 
> > ---
> >  drivers/staging/speakup/spk_priv.h  |    2 
> >  drivers/staging/speakup/spk_ttyio.c |  105 ++++++++++++++++++++++++++++++++++++
> >  drivers/staging/speakup/spk_types.h |    1 
> >  3 files changed, 108 insertions(+)
> > 
> > --- a/drivers/staging/speakup/spk_priv.h
> > +++ b/drivers/staging/speakup/spk_priv.h
> > @@ -40,6 +40,8 @@
> >  
> >  #define KT_SPKUP 15
> >  #define SPK_SYNTH_TIMEOUT 100000 /* in micro-seconds */
> > +#define SYNTH_DEFAULT_DEV "ttyS0"
> > +#define SYNTH_DEFAULT_SER 0
> >  
> >  const struct old_serial_port *spk_serial_init(int index);
> >  void spk_stop_serial_interrupt(void);
> > --- a/drivers/staging/speakup/spk_ttyio.c
> > +++ b/drivers/staging/speakup/spk_ttyio.c
> > @@ -7,6 +7,13 @@
> >  #include "spk_types.h"
> >  #include "spk_priv.h"
> >  
> > +/* Supported device types */
> > +#define DEV_PREFIX_TTYS "ttyS"
> > +#define DEV_PREFIX_TTYUSB "ttyUSB"
> > +#define DEV_PREFIX_LP "lp"
> > +
> > +const char *lp_supported[] = { "acntsa", "bns", "dummy", "txprt" };
> > +
> >  struct spk_ldisc_data {
> >  	char buf;
> >  	struct semaphore sem;
> > @@ -16,6 +23,104 @@ struct spk_ldisc_data {
> >  static struct spk_synth *spk_ttyio_synth;
> >  static struct tty_struct *speakup_tty;
> >  
> > +static int name_to_dev(const char *name, dev_t *dev_no)
> > +{
> > +        int maj = -1, min = -1;
> > +
> > +        if (strncmp(name, DEV_PREFIX_TTYS, strlen(DEV_PREFIX_TTYS)) == 0) {
> > +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYS), 10, &min)) {
> > +			pr_err("speakup: Invalid ser param. Must be \
> > +					between 0 and 191 inclusive.\n");
> > +                        return -EINVAL;
> > +                }
> > +                maj = 4;
> > +
> > +                if (min < 0 || min > 191) {
> > +			pr_err("speakup: Invalid ser param. Must be \
> > +					between 0 and 191 inclusive.\n");
> > +                        return -EINVAL;
> > +                }
> > +                min = min + 64;
> > +        } else if (strncmp(name, DEV_PREFIX_TTYUSB, strlen(DEV_PREFIX_TTYUSB))
> > +			== 0) {
> > +                if (kstrtoint(name + strlen(DEV_PREFIX_TTYUSB), 10, &min)) {
> > +                        pr_err("speakup: Invalid ttyUSB number. \
> > +					Must be a number from 0 onwards\n");
> > +                        return -EINVAL;
> > +                }
> > +                maj = 188;
> > +
> > +                if (min < 0) {
> > +                        pr_err("speakup: Invalid ttyUSB number. \
> > +					Must be a number from 0 onwards\n");
> > +                        return -EINVAL;
> > +                }
> > +        } else if (strncmp(name, DEV_PREFIX_LP, strlen(DEV_PREFIX_LP)) == 0) {
> > +                if (kstrtoint(name + strlen(DEV_PREFIX_LP), 10, &min)) {
> > +                        pr_warn("speakup: Invalid lp number. \
> > +					Must be a number from 0 onwards\n");
> > +                        return -EINVAL;
> > +                }
> > +                maj = 6;
> > +
> > +                if (min < 0) {
> > +                        pr_warn("speakup: Invalid lp number. \
> > +					Must be a number from 0 onwards\n");
> > +                        return -EINVAL;
> > +                }
> > +        }
> > +
> > +        if (maj == -1 || min == -1)
> > +                return -EINVAL;
> > +
> > +        /* if here, maj and min must be valid */
> > +        *dev_no = MKDEV(maj, min);
> > +
> > +        return 0;
> > +}
> 
> Eeek, no, let's never try to parse strings like this and "figure out"
> what major/minor number it is.  That's madness and will break if we ever
> make all char majors dynamic (there's a thread on lkml about that.)
> 
> Why would the kernel need to know major/minor?  Is it going to open a
> device node?  If so, again, crazy stuff, that's not good...

Ah, no, nevermind, you just need the major/minor.  So why not just take
that as the input here, and not a string?

thanks,

greg k-h

[toc] | [prev] | [next] | [standalone]


#1665727 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2017-06-14 13:50 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSeY9-4EV-3@gated-at.bofh.it>
In reply to#1665677
On Wed, Jun 14, 2017 at 01:26:09PM +0200, Samuel Thibault wrote:
> Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:
> > Ah, no, nevermind, you just need the major/minor.  So why not just take
> > that as the input here, and not a string?
> 
> Because real users don't know about major/minor numbers.

I'm not disagreeing, it's just that the kernel doesn't know about
"device names" either :)

And trying to have the kernel do the mapping based on strings like this
is not ok, sorry.

greg k-h

[toc] | [prev] | [next] | [standalone]


#1665744 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-06-14 14:30 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSfAR-57e-5@gated-at.bofh.it>
In reply to#1665727
Greg KH, on mer. 14 juin 2017 13:48:02 +0200, wrote:
> On Wed, Jun 14, 2017 at 01:26:09PM +0200, Samuel Thibault wrote:
> > Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:
> > > Ah, no, nevermind, you just need the major/minor.  So why not just take
> > > that as the input here, and not a string?
> > 
> > Because real users don't know about major/minor numbers.
> 
> I'm not disagreeing, it's just that the kernel doesn't know about
> "device names" either :)

Well, it does for the console= parameter, for instance.  I know it's not
actually related with major/minor numbering, but it's still meant to
designate the same thing.

> And trying to have the kernel do the mapping based on strings like this
> is not ok, sorry.

So what is the solution?  Users would find it completely crazy to have
to provide major/minor numbers.

Samuel

[toc] | [prev] | [next] | [standalone]


#1665755

FromAndy Shevchenko <andy.shevchenko@gmail.com>
Date2017-06-14 14:40 +0200
Message-ID<tSfKy-5an-21@gated-at.bofh.it>
In reply to#1665744
On Wed, Jun 14, 2017 at 3:18 PM, Samuel Thibault
<samuel.thibault@ens-lyon.org> wrote:
> Greg KH, on mer. 14 juin 2017 13:48:02 +0200, wrote:
>> On Wed, Jun 14, 2017 at 01:26:09PM +0200, Samuel Thibault wrote:
>> > Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:

>> And trying to have the kernel do the mapping based on strings like this
>> is not ok, sorry.
>
> So what is the solution?  Users would find it completely crazy to have
> to provide major/minor numbers.

Shouldn't udev take care of major/minor and alike stuff in user space?

-- 
With Best Regards,
Andy Shevchenko

[toc] | [prev] | [next] | [standalone]


#1665791 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-06-14 15:00 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSg3T-5hv-7@gated-at.bofh.it>
In reply to#1665755
Andy Shevchenko, on mer. 14 juin 2017 15:36:30 +0300, wrote:
> On Wed, Jun 14, 2017 at 3:18 PM, Samuel Thibault
> <samuel.thibault@ens-lyon.org> wrote:
> > Greg KH, on mer. 14 juin 2017 13:48:02 +0200, wrote:
> >> On Wed, Jun 14, 2017 at 01:26:09PM +0200, Samuel Thibault wrote:
> >> > Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:
> 
> >> And trying to have the kernel do the mapping based on strings like this
> >> is not ok, sorry.
> >
> > So what is the solution?  Users would find it completely crazy to have
> > to provide major/minor numbers.
> 
> Shouldn't udev take care of major/minor and alike stuff in user space?

We want speakup to get initialized before udev etc., just like the early
console.

Samuel

[toc] | [prev] | [next] | [standalone]


#1665806 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2017-06-14 15:10 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSgdA-5BT-23@gated-at.bofh.it>
In reply to#1665755
On Wed, Jun 14, 2017 at 03:36:30PM +0300, Andy Shevchenko wrote:
> On Wed, Jun 14, 2017 at 3:18 PM, Samuel Thibault
> <samuel.thibault@ens-lyon.org> wrote:
> > Greg KH, on mer. 14 juin 2017 13:48:02 +0200, wrote:
> >> On Wed, Jun 14, 2017 at 01:26:09PM +0200, Samuel Thibault wrote:
> >> > Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:
> 
> >> And trying to have the kernel do the mapping based on strings like this
> >> is not ok, sorry.
> >
> > So what is the solution?  Users would find it completely crazy to have
> > to provide major/minor numbers.
> 
> Shouldn't udev take care of major/minor and alike stuff in user space?

No, that's all handled by the kernel now, in devtmpfs.

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?

thanks,

greg k-h

[toc] | [prev] | [next] | [standalone]


#1666496 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromOkash Khawaja <okash.khawaja@gmail.com>
Date2017-06-15 09:00 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSwV4-7xc-15@gated-at.bofh.it>
In reply to#1665806
Hi,

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.

Thanks,
Okash

[toc] | [prev] | [next] | [standalone]


#1668212 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromOkash Khawaja <okash.khawaja@gmail.com>
Date2017-06-17 12:20 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tTiZH-5IW-1@gated-at.bofh.it>
In reply to#1666496

[Multipart message — attachments visible in raw view] — view raw

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

[toc] | [prev] | [next] | [standalone]


#1668215 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2017-06-17 12:30 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tTj9o-5MI-5@gated-at.bofh.it>
In reply to#1668212
On Sat, Jun 17, 2017 at 11:16:44AM +0100, Okash Khawaja wrote:
> 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?

Yes, this looks great, nice job!  It is a lot simpler than your previous
function, and now you are not limited to just a subset off the different
serial ports in the system.

Keep up the good work, it's really appreciated.

greg k-h

[toc] | [prev] | [next] | [standalone]


#1668222 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromOkash Khawaja <okash.khawaja@gmail.com>
Date2017-06-17 13:00 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tTjCp-5ZY-9@gated-at.bofh.it>
In reply to#1668215
On Sat, Jun 17, 2017 at 12:25:34PM +0200, Greg Kroah-Hartman wrote:
> On Sat, Jun 17, 2017 at 11:16:44AM +0100, Okash Khawaja wrote:
> > 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?
> 
> Yes, this looks great, nice job!  It is a lot simpler than your previous
> function, and now you are not limited to just a subset off the different
> serial ports in the system.
> 
> Keep up the good work, it's really appreciated.
Great, thanks. I'll re-send the full patch set as v2.

Okash

[toc] | [prev] | [next] | [standalone]


#1665730 — Re: [patch 1/2] staging: speakup: add function to convert dev name to number

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-06-14 13:50 +0200
SubjectRe: [patch 1/2] staging: speakup: add function to convert dev name to number
Message-ID<tSeY9-4EV-5@gated-at.bofh.it>
In reply to#1665677
Greg KH, on mer. 14 juin 2017 12:15:41 +0200, wrote:
> Ah, no, nevermind, you just need the major/minor.  So why not just take
> that as the input here, and not a string?

Because real users don't know about major/minor numbers.

Samuel

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web