Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

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);

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
       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 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).

       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.

       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().

VALEURS RENVOY'EES

       En  cas  de  reussite,  getifaddrs()  renvoie  0, en cas d'erreur, elle
       renvoie -1 et errno est rempli avec le code d'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).

VERSIONS

       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.

CONFORMIT'E

       Pas  dans POSIX.1-2001. 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 beacoup de systemes.

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
       net_device_stats,  definie  dans  <linux/netdevice.h>,   qui   contient
       differents attributs et statistiques sur les interfaces.

EXEMPLE

       Le    programme   suivant   decrit   l'utilisation   de   getifaddrs(),
       freeifaddrs() et getnameinfo(3). Ci-dessous, la sortie du programme sur
       un systeme :

           $ ./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.27 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis 2010, cette traduction est maintenue a l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone       au       sein        du        projet        perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Florentin   Duneau   et   l'equipe   francophone   de   traduction   de
       Debian (2006-2009).

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

       Vous pouvez toujours avoir acces a la version anglaise de  ce  document
       en utilisant la commande << man -L C <section> <page_de_man> >>.