From eaada1b6c40789aaedb76b2b7038bb1c5161f13c Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sun, 24 May 2026 01:37:36 +0100 Subject: [PATCH] =?UTF-8?q?Merci=20=C3=A0=20Claude.=20Vraiment.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 17 +++++++++++++ README.md | 43 ++++++++++++++++++++++++++++++++ getifaddr.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ifaddr | Bin 0 -> 16352 bytes 4 files changed, 129 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 getifaddr.c create mode 100755 ifaddr 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 0000000000000000000000000000000000000000..1085e7818eebc17171e8231eb4ced23ea0d493ca GIT binary patch literal 16352 zcmeHOeQXrh5r20!#1L{e0a8AictNItHa=`Hh>$qk85`D>0T)av6ks{~_Uvo!OLu!< zr>Ww~5OFa^q^*!rwGpDJM5BJ7HmcMlRh^PXO+O+dB@#`e)M}gdoHPxjG)hy2>&$yI zdwZL6RjE?{>5g?fZ+GBOGD$`wHpZ{NrTDoLh(-{br--8&Bcehs+7qfqiYqu6@EkDkiZlPW@t# zG2N)&_2`M$pPG8D@WJjkpL_E0XPVCa;L_{s67l{`ZR--z=0rS|A8sDrys3FpTQHXn zt``_~0o5nZ%lAc)gdee+;CIP_s@c3E~?o-1Gol1H{s)Kl^X=P5q=BBa&b7Ml-&PBCU50L z#>{5ZSz#D(g$9hA70FsgG7?XToD~I?h-I?zlob>4lxZ0$E1dz;f#HY|i>D%q_yZ=` zWe1WOF=$%xSR@+F=0q%Onq0GSHO5a99ttT(##x@+s&Kr{+%`mh z?!f60CJmhI_+eo>lP#I$%AmrQ+A1{MM_nV11(+k+;6x zUAS~eFZ^B~`{R|~zOL5E))yg#uYg%;$@d^@*UGjs-bDLKs9&F$vmDu-?^{ctyPN_; z>@M?4)Afy`a0=ogaj5GmDknC+iEQn4y>LZ;?yp<*=iaZ;eJ|*ju3L+tf`e2+U1>U2 z-`H99|6BcSAB?vD8q^~HseSrb`xY$fg*U7PaM>_!apuEPsThU!zA)#TAo~tNY&$;s z&m09MdSTzL=*<9n#v%Yc`G|I-ZMx1W8v$e_7JTbDV(EM;s-?5qP$UO{*4=xgO~a2| zW-cc`N%&UO+|>ek#>xIu@03ap0&lxgDm?+b6F7cIv4B4d^0BKhy#|ioN|AgI>=C}< z2H%PWH`JZ>-OzwIe&lQcyH#jFRNY>PCeTZJh&zh5frjmYrJt_9@o3$s*t-0#Pi|7XY7&ZwfjB4X6Aafu$2Q9RclRZ8)&z;W^ca4`3FDuI-`!Bh9l%APcWmy%b57Py)SSZi07$j)!xsY>0>2L< z;mZ@&OTasL8SpaTWx&gTmjN#WUIx4jcp30A;AH?Z!0YRHJsr*?kW9to+EH1=Ne0kO ziiy`~{oOK>dA;%ql6fw)oMc|VhjSVv*8lx_DUI?4T8xKtJ)|{M;5BZSNzZH5UQuR( z*W@iFc?of50^qC%>*!hm>R$=q%V^FL?2e%u{+6ZM1b#P1~@BYuSV!^F=J=XydR zRoby_+ZJt2r`aEmq_ozy;QC-obL*XJsmRtJ<(RixaTPz;RuEnXpIBtCFV{%B2zWL7 zM!@~BE8zmQPtLCaTRV$=8`*2r??IHb365A#uM6)cobM}TErbCDAFLN13Mqv9!Tl0n zBKSU0S|MNyB_gIFeXmwgoN z{q^?qi);HF*}LmMI!pbJ%z{4-xW<(__;&zb=wBwd|Fi08#PJOdIpO;pq!$6NmY>%F zZ-D-j2}v{ikdgKQdmqj!()@w!54-H&A^U0S|MDFb_*|2?U9DZ1@2}pTTLH)Oa_4z1 z;F|4SE^GsQRavx4hXB9X4^MN~^CAj()%Epz2eMXcFb#{>BmHs1iVT+DKL!T`F0u~} zq!UpAW;rV#ivd_({%%-FV*nSx=fFRjHU<;v{z$@zTIp=gh~$UGKsuR8n3fq0wp6#k zCHiqAlFdd&3^QeAM_^%oBxxGad@?x#E)K~6ORK`vFt+ar@9Z+Vc6A!C-oA7HuJF$8 zZQuoO@Qf~lu5|*fa;g0TRynkdxs-G%zBFWwU z0YGt#%KkhqWzOSwZa>>G&wxLUd0FOhFY}O$s`jop+fT4~2nu*j*q_JU%z50+@!jWN zApZ`kkjL@N&l8URm@~KkmjT0e@w~(Se?-+N-E2YUjqg9U5?M=cYA*@CI^W7H~Vov_&Vs& zg#CFR-Q+s-f_b@O_L2RW<9Ofc&-3mg`S;qMs=$8CaUAOO=kfUF7G=-vNrFdYSdwF1sLb1+