.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
.\"
.\" %%%LICENSE_START(VERBATIM_ONE_PARA)
.\" Permission is granted to distribute possibly modified copies
.\" of this page provided the header is included verbatim,
.\" and in case of nontrivial modification author and date
.\" of the modification is added to the header.
.\" %%%LICENSE_END
.\"
.\" $Id: cmsg.3,v 1.8 2000/12/20 18:10:31 ak Exp $
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\" This file is distributed under the same license as original manpage
.\" Copyright of the original manpage:
.\" Copyright © 1999 Andi Kleen <ak@muc.de> (unknown)
.\" Copyright © of Polish translation:
.\" Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, 2001.
.\" Robert Luberda <robert@debian.org>, 2013.
.\" Michał Kułach <michal.kulach@gmail.com>, 2013, 2014, 2016.
.TH CMSG 3 2016\-03\-15 Linux "Podręcznik programisty Linuksa"
.SH NAZWA
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR \- dostęp do danych
pomocniczych
.SH SKŁADNIA
\fB#include <sys/socket.h>\fP
.sp
\fBstruct cmsghdr *CMSG_FIRSTHDR(struct msghdr *\fP\fImsgh\fP\fB);\fP
.br
\fBstruct cmsghdr *CMSG_NXTHDR(struct msghdr *\fP\fImsgh\fP\fB, struct cmsghdr
*\fP\fIcmsg\fP\fB);\fP
.br
\fBsize_t CMSG_ALIGN(size_t \fP\fIlength\fP\fB);\fP
.br
\fBsize_t CMSG_SPACE(size_t \fP\fIlength\fP\fB);\fP
.br
\fBsize_t CMSG_LEN(size_t \fP\fIlength\fP\fB);\fP
.br
\fBunsigned char *CMSG_DATA(struct cmsghdr *\fP\fIcmsg\fP\fB);\fP
.sp
.nf
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[]; */
};
.fi
.SH 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 \fBsendmsg\fP(2), a odbierane poprzez wywołanie \fBrecvmsg\fP(2).
Więcej informacji znajduje się na stronach podręcznika tych poleceń.
.PP
Dane pomocnicze są ciągiem struktur \fIstruct cmsghdr\fP 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 \fI/proc/sys/net/core/optmem_max\fP; patrz
\fBsocket\fP(7).
.PP
\fBCMSG_FIRSTHDR\fP() zwraca wskaźnik do pierwszego \fIcmsghdr\fP w buforze danych
pomocniczych związanym z przekazanym \fImsghdr\fP.
.PP
\fBCMSG_NXTHDR\fP() zwraca następny poprawny \fIcmsghdr\fP po przekazanym
\fIcmsghdr\fP. Zwraca NULL, gdy brak dostatecznej ilości miejsca w buforze.
.PP
\fBCMSG_ALIGN\fP() zwraca żądaną długość, włączając niezbędne wyrównanie. Jest
to wyrażenie stałe.
.PP
\fBCMSG_SPACE\fP() zwraca liczbę bajtów elementu pomocniczego włączając
długość, jaką zajmują przekazane dane. Jest to wyrażenie stałe.
.PP
\fBCMSG_DATA\fP() zwraca wskaźnik do części \fIcmsghdr\fP zawierającej dane.
.PP
\fBCMSG_LEN\fP() zwraca wartość, która ma być przechowywana w elemencie
\fIcmsg_len\fP struktury \fIcmsghdr\fP, biorąc pod uwagę wszelkie niezbędne
wyrównania. Jako argument pobiera długość danych. Jest to wyrażenie stałe.
.PP
Aby utworzyć dane pomocnicze, należy najpierw zainicjować element
\fImsg_controllen\fP struktury \fImsghdr\fP długością bufora komunikatów
sterujących. Należy użyć \fBCMSG_FIRSTHDR\fP() dla \fImsghdr\fP, aby otrzymać
pierwszy komunikat sterujący, oraz \fBCMSG_NXTHDR\fP(), aby otrzymać wszystkie
następne. Dla każdego komunikatu sterującego należy zainicjować \fIcmsg_len\fP
(za pomocą \fBCMSG_LEN\fP()), inne pola nagłówka \fIcmsghdr\fP oraz część
zawierającą dane za pomocą \fBCMSG_DATA\fP(). Ostatecznie pole
\fImsg_controllen\fP struktury \fImsghdr\fP powinno zawierać sumę \fBCMSG_SPACE\fP()
długości wszystkich komunikatów sterujących w buforze. Więcej informacji
dotyczących \fImsghdr\fP znajduje się w \fBrecvmsg\fP(2).
.PP
Gdy bufor komunikatów sterujących jest za krótki, aby przechować wszystkie
komunikaty, ustawiany jest znacznik \fBMSG_CTRUNC\fP elementu \fImsg_flags\fP
struktury \fImsghdr\fP.
.SH "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. \fBCMSG_ALIGN\fP() jest rozszerzeniem Linuksa.
.SH UWAGI
Dla przenośności, dostęp do danych pomocniczych powinien się odbywać jedynie
za pomocą opisanych tu makrodefinicji. \fBCMSG_ALIGN\fP() jest rozszerzeniem
Linuksa i nie powinno być używane w przenośnych programach.
.PP
W Linuksie, \fBCMSG_LEN\fP(), \fBCMSG_DATA\fP() i \fBCMSG_ALIGN\fP() 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.
.SH PRZYKŁAD
Następujący kod poszukuje opcji \fBIP_TTL\fP w otrzymanym buforze pomocniczym:
.PP
.in +4n
.nf
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 */
}
.fi
.in
.PP
Poniższy kod przekazuje tablicę deskryptorów plików przez gniazdo domeny
UNIX \fBSCM_RIGHTS\fP:
.PP
.in +4n
.nf
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));
.fi
.in
.SH "ZOBACZ TAKŻE"
\fBrecvmsg\fP(2), \fBsendmsg\fP(2)
.PP
RFC\ 2292
.SH "O STRONIE"
Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux
\fIman\-pages\fP. 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/.
.SH 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>.
.PP
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ą \fB 4.07 \fPoryginału.
