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

1.1       root        1: /* 
                      2:  * ipcrm: remove message queue, shared memory segment or semaphore set
                      3:  *       given an identifier or key used to create the queue, segment
                      4:  *       or set.
                      5:  */
                      6: #include <stdio.h>
                      7: #include <errno.h>
                      8: #include <sys/types.h>
                      9: #include <sys/ipc.h>
                     10: 
                     11: /* 
                     12:  * Functions 
                     13:  */
                     14: void   rmid();                 /* given ipc resource identifier, remove it */
                     15: void   rmkey();                /* given ipc resource key, remove it */
                     16: void   usage();                /* usage message */
                     17: 
                     18: /* 
                     19:  * Globals 
                     20:  */
                     21: int    errorCount = 0;
                     22: 
                     23: /*
                     24:  * Program will go though all arguments and perform the job.
                     25:  * ipcrm will print message on error and continue process argument list,
                     26:  * so, if one or a few of options are not correct and a few are correct
                     27:  * it tries to properly process all correct options and give error messages
                     28:  * about all uncorrect.
                     29:  */
                     30: main(argc, argv)
                     31: int argc;
                     32: char **argv;
                     33: {
                     34:        extern char     *optarg;
                     35:        extern int      optind;
                     36:        int             flag;
                     37:        int             identifier;     /* ipc resource identifier */
                     38:        key_t           key;            /* ipc resource key */
                     39: 
                     40:        while ((flag = getopt(argc, argv, "m:M:s:S:q:Q:")) != EOF) {
                     41:                switch (flag) {
                     42:                case 'm':       /* shmid */
                     43:                        identifier = atoi(optarg);
                     44:                        rmid('m', identifier);
                     45:                        break;
                     46:                case 'M':       /* shmkey */
                     47:                        key = atoi(optarg);
                     48:                        rmkey('M', key);
                     49:                        break;
                     50:                case 'q':       /* msgqid */
                     51:                        identifier = atoi(optarg);
                     52:                        rmid('q', identifier);
                     53:                        break;
                     54:                case 'Q':       /* msgqkey */
                     55:                        key = atoi(optarg);
                     56:                        rmkey('Q', key);
                     57:                        break;
                     58:                case 's':       /* semid */
                     59:                        identifier = atoi(optarg);
                     60:                        rmid('s', identifier);
                     61:                        break;
                     62:                case 'S':       /* semkey */
                     63:                        key = atoi(optarg);
                     64:                        rmkey('S', key);
                     65:                        break;
                     66:                default:
                     67:                        errorCount++;
                     68:                        break;
                     69:                }
                     70:        }
                     71:        /* Print usage message on any error(s) but only once. */
                     72:        if (errorCount)
                     73:                usage();
                     74:        exit(errorCount);
                     75: }
                     76: 
                     77: /* rmid(): take a flag which tells us to remove a message queue, shared memory
                     78:  *        segment or semaphore set and an identifier and perform the proper
                     79:  *        command (msgctl, shmctl or semctl) with IPC_RMID to destroy the
                     80:  *        allocated queue, segment or set.
                     81:  *         Print error message and increment error count on error.
                     82:  */
                     83: void rmid(flag,identifier)
                     84: char flag;
                     85: int identifier;
                     86: {
                     87:        switch (flag) {
                     88:        case 'm':
                     89:                if (shmctl(identifier, IPC_RMID, 0) < 0) {
                     90:                        printf("ipcrm: shmid(%d): %s\n", identifier, 
                     91:                                                        sys_errlist[errno]);
                     92:                        errorCount++;
                     93:                }
                     94:                break;
                     95:        case 'q':
                     96:                if (msgctl(identifier, IPC_RMID, 0)) {
                     97:                        printf("ipcrm: msgid(%d): %s\n", identifier, 
                     98:                                                        sys_errlist[errno]);
                     99:                        errorCount++;
                    100:                }
                    101:                break;
                    102:        case 's':
                    103:                if (semctl(identifier, IPC_RMID, 0, 0)) {
                    104:                        printf("ipcrm: semid(%d): %s\n", identifier, 
                    105:                                                        sys_errlist[errno]);
                    106:                        errorCount++;
                    107:                }
                    108:                break;
                    109:        }
                    110: }
                    111: 
                    112: /* 
                    113:  * rmkey():    Remove ipc resource by gevien key.
                    114:  *             In case of error print error message and increment
                    115:  *             errorCount.
                    116:  */
                    117: void rmkey(flag, key)
                    118: char   flag;
                    119: key_t  key;
                    120: {
                    121:        int     id;     /* ipc id */
                    122:        
                    123:        switch (flag) {
                    124:        case 'M':
                    125:                if ((id = shmget(key, 1, 0)) < 0 ) {
                    126:                        printf("ipcrm: shmkey(%d): %s\n", key, 
                    127:                                                        sys_errlist[errno]);
                    128:                        errorCount++;
                    129:                        return;
                    130:                }
                    131:                if (shmctl(id, IPC_RMID, 0) < 0) {
                    132:                        printf("ipcrm: shmkey(%d): %s\n", key, 
                    133:                                                        sys_errlist[errno]);
                    134:                        errorCount++;
                    135:                        return;
                    136:                }
                    137:                return;
                    138:        case 'Q':
                    139:                if ((id = msgget(key, 0)) < 0 ) {
                    140:                        printf("ipcrm: msgkey(%d): %s\n", key, 
                    141:                                                        sys_errlist[errno]);
                    142:                        errorCount++;
                    143:                        return;
                    144:                }
                    145:                if (msgctl(id, IPC_RMID, 0) < 0) {
                    146:                        printf("ipcrm: msgkey(%d): %s\n", key, 
                    147:                                                        sys_errlist[errno]);
                    148:                        errorCount++;
                    149:                        return;
                    150:                }
                    151:                return;
                    152:        case 'S':
                    153:                if ((id = semget(key, 0, 0)) < 0 ) {
                    154:                        printf("ipcrm: semkey(%d): %s\n", key, 
                    155:                                                        sys_errlist[errno]);
                    156:                        errorCount++;
                    157:                        return;
                    158:                }
                    159:                if (semctl(id, IPC_RMID, 0, 0) < 0) {
                    160:                        printf("ipcrm: semkey(%d): %s\n", key, 
                    161:                                                        sys_errlist[errno]);
                    162:                        errorCount++;
                    163:                        return;
                    164:                }
                    165:                return;
                    166:        }
                    167: }
                    168: 
                    169: /* usage message */
                    170: void usage()
                    171: {
                    172:        errorCount++;
                    173:        puts("usage: ipcrm [ [-m shmId] [-q msgqId] [-s semId]");
                    174:        puts("               [-M shmKey] [-Q msgqKey] [-S semKey] ... ]");
                    175: }

unix.superglobalmegacorp.com

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