|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)unix.c 5.3 (Berkeley) 5/8/86";
9: #endif not lint
10:
11: /*
12: * Display protocol blocks in the unix domain.
13: */
14: #include <sys/param.h>
15: #include <sys/protosw.h>
16: #include <sys/socket.h>
17: #include <sys/socketvar.h>
18: #include <sys/mbuf.h>
19: #include <sys/un.h>
20: #include <sys/unpcb.h>
21: #define KERNEL
22: #include <sys/file.h>
23:
24: int Aflag;
25: int kmem;
26:
27: unixpr(nfileaddr, fileaddr, unixsw)
28: off_t nfileaddr, fileaddr;
29: struct protosw *unixsw;
30: {
31: register struct file *fp;
32: struct file *filep;
33: struct socket sock, *so = &sock;
34:
35: if (nfileaddr == 0 || fileaddr == 0) {
36: printf("nfile or file not in namelist.\n");
37: return;
38: }
39: klseek(kmem, nfileaddr, L_SET);
40: if (read(kmem, &nfile, sizeof (nfile)) != sizeof (nfile)) {
41: printf("nfile: bad read.\n");
42: return;
43: }
44: klseek(kmem, fileaddr, L_SET);
45: if (read(kmem, &filep, sizeof (filep)) != sizeof (filep)) {
46: printf("File table address, bad read.\n");
47: return;
48: }
49: file = (struct file *)calloc(nfile, sizeof (struct file));
50: if (file == (struct file *)0) {
51: printf("Out of memory (file table).\n");
52: return;
53: }
54: klseek(kmem, (off_t)filep, L_SET);
55: if (read(kmem, file, nfile * sizeof (struct file)) !=
56: nfile * sizeof (struct file)) {
57: printf("File table read error.\n");
58: return;
59: }
60: fileNFILE = file + nfile;
61: for (fp = file; fp < fileNFILE; fp++) {
62: if (fp->f_count == 0 || fp->f_type != DTYPE_SOCKET)
63: continue;
64: klseek(kmem, fp->f_data, L_SET);
65: if (read(kmem, so, sizeof (*so)) != sizeof (*so))
66: continue;
67: /* kludge */
68: if (so->so_proto >= unixsw && so->so_proto <= unixsw + 2)
69: if (so->so_pcb)
70: unixdomainpr(so, fp->f_data);
71: }
72: free((char *)file);
73: }
74:
75: static char *socktype[] =
76: { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" };
77:
78: unixdomainpr(so, soaddr)
79: register struct socket *so;
80: caddr_t soaddr;
81: {
82: struct unpcb unpcb, *unp = &unpcb;
83: struct mbuf mbuf, *m;
84: struct sockaddr_un *sa;
85: static int first = 1;
86:
87: klseek(kmem, so->so_pcb, L_SET);
88: if (read(kmem, unp, sizeof (*unp)) != sizeof (*unp))
89: return;
90: if (unp->unp_addr) {
91: m = &mbuf;
92: klseek(kmem, unp->unp_addr, L_SET);
93: if (read(kmem, m, sizeof (*m)) != sizeof (*m))
94: m = (struct mbuf *)0;
95: sa = mtod(m, struct sockaddr_un *);
96: } else
97: m = (struct mbuf *)0;
98: if (first) {
99: printf("Active UNIX domain sockets\n");
100: printf(
101: "%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n",
102: "Address", "Type", "Recv-Q", "Send-Q",
103: "Inode", "Conn", "Refs", "Nextref");
104: first = 0;
105: }
106: printf("%8x %-6.6s %6d %6d %8x %8x %8x %8x",
107: soaddr, socktype[so->so_type], so->so_rcv.sb_cc, so->so_snd.sb_cc,
108: unp->unp_inode, unp->unp_conn,
109: unp->unp_refs, unp->unp_nextref);
110: if (m)
111: printf(" %.*s", m->m_len - sizeof(sa->sun_family),
112: sa->sun_path);
113: putchar('\n');
114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.