diff -ru /usr/src/usr.bin/ipcs/Makefile usr.bin/ipcs/Makefile --- /usr/src/usr.bin/ipcs/Makefile Fri Feb 21 20:48:27 2003 +++ usr.bin/ipcs/Makefile Fri Feb 21 17:01:02 2003 @@ -1,9 +1,6 @@ -# $FreeBSD: src/usr.bin/ipcs/Makefile,v 1.5 1999/08/28 01:02:15 peter Exp $ +# $FreeBSD$ PROG= ipcs -BINGRP= kmem -BINMODE= 2555 -DPADD+= ${LIBKVM} -LDADD+= -lkvm +BINMODE= 555 .include diff -ru /usr/src/usr.bin/ipcs/ipcs.c usr.bin/ipcs/ipcs.c --- /usr/src/usr.bin/ipcs/ipcs.c Fri Feb 21 20:48:27 2003 +++ usr.bin/ipcs/ipcs.c Fri Feb 21 17:01:02 2003 @@ -27,12 +27,11 @@ #ifndef lint static const char rcsid[] = - "$FreeBSD: src/usr.bin/ipcs/ipcs.c,v 1.12.2.3 2001/07/30 10:16:41 dd Exp $"; + "$FreeBSD$"; #endif /* not lint */ #include #include -#include #include #include #include @@ -44,6 +43,7 @@ #include #include #include +#include #define _KERNEL #include #include @@ -59,26 +59,6 @@ void usage __P((void)); -static struct nlist symbols[] = { - {"_sema"}, -#define X_SEMA 0 - {"_seminfo"}, -#define X_SEMINFO 1 - {"_semu"}, -#define X_SEMU 2 - {"_msginfo"}, -#define X_MSGINFO 3 - {"_msqids"}, -#define X_MSQIDS 4 - {"_shminfo"}, -#define X_SHMINFO 5 - {"_shmsegs"}, -#define X_SHMSEGS 6 - {NULL} -}; - -static kvm_t *kd; - char * fmt_perm(mode) u_short mode; @@ -135,10 +115,10 @@ { int display = SHMINFO | MSGINFO | SEMINFO; int option = 0; - char *core = NULL, *namelist = NULL; + size_t size; int i; - while ((i = getopt(argc, argv, "MmQqSsabC:cN:optT")) != -1) + while ((i = getopt(argc, argv, "MmQqSsab:c:optT")) != -1) switch (i) { case 'M': display = SHMTOTAL; @@ -167,15 +147,9 @@ case 'b': option |= BIGGEST; break; - case 'C': - core = optarg; - break; case 'c': option |= CREATOR; break; - case 'N': - namelist = optarg; - break; case 'o': option |= OUTSTANDING; break; @@ -189,35 +163,14 @@ usage(); } - /* - * Discard setgid privileges if not the running kernel so that bad - * guys can't print interesting stuff from kernel memory. - */ - if (namelist != NULL || core != NULL) - setgid(getgid()); - - if ((kd = kvm_open(namelist, core, NULL, O_RDONLY, "ipcs")) == NULL) - exit(1); - - switch (kvm_nlist(kd, symbols)) { - case 0: - break; - case -1: - errx(1, "unable to read kernel symbol table"); - default: -#ifdef notdef /* they'll be told more civilly later */ - warnx("nlist failed"); - for (i = 0; symbols[i].n_name != NULL; i++) - if (symbols[i].n_value == 0) - warnx("symbol %s not found", - symbols[i].n_name); - break; -#endif - } - - if ((display & (MSGINFO | MSGTOTAL)) && - kvm_read(kd, symbols[X_MSGINFO].n_value, &msginfo, sizeof(msginfo))== sizeof(msginfo)) { - + if (display & (MSGINFO | MSGTOTAL)) { + size = sizeof(struct msginfo); + if (sysctlbyname("kern.ipc.msginfo", &msginfo, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID messages facility not configured " + "in the system\n"); + goto shm; + } if (display & MSGTOTAL) { printf("msginfo:\n"); printf("\tmsgmax: %6d\t(max characters in a message)\n", @@ -233,12 +186,21 @@ printf("\tmsgseg: %6d\t(# of message segments in system)\n\n", msginfo.msgseg); } - if (display & MSGINFO) { - struct msqid_ds *xmsqids; - kvm_read(kd, symbols[X_MSQIDS].n_value, &msqids, sizeof(msqids)); - xmsqids = malloc(sizeof(struct msqid_ds) * msginfo.msgmni); - kvm_read(kd, (u_long) msqids, xmsqids, sizeof(struct msqid_ds) * msginfo.msgmni); + if (display & MSGINFO) { + size = sizeof(struct msqid_ds) * msginfo.msgmni; + msqids = malloc(size); + if (msqids == NULL) { + fprintf(stderr, "No memory.\n"); + exit(1); + } + if (sysctlbyname("kern.ipc.msqids", msqids, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID messages facility not " + "configured in the system\n"); + free(msqids); + goto shm; + } printf("Message Queues:\n"); printf("T ID KEY MODE OWNER GROUP"); @@ -254,10 +216,10 @@ printf(" STIME RTIME CTIME"); printf("\n"); for (i = 0; i < msginfo.msgmni; i += 1) { - if (xmsqids[i].msg_qbytes != 0) { + if (msqids[i].msg_qbytes != 0) { char stime_buf[100], rtime_buf[100], ctime_buf[100]; - struct msqid_ds *msqptr = &xmsqids[i]; + struct msqid_ds *msqptr = &msqids[i]; cvt_time(msqptr->msg_stime, stime_buf); cvt_time(msqptr->msg_rtime, rtime_buf); @@ -265,7 +227,7 @@ printf("q %6d %10d %s %8s %8s", IXSEQ_TO_IPCID(i, msqptr->msg_perm), - msqptr->msg_perm.key, + (int)msqptr->msg_perm.key, fmt_perm(msqptr->msg_perm.mode), user_from_uid(msqptr->msg_perm.uid, 0), group_from_gid(msqptr->msg_perm.gid, 0)); @@ -276,12 +238,12 @@ group_from_gid(msqptr->msg_perm.cgid, 0)); if (option & OUTSTANDING) - printf(" %6d %6d", + printf(" %6ld %6ld", msqptr->msg_cbytes, msqptr->msg_qnum); if (option & BIGGEST) - printf(" %6d", + printf(" %6ld", msqptr->msg_qbytes); if (option & PID) @@ -300,13 +262,16 @@ } printf("\n"); } - } else - if (display & (MSGINFO | MSGTOTAL)) { - fprintf(stderr, - "SVID messages facility not configured in the system\n"); + } +shm: + if (display & (SHMINFO | SHMTOTAL)) { + size = sizeof(struct shminfo); + if (sysctlbyname("kern.ipc.shminfo", &shminfo, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID shared memory facility not " + "configured in the system\n"); + goto sem; } - if ((display & (SHMINFO | SHMTOTAL)) && - kvm_read(kd, symbols[X_SHMINFO].n_value, &shminfo, sizeof(shminfo))) { if (display & SHMTOTAL) { printf("shminfo:\n"); printf("\tshmmax: %7d\t(max shared memory segment size)\n", @@ -321,12 +286,19 @@ shminfo.shmall); } if (display & SHMINFO) { - struct shmid_ds *xshmids; - - kvm_read(kd, symbols[X_SHMSEGS].n_value, &shmsegs, sizeof(shmsegs)); - xshmids = malloc(sizeof(struct shmid_ds) * shminfo.shmmni); - kvm_read(kd, (u_long) shmsegs, xshmids, sizeof(struct shmid_ds) * - shminfo.shmmni); + size = sizeof(struct shmid_ds) * shminfo.shmmni; + shmsegs = malloc(size); + if (shmsegs == NULL) { + fprintf(stderr, "No memory.\n"); + exit(1); + } + if (sysctlbyname("kern.ipc.shmsegs", shmsegs, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID shared memory facility " + "not configured in the system\n"); + free(shmsegs); + goto sem; + } printf("Shared Memory:\n"); printf("T ID KEY MODE OWNER GROUP"); @@ -342,10 +314,10 @@ printf(" ATIME DTIME CTIME"); printf("\n"); for (i = 0; i < shminfo.shmmni; i += 1) { - if (xshmids[i].shm_perm.mode & 0x0800) { + if (shmsegs[i].shm_perm.mode & 0x0800) { char atime_buf[100], dtime_buf[100], ctime_buf[100]; - struct shmid_ds *shmptr = &xshmids[i]; + struct shmid_ds *shmptr = &shmsegs[i]; cvt_time(shmptr->shm_atime, atime_buf); cvt_time(shmptr->shm_dtime, dtime_buf); @@ -353,7 +325,7 @@ printf("m %6d %10d %s %8s %8s", IXSEQ_TO_IPCID(i, shmptr->shm_perm), - shmptr->shm_perm.key, + (int)shmptr->shm_perm.key, fmt_perm(shmptr->shm_perm.mode), user_from_uid(shmptr->shm_perm.uid, 0), group_from_gid(shmptr->shm_perm.gid, 0)); @@ -387,15 +359,16 @@ } printf("\n"); } - } else - if (display & (SHMINFO | SHMTOTAL)) { - fprintf(stderr, - "SVID shared memory facility not configured in the system\n"); + } +sem: + if (display & (SEMINFO | SEMTOTAL)) { + size = sizeof(struct seminfo); + if (sysctlbyname("kern.ipc.seminfo", &seminfo, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID semaphores facility not " + "configured in the system\n"); + exit(0); } - if ((display & (SEMINFO | SEMTOTAL)) && - kvm_read(kd, symbols[X_SEMINFO].n_value, &seminfo, sizeof(seminfo))) { - struct semid_ds *xsema; - if (display & SEMTOTAL) { printf("seminfo:\n"); printf("\tsemmap: %6d\t(# of entries in semaphore map)\n", @@ -419,10 +392,21 @@ printf("\tsemaem: %6d\t(adjust on exit max value)\n\n", seminfo.semaem); } + if (display & SEMINFO) { - kvm_read(kd, symbols[X_SEMA].n_value, &sema, sizeof(sema)); - xsema = malloc(sizeof(struct semid_ds) * seminfo.semmni); - kvm_read(kd, (u_long) sema, xsema, sizeof(struct semid_ds) * seminfo.semmni); + size = sizeof(struct semid_ds) * seminfo.semmni; + sema = malloc(size); + if (sema == NULL) { + fprintf(stderr, "No memory.\n"); + exit(1); + } + if (sysctlbyname("kern.ipc.sema", sema, &size, NULL, + NULL) != 0) { + fprintf(stderr, "SVID semaphores facility not " + "configured in the system\n"); + free(sema); + exit(0); + } printf("Semaphores:\n"); printf("T ID KEY MODE OWNER GROUP"); @@ -434,16 +418,16 @@ printf(" OTIME CTIME"); printf("\n"); for (i = 0; i < seminfo.semmni; i += 1) { - if ((xsema[i].sem_perm.mode & SEM_ALLOC) != 0) { + if ((sema[i].sem_perm.mode & SEM_ALLOC) != 0) { char ctime_buf[100], otime_buf[100]; - struct semid_ds *semaptr = &xsema[i]; + struct semid_ds *semaptr = &sema[i]; cvt_time(semaptr->sem_otime, otime_buf); cvt_time(semaptr->sem_ctime, ctime_buf); printf("s %6d %10d %s %8s %8s", IXSEQ_TO_IPCID(i, semaptr->sem_perm), - semaptr->sem_perm.key, + (int)semaptr->sem_perm.key, fmt_perm(semaptr->sem_perm.mode), user_from_uid(semaptr->sem_perm.uid, 0), group_from_gid(semaptr->sem_perm.gid, 0)); @@ -468,11 +452,7 @@ printf("\n"); } - } else - if (display & (SEMINFO | SEMTOTAL)) { - fprintf(stderr, "SVID semaphores facility not configured in the system\n"); - } - kvm_close(kd); + } exit(0); }