diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-01 22:10:39 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-02 21:25:26 +0100 |
commit | cac8f382588e33c83f533936ba980ed06d4340aa (patch) | |
tree | c729ddb5c25b67cf4128c116f7e1978607254055 /src/Network | |
parent | d722b2045d028e80786109947ceef1aaffa569eb (diff) |
Network: automatically find broadcast addresses
Diffstat (limited to 'src/Network')
-rw-r--r-- | src/Network/ifaddrs.c | 41 | ||||
-rw-r--r-- | src/Network/ifaddrs.h | 3 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/Network/ifaddrs.c b/src/Network/ifaddrs.c new file mode 100644 index 0000000..37c3e00 --- /dev/null +++ b/src/Network/ifaddrs.c @@ -0,0 +1,41 @@ +#include "ifaddrs.h" + +#include <arpa/inet.h> +#include <ifaddrs.h> +#include <net/if.h> +#include <stdlib.h> +#include <sys/types.h> +#include <endian.h> + +uint32_t * broadcast_addresses(void) +{ + struct ifaddrs * addrs; + if (getifaddrs(&addrs) < 0) + return 0; + + size_t capacity = 16, count = 0; + uint32_t * ret = malloc(sizeof(uint32_t) * capacity); + + for (struct ifaddrs * ifa = addrs; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET && + ifa->ifa_flags & IFF_BROADCAST) { + if (count + 2 >= capacity) { + capacity *= 2; + uint32_t * nret = realloc(ret, sizeof(uint32_t) * capacity); + if (nret) { + ret = nret; + } else { + free(ret); + return 0; + } + } + + ret[count] = ((struct sockaddr_in*)ifa->ifa_broadaddr)->sin_addr.s_addr; + count++; + } + } + + freeifaddrs(addrs); + ret[count] = 0; + return ret; +} diff --git a/src/Network/ifaddrs.h b/src/Network/ifaddrs.h new file mode 100644 index 0000000..06d26ec --- /dev/null +++ b/src/Network/ifaddrs.h @@ -0,0 +1,3 @@ +#include <stdint.h> + +uint32_t * broadcast_addresses(void); |