xref: /openbsd-src/usr.bin/ipcs/ipcs.c (revision 3aaa63eb46949490a39db9c6d82aacc8ee5d8551)
1*3aaa63ebSderaadt /*	$OpenBSD: ipcs.c,v 1.27 2019/06/28 13:35:01 deraadt Exp $	*/
2fb9910d0Smillert /*	$NetBSD: ipcs.c,v 1.25 2000/06/16 03:58:20 simonb Exp $	*/
3fb9910d0Smillert 
4fb9910d0Smillert /*-
5fb9910d0Smillert  * Copyright (c) 2000 The NetBSD Foundation, Inc.
6fb9910d0Smillert  * All rights reserved.
7fb9910d0Smillert  *
8fb9910d0Smillert  * This code is derived from software contributed to The NetBSD Foundation
9fb9910d0Smillert  * by Simon Burge.
10fb9910d0Smillert  *
11fb9910d0Smillert  * Redistribution and use in source and binary forms, with or without
12fb9910d0Smillert  * modification, are permitted provided that the following conditions
13fb9910d0Smillert  * are met:
14fb9910d0Smillert  * 1. Redistributions of source code must retain the above copyright
15fb9910d0Smillert  *    notice, this list of conditions and the following disclaimer.
16fb9910d0Smillert  * 2. Redistributions in binary form must reproduce the above copyright
17fb9910d0Smillert  *    notice, this list of conditions and the following disclaimer in the
18fb9910d0Smillert  *    documentation and/or other materials provided with the distribution.
19fb9910d0Smillert  *
20fb9910d0Smillert  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21fb9910d0Smillert  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22fb9910d0Smillert  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23fb9910d0Smillert  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24fb9910d0Smillert  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25fb9910d0Smillert  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26fb9910d0Smillert  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27fb9910d0Smillert  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28fb9910d0Smillert  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29fb9910d0Smillert  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30fb9910d0Smillert  * POSSIBILITY OF SUCH DAMAGE.
31fb9910d0Smillert  */
32df930be7Sderaadt 
33df930be7Sderaadt /*
34df930be7Sderaadt  * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
35df930be7Sderaadt  * All rights reserved.
36df930be7Sderaadt  *
37df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
38df930be7Sderaadt  * modification, are permitted provided that the following conditions
39df930be7Sderaadt  * are met:
40df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
41df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
42df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
43df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
44df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
45df930be7Sderaadt  *
46df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
47df930be7Sderaadt  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
48df930be7Sderaadt  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
49df930be7Sderaadt  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
50df930be7Sderaadt  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
51df930be7Sderaadt  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
52df930be7Sderaadt  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
53df930be7Sderaadt  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
54df930be7Sderaadt  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
55df930be7Sderaadt  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56df930be7Sderaadt  */
57df930be7Sderaadt 
58b9fc9a72Sderaadt #include <sys/types.h>
59fb9910d0Smillert #include <sys/sysctl.h>
60cbdb86d9Smillert #define _KERNEL			/* XXX */
61df930be7Sderaadt #include <sys/ipc.h>
62df930be7Sderaadt #include <sys/sem.h>
63df930be7Sderaadt #include <sys/shm.h>
64df930be7Sderaadt #include <sys/msg.h>
6554fca307Sderaadt #undef _KERNEL
6654fca307Sderaadt 
6754fca307Sderaadt #include <err.h>
6854fca307Sderaadt #include <fcntl.h>
69c3e1e82eSderaadt #include <grp.h>
70fb9910d0Smillert #include <kvm.h>
7154fca307Sderaadt #include <limits.h>
7254fca307Sderaadt #include <nlist.h>
7354fca307Sderaadt #include <paths.h>
74fb9910d0Smillert #include <pwd.h>
7554fca307Sderaadt #include <stdio.h>
7654fca307Sderaadt #include <stdlib.h>
7754fca307Sderaadt #include <string.h>
78fb9910d0Smillert #include <time.h>
7954fca307Sderaadt #include <unistd.h>
80df930be7Sderaadt 
81fb9910d0Smillert void	cvt_time(time_t, char *, size_t);
82fb9910d0Smillert char   *fmt_perm(mode_t);
83fb9910d0Smillert void	ipcs_kvm(void);
84fb9910d0Smillert int	main(int, char **);
85fb9910d0Smillert void	msg_sysctl(void);
86fb9910d0Smillert void	sem_sysctl(void);
87fb9910d0Smillert void	shm_sysctl(void);
88fb9910d0Smillert void	show_msginfo(time_t, time_t, time_t, int, key_t, mode_t, uid_t,
89fb9910d0Smillert 	    gid_t, uid_t, gid_t, u_long, u_long, u_long, pid_t, pid_t);
90fb9910d0Smillert void	show_msginfo_hdr(void);
91fb9910d0Smillert void	show_msgtotal(struct msginfo *);
92fb9910d0Smillert void	show_seminfo_hdr(void);
93fb9910d0Smillert void	show_seminfo(time_t, time_t, int, key_t, mode_t, uid_t, gid_t,
94fb9910d0Smillert 	    uid_t, gid_t, int16_t);
95fb9910d0Smillert void	show_semtotal(struct seminfo *);
96fb9910d0Smillert void	show_shminfo(time_t, time_t, time_t, int, key_t, mode_t, uid_t,
97fb9910d0Smillert 	    gid_t, uid_t, gid_t, u_int32_t, int, pid_t, pid_t);
98fb9910d0Smillert void	show_shminfo_hdr(void);
99fb9910d0Smillert void	show_shmtotal(struct shminfo *);
100fb9910d0Smillert __dead	void usage(void);
101df930be7Sderaadt 
102df930be7Sderaadt char *
fmt_perm(mode_t mode)103fb9910d0Smillert fmt_perm(mode_t mode)
104df930be7Sderaadt {
105fb9910d0Smillert 	static char buffer[12];
106df930be7Sderaadt 
107df930be7Sderaadt 	buffer[0] = '-';
108df930be7Sderaadt 	buffer[1] = '-';
109df930be7Sderaadt 	buffer[2] = ((mode & 0400) ? 'r' : '-');
110df930be7Sderaadt 	buffer[3] = ((mode & 0200) ? 'w' : '-');
111df930be7Sderaadt 	buffer[4] = ((mode & 0100) ? 'a' : '-');
112df930be7Sderaadt 	buffer[5] = ((mode & 0040) ? 'r' : '-');
113df930be7Sderaadt 	buffer[6] = ((mode & 0020) ? 'w' : '-');
114df930be7Sderaadt 	buffer[7] = ((mode & 0010) ? 'a' : '-');
115df930be7Sderaadt 	buffer[8] = ((mode & 0004) ? 'r' : '-');
116df930be7Sderaadt 	buffer[9] = ((mode & 0002) ? 'w' : '-');
117df930be7Sderaadt 	buffer[10] = ((mode & 0001) ? 'a' : '-');
118df930be7Sderaadt 	buffer[11] = '\0';
119df930be7Sderaadt 	return (&buffer[0]);
120df930be7Sderaadt }
121df930be7Sderaadt 
122df930be7Sderaadt void
cvt_time(time_t t,char * buf,size_t buflen)123fb9910d0Smillert cvt_time(time_t t, char *buf, size_t buflen)
124df930be7Sderaadt {
125df930be7Sderaadt 	struct tm *tm;
126df930be7Sderaadt 
127fb9910d0Smillert 	if (t == 0)
128fb9910d0Smillert 		(void)strlcpy(buf, "no-entry", buflen);
129fb9910d0Smillert 	else {
130df930be7Sderaadt 		tm = localtime(&t);
131fb9910d0Smillert 		(void)snprintf(buf, buflen, "%2d:%02d:%02d",
132df930be7Sderaadt 			tm->tm_hour, tm->tm_min, tm->tm_sec);
133df930be7Sderaadt 	}
134df930be7Sderaadt }
135df930be7Sderaadt #define	SHMINFO		1
136df930be7Sderaadt #define	SHMTOTAL	2
137df930be7Sderaadt #define	MSGINFO		4
138df930be7Sderaadt #define	MSGTOTAL	8
139df930be7Sderaadt #define	SEMINFO		16
140df930be7Sderaadt #define	SEMTOTAL	32
141df930be7Sderaadt 
142df930be7Sderaadt #define BIGGEST		1
143df930be7Sderaadt #define CREATOR		2
144df930be7Sderaadt #define OUTSTANDING	4
145df930be7Sderaadt #define PID		8
146df930be7Sderaadt #define TIME		16
147df930be7Sderaadt 
148fb9910d0Smillert char	*core = NULL, *namelist = NULL;
149df930be7Sderaadt int	display = SHMINFO | MSGINFO | SEMINFO;
150df930be7Sderaadt int	option = 0;
151df930be7Sderaadt 
152fb9910d0Smillert int
main(int argc,char ** argv)153fb9910d0Smillert main(int argc, char **argv)
154fb9910d0Smillert {
155fb9910d0Smillert 	int ch;
156fb9910d0Smillert 
157fb9910d0Smillert 	while ((ch = getopt(argc, argv, "MmQqSsabC:cN:optT")) != -1)
158fb9910d0Smillert 		switch (ch) {
159df930be7Sderaadt 		case 'M':
160df930be7Sderaadt 			display = SHMTOTAL;
161df930be7Sderaadt 			break;
162df930be7Sderaadt 		case 'm':
163df930be7Sderaadt 			display = SHMINFO;
164df930be7Sderaadt 			break;
165df930be7Sderaadt 		case 'Q':
166df930be7Sderaadt 			display = MSGTOTAL;
167df930be7Sderaadt 			break;
168df930be7Sderaadt 		case 'q':
169df930be7Sderaadt 			display = MSGINFO;
170df930be7Sderaadt 			break;
171df930be7Sderaadt 		case 'S':
172df930be7Sderaadt 			display = SEMTOTAL;
173df930be7Sderaadt 			break;
174df930be7Sderaadt 		case 's':
175df930be7Sderaadt 			display = SEMINFO;
176df930be7Sderaadt 			break;
177df930be7Sderaadt 		case 'T':
178df930be7Sderaadt 			display = SHMTOTAL | MSGTOTAL | SEMTOTAL;
179df930be7Sderaadt 			break;
180df930be7Sderaadt 		case 'a':
181df930be7Sderaadt 			option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME;
182df930be7Sderaadt 			break;
183df930be7Sderaadt 		case 'b':
184df930be7Sderaadt 			option |= BIGGEST;
185df930be7Sderaadt 			break;
186df930be7Sderaadt 		case 'C':
187df930be7Sderaadt 			core = optarg;
188df930be7Sderaadt 			break;
189df930be7Sderaadt 		case 'c':
190df930be7Sderaadt 			option |= CREATOR;
191df930be7Sderaadt 			break;
192df930be7Sderaadt 		case 'N':
193df930be7Sderaadt 			namelist = optarg;
194df930be7Sderaadt 			break;
195df930be7Sderaadt 		case 'o':
196df930be7Sderaadt 			option |= OUTSTANDING;
197df930be7Sderaadt 			break;
198df930be7Sderaadt 		case 'p':
199df930be7Sderaadt 			option |= PID;
200df930be7Sderaadt 			break;
201df930be7Sderaadt 		case 't':
202df930be7Sderaadt 			option |= TIME;
203df930be7Sderaadt 			break;
204df930be7Sderaadt 		default:
205df930be7Sderaadt 			usage();
206df930be7Sderaadt 		}
207df930be7Sderaadt 
208fb9910d0Smillert 	if (argc - optind > 0)
209fb9910d0Smillert 		usage();
210fb9910d0Smillert 
211fb9910d0Smillert 	if (namelist == NULL && core == NULL) {
212fb9910d0Smillert 		if (display & (MSGINFO | MSGTOTAL))
213fb9910d0Smillert 			msg_sysctl();
214fb9910d0Smillert 		if (display & (SHMINFO | SHMTOTAL))
215fb9910d0Smillert 			shm_sysctl();
216fb9910d0Smillert 		if (display & (SEMINFO | SEMTOTAL))
217fb9910d0Smillert 			sem_sysctl();
218fb9910d0Smillert 	} else
219fb9910d0Smillert 		ipcs_kvm();
220fb9910d0Smillert 
221fb9910d0Smillert 	exit(0);
222fb9910d0Smillert }
223fb9910d0Smillert 
224fb9910d0Smillert void
show_msgtotal(struct msginfo * msginfo)225fb9910d0Smillert show_msgtotal(struct msginfo *msginfo)
226fb9910d0Smillert {
227fb9910d0Smillert 
228fb9910d0Smillert 	printf("msginfo:\n");
229fb9910d0Smillert 	printf("\tmsgmax: %6d\t(max characters in a message)\n",
230fb9910d0Smillert 	    msginfo->msgmax);
231fb9910d0Smillert 	printf("\tmsgmni: %6d\t(# of message queues)\n",
232fb9910d0Smillert 	    msginfo->msgmni);
233fb9910d0Smillert 	printf("\tmsgmnb: %6d\t(max characters in a message queue)\n",
234fb9910d0Smillert 	    msginfo->msgmnb);
235fb9910d0Smillert 	printf("\tmsgtql: %6d\t(max # of messages in system)\n",
236fb9910d0Smillert 	    msginfo->msgtql);
237fb9910d0Smillert 	printf("\tmsgssz: %6d\t(size of a message segment)\n",
238fb9910d0Smillert 	    msginfo->msgssz);
239fb9910d0Smillert 	printf("\tmsgseg: %6d\t(# of message segments in system)\n\n",
240fb9910d0Smillert 	    msginfo->msgseg);
241fb9910d0Smillert }
242fb9910d0Smillert 
243fb9910d0Smillert void
show_shmtotal(struct shminfo * shminfo)244fb9910d0Smillert show_shmtotal(struct shminfo *shminfo)
245fb9910d0Smillert {
246fb9910d0Smillert 
247fb9910d0Smillert 	printf("shminfo:\n");
248fb9910d0Smillert 	printf("\tshmmax: %7d\t(max shared memory segment size)\n",
249fb9910d0Smillert 	    shminfo->shmmax);
250fb9910d0Smillert 	printf("\tshmmin: %7d\t(min shared memory segment size)\n",
251fb9910d0Smillert 	    shminfo->shmmin);
252fb9910d0Smillert 	printf("\tshmmni: %7d\t(max number of shared memory identifiers)\n",
253fb9910d0Smillert 	    shminfo->shmmni);
254fb9910d0Smillert 	printf("\tshmseg: %7d\t(max shared memory segments per process)\n",
255fb9910d0Smillert 	    shminfo->shmseg);
256fb9910d0Smillert 	printf("\tshmall: %7d\t(max amount of shared memory in pages)\n\n",
257fb9910d0Smillert 	    shminfo->shmall);
258fb9910d0Smillert }
259fb9910d0Smillert 
260fb9910d0Smillert void
show_semtotal(struct seminfo * seminfo)261fb9910d0Smillert show_semtotal(struct seminfo *seminfo)
262fb9910d0Smillert {
263fb9910d0Smillert 
264fb9910d0Smillert 	printf("seminfo:\n");
265fb9910d0Smillert 	printf("\tsemmni: %6d\t(# of semaphore identifiers)\n",
266fb9910d0Smillert 	    seminfo->semmni);
267fb9910d0Smillert 	printf("\tsemmns: %6d\t(# of semaphores in system)\n",
268fb9910d0Smillert 	    seminfo->semmns);
269fb9910d0Smillert 	printf("\tsemmnu: %6d\t(# of undo structures in system)\n",
270fb9910d0Smillert 	    seminfo->semmnu);
271fb9910d0Smillert 	printf("\tsemmsl: %6d\t(max # of semaphores per id)\n",
272fb9910d0Smillert 	    seminfo->semmsl);
273fb9910d0Smillert 	printf("\tsemopm: %6d\t(max # of operations per semop call)\n",
274fb9910d0Smillert 	    seminfo->semopm);
275fb9910d0Smillert 	printf("\tsemume: %6d\t(max # of undo entries per process)\n",
276fb9910d0Smillert 	    seminfo->semume);
277fb9910d0Smillert 	printf("\tsemusz: %6d\t(size in bytes of undo structure)\n",
278fb9910d0Smillert 	    seminfo->semusz);
279fb9910d0Smillert 	printf("\tsemvmx: %6d\t(semaphore maximum value)\n",
280fb9910d0Smillert 	    seminfo->semvmx);
281fb9910d0Smillert 	printf("\tsemaem: %6d\t(adjust on exit max value)\n\n",
282fb9910d0Smillert 	    seminfo->semaem);
283fb9910d0Smillert }
284fb9910d0Smillert 
285fb9910d0Smillert void
show_msginfo_hdr(void)286fb9910d0Smillert show_msginfo_hdr(void)
287fb9910d0Smillert {
288fb9910d0Smillert 
289fb9910d0Smillert 	printf("Message Queues:\n");
290fb9910d0Smillert 	printf("T       ID     KEY        MODE       OWNER    GROUP");
291fb9910d0Smillert 	if (option & CREATOR)
292fb9910d0Smillert 		printf("  CREATOR   CGROUP");
293fb9910d0Smillert 	if (option & OUTSTANDING)
294fb9910d0Smillert 		printf(" CBYTES  QNUM");
295fb9910d0Smillert 	if (option & BIGGEST)
296fb9910d0Smillert 		printf(" QBYTES");
297fb9910d0Smillert 	if (option & PID)
298fb9910d0Smillert 		printf(" LSPID LRPID");
299fb9910d0Smillert 	if (option & TIME)
300fb9910d0Smillert 		printf("    STIME    RTIME    CTIME");
301fb9910d0Smillert 	printf("\n");
302fb9910d0Smillert }
303fb9910d0Smillert 
304fb9910d0Smillert void
show_msginfo(time_t stime,time_t rtime,time_t ctime,int ipcid,key_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,u_long cbytes,u_long qnum,u_long qbytes,pid_t lspid,pid_t lrpid)305fb9910d0Smillert show_msginfo(time_t stime, time_t rtime, time_t ctime, int ipcid, key_t key,
306fb9910d0Smillert     mode_t mode, uid_t uid, gid_t gid, uid_t cuid, gid_t cgid,
307fb9910d0Smillert     u_long cbytes, u_long qnum, u_long qbytes, pid_t lspid,
308fb9910d0Smillert     pid_t lrpid)
309fb9910d0Smillert {
310fb9910d0Smillert 	char stime_buf[100], rtime_buf[100], ctime_buf[100];
311fb9910d0Smillert 
312fb9910d0Smillert 	if (option & TIME) {
313fb9910d0Smillert 		cvt_time(stime, stime_buf, sizeof(stime_buf));
314fb9910d0Smillert 		cvt_time(rtime, rtime_buf, sizeof(rtime_buf));
315fb9910d0Smillert 		cvt_time(ctime, ctime_buf, sizeof(ctime_buf));
316fb9910d0Smillert 	}
317fb9910d0Smillert 
318cf704e8fSmatthieu 	printf("q %8d %10ld %s %8s %8s", ipcid, key, fmt_perm(mode),
319fb9910d0Smillert 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
320fb9910d0Smillert 
321fb9910d0Smillert 	if (option & CREATOR)
322fb9910d0Smillert 		printf(" %8s %8s", user_from_uid(cuid, 0),
323fb9910d0Smillert 		    group_from_gid(cgid, 0));
324fb9910d0Smillert 
325fb9910d0Smillert 	if (option & OUTSTANDING)
326fb9910d0Smillert 		printf(" %6lu %5lu", cbytes, qnum);
327fb9910d0Smillert 
328fb9910d0Smillert 	if (option & BIGGEST)
329fb9910d0Smillert 		printf(" %6lu", qbytes);
330fb9910d0Smillert 
331fb9910d0Smillert 	if (option & PID)
332497491eaSmpech 		printf(" %5ld %5ld", (long)lspid, (long)lrpid);
333fb9910d0Smillert 
334fb9910d0Smillert 	if (option & TIME)
335fb9910d0Smillert 		printf(" %s %s %s", stime_buf, rtime_buf, ctime_buf);
336fb9910d0Smillert 
337fb9910d0Smillert 	printf("\n");
338fb9910d0Smillert }
339fb9910d0Smillert 
340fb9910d0Smillert void
show_shminfo_hdr(void)341fb9910d0Smillert show_shminfo_hdr(void)
342fb9910d0Smillert {
343fb9910d0Smillert 
344fb9910d0Smillert 	printf("Shared Memory:\n");
345fb9910d0Smillert 	printf("T       ID     KEY        MODE       OWNER    GROUP");
346fb9910d0Smillert 	if (option & CREATOR)
347fb9910d0Smillert 		printf("  CREATOR   CGROUP");
348fb9910d0Smillert 	if (option & OUTSTANDING)
349fb9910d0Smillert 		printf(" NATTCH");
350fb9910d0Smillert 	if (option & BIGGEST)
351fb9910d0Smillert 		printf("   SEGSZ");
352fb9910d0Smillert 	if (option & PID)
353fb9910d0Smillert 		printf("  CPID  LPID");
354fb9910d0Smillert 	if (option & TIME)
355fb9910d0Smillert 		printf("    ATIME    DTIME    CTIME");
356fb9910d0Smillert 	printf("\n");
357fb9910d0Smillert }
358fb9910d0Smillert 
359fb9910d0Smillert void
show_shminfo(time_t atime,time_t dtime,time_t ctime,int ipcid,key_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,u_int32_t nattch,int segsz,pid_t cpid,pid_t lpid)360fb9910d0Smillert show_shminfo(time_t atime, time_t dtime, time_t ctime, int ipcid, key_t key,
361fb9910d0Smillert     mode_t mode, uid_t uid, gid_t gid, uid_t cuid, gid_t cgid,
362fb9910d0Smillert     u_int32_t nattch, int segsz, pid_t cpid, pid_t lpid)
363fb9910d0Smillert {
364fb9910d0Smillert 	char atime_buf[100], dtime_buf[100], ctime_buf[100];
365fb9910d0Smillert 
366fb9910d0Smillert 	if (option & TIME) {
367fb9910d0Smillert 		cvt_time(atime, atime_buf, sizeof(atime_buf));
368fb9910d0Smillert 		cvt_time(dtime, dtime_buf, sizeof(dtime_buf));
369fb9910d0Smillert 		cvt_time(ctime, ctime_buf, sizeof(ctime_buf));
370fb9910d0Smillert 	}
371fb9910d0Smillert 
372cf704e8fSmatthieu 	printf("m %8d %10ld %s %8s %8s", ipcid, key, fmt_perm(mode),
373fb9910d0Smillert 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
374fb9910d0Smillert 
375fb9910d0Smillert 	if (option & CREATOR)
376fb9910d0Smillert 		printf(" %8s %8s", user_from_uid(cuid, 0),
377fb9910d0Smillert 		    group_from_gid(cgid, 0));
378fb9910d0Smillert 
379fb9910d0Smillert 	if (option & OUTSTANDING)
380fb9910d0Smillert 		printf(" %6d", nattch);
381fb9910d0Smillert 
382fb9910d0Smillert 	if (option & BIGGEST)
383fb9910d0Smillert 		printf(" %7d", segsz);
384fb9910d0Smillert 
385fb9910d0Smillert 	if (option & PID)
386fb9910d0Smillert 		printf(" %5d %5d", cpid, lpid);
387fb9910d0Smillert 
388fb9910d0Smillert 	if (option & TIME)
389fb9910d0Smillert 		printf(" %s %s %s",
390fb9910d0Smillert 		    atime_buf,
391fb9910d0Smillert 		    dtime_buf,
392fb9910d0Smillert 		    ctime_buf);
393fb9910d0Smillert 
394fb9910d0Smillert 	printf("\n");
395fb9910d0Smillert }
396fb9910d0Smillert 
397fb9910d0Smillert void
show_seminfo_hdr(void)398fb9910d0Smillert show_seminfo_hdr(void)
399fb9910d0Smillert {
400fb9910d0Smillert 
401fb9910d0Smillert 	printf("Semaphores:\n");
402fb9910d0Smillert 	printf("T       ID     KEY        MODE       OWNER    GROUP");
403fb9910d0Smillert 	if (option & CREATOR)
404fb9910d0Smillert 		printf("  CREATOR   CGROUP");
405fb9910d0Smillert 	if (option & BIGGEST)
406fb9910d0Smillert 		printf(" NSEMS");
407fb9910d0Smillert 	if (option & TIME)
408fb9910d0Smillert 		printf("    OTIME    CTIME");
409fb9910d0Smillert 	printf("\n");
410fb9910d0Smillert }
411fb9910d0Smillert 
412fb9910d0Smillert void
show_seminfo(time_t otime,time_t ctime,int ipcid,key_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,int16_t nsems)413fb9910d0Smillert show_seminfo(time_t otime, time_t ctime, int ipcid, key_t key, mode_t mode,
414fb9910d0Smillert     uid_t uid, gid_t gid, uid_t cuid, gid_t cgid, int16_t nsems)
415fb9910d0Smillert {
416fb9910d0Smillert 	char ctime_buf[100], otime_buf[100];
417fb9910d0Smillert 
418fb9910d0Smillert 	if (option & TIME) {
419fb9910d0Smillert 		cvt_time(otime, otime_buf, sizeof(otime_buf));
420fb9910d0Smillert 		cvt_time(ctime, ctime_buf, sizeof(ctime_buf));
421fb9910d0Smillert 	}
422fb9910d0Smillert 
423cf704e8fSmatthieu 	printf("s %8d %10ld %s %8s %8s", ipcid, key, fmt_perm(mode),
424fb9910d0Smillert 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
425fb9910d0Smillert 
426fb9910d0Smillert 	if (option & CREATOR)
427fb9910d0Smillert 		printf(" %8s %8s", user_from_uid(cuid, 0),
428fb9910d0Smillert 		    group_from_gid(cgid, 0));
429fb9910d0Smillert 
430fb9910d0Smillert 	if (option & BIGGEST)
431fb9910d0Smillert 		printf(" %5d", nsems);
432fb9910d0Smillert 
433fb9910d0Smillert 	if (option & TIME)
434fb9910d0Smillert 		printf(" %s %s", otime_buf, ctime_buf);
435fb9910d0Smillert 
436fb9910d0Smillert 	printf("\n");
437fb9910d0Smillert }
438fb9910d0Smillert 
439fb9910d0Smillert void
msg_sysctl(void)440fb9910d0Smillert msg_sysctl(void)
441fb9910d0Smillert {
442fb9910d0Smillert 	struct msg_sysctl_info *msgsi;
443fb9910d0Smillert 	char *buf;
444fb9910d0Smillert 	int mib[3];
445fb9910d0Smillert 	size_t len;
446fb9910d0Smillert 	int i, valid;
447fb9910d0Smillert 
448fb9910d0Smillert 	mib[0] = CTL_KERN;
449fb9910d0Smillert 	mib[1] = KERN_SYSVMSG;
450fb9910d0Smillert 	len = sizeof(valid);
451*3aaa63ebSderaadt 	if (sysctl(mib, 2, &valid, &len, NULL, 0) == -1) {
452fb9910d0Smillert 		warn("sysctl(KERN_SYSVMSG)");
453fb9910d0Smillert 		return;
454fb9910d0Smillert 	}
455fb9910d0Smillert 	if (!valid) {
456fb9910d0Smillert 		warnx("SVID messages facility not configured in the system");
457fb9910d0Smillert 		return;
458fb9910d0Smillert 	}
459fb9910d0Smillert 
460fb9910d0Smillert 	mib[0] = CTL_KERN;
461fb9910d0Smillert 	mib[1] = KERN_SYSVIPC_INFO;
462fb9910d0Smillert 	mib[2] = KERN_SYSVIPC_MSG_INFO;
463fb9910d0Smillert 
464fb9910d0Smillert 	if (!(display & MSGINFO)) {
465fb9910d0Smillert 		/* totals only */
466fb9910d0Smillert 		len = sizeof(struct msginfo);
467fb9910d0Smillert 	} else {
468*3aaa63ebSderaadt 		if (sysctl(mib, 3, NULL, &len, NULL, 0) == -1) {
469fb9910d0Smillert 			warn("sysctl(KERN_SYSVIPC_MSG_INFO)");
470fb9910d0Smillert 			return;
471fb9910d0Smillert 		}
472fb9910d0Smillert 	}
473fb9910d0Smillert 
474fb9910d0Smillert 	if ((buf = malloc(len)) == NULL)
475fb9910d0Smillert 		err(1, "malloc");
476fb9910d0Smillert 	msgsi = (struct msg_sysctl_info *)buf;
477*3aaa63ebSderaadt 	if (sysctl(mib, 3, msgsi, &len, NULL, 0) == -1) {
478fb9910d0Smillert 		warn("sysctl(KERN_SYSVIPC_MSG_INFO)");
479fb9910d0Smillert 		return;
480fb9910d0Smillert 	}
481fb9910d0Smillert 
482fb9910d0Smillert 	if (display & MSGTOTAL)
483fb9910d0Smillert 		show_msgtotal(&msgsi->msginfo);
484fb9910d0Smillert 
485fb9910d0Smillert 	if (display & MSGINFO) {
486fb9910d0Smillert 		show_msginfo_hdr();
487fb9910d0Smillert 		for (i = 0; i < msgsi->msginfo.msgmni; i++) {
488fb9910d0Smillert 			struct msqid_ds *msqptr = &msgsi->msgids[i];
489fb9910d0Smillert 			if (msqptr->msg_qbytes != 0)
490fb9910d0Smillert 				show_msginfo(msqptr->msg_stime,
491fb9910d0Smillert 				    msqptr->msg_rtime,
492fb9910d0Smillert 				    msqptr->msg_ctime,
493fb9910d0Smillert 				    IXSEQ_TO_IPCID(i, msqptr->msg_perm),
494fb9910d0Smillert 				    msqptr->msg_perm.key,
495fb9910d0Smillert 				    msqptr->msg_perm.mode,
496fb9910d0Smillert 				    msqptr->msg_perm.uid,
497fb9910d0Smillert 				    msqptr->msg_perm.gid,
498fb9910d0Smillert 				    msqptr->msg_perm.cuid,
499fb9910d0Smillert 				    msqptr->msg_perm.cgid,
500fb9910d0Smillert 				    msqptr->msg_cbytes,
501fb9910d0Smillert 				    msqptr->msg_qnum,
502fb9910d0Smillert 				    msqptr->msg_qbytes,
503fb9910d0Smillert 				    msqptr->msg_lspid,
504fb9910d0Smillert 				    msqptr->msg_lrpid);
505fb9910d0Smillert 		}
506fb9910d0Smillert 		printf("\n");
507fb9910d0Smillert 	}
508fb9910d0Smillert }
509fb9910d0Smillert 
510fb9910d0Smillert void
shm_sysctl(void)511fb9910d0Smillert shm_sysctl(void)
512fb9910d0Smillert {
513fb9910d0Smillert 	struct shm_sysctl_info *shmsi;
514fb9910d0Smillert 	char *buf;
515fb9910d0Smillert 	int mib[3];
516fb9910d0Smillert 	size_t len;
517cbdb86d9Smillert 	int i, valid;
518fb9910d0Smillert 
519fb9910d0Smillert 	mib[0] = CTL_KERN;
520fb9910d0Smillert 	mib[1] = KERN_SYSVSHM;
521fb9910d0Smillert 	len = sizeof(valid);
522*3aaa63ebSderaadt 	if (sysctl(mib, 2, &valid, &len, NULL, 0) == -1) {
523fb9910d0Smillert 		warn("sysctl(KERN_SYSVSHM)");
524fb9910d0Smillert 		return;
525fb9910d0Smillert 	}
526fb9910d0Smillert 	if (!valid) {
527fb9910d0Smillert 		warnx("SVID shared memory facility not configured in "
528fb9910d0Smillert 		    "the system");
529fb9910d0Smillert 		return;
530fb9910d0Smillert 	}
531fb9910d0Smillert 
532fb9910d0Smillert 	mib[0] = CTL_KERN;
533fb9910d0Smillert 	mib[1] = KERN_SYSVIPC_INFO;
534fb9910d0Smillert 	mib[2] = KERN_SYSVIPC_SHM_INFO;
535fb9910d0Smillert 
536fb9910d0Smillert 	if (!(display & SHMINFO)) {
537fb9910d0Smillert 		/* totals only */
538fb9910d0Smillert 		len = sizeof(struct shminfo);
539fb9910d0Smillert 	} else {
540*3aaa63ebSderaadt 		if (sysctl(mib, 3, NULL, &len, NULL, 0) == -1) {
541fb9910d0Smillert 			warn("sysctl(KERN_SYSVIPC_SHM_INFO)");
542fb9910d0Smillert 			return;
543fb9910d0Smillert 		}
544fb9910d0Smillert 	}
545fb9910d0Smillert 
546fb9910d0Smillert 	if ((buf = malloc(len)) == NULL)
547fb9910d0Smillert 		err(1, "malloc");
548fb9910d0Smillert 	shmsi = (struct shm_sysctl_info *)buf;
549*3aaa63ebSderaadt 	if (sysctl(mib, 3, shmsi, &len, NULL, 0) == -1) {
550fb9910d0Smillert 		warn("sysctl(KERN_SYSVIPC_SHM_INFO)");
551fb9910d0Smillert 		return;
552fb9910d0Smillert 	}
553fb9910d0Smillert 
554fb9910d0Smillert 	if (display & SHMTOTAL)
555fb9910d0Smillert 		show_shmtotal(&shmsi->shminfo);
556fb9910d0Smillert 
557fb9910d0Smillert 	if (display & SHMINFO) {
558fb9910d0Smillert 		show_shminfo_hdr();
559fb9910d0Smillert 		for (i = 0; i < shmsi->shminfo.shmmni; i++) {
560fb9910d0Smillert 			struct shmid_ds *shmptr = &shmsi->shmids[i];
561cbdb86d9Smillert 			if (shmptr->shm_internal)
562fb9910d0Smillert 				show_shminfo(shmptr->shm_atime,
563fb9910d0Smillert 				    shmptr->shm_dtime,
564fb9910d0Smillert 				    shmptr->shm_ctime,
565fb9910d0Smillert 				    IXSEQ_TO_IPCID(i, shmptr->shm_perm),
566fb9910d0Smillert 				    shmptr->shm_perm.key,
567fb9910d0Smillert 				    shmptr->shm_perm.mode,
568fb9910d0Smillert 				    shmptr->shm_perm.uid,
569fb9910d0Smillert 				    shmptr->shm_perm.gid,
570fb9910d0Smillert 				    shmptr->shm_perm.cuid,
571fb9910d0Smillert 				    shmptr->shm_perm.cgid,
572fb9910d0Smillert 				    shmptr->shm_nattch,
573fb9910d0Smillert 				    shmptr->shm_segsz,
574fb9910d0Smillert 				    shmptr->shm_cpid,
575fb9910d0Smillert 				    shmptr->shm_lpid);
576fb9910d0Smillert 		}
577fb9910d0Smillert 		printf("\n");
578fb9910d0Smillert 	}
579fb9910d0Smillert }
580fb9910d0Smillert 
581fb9910d0Smillert void
sem_sysctl(void)582fb9910d0Smillert sem_sysctl(void)
583fb9910d0Smillert {
584fb9910d0Smillert 	struct sem_sysctl_info *semsi;
585fb9910d0Smillert 	char *buf;
586fb9910d0Smillert 	int mib[3];
587fb9910d0Smillert 	size_t len;
588fb9910d0Smillert 	int i, valid;
589fb9910d0Smillert 
590fb9910d0Smillert 	mib[0] = CTL_KERN;
591fb9910d0Smillert 	mib[1] = KERN_SYSVSEM;
592fb9910d0Smillert 	len = sizeof(valid);
593*3aaa63ebSderaadt 	if (sysctl(mib, 2, &valid, &len, NULL, 0) == -1) {
594fb9910d0Smillert 		warn("sysctl(KERN_SYSVSEM)");
595fb9910d0Smillert 		return;
596fb9910d0Smillert 	}
597fb9910d0Smillert 	if (!valid) {
598fb9910d0Smillert 		warnx("SVID shared memory facility not configured in "
599fb9910d0Smillert 		    "the system");
600fb9910d0Smillert 		return;
601fb9910d0Smillert 	}
602fb9910d0Smillert 
603fb9910d0Smillert 	mib[0] = CTL_KERN;
604fb9910d0Smillert 	mib[1] = KERN_SYSVIPC_INFO;
605fb9910d0Smillert 	mib[2] = KERN_SYSVIPC_SEM_INFO;
606fb9910d0Smillert 
607fb9910d0Smillert 	if (!(display & SEMINFO)) {
608fb9910d0Smillert 		/* totals only */
609fb9910d0Smillert 		len = sizeof(struct seminfo);
610fb9910d0Smillert 	} else {
611*3aaa63ebSderaadt 		if (sysctl(mib, 3, NULL, &len, NULL, 0) == -1) {
612fb9910d0Smillert 			warn("sysctl(KERN_SYSVIPC_SEM_INFO)");
613fb9910d0Smillert 			return;
614fb9910d0Smillert 		}
615fb9910d0Smillert 	}
616fb9910d0Smillert 
617fb9910d0Smillert 	if ((buf = malloc(len)) == NULL)
618fb9910d0Smillert 		err(1, "malloc");
619fb9910d0Smillert 	semsi = (struct sem_sysctl_info *)buf;
620*3aaa63ebSderaadt 	if (sysctl(mib, 3, semsi, &len, NULL, 0) == -1) {
621fb9910d0Smillert 		warn("sysctl(KERN_SYSVIPC_SEM_INFO)");
622fb9910d0Smillert 		return;
623fb9910d0Smillert 	}
624fb9910d0Smillert 
625fb9910d0Smillert 	if (display & SEMTOTAL)
626fb9910d0Smillert 		show_semtotal(&semsi->seminfo);
627fb9910d0Smillert 
628fb9910d0Smillert 	if (display & SEMINFO) {
629fb9910d0Smillert 		show_seminfo_hdr();
630fb9910d0Smillert 		for (i = 0; i < semsi->seminfo.semmni; i++) {
631fb9910d0Smillert 			struct semid_ds *semaptr = &semsi->semids[i];
632cbdb86d9Smillert 
633cbdb86d9Smillert 			if (semaptr->sem_base != NULL)
634fb9910d0Smillert 				show_seminfo(semaptr->sem_otime,
635fb9910d0Smillert 				    semaptr->sem_ctime,
636fb9910d0Smillert 				    IXSEQ_TO_IPCID(i, semaptr->sem_perm),
637fb9910d0Smillert 				    semaptr->sem_perm.key,
638fb9910d0Smillert 				    semaptr->sem_perm.mode,
639fb9910d0Smillert 				    semaptr->sem_perm.uid,
640fb9910d0Smillert 				    semaptr->sem_perm.gid,
641fb9910d0Smillert 				    semaptr->sem_perm.cuid,
642fb9910d0Smillert 				    semaptr->sem_perm.cgid,
643fb9910d0Smillert 				    semaptr->sem_nsems);
644fb9910d0Smillert 		}
645fb9910d0Smillert 		printf("\n");
646fb9910d0Smillert 	}
647fb9910d0Smillert }
648fb9910d0Smillert 
649fb9910d0Smillert void
ipcs_kvm(void)650fb9910d0Smillert ipcs_kvm(void)
651fb9910d0Smillert {
652fb9910d0Smillert 	struct msginfo msginfo;
6535e505461Sguenther 	struct que msgque;
654fb9910d0Smillert 	struct msqid_ds *msqids;
655fb9910d0Smillert 	struct seminfo seminfo;
656cbdb86d9Smillert 	struct semid_ds sem, **sema;
657fb9910d0Smillert 	struct shminfo shminfo;
658cbdb86d9Smillert 	struct shmid_ds shmseg, **shmsegs;
659fb9910d0Smillert 	char errbuf[_POSIX2_LINE_MAX];
660cbdb86d9Smillert 	u_long addr;
661cbdb86d9Smillert 	kvm_t *kd;
662fb9910d0Smillert 	int i;
663fb9910d0Smillert 	struct nlist symbols[] = {
664fb9910d0Smillert 		{"_sema"},
665fb9910d0Smillert 	#define X_SEMA		0
666fb9910d0Smillert 		{"_seminfo"},
667fb9910d0Smillert 	#define X_SEMINFO	1
668fb9910d0Smillert 		{"_semu"},
669fb9910d0Smillert 	#define X_SEMU		2
670fb9910d0Smillert 		{"_msginfo"},
671fb9910d0Smillert 	#define X_MSGINFO	3
6725e505461Sguenther 		{"_msg_queues"},
6735e505461Sguenther 	#define X_MSG_QUEUES	4
674fb9910d0Smillert 		{"_shminfo"},
675fb9910d0Smillert 	#define X_SHMINFO	5
676fb9910d0Smillert 		{"_shmsegs"},
677fb9910d0Smillert 	#define X_SHMSEGS	6
678fb9910d0Smillert 		{NULL}
679fb9910d0Smillert 	};
680fb9910d0Smillert 
681fb9910d0Smillert 	if ((kd = kvm_openfiles(namelist, core, NULL, O_RDONLY,
682fb9910d0Smillert 	    errbuf)) == NULL)
683fb9910d0Smillert 		errx(1, "can't open kvm: %s", errbuf);
684e46873ebSderaadt 
685df930be7Sderaadt 	switch (kvm_nlist(kd, symbols)) {
686df930be7Sderaadt 	case 0:
687df930be7Sderaadt 		break;
688df930be7Sderaadt 	case -1:
689fb9910d0Smillert 		errx(1, "%s: unable to read symbol table.",
690fb9910d0Smillert 		    namelist == NULL ? _PATH_UNIX : namelist);
691fb9910d0Smillert 		/* NOTREACHED */
692df930be7Sderaadt 	default:
693df930be7Sderaadt #ifdef notdef		/* they'll be told more civilly later */
694df930be7Sderaadt 		warnx("nlist failed");
695df930be7Sderaadt 		for (i = 0; symbols[i].n_name != NULL; i++)
696df930be7Sderaadt 			if (symbols[i].n_value == 0)
697fb9910d0Smillert 				warnx("symbol %s not found", symbols[i].n_name);
698df930be7Sderaadt #endif
699fb9910d0Smillert 		break;
700df930be7Sderaadt 	}
701df930be7Sderaadt 
702df930be7Sderaadt 	if ((display & (MSGINFO | MSGTOTAL)) &&
70354fca307Sderaadt 	    (kvm_read(kd, symbols[X_MSGINFO].n_value,
70454fca307Sderaadt 	     &msginfo, sizeof(msginfo)) == sizeof(msginfo))) {
705df930be7Sderaadt 
706fb9910d0Smillert 		if (display & MSGTOTAL)
707fb9910d0Smillert 			show_msgtotal(&msginfo);
708fb9910d0Smillert 
709df930be7Sderaadt 		if (display & MSGINFO) {
7105e505461Sguenther 			if (kvm_read(kd, symbols[X_MSG_QUEUES].n_value,
711cbdb86d9Smillert 			    &addr, sizeof(addr)) != sizeof(addr))
71254fca307Sderaadt 				errx(1, "kvm_read (%s): %s",
7135e505461Sguenther 				    symbols[X_MSG_QUEUES].n_name,
7145e505461Sguenther 				    kvm_geterr(kd));
71554fca307Sderaadt 
716bfdaf066Sderaadt 			msqids = calloc(sizeof(struct msqid_ds),
71754fca307Sderaadt 			    msginfo.msgmni);
718cbdb86d9Smillert 			if (msqids == NULL)
719bfdaf066Sderaadt 				err(1, "calloc");
72054fca307Sderaadt 
7215e505461Sguenther 			/* walk the TAILQ */
7225e505461Sguenther 			while (addr != 0) {
7235e505461Sguenther 				if (kvm_read(kd, addr, &msgque, sizeof(msgque))
7245e505461Sguenther 				    != sizeof(msgque))
7255e505461Sguenther 					errx(1, "kvm_read (%s): %s",
7265e505461Sguenther 					    "msg que", kvm_geterr(kd));
7275e505461Sguenther 				msqids[msgque.que_ix] = msgque.msqid_ds;
7285e505461Sguenther 				addr = (u_long)TAILQ_NEXT(&msgque, que_next);
7295e505461Sguenther 			}
730df930be7Sderaadt 
731fb9910d0Smillert 			show_msginfo_hdr();
732fb9910d0Smillert 			for (i = 0; i < msginfo.msgmni; i++) {
733cbdb86d9Smillert 				struct msqid_ds *msqptr = &msqids[i];
734fb9910d0Smillert 				if (msqptr->msg_qbytes != 0)
735fb9910d0Smillert 					show_msginfo(msqptr->msg_stime,
736fb9910d0Smillert 					    msqptr->msg_rtime,
737fb9910d0Smillert 					    msqptr->msg_ctime,
738df930be7Sderaadt 					    IXSEQ_TO_IPCID(i, msqptr->msg_perm),
739df930be7Sderaadt 					    msqptr->msg_perm.key,
740fb9910d0Smillert 					    msqptr->msg_perm.mode,
741fb9910d0Smillert 					    msqptr->msg_perm.uid,
742fb9910d0Smillert 					    msqptr->msg_perm.gid,
743fb9910d0Smillert 					    msqptr->msg_perm.cuid,
744fb9910d0Smillert 					    msqptr->msg_perm.cgid,
745df930be7Sderaadt 					    msqptr->msg_cbytes,
746fb9910d0Smillert 					    msqptr->msg_qnum,
747fb9910d0Smillert 					    msqptr->msg_qbytes,
748df930be7Sderaadt 					    msqptr->msg_lspid,
749df930be7Sderaadt 					    msqptr->msg_lrpid);
750df930be7Sderaadt 			}
751df930be7Sderaadt 			printf("\n");
752df930be7Sderaadt 		}
753fb9910d0Smillert 	} else {
754df930be7Sderaadt 		if (display & (MSGINFO | MSGTOTAL)) {
755fb9910d0Smillert 			warnx("SVID messages facility not configured in "
756fb9910d0Smillert 			    "the system");
757fb9910d0Smillert 		}
758df930be7Sderaadt 	}
759df930be7Sderaadt 	if ((display & (SHMINFO | SHMTOTAL)) &&
76054fca307Sderaadt 	    (kvm_read(kd, symbols[X_SHMINFO].n_value, &shminfo,
76154fca307Sderaadt 	     sizeof(shminfo)) == sizeof(shminfo))) {
76254fca307Sderaadt 
763fb9910d0Smillert 		if (display & SHMTOTAL)
764fb9910d0Smillert 			show_shmtotal(&shminfo);
765fb9910d0Smillert 
766df930be7Sderaadt 		if (display & SHMINFO) {
767cbdb86d9Smillert 			if (kvm_read(kd, symbols[X_SHMSEGS].n_value, &addr,
768cbdb86d9Smillert 			    sizeof(addr)) != sizeof(addr))
76954fca307Sderaadt 				errx(1, "kvm_read (%s): %s",
77054fca307Sderaadt 				    symbols[X_SHMSEGS].n_name, kvm_geterr(kd));
77154fca307Sderaadt 
772bfdaf066Sderaadt 			shmsegs = calloc(sizeof(struct shmid_ds *),
7730772afe3Sderaadt 			    shminfo.shmmni);
774cbdb86d9Smillert 			if (shmsegs == NULL)
775bfdaf066Sderaadt 				err(1, "calloc");
77654fca307Sderaadt 
777cbdb86d9Smillert 			if (kvm_read(kd, addr, shmsegs,
778cbdb86d9Smillert 			    sizeof(struct shmid_ds *) * shminfo.shmmni) !=
779cbdb86d9Smillert 			    sizeof(struct shmid_ds *) * shminfo.shmmni)
78054fca307Sderaadt 				errx(1, "kvm_read (shmsegs): %s",
78154fca307Sderaadt 				    kvm_geterr(kd));
782df930be7Sderaadt 
783fb9910d0Smillert 			show_shminfo_hdr();
784fb9910d0Smillert 			for (i = 0; i < shminfo.shmmni; i++) {
785cbdb86d9Smillert 				if (shmsegs[i] == NULL)
786cbdb86d9Smillert 					continue;
787cbdb86d9Smillert 
788cbdb86d9Smillert 				if (kvm_read(kd, (u_long)shmsegs[i], &shmseg,
789cbdb86d9Smillert 				    sizeof(shmseg)) != sizeof(shmseg))
790cbdb86d9Smillert 					errx(1, "kvm_read (shmseg): %s",
791cbdb86d9Smillert 					    kvm_geterr(kd));
792cbdb86d9Smillert 				show_shminfo(shmseg.shm_atime,
793cbdb86d9Smillert 				    shmseg.shm_dtime,
794cbdb86d9Smillert 				    shmseg.shm_ctime,
795cbdb86d9Smillert 				    IXSEQ_TO_IPCID(i, shmseg.shm_perm),
796cbdb86d9Smillert 				    shmseg.shm_perm.key,
797cbdb86d9Smillert 				    shmseg.shm_perm.mode,
798cbdb86d9Smillert 				    shmseg.shm_perm.uid,
799cbdb86d9Smillert 				    shmseg.shm_perm.gid,
800cbdb86d9Smillert 				    shmseg.shm_perm.cuid,
801cbdb86d9Smillert 				    shmseg.shm_perm.cgid,
802cbdb86d9Smillert 				    shmseg.shm_nattch,
803cbdb86d9Smillert 				    shmseg.shm_segsz,
804cbdb86d9Smillert 				    shmseg.shm_cpid,
805cbdb86d9Smillert 				    shmseg.shm_lpid);
806df930be7Sderaadt 			}
807df930be7Sderaadt 			printf("\n");
808df930be7Sderaadt 		}
809df930be7Sderaadt 	} else
810df930be7Sderaadt 		if (display & (SHMINFO | SHMTOTAL)) {
811fb9910d0Smillert 			warnx("SVID shared memory facility not configured in "
812fb9910d0Smillert 			    "the system");
813df930be7Sderaadt 		}
814df930be7Sderaadt 	if ((display & (SEMINFO | SEMTOTAL)) &&
81554fca307Sderaadt 	    (kvm_read(kd, symbols[X_SEMINFO].n_value, &seminfo,
81654fca307Sderaadt 	     sizeof(seminfo)) == sizeof(seminfo))) {
817fb9910d0Smillert 		if (display & SEMTOTAL)
818fb9910d0Smillert 			show_semtotal(&seminfo);
819fb9910d0Smillert 
820df930be7Sderaadt 		if (display & SEMINFO) {
821cbdb86d9Smillert 			if (kvm_read(kd, symbols[X_SEMA].n_value, &addr,
822cbdb86d9Smillert 			    sizeof(addr)) != sizeof(addr))
82354fca307Sderaadt 				errx(1, "kvm_read (%s): %s",
82454fca307Sderaadt 				    symbols[X_SEMA].n_name, kvm_geterr(kd));
82554fca307Sderaadt 
826bfdaf066Sderaadt 			sema = calloc(sizeof(struct semid_ds *),
82754fca307Sderaadt 			    seminfo.semmni);
828cbdb86d9Smillert 			if (sema == NULL)
829bfdaf066Sderaadt 				err(1, "calloc");
83054fca307Sderaadt 
831cbdb86d9Smillert 			if (kvm_read(kd, addr, sema,
832cbdb86d9Smillert 			    sizeof(struct semid_ds *) * seminfo.semmni) !=
833cbdb86d9Smillert 			    sizeof(struct semid_ds *) * seminfo.semmni)
83454fca307Sderaadt 				errx(1, "kvm_read (sema): %s",
83554fca307Sderaadt 				    kvm_geterr(kd));
836df930be7Sderaadt 
837fb9910d0Smillert 			show_seminfo_hdr();
838fb9910d0Smillert 			for (i = 0; i < seminfo.semmni; i++) {
839cbdb86d9Smillert 				if (sema[i] == NULL)
840cbdb86d9Smillert 					continue;
841df930be7Sderaadt 
842cbdb86d9Smillert 				if (kvm_read(kd, (u_long)sema[i], &sem,
843cbdb86d9Smillert 				    sizeof(sem)) != sizeof(sem))
844cbdb86d9Smillert 					errx(1, "kvm_read (sem): %s",
845cbdb86d9Smillert 					    kvm_geterr(kd));
846cbdb86d9Smillert 				show_seminfo(sem.sem_otime,
847cbdb86d9Smillert 				    sem.sem_ctime,
848cbdb86d9Smillert 				    IXSEQ_TO_IPCID(i, sem.sem_perm),
849cbdb86d9Smillert 				    sem.sem_perm.key,
850cbdb86d9Smillert 				    sem.sem_perm.mode,
851cbdb86d9Smillert 				    sem.sem_perm.uid,
852cbdb86d9Smillert 				    sem.sem_perm.gid,
853cbdb86d9Smillert 				    sem.sem_perm.cuid,
854cbdb86d9Smillert 				    sem.sem_perm.cgid,
855cbdb86d9Smillert 				    sem.sem_nsems);
856cbdb86d9Smillert 			}
857df930be7Sderaadt 			printf("\n");
858df930be7Sderaadt 		}
859df930be7Sderaadt 	} else
860df930be7Sderaadt 		if (display & (SEMINFO | SEMTOTAL)) {
861fb9910d0Smillert 			warnx("SVID semaphores facility not configured in "
862fb9910d0Smillert 			    "the system");
863df930be7Sderaadt 		}
864df930be7Sderaadt 	kvm_close(kd);
865df930be7Sderaadt }
866df930be7Sderaadt 
867df930be7Sderaadt void
usage(void)868fb9910d0Smillert usage(void)
869df930be7Sderaadt {
870fb9910d0Smillert 	extern char *__progname;
871df930be7Sderaadt 
872df930be7Sderaadt 	fprintf(stderr,
8737700f014Sjmc 	    "usage: %s [-abcMmopQqSsTt] [-C core] [-N system]\n",
87454fca307Sderaadt 	    __progname);
875df930be7Sderaadt 	exit(1);
876df930be7Sderaadt }
877