Loading

NOM

       getifaddrs, freeifaddrs - renvoyer les adresses des interfaces

SYNOPSIS

       #include <sys/types.h>
       #include <ifaddrs.h>

       int getifaddrs(struct ifaddrs **ifap);

       void freeifaddrs(struct ifaddrs *ifa);

       La fonction getifaddrs() crée une liste chaînée de structures décrivant
       les interfaces réseau du  système  local  et  sauvegarde  l’adresse  du
       premier  élément  de  la  liste  dans *ifap. La liste est constituée de
       stucture ifaddrs 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 terminé par un caractère nul.

       Le  champ ifa_flags contient les drapeaux de l’interface, comme renvoyé
       par l’opération 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  être  consulté  afin  de
       déterminer le format de la structure d’adresse).

       Le  champ  ifa_netmask  pointe  vers  une structure contenant le masque
       réseau associé à ifa_addr, si  cela  est  valable  pour  cette  famille
       d’adresse.

       Selon  que  le  bit  IFF_BROADCAST  ou  IFF_POINTOPOINT est défini dans
       ifa_flags (seul l’un des deux bit peut être défini), soit ifa_broadaddr
       contiendra  l’adresse  de  diffusion  associée  à ifa_addr (si cela est
       applicable  avec  cette  famille  d’adresse),   ou   soit   ifa_dstaddr
       contiendra l’adresse de destination de l’interface point à point.

       Le   champ  ifa_data  pointe  vers  un  tampon  contenant  les  données
       spécifique de la famille d’adresse (« address-family-specific  data »).
       Ce  champ peut être NULL s’il n’y a aucune donnée de ce type pour cette
       interface.

       La donnée  renvoyée  par  getifaddrs()  est  dynamiquement  allouée  et
       devrait être libérée avec freeifaddrs().

VALEURS RENVOYÉES

       En  cas  de  réussite,  getifaddrs()  renvoie  0, en cas d’erreur, elle
       renvoie -1 et errno est rempli avec le code d’erreur.

ERREURS

       getifaddrs()   peut  échouer  et  définir  errno  pour  toutes  erreurs
       spécifiées   pour   socket(2),   bind(2),  getsockname(2),  recvmsg(2),
       sendto(2), malloc(3) ou realloc(3).

VERSIONS

       getifaddrs() est apparue dans la glibc 2.3. Les versions antérieures  à
       la  glibc 2.3.3 n’implémentaient que l’IPv4. La gestion de l’IPv6 a été
       ajoutée dans la glibc 2.3.3. La gestion des  familles  d’adresse  autre
       que IPv4 n’est disponible que si le noyau gère netlink.

CONFORMITÉ

       Pas  dans POSIX.1-2001. Cette fonction est apparue en premier dans BSDi
       et elle est présente sur les systèmes BSD avec de  légères  différences
       sémantiques  documentées ; elle renvoie une entrée par interface et non
       pas par adresse. Cela signifie que ifa_addr et d’autres champs  peuvent
       être   NULL  si  l’interface  n’a  pas  d’adresse,  et  aucune  adresse
       « link-level » (synonyme d’adresse MAC) n’est renvoyée  si  l’interface
       possède une adresse IP. De plus, la façon de choisir soit ifa_broadaddr
       ou soit ifa_dstaddr varie sur beacoup de systèmes.

NOTES

       Les adresses renvoyées sous Linux seront généralement les adresses IPv4
       et  IPv6 de l’interface, et une adresse AF_PACKET contenant des détails
       bas niveau de l’interface et de sa couche physique.  Dans  ce  cas,  le
       champ   ifa_data   peut   contenir   un  pointeur  vers  une  structure
       net_device_stats,  définie  dans  <linux/netdevice.h>,   qui   contient
       différents attributs et statistiques sur les interfaces.

EXEMPLE

       Le    programme   suivant   décrit   l’utilisation   de   getifaddrs(),
       freeifaddrs() et getnameinfo(3). Ci-dessous, la sortie du programme sur
       un système :

           $ ./a.out
           lo      address family: 17 (AF_PACKET)
           eth0    address family: 17 (AF_PACKET)
           lo      address family: 2 (AF_INET)
                   address: <127.0.0.1>
           eth0    address family: 2 (AF_INET)
                   address: <10.1.1.4>
           lo      address family: 10 (AF_INET6)
                   address: <::1>
           eth0    address family: 10 (AF_INET6)
                   address: <fe80::2d0:59ff:feda:eb51%eth0>

   Source du programme

       #include <arpa/inet.h>
       #include <sys/socket.h>
       #include <netdb.h>
       #include <ifaddrs.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           struct ifaddrs *ifaddr, *ifa;
           int family, s;
           char host[NI_MAXHOST];

           if (getifaddrs(&ifaddr) == -1) {
               perror("getifaddrs");
               exit(EXIT_FAILURE);
           }

           /* Walk through linked list, maintaining head pointer so we
              can free list later */

           for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
               family = ifa->ifa_addr->sa_family;

               /* Display interface name and family (including symbolic
                  form of the latter for the common families) */

               printf("%s  address family: %d%s\n",
                       ifa->ifa_name, family,
                       (family == AF_PACKET) ? " (AF_PACKET)" :
                       (family == AF_INET) ?   " (AF_INET)" :
                       (family == AF_INET6) ?  " (AF_INET6)" : "");

               /* For an AF_INET* interface address, display the address */

               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("\taddress: <%s>\n", host);
               }
           }

           freeifaddrs(ifaddr);
           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       bind(2), getsockname(2), socket(2), packet(7), ifconfig(8)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite  et  est  maintenue  par  Florentin
       Duneau <fduneau AT gmail DOT com> et l’équipe francophone de traduction
       de Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de  ce  document
       en utilisant la commande « man -L C <section> <page_de_man> ».