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