Provided by: manpages-pl-dev_0.7-1_all bug

NAZWA

       CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - dostęp do danych pomocniczych

SKŁADNIA

       #include <sys/socket.h>

       struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *msgh);
       struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct cmsghdr *cmsg);
       size_t CMSG_ALIGN(size_t length);
       size_t CMSG_SPACE(size_t length);
       size_t CMSG_LEN(size_t length);
       unsigned char *CMSG_DATA(struct cmsghdr *cmsg);

       struct cmsghdr {
           size_t cmsg_len;    /* Liczba bajtów danych, włączając nagłówek
                                  (typ to socklen_t w POSIX) */
           int    cmsg_level;  /* Protokół źródłowy */
           int    cmsg_type;   /* Typ zależny od protokołu */
       /* followed by
          unsigned char cmsg_data[]; */
       };

OPIS

       Makrodefinicje  te  służą  do  tworzenia  i  dostępu  do  komunikatów sterujących (zwanych również danymi
       pomocniczymi), które nie są częścią gniazda. Te informacje  sterujące  mogą  zawierać:  interfejs,  przez
       który  pakiet  został  odebrany,  różne  rzadko  używane  pola  nagłówka,  rozszerzony opis błędu, zestaw
       deskryptorów plików lub uwierzytelnień uniksowych. Na  przykład,  komunikaty  sterujące  mogą  służyć  do
       ustawiania  dodatkowych  pól  nagłówka,  takich jak opcje IP, dla wysyłanych pakietów. Dane pomocnicze są
       wysyłane poprzez wywołanie sendmsg(2), a  odbierane  poprzez  wywołanie  recvmsg(2).   Więcej  informacji
       znajduje się na stronach podręcznika tych poleceń.

       Dane  pomocnicze  są ciągiem struktur struct cmsghdr z dodanymi danymi. Dostęp do tego ciągu powinien się
       odbywać wyłącznie przez opisane na  tej  stronie  podręcznika  makrodefinicje,  nigdy  zaś  bezpośrednio.
       Dostępne  rodzaje  komunikatów  sterujących  opisano  na  stronach podręcznika poszczególnych protokołów.
       Maksymalny   rozmiar   bufora   danych    pomocniczych    dla    gniazda    można    ustawić,    używając
       /proc/sys/net/core/optmem_max; patrz socket(7).

       CMSG_FIRSTHDR()  zwraca  wskaźnik  do  pierwszego  cmsghdr  w  buforze  danych  pomocniczych  związanym z
       przekazanym msghdr.

       CMSG_NXTHDR() zwraca następny poprawny cmsghdr po przekazanym cmsghdr. Zwraca NULL, gdy brak dostatecznej
       ilości miejsca w buforze.

       CMSG_ALIGN() zwraca żądaną długość, włączając niezbędne wyrównanie. Jest to wyrażenie stałe.

       CMSG_SPACE()  zwraca liczbę bajtów elementu pomocniczego włączając długość, jaką zajmują przekazane dane.
       Jest to wyrażenie stałe.

       CMSG_DATA() zwraca wskaźnik do części cmsghdr zawierającej dane.

       CMSG_LEN() zwraca wartość, która ma być przechowywana w elemencie cmsg_len struktury cmsghdr, biorąc  pod
       uwagę wszelkie niezbędne wyrównania. Jako argument pobiera długość danych. Jest to wyrażenie stałe.

       Aby  utworzyć  dane  pomocnicze,  należy  najpierw  zainicjować  element  msg_controllen struktury msghdr
       długością bufora komunikatów sterujących. Należy użyć CMSG_FIRSTHDR() dla msghdr, aby  otrzymać  pierwszy
       komunikat  sterujący,  oraz  CMSG_NXTHDR(),  aby  otrzymać  wszystkie  następne.  Dla  każdego komunikatu
       sterującego należy zainicjować cmsg_len (za pomocą CMSG_LEN()), inne pola  nagłówka  cmsghdr  oraz  część
       zawierającą dane za pomocą CMSG_DATA(). Ostatecznie pole msg_controllen struktury msghdr powinno zawierać
       sumę CMSG_SPACE() długości wszystkich komunikatów sterujących w buforze.  Więcej  informacji  dotyczących
       msghdr znajduje się w recvmsg(2).

       Gdy  bufor  komunikatów  sterujących  jest za krótki, aby przechować wszystkie komunikaty, ustawiany jest
       znacznik MSG_CTRUNC elementu msg_flags struktury msghdr.

ZGODNE Z

       Ten model danych pomocniczych jest zgodny ze szkicem POSIX.1g, z 4.4BSD-Lite,  z  zaawansowanym  API  dla
       IPv6 opisanym w RFC 2292 oraz z SUSv2. CMSG_ALIGN() jest rozszerzeniem Linuksa.

UWAGI

       Dla  przenośności,  dostęp  do  danych  pomocniczych  powinien się odbywać jedynie za pomocą opisanych tu
       makrodefinicji. CMSG_ALIGN()  jest  rozszerzeniem  Linuksa  i  nie  powinno  być  używane  w  przenośnych
       programach.

       W  Linuksie,  CMSG_LEN(),  CMSG_DATA() i CMSG_ALIGN() są wyrażeniami stałymi (zakładając, że ich argument
       jest stały) - można to wykorzystać do zadeklarowania rozmiaru zmiennych globalnych. Jednakże, może się to
       okazać nieprzenośnym.

PRZYKŁAD

       Następujący kod poszukuje opcji IP_TTL w otrzymanym buforze pomocniczym:

           struct msghdr msgh;
           struct cmsghdr *cmsg;
           int *ttlptr;
           int received_ttl;

           /* Otrzymywanie danych z zewnątrz do msgh */

           for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL;
                   cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
               if (cmsg->cmsg_level == IPPROTO_IP
                       && cmsg->cmsg_type == IP_TTL) {
                   ttlptr = (int *) CMSG_DATA(cmsg);
                   received_ttl = *ttlptr;
                   break;
               }
           }

           if (cmsg == NULL) {
                /* Błąd: IP_TTL nie jest włączone, za mały bufor
                   lub błąd wejścia/wyjścia */
           }

       Poniższy kod przekazuje tablicę deskryptorów plików przez gniazdo domeny UNIX SCM_RIGHTS:

           struct msghdr msg = { 0 };
           struct cmsghdr *cmsg;
           int myfds[NUM_FD];  /* Zawiera przekazywane deskryptory plików */
           int *fdptr;
           union {         /* Bufor danych pomocniczych, opakowany w unię,
                              aby zapewnić jego odpowiednie wyrównanie */
               char buf[CMSG_SPACE(sizeof(myfds))];
               struct cmsghdr align;
           } u;

           msg.msg_control = u.buf;
           msg.msg_controllen = sizeof(u.buf);
           cmsg = CMSG_FIRSTHDR(&msg);
           cmsg->cmsg_level = SOL_SOCKET;
           cmsg->cmsg_type = SCM_RIGHTS;
           cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD);
           fdptr = (int *) CMSG_DATA(cmsg);    /* Inicjacja payloadu */
           memcpy(fdptr, myfds, NUM_FD * sizeof(int));

ZOBACZ TAKŻE

       recvmsg(2), sendmsg(2)

       RFC 2292

O STRONIE

       Angielska  wersja  tej strony pochodzi z wydania 4.07 projektu Linux man-pages. Opis projektu, informacje
       dotyczące  zgłaszania   błędów,   oraz   najnowszą   wersję   oryginału   można   znaleźć   pod   adresem
       https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony  podręcznika  man  są:  Andrzej Krzysztofowicz (PTM)
       <ankry@mif.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie  błędów  na  stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  4.07 oryginału.