From 9c7f98a823be88ce15f23c7852ab5b15527d6f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Thu, 7 Jun 2018 16:56:43 +0000 Subject: [PATCH] Add option sync to command bind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- mud | 2 +- src/bind.c | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mud b/mud index 6ebda93..03be90b 160000 --- a/mud +++ b/mud @@ -1 +1 @@ -Subproject commit 6ebda9368c8afdf384523fa47ac06a31d3534221 +Subproject commit 03be90b6067937e3ab88e2aea96ca0dd1e910d16 diff --git a/src/bind.c b/src/bind.c index 8ffa4e9..2736591 100644 --- a/src/bind.c +++ b/src/bind.c @@ -111,6 +111,7 @@ gt_bind(int argc, char **argv) unsigned short peer_port = bind_port; const char *dev = NULL; const char *keyfile = NULL; + unsigned long sync = 0; struct argz toz[] = { {NULL, "IPADDR", &peer_addr, argz_addr}, @@ -125,6 +126,7 @@ gt_bind(int argc, char **argv) {"keyfile", "FILE", &keyfile, argz_str}, {"chacha", NULL, NULL, argz_option}, {"persist", NULL, NULL, argz_option}, + {"sync", "SECONDS", &sync, argz_time}, {NULL}}; if (argz(bindz, argc, argv)) @@ -211,11 +213,19 @@ gt_bind(int argc, char **argv) FD_SET(mud_fd, &rfds); FD_SET(ctl_fd, &rfds); - if (select(last_fd, &rfds, NULL, NULL, NULL) == -1) { - if (errno != EBADF) - continue; - perror("select"); - return 1; + struct timeval tv = { + .tv_sec = sync / 1000UL, + }; + + const int ret = select(last_fd, &rfds, NULL, NULL, sync ? &tv : NULL); + + if (ret == -1) { + if (errno == EBADF) { + perror("select"); + return 1; + } + + continue; } mtu = gt_setup_mtu(mud, tun_name); @@ -329,6 +339,9 @@ gt_bind(int argc, char **argv) perror("tun_write"); } } + + if (!ret) + mud_send(mud, NULL, 0, 0); } if (gt_reload && tun_fd >= 0) {