Przeglądaj źródła

chapters/linux_file_descriptor: ajout précisions

Alexandre Janniaux 6 lat temu
rodzic
commit
b729b50cf3
1 zmienionych plików z 20 dodań i 10 usunięć
  1. 20 10
      chapters/linux_file_descriptor.tex

+ 20 - 10
chapters/linux_file_descriptor.tex

@@ -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.