]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/unpcb.h
xnu-4903.221.2.tar.gz
[apple/xnu.git] / bsd / sys / unpcb.h
index 9baa6366a687cff3dc9aab57768e5a85520c827a..9c66ca69b1483c947b1db92bcc78471cc4511990 100644 (file)
@@ -1,31 +1,29 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2008-2010 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * This file contains Original Code and/or Modifications of Original Code 
- * as defined in and that are subject to the Apple Public Source License 
- * Version 2.0 (the 'License'). You may not use this file except in 
- * compliance with the License.  The rights granted to you under the 
- * License may not be used to create, or enable the creation or 
- * redistribution of, unlawful or unlicensed copies of an Apple operating 
- * system, or to circumvent, violate, or enable the circumvention or 
- * violation of, any terms of an Apple operating system software license 
- * agreement.
- *
- * Please obtain a copy of the License at 
- * http://www.opensource.apple.com/apsl/ and read it before using this 
- * file.
- *
- * The Original Code and all software distributed under the License are 
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
- * Please see the License for the specific language governing rights and 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
  * limitations under the License.
- *
- * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
+ * 
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -69,6 +67,7 @@
 #include <sys/queue.h>
 #include <sys/un.h>
 #include <sys/ucred.h>
+#include <sys/socketvar.h>
 
 /*
  * Protocol control block for an active
 
 typedef u_quad_t        unp_gen_t;
 
+#if defined(__LP64__)
+struct _unpcb_list_entry {
+    u_int32_t   le_next; 
+    u_int32_t   le_prev;
+}; 
+#define _UCPCB_LIST_HEAD(name, type)   \
+struct name {                          \
+       u_int32_t       lh_first;       \
+};
+#define _UNPCB_LIST_ENTRY(x)           struct _unpcb_list_entry
+#define _UNPCB_PTR(x)                  u_int32_t
+#else 
+#define _UCPCB_LIST_HEAD(name, type)   LIST_HEAD(name, type)
+#define _UNPCB_LIST_ENTRY(x)           LIST_ENTRY(x)
+#define _UNPCB_PTR(x)                  x
+#endif
+
 #ifdef PRIVATE
+#ifndef KERNEL
+_UCPCB_LIST_HEAD(unp_head, unpcb);
+#else
 LIST_HEAD(unp_head, unpcb);
-#ifdef KERNEL
 #define sotounpcb(so)   ((struct unpcb *)((so)->so_pcb))
 
 struct unpcb {
-       LIST_ENTRY(unpcb) unp_link;     /* glue on list of all PCBs */
-       struct  socket *unp_socket;     /* pointer back to socket */
-       struct  vnode *unp_vnode;       /* if associated with file */
-       ino_t   unp_ino;                /* fake inode number */
-       struct  unpcb *unp_conn;        /* control block of connected socket */
-       struct  unp_head unp_refs;      /* referencing socket linked list */
+       LIST_ENTRY(unpcb) unp_link;     /* glue on list of all PCBs */
+       struct socket   *unp_socket;    /* pointer back to socket */
+       struct vnode    *unp_vnode;     /* if associated with file */
+       ino_t                   unp_ino;        /* fake inode number */
+       struct unpcb    *unp_conn;      /* control block of connected socket */
+       struct unp_head unp_refs;       /* referencing socket linked list */
        LIST_ENTRY(unpcb) unp_reflink;  /* link in unp_refs list */
-       struct  sockaddr_un *unp_addr;  /* bound address of socket */
-       int     unp_cc;                 /* copy of rcv.sb_cc */
-       int     unp_mbcnt;              /* copy of rcv.sb_mbcnt */
-       unp_gen_t unp_gencnt;           /* generation count of this instance */
-       int     unp_flags;              /* flags */
-       struct  xucred unp_peercred;    /* peer credentials, if applicable */
+       struct sockaddr_un *unp_addr;   /* bound address of socket */
+       int             unp_cc;         /* copy of rcv.sb_cc */
+       int             unp_mbcnt;      /* copy of rcv.sb_mbcnt */
+       unp_gen_t       unp_gencnt;     /* generation count of this instance */
+       int             unp_flags;      /* flags */
+       struct xucred   unp_peercred;   /* peer credentials, if applicable */
+       decl_lck_mtx_data( ,unp_mtx);   /* per unpcb lock */
+       int             rw_thrcount;    /* disconnect should wait for this count to become zero */
 };
 #endif /* KERNEL */
 
@@ -133,8 +153,10 @@ struct     unpcb {
  * (there may not even be a peer).  This is set in unp_listen() when
  * it fills in unp_peercred for later consumption by unp_connect().
  */
-#define UNP_HAVEPC                     0x001
-#define UNP_HAVEPCCACHED               0x002
+#define UNP_HAVEPC                     0x0001
+#define UNP_HAVEPCCACHED               0x0002
+#define UNP_DONTDISCONNECT             0x0004
+#define        UNP_TRACE_MDNS                  0x1000
 
 #ifdef KERNEL
 struct  unpcb_compat {
@@ -142,46 +164,93 @@ struct  unpcb_compat {
 #define unpcb_compat unpcb
 struct unpcb {
 #endif /* KERNEL */
-        LIST_ENTRY(unpcb_compat) unp_link;     /* glue on list of all PCBs */
-        struct  socket *unp_socket;     /* pointer back to socket */
-        struct  vnode *unp_vnode;       /* if associated with file */
-        ino_t   unp_ino;                /* fake inode number */
-        struct  unpcb_compat *unp_conn;        /* control block of connected socket */
-        struct  unp_head unp_refs;      /* referencing socket linked list */
-        LIST_ENTRY(unpcb_compat) unp_reflink;  /* link in unp_refs list */
-        struct  sockaddr_un *unp_addr;  /* bound address of socket */
-        int     unp_cc;                 /* copy of rcv.sb_cc */
-        int     unp_mbcnt;              /* copy of rcv.sb_mbcnt */
-        unp_gen_t unp_gencnt;           /* generation count of this instance */
+       _UNPCB_LIST_ENTRY(unpcb_compat) unp_link;       /* glue on list of all PCBs */
+       _UNPCB_PTR(struct socket *)     unp_socket;     /* pointer back to socket */
+       _UNPCB_PTR(struct vnode *)      unp_vnode;      /* if associated with file */
+       u_int32_t                       unp_ino;        /* fake inode number */
+       _UNPCB_PTR(struct unpcb_compat *) unp_conn;     /* control block of connected socket */
+#if defined(KERNEL)
+       u_int32_t                       unp_refs;
+#else
+       struct unp_head                 unp_refs;       /* referencing socket linked list */
+#endif
+       _UNPCB_LIST_ENTRY(unpcb_compat) unp_reflink;    /* link in unp_refs list */
+       _UNPCB_PTR(struct sockaddr_un *) unp_addr;      /* bound address of socket */
+       int                             unp_cc;         /* copy of rcv.sb_cc */
+       int                             unp_mbcnt;      /* copy of rcv.sb_mbcnt */
+       unp_gen_t                       unp_gencnt;     /* generation count of this instance */
 };
 
 /* Hack alert -- this structure depends on <sys/socketvar.h>. */
 #ifdef  _SYS_SOCKETVAR_H_
+
+#pragma pack(4)
+
 struct  xunpcb {
-        size_t  xu_len;                 /* length of this structure */
-        struct  unpcb_compat *xu_unpp;         /* to help netstat, fstat */
-        struct  unpcb_compat xu_unp;           /* our information */
-        union {
-                struct  sockaddr_un xuu_addr;   /* our bound address */
-                char    xu_dummy1[256];
-        } xu_au;
+       u_int32_t                       xu_len;         /* length of this structure */
+       _UNPCB_PTR(struct unpcb_compat *) xu_unpp;      /* to help netstat, fstat */
+       struct unpcb_compat             xu_unp;         /* our information */
+       union {
+               struct sockaddr_un      xuu_addr;       /* our bound address */
+               char                    xu_dummy1[256];
+       } xu_au;
 #define xu_addr xu_au.xuu_addr
-        union {
-                struct  sockaddr_un xuu_caddr; /* their bound address */
-                char    xu_dummy2[256];
-        } xu_cau;
+       union {
+               struct sockaddr_un      xuu_caddr;      /* their bound address */
+               char                    xu_dummy2[256];
+       } xu_cau;
 #define xu_caddr xu_cau.xuu_caddr
-        struct  xsocket xu_socket;
-        u_quad_t        xu_alignment_hack;
+       struct xsocket                  xu_socket;
+       u_quad_t                        xu_alignment_hack;
+};
+
+#if !CONFIG_EMBEDDED
+
+struct xunpcb64_list_entry {
+    u_int64_t   le_next;
+    u_int64_t   le_prev;
+};
+
+struct xunpcb64 {
+       u_int32_t                       xu_len;         /* length of this structure */
+       u_int64_t                       xu_unpp;        /* to help netstat, fstat */
+       struct xunpcb64_list_entry      xunp_link;      /* glue on list of all PCBs */
+       u_int64_t                       xunp_socket;    /* pointer back to socket */
+       u_int64_t                       xunp_vnode;     /* if associated with file */
+       u_int64_t                       xunp_ino;       /* fake inode number */
+       u_int64_t                       xunp_conn;      /* control block of connected socket */
+       u_int64_t                       xunp_refs;      /* referencing socket linked list */
+       struct xunpcb64_list_entry      xunp_reflink;   /* link in unp_refs list */
+       int                             xunp_cc;                /* copy of rcv.sb_cc */
+       int                             xunp_mbcnt;     /* copy of rcv.sb_mbcnt */
+       unp_gen_t                       xunp_gencnt;    /* generation count of this instance */
+       int                             xunp_flags;     /* flags */
+        union {
+                struct sockaddr_un             xuu_addr;
+                char                           xu_dummy1[256];
+        }                              xu_au;          /* our bound address */
+#define xunp_addr xu_au.xuu_addr
+        union {
+                struct sockaddr_un             xuu_caddr;
+                char                           xu_dummy2[256];
+        }                              xu_cau;         /* their bound address */
+#define xunp_caddr xu_cau.xuu_caddr
+       struct xsocket64        xu_socket;
 };
+
+#endif /* !CONFIG_EMBEDDED */
+
+#pragma pack()
+
 #endif /* _SYS_SOCKETVAR_H_ */
+
 #endif /* PRIVATE */
 
 struct xunpgen {
-       size_t  xug_len;
-       u_int   xug_count;
-       unp_gen_t xug_gen;
-       so_gen_t xug_sogen;
+       u_int32_t       xug_len;
+       u_int           xug_count;
+       unp_gen_t       xug_gen;
+       so_gen_t        xug_sogen;
 };
 
 #endif /* _SYS_UNPCB_H_ */