[PATCH v4l-utils] keytable: remove line length limits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Use getline() rather than fgets().

Signed-off-by: Sean Young <sean@xxxxxxxx>
---
 utils/common/keymap.c     | 16 ++++++-----
 utils/keytable/keytable.c | 60 ++++++++++++++++++++++++++++-----------
 2 files changed, 52 insertions(+), 24 deletions(-)

diff --git a/utils/common/keymap.c b/utils/common/keymap.c
index 47d36152..00082439 100644
--- a/utils/common/keymap.c
+++ b/utils/common/keymap.c
@@ -74,8 +74,9 @@ void free_keymap(struct keymap *map)
 static error_t parse_plain_keymap(char *fname, struct keymap **keymap, bool verbose)
 {
 	FILE *fin;
-	int line = 0;
-	char *scancode, *keycode, s[2048];
+	int line_no = 0;
+	char *scancode, *keycode, *line;
+	size_t line_size;
 	struct scancode_entry *se;
 	struct keymap *map;
 
@@ -94,13 +95,13 @@ static error_t parse_plain_keymap(char *fname, struct keymap **keymap, bool verb
 		return EINVAL;
 	}
 
-	while (fgets(s, sizeof(s), fin)) {
-		char *p = s;
+	while (getline(&line, &line_size, fin)) {
+		char *p = line;
 
-		line++;
+		line_no++;
 		while (*p == ' ' || *p == '\t')
 			p++;
-		if (line==1 && p[0] == '#') {
+		if (line_no==1 && p[0] == '#') {
 			p++;
 			p = strtok(p, "\n\t =:");
 			do {
@@ -168,6 +169,7 @@ static error_t parse_plain_keymap(char *fname, struct keymap **keymap, bool verb
 		map->scancode = se;
 	}
 	fclose(fin);
+	free(line);
 
 	if (!map->protocol) {
 		fprintf(stderr, _("Missing protocol in %s\n"), fname);
@@ -181,7 +183,7 @@ static error_t parse_plain_keymap(char *fname, struct keymap **keymap, bool verb
 err_einval:
 	free_keymap(map);
 	fprintf(stderr, _("Invalid parameter on line %d of %s\n"),
-		line, fname);
+		line_no, fname);
 	return EINVAL;
 }
 
diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
index 62f4531e..2929db40 100644
--- a/utils/keytable/keytable.c
+++ b/utils/keytable/keytable.c
@@ -459,9 +459,9 @@ static int add_keymap(struct keymap *map, const char *fname)
 static error_t parse_cfgfile(char *fname)
 {
 	FILE *fin;
-	int line = 0;
-	char s[2048];
-	char *driver, *table, *filename;
+	int line_no = 0;
+	char *driver, *table, *filename, *line = NULL;
+	size_t line_size;
 	struct cfgfile *nextcfg = &cfg;
 
 	if (debug)
@@ -473,10 +473,10 @@ static error_t parse_cfgfile(char *fname)
 		return errno;
 	}
 
-	while (fgets(s, sizeof(s), fin)) {
-		char *p = s;
+	while (getline(&line, &line_size, fin)) {
+		char *p = line;
 
-		line++;
+		line_no++;
 		while (*p == ' ' || *p == '\t')
 			p++;
 
@@ -511,17 +511,22 @@ static error_t parse_cfgfile(char *fname)
 		nextcfg->next = calloc(1, sizeof(*nextcfg));
 		if (!nextcfg->next) {
 			perror("parse_cfgfile");
+			fclose(fin);
+			free(line);
 			return ENOMEM;
 		}
 		nextcfg = nextcfg->next;
 	}
 	fclose(fin);
+	free(line);
 
 	return 0;
 
 err_einval:
+	free(line);
+	fclose(fin);
 	fprintf(stderr, _("Invalid parameter on line %d of %s\n"),
-		line, fname);
+		line_no, fname);
 	return EINVAL;
 
 }
@@ -825,7 +830,8 @@ static struct uevents *read_sysfs_uevents(char *dname)
 {
 	FILE		*fp;
 	struct uevents	*next, *uevent;
-	char		*event = "uevent", *file, s[4096];
+	char		*event = "uevent", *file, *line = NULL;
+	size_t		line_size;
 
 	next = uevent = calloc(1, sizeof(*uevent));
 
@@ -843,13 +849,15 @@ static struct uevents *read_sysfs_uevents(char *dname)
 		free(file);
 		return NULL;
 	}
-	while (fgets(s, sizeof(s), fp)) {
-		char *p = strtok(s, "=");
+	while (getline(&line, &line_size, fp)) {
+		char *p = strtok(line, "=");
 		if (!p)
 			continue;
 		next->key = malloc(strlen(p) + 1);
 		if (!next->key) {
 			perror("next->key");
+			fclose(fp);
+			free(line);
 			free(file);
 			free_uevent(uevent);
 			return NULL;
@@ -860,6 +868,7 @@ static struct uevents *read_sysfs_uevents(char *dname)
 		if (!p) {
 			fprintf(stderr, _("Error on uevent information\n"));
 			fclose(fp);
+			free(line);
 			free(file);
 			free_uevent(uevent);
 			return NULL;
@@ -867,6 +876,8 @@ static struct uevents *read_sysfs_uevents(char *dname)
 		next->value = malloc(strlen(p) + 1);
 		if (!next->value) {
 			perror("next->value");
+			fclose(fp);
+			free(line);
 			free(file);
 			free_uevent(uevent);
 			return NULL;
@@ -879,13 +890,16 @@ static struct uevents *read_sysfs_uevents(char *dname)
 		next->next = calloc(1, sizeof(*next));
 		if (!next->next) {
 			perror("next->next");
+			fclose(fp);
 			free(file);
+			free(line);
 			free_uevent(uevent);
 			return NULL;
 		}
 		next = next->next;
 	}
 	fclose(fp);
+	free(line);
 	free(file);
 
 	return uevent;
@@ -979,7 +993,8 @@ static enum sysfs_protocols load_bpf_for_unsupported(enum sysfs_protocols protoc
 static enum sysfs_protocols v1_get_hw_protocols(char *name)
 {
 	FILE *fp;
-	char *p, buf[4096];
+	char *p, *buf = NULL;
+	size_t buf_size;
 	enum sysfs_protocols protocols = 0;
 
 	fp = fopen(name, "r");
@@ -988,8 +1003,9 @@ static enum sysfs_protocols v1_get_hw_protocols(char *name)
 		return 0;
 	}
 
-	if (!fgets(buf, sizeof(buf), fp)) {
+	if (!getline(&buf, &buf_size, fp)) {
 		perror(name);
+		free(buf);
 		fclose(fp);
 		return 0;
 	}
@@ -1007,6 +1023,7 @@ static enum sysfs_protocols v1_get_hw_protocols(char *name)
 		protocols |= protocol;
 	}
 
+	free(buf);
 	fclose(fp);
 
 	return protocols;
@@ -1038,7 +1055,8 @@ static int v1_set_hw_protocols(struct rc_device *rc_dev)
 static int v1_get_sw_enabled_protocol(char *dirname)
 {
 	FILE *fp;
-	char *p, buf[4096], name[512];
+	char *p, *buf = NULL, name[512];
+	size_t buf_size;
 	int rc;
 
 	strcpy(name, dirname);
@@ -1050,14 +1068,16 @@ static int v1_get_sw_enabled_protocol(char *dirname)
 		return 0;
 	}
 
-	if (!fgets(buf, sizeof(buf), fp)) {
+	if (!getline(&buf, &buf_size, fp)) {
 		perror(name);
+		free(buf);
 		fclose(fp);
 		return 0;
 	}
 
 	if (fclose(fp)) {
 		perror(name);
+		free(buf);
 		return errno;
 	}
 
@@ -1073,9 +1093,12 @@ static int v1_get_sw_enabled_protocol(char *dirname)
 		fprintf(stderr, _("protocol %s is %s\n"),
 			name, rc? _("enabled") : _("disabled"));
 
-	if (atoi(p) == 1)
+	if (atoi(p) == 1) {
+		free(buf);
 		return 1;
+	}
 
+	free(buf);
 	return 0;
 }
 
@@ -1111,7 +1134,8 @@ static int v1_set_sw_enabled_protocol(struct rc_device *rc_dev,
 static enum sysfs_protocols v2_get_protocols(struct rc_device *rc_dev, char *name)
 {
 	FILE *fp;
-	char *p, buf[4096];
+	char *p, *buf = NULL;
+	size_t buf_size;
 	int enabled;
 
 	fp = fopen(name, "r");
@@ -1120,7 +1144,8 @@ static enum sysfs_protocols v2_get_protocols(struct rc_device *rc_dev, char *nam
 		return 0;
 	}
 
-	if (!fgets(buf, sizeof(buf), fp)) {
+	if (!getline(&buf, &buf_size, fp)) {
+		free(buf);
 		perror(name);
 		fclose(fp);
 		return 0;
@@ -1151,6 +1176,7 @@ static enum sysfs_protocols v2_get_protocols(struct rc_device *rc_dev, char *nam
 	}
 
 	fclose(fp);
+	free(buf);
 
 	return 0;
 }
-- 
2.43.0





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux