diff --git a/.gitignore b/.gitignore index b1ecfc1c..c619bbdd 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ tools/prof/astral-prof tools/prof/main.o tools/systrace/systrace tools/systrace/main.o +tools/netinfo/main.o +tools/netinfo/netinfo initrds hdd.img netdump.dat diff --git a/recipes/netinfo b/recipes/netinfo new file mode 100644 index 00000000..8f0626e9 --- /dev/null +++ b/recipes/netinfo @@ -0,0 +1,14 @@ +name=netinfo +revision=1 +from_source=netinfo +imagedeps="build-essential" +hostdeps="xbinutils xgcc" +deps="base" + +build() { + make -C ${source_dir} -j ${parallelism} +} + +package() { + make -C ${source_dir} install PREFIX=${prefix} DESTDIR=${dest_dir} +} diff --git a/source-recipes/netinfo b/source-recipes/netinfo new file mode 100644 index 00000000..8eb3e495 --- /dev/null +++ b/source-recipes/netinfo @@ -0,0 +1,3 @@ +name=netinfo +version=0 +source_dir="tools/netinfo" diff --git a/tools/netinfo/Makefile b/tools/netinfo/Makefile new file mode 100644 index 00000000..b3551e45 --- /dev/null +++ b/tools/netinfo/Makefile @@ -0,0 +1,14 @@ +.phony: all install +CC=x86_64-astral-gcc +LD=x86_64-astral-gcc +all: netinfo + +install: + mkdir -p "$(DESTDIR)/$(PREFIX)/sbin/" + cp netinfo "$(DESTDIR)/$(PREFIX)/sbin/netinfo" + +netinfo: main.o + $(LD) $(LDFLAGS) -g -o $@ $^ + +main.o: main.c + $(CC) -c $(CFLAGS) -g -o $@ $< diff --git a/tools/netinfo/main.c b/tools/netinfo/main.c new file mode 100644 index 00000000..cdd0fd22 --- /dev/null +++ b/tools/netinfo/main.c @@ -0,0 +1,38 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +static void print_error(const char *msg, const int error) { + fprintf(stderr, "%s: %s: %s\n", program_invocation_short_name, msg, strerror(error)); +} + +int main(const int argc, const char *argv[]) { + struct ifaddrs *ifaddrs; + if (getifaddrs(&ifaddrs)) { + print_error("getifaddrs", errno); + return EXIT_FAILURE; + } + + for (struct ifaddrs *ifaddr = ifaddrs; ifaddr; ifaddr = ifaddr->ifa_next) { + if (ifaddr->ifa_addr->sa_family != AF_INET) + continue; + + printf("%s: flags: 0x%x%s%s%s\n", + ifaddr->ifa_name, ifaddr->ifa_flags, + ifaddr->ifa_flags & IFF_UP ? " UP" : "", + ifaddr->ifa_flags & IFF_LOOPBACK ? " LOOPBACK" : "", + ifaddr->ifa_flags & IFF_RUNNING ? " RUNNING" : ""); + printf("%s: address: %s\n", ifaddr->ifa_name, ifaddr->ifa_addr ? inet_ntoa(((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr) : "?"); + printf("%s: mask: %s\n", ifaddr->ifa_name, ifaddr->ifa_netmask ? inet_ntoa(((struct sockaddr_in *)ifaddr->ifa_netmask)->sin_addr) : "?"); + printf("%s: broadcast: %s\n", ifaddr->ifa_name, ifaddr->ifa_broadaddr ? inet_ntoa(((struct sockaddr_in *)ifaddr->ifa_broadaddr)->sin_addr) : "?"); + } + + freeifaddrs(ifaddrs); + + return EXIT_SUCCESS; +}