oracular (3) CMSG_ALIGN.3.gz

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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.