From 22853e4a82c6ef7b336527529acb94b14a0b0fd8 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 7 Dec 2006 00:25:43 +0100 Subject: Imported from util-linux-2.10m tarball. --- sys-utils/ipcrm.c | 113 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 84 insertions(+), 29 deletions(-) (limited to 'sys-utils/ipcrm.c') 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 * - added Native Language Support * + * 1999-04-02 frank zago + * - can now remove several id's in the same call + * */ #include @@ -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; } -- cgit v1.2.3-55-g7522