Man page - freeifaddrs(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

getifaddrs

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

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 premier Ă©lĂ©ment de la liste dans *ifap . La liste est constituĂ©e de structures 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 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 ().

VALEUR RENVOYÉE

En cas de rĂ©ussite, getifaddrs () renvoie 0 , en cas d’erreur, elle renvoie -1 et errno est dĂ©fini pour indiquer l’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).

ATTRIBUTS

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

Image grohtml-3898282-1.png

STANDARDS

Aucun.

HISTORIQUE

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 beaucoup de systĂšmes.

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.

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.

EXEMPLES

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 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);
}
/* Parcourir la liste liĂ©e, en conservant le pointer de tĂȘte pour
pouvoir libérer 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 française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.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.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 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 .