summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2004-06-24 18:04:46 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2004-06-24 18:04:46 +0000
commit6f2f2524a7e8fe661b6ee6c12dc5722e2b206a30 (patch)
treee02633148585e2fc2d6979274f755ab65453f08c
parentf07fff9193f18ad1cdee79b2a27bb99814808040 (diff)
When given multiple processes to kill, keep going if we are unable to kill
one (previously it would error out and not kill the remaining ones). OK deraadt@
-rw-r--r--usr.bin/pkill/pkill.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/usr.bin/pkill/pkill.c b/usr.bin/pkill/pkill.c
index 7453f02f569..e1cd68fc0c3 100644
--- a/usr.bin/pkill/pkill.c
+++ b/usr.bin/pkill/pkill.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pkill.c,v 1.3 2004/03/12 00:19:48 deraadt Exp $ */
+/* $OpenBSD: pkill.c,v 1.4 2004/06/24 18:04:45 millert Exp $ */
/* $NetBSD: pkill.c,v 1.5 2002/10/27 11:49:34 kleink Exp $ */
/*-
@@ -38,7 +38,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: pkill.c,v 1.3 2004/03/12 00:19:48 deraadt Exp $";
+static const char rcsid[] = "$OpenBSD: pkill.c,v 1.4 2004/06/24 18:04:45 millert Exp $";
#endif /* !lint */
#include <sys/types.h>
@@ -107,8 +107,8 @@ struct listhead sidlist = SLIST_HEAD_INITIALIZER(list);
int main(int, char **);
void usage(void);
-void killact(struct kinfo_proc2 *);
-void grepact(struct kinfo_proc2 *);
+int killact(struct kinfo_proc2 *);
+int grepact(struct kinfo_proc2 *);
void makelist(struct listhead *, enum listtype, char *);
extern char *__progname;
@@ -120,7 +120,7 @@ main(int argc, char **argv)
extern int optind;
char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q;
int i, j, ch, bestidx, rv, criteria;
- void (*action)(struct kinfo_proc2 *);
+ int (*action)(struct kinfo_proc2 *);
struct kinfo_proc2 *kp;
struct list *li;
u_int32_t bestsec, bestusec;
@@ -384,7 +384,7 @@ main(int argc, char **argv)
/*
* Take the appropriate action for each matched process, if any.
*/
- for (i = 0, rv = 0, kp = plist; i < nproc; i++, kp++) {
+ for (i = 0, rv = STATUS_NOMATCH, kp = plist; i < nproc; i++, kp++) {
if (kp->p_pid == mypid)
continue;
if (selected[i]) {
@@ -396,11 +396,13 @@ main(int argc, char **argv)
if ((kp->p_flag & P_SYSTEM) != 0)
continue;
- rv = 1;
- (*action)(kp);
+ if ((*action)(kp) == -1)
+ rv = STATUS_ERROR;
+ else if (rv != STATUS_ERROR)
+ rv = STATUS_MATCH;
}
- exit(rv ? STATUS_MATCH : STATUS_NOMATCH);
+ exit(rv);
}
void
@@ -419,22 +421,25 @@ usage(void)
exit(STATUS_ERROR);
}
-void
+int
killact(struct kinfo_proc2 *kp)
{
- if (kill(kp->p_pid, signum) == -1)
- err(STATUS_ERROR, "signalling pid %d", (int)kp->p_pid);
+ if (kill(kp->p_pid, signum) == -1) {
+ warn("signalling pid %d", (int)kp->p_pid);
+ return (-1);
+ }
+ return (0);
}
-void
+int
grepact(struct kinfo_proc2 *kp)
{
char **argv;
if (longfmt && matchargs) {
if ((argv = kvm_getargv2(kd, kp, 0)) == NULL)
- return;
+ return (-1);
printf("%d ", (int)kp->p_pid);
for (; *argv != NULL; argv++) {
@@ -448,6 +453,7 @@ grepact(struct kinfo_proc2 *kp)
printf("%d", (int)kp->p_pid);
printf("%s", delim);
+ return (0);
}
void