diff options
Diffstat (limited to 'usr.bin/ipcrm')
| -rw-r--r-- | usr.bin/ipcrm/Makefile | 6 | ||||
| -rw-r--r-- | usr.bin/ipcrm/ipcrm.c | 204 |
2 files changed, 210 insertions, 0 deletions
diff --git a/usr.bin/ipcrm/Makefile b/usr.bin/ipcrm/Makefile new file mode 100644 index 000000000000..196c08d611bb --- /dev/null +++ b/usr.bin/ipcrm/Makefile @@ -0,0 +1,6 @@ +# @(#)Makefile 5.2 (Berkeley) 5/11/90 + +PROG= ipcrm +NOMAN= noman + +.include <bsd.prog.mk> diff --git a/usr.bin/ipcrm/ipcrm.c b/usr.bin/ipcrm/ipcrm.c new file mode 100644 index 000000000000..1becaad61c6d --- /dev/null +++ b/usr.bin/ipcrm/ipcrm.c @@ -0,0 +1,204 @@ +/* + * Implement the SYSV ipcrm command. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <limits.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/sem.h> +#include <sys/msg.h> +#include <sys/shm.h> +#include <errno.h> + +#define OMIT_SHM /* don't handle shm stuff */ + +int +getnumber(char *num,long *lptr) +{ + char *end; + + if ( num == NULL ) { + fprintf(stderr,"ipcrm: missing numeric parameter\n"); + return(0); + } + + *lptr = strtol(num, &end, 0); + if ( *num == '\0' || *end != '\0' ) { + fprintf(stderr,"ipcrm: can't convert \"%s\" to an integer\n",num); + return(0); + } + if ( *lptr == LONG_MAX || *lptr == LONG_MIN ) { + fprintf(stderr,"ipcrm: absurd numeric parameter \"%s\"\n",num); + return(0); + } + return(1); +} + +main(int argc,char **argv) +{ + char *parm; + char tbuf[10000]; + int errcnt = 0; + long id; + long key; + + while ( (parm = *++argv) != NULL ) { + + if ( strcmp(parm,"-q") == 0 ) { + if ( getnumber(*++argv,&id) ) { + if ( msgctl(id,IPC_RMID,NULL) == 0 ) { + printf("msqid %s deleted\n",*argv); + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV message passing not configured in kernel\n"); + errcnt += 1; + } else { + strcpy(tbuf,"can't remove msqid "); + strcat(tbuf,*argv); + perror(tbuf); + errcnt += 1; + } + } else { + errcnt += 1; + } + } else if ( strcmp(parm,"-m") == 0 ) { + if ( getnumber(*++argv,&id) ) { +#ifndef OMIT_SHM + %%% untested %%% + if ( shmctl(id,IPC_RMID,NULL) == 0 ) { + printf("shmid %s deleted\n",*argv); + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV shared memory not configured in kernel\n"); + errcnt += 1; + } else { + strcpy(tbuf,"can't remove shmid "); + strcat(tbuf,*argv); + perror(tbuf); + errcnt += 1; + } +#else + fprintf(stderr,"ipcrm: sorry, this version of ipcrm doesn't support shared memory\n"); + errcnt += 1; +#endif + } else { + errcnt += 1; + } + } else if ( strcmp(parm,"-s") == 0 ) { + if ( getnumber(*++argv,&id) ) { + union semun junk; + if ( semctl(id,0,IPC_RMID,junk) == 0 ) { + printf("semid %s deleted\n",*argv); + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV semaphores not configured in kernel\n"); + errcnt += 1; + } else { + strcpy(tbuf,"can't remove semid "); + strcat(tbuf,*argv); + perror(tbuf); + errcnt += 1; + } + } else { + errcnt += 1; + } + } else if ( strcmp(parm,"-Q") == 0 ) { + if ( getnumber(*++argv,&key) ) { + if ( key == IPC_PRIVATE ) { + fprintf(stderr,"ipcrm: can't remove private message queues\n"); + } else { + strcpy(tbuf,"can't access msq key "); + strcat(tbuf,*argv); + if ( (id = msgget(key,0000)) >= 0 ) { + strcpy(tbuf,"can't remove msq key "); + strcat(tbuf,*argv); + if ( msgctl(id,IPC_RMID,NULL) == 0 ) { + printf("msq key %s deleted\n",*argv); + } else { + perror(tbuf); + errcnt += 1; + } + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV message passing not configured in kernel\n"); + errcnt += 1; + } else { + perror(tbuf); + errcnt += 1; + } + } + } else { + errcnt += 1; + } + } else if ( strcmp(parm,"-M") == 0 ) { + if ( getnumber(*++argv,&key) ) { +#ifndef OMIT_SHM + %%% untested %%% + if ( key == IPC_PRIVATE ) { + fprintf(stderr,"ipcrm: can't remove private shared memory segments\n"); + } else { + strcpy(tbuf,"can't access shm key "); + strcat(tbuf,*argv); + if ( (id = shmget(key,0,0000)) >= 0 ) { + strcpy(tbuf,"can't remove shm key "); + strcat(tbuf,*argv); + if ( shmctl(id,IPC_RMID,NULL) == 0 ) { + printf("shm key %s deleted\n",*argv); + } else { + perror(tbuf); + errcnt += 1; + } + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV shared memory not configured in kernel\n"); + errcnt += 1; + } else { + perror(tbuf); + errcnt += 1; + } + } +#else + fprintf(stderr,"ipcrm: sorry, this version of ipcrm doesn't support shared memory\n"); + errcnt += 1; +#endif + } else { + errcnt += 1; + } + } else if ( strcmp(parm,"-S") == 0 ) { + if ( getnumber(*++argv,&key) ) { + if ( key == IPC_PRIVATE ) { + fprintf(stderr,"ipcrm: can't remove private semaphores\n"); + } else { + strcpy(tbuf,"can't access sem key "); + strcat(tbuf,*argv); + if ( (id = semget(key,0,0000)) >= 0 ) { + union semun junk; + strcpy(tbuf,"can't remove sem key "); + strcat(tbuf,*argv); + if ( semctl(id,0,IPC_RMID,junk) == 0 ) { + printf("sem key %s deleted\n",*argv); + } else { + perror(tbuf); + errcnt += 1; + } + } else if ( errno == ENOSYS ) { + fprintf(stderr,"ipcrm: SYSV semaphores not configured in kernel\n"); + errcnt += 1; + } else { + perror(tbuf); + errcnt += 1; + } + } + } else { + errcnt += 1; + } + } else { + fprintf(stderr,"ipcrm: illegal parameter \"%s\" - bye!\n",parm); + exit(1); + } + + } + + if ( errcnt == 0 ) { + exit(0); + } else { + exit(1); + } +} |
