Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       getifaddrs, freeifaddrs - obține adrese de interfațe

BIBLIOTECA

       Biblioteca C standard (libc, -lc)

SINOPSIS

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

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

DESCRIERE

       Funcția getifaddrs() creează o listă legată de structuri care descriu interfețele de rețea ale sistemului
       local  și stochează adresa primului element al listei în *ifap. Lista este formată din structuri ifaddrs,
       definite după cum urmează:

           struct ifaddrs {
               struct ifaddrs  *ifa_next;    /* Următorul element din listă */
               char            *ifa_name;    /* Numele interfeței */
               unsigned int     ifa_flags;   /* Fanioane de la SIOCGIFFLAGS */
               struct sockaddr *ifa_addr;    /* Adresa interfeței */
               struct sockaddr *ifa_netmask; /* Masca de rețea a interfeței */
               union {
                   struct sockaddr *ifu_broadaddr;
                                    /* Adresa de difuzare a interfeței */
                   struct sockaddr *ifu_dstaddr;
                                    /* Adresa de destinație 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 */
           };

       Câmpul ifa_next conține un indicator către următoarea structură din  listă  sau  NULL  dacă  acesta  este
       ultimul element din listă.

       ifa_name indică numele interfeței terminat prin nul.

       Câmpul  ifa_flags  conține  fanioanele  interfeței,  astfel  cum  sunt returnate de operația SIOCGIFFLAGS
       ioctl(2) (a se vedea netdevice(7) pentru o listă a acestor fanioane).

       Câmpul ifa_addr trimite la o structură care  conține  adresa  interfeței;  (subcâmpul  sa_family  trebuie
       consultat pentru a determina formatul structurii de adrese). Acest câmp poate conține un indicator nul.

       Câmpul  ifa_netmask  indică către o structură care conține masca de rețea asociată cu ifa_addr, dacă este
       cazul pentru familia de adrese. Acest câmp poate conține un indicator nul.

       În funcție de starea (activat/dezactivat) a bitului IFF_BROADCAST sau IFF_POINTOPOINT în ifa_flags (numai
       unul poate fi activat la un moment dat), ifa_broadaddr va conține adresa de difuzare asociată cu ifa_addr
       (dacă este aplicabilă pentru familia de adrese)  sau  ifa_dstaddr  va  conține  adresa  de  destinație  a
       interfeței punct-la-punct.

       Câmpul  ifa_data indică o memorie tampon care conține date specifice familiei de adrese; acest câmp poate
       fi NULL dacă nu există astfel de date pentru această interfață.

       Datele returnate de getifaddrs() sunt alocate dinamic și  ar  trebui  eliberate  utilizând  freeifaddrs()
       atunci când nu mai sunt necesare.

VALOAREA RETURNATĂ

       În  caz  de  succes,  getifaddrs()  returnează  zero;  în caz de eroare, este returnat -1, iar errno este
       configurată pentru a indica eroarea.

ERORI-IEȘIRE

       getifaddrs() poate eșua ș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 explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
       ┌─────────────────────────────────────────────────────────────────────────┬───────────────────┬─────────┐
       │ InterfațăAtributValoare │
       ├─────────────────────────────────────────────────────────────────────────┼───────────────────┼─────────┤
       │ getifaddrs(), freeifaddrs()                                             │ Siguranța firelor │ MT-Safe │
       └─────────────────────────────────────────────────────────────────────────┴───────────────────┴─────────┘

STANDARDE

       Niciunul.

ISTORIC

       Această  funcție a apărut pentru prima dată în BSDi și este prezentă pe sistemele BSD, dar cu o semantică
       ușor diferită, documentată-returnând o intrare pe interfață, nu pe adresă. Aceasta înseamnă  că  ifa_addr
       și  alte  câmpuri  pot  fi de fapt NULL dacă interfața nu are adresă și nu este returnată nicio adresă la
       nivel de legătură(conexiune) dacă interfața are o adresă IP atribuită. De asemenea, modul  de  alegere  a
       ifa_broadaddr sau ifa_dstaddr diferă de la un sistem la altul.

       getifaddrs()  a  apărut pentru prima dată în glibc 2.3, dar înainte de glibc 2.3.3, implementarea accepta
       numai adrese IPv4; suportul pentru IPv6 a fost adăugat în glibc 2.3.3. Suportul pentru  alte  familii  de
       adrese decât IPv4 este disponibil numai pe nucleele care acceptă netlink.

NOTE

       Adresele  returnate pe Linux vor fi de obicei adresele IPv4 și IPv6 atribuite interfeței, dar și o adresă
       AF_PACKET pentru fiecare interfață care conține detalii de nivel inferior despre interfață și stratul său
       fizic. În acest caz, câmpul ifa_data poate conține un indicator către o structură struct rtnl_link_stats,
       definită  în  <linux/if_link.h>  (în  Linux  2.4  și  anterior,  struct  net_device_stats,  definită   în
       <linux/netdevice.h>), care conține diverse atribute și statistici ale interfeței.

EXEMPLE

       Programul de mai jos demonstrează utilizarea getifaddrs(), freeifaddrs() și getnameinfo(3). Iată 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: <fe80::7ee9:d3ff:fef5:1a91%wlp3s0>

   Sursa programului

       #define _GNU_SOURCE     /* Pentru a obține definițiile NI_MAXSERV și 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);
           }

           /* Parcurgem lista legată, menținând indicatorul capului,
              astfel încât să putem elibera lista mai târziu. */

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

               family = ifa->ifa_addr->sa_family;

               /* Afișează numele și familia interfeței (inclusiv forma
                  simbolică a acesteia din urmă 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 adresă de interfață AF_INET*, afișează 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 eșuat: %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);
       }

CONSULTAȚI ȘI

       bind(2), getsockname(2), socket(2), packet(7), ifconfig(8)

TRADUCERE

       Traducerea    în   limba   română   a   acestui   manual   a   fost   făcută   de   Remus-Gabriel   Chelu
       <remusgabriel.chelu@disroot.org>

       Această traducere este  documentație  gratuită;  citiți  Licența publică generală GNU Versiunea 3  sau  o
       versiune   ulterioară   cu  privire  la  condiții  privind  drepturile  de  autor.   NU  se  asumă  NICIO
       RESPONSABILITATE.

       Dacă găsiți erori în traducerea acestui manual, vă rugăm să  trimiteți  un  e-mail  la  translation-team-
       ro@lists.sourceforge.net.

Pagini de manual de Linux 6.9.1                   15 iunie 2024                                    getifaddrs(3)