[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.17

1.17    ! mpech       1: /*     $OpenBSD: ipcs.c,v 1.16 2001/09/28 01:44:37 millert Exp $       */
1.16      millert     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)
1.17    ! mpech     341:                printf(" %5ld %5ld", (long)lspid, (long)lrpid);
1.16      millert   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: }