This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:

Subject: keytable: fail more gracefully when commandline cannot be parsed
Author:  Sean Young <[email protected]>
Date:    Wed Nov 29 08:37:35 2017 +0000

If there is a problem during argp_parse, you get:

$ ir-keytable -p foo
Invalid parameter(s)
ir-keytable: -p: (PROGRAM ERROR) Option should have been recognized!?
Try `ir-keytable --help' or `ir-keytable --usage' for more information.
Try `ir-keytable --help' or `ir-keytable --usage' for more information.
Found /sys/class/rc/rc0/ (/dev/input/event6) with:
        Driver winbond-cir, table rc-rc6-mce
        Supported protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 
sharp xmp
        Enabled protocols: lirc rc-6
        Extra capabilities: <access denied>

So, ARGP_ERR_UNKNOWN is not correct and it should exit on parse failures.

Signed-off-by: Sean Young <[email protected]>

 utils/keytable/keytable.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

---

http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=2fa6c8641843de6ed439fe96d5ce95fcc166605c
diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
index 64db77038053..4c1e86414193 100644
--- a/utils/keytable/keytable.c
+++ b/utils/keytable/keytable.c
@@ -496,7 +496,7 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
 
                rc = parse_keyfile(arg, &name);
                if (rc)
-                       goto err_inval;
+                       argp_error(state, _("Failed to read table file %s"), 
arg);
                if (name)
                        fprintf(stderr, _("Read %s table\n"), name);
                break;
@@ -504,7 +504,7 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
        case 'a': {
                rc = parse_cfgfile(arg);
                if (rc)
-                       goto err_inval;
+                       argp_error(state, _("Failed to read config file %s"), 
arg);
                break;
        }
        case 'k':
@@ -512,8 +512,10 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
                do {
                        struct keytable_entry *ke;
 
-                       if (!p)
-                               goto err_inval;
+                       if (!p) {
+                               argp_error(state, _("Missing scancode: %s"), 
arg);
+                               break;
+                       }
 
                        ke = calloc(1, sizeof(*ke));
                        if (!ke) {
@@ -524,13 +526,15 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
                        ke->scancode = strtoul(p, NULL, 0);
                        if (errno) {
                                free(ke);
-                               goto err_inval;
+                               argp_error(state, _("Invalid scancode: %s"), p);
+                               break;
                        }
 
                        p = strtok(NULL, ",;");
                        if (!p) {
                                free(ke);
-                               goto err_inval;
+                               argp_error(state, _("Missing keycode"));
+                               break;
                        }
 
                        key = parse_code(p);
@@ -538,7 +542,8 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
                                key = strtol(p, NULL, 0);
                                if (errno) {
                                        free(ke);
-                                       goto err_inval;
+                                       argp_error(state, _("Unknown keycode: 
%s"), p);
+                                       break;
                                }
                        }
 
@@ -559,8 +564,10 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
                        enum sysfs_protocols protocol;
 
                        protocol = parse_sysfs_protocol(p, true);
-                       if (protocol == SYSFS_INVALID)
-                               goto err_inval;
+                       if (protocol == SYSFS_INVALID) {
+                               argp_error(state, _("Unknown protocol: %s"), p);
+                               break;
+                       }
 
                        ch_proto |= protocol;
                }
@@ -580,12 +587,8 @@ static error_t parse_opt(int k, char *arg, struct 
argp_state *state)
        default:
                return ARGP_ERR_UNKNOWN;
        }
-       return 0;
-
-err_inval:
-       fprintf(stderr, _("Invalid parameter(s)\n"));
-       return ARGP_ERR_UNKNOWN;
 
+       return 0;
 }
 
 static struct argp argp = {
@@ -1507,7 +1510,7 @@ int main(int argc, char *argv[])
        textdomain (PACKAGE);
 #endif
 
-       argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, 0, 0);
+       argp_parse(&argp, argc, argv, ARGP_NO_HELP, 0, 0);
 
        /* Just list all devices */
        if (!clear && !readtable && !keytable && !ch_proto && !cfg.next && 
!test && !delay && !period) {

_______________________________________________
linuxtv-commits mailing list
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to