1 /* $NetBSD: unix.c,v 1.34 2012/03/20 20:34:58 matt Exp $ */
4 * Copyright (c) 1983, 1988, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
35 static char sccsid
[] = "from: @(#)unix.c 8.1 (Berkeley) 6/6/93";
37 __RCSID("$NetBSD: unix.c,v 1.34 2012/03/20 20:34:58 matt Exp $");
42 * Display protocol blocks in the unix domain.
45 #include <sys/types.h>
47 #include <sys/param.h>
48 #include <sys/protosw.h>
49 #include <sys/socket.h>
50 #include <sys/socketvar.h>
52 #include <sys/sysctl.h>
54 #include <sys/unpcb.h>
59 #include <netinet/in.h>
69 static void unixdomainprhdr(void);
70 static void unixdomainpr0(u_long
, u_long
, u_long
, u_long
, u_long
, u_long
,
71 u_long
, u_long
, u_long
, struct sockaddr_un
*, int);
72 static void unixdomainpr(struct socket
*, void *);
74 static struct file
*file
, *fileNFILE
;
80 printf("Active UNIX domain sockets\n");
81 printf("%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n",
82 "Address", "Type", "Recv-Q", "Send-Q", "Inode", "Conn", "Refs",
86 static const char * const socktype
[] =
87 { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" };
90 unixdomainpr0(u_long so_pcb
, u_long so_type
, u_long rcvq
, u_long sndq
,
91 u_long inode
, u_long conn
, u_long refs
, u_long nextref
,
92 u_long addr
, struct sockaddr_un
*sun
, int remote
)
94 printf("%8lx %-6.6s %6ld %6ld %8lx %8lx %8lx %8lx",
95 so_pcb
, socktype
[so_type
], rcvq
, sndq
, inode
, conn
, refs
,
98 printf((remote
? " -> %.*s" : " %.*s"),
99 (int)(sun
->sun_len
- (sizeof(*sun
) - sizeof(sun
->sun_path
))),
105 unixdomainpr(struct socket
*so
, void *soaddr
)
107 struct unpcb unp
, runp
;
108 struct sockaddr_un sun
, rsun
;
109 static int first
= 1;
112 if (kread((u_long
)so
->so_pcb
, (char *)&unp
, sizeof (unp
)))
115 if (kread((u_long
)unp
.unp_addr
, (char *)&sun
, sizeof (sun
)))
119 memset(&rsun
, 0, sizeof(rsun
));
121 kread((u_long
)unp
.unp_conn
, (char *)&runp
, sizeof (runp
)) == 0 &&
123 kread((u_long
)runp
.unp_addr
, (char *)&rsun
, sizeof (rsun
)) == 0 &&
124 rsun
.sun_path
[0] != '\0')
133 unixdomainpr0((u_long
)so
->so_pcb
, so
->so_type
, so
->so_rcv
.sb_cc
,
134 so
->so_snd
.sb_cc
, (u_long
)unp
.unp_vnode
,
135 (u_long
)unp
.unp_conn
, (u_long
)unp
.unp_refs
,
136 (u_long
)unp
.unp_nextref
, (u_long
)unp
.unp_addr
,
137 remote
? &rsun
: &sun
, remote
);
144 struct socket sock
, *so
= &sock
;
146 struct protosw
*unixsw
= (struct protosw
*)off
;
149 struct kinfo_pcb
*pcblist
;
151 size_t namelen
= 0, size
= 0, i
;
152 const char *mibnames
[] = {
153 "net.local.stream.pcblist",
154 "net.local.dgram.pcblist",
155 "net.local.seqpacket.pcblist",
158 const char **mibname
;
159 static int first
= 1;
161 for (mibname
= mibnames
; *mibname
; mibname
++) {
162 memset(mib
, 0, sizeof(mib
));
164 if (sysctlnametomib(*mibname
, mib
,
166 err(1, "sysctlnametomib: %s", *mibname
);
168 if (prog_sysctl(mib
, sizeof(mib
) / sizeof(*mib
),
169 NULL
, &size
, NULL
, 0) == -1)
170 err(1, "sysctl (query)");
172 if ((pcblist
= malloc(size
)) == NULL
)
174 memset(pcblist
, 0, size
);
176 mib
[6] = sizeof(*pcblist
);
177 mib
[7] = size
/ sizeof(*pcblist
);
179 if (prog_sysctl(mib
, sizeof(mib
) / sizeof(*mib
),
180 pcblist
, &size
, NULL
, 0) == -1)
181 err(1, "sysctl (copy)");
183 for (i
= 0; i
< size
/ sizeof(*pcblist
); i
++) {
184 struct kinfo_pcb
*ki
= &pcblist
[i
];
185 struct sockaddr_un
*sun
;
193 sun
= (struct sockaddr_un
*)&ki
->ki_dst
;
194 if (sun
->sun_path
[0] != '\0') {
197 sun
= (struct sockaddr_un
*)&ki
->ki_src
;
200 unixdomainpr0(ki
->ki_pcbaddr
, ki
->ki_type
,
201 ki
->ki_rcvq
, ki
->ki_sndq
,
202 ki
->ki_vnode
, ki
->ki_conn
,
203 ki
->ki_refs
, ki
->ki_nextref
,
204 ki
->ki_sockaddr
, sun
, remote
);
211 filebuf
= (char *)kvm_getfiles(get_kvmd(), KERN_FILE
,
214 printf("file table read error: %s",
215 kvm_geterr(get_kvmd()));
218 file
= (struct file
*)(filebuf
+ sizeof(fp
));
219 fileNFILE
= file
+ ns_nfiles
;
220 for (fp
= file
; fp
< fileNFILE
; fp
++) {
221 if (fp
->f_count
== 0 || fp
->f_type
!= DTYPE_SOCKET
)
223 if (kread((u_long
)fp
->f_data
, (char *)so
, sizeof (*so
)))
226 if (so
->so_proto
>= unixsw
&& so
->so_proto
<= unixsw
+ 2)
228 unixdomainpr(so
, fp
->f_data
);