diff --git a/Makefile.am b/Makefile.am index 42a09f2..43407cc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,6 +24,7 @@ glorytun_SOURCES = \ src/set.c \ src/show.c \ src/str.h \ + src/sync.c \ src/tun.c \ src/tun.h diff --git a/README.md b/README.md index 72faf4e..de67053 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ available commands: bench start a crypto bench bind start a new tunnel set change tunnel properties + sync re-sync tunnels keygen generate a new secret key path manage paths version show version diff --git a/meson.build b/meson.build index c8ded67..5b8c867 100644 --- a/meson.build +++ b/meson.build @@ -33,6 +33,7 @@ executable('glorytun', install: true, 'src/path.c', 'src/set.c', 'src/show.c', + 'src/sync.c', 'src/tun.c', ], dependencies: [ diff --git a/src/bind.c b/src/bind.c index e83afd8..07343a3 100644 --- a/src/bind.c +++ b/src/bind.c @@ -289,6 +289,10 @@ gt_bind(int argc, char **argv) res.status.bind = bind_addr; res.status.peer = peer_addr; break; + case CTL_SYNC: + if (mud_send(mud, NULL, 0, 0) == -1) + res.ret = errno; + break; } if (sendto(ctl_fd, &res, sizeof(res), 0, (const struct sockaddr *)&ss, sl) == -1) diff --git a/src/common.h b/src/common.h index 25b4b33..b8ac74e 100644 --- a/src/common.h +++ b/src/common.h @@ -74,3 +74,4 @@ int gt_path (int, char **); int gt_keygen (int, char **); int gt_bench (int, char **); int gt_set (int, char **); +int gt_sync (int, char **); diff --git a/src/ctl.h b/src/ctl.h index 2a432e9..e1fa658 100644 --- a/src/ctl.h +++ b/src/ctl.h @@ -14,6 +14,7 @@ enum ctl_type { CTL_TIMEOUT, CTL_TIMETOLERANCE, CTL_PATH_STATUS, + CTL_SYNC, }; struct ctl_msg { diff --git a/src/main.c b/src/main.c index 8209514..e947601 100644 --- a/src/main.c +++ b/src/main.c @@ -64,6 +64,7 @@ main(int argc, char **argv) {"bench", "start a crypto bench", gt_bench}, {"bind", "start a new tunnel", gt_bind}, {"set", "change tunnel properties", gt_set}, + {"sync", "re-sync tunnels", gt_sync}, {"keygen", "generate a new secret key", gt_keygen}, {"path", "manage paths", gt_path}, {"version", "show version", gt_version}, diff --git a/src/sync.c b/src/sync.c new file mode 100644 index 0000000..fe931cc --- /dev/null +++ b/src/sync.c @@ -0,0 +1,71 @@ +#include "common.h" +#include "ctl.h" +#include "str.h" + +#include "../argz/argz.h" + +#include +#include + +static int +gt_sync_dev(const char *dev) +{ + const int fd = ctl_connect(GT_RUNDIR, dev); + + if (fd < 0) { + if (fd == -1) + perror("sync"); + return 1; + } + + struct ctl_msg res, req = { + .type = CTL_SYNC, + }; + + const int ret = ctl_reply(fd, &res, &req); + + if (ret == -1) + perror("sync"); + + ctl_delete(fd); + + return ret; +} + +int +gt_sync(int argc, char **argv) +{ + const char *dev = NULL; + + struct argz syncz[] = { + {"dev", "NAME", &dev, argz_str}, + {NULL}}; + + if (argz(syncz, argc, argv)) + return 1; + + if (dev) { + gt_sync_dev(dev); + return 0; + } + + DIR *dp = opendir(GT_RUNDIR); + + if (!dp) { + if (errno == ENOENT) + return 0; + perror("sync"); + return 1; + } + + struct dirent *d = NULL; + + while (d = readdir(dp), d) { + if (d->d_name[0] != '.') + gt_sync_dev(d->d_name); + } + + closedir(dp); + + return 0; +}