|
|
1.1 root 1: /*
2: * Module read all information about ipc.
3: */
4: #include <errno.h>
5: #include <coff.h>
6: #include <fcntl.h>
7: #include <stdio.h>
8: #include <errno.h>
9: #include <sys/shm.h>
10: #include <sys/msg.h>
11: #include "ipcs.h"
12:
13: extern char *calloc();
14:
15: struct msqid_ds *msqbuf;
16:
17: /*
18: * Get ipc and format ipc data
19: */
20: int get_data(fname, corefile)
21: char *fname; /* namelist */
22: char *corefile;
23: {
24: if (mflag) {
25: get_shmid_stats();
26: }
27:
28: if (sflag) {
29: get_sem_stats();
30: }
31:
32: if (qflag) {
33: get_msg_stats(fname);
34: }
35:
36: return 0;
37: }
38:
39:
40: /*
41: * get shared memory information.
42: */
43:
44: int get_shmid_stats()
45: {
46:
47: int id = SHMMNI - 1; /* shared memory identifier number */
48:
49: total_shmids = 0;
50:
51: /* Allocate space for shared memory data struct */
52: if (NULL == (shmid = (struct shmid_ds *)
53: calloc(SHMMNI, sizeof(struct shmid_ds)))) {
54: perror("ipcs");
55: exit(1);
56: }
57: /* Alocate space to keep track about shm segments */
58: if (NULL == (valid_shmid = (int *) calloc(SHMMNI, sizeof(int)))) {
59: perror("ipcs");
60: exit(1);
61: }
62:
63: /* loop through all shared memory segments available to system.
64: * increment total_shmid counter when we find one.
65: */
66: for (id = SHMMNI - 1; id >= 0 ; id --){
67: if ( -1 != (shmctl(id, IPC_STAT, &shmid[id]))){
68: total_shmids++;
69: valid_shmid[id] = 1;
70: } else {
71: valid_shmid[id] = 0;
72: }
73: }
74: }
75:
76: /*
77: * get_sem_stats() contains a loop that performs semctls to IPC_STAT
78: * allocated semaphores.
79: *
80: */
81: get_sem_stats()
82: {
83:
84: int id;
85: total_sems = 0;
86:
87: for (id = SEMMNI - 1; id >= 0 ; id--) {
88: if( -1 != (semctl(id, 0 , IPC_STAT, &semid[id]))){
89: valid_semid[id] = 1;
90: total_sems++;
91: }else{
92: valid_semid[id] = 0;
93: }
94: }
95: }
96:
97: /*
98: * get_msg_stats() read msgq data from the corefile to msqbuf
99: */
100: get_msg_stats(fname)
101: char *fname;
102: {
103: SYMENT sym; /* The table of names to find */
104: int fd; /* kernel file descriptor */
105: long msqoffset; /* offset to message queue headers */
106:
107: /* Allocate space for message queues headers */
108: if (NULL == (msqbuf = (struct msqbuf *)
109: calloc((unsigned) NMSQID, (unsigned) sizeof(struct msqid_ds)))) {
110: perror("ipcs");
111: exit(1);
112: }
113: sym._n._n_n._n_zeroes = 0; /* stuff for coffnlist */
114: sym.n_type = -1;
115:
116: /* "msqs" is internal kernel variable that points to message
117: * queues headers.
118: */
119: strcpy(sym.n_name, "msqs");
120: /* do lookups. coffnlist returns 0 on error. */
121: if (!coffnlist(fname, &sym, NULL, 1)) {
122: fprintf(stderr, "ipcs: error obtaining values from %s\n",
123: fname);
124: exit(1);
125: }
126:
127: /* Now we got addresses of the queues headers. So, we can go to corefile
128: * and read proper values.
129: */
130: /* Get address of message queue data */
131: if ((fd = iMemSeek(sym.n_value, 0)) < 0) {
132: perror("ipcs");
133: exit(1);
134: }
135: if (read(fd, &msqoffset, sizeof(int)) != sizeof(int)) {
136: fprintf(stderr, "ipcs: error getting message queue offset\n");
137: exit(1);
138: }
139: close(fd);
140: /* Before first request to msgget, msqs points to NULL.
141: * So we cannot and should not read.
142: * After the first request to msgget, all queue headers are alloced.
143: * At this point we will have to use IPC_ALLOC bit.
144: */
145: usemsqs = msqoffset ? 1 : 0;
146: if (!usemsqs) { /* There was no msq in use */
147: free(msqbuf);
148: return;
149: }
150: if ((fd = iMemSeek(msqoffset, 0)) < 0) {
151: perror("ipcs");
152: exit(1);
153: }
154: if (read(fd, msqbuf, sizeof(struct msqid_ds) * NMSQID) !=
155: sizeof(struct msqid_ds) * NMSQID) {
156: fprintf(stderr, "ipcs: error getting message queue status\n");
157: exit(1);
158: }
159: close(fd);
160: }
161:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.