/*
* 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.
*/
static void usage(void) __dead;
static int msgrm(key_t, int);
static int shmrm(key_t, int);
static int semrm(key_t, int);
static int msgrmall(void);
static int shmrmall(void);
static int semrmall(void);
static void not_configured(int);
if (optarg != NULL && strcmp(optarg, "all") == 0) {
switch (c) {
case 'm':
case 'M':
result = shmrmall();
break;
case 'q':
case 'Q':
result = msgrmall();
break;
case 's':
case 'S':
result = semrmall();
break;
default:
usage();
}
} else {
switch (c) {
case 'q':
case 'm':
case 's':
target_id = atoi(optarg);
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;
}
break;
default:
usage();
}
switch (c) {
case 'q':
result = msgrm((key_t)0, target_id);
break;
case 'm':
result = shmrm((key_t)0, target_id);
break;
case 's':
result = semrm((key_t)0, target_id);
break;
case 'Q':
result = msgrm(target_key, 0);
break;
case 'M':
result = shmrm(target_key, 0);
break;
case 'S':
result = semrm(target_key, 0);
break;
}
}
if (result < 0) {
if (!signaled) {
if (target_id) {
warn("%sid(%d): ",
IPC_TO_STR(toupper(c)), target_id);
errflg++;
} else if (target_key) {
warn("%skey(%ld): ", IPC_TO_STR(c),
(long)target_key);
errflg++;
}
} else {
errflg++;
warnx("%ss are not configured in "
"the running kernel",
IPC_TO_STRING(toupper(c)));
}
}
}