1. NOM▲
getifaddrs, freeifaddrs - Renvoyer les adresses des interfaces
2. SYNOPSIS ▲
#include <sys/types.h>
#include <ifaddrs.h>
int
getifaddrs
(
struct
ifaddrs **
ifap);
void
freeifaddrs
(
struct
ifaddrs *
ifa);
3. 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 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). 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 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().
4. VALEUR RENVOYÉE ▲
En cas de réussite, getifaddrs() renvoie 0, en cas d'erreur, elle renvoie -1 et errno est rempli avec le code d'erreur.
5. 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).
6. 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.
7. 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.
8. 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 Linux 2.4 et antérieures, net_device_stats, définie dans <linux/netdevice.h>), qui contient différents attributs et statistiques sur les interfaces.
9. 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>
9.1. 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) {
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
(
"
%s
\t
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
(
"
\t
address: <%s>
\n
"
, host);
}
}
freeifaddrs
(
ifaddr);
exit
(
EXIT_SUCCESS);
}
10. VOIR AUSSI ▲
bind(2), getsockname(2), socket(2), packet(7), ifconfig(8)
11. COLOPHON ▲
Cette page fait partie de la publication 3.52 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/.
12. TRADUCTION ▲
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.
Florentin Duneau et l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à <>.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».