diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2016-07-22 20:30:34 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2016-07-22 20:30:34 +0200 |
commit | d877ccf5e86dd4506086cb4fd7e1cfb3952ff705 (patch) | |
tree | 8ed9e3ffe5edc8e5104ae1258fc9a80d41bea03c | |
parent | index hashtable: run random indices through siphash (diff) | |
download | wireguard-monolithic-historical-d877ccf5e86dd4506086cb4fd7e1cfb3952ff705.tar.xz wireguard-monolithic-historical-d877ccf5e86dd4506086cb4fd7e1cfb3952ff705.zip |
tools: Use seqpacket instead of dgram
-rw-r--r-- | src/tools/ipc.c | 32 | ||||
-rw-r--r-- | src/tools/ipc.h | 9 | ||||
-rw-r--r-- | src/uapi.h | 16 |
3 files changed, 22 insertions, 35 deletions
diff --git a/src/tools/ipc.c b/src/tools/ipc.c index cc70fd1..c4d1128 100644 --- a/src/tools/ipc.c +++ b/src/tools/ipc.c @@ -80,21 +80,10 @@ static int add_next_to_inflatable_buffer(struct inflatable_buffer *buffer) return 0; } -static void close_and_unlink(int fd) -{ - struct sockaddr_un addr; - socklen_t len = sizeof(addr); - - if (!getsockname(fd, (struct sockaddr *)&addr, &len)) - unlink(addr.sun_path); - close(fd); -} - static int userspace_interface_fd(const char *interface) { struct stat sbuf; - struct sockaddr_un addr = { .sun_family = AF_UNIX }, bind_addr = { .sun_family = AF_UNIX }; - mode_t old_umask; + struct sockaddr_un addr = { .sun_family = AF_UNIX }; int fd = -1, ret; ret = -EINVAL; @@ -103,10 +92,6 @@ static int userspace_interface_fd(const char *interface) ret = snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, SOCK_PATH "%s" SOCK_SUFFIX, interface); if (ret < 0) goto out; - ret = snprintf(bind_addr.sun_path, sizeof(bind_addr.sun_path) - 1, SOCK_PATH ".wg-tool-%s-%d.client", interface, getpid()); - if (ret < 0) - goto out; - unlink(bind_addr.sun_path); ret = stat(addr.sun_path, &sbuf); if (ret < 0) goto out; @@ -114,12 +99,7 @@ static int userspace_interface_fd(const char *interface) if (!S_ISSOCK(sbuf.st_mode)) goto out; - ret = fd = socket(AF_UNIX, SOCK_DGRAM, 0); - if (ret < 0) - goto out; - old_umask = umask(0077); - ret = bind(fd, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); - umask(old_umask); + ret = fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (ret < 0) goto out; @@ -131,7 +111,7 @@ static int userspace_interface_fd(const char *interface) } out: if (ret && fd >= 0) - close_and_unlink(fd); + close(fd); if (!ret) ret = fd; return ret; @@ -142,7 +122,7 @@ static bool userspace_has_wireguard_interface(const char *interface) int fd = userspace_interface_fd(interface); if (fd < 0) return false; - close_and_unlink(fd); + close(fd); return true; } @@ -200,7 +180,7 @@ static int userspace_set_device(struct wgdevice *dev) goto out; ret = ret_code; out: - close_and_unlink(fd); + close(fd); errno = -ret; return (int)ret; } @@ -251,7 +231,7 @@ static int userspace_get_device(struct wgdevice **dev, const char *interface) out: if (*dev && ret) free(*dev); - close_and_unlink(fd); + close(fd); errno = -ret; return ret; } diff --git a/src/tools/ipc.h b/src/tools/ipc.h index b2312ad..9cb9db2 100644 --- a/src/tools/ipc.h +++ b/src/tools/ipc.h @@ -12,13 +12,4 @@ int ipc_get_device(struct wgdevice **dev, const char *interface); char *ipc_list_devices(void); bool ipc_has_device(const char *interface); - -#define for_each_wgpeer(__dev, __peer, __i) for ((__i) = 0, (__peer) = (typeof(__peer))((uint8_t *)(__dev) + sizeof(struct wgdevice)); \ - (__i) < (__dev)->num_peers; \ - ++(__i), (__peer) = (typeof(__peer))((uint8_t *)(__peer) + sizeof(struct wgpeer) + (sizeof(struct wgipmask) * (__peer)->num_ipmasks))) - -#define for_each_wgipmask(__peer, __ipmask, __i) for ((__i) = 0, (__ipmask) = (typeof(__ipmask))((uint8_t *)(__peer) + sizeof(struct wgpeer)); \ - (__i) < (__peer)->num_ipmasks; \ - ++(__i), (__ipmask) = (typeof(__ipmask))((uint8_t *)(__ipmask) + sizeof(struct wgipmask))) - #endif @@ -129,4 +129,20 @@ struct wgdevice { }; }; +/* These are simply for convenience in iterating. It allows you to write something like: + * + * for_each_wgpeer(device, peer, i) { + * for_each_wgipmask(peer, ipmask, j) { + * do_something_with_ipmask(ipmask); + * } + * } + */ +#define for_each_wgpeer(__dev, __peer, __i) for ((__i) = 0, (__peer) = (typeof(__peer))((uint8_t *)(__dev) + sizeof(struct wgdevice)); \ + (__i) < (__dev)->num_peers; \ + ++(__i), (__peer) = (typeof(__peer))((uint8_t *)(__peer) + sizeof(struct wgpeer) + (sizeof(struct wgipmask) * (__peer)->num_ipmasks))) + +#define for_each_wgipmask(__peer, __ipmask, __i) for ((__i) = 0, (__ipmask) = (typeof(__ipmask))((uint8_t *)(__peer) + sizeof(struct wgpeer)); \ + (__i) < (__peer)->num_ipmasks; \ + ++(__i), (__ipmask) = (typeof(__ipmask))((uint8_t *)(__ipmask) + sizeof(struct wgipmask))) + #endif |