1 // SPDX-License-Identifier: GPL-2.0 OR MIT
3 * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
9 #include "containers.h"
18 static int string_list_add(struct string_list *list, const char *str)
20 size_t len = strlen(str) + 1;
25 if (len >= list->cap - list->len) {
27 size_t new_cap = list->cap * 2;
29 if (new_cap < list->len + len + 1)
30 new_cap = list->len + len + 1;
31 new_buffer = realloc(list->buffer, new_cap);
34 list->buffer = new_buffer;
37 memcpy(list->buffer + list->len, str, len);
39 list->buffer[list->len] = '\0';
44 #if defined(__linux__)
45 #include "ipc-linux.h"
46 #elif defined(__OpenBSD__)
47 #include "ipc-openbsd.h"
48 #elif defined(__FreeBSD__)
49 #include "ipc-freebsd.h"
51 #include "ipc-windows.h"
54 /* first\0second\0third\0forth\0last\0\0 */
55 char *ipc_list_devices(void)
57 struct string_list list = { 0 };
60 #ifdef IPC_SUPPORTS_KERNEL_INTERFACE
61 ret = kernel_get_wireguard_interfaces(&list);
65 ret = userspace_get_wireguard_interfaces(&list);
75 return list.buffer ?: strdup("\0");
78 int ipc_get_device(struct wgdevice **dev, const char *iface)
80 #ifdef IPC_SUPPORTS_KERNEL_INTERFACE
81 if (userspace_has_wireguard_interface(iface))
82 return userspace_get_device(dev, iface);
83 return kernel_get_device(dev, iface);
85 return userspace_get_device(dev, iface);
89 int ipc_set_device(struct wgdevice *dev)
91 #ifdef IPC_SUPPORTS_KERNEL_INTERFACE
92 if (userspace_has_wireguard_interface(dev->name))
93 return userspace_set_device(dev);
94 return kernel_set_device(dev);
96 return userspace_set_device(dev);