diff options
author | dfr <dfr@FreeBSD.org> | 1994-09-13 16:52:12 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1994-09-13 16:52:12 +0000 |
commit | 9955df6ee4f8ff77ce832ef471c201b1f93895d2 (patch) | |
tree | e3ae346a5e584a4850dbc4ffb1a7ab85a9a3d966 | |
parent | c6a6ca73a75b0715996393b5fcfcd44e7967be29 (diff) | |
download | FreeBSD-src-9955df6ee4f8ff77ce832ef471c201b1f93895d2.zip FreeBSD-src-9955df6ee4f8ff77ce832ef471c201b1f93895d2.tar.gz |
Utility for deleting message queues, semaphores and shared memory segments.
Obtained from: NetBSD
-rw-r--r-- | usr.bin/ipcrm/Makefile | 5 | ||||
-rw-r--r-- | usr.bin/ipcrm/ipcrm.1 | 83 | ||||
-rw-r--r-- | usr.bin/ipcrm/ipcrm.c | 172 |
3 files changed, 260 insertions, 0 deletions
diff --git a/usr.bin/ipcrm/Makefile b/usr.bin/ipcrm/Makefile new file mode 100644 index 0000000..98fd8f8 --- /dev/null +++ b/usr.bin/ipcrm/Makefile @@ -0,0 +1,5 @@ +# $Id: Makefile,v 1.3.2.1 1994/08/09 13:47:15 mycroft Exp $ + +PROG= ipcrm + +.include <bsd.prog.mk> diff --git a/usr.bin/ipcrm/ipcrm.1 b/usr.bin/ipcrm/ipcrm.1 new file mode 100644 index 0000000..19bb6e6 --- /dev/null +++ b/usr.bin/ipcrm/ipcrm.1 @@ -0,0 +1,83 @@ +.\" Copyright (c) 1994 Adam Glass +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the Author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL Adam Glass BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id: ipcrm.1,v 1.1 1994/08/09 02:26:30 glass Exp $ +.\"" +.Dd August 8th, 1994 +.Dt ipcrm 1 +.Os +.Sh NAME +.Nm ipcrm +.Nd remove the specified message queues, semaphore sets, and shared memory +segments +.Sh SYNOPSIS +.Nm ipcrm +.Op Fl q Ar msqid +.Op Fl m Ar shmid +.Op Fl s Ar semid +.Op Fl Q Ar msgkey +.Op Fl M Ar shmkey +.Op Fl S Ar semkey +.Ar ... +.Sh DESCRIPTION +.Nm ipcrm +removes the specified message queues, semaphores and shared memory +segments. These System V IPC objects can be specified by their +creation id or any associated key. +.Pp +The following options are used to specify which IPC objects will be removed. Any number and combination of these options can be used: +.Bl -tag -width indent +.It Fl q Ar msqid +Remove the message queue associated with the id +.Nm msqid +from the system. +.It Fl m Ar shmid +Mark the shared memory segment associated with id +.Nm shmid +for removal. +This marked segment will be destroyed after the last detach. +.It Fl s Ar semid +Removes the semaphore set associated with id +.Nm semid +from the system. +.It Fl Q Ar msgkey +Remove the message queue associated with key +.Nm msgkey +from the system. +.It Fl M Ar shmkey +Mark the shared memory segment associated with key +.Nm shmkey +for removal. +This marked segment will be destroyed after the last detach. +.It Fl S Ar semkey +Remove the semaphore set associated with key +.Nm semkey +from the system. +.El +.Pp +The identifiers and keys associated with these System V IPC objects can be +determined by using +.Xr ipcs 1 +. +.Sh SEE ALSO +.Xr ipcs 1 diff --git a/usr.bin/ipcrm/ipcrm.c b/usr.bin/ipcrm/ipcrm.c new file mode 100644 index 0000000..95626e8 --- /dev/null +++ b/usr.bin/ipcrm/ipcrm.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1994 Adam Glass + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Glass. + * 4. The name of the Author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Adam Glass BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: ipcrm.c,v 1.3.2.1 1994/08/08 05:51:08 mycroft Exp $ + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <err.h> +#include <signal.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/msg.h> +#include <sys/sem.h> +#include <sys/shm.h> + +#define IPC_TO_STR(x) (x == 'Q' ? "msq" : (x == 'M' ? "shm" : "sem")) +#define IPC_TO_STRING(x) (x == 'Q' ? "message queue" : \ + (x == 'M' ? "shared memory segment" : "semaphore")) + +int signaled; + +void usage() +{ + fprintf(stderr, "usage: ipcrm [ [-q msqid] [-m shmid] [-s semid]\n"); + fprintf(stderr, " [-Q msgkey] [-M shmkey] [-S semkey] ...]\n"); + exit(1); +} + +int msgrm(key, id) + key_t key; + int id; +{ + if (key) { + id = msgget(key, 0); + if (id == -1) + return -1; + } + return msgctl(id, IPC_RMID, NULL); +} + +int shmrm(key, id) + key_t key; + int id; +{ + if (key) { + id = shmget(key, 0, 0); + if (id == -1) + return -1; + } + return shmctl(id, IPC_RMID, NULL); +} + +int semrm(key, id) + key_t key; + int id; +{ + union semun arg; + + if (key) { + id = semget(key, 0, 0); + if (id == -1) + return -1; + } + return semctl(id, 0, IPC_RMID, arg); +} + +void not_configured() +{ + signaled++; +} + +int main(argc, argv) + int argc; + char *argv[]; + +{ + int c, result, errflg, target_id; + key_t target_key; + + errflg = 0; + signal(SIGSYS, not_configured); + while ((c = getopt(argc, argv, ":q:m:s:Q:M:S:")) != -1) { + + signaled = 0; + switch (c) { + case 'q': + case 'm': + case 's': + target_id = atoi(optarg); + if (c == 'q') + result = msgrm(0, target_id); + else if (c == 'm') + result = shmrm(0, target_id); + else + result = semrm(0, target_id); + if (result < 0) { + errflg++; + if (!signaled) + warn("%sid(%d): ", IPC_TO_STR(toupper(c)), target_id); + else + warnx("%ss are not configured in the running kernel", + IPC_TO_STRING(toupper(c))); + } + break; + case 'Q': + case 'M': + case 'S': + target_key = atol(optarg); + if (target_key == IPC_PRIVATE) { + warnx("can't remove private %ss", IPC_TO_STRING(c)); + continue; + } + if (c == 'Q') + result = msgrm(target_key, 0); + else if (c == 'M') + result = shmrm(target_key, 0); + else + result = semrm(target_key, 0); + if (result < 0) { + errflg++; + if (!signaled) + warn("%key(%ld): ", IPC_TO_STR(c), target_key); + else + warnx("%ss are not configured in the running kernel", + IPC_TO_STRING(c)); + } + break; + case ':': + fprintf(stderr, "option -%c requires an argument\n", optopt); + usage(); + case '?': + fprintf(stderr, "unrecognized option: -%c\n", optopt); + usage(); + } + } + + if (optind != argc) { + fprintf(stderr, "unknown argument: %s\n", argv[optind]); + usage(); + } + exit(errflg); +} + |