readcred.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "unp.h"
  2. #define CONTROL_LEN (sizeof(struct cmsghdr) + sizeof(struct cmsgcred))
  3. ssize_t
  4. read_cred(int fd, void *ptr, size_t nbytes, struct cmsgcred *cmsgcredptr)
  5. {
  6. struct msghdr msg;
  7. struct iovec iov[1];
  8. char control[CONTROL_LEN];
  9. int n;
  10. msg.msg_name = NULL;
  11. msg.msg_namelen = 0;
  12. iov[0].iov_base = ptr;
  13. iov[0].iov_len = nbytes;
  14. msg.msg_iov = iov;
  15. msg.msg_iovlen = 1;
  16. msg.msg_control = control;
  17. msg.msg_controllen = sizeof(control);
  18. msg.msg_flags = 0;
  19. if ( (n = recvmsg(fd, &msg, 0)) < 0)
  20. return(n);
  21. cmsgcredptr->cmcred_ngroups = 0; /* indicates no credentials returned */
  22. if (cmsgcredptr && msg.msg_controllen > 0) {
  23. struct cmsghdr *cmptr = (struct cmsghdr *) control;
  24. if (cmptr->cmsg_len < CONTROL_LEN)
  25. err_quit("control length = %d", cmptr->cmsg_len);
  26. if (cmptr->cmsg_level != SOL_SOCKET)
  27. err_quit("control level != SOL_SOCKET");
  28. if (cmptr->cmsg_type != SCM_CREDS)
  29. err_quit("control type != SCM_CREDS");
  30. memcpy(cmsgcredptr, CMSG_DATA(cmptr), sizeof(struct cmsgcred));
  31. }
  32. return(n);
  33. }