Skip to contentSkip to conversation

v4l-utils: fix invalid protocol in streamzap keymap

PATCH In review Matthias Reichl 2 participants 3 messages Feb 17, 2017 – Feb 20, 2017 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 v4l-utils: fix invalid protocol in streamzap keymap

ir-keytable can't load the streamzap keymap because the protocol type RC5_SZ is invalid:

./ir-keytable -w rc_keymaps/streamzap
Protocol RC5_SZ invalid
...

Fix this by changing the protocol type to RC-5-SZ which matches the kernel protocol rc-5-sz

---
 utils/keytable/rc_keymaps/streamzap | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
utils/keytable/rc_keymaps/streamzap +1 -1
index 3512cd8..03d2cb8 100644
@@ -1,4 +1,4 @@
-# table streamzap, type: RC5_SZ
+# table streamzap, type: RC-5-SZ
 0x28c0 KEY_NUMERIC_0
 0x28c1 KEY_NUMERIC_1
 0x28c2 KEY_NUMERIC_2
Signature · 1 line
2.1.4
#1 lore raw

utils/keytable/rc_keymaps/streamzap

Quoted 19 lines · Matthias Reichl

ir-keytable can't load the streamzap keymap because the protocol type RC5_SZ is invalid:

./ir-keytable -w rc_keymaps/streamzap
Protocol RC5_SZ invalid
...

Fix this by changing the protocol type to RC-5-SZ which matches the kernel protocol rc-5-sz

---
 utils/keytable/rc_keymaps/streamzap | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
utils/keytable/rc_keymaps/streamzap +0 -0
index 3512cd8..03d2cb8 100644

This is file is generated by utils/keytable/gen_keytables.pl, so there is no use in patching it.

Actually I think a better solution would be to be less pernickety about how the protocol is specified. ir-ctl also does this. How about the following patch.

Sean

From: Sean Young <[email protected]>
Subject: [PATCH] [PATCH v4l-utils] ir-keytable: be more permissive on protocol
name

Allowed the protocol to be specified with or without underscores or dashes. This also solves the problem of not being able to load the streamzap keymap.

./ir-keytable -w rc_keymaps/streamzap
Protocol RC5_SZ invalid

---
 utils/keytable/keytable.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
utils/keytable/keytable.c +16 -4
index a6ecc9e..a35db5b 100644
@@ -120,9 +120,7 @@ const struct protocol_map_entry protocol_map[] = {
 	{ "other",	NULL,		SYSFS_OTHER	},
 	{ "lirc",	NULL,		SYSFS_LIRC	},
 	{ "rc-5",	"/rc5_decoder",	SYSFS_RC5	},
-	{ "rc5",	NULL,		SYSFS_RC5	},
 	{ "rc-5x",	NULL,		SYSFS_INVALID	},
-	{ "rc5x",	NULL,		SYSFS_INVALID	},
 	{ "rc-5-sz",	NULL,		SYSFS_RC5_SZ	},
 	{ "jvc",	"/jvc_decoder",	SYSFS_JVC	},
 	{ "sony",	"/sony_decoder",SYSFS_SONY	},
@@ -134,7 +132,6 @@ const struct protocol_map_entry protocol_map[] = {
 	{ "mce_kbd",	NULL,		SYSFS_MCE_KBD	},
 	{ "mce-kbd",	NULL,		SYSFS_MCE_KBD	},
 	{ "rc-6",	"/rc6_decoder",	SYSFS_RC6	},
-	{ "rc6",	NULL,		SYSFS_RC6	},
 	{ "rc-6-0",	NULL,		SYSFS_INVALID	},
 	{ "rc-6-6a-20",	NULL,		SYSFS_INVALID	},
 	{ "rc-6-6a-24",	NULL,		SYSFS_INVALID	},
@@ -145,6 +142,21 @@ const struct protocol_map_entry protocol_map[] = {
 	{ NULL,		NULL,		SYSFS_INVALID	},
 };
 
+static bool str_like(const char *a, const char *b)
+{
+	while (*a && *b) {
+		if (*a == '-' || *a == '_')
+			a++;
+		if (*b == '-' || *b == '_')
+			b++;
+		if (tolower(*a) != tolower(*b))
+			return false;
+		a++; b++;
+	}
+
+	return !*a && !*b;
+}
+
 static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allowed)
 {
 	const struct protocol_map_entry *pme;
@@ -156,7 +168,7 @@ static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allo
 		return ~0;
 
 	for (pme = protocol_map; pme->name; pme++) {
-		if (!strcasecmp(name, pme->name))
+		if (str_like(name, pme->name))
 			return pme->sysfs_protocol;
 	}
 
Signature · 1 line
2.9.3
#2 lore raw
Quoted 16 lines · Sean Young
Quoted 15 lines · Matthias Reichl

ir-keytable can't load the streamzap keymap because the protocol type RC5_SZ is invalid:

./ir-keytable -w rc_keymaps/streamzap
Protocol RC5_SZ invalid
...

Fix this by changing the protocol type to RC-5-SZ which matches the kernel protocol rc-5-sz

---
 utils/keytable/rc_keymaps/streamzap | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Quoted 7 lines

utils/keytable/rc_keymaps/streamzap

Quoted 4 lines
utils/keytable/rc_keymaps/streamzap +0 -0
index 3512cd8..03d2cb8 100644

This is file is generated by utils/keytable/gen_keytables.pl, so there is no use in patching it.

Ouch, I totally missed that. Thanks for pointing it out!

Quoted 3 lines

Actually I think a better solution would be to be less pernickety about how the protocol is specified. ir-ctl also does this. How about the following patch.

I agree, this is a much better solution. It simplifies the protocol_map and being more tolerant about spelling is also a benefit to the user.

Quoted 46 lines

Sean

From: Sean Young <[email protected]>
Subject: [PATCH] [PATCH v4l-utils] ir-keytable: be more permissive on protocol
name

Allowed the protocol to be specified with or without underscores or dashes. This also solves the problem of not being able to load the streamzap keymap.

./ir-keytable -w rc_keymaps/streamzap
Protocol RC5_SZ invalid

---
 utils/keytable/keytable.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
utils/keytable/keytable.c +1 -3
index a6ecc9e..a35db5b 100644
@@ -120,9 +120,7 @@ const struct protocol_map_entry protocol_map[] = {
 	{ "other",	NULL,		SYSFS_OTHER	},
 	{ "lirc",	NULL,		SYSFS_LIRC	},
 	{ "rc-5",	"/rc5_decoder",	SYSFS_RC5	},
-	{ "rc5",	NULL,		SYSFS_RC5	},
 	{ "rc-5x",	NULL,		SYSFS_INVALID	},
-	{ "rc5x",	NULL,		SYSFS_INVALID	},
 	{ "rc-5-sz",	NULL,		SYSFS_RC5_SZ	},
 	{ "jvc",	"/jvc_decoder",	SYSFS_JVC	},
 	{ "sony",	"/sony_decoder",SYSFS_SONY	},
@@ -134,7 +132,6 @@ const struct protocol_map_entry protocol_map[] = {
 	{ "mce_kbd",	NULL,		SYSFS_MCE_KBD	},
 	{ "mce-kbd",	NULL,		SYSFS_MCE_KBD	},
 	{ "rc-6",	"/rc6_decoder",	SYSFS_RC6	},
-	{ "rc6",	NULL,		SYSFS_RC6	},
 	{ "rc-6-0",	NULL,		SYSFS_INVALID	},
 	{ "rc-6-6a-20",	NULL,		SYSFS_INVALID	},
 	{ "rc-6-6a-24",	NULL,		SYSFS_INVALID	},
@@ -145,6 +142,21 @@ const struct protocol_map_entry protocol_map[] = {
 	{ NULL,		NULL,		SYSFS_INVALID	},
 };
 
+static bool str_like(const char *a, const char *b)

utils/keytable/keytable.c const struct protocol_map_entry protocol_map[] = { · line 155

Quoted 10 lines
utils/keytable/keytable.c +10 -0
+{
+	while (*a && *b) {
+		if (*a == '-' || *a == '_')
+			a++;
+		if (*b == '-' || *b == '_')
+			b++;
+		if (tolower(*a) != tolower(*b))
+			return false;
+		a++; b++;
+	}

A small nit: this code will fail if both strings are identical and end with a dash or underscore. In that case we'll iterate beyond then end of the strings.

Adding a continue after the dash/underscore increment should fix this, then we won't increment the pointer by 2 within a loop

		if (*a == '-' || *a == '_') {
			a++;
			continue;
		}
		if (*b == '-' || *b == '_') {
			b++;
			continue;
		}

Other than that the patch looks fine to me and worked well.

Quoted 19 lines
utils/keytable/keytable.c +5 -1
+
+	return !*a && !*b;
+}
+
 static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allowed)
 {
 	const struct protocol_map_entry *pme;
@@ -156,7 +168,7 @@ static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allo
 		return ~0;
 
 	for (pme = protocol_map; pme->name; pme++) {
-		if (!strcasecmp(name, pme->name))
+		if (str_like(name, pme->name))
 			return pme->sysfs_protocol;
 	}
 
Signature · 1 line
2.9.3