Advertisement
Guest User

sendmsg

a guest
Oct 27th, 2011
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.16 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd)
  9. {
  10.     struct msghdr   msg;
  11.     struct iovec    iov[1];
  12.     ssize_t         n;
  13.  
  14.     union
  15.     {
  16.       struct cmsghdr    cm;
  17.       char              control[CMSG_SPACE(sizeof(int))];
  18.     } control_un;
  19.     struct cmsghdr  *cmptr;
  20.  
  21.     msg.msg_control = control_un.control;
  22.     msg.msg_controllen = sizeof(control_un.control);
  23.  
  24.     msg.msg_name = NULL;
  25.     msg.msg_namelen = 0;
  26.  
  27.     iov[0].iov_base = ptr;
  28.     iov[0].iov_len = nbytes;
  29.     msg.msg_iov = iov;
  30.     msg.msg_iovlen = 1;
  31.  
  32.     if ( (n = recvmsg(fd, &msg, 0)) <= 0)
  33.         return(n);
  34.  
  35.     if( (cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int)) )
  36.     {
  37.         if (cmptr->cmsg_level != SOL_SOCKET)
  38.             return -1;
  39.         if (cmptr->cmsg_type != SCM_RIGHTS)
  40.             return -1;
  41.         *recvfd = *((int *) CMSG_DATA(cmptr));
  42.     }
  43.     else
  44.     {
  45.         *recvfd = -1;       /* descriptor was n ./server/read_fd.c ./server/write_fd.cot passed */
  46.     }
  47.  
  48.     return(n);
  49. }
  50.  
  51. ssize_t write_fd(int fd, void *ptr, size_t nbytes, int sendfd)
  52. {
  53.     struct msghdr msg;
  54.     struct iovec iov[1];
  55.  
  56.     union
  57.     {
  58.         struct cmsghdr cm;
  59.         char control[CMSG_SPACE(sizeof(int))];
  60.     } control_un;
  61.     struct cmsghdr* cmptr;
  62.  
  63.     msg.msg_control = control_un.control;
  64.     msg.msg_controllen = sizeof(control_un.control);
  65.  
  66.     cmptr = CMSG_FIRSTHDR(&msg);
  67.     cmptr->cmsg_len = CMSG_LEN(sizeof(int));
  68.     cmptr->cmsg_level = SOL_SOCKET;
  69.     cmptr->cmsg_type = SCM_RIGHTS;
  70.     *((int *) CMSG_DATA(cmptr)) = sendfd;
  71.    
  72.     msg.msg_name = NULL;
  73.     msg.msg_namelen = 0;
  74.  
  75.     iov[0].iov_base = ptr;
  76.     iov[0].iov_len = nbytes;
  77.     msg.msg_iov = iov;
  78.     msg.msg_iovlen = 1;
  79.  
  80.     return(sendmsg(fd, &msg, 0));
  81. }
  82.  
  83.  
  84. int main()
  85. {
  86.     int socks[2];
  87.     char dummy = 0;
  88.     int myfd = -1;
  89.    
  90.     socketpair(AF_LOCAL, SOCK_STREAM, 0, socks);
  91.    
  92.     if (fork())
  93.     {
  94.         myfd = STDIN_FILENO;
  95.         if (write_fd(*socks, &dummy, 1, myfd) < 1)
  96.         {
  97.             printf("epic fail a\n");
  98.             abort();
  99.         }
  100.     }
  101.     else
  102.     {
  103.         for (;;)
  104.         {
  105.             myfd = -1;
  106.             if (read_fd(socks[1], &dummy, 1, &myfd) < 1)
  107.             {
  108.                 printf("epic fail b\n");
  109.                 abort();
  110.             }
  111.             printf("myfd received: %i\n", myfd);
  112.         }
  113.     }
  114.    
  115.     return 0;
  116. }
  117.  
  118.  
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement