write_fd.c 1017 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /* include write_fd */
  2. #include "unp.h"
  3. ssize_t
  4. write_fd(int fd, void *ptr, size_t nbytes, int sendfd)
  5. {
  6. struct msghdr msg;
  7. struct iovec iov[1];
  8. #ifdef HAVE_MSGHDR_MSG_CONTROL
  9. union {
  10. struct cmsghdr cm;
  11. char control[CMSG_SPACE(sizeof(int))];
  12. } control_un;
  13. struct cmsghdr *cmptr;
  14. msg.msg_control = control_un.control;
  15. msg.msg_controllen = sizeof(control_un.control);
  16. cmptr = CMSG_FIRSTHDR(&msg);
  17. cmptr->cmsg_len = CMSG_LEN(sizeof(int));
  18. cmptr->cmsg_level = SOL_SOCKET;
  19. cmptr->cmsg_type = SCM_RIGHTS;
  20. *((int *) CMSG_DATA(cmptr)) = sendfd;
  21. #else
  22. msg.msg_accrights = (caddr_t) &sendfd;
  23. msg.msg_accrightslen = sizeof(int);
  24. #endif
  25. msg.msg_name = NULL;
  26. msg.msg_namelen = 0;
  27. iov[0].iov_base = ptr;
  28. iov[0].iov_len = nbytes;
  29. msg.msg_iov = iov;
  30. msg.msg_iovlen = 1;
  31. return(sendmsg(fd, &msg, 0));
  32. }
  33. /* end write_fd */
  34. ssize_t
  35. Write_fd(int fd, void *ptr, size_t nbytes, int sendfd)
  36. {
  37. ssize_t n;
  38. if ( (n = write_fd(fd, ptr, nbytes, sendfd)) < 0)
  39. err_sys("write_fd error");
  40. return(n);
  41. }