Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

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

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

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);

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 cmsghdr z dodanymi danymi. 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).

       Struktura cmsghdr jest zdefiniowana następująco:

           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 */
           /* po których następuje
              unsigned char cmsg_data[]; */
           };

       Dostęp  do ciągu struktur cmsghdr nidy nie powinien się odbywać bezpośrednio. Należy używać następujących
       makrodefinicji:

       CMSG_FIRSTHDR()
              zwraca wskaźnik do pierwszego cmsghdr  w  buforze  danych  pomocniczych  związanym  z  przekazanym
              msghdr. Zwraca NULL, jeśli bufor jest za mały, by pomieścić cmsghdr.

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

              Podczas  inicjowania  bufora,  który  ma  zawierać  ciąg  struktur  cmsghdr  (na  przykład  w celu
              przesłania za pomocą sendmsg(2)), bufor ten powinien  być  najpierw  inicjowany  zerami,  tak  aby
              zapewnić poprawne działanie CMSG_NXTHDR().

       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 z danymi cmsghdr. Nie można  zakładać,  że  zwracany  wskaźnik  zostanie
              wystarczająco  wyrównany,  do  dostępu do dowolnych typów zawartości danych. Aplikacje nie powinny
              rzutować go na typ wskaźnika pasujący do zawartości, lecz korzystać z memcpy(3), aby kopiować dane
              z, lub do, odpowiednio zadeklarowanego obiektu.

       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).

WERSJE

       Dla  przenośności,  dostęp  do  danych  pomocniczych  powinien się odbywać jedynie za pomocą opisanych tu
       makrodefinicji.

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

STANDARDY

       CMSG_FIRSTHDR()
       CMSG_NXTHDR()
       CMSG_DATA()
              POSIX.1-2008.

       CMSG_SPACE()
       CMSG_LEN()
       CMSG_ALIGN()
              Linux.

HISTORIA

       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_SPACE() i CMSG_LEN() będą objęte następnym wydaniem POSIX (Issue 8).

PRZYKŁADY

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

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

           /* Otrzymywanie danych pomocniczych w msgh */

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

           if (cmsg == NULL) {
               /* Błąd: nie włączono IP_TTL lub mały bufor lub błąd we/wy */
           }

       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 */
           char iobuf[1];
           struct iovec io = {
               .iov_base = iobuf,
               .iov_len = sizeof(iobuf)
           };
           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_iov = &io;
           msg.msg_iovlen = 1;
           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(myfds));
           memcpy(CMSG_DATA(cmsg), myfds, sizeof(myfds));

       Pełny  kod, pokazujący także przekazywanie deskryptorów pliku przez gniazdo domeny Uniksa, znajduje się w
       podręczniku seccomp_unotify(2).

ZOBACZ TAKŻE

       recvmsg(2), sendmsg(2)

       RFC 2292

TŁUMACZENIE

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

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3  lub  nowszej.   Nie   przyjmuje   się   ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej manpages-pl-
       list@lists.sourceforge.net.

Linux man-pages 6.8                              2 maja 2024 r.                                          CMSG(3)