home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / scm.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  1.7 KB  |  74 lines

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