]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/unpcb.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / sys / unpcb.h
index bc2039358a4e2a240e95d5b0bad2b66a18528495..5867dcb2d474d997cab4ec963adf1063dad6796e 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2008-2020 Apple Inc. All rights reserved.
  *
  * @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
  * 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,
@@ -22,7 +22,7 @@
  * 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_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
 #include <sys/queue.h>
 #include <sys/un.h>
 #include <sys/ucred.h>
+#include <sys/socketvar.h>
+#if !KERNEL && PRIVATE
+#include <TargetConditionals.h>
+#endif
 
 /*
  * Protocol control block for an active
@@ -98,40 +102,44 @@ 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;       \
+       u_int32_t   le_next;
+       u_int32_t   le_prev;
 };
-#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
+#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);
-#ifdef KERNEL
+#else
+LIST_HEAD(unp_head, unpcb);
 #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_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  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_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 */
+       decl_lck_mtx_data(, unp_mtx);   /* per unpcb lock */
+       int             rw_thrcount;    /* disconnect should wait for this count to become zero */
 };
 #endif /* KERNEL */
 
@@ -148,26 +156,32 @@ 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 {
 #else /* KERNEL */
 #define unpcb_compat unpcb
-struct unpcb {
+struct  unpcb {
 #endif /* KERNEL */
-       _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 */
-       ino_t                           unp_ino;        /* fake inode number */
-       _UNPCB_PTR(struct unpcb_compat *) unp_conn;     /* control block of connected socket */
-       struct unp_head                 unp_refs;       /* referencing socket linked list */
-       _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 */
+       _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>. */
@@ -176,33 +190,70 @@ struct    unpcb {
 #pragma pack(4)
 
 struct  xunpcb {
-       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 */
+       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];
+               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];
+               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 XNU_TARGET_OS_OSX || KERNEL || !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
+
+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 /* XNU_TARGET_OS_OSX || KERNEL || !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR) */
+
 #pragma pack()
 
 #endif /* _SYS_SOCKETVAR_H_ */
+
 #endif /* PRIVATE */
 
-struct xunpgen {
-       u_int32_t       xug_len;
-       u_int           xug_count;
-       unp_gen_t       xug_gen;
-       so_gen_t        xug_sogen;
+struct  xunpgen {
+       u_int32_t       xug_len;
+       u_int           xug_count;
+       unp_gen_t       xug_gen;
+       so_gen_t        xug_sogen;
 };
 
 #endif /* _SYS_UNPCB_H_ */