summaryrefslogtreecommitdiffstats
path: root/sys-utils/ipcrm.c
diff options
context:
space:
mode:
authorKarel Zak2006-12-07 00:25:43 +0100
committerKarel Zak2006-12-07 00:25:43 +0100
commit22853e4a82c6ef7b336527529acb94b14a0b0fd8 (patch)
treeee28e4598c8c449d7e811711d8ce8eb17caecfb6 /sys-utils/ipcrm.c
parentImported from util-linux-2.10f tarball. (diff)
downloadkernel-qcow2-util-linux-22853e4a82c6ef7b336527529acb94b14a0b0fd8.tar.gz
kernel-qcow2-util-linux-22853e4a82c6ef7b336527529acb94b14a0b0fd8.tar.xz
kernel-qcow2-util-linux-22853e4a82c6ef7b336527529acb94b14a0b0fd8.zip
Imported from util-linux-2.10m tarball.
Diffstat (limited to 'sys-utils/ipcrm.c')
-rw-r--r--sys-utils/ipcrm.c113
1 files changed, 84 insertions, 29 deletions
diff --git a/sys-utils/ipcrm.c b/sys-utils/ipcrm.c
index 4dcd081b4..2fc6ec47f 100644
--- a/sys-utils/ipcrm.c
+++ b/sys-utils/ipcrm.c
@@ -4,6 +4,9 @@
* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
* - added Native Language Support
*
+ * 1999-04-02 frank zago
+ * - can now remove several id's in the same call
+ *
*/
#include <stdio.h>
@@ -30,47 +33,99 @@ union semun {
};
#endif
+char *execname;
-int main(int argc, char **argv)
-{
+typedef enum type_id {
+ SHM,
+ SEM,
+ MSG
+} type_id;
+
+static int
+remove_ids(type_id type, int argc, char **argv) {
int id;
+ int ret = 0; /* for gcc */
+ char *end;
+ int nb_errors = 0;
union semun arg;
arg.val = 0;
+
+ while(argc) {
+
+ id = strtoul(argv[0], &end, 10);
+
+ if (*end != 0) {
+ printf (_("invalid id: %s\n"), argv[0]);
+ nb_errors ++;
+ } else {
+ switch(type) {
+ case SEM:
+ ret = semctl (id, 0, IPC_RMID, arg);
+ break;
+
+ case MSG:
+ ret = msgctl (id, IPC_RMID, NULL);
+ break;
+
+ case SHM:
+ ret = shmctl (id, IPC_RMID, NULL);
+ break;
+ }
+
+ if (ret) {
+ printf (_("cannot remove id %s (%s)\n"),
+ argv[0], strerror(errno));
+ nb_errors ++;
+ }
+ }
+ argc--;
+ argv++;
+ }
+ return(nb_errors);
+}
+
+static void display_usage(void)
+{
+ printf (_("usage: %s {shm | msg | sem} id ...\n"), execname);
+}
+
+int main(int argc, char **argv)
+{
+ execname = argv[0];
+
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- if (argc != 3 || strlen(argv[1]) < 3) {
- printf (_("usage: %s [shm | msg | sem] id\n"), argv[0]);
- exit (1);
+ if (argc < 3) {
+ display_usage();
+ exit(1);
+ }
+
+ if (!strcmp(argv[1], "shm")) {
+ if (remove_ids(SHM, argc-2, &argv[2])) {
+ exit(1);
+ }
}
- id = atoi (argv[2]);
- switch (argv[1][1]) {
- case 'h':
- if (!shmctl (id, IPC_RMID, NULL))
- break;
- perror ("shmctl ");
- exit (1);
-
- case 'e':
- if (!semctl (id, 0, IPC_RMID, arg))
- break;
- perror ("semctl ");
- exit (1);
-
- case 's':
- if (!msgctl (id, IPC_RMID, NULL))
- break;
- perror ("msgctl ");
- exit (1);
-
- default:
- printf (_("usage: %s [-shm | -msg | -sem] id\n"), argv[0]);
- exit (1);
+ else if (!strcmp(argv[1], "msg")) {
+ if (remove_ids(MSG, argc-2, &argv[2])) {
+ exit(1);
+ }
+ }
+ else if (!strcmp(argv[1], "sem")) {
+ if (remove_ids(SEM, argc-2, &argv[2])) {
+ exit(1);
+ }
}
- printf (_("resource deleted\n"));
+ else {
+ display_usage();
+ printf (_("unknown resource type: %s\n"), argv[1]);
+ exit(1);
+ }
+
+ printf (_("resource(s) deleted\n"));
return 0;
}