Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd)
- {
- struct msghdr msg;
- struct iovec iov[1];
- ssize_t n;
- union
- {
- struct cmsghdr cm;
- char control[CMSG_SPACE(sizeof(int))];
- } control_un;
- struct cmsghdr *cmptr;
- msg.msg_control = control_un.control;
- msg.msg_controllen = sizeof(control_un.control);
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- iov[0].iov_base = ptr;
- iov[0].iov_len = nbytes;
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- if ( (n = recvmsg(fd, &msg, 0)) <= 0)
- return(n);
- if( (cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int)) )
- {
- if (cmptr->cmsg_level != SOL_SOCKET)
- return -1;
- if (cmptr->cmsg_type != SCM_RIGHTS)
- return -1;
- *recvfd = *((int *) CMSG_DATA(cmptr));
- }
- else
- {
- *recvfd = -1; /* descriptor was n ./server/read_fd.c ./server/write_fd.cot passed */
- }
- return(n);
- }
- ssize_t write_fd(int fd, void *ptr, size_t nbytes, int sendfd)
- {
- struct msghdr msg;
- struct iovec iov[1];
- union
- {
- struct cmsghdr cm;
- char control[CMSG_SPACE(sizeof(int))];
- } control_un;
- struct cmsghdr* cmptr;
- msg.msg_control = control_un.control;
- msg.msg_controllen = sizeof(control_un.control);
- cmptr = CMSG_FIRSTHDR(&msg);
- cmptr->cmsg_len = CMSG_LEN(sizeof(int));
- cmptr->cmsg_level = SOL_SOCKET;
- cmptr->cmsg_type = SCM_RIGHTS;
- *((int *) CMSG_DATA(cmptr)) = sendfd;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- iov[0].iov_base = ptr;
- iov[0].iov_len = nbytes;
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- return(sendmsg(fd, &msg, 0));
- }
- int main()
- {
- int socks[2];
- char dummy = 0;
- int myfd = -1;
- socketpair(AF_LOCAL, SOCK_STREAM, 0, socks);
- if (fork())
- {
- myfd = STDIN_FILENO;
- if (write_fd(*socks, &dummy, 1, myfd) < 1)
- {
- printf("epic fail a\n");
- abort();
- }
- }
- else
- {
- for (;;)
- {
- myfd = -1;
- if (read_fd(socks[1], &dummy, 1, &myfd) < 1)
- {
- printf("epic fail b\n");
- abort();
- }
- printf("myfd received: %i\n", myfd);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement