scm.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __LINUX_NET_SCM_H
  2. #define __LINUX_NET_SCM_H
  3. /* Well, we should have at least one descriptor open
  4.  * to accept passed FDs 8)
  5.  */
  6. #define SCM_MAX_FD (OPEN_MAX-1)
  7. struct scm_fp_list
  8. {
  9. int count;
  10. struct file *fp[SCM_MAX_FD];
  11. };
  12. struct scm_cookie
  13. {
  14. struct ucred creds; /* Skb credentials */
  15. struct scm_fp_list *fp; /* Passed files */
  16. unsigned long seq; /* Connection seqno */
  17. };
  18. extern void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm);
  19. extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm);
  20. extern void __scm_destroy(struct scm_cookie *scm);
  21. extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl);
  22. static __inline__ void scm_destroy(struct scm_cookie *scm)
  23. {
  24. if (scm && scm->fp)
  25. __scm_destroy(scm);
  26. }
  27. static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
  28.        struct scm_cookie *scm)
  29. {
  30. memset(scm, 0, sizeof(*scm));
  31. scm->creds.uid = current->uid;
  32. scm->creds.gid = current->gid;
  33. scm->creds.pid = current->pid;
  34. if (msg->msg_controllen <= 0)
  35. return 0;
  36. return __scm_send(sock, msg, scm);
  37. }
  38. static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
  39. struct scm_cookie *scm, int flags)
  40. {
  41. if (!msg->msg_control)
  42. {
  43. if (sock->passcred || scm->fp)
  44. msg->msg_flags |= MSG_CTRUNC;
  45. scm_destroy(scm);
  46. return;
  47. }
  48. if (sock->passcred)
  49. put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
  50. if (!scm->fp)
  51. return;
  52. scm_detach_fds(msg, scm);
  53. }
  54. #endif /* __LINUX_NET_SCM_H */