[BACK]Return to ipcs.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ipcs

Annotation of src/usr.bin/ipcs/ipcs.c, Revision 1.16

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