From 87e5e3337e9123da3cd9cf6f0303fd391a0b7bc3 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sat, 21 Jun 2025 15:37:10 +0100 Subject: [PATCH] ifaddr initial import --- .gitignore | 2 ++ README.adoc | 3 +++ src/Makefile | 9 +++++++++ src/getifaddr.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 24 ++++++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 .gitignore create mode 100644 README.adoc create mode 100644 src/Makefile create mode 100644 src/getifaddr.c create mode 100644 src/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..495a75e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/build/ + diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..b9b5b81 --- /dev/null +++ b/README.adoc @@ -0,0 +1,3 @@ += Read me + +This command outputs the ipv4 address for the interface given by name in argument. diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..2a541fd --- /dev/null +++ b/src/Makefile @@ -0,0 +1,9 @@ +DESTDIR=../build + +$(DESTDIR)/ifaddr: main.c getifaddr.c + mkdir -p $(DESTDIR) + gcc $^ -o $(DESTDIR)/ifaddr + +dist-clean: + rm -f ifaddr $(DESTDIR)/ifaddr + diff --git a/src/getifaddr.c b/src/getifaddr.c new file mode 100644 index 0000000..03583af --- /dev/null +++ b/src/getifaddr.c @@ -0,0 +1,53 @@ +#define _GNU_SOURCE /* To get defns of NI_MAXSERV and NI_MAXHOST */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char * get_if_addr(char *ifname) +{ + + struct ifaddrs * list, * plist; + int family, s; + + char host[NI_MAXHOST]; + char *result; + if (getifaddrs (&list)==-1) + { + fprintf(stderr, "no info"); + return NULL; + } + plist = list; + while (plist!=NULL) + { + if (strcmp(plist->ifa_name,ifname)==0) + { + family = plist->ifa_addr->sa_family; + if (family == AF_INET || family == AF_INET6) { + s = getnameinfo(plist->ifa_addr, + (family == AF_INET) ? sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6), + host, NI_MAXHOST, + NULL, 0, NI_NUMERICHOST); + if (s != 0) { + fprintf(stderr, "getnameinfo() failed: %s\n", gai_strerror(s)); + exit(EXIT_FAILURE); + } + result = malloc(strlen(host)+1); + strcpy(result,host); + freeifaddrs (list); + return result; + } + } + plist = plist->ifa_next; + } + freeifaddrs (list); + return NULL; + +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..84861e5 --- /dev/null +++ b/src/main.c @@ -0,0 +1,24 @@ +#include +#include + +char * get_if_addr(char *ifname); + +int main(int argc, char ** argv) +{ + + if (argc<2) { + fprintf(stderr, "usage: %s \nOù `ifname` est le nom de l'interface, par exemple, `eth0`.", argv[0]); + + return 2; + } + + char * addr = (char*) get_if_addr(argv[1]); + if (addr==NULL) { + printf("no addr found!\n"); + return 1; + } + printf(addr); + + free(addr); + return 0; +}