From 524e56cf569f1fa0e441086589a902a1706c03ef Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 18 Aug 2017 14:13:52 +0930 Subject: [PATCH] dev_disconnect: support '*N' syntax for disconnecting on the N'th occurance. Signed-off-by: Rusty Russell --- lightningd/dev_disconnect.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lightningd/dev_disconnect.c b/lightningd/dev_disconnect.c index 93de5f9aa..4eb0c7343 100644 --- a/lightningd/dev_disconnect.c +++ b/lightningd/dev_disconnect.c @@ -12,10 +12,12 @@ /* We move the fd IFF we do a disconnect. */ static int dev_disconnect_fd = -1; static char dev_disconnect_line[200]; +static int dev_disconnect_count, dev_disconnect_len; void dev_disconnect_init(int fd) { int r; + char *asterisk; r = read(fd, dev_disconnect_line, sizeof(dev_disconnect_line)-1); if (r < 0) @@ -24,7 +26,17 @@ void dev_disconnect_init(int fd) /* Get first line */ dev_disconnect_line[r] = '\n'; - *strchr(dev_disconnect_line, '\n') = '\0'; + dev_disconnect_len = strcspn(dev_disconnect_line, "\n"); + dev_disconnect_line[dev_disconnect_len] = '\0'; + asterisk = strchr(dev_disconnect_line, '*'); + if (asterisk) { + dev_disconnect_count = atoi(asterisk+1); + if (dev_disconnect_count < 1) + errx(1, "dev_disconnect invalid count: %s", + dev_disconnect_line); + *asterisk = '\0'; + } else + dev_disconnect_count = 1; /* So we can move forward if we do use the line. */ dev_disconnect_fd = fd; @@ -35,8 +47,13 @@ char dev_disconnect(int pkt_type) if (!streq(wire_type_name(pkt_type), dev_disconnect_line+1)) return DEV_DISCONNECT_NORMAL; + if (dev_disconnect_count != 1) { + dev_disconnect_count--; + return DEV_DISCONNECT_NORMAL; + } + assert(dev_disconnect_fd != -1); - lseek(dev_disconnect_fd, strlen(dev_disconnect_line)+1, SEEK_CUR); + lseek(dev_disconnect_fd, dev_disconnect_len+1, SEEK_CUR); status_trace("dev_disconnect: %s", dev_disconnect_line); return dev_disconnect_line[0];