From 3bfe9d6cd1a789e17be716f55a4fd2afd7417bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Sat, 24 Feb 2018 08:10:51 +0000 Subject: [PATCH] Add option dev for show MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- src/show.c | 72 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/src/show.c b/src/show.c index 82043da..0722357 100644 --- a/src/show.c +++ b/src/show.c @@ -2,6 +2,8 @@ #include "ctl.h" #include "str.h" +#include "../argz/argz.h" + #include #include #include @@ -37,28 +39,25 @@ gt_ss_addr(char *str, size_t size, struct sockaddr_storage *ss) } static int -gt_show_tunnel(int fd, const char *dev) +gt_show_dev_status(int fd, const char *dev) { - if (ctl_connect(fd, "/run/" PACKAGE_NAME, dev) == -1) { - perror(dev); + if (ctl_connect(fd, "/run/" PACKAGE_NAME, dev) == -1) return -1; - } struct ctl_msg res, req = {.type = CTL_STATUS}; - if (ctl_reply(fd, &res, &req)) { - perror(dev); + if (ctl_reply(fd, &res, &req)) return -1; - } char bindstr[INET6_ADDRSTRLEN] = {0}; char peerstr[INET6_ADDRSTRLEN] = {0}; - if (gt_ss_addr(bindstr, sizeof(bindstr), &res.status.bind) || - gt_ss_addr(peerstr, sizeof(peerstr), &res.status.peer)) - return -1; + if (gt_ss_addr(bindstr, sizeof(bindstr), &res.status.bind)) + return -2; - if (res.status.peer.ss_family == 0) { + int server = gt_ss_addr(peerstr, sizeof(peerstr), &res.status.peer); + + if (server) { printf("server %s:\n" " bind: %s port %hu\n" " mtu: %zu\n" @@ -87,9 +86,46 @@ gt_show_tunnel(int fd, const char *dev) return 0; } +static int +gt_show_dev(const char *dev) +{ + int fd = ctl_create("/run/" PACKAGE_NAME, NULL); + + if (fd < 0) { + perror(dev); + return -1; + } + + int ret = gt_show_dev_status(fd, dev); + + if (ret == -1) + perror(dev); + + if (ret == -2) + gt_log("%s: bad reply from server\n", dev); + + ctl_delete(fd); + + return ret; +} + int gt_show(int argc, char **argv) { + const char *dev = NULL; + + struct argz showz[] = { + {"dev", "NAME", &dev, argz_str}, + {NULL}}; + + if (argz(showz, argc, argv)) + return 1; + + if (dev) { + gt_show_dev(dev); + return 0; + } + DIR *dp = opendir("/run/" PACKAGE_NAME); if (!dp) { @@ -102,18 +138,8 @@ gt_show(int argc, char **argv) struct dirent *d = NULL; while (d = readdir(dp), d) { - if (d->d_name[0] == '.') - continue; - - int fd = ctl_create("/run/" PACKAGE_NAME, NULL); - - if (fd == -1) { - perror("ctl_create"); - return 1; - } - - gt_show_tunnel(fd, d->d_name); - ctl_delete(fd); + if (d->d_name[0] != '.') + gt_show_dev(d->d_name); } closedir(dp);