dwww Home | Manual pages | Find package

getifaddrs(3)              Library Functions Manual              getifaddrs(3)

NOM
       getifaddrs, freeifaddrs - Renvoyer les adresses des interfaces

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

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

       int getifaddrs(struct ifaddrs **ifap);
       void freeifaddrs(struct ifaddrs *ifa);

DESCRIPTION
       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  pre-
       mier  élément de la liste dans *ifap. La liste est constituée de struc-
       tures ifaddrs, comme définie 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). Ce champ peut contenir
       un pointeur NULL.

       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. Ce champ peut contenir un pointeur NULL.

       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  ap-
       plicable  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éci-
       fique  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 in-
       terface.

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

VALEUR RENVOYÉE
       On success, getifaddrs()  returns zero; on error, -1 is  returned,  and
       errno is set to indicate the error.

ERREURS
       getifaddrs()   peut échouer et définir errno pour toutes erreurs spéci-
       fié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.

ATTRIBUTS
       Pour une explication des termes utilisés dans cette section,  consulter
       attributes(7).

       ┌─────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├─────────────────────────────────────┼──────────────────────┼─────────┤
       │getifaddrs(), freeifaddrs()          │ Sécurité des threads │ MT-Safe │
       └─────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS
       Not  in POSIX.1. This function first appeared in BSDi and is present on
       the BSD systems, but with slightly different  semantics  documented—re-
       turning  one  entry per interface, not per address. This means ifa_addr
       and other fields can actually be NULL if the interface has no  address,
       and  no  link-level  address is returned if the interface has an IP ad-
       dress assigned. Also, the  way  of  choosing  either  ifa_broadaddr  or
       ifa_dstaddr differs on various systems.

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  struct
       rtnl_link_stats, définie dans  <linux/if_link.h> (pour les versions Li-
       nux 2.4 et antérieures, net_device_stats,  définie  dans  <linux/netde-
       vice.h>), qui contient différents attributs et statistiques sur les in-
       terfaces.

EXEMPLES
       Le programme suivant décrit l'utilisation  de  getifaddrs(),  freeifad-
       drs() et getnameinfo(3). Ci-dessous, la sortie du programme sur un sys-
       tème :

           $ ./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: <fe80::7ee9:d3ff:fef5:1a91%wlp3s0>

   Source du programme

       #define _GNU_SOURCE     /* Afin d'avoir accès aux définitions de NI_MAXSERV et de  NI_MAXHOST */
       #include <arpa/inet.h>
       #include <sys/socket.h>
       #include <netdb.h>
       #include <ifaddrs.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <linux/if_link.h>

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

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

           for (struct ifaddrs *ifa = ifaddr; ifa != NULL;
                    ifa = ifa->ifa_next) {
               if (ifa->ifa_addr == NULL)
                   continue;

               family = ifa->ifa_addr->sa_family;

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

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

               /* 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("\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 française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran-
       çois  Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué-
       rard <fevrier@tigreraye.org>, Jean-Luc  Coulon  (f5ibh)  <jean-luc.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Cédric Boutillier <ce-
       dric.boutillier@gmail.com> et Frédéric Hantrais <fhantrais@gmail.com>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la        GNU        General       Public       License       version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant  les  conditions
       de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si  vous découvrez un bogue dans la traduction de cette page de manuel,
       veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩.

Pages du manuel de Linux 6.03   5 février 2023                   getifaddrs(3)

Generated by dwww version 1.15 on Sat Jun 29 00:39:06 CEST 2024.