Annotation of coherent/b/bin/ipcs/getipc.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.