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#ifndef lint 62static const char rcsid[] = 63 "$Id: unix.c,v 1.4 2006/02/07 06:22:20 lindak Exp $"; 64#endif /* not lint */ 65 66/* 67 * Display protocol blocks in the unix domain. 68 */ 69#include <sys/param.h> 70#include <sys/queue.h> 71#include <sys/socket.h> 72#include <sys/socketvar.h> 73#include <sys/mbuf.h> 74#include <sys/sysctl.h> 75#include <sys/un.h> 76#include <sys/unpcb.h> 77 78#include <netinet/in.h> 79 80#include <errno.h> 81#include <err.h> 82#include <stddef.h> 83#include <stdio.h> 84#include <stdlib.h> 85#include "netstat.h" 86 87#if !TARGET_OS_EMBEDDED 88static void unixdomainpr __P((struct xunpcb64 *, struct xsocket64 *)); 89#else 90static void unixdomainpr __P((struct xunpcb *, struct xsocket *)); 91#endif 92 93static const char *const socktype[] = 94 { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" }; 95 96void 97unixpr() 98{ 99 char *buf; 100 int type; 101 size_t len; 102 struct xunpgen *xug, *oxug; 103#if !TARGET_OS_EMBEDDED 104 struct xsocket64 *so; 105 struct xunpcb64 *xunp; 106 char mibvar[sizeof "net.local.seqpacket.pcblist64"]; 107#else 108 struct xsocket *so; 109 struct xunpcb *xunp; 110 char mibvar[sizeof "net.local.seqpacket.pcblist"]; 111#endif 112 113 for (type = SOCK_STREAM; type <= SOCK_SEQPACKET; type++) { 114#if !TARGET_OS_EMBEDDED 115 snprintf(mibvar, sizeof(mibvar), "net.local.%s.pcblist64", socktype[type]); 116#else 117 snprintf(mibvar, sizeof(mibvar), "net.local.%s.pcblist", socktype[type]); 118#endif 119 len = 0; 120 if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { 121 if (errno != ENOENT) 122 warn("sysctl: %s", mibvar); 123 continue; 124 } 125 if ((buf = malloc(len)) == 0) { 126 warn("malloc %lu bytes", (u_long)len); 127 return; 128 } 129 if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) { 130 warn("sysctl: %s", mibvar); 131 free(buf); 132 return; 133 } 134 135 oxug = xug = (struct xunpgen *)buf; 136 for (xug = (struct xunpgen *)((char *)xug + xug->xug_len); 137 xug->xug_len > sizeof(struct xunpgen); 138 xug = (struct xunpgen *)((char *)xug + xug->xug_len)) { 139#if !TARGET_OS_EMBEDDED 140 xunp = (struct xunpcb64 *)xug; 141#else 142 xunp = (struct xunpcb *)xug; 143#endif 144 so = &xunp->xu_socket; 145 146 /* Ignore PCBs which were freed during copyout. */ 147#if !TARGET_OS_EMBEDDED 148 if (xunp->xunp_gencnt > oxug->xug_gen) 149#else 150 if (xunp->xu_unp.unp_gencnt > oxug->xug_gen) 151#endif 152 continue; 153 unixdomainpr(xunp, so); 154 } 155 if (xug != oxug && xug->xug_gen != oxug->xug_gen) { 156 if (oxug->xug_count > xug->xug_count) { 157 printf("Some %s sockets may have been deleted.\n", 158 socktype[type]); 159 } else if (oxug->xug_count < xug->xug_count) { 160 printf("Some %s sockets may have been created.\n", 161 socktype[type]); 162 } else { 163 printf("Some %s sockets may have been created or deleted\n", 164 socktype[type]); 165 } 166 } 167 free(buf); 168 } 169} 170 171static void 172unixdomainpr(xunp, so) 173#if !TARGET_OS_EMBEDDED 174 struct xunpcb64 *xunp; 175 struct xsocket64 *so; 176#else 177 struct xunpcb *xunp; 178 struct xsocket *so; 179#endif 180{ 181#if TARGET_OS_EMBEDDED 182 struct unpcb *unp; 183#endif 184 struct sockaddr_un *sa; 185 static int first = 1; 186 187#if !TARGET_OS_EMBEDDED 188 sa = &xunp->xu_addr; 189#else 190 unp = &xunp->xu_unp; 191 if (unp->unp_addr) 192 sa = &xunp->xu_addr; 193 else 194 sa = (struct sockaddr_un *)0; 195#endif 196 197 if (first) { 198 printf("Active LOCAL (UNIX) domain sockets\n"); 199 printf( 200#if !TARGET_OS_EMBEDDED 201"%-16.16s %-6.6s %-6.6s %-6.6s %16.16s %16.16s %16.16s %16.16s Addr\n", 202#else 203"%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n", 204#endif 205 "Address", "Type", "Recv-Q", "Send-Q", 206 "Inode", "Conn", "Refs", "Nextref"); 207 first = 0; 208 } 209#if !TARGET_OS_EMBEDDED 210 printf("%16lx %-6.6s %6u %6u %16lx %16lx %16lx %16lx", 211 (long)xunp->xu_unpp, socktype[so->so_type], so->so_rcv.sb_cc, 212 so->so_snd.sb_cc, 213 (long)xunp->xunp_vnode, (long)xunp->xunp_conn, 214 (long)xunp->xunp_refs, (long)xunp->xunp_reflink.le_next); 215#else 216 printf("%8lx %-6.6s %6u %6u %8lx %8lx %8lx %8lx", 217 (long)so->so_pcb, socktype[so->so_type], so->so_rcv.sb_cc, 218 so->so_snd.sb_cc, 219 (long)unp->unp_vnode, (long)unp->unp_conn, 220 (long)unp->unp_refs.lh_first, (long)unp->unp_reflink.le_next); 221#endif 222 223#if !TARGET_OS_EMBEDDED 224 if (sa->sun_len) 225#else 226 if (sa) 227#endif 228 printf(" %.*s", 229 (int)(sa->sun_len - offsetof(struct sockaddr_un, sun_path)), 230 sa->sun_path); 231 putchar('\n'); 232} 233