diff options
| author | David Härdeman <david@hardeman.nu> | 2015-07-15 19:27:33 +0200 | 
|---|---|---|
| committer | David Härdeman <david@hardeman.nu> | 2015-07-15 19:27:33 +0200 | 
| commit | 02dee330f76ea0361dba8a049529e978bb80013c (patch) | |
| tree | eff7c33cf229180ced2b43520b068ee654dcdcfa | |
| parent | 35234714a0a51ae7f77cde26a76678d52b7eaeeb (diff) | |
Improve keymap parsing in server
| -rw-r--r-- | linux-input-keycodes.h | 4 | ||||
| -rw-r--r-- | rcm-server-keymap.c | 40 | 
2 files changed, 38 insertions, 6 deletions
| diff --git a/linux-input-keycodes.h b/linux-input-keycodes.h index 509aa52..4ef6bd3 100644 --- a/linux-input-keycodes.h +++ b/linux-input-keycodes.h @@ -3,6 +3,10 @@  #include "linux-input-enum.h" +#ifndef cairo_surface_t +typedef void * cairo_surface_t; +#endif +  struct linux_input_keycode {  	const char *name;  	enum linux_input_keyval value; diff --git a/rcm-server-keymap.c b/rcm-server-keymap.c index af72045..8a4fa3e 100644 --- a/rcm-server-keymap.c +++ b/rcm-server-keymap.c @@ -14,6 +14,7 @@  #include <limits.h>  #include "utils.h" +#include "linux-input-keycodes.h"  #include "rcm-server-main.h"  #include "rcm-server-keymap.h" @@ -175,7 +176,6 @@ keymap_parse(FILE *fp, char **line, size_t *buf_size, struct keymap *keymap,  				char *end;  				uint64_t scancode; -				printf("Map %s\n", tmp);  				protocol = strtok(tmp,  " :");  				scanstr = strtok(NULL, " :");  				keycode  = strtok(NULL, " :"); @@ -192,14 +192,24 @@ keymap_parse(FILE *fp, char **line, size_t *buf_size, struct keymap *keymap,  					return r;  				} -				printf("Map means protocol %s scancode 0x%08" PRIx64 " keycode %s\n", -				       protocol, scancode, keycode); +				for (i = 0; linux_input_keycodes[i].name; i++) { +					if (!strcmp(keycode, linux_input_keycodes[i].name)) +						break; +				} + +				if (!linux_input_keycodes[i].name || linux_input_keycodes[i].value < 1) { +					fprintf(stderr, "Invalid keycode name: %s\n", keycode); +					return -EINVAL; +				}  				if (keymap) {  					/* FIXME: leaks */  					keymap->keycodes[keycode_count].protocol = strdup(protocol);  					keymap->keycodes[keycode_count].scancode = scancode;  					keymap->keycodes[keycode_count].keycode  = strdup(keycode); +					printf("\tMapping: protocol %s scancode 0x%08" PRIx64 " keycode %s\n", +					       protocol, scancode, keycode); +  				}  				keycode_count++;  			} else { @@ -236,8 +246,18 @@ keymap_parse(FILE *fp, char **line, size_t *buf_size, struct keymap *keymap,  				if (keymap) {  					if (!strcasecmp(tmp, "Blank"))  						keymap->layout[layout_count] = NULL; -					else -						keymap->layout[layout_count] = &keymap->keycodes[1]; +					else { +						for (i = 0; i < keycode_count; i++) +							if (!strcasecmp(tmp, keymap->keycodes[i].keycode)) +								break; + +						if (i >= keycode_count) { +							fprintf(stderr, "Invalid button keycode: %s\n", tmp); +							return -EINVAL; +						} + +						keymap->layout[layout_count] = &keymap->keycodes[i]; +					}  				}  				layout_count++; @@ -321,6 +341,7 @@ keymap_read(int dfd, const char *name)  		return NULL;  	fd = -1; +	printf("Parsing keymap %s\n", name);  	r = keymap_parse(fp, &line, &buf_size, NULL, &rows, &cols, &keycode_count);  	if (r < 0) {  		fprintf(stderr, "Invalid keymap: %s\n", name); @@ -337,7 +358,14 @@ keymap_read(int dfd, const char *name)  		return NULL;  	} -	keymap_parse(fp, &line, &buf_size, keymap, NULL, NULL, NULL); +	r = keymap_parse(fp, &line, &buf_size, keymap, NULL, NULL, NULL); +	if (r < 0) { +		fprintf(stderr, "Invalid keymap: %s\n", name); +		free(keymap->layout); +		free(keymap); +		return NULL; +	} +	printf("\tLayout: %u rows x %u cols = %u entries\n", rows, cols, rows * cols);  	return keymap;  } | 
