12731Sdfr/* 22738Sdfr * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com> 32738Sdfr * All rights reserved. 42738Sdfr * 52738Sdfr * Redistribution and use in source and binary forms, with or without 62738Sdfr * modification, are permitted provided that the following conditions 72738Sdfr * are met: 82738Sdfr * 1. Redistributions of source code must retain the above copyright 92738Sdfr * notice, this list of conditions and the following disclaimer. 102738Sdfr * 2. Redistributions in binary form must reproduce the above copyright 112738Sdfr * notice, this list of conditions and the following disclaimer in the 122738Sdfr * documentation and/or other materials provided with the distribution. 132738Sdfr * 3. The name of the author may not be used to endorse or promote products 142738Sdfr * derived from this software without specific prior written permission. 152738Sdfr * 162738Sdfr * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 172738Sdfr * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 182738Sdfr * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 192738Sdfr * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 202738Sdfr * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 212738Sdfr * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 222738Sdfr * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 232738Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 242738Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 252738Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262731Sdfr */ 272731Sdfr 2899112Sobrien#include <sys/cdefs.h> 2999112Sobrien__FBSDID("$FreeBSD$"); 3027421Scharnier 31174750Sedwin#include <sys/param.h> 32174750Sedwin#include <sys/proc.h> 33174750Sedwin#define _KERNEL 34174750Sedwin#include <sys/sem.h> 35174750Sedwin#include <sys/shm.h> 36174750Sedwin#include <sys/msg.h> 37174750Sedwin#undef _KERNEL 38174750Sedwin 3927421Scharnier#include <err.h> 4027421Scharnier#include <fcntl.h> 4190878Simp#include <grp.h> 4227421Scharnier#include <kvm.h> 43174750Sedwin#include <limits.h> 4490878Simp#include <pwd.h> 452731Sdfr#include <stdio.h> 462731Sdfr#include <stdlib.h> 4778718Sdd#include <string.h> 482731Sdfr#include <unistd.h> 492731Sdfr 50174891Sedwin#include "ipc.h" 5177551Sdd 5293434Sdwmalonechar *fmt_perm(u_short); 5393434Sdwmalonevoid cvt_time(time_t, char *); 5492920Simpvoid usage(void); 55127348Sbmilekicuid_t user2uid(char *username); 56174891Sedwin 57174750Sedwinvoid print_kmsqtotal(struct msginfo msginfo); 58174750Sedwinvoid print_kmsqheader(int option); 59174750Sedwinvoid print_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr); 60174750Sedwinvoid print_kshmtotal(struct shminfo shminfo); 61174750Sedwinvoid print_kshmheader(int option); 62174750Sedwinvoid print_kshmptr(int i, int option, struct shmid_kernel *kshmptr); 63174750Sedwinvoid print_ksemtotal(struct seminfo seminfo); 64174750Sedwinvoid print_ksemheader(int option); 65174750Sedwinvoid print_ksemptr(int i, int option, struct semid_kernel *ksemaptr); 662731Sdfr 672738Sdfrchar * 68141610Sstefanffmt_perm(u_short mode) 692731Sdfr{ 702738Sdfr static char buffer[100]; 712731Sdfr 722738Sdfr buffer[0] = '-'; 732738Sdfr buffer[1] = '-'; 742738Sdfr buffer[2] = ((mode & 0400) ? 'r' : '-'); 752738Sdfr buffer[3] = ((mode & 0200) ? 'w' : '-'); 762738Sdfr buffer[4] = ((mode & 0100) ? 'a' : '-'); 772738Sdfr buffer[5] = ((mode & 0040) ? 'r' : '-'); 782738Sdfr buffer[6] = ((mode & 0020) ? 'w' : '-'); 792738Sdfr buffer[7] = ((mode & 0010) ? 'a' : '-'); 802738Sdfr buffer[8] = ((mode & 0004) ? 'r' : '-'); 812738Sdfr buffer[9] = ((mode & 0002) ? 'w' : '-'); 822738Sdfr buffer[10] = ((mode & 0001) ? 'a' : '-'); 832738Sdfr buffer[11] = '\0'; 842738Sdfr return (&buffer[0]); 852731Sdfr} 862731Sdfr 872731Sdfrvoid 88141610Sstefanfcvt_time(time_t t, char *buf) 892731Sdfr{ 902738Sdfr struct tm *tm; 912731Sdfr 922738Sdfr if (t == 0) { 932738Sdfr strcpy(buf, "no-entry"); 942738Sdfr } else { 952738Sdfr tm = localtime(&t); 962738Sdfr sprintf(buf, "%2d:%02d:%02d", 972738Sdfr tm->tm_hour, tm->tm_min, tm->tm_sec); 982731Sdfr } 992731Sdfr} 1002731Sdfr 1012738Sdfr#define BIGGEST 1 1022738Sdfr#define CREATOR 2 1032738Sdfr#define OUTSTANDING 4 1042738Sdfr#define PID 8 1052738Sdfr#define TIME 16 1062731Sdfr 1072738Sdfrint 108141610Sstefanfmain(int argc, char *argv[]) 1092731Sdfr{ 1102738Sdfr int display = SHMINFO | MSGINFO | SEMINFO; 1112738Sdfr int option = 0; 112127348Sbmilekic char *core = NULL, *user = NULL, *namelist = NULL; 11377551Sdd char kvmoferr[_POSIX2_LINE_MAX]; /* Error buf for kvm_openfiles. */ 1142738Sdfr int i; 115174750Sedwin uid_t uid = 0; 1162731Sdfr 117127348Sbmilekic while ((i = getopt(argc, argv, "MmQqSsabC:cN:optTu:y")) != -1) 1182738Sdfr switch (i) { 1192738Sdfr case 'a': 1202738Sdfr option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME; 1212738Sdfr break; 1222738Sdfr case 'b': 1232738Sdfr option |= BIGGEST; 1242738Sdfr break; 1252738Sdfr case 'C': 1262738Sdfr core = optarg; 1272738Sdfr break; 1282738Sdfr case 'c': 1292738Sdfr option |= CREATOR; 1302738Sdfr break; 131174750Sedwin case 'M': 132174750Sedwin display = SHMTOTAL; 133174750Sedwin break; 134174750Sedwin case 'm': 135174750Sedwin display = SHMINFO; 136174750Sedwin break; 1372738Sdfr case 'N': 1382738Sdfr namelist = optarg; 1392738Sdfr break; 1402738Sdfr case 'o': 1412738Sdfr option |= OUTSTANDING; 1422738Sdfr break; 1432738Sdfr case 'p': 1442738Sdfr option |= PID; 1452738Sdfr break; 146174750Sedwin case 'Q': 147174750Sedwin display = MSGTOTAL; 148174750Sedwin break; 149174750Sedwin case 'q': 150174750Sedwin display = MSGINFO; 151174750Sedwin break; 152174750Sedwin case 'S': 153174750Sedwin display = SEMTOTAL; 154174750Sedwin break; 155174750Sedwin case 's': 156174750Sedwin display = SEMINFO; 157174750Sedwin break; 158174891Sedwin case 'T': 159174891Sedwin display = SHMTOTAL | MSGTOTAL | SEMTOTAL; 160174891Sedwin break; 1612738Sdfr case 't': 1622738Sdfr option |= TIME; 1632738Sdfr break; 164127348Sbmilekic case 'u': 165127348Sbmilekic user = optarg; 166127348Sbmilekic uid = user2uid(user); 167127348Sbmilekic break; 168174750Sedwin case 'y': 169174750Sedwin use_sysctl = 0; 170174750Sedwin break; 1712738Sdfr default: 1722738Sdfr usage(); 1732738Sdfr } 17415990Spst 17515990Spst /* 17677551Sdd * If paths to the exec file or core file were specified, we 17777551Sdd * aren't operating on the running kernel, so we can't use 17877551Sdd * sysctl. 17915990Spst */ 18015990Spst if (namelist != NULL || core != NULL) 18177551Sdd use_sysctl = 0; 18215990Spst 18377551Sdd if (!use_sysctl) { 18477551Sdd kd = kvm_openfiles(namelist, core, NULL, O_RDONLY, kvmoferr); 18577551Sdd if (kd == NULL) 18677551Sdd errx(1, "kvm_openfiles: %s", kvmoferr); 18777551Sdd switch (kvm_nlist(kd, symbols)) { 18877551Sdd case 0: 18977551Sdd break; 19077551Sdd case -1: 19177551Sdd errx(1, "unable to read kernel symbol table"); 19277551Sdd default: 19377551Sdd break; 19477551Sdd } 1952731Sdfr } 1962731Sdfr 19777551Sdd kget(X_MSGINFO, &msginfo, sizeof(msginfo)); 19877551Sdd if ((display & (MSGINFO | MSGTOTAL))) { 199174750Sedwin if (display & MSGTOTAL) 200174750Sedwin print_kmsqtotal(msginfo); 201174750Sedwin 2022738Sdfr if (display & MSGINFO) { 203137618Srwatson struct msqid_kernel *kxmsqids; 204137618Srwatson size_t kxmsqids_len; 2052731Sdfr 206174750Sedwin kxmsqids_len = 207174750Sedwin sizeof(struct msqid_kernel) * msginfo.msgmni; 208137618Srwatson kxmsqids = malloc(kxmsqids_len); 209137618Srwatson kget(X_MSQIDS, kxmsqids, kxmsqids_len); 21077551Sdd 211174750Sedwin print_kmsqheader(option); 212174750Sedwin 2132738Sdfr for (i = 0; i < msginfo.msgmni; i += 1) { 214137618Srwatson if (kxmsqids[i].u.msg_qbytes != 0) { 215174750Sedwin if (user && 216174750Sedwin uid != kxmsqids[i].u.msg_perm.uid) 217174750Sedwin continue; 2182731Sdfr 219174750Sedwin print_kmsqptr(i, option, &kxmsqids[i]); 220174750Sedwin } 2212731Sdfr 222174750Sedwin } 2232731Sdfr 2242738Sdfr printf("\n"); 2252738Sdfr } 2262738Sdfr } else 2272738Sdfr if (display & (MSGINFO | MSGTOTAL)) { 2282738Sdfr fprintf(stderr, 229174750Sedwin "SVID messages facility " 230174750Sedwin "not configured in the system\n"); 2312738Sdfr } 23277551Sdd 23377551Sdd kget(X_SHMINFO, &shminfo, sizeof(shminfo)); 23477551Sdd if ((display & (SHMINFO | SHMTOTAL))) { 235174750Sedwin 236174750Sedwin if (display & SHMTOTAL) 237174750Sedwin print_kshmtotal(shminfo); 238174750Sedwin 2392738Sdfr if (display & SHMINFO) { 240137618Srwatson struct shmid_kernel *kxshmids; 241137618Srwatson size_t kxshmids_len; 2422731Sdfr 243174750Sedwin kxshmids_len = 244174750Sedwin sizeof(struct shmid_kernel) * shminfo.shmmni; 245137618Srwatson kxshmids = malloc(kxshmids_len); 246137618Srwatson kget(X_SHMSEGS, kxshmids, kxshmids_len); 2472731Sdfr 248174750Sedwin print_kshmheader(option); 249174750Sedwin 2502738Sdfr for (i = 0; i < shminfo.shmmni; i += 1) { 251137618Srwatson if (kxshmids[i].u.shm_perm.mode & 0x0800) { 252174750Sedwin if (user && 253174750Sedwin uid != kxshmids[i].u.shm_perm.uid) 254174750Sedwin continue; 2552731Sdfr 256174750Sedwin print_kshmptr(i, option, &kxshmids[i]); 2572738Sdfr } 2582738Sdfr } 2592738Sdfr printf("\n"); 2602738Sdfr } 2612738Sdfr } else 2622738Sdfr if (display & (SHMINFO | SHMTOTAL)) { 2632738Sdfr fprintf(stderr, 264174750Sedwin "SVID shared memory facility " 265174750Sedwin "not configured in the system\n"); 2662738Sdfr } 26777551Sdd 26877551Sdd kget(X_SEMINFO, &seminfo, sizeof(seminfo)); 26977551Sdd if ((display & (SEMINFO | SEMTOTAL))) { 270137618Srwatson struct semid_kernel *kxsema; 271137618Srwatson size_t kxsema_len; 2722731Sdfr 273174750Sedwin if (display & SEMTOTAL) 274174750Sedwin print_ksemtotal(seminfo); 275174750Sedwin 2762738Sdfr if (display & SEMINFO) { 277174750Sedwin kxsema_len = 278174750Sedwin sizeof(struct semid_kernel) * seminfo.semmni; 279137618Srwatson kxsema = malloc(kxsema_len); 280137618Srwatson kget(X_SEMA, kxsema, kxsema_len); 2812731Sdfr 282174750Sedwin print_ksemheader(option); 283174750Sedwin 2842738Sdfr for (i = 0; i < seminfo.semmni; i += 1) { 285174891Sedwin if ((kxsema[i].u.sem_perm.mode & SEM_ALLOC) 286174891Sedwin != 0) { 287174750Sedwin if (user && 288174750Sedwin uid != kxsema[i].u.sem_perm.uid) 289174750Sedwin continue; 2902731Sdfr 291174750Sedwin print_ksemptr(i, option, &kxsema[i]); 2922731Sdfr 2932738Sdfr } 2942738Sdfr } 2952731Sdfr 2962738Sdfr printf("\n"); 2972738Sdfr } 2982738Sdfr } else 2992738Sdfr if (display & (SEMINFO | SEMTOTAL)) { 300174750Sedwin fprintf(stderr, 301174750Sedwin "SVID semaphores facility " 302174750Sedwin "not configured in the system\n"); 3032738Sdfr } 304174750Sedwin 30577551Sdd if (!use_sysctl) 30677551Sdd kvm_close(kd); 3072731Sdfr 3082738Sdfr exit(0); 3092738Sdfr} 3102731Sdfr 3112738Sdfrvoid 312174750Sedwinprint_kmsqtotal(struct msginfo msginfo) 313174750Sedwin{ 314174750Sedwin 315174750Sedwin printf("msginfo:\n"); 316174750Sedwin printf("\tmsgmax: %12d\t(max characters in a message)\n", 317174750Sedwin msginfo.msgmax); 318174750Sedwin printf("\tmsgmni: %12d\t(# of message queues)\n", 319174750Sedwin msginfo.msgmni); 320174750Sedwin printf("\tmsgmnb: %12d\t(max characters in a message queue)\n", 321174750Sedwin msginfo.msgmnb); 322174750Sedwin printf("\tmsgtql: %12d\t(max # of messages in system)\n", 323174750Sedwin msginfo.msgtql); 324174750Sedwin printf("\tmsgssz: %12d\t(size of a message segment)\n", 325174750Sedwin msginfo.msgssz); 326174750Sedwin printf("\tmsgseg: %12d\t(# of message segments in system)\n\n", 327174750Sedwin msginfo.msgseg); 328174750Sedwin} 329174750Sedwin 330174891Sedwinvoid print_kmsqheader(int option) 331174891Sedwin{ 332174750Sedwin 333174750Sedwin printf("Message Queues:\n"); 334174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 335174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 336174750Sedwin if (option & CREATOR) 337174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 338174750Sedwin if (option & OUTSTANDING) 339174750Sedwin printf(" %20s %20s", "CBYTES", "QNUM"); 340174750Sedwin if (option & BIGGEST) 341174750Sedwin printf(" %20s", "QBYTES"); 342174750Sedwin if (option & PID) 343174750Sedwin printf(" %12s %12s", "LSPID", "LRPID"); 344174750Sedwin if (option & TIME) 345174750Sedwin printf(" %-8s %-8s %-8s", "STIME", "RTIME", "CTIME"); 346174750Sedwin printf("\n"); 347174750Sedwin} 348174750Sedwin 349174750Sedwinvoid 350174750Sedwinprint_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr) 351174750Sedwin{ 352174750Sedwin char stime_buf[100], rtime_buf[100], ctime_buf[100]; 353174750Sedwin 354174750Sedwin cvt_time(kmsqptr->u.msg_stime, stime_buf); 355174750Sedwin cvt_time(kmsqptr->u.msg_rtime, rtime_buf); 356174750Sedwin cvt_time(kmsqptr->u.msg_ctime, ctime_buf); 357174750Sedwin 358174891Sedwin printf("q %12d %12d %s %-8s %-8s", 359174750Sedwin IXSEQ_TO_IPCID(i, kmsqptr->u.msg_perm), 360174750Sedwin (int)kmsqptr->u.msg_perm.key, 361174750Sedwin fmt_perm(kmsqptr->u.msg_perm.mode), 362174750Sedwin user_from_uid(kmsqptr->u.msg_perm.uid, 0), 363174750Sedwin group_from_gid(kmsqptr->u.msg_perm.gid, 0)); 364174750Sedwin 365174750Sedwin if (option & CREATOR) 366174891Sedwin printf(" %-8s %-8s", 367174750Sedwin user_from_uid(kmsqptr->u.msg_perm.cuid, 0), 368174750Sedwin group_from_gid(kmsqptr->u.msg_perm.cgid, 0)); 369174750Sedwin 370174750Sedwin if (option & OUTSTANDING) 371174750Sedwin printf(" %12lu %12lu", 372174750Sedwin kmsqptr->u.msg_cbytes, 373174750Sedwin kmsqptr->u.msg_qnum); 374174750Sedwin 375174750Sedwin if (option & BIGGEST) 376174750Sedwin printf(" %20lu", kmsqptr->u.msg_qbytes); 377174750Sedwin 378174750Sedwin if (option & PID) 379174750Sedwin printf(" %12d %12d", 380174750Sedwin kmsqptr->u.msg_lspid, 381174750Sedwin kmsqptr->u.msg_lrpid); 382174750Sedwin 383174750Sedwin if (option & TIME) 384174750Sedwin printf(" %s %s %s", 385174750Sedwin stime_buf, 386174750Sedwin rtime_buf, 387174750Sedwin ctime_buf); 388174750Sedwin 389174750Sedwin printf("\n"); 390174750Sedwin} 391174750Sedwin 392174750Sedwinvoid 393174750Sedwinprint_kshmtotal(struct shminfo shminfo) 394174750Sedwin{ 395174750Sedwin 396174750Sedwin printf("shminfo:\n"); 397186174Sru printf("\tshmmax: %12lu\t(max shared memory segment size)\n", 398174750Sedwin shminfo.shmmax); 399186174Sru printf("\tshmmin: %12lu\t(min shared memory segment size)\n", 400174750Sedwin shminfo.shmmin); 401186174Sru printf("\tshmmni: %12lu\t(max number of shared memory identifiers)\n", 402174750Sedwin shminfo.shmmni); 403186174Sru printf("\tshmseg: %12lu\t(max shared memory segments per process)\n", 404174750Sedwin shminfo.shmseg); 405186174Sru printf("\tshmall: %12lu\t(max amount of shared memory in pages)\n\n", 406174750Sedwin shminfo.shmall); 407174750Sedwin} 408174750Sedwin 409174750Sedwinvoid 410174750Sedwinprint_kshmheader(int option) 411174750Sedwin{ 412174750Sedwin 413174750Sedwin printf("Shared Memory:\n"); 414174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 415174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 416174750Sedwin if (option & CREATOR) 417174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 418174750Sedwin if (option & OUTSTANDING) 419174750Sedwin printf(" %12s", "NATTCH"); 420174750Sedwin if (option & BIGGEST) 421174750Sedwin printf(" %12s", "SEGSZ"); 422174750Sedwin if (option & PID) 423174750Sedwin printf(" %12s %12s", "CPID", "LPID"); 424174750Sedwin if (option & TIME) 425174750Sedwin printf(" %-8s %-8s %-8s", "ATIME", "DTIME", "CTIME"); 426174750Sedwin printf("\n"); 427174750Sedwin} 428174750Sedwin 429174750Sedwinvoid 430174750Sedwinprint_kshmptr(int i, int option, struct shmid_kernel *kshmptr) 431174750Sedwin{ 432174750Sedwin char atime_buf[100], dtime_buf[100], ctime_buf[100]; 433174750Sedwin 434174750Sedwin cvt_time(kshmptr->u.shm_atime, atime_buf); 435174750Sedwin cvt_time(kshmptr->u.shm_dtime, dtime_buf); 436174750Sedwin cvt_time(kshmptr->u.shm_ctime, ctime_buf); 437174750Sedwin 438174891Sedwin printf("m %12d %12d %s %-8s %-8s", 439174750Sedwin IXSEQ_TO_IPCID(i, kshmptr->u.shm_perm), 440174750Sedwin (int)kshmptr->u.shm_perm.key, 441174750Sedwin fmt_perm(kshmptr->u.shm_perm.mode), 442174750Sedwin user_from_uid(kshmptr->u.shm_perm.uid, 0), 443174750Sedwin group_from_gid(kshmptr->u.shm_perm.gid, 0)); 444174750Sedwin 445174750Sedwin if (option & CREATOR) 446174891Sedwin printf(" %-8s %-8s", 447174750Sedwin user_from_uid(kshmptr->u.shm_perm.cuid, 0), 448174750Sedwin group_from_gid(kshmptr->u.shm_perm.cgid, 0)); 449174750Sedwin 450174750Sedwin if (option & OUTSTANDING) 451174750Sedwin printf(" %12d", 452174750Sedwin kshmptr->u.shm_nattch); 453174750Sedwin 454174750Sedwin if (option & BIGGEST) 455189283Skib printf(" %12zu", 456194910Sjhb kshmptr->u.shm_segsz); 457174750Sedwin 458174750Sedwin if (option & PID) 459174750Sedwin printf(" %12d %12d", 460174750Sedwin kshmptr->u.shm_cpid, 461174750Sedwin kshmptr->u.shm_lpid); 462174750Sedwin 463174750Sedwin if (option & TIME) 464174750Sedwin printf(" %s %s %s", 465174750Sedwin atime_buf, 466174750Sedwin dtime_buf, 467174750Sedwin ctime_buf); 468174750Sedwin 469174750Sedwin printf("\n"); 470174750Sedwin} 471174750Sedwin 472174750Sedwinvoid 473174750Sedwinprint_ksemtotal(struct seminfo seminfo) 474174750Sedwin{ 475174750Sedwin 476174750Sedwin printf("seminfo:\n"); 477174750Sedwin printf("\tsemmni: %12d\t(# of semaphore identifiers)\n", 478174750Sedwin seminfo.semmni); 479174750Sedwin printf("\tsemmns: %12d\t(# of semaphores in system)\n", 480174750Sedwin seminfo.semmns); 481174750Sedwin printf("\tsemmnu: %12d\t(# of undo structures in system)\n", 482174750Sedwin seminfo.semmnu); 483174750Sedwin printf("\tsemmsl: %12d\t(max # of semaphores per id)\n", 484174750Sedwin seminfo.semmsl); 485174750Sedwin printf("\tsemopm: %12d\t(max # of operations per semop call)\n", 486174750Sedwin seminfo.semopm); 487174750Sedwin printf("\tsemume: %12d\t(max # of undo entries per process)\n", 488174750Sedwin seminfo.semume); 489174750Sedwin printf("\tsemusz: %12d\t(size in bytes of undo structure)\n", 490174750Sedwin seminfo.semusz); 491174750Sedwin printf("\tsemvmx: %12d\t(semaphore maximum value)\n", 492174750Sedwin seminfo.semvmx); 493174750Sedwin printf("\tsemaem: %12d\t(adjust on exit max value)\n\n", 494174750Sedwin seminfo.semaem); 495174750Sedwin} 496174750Sedwin 497174750Sedwinvoid 498174891Sedwinprint_ksemheader(int option) 499174891Sedwin{ 500174750Sedwin 501174750Sedwin printf("Semaphores:\n"); 502174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 503174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 504174750Sedwin if (option & CREATOR) 505174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 506174750Sedwin if (option & BIGGEST) 507174750Sedwin printf(" %12s", "NSEMS"); 508174750Sedwin if (option & TIME) 509174750Sedwin printf(" %-8s %-8s", "OTIME", "CTIME"); 510174750Sedwin printf("\n"); 511174750Sedwin} 512174750Sedwin 513174750Sedwinvoid 514174750Sedwinprint_ksemptr(int i, int option, struct semid_kernel *ksemaptr) 515174750Sedwin{ 516174750Sedwin char ctime_buf[100], otime_buf[100]; 517174750Sedwin 518174750Sedwin cvt_time(ksemaptr->u.sem_otime, otime_buf); 519174750Sedwin cvt_time(ksemaptr->u.sem_ctime, ctime_buf); 520174750Sedwin 521174891Sedwin printf("s %12d %12d %s %-8s %-8s", 522174750Sedwin IXSEQ_TO_IPCID(i, ksemaptr->u.sem_perm), 523174750Sedwin (int)ksemaptr->u.sem_perm.key, 524174750Sedwin fmt_perm(ksemaptr->u.sem_perm.mode), 525174750Sedwin user_from_uid(ksemaptr->u.sem_perm.uid, 0), 526174750Sedwin group_from_gid(ksemaptr->u.sem_perm.gid, 0)); 527174750Sedwin 528174750Sedwin if (option & CREATOR) 529174891Sedwin printf(" %-8s %-8s", 530174750Sedwin user_from_uid(ksemaptr->u.sem_perm.cuid, 0), 531174750Sedwin group_from_gid(ksemaptr->u.sem_perm.cgid, 0)); 532174750Sedwin 533174750Sedwin if (option & BIGGEST) 534174750Sedwin printf(" %12d", 535174750Sedwin ksemaptr->u.sem_nsems); 536174750Sedwin 537174750Sedwin if (option & TIME) 538174750Sedwin printf(" %s %s", 539174750Sedwin otime_buf, 540174750Sedwin ctime_buf); 541174750Sedwin 542174750Sedwin printf("\n"); 543174750Sedwin} 544174750Sedwin 545127348Sbmilekicuid_t 546127348Sbmilekicuser2uid(char *username) 547127348Sbmilekic{ 548127348Sbmilekic struct passwd *pwd; 549127348Sbmilekic uid_t uid; 550127348Sbmilekic char *r; 551127348Sbmilekic 552127348Sbmilekic uid = strtoul(username, &r, 0); 553127348Sbmilekic if (!*r && r != username) 554127348Sbmilekic return (uid); 555127348Sbmilekic if ((pwd = getpwnam(username)) == NULL) 556127348Sbmilekic errx(1, "getpwnam failed: No such user"); 557127348Sbmilekic endpwent(); 558127348Sbmilekic return (pwd->pw_uid); 559127348Sbmilekic} 560127348Sbmilekic 56177551Sddvoid 562141610Sstefanfusage(void) 5632738Sdfr{ 5642731Sdfr 5652738Sdfr fprintf(stderr, 566174750Sedwin "usage: " 567174750Sedwin "ipcs [-abcmopqstyMQST] [-C corefile] [-N namelist] [-u user]\n"); 5682738Sdfr exit(1); 5692731Sdfr} 570