Provided by: manpages-pl-dev_4.13-4_all 

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);
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() returns a pointer to the data portion of a cmsghdr. The pointer returned cannot be
assumed to be suitably aligned for accessing arbitrary payload data types. Applications should not
cast it to a pointer type matching the payload, but should instead use memcpy(3) to copy data to or
from a suitably declared object.
* 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).
ZGODNE Z
This ancillary data model conforms to the POSIX.1g draft, 4.4BSD-Lite, the IPv6 advanced API described in
RFC 2292 and SUSv2. CMSG_FIRSTHDR(), CMSG_NXTHDR(), and CMSG_DATA() are specified in POSIX.1-2008.
CMSG_SPACE() and CMSG_LEN() will be included in the next POSIX release (Issue 8).
CMSG_ALIGN() is a Linux extension.
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), co oznacza, że te wartości można do zadeklarowania rozmiaru zmiennych globalnych. Jednakże,
może się to okazać nieprzenośne.
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 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) {
memcpy(&receive_ttl, CMSG_DATA(cmsg), sizeof(received_ttl));
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 */
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));
ZOBACZ TAKŻE
recvmsg(2), sendmsg(2)
RFC 2292
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.10 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 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 1 listopada 2020 r. CMSG(3)