1330449Seadler/*- 2330449Seadler * SPDX-License-Identifier: BSD-3-Clause 3330449Seadler * 42738Sdfr * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com> 52738Sdfr * All rights reserved. 62738Sdfr * 72738Sdfr * Redistribution and use in source and binary forms, with or without 82738Sdfr * modification, are permitted provided that the following conditions 92738Sdfr * are met: 102738Sdfr * 1. Redistributions of source code must retain the above copyright 112738Sdfr * notice, this list of conditions and the following disclaimer. 122738Sdfr * 2. Redistributions in binary form must reproduce the above copyright 132738Sdfr * notice, this list of conditions and the following disclaimer in the 142738Sdfr * documentation and/or other materials provided with the distribution. 152738Sdfr * 3. The name of the author may not be used to endorse or promote products 162738Sdfr * derived from this software without specific prior written permission. 172738Sdfr * 182738Sdfr * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 192738Sdfr * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 202738Sdfr * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 212738Sdfr * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 222738Sdfr * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 232738Sdfr * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 242738Sdfr * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 252738Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 262738Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 272738Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282731Sdfr */ 292731Sdfr 3099112Sobrien#include <sys/cdefs.h> 3199112Sobrien__FBSDID("$FreeBSD: stable/11/usr.bin/ipcs/ipcs.c 347995 2019-05-20 16:31:45Z kib $"); 3227421Scharnier 33174750Sedwin#include <sys/param.h> 34174750Sedwin#include <sys/proc.h> 35347995Skib#define _WANT_SYSVMSG_INTERNALS 36347995Skib#include <sys/msg.h> 37347995Skib#define _WANT_SYSVSEM_INTERNALS 38174750Sedwin#include <sys/sem.h> 39347995Skib#define _WANT_SYSVSHM_INTERNALS 40174750Sedwin#include <sys/shm.h> 41174750Sedwin 4227421Scharnier#include <err.h> 4327421Scharnier#include <fcntl.h> 4490878Simp#include <grp.h> 4527421Scharnier#include <kvm.h> 46174750Sedwin#include <limits.h> 4790878Simp#include <pwd.h> 482731Sdfr#include <stdio.h> 492731Sdfr#include <stdlib.h> 5078718Sdd#include <string.h> 512731Sdfr#include <unistd.h> 522731Sdfr 53174891Sedwin#include "ipc.h" 5477551Sdd 5593434Sdwmalonechar *fmt_perm(u_short); 5693434Sdwmalonevoid cvt_time(time_t, char *); 5792920Simpvoid usage(void); 58127348Sbmilekicuid_t user2uid(char *username); 59174891Sedwin 60174750Sedwinvoid print_kmsqtotal(struct msginfo msginfo); 61174750Sedwinvoid print_kmsqheader(int option); 62174750Sedwinvoid print_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr); 63174750Sedwinvoid print_kshmtotal(struct shminfo shminfo); 64174750Sedwinvoid print_kshmheader(int option); 65174750Sedwinvoid print_kshmptr(int i, int option, struct shmid_kernel *kshmptr); 66174750Sedwinvoid print_ksemtotal(struct seminfo seminfo); 67174750Sedwinvoid print_ksemheader(int option); 68174750Sedwinvoid print_ksemptr(int i, int option, struct semid_kernel *ksemaptr); 692731Sdfr 702738Sdfrchar * 71141610Sstefanffmt_perm(u_short mode) 722731Sdfr{ 732738Sdfr static char buffer[100]; 742731Sdfr 752738Sdfr buffer[0] = '-'; 762738Sdfr buffer[1] = '-'; 772738Sdfr buffer[2] = ((mode & 0400) ? 'r' : '-'); 782738Sdfr buffer[3] = ((mode & 0200) ? 'w' : '-'); 792738Sdfr buffer[4] = ((mode & 0100) ? 'a' : '-'); 802738Sdfr buffer[5] = ((mode & 0040) ? 'r' : '-'); 812738Sdfr buffer[6] = ((mode & 0020) ? 'w' : '-'); 822738Sdfr buffer[7] = ((mode & 0010) ? 'a' : '-'); 832738Sdfr buffer[8] = ((mode & 0004) ? 'r' : '-'); 842738Sdfr buffer[9] = ((mode & 0002) ? 'w' : '-'); 852738Sdfr buffer[10] = ((mode & 0001) ? 'a' : '-'); 862738Sdfr buffer[11] = '\0'; 872738Sdfr return (&buffer[0]); 882731Sdfr} 892731Sdfr 902731Sdfrvoid 91141610Sstefanfcvt_time(time_t t, char *buf) 922731Sdfr{ 932738Sdfr struct tm *tm; 942731Sdfr 952738Sdfr if (t == 0) { 962738Sdfr strcpy(buf, "no-entry"); 972738Sdfr } else { 982738Sdfr tm = localtime(&t); 992738Sdfr sprintf(buf, "%2d:%02d:%02d", 1002738Sdfr tm->tm_hour, tm->tm_min, tm->tm_sec); 1012731Sdfr } 1022731Sdfr} 1032731Sdfr 1042738Sdfr#define BIGGEST 1 1052738Sdfr#define CREATOR 2 1062738Sdfr#define OUTSTANDING 4 1072738Sdfr#define PID 8 1082738Sdfr#define TIME 16 1092731Sdfr 1102738Sdfrint 111141610Sstefanfmain(int argc, char *argv[]) 1122731Sdfr{ 1132738Sdfr int display = SHMINFO | MSGINFO | SEMINFO; 1142738Sdfr int option = 0; 115127348Sbmilekic char *core = NULL, *user = NULL, *namelist = NULL; 11677551Sdd char kvmoferr[_POSIX2_LINE_MAX]; /* Error buf for kvm_openfiles. */ 1172738Sdfr int i; 118281501Seadler u_long shmidx; 119174750Sedwin uid_t uid = 0; 1202731Sdfr 121127348Sbmilekic while ((i = getopt(argc, argv, "MmQqSsabC:cN:optTu:y")) != -1) 1222738Sdfr switch (i) { 1232738Sdfr case 'a': 1242738Sdfr option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME; 1252738Sdfr break; 1262738Sdfr case 'b': 1272738Sdfr option |= BIGGEST; 1282738Sdfr break; 1292738Sdfr case 'C': 1302738Sdfr core = optarg; 1312738Sdfr break; 1322738Sdfr case 'c': 1332738Sdfr option |= CREATOR; 1342738Sdfr break; 135174750Sedwin case 'M': 136174750Sedwin display = SHMTOTAL; 137174750Sedwin break; 138174750Sedwin case 'm': 139174750Sedwin display = SHMINFO; 140174750Sedwin break; 1412738Sdfr case 'N': 1422738Sdfr namelist = optarg; 1432738Sdfr break; 1442738Sdfr case 'o': 1452738Sdfr option |= OUTSTANDING; 1462738Sdfr break; 1472738Sdfr case 'p': 1482738Sdfr option |= PID; 1492738Sdfr break; 150174750Sedwin case 'Q': 151174750Sedwin display = MSGTOTAL; 152174750Sedwin break; 153174750Sedwin case 'q': 154174750Sedwin display = MSGINFO; 155174750Sedwin break; 156174750Sedwin case 'S': 157174750Sedwin display = SEMTOTAL; 158174750Sedwin break; 159174750Sedwin case 's': 160174750Sedwin display = SEMINFO; 161174750Sedwin break; 162174891Sedwin case 'T': 163174891Sedwin display = SHMTOTAL | MSGTOTAL | SEMTOTAL; 164174891Sedwin break; 1652738Sdfr case 't': 1662738Sdfr option |= TIME; 1672738Sdfr break; 168127348Sbmilekic case 'u': 169127348Sbmilekic user = optarg; 170127348Sbmilekic uid = user2uid(user); 171127348Sbmilekic break; 172174750Sedwin case 'y': 173174750Sedwin use_sysctl = 0; 174174750Sedwin break; 1752738Sdfr default: 1762738Sdfr usage(); 1772738Sdfr } 17815990Spst 17915990Spst /* 18077551Sdd * If paths to the exec file or core file were specified, we 18177551Sdd * aren't operating on the running kernel, so we can't use 18277551Sdd * sysctl. 18315990Spst */ 18415990Spst if (namelist != NULL || core != NULL) 18577551Sdd use_sysctl = 0; 18615990Spst 18777551Sdd if (!use_sysctl) { 18877551Sdd kd = kvm_openfiles(namelist, core, NULL, O_RDONLY, kvmoferr); 18977551Sdd if (kd == NULL) 19077551Sdd errx(1, "kvm_openfiles: %s", kvmoferr); 19177551Sdd switch (kvm_nlist(kd, symbols)) { 19277551Sdd case 0: 19377551Sdd break; 19477551Sdd case -1: 19577551Sdd errx(1, "unable to read kernel symbol table"); 19677551Sdd default: 19777551Sdd break; 19877551Sdd } 1992731Sdfr } 2002731Sdfr 20177551Sdd kget(X_MSGINFO, &msginfo, sizeof(msginfo)); 202344044Savos if (display & (MSGINFO | MSGTOTAL)) { 203174750Sedwin if (display & MSGTOTAL) 204174750Sedwin print_kmsqtotal(msginfo); 205174750Sedwin 2062738Sdfr if (display & MSGINFO) { 207137618Srwatson struct msqid_kernel *kxmsqids; 208137618Srwatson size_t kxmsqids_len; 2092731Sdfr 210174750Sedwin kxmsqids_len = 211174750Sedwin sizeof(struct msqid_kernel) * msginfo.msgmni; 212137618Srwatson kxmsqids = malloc(kxmsqids_len); 213137618Srwatson kget(X_MSQIDS, kxmsqids, kxmsqids_len); 21477551Sdd 215174750Sedwin print_kmsqheader(option); 216174750Sedwin 2172738Sdfr for (i = 0; i < msginfo.msgmni; i += 1) { 218137618Srwatson if (kxmsqids[i].u.msg_qbytes != 0) { 219174750Sedwin if (user && 220174750Sedwin uid != kxmsqids[i].u.msg_perm.uid) 221174750Sedwin continue; 2222731Sdfr 223174750Sedwin print_kmsqptr(i, option, &kxmsqids[i]); 224174750Sedwin } 2252731Sdfr 226174750Sedwin } 2272731Sdfr 2282738Sdfr printf("\n"); 2292738Sdfr } 230344044Savos } 23177551Sdd 23277551Sdd kget(X_SHMINFO, &shminfo, sizeof(shminfo)); 233344044Savos if (display & (SHMINFO | SHMTOTAL)) { 234174750Sedwin 235174750Sedwin if (display & SHMTOTAL) 236174750Sedwin print_kshmtotal(shminfo); 237174750Sedwin 2382738Sdfr if (display & SHMINFO) { 239137618Srwatson struct shmid_kernel *kxshmids; 240137618Srwatson size_t kxshmids_len; 2412731Sdfr 242174750Sedwin kxshmids_len = 243174750Sedwin sizeof(struct shmid_kernel) * shminfo.shmmni; 244137618Srwatson kxshmids = malloc(kxshmids_len); 245137618Srwatson kget(X_SHMSEGS, kxshmids, kxshmids_len); 2462731Sdfr 247174750Sedwin print_kshmheader(option); 248174750Sedwin 249281501Seadler for (shmidx = 0; shmidx < shminfo.shmmni; shmidx += 1) { 250281501Seadler if (kxshmids[shmidx].u.shm_perm.mode & 0x0800) { 251174750Sedwin if (user && 252281501Seadler uid != kxshmids[shmidx].u.shm_perm.uid) 253174750Sedwin continue; 2542731Sdfr 255281501Seadler print_kshmptr(shmidx, option, &kxshmids[shmidx]); 2562738Sdfr } 2572738Sdfr } 2582738Sdfr printf("\n"); 2592738Sdfr } 260344044Savos } 26177551Sdd 26277551Sdd kget(X_SEMINFO, &seminfo, sizeof(seminfo)); 263344044Savos if (display & (SEMINFO | SEMTOTAL)) { 264137618Srwatson struct semid_kernel *kxsema; 265137618Srwatson size_t kxsema_len; 2662731Sdfr 267174750Sedwin if (display & SEMTOTAL) 268174750Sedwin print_ksemtotal(seminfo); 269174750Sedwin 2702738Sdfr if (display & SEMINFO) { 271174750Sedwin kxsema_len = 272174750Sedwin sizeof(struct semid_kernel) * seminfo.semmni; 273137618Srwatson kxsema = malloc(kxsema_len); 274137618Srwatson kget(X_SEMA, kxsema, kxsema_len); 2752731Sdfr 276174750Sedwin print_ksemheader(option); 277174750Sedwin 2782738Sdfr for (i = 0; i < seminfo.semmni; i += 1) { 279174891Sedwin if ((kxsema[i].u.sem_perm.mode & SEM_ALLOC) 280174891Sedwin != 0) { 281174750Sedwin if (user && 282174750Sedwin uid != kxsema[i].u.sem_perm.uid) 283174750Sedwin continue; 2842731Sdfr 285174750Sedwin print_ksemptr(i, option, &kxsema[i]); 2862731Sdfr 2872738Sdfr } 2882738Sdfr } 2892731Sdfr 2902738Sdfr printf("\n"); 2912738Sdfr } 292344044Savos } 293174750Sedwin 29477551Sdd if (!use_sysctl) 29577551Sdd kvm_close(kd); 2962731Sdfr 2972738Sdfr exit(0); 2982738Sdfr} 2992731Sdfr 3002738Sdfrvoid 301281501Seadlerprint_kmsqtotal(struct msginfo local_msginfo) 302174750Sedwin{ 303174750Sedwin 304174750Sedwin printf("msginfo:\n"); 305174750Sedwin printf("\tmsgmax: %12d\t(max characters in a message)\n", 306281501Seadler local_msginfo.msgmax); 307174750Sedwin printf("\tmsgmni: %12d\t(# of message queues)\n", 308281501Seadler local_msginfo.msgmni); 309174750Sedwin printf("\tmsgmnb: %12d\t(max characters in a message queue)\n", 310281501Seadler local_msginfo.msgmnb); 311174750Sedwin printf("\tmsgtql: %12d\t(max # of messages in system)\n", 312281501Seadler local_msginfo.msgtql); 313174750Sedwin printf("\tmsgssz: %12d\t(size of a message segment)\n", 314281501Seadler local_msginfo.msgssz); 315174750Sedwin printf("\tmsgseg: %12d\t(# of message segments in system)\n\n", 316281501Seadler local_msginfo.msgseg); 317174750Sedwin} 318174750Sedwin 319174891Sedwinvoid print_kmsqheader(int option) 320174891Sedwin{ 321174750Sedwin 322174750Sedwin printf("Message Queues:\n"); 323174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 324174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 325174750Sedwin if (option & CREATOR) 326174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 327174750Sedwin if (option & OUTSTANDING) 328174750Sedwin printf(" %20s %20s", "CBYTES", "QNUM"); 329174750Sedwin if (option & BIGGEST) 330174750Sedwin printf(" %20s", "QBYTES"); 331174750Sedwin if (option & PID) 332174750Sedwin printf(" %12s %12s", "LSPID", "LRPID"); 333174750Sedwin if (option & TIME) 334174750Sedwin printf(" %-8s %-8s %-8s", "STIME", "RTIME", "CTIME"); 335174750Sedwin printf("\n"); 336174750Sedwin} 337174750Sedwin 338174750Sedwinvoid 339174750Sedwinprint_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr) 340174750Sedwin{ 341174750Sedwin char stime_buf[100], rtime_buf[100], ctime_buf[100]; 342174750Sedwin 343174750Sedwin cvt_time(kmsqptr->u.msg_stime, stime_buf); 344174750Sedwin cvt_time(kmsqptr->u.msg_rtime, rtime_buf); 345174750Sedwin cvt_time(kmsqptr->u.msg_ctime, ctime_buf); 346174750Sedwin 347174891Sedwin printf("q %12d %12d %s %-8s %-8s", 348174750Sedwin IXSEQ_TO_IPCID(i, kmsqptr->u.msg_perm), 349174750Sedwin (int)kmsqptr->u.msg_perm.key, 350174750Sedwin fmt_perm(kmsqptr->u.msg_perm.mode), 351174750Sedwin user_from_uid(kmsqptr->u.msg_perm.uid, 0), 352174750Sedwin group_from_gid(kmsqptr->u.msg_perm.gid, 0)); 353174750Sedwin 354174750Sedwin if (option & CREATOR) 355174891Sedwin printf(" %-8s %-8s", 356174750Sedwin user_from_uid(kmsqptr->u.msg_perm.cuid, 0), 357174750Sedwin group_from_gid(kmsqptr->u.msg_perm.cgid, 0)); 358174750Sedwin 359174750Sedwin if (option & OUTSTANDING) 360174750Sedwin printf(" %12lu %12lu", 361174750Sedwin kmsqptr->u.msg_cbytes, 362174750Sedwin kmsqptr->u.msg_qnum); 363174750Sedwin 364174750Sedwin if (option & BIGGEST) 365174750Sedwin printf(" %20lu", kmsqptr->u.msg_qbytes); 366174750Sedwin 367174750Sedwin if (option & PID) 368174750Sedwin printf(" %12d %12d", 369174750Sedwin kmsqptr->u.msg_lspid, 370174750Sedwin kmsqptr->u.msg_lrpid); 371174750Sedwin 372174750Sedwin if (option & TIME) 373174750Sedwin printf(" %s %s %s", 374174750Sedwin stime_buf, 375174750Sedwin rtime_buf, 376174750Sedwin ctime_buf); 377174750Sedwin 378174750Sedwin printf("\n"); 379174750Sedwin} 380174750Sedwin 381174750Sedwinvoid 382281501Seadlerprint_kshmtotal(struct shminfo local_shminfo) 383174750Sedwin{ 384174750Sedwin 385174750Sedwin printf("shminfo:\n"); 386186174Sru printf("\tshmmax: %12lu\t(max shared memory segment size)\n", 387281501Seadler local_shminfo.shmmax); 388186174Sru printf("\tshmmin: %12lu\t(min shared memory segment size)\n", 389281501Seadler local_shminfo.shmmin); 390186174Sru printf("\tshmmni: %12lu\t(max number of shared memory identifiers)\n", 391281501Seadler local_shminfo.shmmni); 392186174Sru printf("\tshmseg: %12lu\t(max shared memory segments per process)\n", 393281501Seadler local_shminfo.shmseg); 394186174Sru printf("\tshmall: %12lu\t(max amount of shared memory in pages)\n\n", 395281501Seadler local_shminfo.shmall); 396174750Sedwin} 397174750Sedwin 398174750Sedwinvoid 399174750Sedwinprint_kshmheader(int option) 400174750Sedwin{ 401174750Sedwin 402174750Sedwin printf("Shared Memory:\n"); 403174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 404174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 405174750Sedwin if (option & CREATOR) 406174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 407174750Sedwin if (option & OUTSTANDING) 408174750Sedwin printf(" %12s", "NATTCH"); 409174750Sedwin if (option & BIGGEST) 410174750Sedwin printf(" %12s", "SEGSZ"); 411174750Sedwin if (option & PID) 412174750Sedwin printf(" %12s %12s", "CPID", "LPID"); 413174750Sedwin if (option & TIME) 414174750Sedwin printf(" %-8s %-8s %-8s", "ATIME", "DTIME", "CTIME"); 415174750Sedwin printf("\n"); 416174750Sedwin} 417174750Sedwin 418174750Sedwinvoid 419174750Sedwinprint_kshmptr(int i, int option, struct shmid_kernel *kshmptr) 420174750Sedwin{ 421174750Sedwin char atime_buf[100], dtime_buf[100], ctime_buf[100]; 422174750Sedwin 423174750Sedwin cvt_time(kshmptr->u.shm_atime, atime_buf); 424174750Sedwin cvt_time(kshmptr->u.shm_dtime, dtime_buf); 425174750Sedwin cvt_time(kshmptr->u.shm_ctime, ctime_buf); 426174750Sedwin 427174891Sedwin printf("m %12d %12d %s %-8s %-8s", 428174750Sedwin IXSEQ_TO_IPCID(i, kshmptr->u.shm_perm), 429174750Sedwin (int)kshmptr->u.shm_perm.key, 430174750Sedwin fmt_perm(kshmptr->u.shm_perm.mode), 431174750Sedwin user_from_uid(kshmptr->u.shm_perm.uid, 0), 432174750Sedwin group_from_gid(kshmptr->u.shm_perm.gid, 0)); 433174750Sedwin 434174750Sedwin if (option & CREATOR) 435174891Sedwin printf(" %-8s %-8s", 436174750Sedwin user_from_uid(kshmptr->u.shm_perm.cuid, 0), 437174750Sedwin group_from_gid(kshmptr->u.shm_perm.cgid, 0)); 438174750Sedwin 439174750Sedwin if (option & OUTSTANDING) 440174750Sedwin printf(" %12d", 441174750Sedwin kshmptr->u.shm_nattch); 442174750Sedwin 443174750Sedwin if (option & BIGGEST) 444189283Skib printf(" %12zu", 445194910Sjhb kshmptr->u.shm_segsz); 446174750Sedwin 447174750Sedwin if (option & PID) 448174750Sedwin printf(" %12d %12d", 449174750Sedwin kshmptr->u.shm_cpid, 450174750Sedwin kshmptr->u.shm_lpid); 451174750Sedwin 452174750Sedwin if (option & TIME) 453174750Sedwin printf(" %s %s %s", 454174750Sedwin atime_buf, 455174750Sedwin dtime_buf, 456174750Sedwin ctime_buf); 457174750Sedwin 458174750Sedwin printf("\n"); 459174750Sedwin} 460174750Sedwin 461174750Sedwinvoid 462281501Seadlerprint_ksemtotal(struct seminfo local_seminfo) 463174750Sedwin{ 464174750Sedwin 465174750Sedwin printf("seminfo:\n"); 466174750Sedwin printf("\tsemmni: %12d\t(# of semaphore identifiers)\n", 467281501Seadler local_seminfo.semmni); 468174750Sedwin printf("\tsemmns: %12d\t(# of semaphores in system)\n", 469281501Seadler local_seminfo.semmns); 470174750Sedwin printf("\tsemmnu: %12d\t(# of undo structures in system)\n", 471281501Seadler local_seminfo.semmnu); 472174750Sedwin printf("\tsemmsl: %12d\t(max # of semaphores per id)\n", 473281501Seadler local_seminfo.semmsl); 474174750Sedwin printf("\tsemopm: %12d\t(max # of operations per semop call)\n", 475281501Seadler local_seminfo.semopm); 476174750Sedwin printf("\tsemume: %12d\t(max # of undo entries per process)\n", 477281501Seadler local_seminfo.semume); 478174750Sedwin printf("\tsemusz: %12d\t(size in bytes of undo structure)\n", 479281501Seadler local_seminfo.semusz); 480174750Sedwin printf("\tsemvmx: %12d\t(semaphore maximum value)\n", 481281501Seadler local_seminfo.semvmx); 482174750Sedwin printf("\tsemaem: %12d\t(adjust on exit max value)\n\n", 483281501Seadler local_seminfo.semaem); 484174750Sedwin} 485174750Sedwin 486174750Sedwinvoid 487174891Sedwinprint_ksemheader(int option) 488174891Sedwin{ 489174750Sedwin 490174750Sedwin printf("Semaphores:\n"); 491174750Sedwin printf("T %12s %12s %-11s %-8s %-8s", 492174750Sedwin "ID", "KEY", "MODE", "OWNER", "GROUP"); 493174750Sedwin if (option & CREATOR) 494174750Sedwin printf(" %-8s %-8s", "CREATOR", "CGROUP"); 495174750Sedwin if (option & BIGGEST) 496174750Sedwin printf(" %12s", "NSEMS"); 497174750Sedwin if (option & TIME) 498174750Sedwin printf(" %-8s %-8s", "OTIME", "CTIME"); 499174750Sedwin printf("\n"); 500174750Sedwin} 501174750Sedwin 502174750Sedwinvoid 503174750Sedwinprint_ksemptr(int i, int option, struct semid_kernel *ksemaptr) 504174750Sedwin{ 505174750Sedwin char ctime_buf[100], otime_buf[100]; 506174750Sedwin 507174750Sedwin cvt_time(ksemaptr->u.sem_otime, otime_buf); 508174750Sedwin cvt_time(ksemaptr->u.sem_ctime, ctime_buf); 509174750Sedwin 510174891Sedwin printf("s %12d %12d %s %-8s %-8s", 511174750Sedwin IXSEQ_TO_IPCID(i, ksemaptr->u.sem_perm), 512174750Sedwin (int)ksemaptr->u.sem_perm.key, 513174750Sedwin fmt_perm(ksemaptr->u.sem_perm.mode), 514174750Sedwin user_from_uid(ksemaptr->u.sem_perm.uid, 0), 515174750Sedwin group_from_gid(ksemaptr->u.sem_perm.gid, 0)); 516174750Sedwin 517174750Sedwin if (option & CREATOR) 518174891Sedwin printf(" %-8s %-8s", 519174750Sedwin user_from_uid(ksemaptr->u.sem_perm.cuid, 0), 520174750Sedwin group_from_gid(ksemaptr->u.sem_perm.cgid, 0)); 521174750Sedwin 522174750Sedwin if (option & BIGGEST) 523174750Sedwin printf(" %12d", 524174750Sedwin ksemaptr->u.sem_nsems); 525174750Sedwin 526174750Sedwin if (option & TIME) 527174750Sedwin printf(" %s %s", 528174750Sedwin otime_buf, 529174750Sedwin ctime_buf); 530174750Sedwin 531174750Sedwin printf("\n"); 532174750Sedwin} 533174750Sedwin 534127348Sbmilekicuid_t 535127348Sbmilekicuser2uid(char *username) 536127348Sbmilekic{ 537127348Sbmilekic struct passwd *pwd; 538127348Sbmilekic uid_t uid; 539127348Sbmilekic char *r; 540127348Sbmilekic 541127348Sbmilekic uid = strtoul(username, &r, 0); 542127348Sbmilekic if (!*r && r != username) 543127348Sbmilekic return (uid); 544127348Sbmilekic if ((pwd = getpwnam(username)) == NULL) 545127348Sbmilekic errx(1, "getpwnam failed: No such user"); 546127348Sbmilekic endpwent(); 547127348Sbmilekic return (pwd->pw_uid); 548127348Sbmilekic} 549127348Sbmilekic 55077551Sddvoid 551141610Sstefanfusage(void) 5522738Sdfr{ 5532731Sdfr 5542738Sdfr fprintf(stderr, 555174750Sedwin "usage: " 556174750Sedwin "ipcs [-abcmopqstyMQST] [-C corefile] [-N namelist] [-u user]\n"); 5572738Sdfr exit(1); 5582731Sdfr} 559