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