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