Home | History | Annotate | Line # | Download | only in ipcrm
ipcrm.c revision 1.1
      1  1.1  cgd /*
      2  1.1  cgd  *	Implement the SYSV ipcrm command.
      3  1.1  cgd  *
      4  1.1  cgd  *	$Id: ipcrm.c,v 1.1 1993/11/14 16:28:00 cgd Exp $
      5  1.1  cgd  */
      6  1.1  cgd 
      7  1.1  cgd #include <stdio.h>
      8  1.1  cgd #include <stdlib.h>
      9  1.1  cgd #include <limits.h>
     10  1.1  cgd #include <sys/types.h>
     11  1.1  cgd #include <sys/ipc.h>
     12  1.1  cgd #include <sys/sem.h>
     13  1.1  cgd #include <sys/msg.h>
     14  1.1  cgd #include <sys/shm.h>
     15  1.1  cgd #include <errno.h>
     16  1.1  cgd 
     17  1.1  cgd #define OMIT_SHM		/* don't handle shm stuff; untested */
     18  1.1  cgd 
     19  1.1  cgd int
     20  1.1  cgd getnumber(char *num, long *lptr)
     21  1.1  cgd {
     22  1.1  cgd 	char *end;
     23  1.1  cgd 
     24  1.1  cgd 	if (num == NULL) {
     25  1.1  cgd 		fprintf(stderr, "ipcrm:  missing numeric parameter\n");
     26  1.1  cgd 		return (0);
     27  1.1  cgd 	}
     28  1.1  cgd 
     29  1.1  cgd 	*lptr = strtol(num, &end, 0);
     30  1.1  cgd 	if (*num == '\0' || *end != '\0') {
     31  1.1  cgd 		fprintf(stderr, "ipcrm:  can't convert \"%s\" to an integer\n",
     32  1.1  cgd 		    num);
     33  1.1  cgd 		return (0);
     34  1.1  cgd 	}
     35  1.1  cgd 	if (*lptr == LONG_MAX || *lptr == LONG_MIN) {
     36  1.1  cgd 		fprintf(stderr, "ipcrm:  absurd numeric parameter \"%s\"\n",
     37  1.1  cgd 		    num);
     38  1.1  cgd 		return (0);
     39  1.1  cgd 	}
     40  1.1  cgd 	return (1);
     41  1.1  cgd }
     42  1.1  cgd 
     43  1.1  cgd main(int argc, char **argv)
     44  1.1  cgd {
     45  1.1  cgd 	char *parm;
     46  1.1  cgd 	char tbuf[10000];
     47  1.1  cgd 	int errcnt = 0;
     48  1.1  cgd 	long id;
     49  1.1  cgd 	long key;
     50  1.1  cgd 
     51  1.1  cgd 	while ((parm = *++argv) != NULL) {
     52  1.1  cgd 
     53  1.1  cgd 		if (strcmp(parm, "-q") == 0) {
     54  1.1  cgd 			if (getnumber(*++argv, &id)) {
     55  1.1  cgd 				if (msgctl(id, IPC_RMID, NULL) == 0) {
     56  1.1  cgd 					printf("msqid %s deleted\n", *argv);
     57  1.1  cgd 				} else if (errno == ENOSYS) {
     58  1.1  cgd 					fprintf(stderr, "ipcrm:  SYSV message passing not configured in kernel\n");
     59  1.1  cgd 					errcnt += 1;
     60  1.1  cgd 				} else {
     61  1.1  cgd 					strcpy(tbuf, "can't remove msqid ");
     62  1.1  cgd 					strcat(tbuf, *argv);
     63  1.1  cgd 					perror(tbuf);
     64  1.1  cgd 					errcnt += 1;
     65  1.1  cgd 				}
     66  1.1  cgd 			} else {
     67  1.1  cgd 				errcnt += 1;
     68  1.1  cgd 			}
     69  1.1  cgd 		} else if (strcmp(parm, "-m") == 0) {
     70  1.1  cgd 			if (getnumber(*++argv, &id)) {
     71  1.1  cgd #ifndef OMIT_SHM
     72  1.1  cgd 				%%%untested %%%
     73  1.1  cgd 				    if (shmctl(id, IPC_RMID, NULL) == 0) {
     74  1.1  cgd 					printf("shmid %s deleted\n", *argv);
     75  1.1  cgd 				} else if (errno == ENOSYS) {
     76  1.1  cgd 					fprintf(stderr, "ipcrm:  SYSV shared memory not configured in kernel\n");
     77  1.1  cgd 					errcnt += 1;
     78  1.1  cgd 				} else {
     79  1.1  cgd 					strcpy(tbuf, "can't remove shmid ");
     80  1.1  cgd 					strcat(tbuf, *argv);
     81  1.1  cgd 					perror(tbuf);
     82  1.1  cgd 					errcnt += 1;
     83  1.1  cgd 				}
     84  1.1  cgd #else
     85  1.1  cgd 				fprintf(stderr, "ipcrm:  sorry, this version of ipcrm doesn't support shared memory\n");
     86  1.1  cgd 				errcnt += 1;
     87  1.1  cgd #endif
     88  1.1  cgd 			} else {
     89  1.1  cgd 				errcnt += 1;
     90  1.1  cgd 			}
     91  1.1  cgd 		} else if (strcmp(parm, "-s") == 0) {
     92  1.1  cgd 			if (getnumber(*++argv, &id)) {
     93  1.1  cgd 				union semun junk;
     94  1.1  cgd 
     95  1.1  cgd 				if (semctl(id, 0, IPC_RMID, junk) == 0) {
     96  1.1  cgd 					printf("semid %s deleted\n", *argv);
     97  1.1  cgd 				} else if (errno == ENOSYS) {
     98  1.1  cgd 					fprintf(stderr, "ipcrm:  SYSV semaphores not configured in kernel\n");
     99  1.1  cgd 					errcnt += 1;
    100  1.1  cgd 				} else {
    101  1.1  cgd 					strcpy(tbuf, "can't remove semid ");
    102  1.1  cgd 					strcat(tbuf, *argv);
    103  1.1  cgd 					perror(tbuf);
    104  1.1  cgd 					errcnt += 1;
    105  1.1  cgd 				}
    106  1.1  cgd 			} else {
    107  1.1  cgd 				errcnt += 1;
    108  1.1  cgd 			}
    109  1.1  cgd 		} else if (strcmp(parm, "-Q") == 0) {
    110  1.1  cgd 			if (getnumber(*++argv, &key)) {
    111  1.1  cgd 				if (key == IPC_PRIVATE) {
    112  1.1  cgd 					fprintf(stderr, "ipcrm:  can't remove private message queues\n");
    113  1.1  cgd 				} else {
    114  1.1  cgd 					strcpy(tbuf, "can't access msq key ");
    115  1.1  cgd 					strcat(tbuf, *argv);
    116  1.1  cgd 					if ((id = msgget(key, 0000)) >= 0) {
    117  1.1  cgd 						strcpy(tbuf,
    118  1.1  cgd 						    "can't remove msq key ");
    119  1.1  cgd 						strcat(tbuf, *argv);
    120  1.1  cgd 						if (msgctl(id, IPC_RMID, NULL)
    121  1.1  cgd 						    == 0) {
    122  1.1  cgd 							printf("msq key %s deleted\n",
    123  1.1  cgd 							    *argv);
    124  1.1  cgd 						} else {
    125  1.1  cgd 							perror(tbuf);
    126  1.1  cgd 							errcnt += 1;
    127  1.1  cgd 						}
    128  1.1  cgd 					} else if (errno == ENOSYS) {
    129  1.1  cgd 						fprintf(stderr, "ipcrm:  SYSV message passing not configured in kernel\n");
    130  1.1  cgd 						errcnt += 1;
    131  1.1  cgd 					} else {
    132  1.1  cgd 						perror(tbuf);
    133  1.1  cgd 						errcnt += 1;
    134  1.1  cgd 					}
    135  1.1  cgd 				}
    136  1.1  cgd 			} else {
    137  1.1  cgd 				errcnt += 1;
    138  1.1  cgd 			}
    139  1.1  cgd 		} else if (strcmp(parm, "-M") == 0) {
    140  1.1  cgd 			if (getnumber(*++argv, &key)) {
    141  1.1  cgd #ifndef OMIT_SHM
    142  1.1  cgd 				%%%untested %%%
    143  1.1  cgd 				    if (key == IPC_PRIVATE) {
    144  1.1  cgd 					fprintf(stderr, "ipcrm:  can't remove private shared memory segments\n");
    145  1.1  cgd 				} else {
    146  1.1  cgd 					strcpy(tbuf, "can't access shm key ");
    147  1.1  cgd 					strcat(tbuf, *argv);
    148  1.1  cgd 					if ((id = shmget(key, 0, 0000)) >= 0) {
    149  1.1  cgd 						strcpy(tbuf, "can't remove shm key ");
    150  1.1  cgd 						strcat(tbuf, *argv);
    151  1.1  cgd 						if (shmctl(id, IPC_RMID, NULL) == 0) {
    152  1.1  cgd 							printf("shm key %s deleted\n",
    153  1.1  cgd 							    *argv);
    154  1.1  cgd 						} else {
    155  1.1  cgd 							perror(tbuf);
    156  1.1  cgd 							errcnt += 1;
    157  1.1  cgd 						}
    158  1.1  cgd 					} else if (errno == ENOSYS) {
    159  1.1  cgd 						fprintf(stderr, "ipcrm:  SYSV shared memory not configured in kernel\n");
    160  1.1  cgd 						errcnt += 1;
    161  1.1  cgd 					} else {
    162  1.1  cgd 						perror(tbuf);
    163  1.1  cgd 						errcnt += 1;
    164  1.1  cgd 					}
    165  1.1  cgd 				}
    166  1.1  cgd #else
    167  1.1  cgd 				fprintf(stderr, "ipcrm:  sorry, this version of ipcrm doesn't support shared memory\n");
    168  1.1  cgd 				errcnt += 1;
    169  1.1  cgd #endif
    170  1.1  cgd 			} else {
    171  1.1  cgd 				errcnt += 1;
    172  1.1  cgd 			}
    173  1.1  cgd 		} else if (strcmp(parm, "-S") == 0) {
    174  1.1  cgd 			if (getnumber(*++argv, &key)) {
    175  1.1  cgd 				if (key == IPC_PRIVATE) {
    176  1.1  cgd 					fprintf(stderr, "ipcrm:  can't remove private semaphores\n");
    177  1.1  cgd 				} else {
    178  1.1  cgd 					strcpy(tbuf, "can't access sem key ");
    179  1.1  cgd 					strcat(tbuf, *argv);
    180  1.1  cgd 					if ((id = semget(key, 0, 0000)) >= 0) {
    181  1.1  cgd 						union semun junk;
    182  1.1  cgd 
    183  1.1  cgd 						strcpy(tbuf, "can't remove sem key ");
    184  1.1  cgd 						strcat(tbuf, *argv);
    185  1.1  cgd 						if (semctl(id, 0, IPC_RMID, junk) == 0) {
    186  1.1  cgd 							printf("sem key %s deleted\n", *argv);
    187  1.1  cgd 						} else {
    188  1.1  cgd 							perror(tbuf);
    189  1.1  cgd 							errcnt += 1;
    190  1.1  cgd 						}
    191  1.1  cgd 					} else if (errno == ENOSYS) {
    192  1.1  cgd 						fprintf(stderr, "ipcrm:  SYSV semaphores not configured in kernel\n");
    193  1.1  cgd 						errcnt += 1;
    194  1.1  cgd 					} else {
    195  1.1  cgd 						perror(tbuf);
    196  1.1  cgd 						errcnt += 1;
    197  1.1  cgd 					}
    198  1.1  cgd 				}
    199  1.1  cgd 			} else {
    200  1.1  cgd 				errcnt += 1;
    201  1.1  cgd 			}
    202  1.1  cgd 		} else {
    203  1.1  cgd 			fprintf(stderr, "ipcrm:  illegal parameter \"%s\" - bye!\n", parm);
    204  1.1  cgd 			exit(1);
    205  1.1  cgd 		}
    206  1.1  cgd 
    207  1.1  cgd 	}
    208  1.1  cgd 
    209  1.1  cgd 	if (errcnt == 0) {
    210  1.1  cgd 		exit(0);
    211  1.1  cgd 	} else {
    212  1.1  cgd 		exit(1);
    213  1.1  cgd 	}
    214  1.1  cgd }
    215