changeset 2569:7af1b6b4b883 draft

Accept \n as end of command on the control interface.
author Roy Marples <roy@marples.name>
date Thu, 03 Jul 2014 14:23:32 +0000
parents 5563419bd36a
children 12b378a0f258
files control.c
diffstat 1 files changed, 23 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/control.c	Thu Jul 03 10:07:35 2014 +0000
+++ b/control.c	Thu Jul 03 14:23:32 2014 +0000
@@ -52,8 +52,9 @@
 control_handle_data(void *arg)
 {
 	struct fd_list *l = arg, *lp, *last;
-	char buffer[1024], *e, *p, *argvp[255], **ap;
+	char buffer[1024], *e, *p, *argvp[255], **ap, *a;
 	ssize_t bytes;
+	size_t len;
 	int argc;
 
 	bytes = read(l->fd, buffer, sizeof(buffer) - 1);
@@ -79,14 +80,28 @@
 	buffer[bytes] = '\0';
 	p = buffer;
 	e = buffer + bytes;
-	argc = 0;
-	ap = argvp;
-	while (p < e && (size_t)argc < sizeof(argvp)) {
-		argc++;
-		*ap++ = p;
-		p += strlen(p) + 1;
+
+	/* Each command is \n terminated
+	 * Each argument is NULL separated */
+	while (p < e) {
+		argc = 0;
+		ap = argvp;
+		while (p < e) {
+			argc++;
+			if ((size_t)argc > sizeof(argvp)) {
+				errno = ENOBUFS;
+				return;
+			}
+			a = *ap++ = p;
+			len = strlen(p);
+			p += len + 1;
+			if (a[len - 1] == '\n') {
+				a[len - 1] = '\0';
+				break;
+			}
+		}
+		dhcpcd_handleargs(l->ctx, l, argc, argvp);
 	}
-	dhcpcd_handleargs(l->ctx, l, argc, argvp);
 }
 
 static void