Provided by: manpages-pl-dev_20060617-3_all bug

NAZWA

       CMSG_ALIGN,  CMSG_SPACE,  CMSG_NXTHDR,  CMSG_FIRSTHDR - dostp do danych
       pomocniczych

SK/LADNIA

       #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 {
               socklen_t   cmsg_len;   /* liczba bajtow danych, wlczajc naglowek */
               int         cmsg_level; /* protokol rodlowy */
               int         cmsg_type;  /* zaleny od protokolu typ */
       /* nastpuje po nim  unsigned charcmsg_data[]; */
       };

OPIS

       Makrodefinicje te slu do tworzenia i dostpu do  komunikatow  sterujcych
       (zwanych  rownie  danymi  pomocniczymi),  ktore nie s czci gniazda.  Te
       informacje sterujce mog zawiera: interfejs, przez ktory  pakiet  zostal
       odebrany,  rone  rzadko  uywane  pola  naglowka, rozszerzony opis bldu,
       zestaw deskryptorow plikow lub uwierzytelnie uniksowych.  Na  przyklad,
       komunikaty  sterujce  mog  sluy do ustawiania dodatkowych pol naglowka,
       takich jak opcje  IP,  dla  wysylanych  pakietow.   Dane  pomocnicze  s
       wysylane  poprzez  wywolanie sendmsg(2) a otrzymywane poprzez wywolanie
       recvmsg(2).  Wicej informacji znajduje si na  stronach  podrcznika  man
       dla tych polece.

       Dane  pomocnicze  s  cigiem  struktur struct cmsghdr z dodanymi danymi.
       Dostp do tego cigu powinien si odbywa wylcznie poprzez opisane  na  tej
       stronie   podrcznika  makrodefinicje,  nigdy  za  bezporednio.  Dostpne
       rodzaje komunikatow  sterujcych  opisano  na  stronach  podrcznika  dla
       poszczegolnych    protokolow.    Maksymalny   rozmiar   bufora   danych
       pomocniczych   dla   gniazda   mona   ustawi    za    pomoc    sysctl-a
       net.core.optmem_max; patrz socket(7).

       CMSG_FIRSTHDR  zwraca  wskanik  do  pierwszego cmsghdr w buforze danych
       pomocniczych zwizanym z przekazanym msghdr.

       CMSG_NXTHDR zwraca nastpny poprawny  cmsghdr  po  przekazanym  cmsghdr.
       Zwraca NULL, gdy brak dostatecznej iloci miejsca w buforze.

       CMSG_ALIGN, zadana dlugo, zwraca j wlczajc niezbdne wyrownanie. Jest to
       wyraenie stale.

       CMSG_SPACE zwraca liczb bajtow elementu pomocniczego wlczajc dlugo, jak
       zajmuj przekazane dane. Jest to wyraenie stale.

       CMSG_DATA zwraca wskanik do czci cmsghdr zawierajcej dane.

       CMSG_LEN  zwraca  warto, ktora ma by przechowywana w elemencie cmsg_len
       struktury cmsghdr, biorc pod uwag wszelkie  niezbdne  wyrownania.  Jako
       argument pobiera dlugo danych. Jest to wyraenie stale.

       Aby  utworzy  dane  pomocnicze,  naley  najpierw zainicjalizowa element
       msg_controllen struktury msghdr dlugoci bufora komunikatow  sterujcych.
       Naley  uy  CMSG_FIRSTHDR  dla  msghdr,  aby  otrzyma pierwszy komunikat
       sterujcy oraz CMSG_NEXTHDR, aby otrzyma wszystkie nastpne.  Dla  kadego
       komunikatu   sterujcego   naley   zainicjalizowa   cmsg_len  (za  pomoc
       CMSG_LEN), inne pola naglowka cmsghdr oraz cz zawierajc dane  za  pomoc
       CMSG_DATA.   Ostatecznie  pole  msg_controllen struktury msghdr powinno
       zawiera sum CMSG_SPACE dla dlugoci wszystkich komunikatow sterujcych  w
       buforze.  Wicej informacji dotyczcych msghdr, znajduje si w recvmsg(2).

       Gdy   bufor  komunikatow  sterujcych  jest  za  krotki,  aby  przechowa
       wszystkie  komunikaty,  ustawiany  jest  znacznik  MSG_CTRUNC  elementu
       msg_flags struktury msghdr.

PRZYK/LAD

       Nastpujcy kod poszukuje opcji IP_TTL w otrzymanym buforze pomocniczym:

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

              /* Otrzymywanie danych z zewntrz do msgh */
              for (cmsg = CMSG_FIRSTHDR(&msgh);
                   cmsg != NULL;
                   cmsg = CMSG_NXTHDR(&msgh,cmsg) {
                      if (cmsg->cmsg_level == SOL_IP
                        && cmsg->cmsg_type == IP_TTL) {
                              ttlptr = (int *) CMSG_DATA(cmsg);
                              received_ttl = *ttlptr;
                              break;
                      }
              }
              if (cmsg == NULL) {
                      /*
                       * Bld: IP_TTL not jest wlczone, za maly bufor lub
                       * bld I/O.
                       */
              }

       Poniszy  kod  przekazuje  tablic  deskryptorow  plikow  poprzez gniazdo
       Uniksa SCM_RIGHTS:

              struct msghdr msg = {0};
              struct cmsghdr *cmsg;
              int myfds[NUM_FD]; /* Zawiera przekazywane deskryptory plikow. */
              char buf[CMSG_SPACE(sizeof myfds)];  /* bufor danych pomocniczych */
              int *fdptr;

              msg.msg_control = buf;
              msg.msg_controllen = sizeof buf;
              cmsg = CMSG_FIRSTHDR(&msg);
              cmsg->cmsg_level = SOL_SOCKET;
              cmsg->cmsg_type = SCM_RIGHTS;
              cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD);
              /* Inicjalizacja: */
              fdptr = (int *)CMSG_DATA(cmsg);
              memcpy(fdptr, myfds, NUM_FD * sizeof(int));
              /* Suma dlugoci wszystkich komunikatow sterujcych w buforze: */
              msg.msg_controllen = cmsg->cmsg_len;

UWAGI

       Dla przenonoci, dostp do danych pomocniczych powinien si odbywa jedynie
       za  pomoc  opisanych  tu makrodefinicji.  CMSG_ALIGN jest rozszerzeniem
       Linuksa i nie powinno by uywane w przenonych programach.

       W Linuksie, CMSG_LEN, CMSG_DATA,  i  CMSG_ALIGN  s  wyraeniami  stalymi
       (zakladajc,  e  ich  argument  jest  staly)  -  mona  to  wykorzysta do
       zadeklarowania rozmiaru zmiennych globalnych.  Jednake, moe si to okaza
       nieprzenonym.

ZGODNE Z

       Ten  model  danych pomocniczych jest zgodny ze szkicem POSIX.1003.1g, z
       4.4BSD-Lite, z zaawansowanym API dla IPv6 opisanym w  RFC2292  oraz  ze
       specyfikacj Single Unix v2.  CMSG_ALIGN jest rozszerzeniem Linuksa.

ZOBACZ TAKE

       sendmsg(2), recvmsg(2)

       RFC 2292

INFORMACJE O T/LUMACZENIU

       Powysze  tlumaczenie  pochodzi z nieistniejcego ju Projektu Tlumaczenia
       Manuali i moe nie by aktualne. W razie zauwaenia ronic  midzy  powyszym
       opisem  a  rzeczywistym  zachowaniem  opisywanego programu lub funkcji,
       prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.