Lines 27-38
Link Here
|
27 |
|
27 |
|
28 |
#ifndef lint |
28 |
#ifndef lint |
29 |
static const char rcsid[] = |
29 |
static const char rcsid[] = |
30 |
"$FreeBSD: src/usr.bin/ipcs/ipcs.c,v 1.12.2.3 2001/07/30 10:16:41 dd Exp $"; |
30 |
"$FreeBSD$"; |
31 |
#endif /* not lint */ |
31 |
#endif /* not lint */ |
32 |
|
32 |
|
33 |
#include <err.h> |
33 |
#include <err.h> |
34 |
#include <fcntl.h> |
34 |
#include <fcntl.h> |
35 |
#include <kvm.h> |
|
|
36 |
#include <nlist.h> |
35 |
#include <nlist.h> |
37 |
#include <paths.h> |
36 |
#include <paths.h> |
38 |
#include <stdio.h> |
37 |
#include <stdio.h> |
Lines 44-49
Link Here
|
44 |
#include <sys/param.h> |
43 |
#include <sys/param.h> |
45 |
#include <sys/time.h> |
44 |
#include <sys/time.h> |
46 |
#include <sys/proc.h> |
45 |
#include <sys/proc.h> |
|
|
46 |
#include <sys/sysctl.h> |
47 |
#define _KERNEL |
47 |
#define _KERNEL |
48 |
#include <sys/ipc.h> |
48 |
#include <sys/ipc.h> |
49 |
#include <sys/sem.h> |
49 |
#include <sys/sem.h> |
Lines 59-84
Link Here
|
59 |
|
59 |
|
60 |
void usage __P((void)); |
60 |
void usage __P((void)); |
61 |
|
61 |
|
62 |
static struct nlist symbols[] = { |
|
|
63 |
{"_sema"}, |
64 |
#define X_SEMA 0 |
65 |
{"_seminfo"}, |
66 |
#define X_SEMINFO 1 |
67 |
{"_semu"}, |
68 |
#define X_SEMU 2 |
69 |
{"_msginfo"}, |
70 |
#define X_MSGINFO 3 |
71 |
{"_msqids"}, |
72 |
#define X_MSQIDS 4 |
73 |
{"_shminfo"}, |
74 |
#define X_SHMINFO 5 |
75 |
{"_shmsegs"}, |
76 |
#define X_SHMSEGS 6 |
77 |
{NULL} |
78 |
}; |
79 |
|
80 |
static kvm_t *kd; |
81 |
|
82 |
char * |
62 |
char * |
83 |
fmt_perm(mode) |
63 |
fmt_perm(mode) |
84 |
u_short mode; |
64 |
u_short mode; |
Lines 135-144
Link Here
|
135 |
{ |
115 |
{ |
136 |
int display = SHMINFO | MSGINFO | SEMINFO; |
116 |
int display = SHMINFO | MSGINFO | SEMINFO; |
137 |
int option = 0; |
117 |
int option = 0; |
138 |
char *core = NULL, *namelist = NULL; |
118 |
size_t size; |
139 |
int i; |
119 |
int i; |
140 |
|
120 |
|
141 |
while ((i = getopt(argc, argv, "MmQqSsabC:cN:optT")) != -1) |
121 |
while ((i = getopt(argc, argv, "MmQqSsab:c:optT")) != -1) |
142 |
switch (i) { |
122 |
switch (i) { |
143 |
case 'M': |
123 |
case 'M': |
144 |
display = SHMTOTAL; |
124 |
display = SHMTOTAL; |
Lines 167-181
Link Here
|
167 |
case 'b': |
147 |
case 'b': |
168 |
option |= BIGGEST; |
148 |
option |= BIGGEST; |
169 |
break; |
149 |
break; |
170 |
case 'C': |
|
|
171 |
core = optarg; |
172 |
break; |
173 |
case 'c': |
150 |
case 'c': |
174 |
option |= CREATOR; |
151 |
option |= CREATOR; |
175 |
break; |
152 |
break; |
176 |
case 'N': |
|
|
177 |
namelist = optarg; |
178 |
break; |
179 |
case 'o': |
153 |
case 'o': |
180 |
option |= OUTSTANDING; |
154 |
option |= OUTSTANDING; |
181 |
break; |
155 |
break; |
Lines 189-223
Link Here
|
189 |
usage(); |
163 |
usage(); |
190 |
} |
164 |
} |
191 |
|
165 |
|
192 |
/* |
166 |
if (display & (MSGINFO | MSGTOTAL)) { |
193 |
* Discard setgid privileges if not the running kernel so that bad |
167 |
size = sizeof(struct msginfo); |
194 |
* guys can't print interesting stuff from kernel memory. |
168 |
if (sysctlbyname("kern.ipc.msginfo", &msginfo, &size, NULL, |
195 |
*/ |
169 |
NULL) != 0) { |
196 |
if (namelist != NULL || core != NULL) |
170 |
fprintf(stderr, "SVID messages facility not configured " |
197 |
setgid(getgid()); |
171 |
"in the system\n"); |
198 |
|
172 |
goto shm; |
199 |
if ((kd = kvm_open(namelist, core, NULL, O_RDONLY, "ipcs")) == NULL) |
173 |
} |
200 |
exit(1); |
|
|
201 |
|
202 |
switch (kvm_nlist(kd, symbols)) { |
203 |
case 0: |
204 |
break; |
205 |
case -1: |
206 |
errx(1, "unable to read kernel symbol table"); |
207 |
default: |
208 |
#ifdef notdef /* they'll be told more civilly later */ |
209 |
warnx("nlist failed"); |
210 |
for (i = 0; symbols[i].n_name != NULL; i++) |
211 |
if (symbols[i].n_value == 0) |
212 |
warnx("symbol %s not found", |
213 |
symbols[i].n_name); |
214 |
break; |
215 |
#endif |
216 |
} |
217 |
|
218 |
if ((display & (MSGINFO | MSGTOTAL)) && |
219 |
kvm_read(kd, symbols[X_MSGINFO].n_value, &msginfo, sizeof(msginfo))== sizeof(msginfo)) { |
220 |
|
221 |
if (display & MSGTOTAL) { |
174 |
if (display & MSGTOTAL) { |
222 |
printf("msginfo:\n"); |
175 |
printf("msginfo:\n"); |
223 |
printf("\tmsgmax: %6d\t(max characters in a message)\n", |
176 |
printf("\tmsgmax: %6d\t(max characters in a message)\n", |
Lines 233-244
Link Here
|
233 |
printf("\tmsgseg: %6d\t(# of message segments in system)\n\n", |
186 |
printf("\tmsgseg: %6d\t(# of message segments in system)\n\n", |
234 |
msginfo.msgseg); |
187 |
msginfo.msgseg); |
235 |
} |
188 |
} |
236 |
if (display & MSGINFO) { |
|
|
237 |
struct msqid_ds *xmsqids; |
238 |
|
189 |
|
239 |
kvm_read(kd, symbols[X_MSQIDS].n_value, &msqids, sizeof(msqids)); |
190 |
if (display & MSGINFO) { |
240 |
xmsqids = malloc(sizeof(struct msqid_ds) * msginfo.msgmni); |
191 |
size = sizeof(struct msqid_ds) * msginfo.msgmni; |
241 |
kvm_read(kd, (u_long) msqids, xmsqids, sizeof(struct msqid_ds) * msginfo.msgmni); |
192 |
msqids = malloc(size); |
|
|
193 |
if (msqids == NULL) { |
194 |
fprintf(stderr, "No memory.\n"); |
195 |
exit(1); |
196 |
} |
197 |
if (sysctlbyname("kern.ipc.msqids", msqids, &size, NULL, |
198 |
NULL) != 0) { |
199 |
fprintf(stderr, "SVID messages facility not " |
200 |
"configured in the system\n"); |
201 |
free(msqids); |
202 |
goto shm; |
203 |
} |
242 |
|
204 |
|
243 |
printf("Message Queues:\n"); |
205 |
printf("Message Queues:\n"); |
244 |
printf("T ID KEY MODE OWNER GROUP"); |
206 |
printf("T ID KEY MODE OWNER GROUP"); |
Lines 254-263
Link Here
|
254 |
printf(" STIME RTIME CTIME"); |
216 |
printf(" STIME RTIME CTIME"); |
255 |
printf("\n"); |
217 |
printf("\n"); |
256 |
for (i = 0; i < msginfo.msgmni; i += 1) { |
218 |
for (i = 0; i < msginfo.msgmni; i += 1) { |
257 |
if (xmsqids[i].msg_qbytes != 0) { |
219 |
if (msqids[i].msg_qbytes != 0) { |
258 |
char stime_buf[100], rtime_buf[100], |
220 |
char stime_buf[100], rtime_buf[100], |
259 |
ctime_buf[100]; |
221 |
ctime_buf[100]; |
260 |
struct msqid_ds *msqptr = &xmsqids[i]; |
222 |
struct msqid_ds *msqptr = &msqids[i]; |
261 |
|
223 |
|
262 |
cvt_time(msqptr->msg_stime, stime_buf); |
224 |
cvt_time(msqptr->msg_stime, stime_buf); |
263 |
cvt_time(msqptr->msg_rtime, rtime_buf); |
225 |
cvt_time(msqptr->msg_rtime, rtime_buf); |
Lines 265-271
Link Here
|
265 |
|
227 |
|
266 |
printf("q %6d %10d %s %8s %8s", |
228 |
printf("q %6d %10d %s %8s %8s", |
267 |
IXSEQ_TO_IPCID(i, msqptr->msg_perm), |
229 |
IXSEQ_TO_IPCID(i, msqptr->msg_perm), |
268 |
msqptr->msg_perm.key, |
230 |
(int)msqptr->msg_perm.key, |
269 |
fmt_perm(msqptr->msg_perm.mode), |
231 |
fmt_perm(msqptr->msg_perm.mode), |
270 |
user_from_uid(msqptr->msg_perm.uid, 0), |
232 |
user_from_uid(msqptr->msg_perm.uid, 0), |
271 |
group_from_gid(msqptr->msg_perm.gid, 0)); |
233 |
group_from_gid(msqptr->msg_perm.gid, 0)); |
Lines 276-287
Link Here
|
276 |
group_from_gid(msqptr->msg_perm.cgid, 0)); |
238 |
group_from_gid(msqptr->msg_perm.cgid, 0)); |
277 |
|
239 |
|
278 |
if (option & OUTSTANDING) |
240 |
if (option & OUTSTANDING) |
279 |
printf(" %6d %6d", |
241 |
printf(" %6ld %6ld", |
280 |
msqptr->msg_cbytes, |
242 |
msqptr->msg_cbytes, |
281 |
msqptr->msg_qnum); |
243 |
msqptr->msg_qnum); |
282 |
|
244 |
|
283 |
if (option & BIGGEST) |
245 |
if (option & BIGGEST) |
284 |
printf(" %6d", |
246 |
printf(" %6ld", |
285 |
msqptr->msg_qbytes); |
247 |
msqptr->msg_qbytes); |
286 |
|
248 |
|
287 |
if (option & PID) |
249 |
if (option & PID) |
Lines 300-312
Link Here
|
300 |
} |
262 |
} |
301 |
printf("\n"); |
263 |
printf("\n"); |
302 |
} |
264 |
} |
303 |
} else |
265 |
} |
304 |
if (display & (MSGINFO | MSGTOTAL)) { |
266 |
shm: |
305 |
fprintf(stderr, |
267 |
if (display & (SHMINFO | SHMTOTAL)) { |
306 |
"SVID messages facility not configured in the system\n"); |
268 |
size = sizeof(struct shminfo); |
|
|
269 |
if (sysctlbyname("kern.ipc.shminfo", &shminfo, &size, NULL, |
270 |
NULL) != 0) { |
271 |
fprintf(stderr, "SVID shared memory facility not " |
272 |
"configured in the system\n"); |
273 |
goto sem; |
307 |
} |
274 |
} |
308 |
if ((display & (SHMINFO | SHMTOTAL)) && |
|
|
309 |
kvm_read(kd, symbols[X_SHMINFO].n_value, &shminfo, sizeof(shminfo))) { |
310 |
if (display & SHMTOTAL) { |
275 |
if (display & SHMTOTAL) { |
311 |
printf("shminfo:\n"); |
276 |
printf("shminfo:\n"); |
312 |
printf("\tshmmax: %7d\t(max shared memory segment size)\n", |
277 |
printf("\tshmmax: %7d\t(max shared memory segment size)\n", |
Lines 321-332
Link Here
|
321 |
shminfo.shmall); |
286 |
shminfo.shmall); |
322 |
} |
287 |
} |
323 |
if (display & SHMINFO) { |
288 |
if (display & SHMINFO) { |
324 |
struct shmid_ds *xshmids; |
289 |
size = sizeof(struct shmid_ds) * shminfo.shmmni; |
325 |
|
290 |
shmsegs = malloc(size); |
326 |
kvm_read(kd, symbols[X_SHMSEGS].n_value, &shmsegs, sizeof(shmsegs)); |
291 |
if (shmsegs == NULL) { |
327 |
xshmids = malloc(sizeof(struct shmid_ds) * shminfo.shmmni); |
292 |
fprintf(stderr, "No memory.\n"); |
328 |
kvm_read(kd, (u_long) shmsegs, xshmids, sizeof(struct shmid_ds) * |
293 |
exit(1); |
329 |
shminfo.shmmni); |
294 |
} |
|
|
295 |
if (sysctlbyname("kern.ipc.shmsegs", shmsegs, &size, NULL, |
296 |
NULL) != 0) { |
297 |
fprintf(stderr, "SVID shared memory facility " |
298 |
"not configured in the system\n"); |
299 |
free(shmsegs); |
300 |
goto sem; |
301 |
} |
330 |
|
302 |
|
331 |
printf("Shared Memory:\n"); |
303 |
printf("Shared Memory:\n"); |
332 |
printf("T ID KEY MODE OWNER GROUP"); |
304 |
printf("T ID KEY MODE OWNER GROUP"); |
Lines 342-351
Link Here
|
342 |
printf(" ATIME DTIME CTIME"); |
314 |
printf(" ATIME DTIME CTIME"); |
343 |
printf("\n"); |
315 |
printf("\n"); |
344 |
for (i = 0; i < shminfo.shmmni; i += 1) { |
316 |
for (i = 0; i < shminfo.shmmni; i += 1) { |
345 |
if (xshmids[i].shm_perm.mode & 0x0800) { |
317 |
if (shmsegs[i].shm_perm.mode & 0x0800) { |
346 |
char atime_buf[100], dtime_buf[100], |
318 |
char atime_buf[100], dtime_buf[100], |
347 |
ctime_buf[100]; |
319 |
ctime_buf[100]; |
348 |
struct shmid_ds *shmptr = &xshmids[i]; |
320 |
struct shmid_ds *shmptr = &shmsegs[i]; |
349 |
|
321 |
|
350 |
cvt_time(shmptr->shm_atime, atime_buf); |
322 |
cvt_time(shmptr->shm_atime, atime_buf); |
351 |
cvt_time(shmptr->shm_dtime, dtime_buf); |
323 |
cvt_time(shmptr->shm_dtime, dtime_buf); |
Lines 353-359
Link Here
|
353 |
|
325 |
|
354 |
printf("m %6d %10d %s %8s %8s", |
326 |
printf("m %6d %10d %s %8s %8s", |
355 |
IXSEQ_TO_IPCID(i, shmptr->shm_perm), |
327 |
IXSEQ_TO_IPCID(i, shmptr->shm_perm), |
356 |
shmptr->shm_perm.key, |
328 |
(int)shmptr->shm_perm.key, |
357 |
fmt_perm(shmptr->shm_perm.mode), |
329 |
fmt_perm(shmptr->shm_perm.mode), |
358 |
user_from_uid(shmptr->shm_perm.uid, 0), |
330 |
user_from_uid(shmptr->shm_perm.uid, 0), |
359 |
group_from_gid(shmptr->shm_perm.gid, 0)); |
331 |
group_from_gid(shmptr->shm_perm.gid, 0)); |
Lines 387-401
Link Here
|
387 |
} |
359 |
} |
388 |
printf("\n"); |
360 |
printf("\n"); |
389 |
} |
361 |
} |
390 |
} else |
362 |
} |
391 |
if (display & (SHMINFO | SHMTOTAL)) { |
363 |
sem: |
392 |
fprintf(stderr, |
364 |
if (display & (SEMINFO | SEMTOTAL)) { |
393 |
"SVID shared memory facility not configured in the system\n"); |
365 |
size = sizeof(struct seminfo); |
|
|
366 |
if (sysctlbyname("kern.ipc.seminfo", &seminfo, &size, NULL, |
367 |
NULL) != 0) { |
368 |
fprintf(stderr, "SVID semaphores facility not " |
369 |
"configured in the system\n"); |
370 |
exit(0); |
394 |
} |
371 |
} |
395 |
if ((display & (SEMINFO | SEMTOTAL)) && |
|
|
396 |
kvm_read(kd, symbols[X_SEMINFO].n_value, &seminfo, sizeof(seminfo))) { |
397 |
struct semid_ds *xsema; |
398 |
|
399 |
if (display & SEMTOTAL) { |
372 |
if (display & SEMTOTAL) { |
400 |
printf("seminfo:\n"); |
373 |
printf("seminfo:\n"); |
401 |
printf("\tsemmap: %6d\t(# of entries in semaphore map)\n", |
374 |
printf("\tsemmap: %6d\t(# of entries in semaphore map)\n", |
Lines 419-428
Link Here
|
419 |
printf("\tsemaem: %6d\t(adjust on exit max value)\n\n", |
392 |
printf("\tsemaem: %6d\t(adjust on exit max value)\n\n", |
420 |
seminfo.semaem); |
393 |
seminfo.semaem); |
421 |
} |
394 |
} |
|
|
395 |
|
422 |
if (display & SEMINFO) { |
396 |
if (display & SEMINFO) { |
423 |
kvm_read(kd, symbols[X_SEMA].n_value, &sema, sizeof(sema)); |
397 |
size = sizeof(struct semid_ds) * seminfo.semmni; |
424 |
xsema = malloc(sizeof(struct semid_ds) * seminfo.semmni); |
398 |
sema = malloc(size); |
425 |
kvm_read(kd, (u_long) sema, xsema, sizeof(struct semid_ds) * seminfo.semmni); |
399 |
if (sema == NULL) { |
|
|
400 |
fprintf(stderr, "No memory.\n"); |
401 |
exit(1); |
402 |
} |
403 |
if (sysctlbyname("kern.ipc.sema", sema, &size, NULL, |
404 |
NULL) != 0) { |
405 |
fprintf(stderr, "SVID semaphores facility not " |
406 |
"configured in the system\n"); |
407 |
free(sema); |
408 |
exit(0); |
409 |
} |
426 |
|
410 |
|
427 |
printf("Semaphores:\n"); |
411 |
printf("Semaphores:\n"); |
428 |
printf("T ID KEY MODE OWNER GROUP"); |
412 |
printf("T ID KEY MODE OWNER GROUP"); |
Lines 434-449
Link Here
|
434 |
printf(" OTIME CTIME"); |
418 |
printf(" OTIME CTIME"); |
435 |
printf("\n"); |
419 |
printf("\n"); |
436 |
for (i = 0; i < seminfo.semmni; i += 1) { |
420 |
for (i = 0; i < seminfo.semmni; i += 1) { |
437 |
if ((xsema[i].sem_perm.mode & SEM_ALLOC) != 0) { |
421 |
if ((sema[i].sem_perm.mode & SEM_ALLOC) != 0) { |
438 |
char ctime_buf[100], otime_buf[100]; |
422 |
char ctime_buf[100], otime_buf[100]; |
439 |
struct semid_ds *semaptr = &xsema[i]; |
423 |
struct semid_ds *semaptr = &sema[i]; |
440 |
|
424 |
|
441 |
cvt_time(semaptr->sem_otime, otime_buf); |
425 |
cvt_time(semaptr->sem_otime, otime_buf); |
442 |
cvt_time(semaptr->sem_ctime, ctime_buf); |
426 |
cvt_time(semaptr->sem_ctime, ctime_buf); |
443 |
|
427 |
|
444 |
printf("s %6d %10d %s %8s %8s", |
428 |
printf("s %6d %10d %s %8s %8s", |
445 |
IXSEQ_TO_IPCID(i, semaptr->sem_perm), |
429 |
IXSEQ_TO_IPCID(i, semaptr->sem_perm), |
446 |
semaptr->sem_perm.key, |
430 |
(int)semaptr->sem_perm.key, |
447 |
fmt_perm(semaptr->sem_perm.mode), |
431 |
fmt_perm(semaptr->sem_perm.mode), |
448 |
user_from_uid(semaptr->sem_perm.uid, 0), |
432 |
user_from_uid(semaptr->sem_perm.uid, 0), |
449 |
group_from_gid(semaptr->sem_perm.gid, 0)); |
433 |
group_from_gid(semaptr->sem_perm.gid, 0)); |
Lines 468-478
Link Here
|
468 |
|
452 |
|
469 |
printf("\n"); |
453 |
printf("\n"); |
470 |
} |
454 |
} |
471 |
} else |
455 |
} |
472 |
if (display & (SEMINFO | SEMTOTAL)) { |
|
|
473 |
fprintf(stderr, "SVID semaphores facility not configured in the system\n"); |
474 |
} |
475 |
kvm_close(kd); |
476 |
|
456 |
|
477 |
exit(0); |
457 |
exit(0); |
478 |
} |
458 |
} |