getifaddrs(3) Library Functions Manual getifaddrs(3) NUME getifaddrs, freeifaddrs - obine adrese de interfae BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include #include int getifaddrs(struct ifaddrs **ifap); void freeifaddrs(struct ifaddrs *ifa); DESCRIERE Funcia getifaddrs() creeaza o lista legata de structuri care descriu interfeele de reea ale sistemului local i stocheaza adresa primului element al listei in *ifap. Lista este formata din structuri ifaddrs, definite dupa cum urmeaza: struct ifaddrs { struct ifaddrs *ifa_next; /* Urmatorul element din lista */ char *ifa_name; /* Numele interfeei */ unsigned int ifa_flags; /* Fanioane de la SIOCGIFFLAGS */ struct sockaddr *ifa_addr; /* Adresa interfeei */ struct sockaddr *ifa_netmask; /* Masca de reea a interfeei */ union { struct sockaddr *ifu_broadaddr; /* Adresa de difuzare a interfeei */ struct sockaddr *ifu_dstaddr; /* Adresa de destinaie punct-la-punct */ } ifa_ifu; #define ifa_broadaddr ifa_ifu.ifu_broadaddr #define ifa_dstaddr ifa_ifu.ifu_dstaddr void *ifa_data; /* Date specifice adresei */ }; Campul ifa_next conine un indicator catre urmatoarea structura din lista sau NULL daca acesta este ultimul element din lista. ifa_name indica numele interfeei terminat prin nul. Campul ifa_flags conine fanioanele interfeei, astfel cum sunt returnate de operaia SIOCGIFFLAGS ioctl(2) (a se vedea netdevice(7) pentru o lista a acestor fanioane). Campul ifa_addr trimite la o structura care conine adresa interfeei; (subcampul sa_family trebuie consultat pentru a determina formatul structurii de adrese). Acest camp poate conine un indicator nul. Campul ifa_netmask indica catre o structura care conine masca de reea asociata cu ifa_addr, daca este cazul pentru familia de adrese. Acest camp poate conine un indicator nul. In funcie de starea (activat/dezactivat) a bitului IFF_BROADCAST sau IFF_POINTOPOINT in ifa_flags (numai unul poate fi activat la un moment dat), ifa_broadaddr va conine adresa de difuzare asociata cu ifa_addr (daca este aplicabila pentru familia de adrese) sau ifa_dstaddr va conine adresa de destinaie a interfeei punct-la-punct. Campul ifa_data indica o memorie tampon care conine date specifice familiei de adrese; acest camp poate fi NULL daca nu exista astfel de date pentru aceasta interfaa. Datele returnate de getifaddrs() sunt alocate dinamic i ar trebui eliberate utilizand freeifaddrs() atunci cand nu mai sunt necesare. VALOAREA RETURNATA In caz de succes, getifaddrs() returneaza zero; in caz de eroare, este returnat -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE getifaddrs() poate eua i configura errno pentru oricare dintre erorile specificate pentru socket(2), bind(2), getsockname(2), recvmsg(2), sendto(2), malloc(3) sau realloc(3). ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +--------------------------------------+---------------------+---------+ |Interfaa | Atribut | Valoare | +--------------------------------------+---------------------+---------+ |getifaddrs(), freeifaddrs() | Sigurana firelor | MT-Safe | +--------------------------------------+---------------------+---------+ STANDARDE Niciunul. ISTORIC Aceasta funcie a aparut pentru prima data in BSDi i este prezenta pe sistemele BSD, dar cu o semantica uor diferita, documentata-returnand o intrare pe interfaa, nu pe adresa. Aceasta inseamna ca ifa_addr i alte campuri pot fi de fapt NULL daca interfaa nu are adresa i nu este returnata nicio adresa la nivel de legatura(conexiune) daca interfaa are o adresa IP atribuita. De asemenea, modul de alegere a ifa_broadaddr sau ifa_dstaddr difera de la un sistem la altul. getifaddrs() a aparut pentru prima data in glibc 2.3, dar inainte de glibc 2.3.3, implementarea accepta numai adrese IPv4; suportul pentru IPv6 a fost adaugat in glibc 2.3.3. Suportul pentru alte familii de adrese decat IPv4 este disponibil numai pe nucleele care accepta netlink. NOTE Adresele returnate pe Linux vor fi de obicei adresele IPv4 i IPv6 atribuite interfeei, dar i o adresa AF_PACKET pentru fiecare interfaa care conine detalii de nivel inferior despre interfaa i stratul sau fizic. In acest caz, campul ifa_data poate conine un indicator catre o structura struct rtnl_link_stats, definita in (in Linux 2.4 i anterior, struct net_device_stats, definita in ), care conine diverse atribute i statistici ale interfeei. EXEMPLE Programul de mai jos demonstreaza utilizarea getifaddrs(), freeifaddrs() i getnameinfo(3). Iata ce vedem la rularea acestui program pe un sistem: $ ./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: Sursa programului #define _GNU_SOURCE /* Pentru a obine definiiile NI_MAXSERV i NI_MAXHOST */ #include #include #include #include #include #include #include #include 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); } /* Parcurgem lista legata, meninand indicatorul capului, astfel incat sa putem elibera lista mai tarziu. */ for (struct ifaddrs *ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; /* Afieaza numele i familia interfeei (inclusiv forma simbolica a acesteia din urma pentru familiile comune). */ printf("%-8s %s (%d)\n", ifa->ifa_name, (family == AF_PACKET) ? "AF_PACKET" : (family == AF_INET) ? "AF_INET" : (family == AF_INET6) ? "AF_INET6" : "???", family); /* Pentru o adresa de interfaa AF_INET*, afieaza adresa. */ 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() a euat: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\t\tadresa: <%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); } CONSULTAI I bind(2), getsockname(2), socket(2), packet(7), ifconfig(8) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.12 23 iulie 2024 getifaddrs(3)