commit eaada1b6c40789aaedb76b2b7038bb1c5161f13c Author: Paul Schneider Date: Sun May 24 01:37:36 2026 +0100 Merci à Claude. Vraiment. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e3d5cee --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +CC = gcc +CFLAGS = -Wall -Wextra -std=c11 -O2 +TARGET = ifaddr +SRC = getifaddr.c + +.PHONY: all clean install + +all: $(TARGET) + +$(TARGET): $(SRC) + $(CC) $(CFLAGS) -o $@ $^ + +install: $(TARGET) + install -m 755 $(TARGET) /usr/local/bin/$(TARGET) + +clean: + rm -f $(TARGET) diff --git a/README.md b/README.md new file mode 100644 index 0000000..ddff34d --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# getifaddr + +Petite commande C qui retourne l'adresse IPv4 d'une interface réseau par son nom. + +Utilisée par [myovh-zone](https://github.com/pazof/myovh-zone) pour mettre à jour +la zone DNS OVH avec l'IP courante d'une interface. + +## Compilation + +```bash +make +# ou directement : +gcc -Wall -O2 -o ifaddr getifaddr.c +``` + +## Installation + +```bash +sudo make install +# installe dans /usr/local/bin/ifaddr +``` + +## Usage + +```bash +ifaddr +``` + +### Exemples + +```bash +ifaddr eth0 # → 192.168.1.42 +ifaddr enp3s0 # → 203.0.113.5 +ifaddr lo # → 127.0.0.1 +``` + +Retourne l'IP sur stdout, code retour 0 si trouvé, 1 sinon — +ce qui permet de l'utiliser directement en pipe ou depuis un process C#. + +## Dépendances + +POSIX uniquement : `getifaddrs(3)`, `inet_ntop(3)`. Aucune lib externe. +Fonctionne sur Linux et BSD (macOS inclus). diff --git a/getifaddr.c b/getifaddr.c new file mode 100644 index 0000000..235635f --- /dev/null +++ b/getifaddr.c @@ -0,0 +1,69 @@ +/* + * getifaddr.c — retourne l'adresse IPv4 d'une interface réseau par son nom + * + * Usage : ifaddr + * Exemple : ifaddr eth0 + * ifaddr enp3s0 + * + * Dépendances : POSIX, getifaddrs(3) + * Compile : gcc -o ifaddr getifaddr.c + * + * Paul Schneider — reconstitué depuis pazof/myovh-zone + */ + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + const char *ifname = argv[1]; + struct ifaddrs *ifaddr_list = NULL; + + if (getifaddrs(&ifaddr_list) == -1) { + perror("getifaddrs"); + return EXIT_FAILURE; + } + + int found = 0; + for (struct ifaddrs *ifa = ifaddr_list; ifa != NULL; ifa = ifa->ifa_next) { + /* On cherche uniquement IPv4 (AF_INET) */ + if (ifa->ifa_addr == NULL) + continue; + if (ifa->ifa_addr->sa_family != AF_INET) + continue; + if (strcmp(ifa->ifa_name, ifname) != 0) + continue; + + char buf[INET_ADDRSTRLEN]; + struct sockaddr_in *sa = (struct sockaddr_in *)ifa->ifa_addr; + + if (inet_ntop(AF_INET, &sa->sin_addr, buf, sizeof(buf)) == NULL) { + perror("inet_ntop"); + freeifaddrs(ifaddr_list); + return EXIT_FAILURE; + } + + printf("%s\n", buf); + found = 1; + break; + } + + freeifaddrs(ifaddr_list); + + if (!found) { + fprintf(stderr, "ifaddr: interface '%s' not found or has no IPv4 address\n", ifname); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/ifaddr b/ifaddr new file mode 100755 index 0000000..1085e78 Binary files /dev/null and b/ifaddr differ