getifaddrs(3) Library Functions Manual getifaddrs(3) NOM getifaddrs, freeifaddrs - Renvoyer les adresses des interfaces BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include #include int getifaddrs(struct ifaddrs **ifap); void freeifaddrs(struct ifaddrs *ifa); DESCRIPTION La fonction getifaddrs() cree une liste chainee de structures decrivant les interfaces reseau du systeme local et sauvegarde l'adresse du premier element de la liste dans *ifap. La liste est constituee de structures ifaddrs, comme definie ci-dessous : struct ifaddrs { struct ifaddrs *ifa_next; /* Next item in list */ char *ifa_name; /* Name of interface */ unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */ struct sockaddr *ifa_addr; /* Address of interface */ struct sockaddr *ifa_netmask; /* Netmask of interface */ union { struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */ } ifa_ifu; #define ifa_broadaddr ifa_ifu.ifu_broadaddr #define ifa_dstaddr ifa_ifu.ifu_dstaddr void *ifa_data; /* Address-specific data */ }; Le champ ifa_next contient un pointeur vers la prochaine structure de la liste ou NULL si c'est le dernier de la liste. ifa_name pointe vers un nom d'interface termine par un caractere nul. Le champ ifa_flags contient les drapeaux de l'interface, comme renvoye par l'operation ioctl(2) SIOCGUFFLAGS (consultez netdevice(7) pour la liste des drapeaux). Le champ ifa_addr pointe vers une structure contenant l'adresse de l'interface (le sous-champ sa_family devrait etre consulte afin de determiner le format de la structure d'adresse). Ce champ peut contenir un pointeur NULL. Le champ ifa_netmask pointe vers une structure contenant le masque reseau associe a ifa_addr, si cela est valable pour cette famille d'adresse. Ce champ peut contenir un pointeur NULL. Selon que le bit IFF_BROADCAST ou IFF_POINTOPOINT est defini dans ifa_flags (seul l'un des deux bit peut etre defini), soit ifa_broadaddr contiendra l'adresse de diffusion associee a ifa_addr (si cela est applicable avec cette famille d'adresse), ou soit ifa_dstaddr contiendra l'adresse de destination de l'interface point a point. Le champ ifa_data pointe vers un tampon contenant les donnees specifique de la famille d'adresse (<< address-family-specific data >>). Ce champ peut etre NULL s'il n'y a aucune donnee de ce type pour cette interface. La donnee renvoyee par getifaddrs() est dynamiquement allouee et devrait etre liberee avec freeifaddrs(). VALEUR RENVOYEE En cas de reussite, getifaddrs() renvoie 0, en cas d'erreur, elle renvoie -1 et errno est defini pour indiquer l'erreur. ERREURS getifaddrs() peut echouer et definir errno pour toutes erreurs specifiees pour socket(2), bind(2), getsockname(2), recvmsg(2), sendto(2), malloc(3) ou realloc(3). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |getifaddrs(), freeifaddrs() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ STANDARDS Aucun. HISTORIQUE Cette fonction est apparue en premier dans BSDi et elle est presente sur les systemes BSD avec de legeres differences semantiques documentees ; elle renvoie une entree par interface et non pas par adresse. Cela signifie que ifa_addr et d'autres champs peuvent etre NULL si l'interface n'a pas d'adresse, et aucune adresse << link-level >> (synonyme d'adresse MAC) n'est renvoyee si l'interface possede une adresse IP. De plus, la facon de choisir soit ifa_broadaddr ou soit ifa_dstaddr varie sur beaucoup de systemes. getifaddrs() est apparue dans la glibc 2.3. Les versions anterieures a la glibc 2.3.3 n'implementaient que l'IPv4. La gestion de l'IPv6 a ete ajoutee dans la glibc 2.3.3. La gestion des familles d'adresse autre que IPv4 n'est disponible que si le noyau gere netlink. NOTES Les adresses renvoyees sous Linux seront generalement les adresses IPv4 et IPv6 de l'interface, et une adresse AF_PACKET contenant des details bas niveau de l'interface et de sa couche physique. Dans ce cas, le champ ifa_data peut contenir un pointeur vers une structure struct rtnl_link_stats, definie dans (pour les versions Linux 2.4 et anterieures, net_device_stats, definie dans ), qui contient differents attributs et statistiques sur les interfaces. EXEMPLES Le programme suivant decrit l'utilisation de getifaddrs(), freeifaddrs() et getnameinfo(3). Ci-dessous, la sortie du programme sur un systeme : $ ./a.out lo AF_PACKET (17) tx_packets = 524; rx_packets = 524 tx_bytes = 38788; rx_bytes = 38788 wlp3s0 AF_PACKET (17) tx_packets = 108391; rx_packets = 130245 tx_bytes = 30420659; rx_bytes = 94230014 em1 AF_PACKET (17) tx_packets = 0; rx_packets = 0 tx_bytes = 0; rx_bytes = 0 lo AF_INET (2) address: <127.0.0.1> wlp3s0 AF_INET (2) address: <192.168.235.137> lo AF_INET6 (10) address: <::1> wlp3s0 AF_INET6 (10) address: Source du programme #define _GNU_SOURCE /* Afin d'avoir acces aux definitions de NI_MAXSERV et de NI_MAXHOST */ #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { struct ifaddrs *ifaddr; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } /* Parcourir la liste liee, en conservant le pointer de tete pour pouvoir liberer la liste ensuite. */ for (struct ifaddrs *ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; /* Afficher le nom et la famille de l'interface (y compris la forme symbolique du second pour les familles courantes). */ printf("%-8s %s (%d)\n", ifa->ifa_name, (family == AF_PACKET) ? "AF_PACKET" : (family == AF_INET) ? "AF_INET" : (family == AF_INET6) ? "AF_INET6" : "???", family); /* Pour une adresse d'interface AF_INET*, afficher l'adresse. */ if (family == AF_INET || family == AF_INET6) { s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\t\taddress: <%s>\n", host); } else if (family == AF_PACKET && ifa->ifa_data != NULL) { struct rtnl_link_stats *stats = ifa->ifa_data; printf("\t\ttx_packets = %10u; rx_packets = %10u\n" "\t\ttx_bytes = %10u; rx_bytes = %10u\n", stats->tx_packets, stats->rx_packets, stats->tx_bytes, stats->rx_bytes); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); } VOIR AUSSI bind(2), getsockname(2), socket(2), packet(7), ifconfig(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 getifaddrs(3)