Man page - cmsg(3)

Packages contains this manual

Available languages:

en fr pl ja

Manual

CMSG

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VERSIONS
STANDARDS
HISTORIQUE
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - Accéder aux informations de service

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#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
longueur );
size_t CMSG_SPACE(size_t
longueur );
size_t CMSG_LEN(size_t
longueur );
unsigned char *CMSG_DATA(struct cmsghdr *
cmsg );

DESCRIPTION

Ces macros permettent de crĂ©er et accĂ©der aux messages de contrĂŽle (aussi appelĂ© informations de service) qui ne font pas partie de la charge utile des sockets. Ces informations de contrĂŽle peuvent inclure l’interface sur laquelle le paquet a Ă©tĂ© reçu, des champs d’en-tĂȘte rarement employĂ©s, des descriptions d’erreur approfondies, un ensemble de descripteurs de fichiers ou des identificateurs UNIX. Par exemple, les messages de contrĂŽle peuvent ĂȘtre utilisĂ©s pour envoyer des champs d’en-tĂȘte supplĂ©mentaires tels que des options IP. Les donnĂ©es de service sont Ă©mises en appelant sendmsg (2) et reçues avec recvmsg (2). Reportez-vous Ă  leurs pages de manuel respectives pour plus d’informations.

Une information de service est une sĂ©quence de structures cmsghdr avec des donnĂ©es ajoutĂ©es. Consultez les pages de manuel relatives aux protocoles pour les types de message de commande disponibles. La taille maximale d’un tampon de service par socket peut ĂȘtre dĂ©finie Ă  l’aide de /proc/sys/net/core/optmem_max . Consultez socket (7).

La structure cmsghdr est définie comme suit :

struct cmsghdr {
size_t cmsg_len; /* Nombre d’octets de donnĂ©es, incluant l’en-tĂȘte
(le type est socklen_t dans POSIX) */
int cmsg_level; /* Protocole d’origine */
int cmsg_type; /* Type spécifique au protocole */
/* suivi par
unsigned char cmsg_data[]; */
};

PlutĂŽt que d’accĂ©der directement Ă  la sĂ©quence de structures cmsghdr , il est impĂ©ratif d’utiliser les macros suivantes :
CMSG_FIRSTHDR
()

renvoie un pointeur sur la premiĂšre structure cmsghdr du tampon de donnĂ©es de service associĂ© Ă  la structure msghdr passĂ©e en paramĂštre. Elle renvoie NULL s’il n’y a pas assez de place pour une structure cmsghdr dans le tampon.

CMSG_NXTHDR ()

renvoie la prochaine structure cmsghdr valable aprĂšs la structure cmsghdr passĂ©e en paramĂštre. Elle renvoie NULL s’il n’y a plus assez de place dans le tampon.

Lorsqu’on initialise un tampon qui contiendra une sĂ©rie de structures cmsghdr (Ă  envoyer par exemple en appelant sendmsg (2)), ce tampon doit ĂȘtre initialisĂ© avec des zĂ©ros pour ĂȘtre sĂ»r que CMSG_NXTHDR () fonctionnera correctement.

CMSG_ALIGN (),

avec comme argument une longueur, la renvoie en incluant l’alignement nĂ©cessaire. C’est une expression constante.

CMSG_SPACE ()

renvoie le nombre d’octets qu’occupe un Ă©lĂ©ment de service avec une charge utile de la longueur passĂ©e en paramĂštre. C’est une expression constante.

CMSG_DATA ()

renvoie un pointeur vers la partie donnĂ©es d’une structure cmsghdr . Il n’est pas certain que le pointeur renvoyĂ© soit correctement alignĂ© pour accĂ©der Ă  des donnĂ©es de charge utile de type quelconque. Les applications ne doivent pas forcer son type Ă  un type de pointeur correspondant Ă  celui de la charge utile, mais doivent plutĂŽt utiliser memcpy (3) pour copier les donnĂ©es vers ou depuis un objet dĂ©clarĂ© de maniĂšre appropriĂ©e.

CMSG_LEN ()

renvoie la valeur Ă  stocker dans le membre cmsg_len de la structure cmsghdr , en tenant compte des alignements nĂ©cessaires. Elle prend en paramĂštre la longueur des donnĂ©es. C’est une expression constante.

Pour crĂ©er des donnĂ©es de service, il faut tout d’abord initialiser le membre msg_controllen de la structure msghdr avec la longueur du tampon du message de contrĂŽle. Utilisez CMSG_FIRSTHDR () sur la structure msghdr pour obtenir le premier message de contrĂŽle, puis CMSG_NXTHDR () pour obtenir les suivants. Dans chaque message de contrĂŽle, initialisez cmsg_len (avec CMSG_LEN ()), les autres champs d’en-tĂȘte de cmsghdr et la partie des donnĂ©es avec CMSG_DATA (). Enfin, il faut dĂ©finir le membre msg_controllen de la structure msghdr avec la somme des valeurs de retour de CMSG_SPACE () pour la longueur de tous les messages de contrĂŽle contenus dans le tampon..Pour plus d’informations sur la structure msghdr , consultez recvmsg (2).

VERSIONS

Pour des questions de portabilitĂ©, les donnĂ©es de service ne doivent ĂȘtre manipulĂ©es qu’avec les macros dĂ©crites ici.

Sous Linux, CMSG_LEN (), CMSG_DATA () et CMSG_ALIGN () sont des expressions constantes (si leur argument est une constante) ; elles peuvent donc ĂȘtre utilisĂ©es pour dĂ©clarer la taille de variables globales. Cela peut nĂ©anmoins ne pas ĂȘtre portable.

STANDARDS

CMSG_FIRSTHDR ()
CMSG_NXTHDR
()
CMSG_DATA
()

POSIX.1-2008.

CMSG_SPACE ()
CMSG_LEN
()
CMSG_ALIGN
()

Linux.

HISTORIQUE

Le modĂšle des donnĂ©es de service est conforme Ă  POSIX.1g draft, 4.4BSD-Lite, l’API IPv6 avancĂ©e dĂ©crite dans la RFC 2292 et SUSv2.

CMSG_SPACE () et CMSG_LEN () seront incluses dans la prochaine version de POSIX (édition 8).

EXEMPLES

Ce code recherche l’option IP_TTL dans un tampon de service reçu :

struct msghdr msgh;
struct cmsghdr *cmsg;
int received_ttl;
/* Recevoir des données de service dans 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;
}
}

Le code ci-dessous passe un tableau de descripteurs de fichier au travers d’un socket de domaine UNIX à l’aide de SCM_RIGHTS :

struct msghdr msg = { 0 };
struct cmsghdr *cmsg;
int myfds[NUM_FD]; /* Contient les descripteurs de fichier Ă  passer */
char iobuf[1];
struct iovec io = {
.iov_base = iobuf,
.iov_len = sizeof(iobuf)
};
union { /* Tampon des données de service empaqueté dans une union
pour ĂȘtre sĂ»r qu’il soit correctement alignĂ© */
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));

Pour un exemple de code complet qui montre la transmission de descripteurs de fichier Ă  travers un socket de domaine UNIX, voir seccomp_unotify (2).

VOIR AUSSI

recvmsg (2), sendmsg (2)

RFC 2292

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .