|
@@ -190,19 +190,17 @@ ipc_internal_SendMsg( int socket_fd, unsigned nb_buffer,
|
|
|
} ctlbuf;
|
|
|
\end{code}
|
|
|
|
|
|
-\begin{code}{c}{Conversion des tampons et initialisation du msghdr}
|
|
|
+Les tampons mémoires sont convertis de la représentation de l'application vers
|
|
|
+celle de l'API Linux.
|
|
|
|
|
|
- /* On convertit les tampon mémoire de l'application vers la représentation
|
|
|
- * demandée par sendmsg */
|
|
|
+\begin{code}{c}{Conversion des tampons et initialisation du msghdr}
|
|
|
struct iovec iov[nb_buffer];
|
|
|
- for (unsigned i=0; i<nb_buffer; ++i)
|
|
|
- {
|
|
|
+ for (unsigned i=0; i<nb_buffer; ++i) {
|
|
|
iov[i].iov_base = buffers[i]->buffer;
|
|
|
iov[i].iov_len = buffers[i]->length;
|
|
|
}
|
|
|
|
|
|
- struct msghdr msgh =
|
|
|
- {
|
|
|
+ struct msghdr msgh = {
|
|
|
.msg_name = NULL,
|
|
|
.msg_namelen = 0,
|
|
|
.msg_iov = iov,
|
|
@@ -213,9 +211,12 @@ ipc_internal_SendMsg( int socket_fd, unsigned nb_buffer,
|
|
|
};
|
|
|
\end{code}
|
|
|
|
|
|
+Puis les descripteurs de fichier sont copiés dans la structure.
|
|
|
+\inltype{SCM_RIGHTS} permet d'indiquer ici que ce sont bien des descripteurs de
|
|
|
+fichier et qu'il va falloir les dupliquer dans le processus qui reçoit le
|
|
|
+paquet.
|
|
|
+
|
|
|
\begin{code}{c}{Création des données auxiliaires}
|
|
|
- /* Si on a des descripteurs de fichier à envoyer,
|
|
|
- * on initialise la structure ici */
|
|
|
if( nb_fd > 0 )
|
|
|
{
|
|
|
struct cmsghdr *cmsg = CMSG_FIRSTHDR( &msgh );
|
|
@@ -233,6 +234,9 @@ ipc_internal_SendMsg( int socket_fd, unsigned nb_buffer,
|
|
|
}
|
|
|
\end{code}
|
|
|
|
|
|
+Enfin le message est envoyé. On utilise \inltype{MSG_EOR} pour pouvoir signaler
|
|
|
+la fin du message, comme il s'agit de \inltype{SOCK_SEQPACKET} mais d'autres
|
|
|
+solutions sont possibles.
|
|
|
|
|
|
\begin{code}{c}{Envoi du message}
|
|
|
ssize_t i_size = sendmsg( socket_fd, &msgh, MSG_EOR );
|
|
@@ -254,7 +258,9 @@ ipc_internal_SendMsg( int socket_fd, unsigned nb_buffer,
|
|
|
|
|
|
% TODO développer problématiques
|
|
|
|
|
|
-Pour la réception on a de façon similaire:
|
|
|
+Pour la réception, la méthode est similaire, à l'exception de l'apparition de
|
|
|
+\inltype{CMSG_LEN(0)} pour remplacer \inltype{CSMG_ALIGN} qui n'existe que sous
|
|
|
+Linux:
|
|
|
|
|
|
\begin{code}{c}{Réception des descripteurs de fichier}
|
|
|
struct cmsghdr *cmsg = CMSG_FIRSTHDR( &msgh );
|
|
@@ -285,3 +291,7 @@ Pour la réception on a de façon similaire:
|
|
|
cmsg = CMSG_NXTHDR( &msgh, cmsg );
|
|
|
}
|
|
|
\end{code}
|
|
|
+
|
|
|
+Finalement, nous avons ainsi conçu un moyen de construire des jetons
|
|
|
+inforgeables pouvant soit transmettre d'autres jetons, soit servir de RPC vers
|
|
|
+un accès particulier.
|