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

1.1       root        1: /*
                      2:  * File:       ipcs.c
                      3:  *
                      4:  * Purpose:    main driver for ipcs utility.
                      5:  * Revision 1.1  92/10/08 bin
                      6:  * Initial revision
                      7:  * 
                      8:  */
                      9: 
                     10: /*
                     11:  * ----------------------------------------------------------------------
                     12:  * Includes.
                     13:  */
                     14: #include <stdio.h>
                     15: #include <coff.h>
                     16: #include <fcntl.h>
                     17: #include <errno.h>
                     18: #include <string.h>
                     19: #include "ipcs.h"
                     20: /*
                     21:  * ----------------------------------------------------------------------
                     22:  * Definitions.
                     23:  *     Constants.
                     24:  *     Macros with argument lists.
                     25:  *     Typedefs.
                     26:  *     Enums.
                     27:  */
                     28: 
                     29: /*
                     30:  * ----------------------------------------------------------------------
                     31:  * Functions.
                     32:  *     Import Functions.
                     33:  *     Export Functions.
                     34:  *     Local Functions.
                     35:  */
                     36: int    iMemSeek();     /* Seek in the virtual memory */
                     37: /*
                     38:  * ----------------------------------------------------------------------
                     39:  *     Global data
                     40:  */
                     41: 
                     42: /* Option's flags. See man pages for more info */
                     43: short  qflag = 0,      /* message q */
                     44:        mflag = 0,      /* shared memory */
                     45:        sflag = 0,      /* semaphores */
                     46:        bflag = 0,      /* biggest */
                     47:        cflag = 0,      /* creator name */ 
                     48:        oflag = 0,      /* outstanding usage */
                     49:        pflag = 0,      /* process ID */
                     50:        tflag = 0,      /* time */
                     51:        aflag = 0,      /* include b, c, o, p, & t */
                     52:        Cflag = 0,      /* corefile */
                     53:        Nflag = 0;      /* namelist */
                     54: 
                     55: int    total_shmids = 0,       /* total shared memory segs found */
                     56:        total_sems = 0,         /* total semaphores found */
                     57:        usemsqs = 0;            /* is msq in use */
                     58: 
                     59: int    SHMMNI,                 /* total # shared memory segments */
                     60:        SEMMNI,                 /* total # semaphores */
                     61:        NMSQID;                 /* total # message queues */
                     62: 
                     63: /*
                     64:  * ----------------------------------------------------------------------
                     65:  * Code.
                     66:  */
                     67: main(argc, argv)
                     68: int    argc;
                     69: char   *argv[];
                     70: {
                     71:        char            *opstring = "qmsbcoptaVC:N: ";
                     72:        extern char     *optarg;
                     73:        char            *namelist = NULL;
                     74:        char            *fname,
                     75:                        *tmpfname;                      /* kernel name */
                     76:        int             c;
                     77: 
                     78:        while ((c = getopt(argc, argv, opstring)) != EOF)
                     79:                switch (c) {
                     80:                case 'q':
                     81:                        qflag = 1;
                     82:                        break;
                     83:                case 'm':
                     84:                        mflag = 1;
                     85:                        break;
                     86:                case 's':
                     87:                        sflag = 1;
                     88:                        break;
                     89:                case 'b':
                     90:                        bflag = 1;
                     91:                        break;  
                     92:                case 'c':
                     93:                        cflag = 1;
                     94:                        break;
                     95:                case 'o':
                     96:                        oflag = 1;
                     97:                        break;
                     98:                case 'p':
                     99:                        pflag = 1;
                    100:                        break;
                    101:                case 't':
                    102:                        tflag = 1;
                    103:                        break;
                    104:                case 'a':
                    105:                        aflag = 1;
                    106:                        break;
                    107:                case 'C':
                    108: /*                     Cflag = 1;
                    109:  *                     corefile = optarg;
                    110:  *                     break;
                    111:  */
                    112:                        fprintf(stderr, 
                    113:                                "ipcs: Corefile option NOT yet supported\n");
                    114:                        exit(1);
                    115:                case 'N':
                    116:                        Nflag = 1;
                    117:                        namelist = optarg;
                    118:                        break;
                    119:                case 'V':
                    120:                        printf("ipcs version %s\n", VERSION);
                    121:                        exit(0);
                    122:                default: 
                    123:                        usage(c);
                    124:        }
                    125: 
                    126:        set_flags();
                    127: 
                    128:        /* Get kernel name. */
                    129:        tmpfname = (Nflag ? namelist : pick_nfile());
                    130:        if ((fname = malloc(strlen(tmpfname) + 1)) == NULL) {
                    131:                perror("ipcs: cannot malloc kernel name:");
                    132:                exit(1);
                    133:        }
                    134:        strcpy(fname, tmpfname);
                    135: 
                    136:        getmaxnum(fname);
                    137:        get_data(fname);
                    138: 
                    139:        /* Now we can print */
                    140:        if (qflag)
                    141:                print_q();
                    142:        if (mflag)
                    143:                print_m();
                    144:        if (sflag)
                    145:                print_s();
                    146: 
                    147:        exit(0);
                    148: }
                    149: 
                    150: /* 
                    151:  * set_flags does some additional processing for flags 
                    152:  */
                    153: set_flags() 
                    154: {
                    155:        /* Default is all ipc */
                    156:        if (!(qflag + mflag + sflag))
                    157:                qflag = mflag = sflag = 1;
                    158: 
                    159:        /* use all print options */
                    160:        if (aflag)
                    161:                bflag = cflag = oflag = pflag = tflag = 1;
                    162: }
                    163: 
                    164: /*
                    165:  * Get the following values from the corefile:
                    166:  *     SHMMNI:         max number of allowable shared memory segments
                    167:  *     SEMMNI:         max number of allowable semaphore sets
                    168:  *     NMSQID:         max number of allowable message queues
                    169:  */
                    170: getmaxnum(fname)
                    171: char   *fname;         /* Kernel file name */
                    172: {
                    173:        SYMENT  sym[3]; /* The table of names to find */
                    174:        int     fd;     /* corefile file descriptor */
                    175:        int     val;    /* Read values buffer */
                    176:        int     i;      /* Loop index */
                    177: 
                    178:        /* Initialise SYMENT array */
                    179:        for (i = 0; i < 3; i++) {
                    180:                sym[i]._n._n_n._n_zeroes = 0;   /* stuff for coffnlist */
                    181:                sym[i].n_type = -1;
                    182:        }
                    183:        strcpy(sym[0].n_name, "SHMMNI");
                    184:        strcpy(sym[1].n_name, "SEMMNI");
                    185:        strcpy(sym[2].n_name, "NMSQID");
                    186: 
                    187:        /* do lookups. coffnlist returns 0 on error. */
                    188:        if (!coffnlist(fname, sym, NULL, 3)) {
                    189:                fprintf(stderr, "ipcs: error obtaining values from %s\n", 
                    190:                                                                        fname);
                    191:                exit(1);
                    192:        }
                    193: 
                    194:        /* Now we got addresses of the variables. So, we can go to memory
                    195:         * and read proper values. sym[i].n_value contains addresses of
                    196:         * variables.
                    197:         */
                    198:        /* Get max number of allowable shared memory segments */
                    199:        if ((fd = iMemSeek(sym[0].n_value, 0)) < 0)     /* Open and seek the */
                    200:                exit(1);                                /* proper file */
                    201:        if (read(fd, &val, sizeof(int)) != sizeof(int)) {
                    202:                fprintf(stderr, "ipcs: read value of SHMMNI error\n");
                    203:                exit(1);
                    204:        }
                    205:        close(fd);
                    206:        SHMMNI = val;
                    207: 
                    208:        /* Get max number of allowable semaphores */
                    209:        if ((fd = iMemSeek(sym[1].n_value, 0)) < 0)     /* Open and seek the */
                    210:                exit(1);                                /* proper file */
                    211:        if (read(fd, &val, sizeof(int)) != sizeof(int)) {
                    212:                fprintf(stderr, "ipcs: read value of SEMMNI error\n");
                    213:                exit(1);
                    214:        }
                    215:        close(fd);
                    216:        SEMMNI = val;
                    217: 
                    218:        /* Get max number of allowable message queues */
                    219:        if ((fd = iMemSeek(sym[2].n_value, 0)) < 0)     /* Open and seek the */
                    220:                exit(1);                                /* proper file */
                    221:        if (read(fd, &val, sizeof(int)) != sizeof(int)) {
                    222:                fprintf(stderr, "ipcs: read value of NMSQID error\n");
                    223:                exit(1);
                    224:        }
                    225:        NMSQID = val;
                    226: 
                    227:        close(fd);
                    228: }
                    229: 
                    230: /*
                    231:  * iMemSeek opens file and seeks in the memory. Uses /dev/kmem for low memory
                    232:  * and /dev/kmemhi for the high memory.
                    233:  * Return descriptor to the proper memory device or -1 on error.
                    234:  */
                    235: int    iMemSeek(lWhere, iHow)
                    236: long   lWhere; 
                    237: int    iHow;
                    238: {
                    239:        int     fd;                             /* File descriptor */
                    240:        char    *cpMemLow = "/dev/kmem";        /* Low memory device */
                    241:        char    *cpMemHigh = "/dev/kmemhi";     /* High memory device */
                    242:        char    *cpMem;                         /* Memory to use */
                    243:        long    lMemBorder = 0x80000000;        /* Border between devices */
                    244:        long    lMemWhere;                      /* Point to seek */
                    245:        char    cErrBuf[32];                    /* Error buffer */
                    246: 
                    247:        if (lWhere & lMemBorder) { 
                    248:                cpMem = cpMemHigh;
                    249:                lMemWhere = lWhere ^ lMemBorder;
                    250:        } else {
                    251:                cpMem = cpMemLow;
                    252:                lMemWhere = lWhere;
                    253:        }
                    254:        /* Open proper memory device */
                    255:        if ((fd = open(cpMem, O_RDONLY)) < 0) {
                    256:                sprintf(cErrBuf, "ipcs: cannot open %s", cpMem);
                    257:                perror(cErrBuf);
                    258:                return -1;
                    259:        }
                    260:        /* Seek to the requested position */
                    261:        if (lseek(fd, lMemWhere, iHow) < 0) {
                    262:                perror("ipcs: seek failed:");
                    263:                close(fd);
                    264:                return -1;
                    265:        }
                    266:        return fd;
                    267: }
                    268: 
                    269: /* 
                    270:  * ipcs usage. Print message and die 
                    271:  */
                    272: usage(c) 
                    273: int    c;
                    274: {
                    275:        fprintf(stderr, "ipcs:  illegal option - %c\n", c);
                    276:        fprintf(stderr, "usage: "
                    277:                 "ipcs [-abcmopqstV] [-C corefile] [-N namelist]\n");
                    278:        exit(1);
                    279: }

unix.superglobalmegacorp.com

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