xref: /minix3/usr.bin/ipcs/ipcs.c (revision 7b09d0426a4cc7fc50177a445527ffe3ebc4cb89)
1*7b09d042SDavid van Moolenbroek /*	$NetBSD: ipcs.c,v 1.43 2014/06/11 14:57:55 joerg Exp $	*/
2*7b09d042SDavid van Moolenbroek 
3*7b09d042SDavid van Moolenbroek /*-
4*7b09d042SDavid van Moolenbroek  * Copyright (c) 2000 The NetBSD Foundation, Inc.
5*7b09d042SDavid van Moolenbroek  * All rights reserved.
6*7b09d042SDavid van Moolenbroek  *
7*7b09d042SDavid van Moolenbroek  * This code is derived from software contributed to The NetBSD Foundation
8*7b09d042SDavid van Moolenbroek  * by Simon Burge.
9*7b09d042SDavid van Moolenbroek  *
10*7b09d042SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*7b09d042SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*7b09d042SDavid van Moolenbroek  * are met:
13*7b09d042SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*7b09d042SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*7b09d042SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*7b09d042SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
17*7b09d042SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
18*7b09d042SDavid van Moolenbroek  *
19*7b09d042SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*7b09d042SDavid van Moolenbroek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*7b09d042SDavid van Moolenbroek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*7b09d042SDavid van Moolenbroek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*7b09d042SDavid van Moolenbroek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*7b09d042SDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*7b09d042SDavid van Moolenbroek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*7b09d042SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*7b09d042SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*7b09d042SDavid van Moolenbroek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*7b09d042SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGE.
30*7b09d042SDavid van Moolenbroek  */
31*7b09d042SDavid van Moolenbroek 
32*7b09d042SDavid van Moolenbroek /*
33*7b09d042SDavid van Moolenbroek  * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
34*7b09d042SDavid van Moolenbroek  * All rights reserved.
35*7b09d042SDavid van Moolenbroek  *
36*7b09d042SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
37*7b09d042SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
38*7b09d042SDavid van Moolenbroek  * are met:
39*7b09d042SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
40*7b09d042SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
41*7b09d042SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
42*7b09d042SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
43*7b09d042SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
44*7b09d042SDavid van Moolenbroek  *
45*7b09d042SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
46*7b09d042SDavid van Moolenbroek  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
47*7b09d042SDavid van Moolenbroek  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
48*7b09d042SDavid van Moolenbroek  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49*7b09d042SDavid van Moolenbroek  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
50*7b09d042SDavid van Moolenbroek  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
51*7b09d042SDavid van Moolenbroek  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
52*7b09d042SDavid van Moolenbroek  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
53*7b09d042SDavid van Moolenbroek  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
54*7b09d042SDavid van Moolenbroek  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
55*7b09d042SDavid van Moolenbroek  */
56*7b09d042SDavid van Moolenbroek 
57*7b09d042SDavid van Moolenbroek #include <sys/cdefs.h>
58*7b09d042SDavid van Moolenbroek #include <sys/param.h>
59*7b09d042SDavid van Moolenbroek #include <sys/sysctl.h>
60*7b09d042SDavid van Moolenbroek #include <sys/inttypes.h>
61*7b09d042SDavid van Moolenbroek #include <sys/ipc.h>
62*7b09d042SDavid van Moolenbroek #include <sys/sem.h>
63*7b09d042SDavid van Moolenbroek #include <sys/shm.h>
64*7b09d042SDavid van Moolenbroek #include <sys/msg.h>
65*7b09d042SDavid van Moolenbroek 
66*7b09d042SDavid van Moolenbroek #include <err.h>
67*7b09d042SDavid van Moolenbroek #include <fcntl.h>
68*7b09d042SDavid van Moolenbroek #include <grp.h>
69*7b09d042SDavid van Moolenbroek #include <limits.h>
70*7b09d042SDavid van Moolenbroek #include <paths.h>
71*7b09d042SDavid van Moolenbroek #include <pwd.h>
72*7b09d042SDavid van Moolenbroek #include <stdio.h>
73*7b09d042SDavid van Moolenbroek #include <stdlib.h>
74*7b09d042SDavid van Moolenbroek #include <string.h>
75*7b09d042SDavid van Moolenbroek #include <time.h>
76*7b09d042SDavid van Moolenbroek #include <unistd.h>
77*7b09d042SDavid van Moolenbroek 
78*7b09d042SDavid van Moolenbroek #define	SHMINFO		1
79*7b09d042SDavid van Moolenbroek #define	SHMTOTAL	2
80*7b09d042SDavid van Moolenbroek #define	MSGINFO		4
81*7b09d042SDavid van Moolenbroek #define	MSGTOTAL	8
82*7b09d042SDavid van Moolenbroek #define	SEMINFO		16
83*7b09d042SDavid van Moolenbroek #define	SEMTOTAL	32
84*7b09d042SDavid van Moolenbroek 
85*7b09d042SDavid van Moolenbroek #define BIGGEST		1
86*7b09d042SDavid van Moolenbroek #define CREATOR		2
87*7b09d042SDavid van Moolenbroek #define OUTSTANDING	4
88*7b09d042SDavid van Moolenbroek #define PID		8
89*7b09d042SDavid van Moolenbroek #define TIME		16
90*7b09d042SDavid van Moolenbroek 
91*7b09d042SDavid van Moolenbroek static int	display = 0;
92*7b09d042SDavid van Moolenbroek static int	option = 0;
93*7b09d042SDavid van Moolenbroek 
94*7b09d042SDavid van Moolenbroek static void	cvt_time(time_t, char *, size_t);
95*7b09d042SDavid van Moolenbroek static char    *fmt_perm(u_short);
96*7b09d042SDavid van Moolenbroek static void	msg_sysctl(void);
97*7b09d042SDavid van Moolenbroek static void	sem_sysctl(void);
98*7b09d042SDavid van Moolenbroek static void	shm_sysctl(void);
99*7b09d042SDavid van Moolenbroek static void	show_msginfo(time_t, time_t, time_t, int, u_int64_t, mode_t,
100*7b09d042SDavid van Moolenbroek     uid_t, gid_t, uid_t, gid_t, u_int64_t, u_int64_t, u_int64_t, pid_t, pid_t);
101*7b09d042SDavid van Moolenbroek static void	show_msginfo_hdr(void);
102*7b09d042SDavid van Moolenbroek static void	show_msgtotal(struct msginfo *);
103*7b09d042SDavid van Moolenbroek static void	show_seminfo_hdr(void);
104*7b09d042SDavid van Moolenbroek static void	show_seminfo(time_t, time_t, int, u_int64_t, mode_t, uid_t,
105*7b09d042SDavid van Moolenbroek     gid_t, uid_t, gid_t, int16_t);
106*7b09d042SDavid van Moolenbroek static void	show_semtotal(struct seminfo *);
107*7b09d042SDavid van Moolenbroek static void	show_shminfo(time_t, time_t, time_t, int, u_int64_t, mode_t,
108*7b09d042SDavid van Moolenbroek     uid_t, gid_t, uid_t, gid_t, u_int32_t, u_int64_t, pid_t, pid_t);
109*7b09d042SDavid van Moolenbroek static void	show_shminfo_hdr(void);
110*7b09d042SDavid van Moolenbroek static void	show_shmtotal(struct shminfo *);
111*7b09d042SDavid van Moolenbroek static void	usage(void) __dead;
112*7b09d042SDavid van Moolenbroek static void	unconfsem(void);
113*7b09d042SDavid van Moolenbroek static void	unconfmsg(void);
114*7b09d042SDavid van Moolenbroek static void	unconfshm(void);
115*7b09d042SDavid van Moolenbroek 
116*7b09d042SDavid van Moolenbroek static void
unconfsem(void)117*7b09d042SDavid van Moolenbroek unconfsem(void)
118*7b09d042SDavid van Moolenbroek {
119*7b09d042SDavid van Moolenbroek 	warnx("SVID semaphores facility not configured in the system");
120*7b09d042SDavid van Moolenbroek }
121*7b09d042SDavid van Moolenbroek 
122*7b09d042SDavid van Moolenbroek static void
unconfmsg(void)123*7b09d042SDavid van Moolenbroek unconfmsg(void)
124*7b09d042SDavid van Moolenbroek {
125*7b09d042SDavid van Moolenbroek 	warnx("SVID messages facility not configured in the system");
126*7b09d042SDavid van Moolenbroek }
127*7b09d042SDavid van Moolenbroek 
128*7b09d042SDavid van Moolenbroek static void
unconfshm(void)129*7b09d042SDavid van Moolenbroek unconfshm(void)
130*7b09d042SDavid van Moolenbroek {
131*7b09d042SDavid van Moolenbroek 	warnx("SVID shared memory facility not configured in the system");
132*7b09d042SDavid van Moolenbroek }
133*7b09d042SDavid van Moolenbroek 
134*7b09d042SDavid van Moolenbroek static char *
fmt_perm(u_short mode)135*7b09d042SDavid van Moolenbroek fmt_perm(u_short mode)
136*7b09d042SDavid van Moolenbroek {
137*7b09d042SDavid van Moolenbroek 	static char buffer[12];
138*7b09d042SDavid van Moolenbroek 
139*7b09d042SDavid van Moolenbroek 	buffer[0] = '-';
140*7b09d042SDavid van Moolenbroek 	buffer[1] = '-';
141*7b09d042SDavid van Moolenbroek 	buffer[2] = ((mode & 0400) ? 'r' : '-');
142*7b09d042SDavid van Moolenbroek 	buffer[3] = ((mode & 0200) ? 'w' : '-');
143*7b09d042SDavid van Moolenbroek 	buffer[4] = ((mode & 0100) ? 'a' : '-');
144*7b09d042SDavid van Moolenbroek 	buffer[5] = ((mode & 0040) ? 'r' : '-');
145*7b09d042SDavid van Moolenbroek 	buffer[6] = ((mode & 0020) ? 'w' : '-');
146*7b09d042SDavid van Moolenbroek 	buffer[7] = ((mode & 0010) ? 'a' : '-');
147*7b09d042SDavid van Moolenbroek 	buffer[8] = ((mode & 0004) ? 'r' : '-');
148*7b09d042SDavid van Moolenbroek 	buffer[9] = ((mode & 0002) ? 'w' : '-');
149*7b09d042SDavid van Moolenbroek 	buffer[10] = ((mode & 0001) ? 'a' : '-');
150*7b09d042SDavid van Moolenbroek 	buffer[11] = '\0';
151*7b09d042SDavid van Moolenbroek 	return (&buffer[0]);
152*7b09d042SDavid van Moolenbroek }
153*7b09d042SDavid van Moolenbroek 
154*7b09d042SDavid van Moolenbroek static void
cvt_time(time_t t,char * buf,size_t buflen)155*7b09d042SDavid van Moolenbroek cvt_time(time_t t, char *buf, size_t buflen)
156*7b09d042SDavid van Moolenbroek {
157*7b09d042SDavid van Moolenbroek 	struct tm *tm;
158*7b09d042SDavid van Moolenbroek 
159*7b09d042SDavid van Moolenbroek 	if (t == 0)
160*7b09d042SDavid van Moolenbroek 		(void)strlcpy(buf, "no-entry", buflen);
161*7b09d042SDavid van Moolenbroek 	else {
162*7b09d042SDavid van Moolenbroek 		tm = localtime(&t);
163*7b09d042SDavid van Moolenbroek 		(void)snprintf(buf, buflen, "%2d:%02d:%02d",
164*7b09d042SDavid van Moolenbroek 			tm->tm_hour, tm->tm_min, tm->tm_sec);
165*7b09d042SDavid van Moolenbroek 	}
166*7b09d042SDavid van Moolenbroek }
167*7b09d042SDavid van Moolenbroek int
main(int argc,char * argv[])168*7b09d042SDavid van Moolenbroek main(int argc, char *argv[])
169*7b09d042SDavid van Moolenbroek {
170*7b09d042SDavid van Moolenbroek 	int i;
171*7b09d042SDavid van Moolenbroek 	time_t now;
172*7b09d042SDavid van Moolenbroek 
173*7b09d042SDavid van Moolenbroek 	while ((i = getopt(argc, argv, "MmQqSsabcoptT")) != -1)
174*7b09d042SDavid van Moolenbroek 		switch (i) {
175*7b09d042SDavid van Moolenbroek 		case 'M':
176*7b09d042SDavid van Moolenbroek 			display |= SHMTOTAL;
177*7b09d042SDavid van Moolenbroek 			break;
178*7b09d042SDavid van Moolenbroek 		case 'm':
179*7b09d042SDavid van Moolenbroek 			display |= SHMINFO;
180*7b09d042SDavid van Moolenbroek 			break;
181*7b09d042SDavid van Moolenbroek 		case 'Q':
182*7b09d042SDavid van Moolenbroek 			display |= MSGTOTAL;
183*7b09d042SDavid van Moolenbroek 			break;
184*7b09d042SDavid van Moolenbroek 		case 'q':
185*7b09d042SDavid van Moolenbroek 			display |= MSGINFO;
186*7b09d042SDavid van Moolenbroek 			break;
187*7b09d042SDavid van Moolenbroek 		case 'S':
188*7b09d042SDavid van Moolenbroek 			display |= SEMTOTAL;
189*7b09d042SDavid van Moolenbroek 			break;
190*7b09d042SDavid van Moolenbroek 		case 's':
191*7b09d042SDavid van Moolenbroek 			display |= SEMINFO;
192*7b09d042SDavid van Moolenbroek 			break;
193*7b09d042SDavid van Moolenbroek 		case 'T':
194*7b09d042SDavid van Moolenbroek 			display |= SHMTOTAL | MSGTOTAL | SEMTOTAL;
195*7b09d042SDavid van Moolenbroek 			break;
196*7b09d042SDavid van Moolenbroek 		case 'a':
197*7b09d042SDavid van Moolenbroek 			option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME;
198*7b09d042SDavid van Moolenbroek 			break;
199*7b09d042SDavid van Moolenbroek 		case 'b':
200*7b09d042SDavid van Moolenbroek 			option |= BIGGEST;
201*7b09d042SDavid van Moolenbroek 			break;
202*7b09d042SDavid van Moolenbroek 		case 'c':
203*7b09d042SDavid van Moolenbroek 			option |= CREATOR;
204*7b09d042SDavid van Moolenbroek 			break;
205*7b09d042SDavid van Moolenbroek 		case 'o':
206*7b09d042SDavid van Moolenbroek 			option |= OUTSTANDING;
207*7b09d042SDavid van Moolenbroek 			break;
208*7b09d042SDavid van Moolenbroek 		case 'p':
209*7b09d042SDavid van Moolenbroek 			option |= PID;
210*7b09d042SDavid van Moolenbroek 			break;
211*7b09d042SDavid van Moolenbroek 		case 't':
212*7b09d042SDavid van Moolenbroek 			option |= TIME;
213*7b09d042SDavid van Moolenbroek 			break;
214*7b09d042SDavid van Moolenbroek 		default:
215*7b09d042SDavid van Moolenbroek 			usage();
216*7b09d042SDavid van Moolenbroek 		}
217*7b09d042SDavid van Moolenbroek 
218*7b09d042SDavid van Moolenbroek 	if (argc - optind > 0)
219*7b09d042SDavid van Moolenbroek 		usage();
220*7b09d042SDavid van Moolenbroek 
221*7b09d042SDavid van Moolenbroek 	(void)time(&now);
222*7b09d042SDavid van Moolenbroek 	(void)printf("IPC status from <running system> as of %s\n",
223*7b09d042SDavid van Moolenbroek 	    /* and extra \n from ctime(3) */
224*7b09d042SDavid van Moolenbroek 	    ctime(&now));
225*7b09d042SDavid van Moolenbroek 
226*7b09d042SDavid van Moolenbroek         if (display == 0)
227*7b09d042SDavid van Moolenbroek 		display = SHMINFO | MSGINFO | SEMINFO;
228*7b09d042SDavid van Moolenbroek 
229*7b09d042SDavid van Moolenbroek 	if (display & (MSGINFO | MSGTOTAL))
230*7b09d042SDavid van Moolenbroek 		msg_sysctl();
231*7b09d042SDavid van Moolenbroek 	if (display & (SHMINFO | SHMTOTAL))
232*7b09d042SDavid van Moolenbroek 		shm_sysctl();
233*7b09d042SDavid van Moolenbroek 	if (display & (SEMINFO | SEMTOTAL))
234*7b09d042SDavid van Moolenbroek 		sem_sysctl();
235*7b09d042SDavid van Moolenbroek 	return 0;
236*7b09d042SDavid van Moolenbroek }
237*7b09d042SDavid van Moolenbroek 
238*7b09d042SDavid van Moolenbroek static void
show_msgtotal(struct msginfo * msginfo)239*7b09d042SDavid van Moolenbroek show_msgtotal(struct msginfo *msginfo)
240*7b09d042SDavid van Moolenbroek {
241*7b09d042SDavid van Moolenbroek 	(void)printf("msginfo:\n");
242*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgmax: %6d\t(max characters in a message)\n",
243*7b09d042SDavid van Moolenbroek 	    msginfo->msgmax);
244*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgmni: %6d\t(# of message queues)\n",
245*7b09d042SDavid van Moolenbroek 	    msginfo->msgmni);
246*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgmnb: %6d\t(max characters in a message queue)\n",
247*7b09d042SDavid van Moolenbroek 	    msginfo->msgmnb);
248*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgtql: %6d\t(max # of messages in system)\n",
249*7b09d042SDavid van Moolenbroek 	    msginfo->msgtql);
250*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgssz: %6d\t(size of a message segment)\n",
251*7b09d042SDavid van Moolenbroek 	    msginfo->msgssz);
252*7b09d042SDavid van Moolenbroek 	(void)printf("\tmsgseg: %6d\t(# of message segments in system)\n\n",
253*7b09d042SDavid van Moolenbroek 	    msginfo->msgseg);
254*7b09d042SDavid van Moolenbroek }
255*7b09d042SDavid van Moolenbroek 
256*7b09d042SDavid van Moolenbroek static void
show_shmtotal(struct shminfo * shminfo)257*7b09d042SDavid van Moolenbroek show_shmtotal(struct shminfo *shminfo)
258*7b09d042SDavid van Moolenbroek {
259*7b09d042SDavid van Moolenbroek 	(void)printf("shminfo:\n");
260*7b09d042SDavid van Moolenbroek 	(void)printf("\tshmmax: %" PRIu64 "\t(max shared memory segment size)\n",
261*7b09d042SDavid van Moolenbroek 	    shminfo->shmmax);
262*7b09d042SDavid van Moolenbroek 	(void)printf("\tshmmin: %7d\t(min shared memory segment size)\n",
263*7b09d042SDavid van Moolenbroek 	    shminfo->shmmin);
264*7b09d042SDavid van Moolenbroek 	(void)printf("\tshmmni: %7d\t(max number of shared memory identifiers)\n",
265*7b09d042SDavid van Moolenbroek 	    shminfo->shmmni);
266*7b09d042SDavid van Moolenbroek 	(void)printf("\tshmseg: %7d\t(max shared memory segments per process)\n",
267*7b09d042SDavid van Moolenbroek 	    shminfo->shmseg);
268*7b09d042SDavid van Moolenbroek 	(void)printf("\tshmall: %7d\t(max amount of shared memory in pages)\n\n",
269*7b09d042SDavid van Moolenbroek 	    shminfo->shmall);
270*7b09d042SDavid van Moolenbroek }
271*7b09d042SDavid van Moolenbroek 
272*7b09d042SDavid van Moolenbroek static void
show_semtotal(struct seminfo * seminfo)273*7b09d042SDavid van Moolenbroek show_semtotal(struct seminfo *seminfo)
274*7b09d042SDavid van Moolenbroek {
275*7b09d042SDavid van Moolenbroek 	(void)printf("seminfo:\n");
276*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemmap: %6d\t(# of entries in semaphore map)\n",
277*7b09d042SDavid van Moolenbroek 	    seminfo->semmap);
278*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemmni: %6d\t(# of semaphore identifiers)\n",
279*7b09d042SDavid van Moolenbroek 	    seminfo->semmni);
280*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemmns: %6d\t(# of semaphores in system)\n",
281*7b09d042SDavid van Moolenbroek 	    seminfo->semmns);
282*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemmnu: %6d\t(# of undo structures in system)\n",
283*7b09d042SDavid van Moolenbroek 	    seminfo->semmnu);
284*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemmsl: %6d\t(max # of semaphores per id)\n",
285*7b09d042SDavid van Moolenbroek 	    seminfo->semmsl);
286*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemopm: %6d\t(max # of operations per semop call)\n",
287*7b09d042SDavid van Moolenbroek 	    seminfo->semopm);
288*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemume: %6d\t(max # of undo entries per process)\n",
289*7b09d042SDavid van Moolenbroek 	    seminfo->semume);
290*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemusz: %6d\t(size in bytes of undo structure)\n",
291*7b09d042SDavid van Moolenbroek 	    seminfo->semusz);
292*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemvmx: %6d\t(semaphore maximum value)\n",
293*7b09d042SDavid van Moolenbroek 	    seminfo->semvmx);
294*7b09d042SDavid van Moolenbroek 	(void)printf("\tsemaem: %6d\t(adjust on exit max value)\n\n",
295*7b09d042SDavid van Moolenbroek 	    seminfo->semaem);
296*7b09d042SDavid van Moolenbroek }
297*7b09d042SDavid van Moolenbroek 
298*7b09d042SDavid van Moolenbroek static void
show_msginfo_hdr(void)299*7b09d042SDavid van Moolenbroek show_msginfo_hdr(void)
300*7b09d042SDavid van Moolenbroek {
301*7b09d042SDavid van Moolenbroek 	(void)printf("Message Queues:\n");
302*7b09d042SDavid van Moolenbroek 	(void)printf("T        ID     KEY        MODE       OWNER    GROUP");
303*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
304*7b09d042SDavid van Moolenbroek 		(void)printf("  CREATOR   CGROUP");
305*7b09d042SDavid van Moolenbroek 	if (option & OUTSTANDING)
306*7b09d042SDavid van Moolenbroek 		(void)printf(" CBYTES  QNUM");
307*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
308*7b09d042SDavid van Moolenbroek 		(void)printf(" QBYTES");
309*7b09d042SDavid van Moolenbroek 	if (option & PID)
310*7b09d042SDavid van Moolenbroek 		(void)printf(" LSPID LRPID");
311*7b09d042SDavid van Moolenbroek 	if (option & TIME)
312*7b09d042SDavid van Moolenbroek 		(void)printf("    STIME    RTIME    CTIME");
313*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
314*7b09d042SDavid van Moolenbroek }
315*7b09d042SDavid van Moolenbroek 
316*7b09d042SDavid van Moolenbroek static void
show_msginfo(time_t s_time,time_t r_time,time_t c_time,int ipcid,u_int64_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,u_int64_t cbytes,u_int64_t qnum,u_int64_t qbytes,pid_t lspid,pid_t lrpid)317*7b09d042SDavid van Moolenbroek show_msginfo(time_t s_time, time_t r_time, time_t c_time, int ipcid,
318*7b09d042SDavid van Moolenbroek     u_int64_t key,
319*7b09d042SDavid van Moolenbroek     mode_t mode, uid_t uid, gid_t gid, uid_t cuid, gid_t cgid,
320*7b09d042SDavid van Moolenbroek     u_int64_t cbytes, u_int64_t qnum, u_int64_t qbytes, pid_t lspid,
321*7b09d042SDavid van Moolenbroek     pid_t lrpid)
322*7b09d042SDavid van Moolenbroek {
323*7b09d042SDavid van Moolenbroek 	char s_time_buf[100], r_time_buf[100], c_time_buf[100];
324*7b09d042SDavid van Moolenbroek 
325*7b09d042SDavid van Moolenbroek 	if (option & TIME) {
326*7b09d042SDavid van Moolenbroek 		cvt_time(s_time, s_time_buf, sizeof(s_time_buf));
327*7b09d042SDavid van Moolenbroek 		cvt_time(r_time, r_time_buf, sizeof(r_time_buf));
328*7b09d042SDavid van Moolenbroek 		cvt_time(c_time, c_time_buf, sizeof(c_time_buf));
329*7b09d042SDavid van Moolenbroek 	}
330*7b09d042SDavid van Moolenbroek 
331*7b09d042SDavid van Moolenbroek 	(void)printf("q %9d %10lld %s %8s %8s", ipcid, (long long)key, fmt_perm(mode),
332*7b09d042SDavid van Moolenbroek 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
333*7b09d042SDavid van Moolenbroek 
334*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
335*7b09d042SDavid van Moolenbroek 		(void)printf(" %8s %8s", user_from_uid(cuid, 0),
336*7b09d042SDavid van Moolenbroek 		    group_from_gid(cgid, 0));
337*7b09d042SDavid van Moolenbroek 
338*7b09d042SDavid van Moolenbroek 	if (option & OUTSTANDING)
339*7b09d042SDavid van Moolenbroek 		(void)printf(" %6lld %5lld", (long long)cbytes, (long long)qnum);
340*7b09d042SDavid van Moolenbroek 
341*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
342*7b09d042SDavid van Moolenbroek 		(void)printf(" %6lld", (long long)qbytes);
343*7b09d042SDavid van Moolenbroek 
344*7b09d042SDavid van Moolenbroek 	if (option & PID)
345*7b09d042SDavid van Moolenbroek 		(void)printf(" %5d %5d", lspid, lrpid);
346*7b09d042SDavid van Moolenbroek 
347*7b09d042SDavid van Moolenbroek 	if (option & TIME)
348*7b09d042SDavid van Moolenbroek 		(void)printf(" %s %s %s", s_time_buf, r_time_buf, c_time_buf);
349*7b09d042SDavid van Moolenbroek 
350*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
351*7b09d042SDavid van Moolenbroek }
352*7b09d042SDavid van Moolenbroek 
353*7b09d042SDavid van Moolenbroek static void
show_shminfo_hdr(void)354*7b09d042SDavid van Moolenbroek show_shminfo_hdr(void)
355*7b09d042SDavid van Moolenbroek {
356*7b09d042SDavid van Moolenbroek 	(void)printf("Shared Memory:\n");
357*7b09d042SDavid van Moolenbroek 	(void)printf("T        ID     KEY        MODE       OWNER    GROUP");
358*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
359*7b09d042SDavid van Moolenbroek 		(void)printf("  CREATOR   CGROUP");
360*7b09d042SDavid van Moolenbroek 	if (option & OUTSTANDING)
361*7b09d042SDavid van Moolenbroek 		(void)printf(" NATTCH");
362*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
363*7b09d042SDavid van Moolenbroek 		(void)printf("   SEGSZ");
364*7b09d042SDavid van Moolenbroek 	if (option & PID)
365*7b09d042SDavid van Moolenbroek 		(void)printf("  CPID  LPID");
366*7b09d042SDavid van Moolenbroek 	if (option & TIME)
367*7b09d042SDavid van Moolenbroek 		(void)printf("    ATIME    DTIME    CTIME");
368*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
369*7b09d042SDavid van Moolenbroek }
370*7b09d042SDavid van Moolenbroek 
371*7b09d042SDavid van Moolenbroek static void
show_shminfo(time_t atime,time_t dtime,time_t c_time,int ipcid,u_int64_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,u_int32_t nattch,u_int64_t segsz,pid_t cpid,pid_t lpid)372*7b09d042SDavid van Moolenbroek show_shminfo(time_t atime, time_t dtime, time_t c_time, int ipcid, u_int64_t key,
373*7b09d042SDavid van Moolenbroek     mode_t mode, uid_t uid, gid_t gid, uid_t cuid, gid_t cgid,
374*7b09d042SDavid van Moolenbroek     u_int32_t nattch, u_int64_t segsz, pid_t cpid, pid_t lpid)
375*7b09d042SDavid van Moolenbroek {
376*7b09d042SDavid van Moolenbroek 	char atime_buf[100], dtime_buf[100], c_time_buf[100];
377*7b09d042SDavid van Moolenbroek 
378*7b09d042SDavid van Moolenbroek 	if (option & TIME) {
379*7b09d042SDavid van Moolenbroek 		cvt_time(atime, atime_buf, sizeof(atime_buf));
380*7b09d042SDavid van Moolenbroek 		cvt_time(dtime, dtime_buf, sizeof(dtime_buf));
381*7b09d042SDavid van Moolenbroek 		cvt_time(c_time, c_time_buf, sizeof(c_time_buf));
382*7b09d042SDavid van Moolenbroek 	}
383*7b09d042SDavid van Moolenbroek 
384*7b09d042SDavid van Moolenbroek 	(void)printf("m %9d %10lld %s %8s %8s", ipcid, (long long)key, fmt_perm(mode),
385*7b09d042SDavid van Moolenbroek 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
386*7b09d042SDavid van Moolenbroek 
387*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
388*7b09d042SDavid van Moolenbroek 		(void)printf(" %8s %8s", user_from_uid(cuid, 0),
389*7b09d042SDavid van Moolenbroek 		    group_from_gid(cgid, 0));
390*7b09d042SDavid van Moolenbroek 
391*7b09d042SDavid van Moolenbroek 	if (option & OUTSTANDING)
392*7b09d042SDavid van Moolenbroek 		(void)printf(" %6d", nattch);
393*7b09d042SDavid van Moolenbroek 
394*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
395*7b09d042SDavid van Moolenbroek 		(void)printf(" %7llu", (long long)segsz);
396*7b09d042SDavid van Moolenbroek 
397*7b09d042SDavid van Moolenbroek 	if (option & PID)
398*7b09d042SDavid van Moolenbroek 		(void)printf(" %5d %5d", cpid, lpid);
399*7b09d042SDavid van Moolenbroek 
400*7b09d042SDavid van Moolenbroek 	if (option & TIME)
401*7b09d042SDavid van Moolenbroek 		(void)printf(" %s %s %s",
402*7b09d042SDavid van Moolenbroek 		    atime_buf,
403*7b09d042SDavid van Moolenbroek 		    dtime_buf,
404*7b09d042SDavid van Moolenbroek 		    c_time_buf);
405*7b09d042SDavid van Moolenbroek 
406*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
407*7b09d042SDavid van Moolenbroek }
408*7b09d042SDavid van Moolenbroek 
409*7b09d042SDavid van Moolenbroek static void
show_seminfo_hdr(void)410*7b09d042SDavid van Moolenbroek show_seminfo_hdr(void)
411*7b09d042SDavid van Moolenbroek {
412*7b09d042SDavid van Moolenbroek 	(void)printf("Semaphores:\n");
413*7b09d042SDavid van Moolenbroek 	(void)printf("T        ID     KEY        MODE       OWNER    GROUP");
414*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
415*7b09d042SDavid van Moolenbroek 		(void)printf("  CREATOR   CGROUP");
416*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
417*7b09d042SDavid van Moolenbroek 		(void)printf(" NSEMS");
418*7b09d042SDavid van Moolenbroek 	if (option & TIME)
419*7b09d042SDavid van Moolenbroek 		(void)printf("    OTIME    CTIME");
420*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
421*7b09d042SDavid van Moolenbroek }
422*7b09d042SDavid van Moolenbroek 
423*7b09d042SDavid van Moolenbroek static void
show_seminfo(time_t otime,time_t c_time,int ipcid,u_int64_t key,mode_t mode,uid_t uid,gid_t gid,uid_t cuid,gid_t cgid,int16_t nsems)424*7b09d042SDavid van Moolenbroek show_seminfo(time_t otime, time_t c_time, int ipcid, u_int64_t key, mode_t mode,
425*7b09d042SDavid van Moolenbroek     uid_t uid, gid_t gid, uid_t cuid, gid_t cgid, int16_t nsems)
426*7b09d042SDavid van Moolenbroek {
427*7b09d042SDavid van Moolenbroek 	char c_time_buf[100], otime_buf[100];
428*7b09d042SDavid van Moolenbroek 
429*7b09d042SDavid van Moolenbroek 	if (option & TIME) {
430*7b09d042SDavid van Moolenbroek 		cvt_time(otime, otime_buf, sizeof(otime_buf));
431*7b09d042SDavid van Moolenbroek 		cvt_time(c_time, c_time_buf, sizeof(c_time_buf));
432*7b09d042SDavid van Moolenbroek 	}
433*7b09d042SDavid van Moolenbroek 
434*7b09d042SDavid van Moolenbroek 	(void)printf("s %9d %10lld %s %8s %8s", ipcid, (long long)key, fmt_perm(mode),
435*7b09d042SDavid van Moolenbroek 	    user_from_uid(uid, 0), group_from_gid(gid, 0));
436*7b09d042SDavid van Moolenbroek 
437*7b09d042SDavid van Moolenbroek 	if (option & CREATOR)
438*7b09d042SDavid van Moolenbroek 		(void)printf(" %8s %8s", user_from_uid(cuid, 0),
439*7b09d042SDavid van Moolenbroek 		    group_from_gid(cgid, 0));
440*7b09d042SDavid van Moolenbroek 
441*7b09d042SDavid van Moolenbroek 	if (option & BIGGEST)
442*7b09d042SDavid van Moolenbroek 		(void)printf(" %5d", nsems);
443*7b09d042SDavid van Moolenbroek 
444*7b09d042SDavid van Moolenbroek 	if (option & TIME)
445*7b09d042SDavid van Moolenbroek 		(void)printf(" %s %s", otime_buf, c_time_buf);
446*7b09d042SDavid van Moolenbroek 
447*7b09d042SDavid van Moolenbroek 	(void)printf("\n");
448*7b09d042SDavid van Moolenbroek }
449*7b09d042SDavid van Moolenbroek 
450*7b09d042SDavid van Moolenbroek static void
msg_sysctl(void)451*7b09d042SDavid van Moolenbroek msg_sysctl(void)
452*7b09d042SDavid van Moolenbroek {
453*7b09d042SDavid van Moolenbroek 	struct msg_sysctl_info *msgsi;
454*7b09d042SDavid van Moolenbroek 	void *buf;
455*7b09d042SDavid van Moolenbroek 	int mib[4];
456*7b09d042SDavid van Moolenbroek 	size_t len;
457*7b09d042SDavid van Moolenbroek 	int i, valid;
458*7b09d042SDavid van Moolenbroek 
459*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
460*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
461*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_MSG;
462*7b09d042SDavid van Moolenbroek 	len = sizeof(valid);
463*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 3, &valid, &len, NULL, 0) < 0) {
464*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_MSG)");
465*7b09d042SDavid van Moolenbroek 		return;
466*7b09d042SDavid van Moolenbroek 	}
467*7b09d042SDavid van Moolenbroek 	if (!valid) {
468*7b09d042SDavid van Moolenbroek 		unconfmsg();
469*7b09d042SDavid van Moolenbroek 		return;
470*7b09d042SDavid van Moolenbroek 	}
471*7b09d042SDavid van Moolenbroek 
472*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
473*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
474*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_INFO;
475*7b09d042SDavid van Moolenbroek 	mib[3] = KERN_SYSVIPC_MSG_INFO;
476*7b09d042SDavid van Moolenbroek 
477*7b09d042SDavid van Moolenbroek 	if (!(display & MSGINFO)) {
478*7b09d042SDavid van Moolenbroek 		/* totals only */
479*7b09d042SDavid van Moolenbroek 		len = sizeof(struct msginfo);
480*7b09d042SDavid van Moolenbroek 	} else {
481*7b09d042SDavid van Moolenbroek 		if (sysctl(mib, 4, NULL, &len, NULL, 0) < 0) {
482*7b09d042SDavid van Moolenbroek 			warn("sysctl(KERN_SYSVIPC_MSG_INFO)");
483*7b09d042SDavid van Moolenbroek 			return;
484*7b09d042SDavid van Moolenbroek 		}
485*7b09d042SDavid van Moolenbroek 	}
486*7b09d042SDavid van Moolenbroek 
487*7b09d042SDavid van Moolenbroek 	if ((buf = malloc(len)) == NULL)
488*7b09d042SDavid van Moolenbroek 		err(1, "malloc");
489*7b09d042SDavid van Moolenbroek 	msgsi = (struct msg_sysctl_info *)buf;
490*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 4, msgsi, &len, NULL, 0) < 0) {
491*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_MSG_INFO)");
492*7b09d042SDavid van Moolenbroek 		goto done;
493*7b09d042SDavid van Moolenbroek 	}
494*7b09d042SDavid van Moolenbroek 
495*7b09d042SDavid van Moolenbroek 	if (display & MSGTOTAL)
496*7b09d042SDavid van Moolenbroek 		show_msgtotal(&msgsi->msginfo);
497*7b09d042SDavid van Moolenbroek 
498*7b09d042SDavid van Moolenbroek 	if (display & MSGINFO) {
499*7b09d042SDavid van Moolenbroek 		show_msginfo_hdr();
500*7b09d042SDavid van Moolenbroek 		for (i = 0; i < msgsi->msginfo.msgmni; i++) {
501*7b09d042SDavid van Moolenbroek 			struct msgid_ds_sysctl *msqptr = &msgsi->msgids[i];
502*7b09d042SDavid van Moolenbroek 			if (msqptr->msg_qbytes != 0)
503*7b09d042SDavid van Moolenbroek 				show_msginfo(msqptr->msg_stime,
504*7b09d042SDavid van Moolenbroek 				    msqptr->msg_rtime,
505*7b09d042SDavid van Moolenbroek 				    msqptr->msg_ctime,
506*7b09d042SDavid van Moolenbroek 				    IXSEQ_TO_IPCID(i, msqptr->msg_perm),
507*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm._key,
508*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm.mode,
509*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm.uid,
510*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm.gid,
511*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm.cuid,
512*7b09d042SDavid van Moolenbroek 				    msqptr->msg_perm.cgid,
513*7b09d042SDavid van Moolenbroek 				    msqptr->_msg_cbytes,
514*7b09d042SDavid van Moolenbroek 				    msqptr->msg_qnum,
515*7b09d042SDavid van Moolenbroek 				    msqptr->msg_qbytes,
516*7b09d042SDavid van Moolenbroek 				    msqptr->msg_lspid,
517*7b09d042SDavid van Moolenbroek 				    msqptr->msg_lrpid);
518*7b09d042SDavid van Moolenbroek 		}
519*7b09d042SDavid van Moolenbroek 		(void)printf("\n");
520*7b09d042SDavid van Moolenbroek 	}
521*7b09d042SDavid van Moolenbroek done:
522*7b09d042SDavid van Moolenbroek 	free(buf);
523*7b09d042SDavid van Moolenbroek }
524*7b09d042SDavid van Moolenbroek 
525*7b09d042SDavid van Moolenbroek static void
shm_sysctl(void)526*7b09d042SDavid van Moolenbroek shm_sysctl(void)
527*7b09d042SDavid van Moolenbroek {
528*7b09d042SDavid van Moolenbroek 	struct shm_sysctl_info *shmsi;
529*7b09d042SDavid van Moolenbroek 	void *buf;
530*7b09d042SDavid van Moolenbroek 	int mib[4];
531*7b09d042SDavid van Moolenbroek 	size_t len;
532*7b09d042SDavid van Moolenbroek 	uint32_t i;
533*7b09d042SDavid van Moolenbroek 	long valid;
534*7b09d042SDavid van Moolenbroek 
535*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
536*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
537*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_SHM;
538*7b09d042SDavid van Moolenbroek 	len = sizeof(valid);
539*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 3, &valid, &len, NULL, 0) < 0) {
540*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_SHM)");
541*7b09d042SDavid van Moolenbroek 		return;
542*7b09d042SDavid van Moolenbroek 	}
543*7b09d042SDavid van Moolenbroek 	if (!valid) {
544*7b09d042SDavid van Moolenbroek 		unconfshm();
545*7b09d042SDavid van Moolenbroek 		return;
546*7b09d042SDavid van Moolenbroek 	}
547*7b09d042SDavid van Moolenbroek 
548*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
549*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
550*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_INFO;
551*7b09d042SDavid van Moolenbroek 	mib[3] = KERN_SYSVIPC_SHM_INFO;
552*7b09d042SDavid van Moolenbroek 
553*7b09d042SDavid van Moolenbroek 	if (!(display & SHMINFO)) {
554*7b09d042SDavid van Moolenbroek 		/* totals only */
555*7b09d042SDavid van Moolenbroek 		len = sizeof(struct shminfo);
556*7b09d042SDavid van Moolenbroek 	} else {
557*7b09d042SDavid van Moolenbroek 		if (sysctl(mib, 4, NULL, &len, NULL, 0) < 0) {
558*7b09d042SDavid van Moolenbroek 			warn("sysctl(KERN_SYSVIPC_SHM_INFO)");
559*7b09d042SDavid van Moolenbroek 			return;
560*7b09d042SDavid van Moolenbroek 		}
561*7b09d042SDavid van Moolenbroek 	}
562*7b09d042SDavid van Moolenbroek 
563*7b09d042SDavid van Moolenbroek 	if ((buf = malloc(len)) == NULL)
564*7b09d042SDavid van Moolenbroek 		err(1, "malloc");
565*7b09d042SDavid van Moolenbroek 	shmsi = (struct shm_sysctl_info *)buf;
566*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 4, shmsi, &len, NULL, 0) < 0) {
567*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_SHM_INFO)");
568*7b09d042SDavid van Moolenbroek 		goto done;
569*7b09d042SDavid van Moolenbroek 	}
570*7b09d042SDavid van Moolenbroek 
571*7b09d042SDavid van Moolenbroek 	if (display & SHMTOTAL)
572*7b09d042SDavid van Moolenbroek 		show_shmtotal(&shmsi->shminfo);
573*7b09d042SDavid van Moolenbroek 
574*7b09d042SDavid van Moolenbroek 	if (display & SHMINFO) {
575*7b09d042SDavid van Moolenbroek 		show_shminfo_hdr();
576*7b09d042SDavid van Moolenbroek 		for (i = 0; i < shmsi->shminfo.shmmni; i++) {
577*7b09d042SDavid van Moolenbroek 			struct shmid_ds_sysctl *shmptr = &shmsi->shmids[i];
578*7b09d042SDavid van Moolenbroek 			if (shmptr->shm_perm.mode & 0x0800)
579*7b09d042SDavid van Moolenbroek 				show_shminfo(shmptr->shm_atime,
580*7b09d042SDavid van Moolenbroek 				    shmptr->shm_dtime,
581*7b09d042SDavid van Moolenbroek 				    shmptr->shm_ctime,
582*7b09d042SDavid van Moolenbroek 				    IXSEQ_TO_IPCID(i, shmptr->shm_perm),
583*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm._key,
584*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm.mode,
585*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm.uid,
586*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm.gid,
587*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm.cuid,
588*7b09d042SDavid van Moolenbroek 				    shmptr->shm_perm.cgid,
589*7b09d042SDavid van Moolenbroek 				    shmptr->shm_nattch,
590*7b09d042SDavid van Moolenbroek 				    shmptr->shm_segsz,
591*7b09d042SDavid van Moolenbroek 				    shmptr->shm_cpid,
592*7b09d042SDavid van Moolenbroek 				    shmptr->shm_lpid);
593*7b09d042SDavid van Moolenbroek 		}
594*7b09d042SDavid van Moolenbroek 		(void)printf("\n");
595*7b09d042SDavid van Moolenbroek 	}
596*7b09d042SDavid van Moolenbroek done:
597*7b09d042SDavid van Moolenbroek 	free(buf);
598*7b09d042SDavid van Moolenbroek }
599*7b09d042SDavid van Moolenbroek 
600*7b09d042SDavid van Moolenbroek static void
sem_sysctl(void)601*7b09d042SDavid van Moolenbroek sem_sysctl(void)
602*7b09d042SDavid van Moolenbroek {
603*7b09d042SDavid van Moolenbroek 	struct sem_sysctl_info *semsi;
604*7b09d042SDavid van Moolenbroek 	void *buf;
605*7b09d042SDavid van Moolenbroek 	int mib[4];
606*7b09d042SDavid van Moolenbroek 	size_t len;
607*7b09d042SDavid van Moolenbroek 	int i, valid;
608*7b09d042SDavid van Moolenbroek 
609*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
610*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
611*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_SEM;
612*7b09d042SDavid van Moolenbroek 	len = sizeof(valid);
613*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 3, &valid, &len, NULL, 0) < 0) {
614*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_SEM)");
615*7b09d042SDavid van Moolenbroek 		return;
616*7b09d042SDavid van Moolenbroek 	}
617*7b09d042SDavid van Moolenbroek 	if (!valid) {
618*7b09d042SDavid van Moolenbroek 		unconfsem();
619*7b09d042SDavid van Moolenbroek 		return;
620*7b09d042SDavid van Moolenbroek 	}
621*7b09d042SDavid van Moolenbroek 
622*7b09d042SDavid van Moolenbroek 	mib[0] = CTL_KERN;
623*7b09d042SDavid van Moolenbroek 	mib[1] = KERN_SYSVIPC;
624*7b09d042SDavid van Moolenbroek 	mib[2] = KERN_SYSVIPC_INFO;
625*7b09d042SDavid van Moolenbroek 	mib[3] = KERN_SYSVIPC_SEM_INFO;
626*7b09d042SDavid van Moolenbroek 
627*7b09d042SDavid van Moolenbroek 	if (!(display & SEMINFO)) {
628*7b09d042SDavid van Moolenbroek 		/* totals only */
629*7b09d042SDavid van Moolenbroek 		len = sizeof(struct seminfo);
630*7b09d042SDavid van Moolenbroek 	} else {
631*7b09d042SDavid van Moolenbroek 		if (sysctl(mib, 4, NULL, &len, NULL, 0) < 0) {
632*7b09d042SDavid van Moolenbroek 			warn("sysctl(KERN_SYSVIPC_SEM_INFO)");
633*7b09d042SDavid van Moolenbroek 			return;
634*7b09d042SDavid van Moolenbroek 		}
635*7b09d042SDavid van Moolenbroek 	}
636*7b09d042SDavid van Moolenbroek 
637*7b09d042SDavid van Moolenbroek 	if ((buf = malloc(len)) == NULL)
638*7b09d042SDavid van Moolenbroek 		err(1, "malloc");
639*7b09d042SDavid van Moolenbroek 	semsi = (struct sem_sysctl_info *)buf;
640*7b09d042SDavid van Moolenbroek 	if (sysctl(mib, 4, semsi, &len, NULL, 0) < 0) {
641*7b09d042SDavid van Moolenbroek 		warn("sysctl(KERN_SYSVIPC_SEM_INFO)");
642*7b09d042SDavid van Moolenbroek 		goto done;
643*7b09d042SDavid van Moolenbroek 	}
644*7b09d042SDavid van Moolenbroek 
645*7b09d042SDavid van Moolenbroek 	if (display & SEMTOTAL)
646*7b09d042SDavid van Moolenbroek 		show_semtotal(&semsi->seminfo);
647*7b09d042SDavid van Moolenbroek 
648*7b09d042SDavid van Moolenbroek 	if (display & SEMINFO) {
649*7b09d042SDavid van Moolenbroek 		show_seminfo_hdr();
650*7b09d042SDavid van Moolenbroek 		for (i = 0; i < semsi->seminfo.semmni; i++) {
651*7b09d042SDavid van Moolenbroek 			struct semid_ds_sysctl *semaptr = &semsi->semids[i];
652*7b09d042SDavid van Moolenbroek 			if ((semaptr->sem_perm.mode & SEM_ALLOC) != 0)
653*7b09d042SDavid van Moolenbroek 				show_seminfo(semaptr->sem_otime,
654*7b09d042SDavid van Moolenbroek 				    semaptr->sem_ctime,
655*7b09d042SDavid van Moolenbroek 				    IXSEQ_TO_IPCID(i, semaptr->sem_perm),
656*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm._key,
657*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm.mode,
658*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm.uid,
659*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm.gid,
660*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm.cuid,
661*7b09d042SDavid van Moolenbroek 				    semaptr->sem_perm.cgid,
662*7b09d042SDavid van Moolenbroek 				    semaptr->sem_nsems);
663*7b09d042SDavid van Moolenbroek 		}
664*7b09d042SDavid van Moolenbroek 		(void)printf("\n");
665*7b09d042SDavid van Moolenbroek 	}
666*7b09d042SDavid van Moolenbroek done:
667*7b09d042SDavid van Moolenbroek 	free(buf);
668*7b09d042SDavid van Moolenbroek }
669*7b09d042SDavid van Moolenbroek 
670*7b09d042SDavid van Moolenbroek static void
usage(void)671*7b09d042SDavid van Moolenbroek usage(void)
672*7b09d042SDavid van Moolenbroek {
673*7b09d042SDavid van Moolenbroek 
674*7b09d042SDavid van Moolenbroek 	(void)fprintf(stderr,
675*7b09d042SDavid van Moolenbroek 	    "Usage: %s [-abcmopqstMQST]\n",
676*7b09d042SDavid van Moolenbroek 	    getprogname());
677*7b09d042SDavid van Moolenbroek 	exit(1);
678*7b09d042SDavid van Moolenbroek }
679