Mercurial > hg > dhcpcd
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
