1/* 2 * Copyright (c) 2008-2009 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/*- 29 * Copyright (c) 1983, 1988, 1993 30 * The Regents of the University of California. All rights reserved. 31 * 32 * Redistribution and use in source and binary forms, with or without 33 * modification, are permitted provided that the following conditions 34 * are met: 35 * 1. Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * 2. Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in the 39 * documentation and/or other materials provided with the distribution. 40 * 3. All advertising materials mentioning features or use of this software 41 * must display the following acknowledgement: 42 * This product includes software developed by the University of 43 * California, Berkeley and its contributors. 44 * 4. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 */ 60 61/* 62 * Display protocol blocks in the unix domain. 63 */ 64#include <sys/param.h> 65#include <sys/queue.h> 66#include <sys/socket.h> 67#include <sys/socketvar.h> 68#include <sys/mbuf.h> 69#include <sys/sysctl.h> 70#include <sys/un.h> 71#include <sys/unpcb.h> 72 73#include <netinet/in.h> 74 75#include <errno.h> 76#include <err.h> 77#include <stddef.h> 78#include <stdio.h> 79#include <stdlib.h> 80#include "netstat.h" 81 82#if !TARGET_OS_EMBEDDED 83static void unixdomainpr __P((struct xunpcb64 *, struct xsocket64 *)); 84#else 85static void unixdomainpr __P((struct xunpcb *, struct xsocket *)); 86#endif 87 88static const char *const socktype[] = 89 { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" }; 90 91void 92unixpr() 93{ 94 char *buf; 95 int type; 96 size_t len; 97 struct xunpgen *xug, *oxug; 98#if !TARGET_OS_EMBEDDED 99 struct xsocket64 *so; 100 struct xunpcb64 *xunp; 101 char mibvar[sizeof "net.local.seqpacket.pcblist64"]; 102#else 103 struct xsocket *so; 104 struct xunpcb *xunp; 105 char mibvar[sizeof "net.local.seqpacket.pcblist"]; 106#endif 107 108 for (type = SOCK_STREAM; type <= SOCK_SEQPACKET; type++) { 109#if !TARGET_OS_EMBEDDED 110 snprintf(mibvar, sizeof(mibvar), "net.local.%s.pcblist64", socktype[type]); 111#else 112 snprintf(mibvar, sizeof(mibvar), "net.local.%s.pcblist", socktype[type]); 113#endif 114 len = 0; 115 if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { 116 if (errno != ENOENT) 117 warn("sysctl: %s", mibvar); 118 continue; 119 } 120 if ((buf = malloc(len)) == 0) { 121 warn("malloc %lu bytes", (u_long)len); 122 return; 123 } 124 if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) { 125 warn("sysctl: %s", mibvar); 126 free(buf); 127 return; 128 } 129 130 oxug = xug = (struct xunpgen *)buf; 131 for (xug = (struct xunpgen *)((char *)xug + xug->xug_len); 132 xug->xug_len > sizeof(struct xunpgen); 133 xug = (struct xunpgen *)((char *)xug + xug->xug_len)) { 134#if !TARGET_OS_EMBEDDED 135 xunp = (struct xunpcb64 *)xug; 136#else 137 xunp = (struct xunpcb *)xug; 138#endif 139 so = &xunp->xu_socket; 140 141 /* Ignore PCBs which were freed during copyout. */ 142#if !TARGET_OS_EMBEDDED 143 if (xunp->xunp_gencnt > oxug->xug_gen) 144#else 145 if (xunp->xu_unp.unp_gencnt > oxug->xug_gen) 146#endif 147 continue; 148 unixdomainpr(xunp, so); 149 } 150 if (xug != oxug && xug->xug_gen != oxug->xug_gen) { 151 if (oxug->xug_count > xug->xug_count) { 152 printf("Some %s sockets may have been deleted.\n", 153 socktype[type]); 154 } else if (oxug->xug_count < xug->xug_count) { 155 printf("Some %s sockets may have been created.\n", 156 socktype[type]); 157 } else { 158 printf("Some %s sockets may have been created or deleted\n", 159 socktype[type]); 160 } 161 } 162 free(buf); 163 } 164} 165 166static void 167unixdomainpr(xunp, so) 168#if !TARGET_OS_EMBEDDED 169 struct xunpcb64 *xunp; 170 struct xsocket64 *so; 171#else 172 struct xunpcb *xunp; 173 struct xsocket *so; 174#endif 175{ 176#if TARGET_OS_EMBEDDED 177 struct unpcb *unp; 178#endif 179 struct sockaddr_un *sa; 180 static int first = 1; 181 182#if !TARGET_OS_EMBEDDED 183 sa = &xunp->xu_addr; 184#else 185 unp = &xunp->xu_unp; 186 if (unp->unp_addr) 187 sa = &xunp->xu_addr; 188 else 189 sa = (struct sockaddr_un *)0; 190#endif 191 192 if (first) { 193 printf("Active LOCAL (UNIX) domain sockets\n"); 194 printf( 195#if !TARGET_OS_EMBEDDED 196"%-16.16s %-6.6s %-6.6s %-6.6s %16.16s %16.16s %16.16s %16.16s Addr\n", 197#else 198"%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n", 199#endif 200 "Address", "Type", "Recv-Q", "Send-Q", 201 "Inode", "Conn", "Refs", "Nextref"); 202 first = 0; 203 } 204#if !TARGET_OS_EMBEDDED 205 printf("%16lx %-6.6s %6u %6u %16lx %16lx %16lx %16lx", 206 (long)xunp->xu_unpp, socktype[so->so_type], so->so_rcv.sb_cc, 207 so->so_snd.sb_cc, 208 (long)xunp->xunp_vnode, (long)xunp->xunp_conn, 209 (long)xunp->xunp_refs, (long)xunp->xunp_reflink.le_next); 210#else 211 printf("%8lx %-6.6s %6u %6u %8lx %8lx %8lx %8lx", 212 (long)so->so_pcb, socktype[so->so_type], so->so_rcv.sb_cc, 213 so->so_snd.sb_cc, 214 (long)unp->unp_vnode, (long)unp->unp_conn, 215 (long)unp->unp_refs.lh_first, (long)unp->unp_reflink.le_next); 216#endif 217 218#if !TARGET_OS_EMBEDDED 219 if (sa->sun_len) 220#else 221 if (sa) 222#endif 223 printf(" %.*s", 224 (int)(sa->sun_len - offsetof(struct sockaddr_un, sun_path)), 225 sa->sun_path); 226 putchar('\n'); 227} 228