1 /* $NetBSD: unix.c,v 1.28 2008/02/27 16:36:54 ad 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.28 2008/02/27 16:36:54 ad 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>
60 #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
;
81 printf("Active UNIX domain sockets\n");
82 printf("%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n",
83 "Address", "Type", "Recv-Q", "Send-Q", "Inode", "Conn", "Refs",
87 static const char *socktype
[] =
88 { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" };
91 unixdomainpr0(u_long so_pcb
, u_long so_type
, u_long rcvq
, u_long sndq
,
92 u_long inode
, u_long conn
, u_long refs
, u_long nextref
,
93 u_long addr
, struct sockaddr_un
*sun
, int remote
)
95 printf("%8lx %-6.6s %6ld %6ld %8lx %8lx %8lx %8lx",
96 so_pcb
, socktype
[so_type
], rcvq
, sndq
, inode
, conn
, refs
,
99 printf((remote
? " -> %.*s" : " %.*s"),
100 (int)(sun
->sun_len
- (sizeof(*sun
) - sizeof(sun
->sun_path
))),
106 unixdomainpr(so
, soaddr
)
110 struct unpcb unp
, runp
;
111 struct sockaddr_un sun
, rsun
;
112 static int first
= 1;
115 if (kread((u_long
)so
->so_pcb
, (char *)&unp
, sizeof (unp
)))
118 if (kread((u_long
)unp
.unp_addr
, (char *)&sun
, sizeof (sun
)))
122 memset(&rsun
, 0, sizeof(rsun
));
124 kread((u_long
)unp
.unp_conn
, (char *)&runp
, sizeof (runp
)) == 0 &&
126 kread((u_long
)runp
.unp_addr
, (char *)&rsun
, sizeof (rsun
)) == 0 &&
127 rsun
.sun_path
[0] != '\0')
136 unixdomainpr0((u_long
)so
->so_pcb
, so
->so_type
, so
->so_rcv
.sb_cc
,
137 so
->so_snd
.sb_cc
, (u_long
)unp
.unp_vnode
,
138 (u_long
)unp
.unp_conn
, (u_long
)unp
.unp_refs
,
139 (u_long
)unp
.unp_nextref
, (u_long
)unp
.unp_addr
,
140 remote
? &rsun
: &sun
, remote
);
148 struct socket sock
, *so
= &sock
;
150 struct protosw
*unixsw
= (struct protosw
*)off
;
153 struct kinfo_pcb
*pcblist
;
155 size_t namelen
= 0, size
= 0, i
;
156 const char *mibname
= "net.local.stream.pcblist";
157 static int first
= 1;
161 memset(mib
, 0, sizeof(mib
));
163 if (sysctlnametomib(mibname
, mib
,
165 err(1, "sysctlnametomib: %s", mibname
);
167 if (sysctl(mib
, sizeof(mib
) / sizeof(*mib
), NULL
, &size
,
169 err(1, "sysctl (query)");
171 if ((pcblist
= malloc(size
)) == NULL
)
173 memset(pcblist
, 0, size
);
175 mib
[6] = sizeof(*pcblist
);
176 mib
[7] = size
/ sizeof(*pcblist
);
178 if (sysctl(mib
, sizeof(mib
) / sizeof(*mib
), pcblist
,
179 &size
, NULL
, 0) == -1)
180 err(1, "sysctl (copy)");
182 for (i
= 0; i
< size
/ sizeof(*pcblist
); i
++) {
183 struct kinfo_pcb
*ki
= &pcblist
[i
];
184 struct sockaddr_un
*sun
;
192 sun
= (struct sockaddr_un
*)&ki
->ki_dst
;
193 if (sun
->sun_path
[0] != '\0') {
196 sun
= (struct sockaddr_un
*)&ki
->ki_src
;
199 unixdomainpr0(ki
->ki_pcbaddr
, ki
->ki_type
,
200 ki
->ki_rcvq
, ki
->ki_sndq
,
201 ki
->ki_vnode
, ki
->ki_conn
, ki
->ki_refs
,
202 ki
->ki_nextref
, ki
->ki_sockaddr
, sun
, remote
);
207 if (!done
&& mibname
) {
208 mibname
= "net.local.dgram.pcblist";
213 filebuf
= (char *)kvm_getfiles(kvmd
, KERN_FILE
, 0, &ns_nfiles
);
215 printf("file table read error: %s", kvm_geterr(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
);