summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-07-22 20:40:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-07-22 16:25:43 +0000
commit2fd1fec6197e0ede7a404e106e3dc6ce226dca58 (patch)
tree5dbbbe872483d915e1ad7a350ae01a13fdf14986
parent82a2687a3c7eb39549b07153cf6a87ce5f3b507f (diff)
parent5054c0db7075c5565c476f74ec0a995e9b756660 (diff)
downloadsystem_core-2fd1fec6197e0ede7a404e106e3dc6ce226dca58.zip
system_core-2fd1fec6197e0ede7a404e106e3dc6ce226dca58.tar.gz
system_core-2fd1fec6197e0ede7a404e106e3dc6ce226dca58.tar.bz2
Merge "Switch to NetBSD's kill(1)."
-rw-r--r--toolbox/Android.mk25
-rw-r--r--toolbox/kill.c148
-rw-r--r--toolbox/upstream-netbsd/bin/kill/kill.c253
3 files changed, 272 insertions, 154 deletions
diff --git a/toolbox/Android.mk b/toolbox/Android.mk
index c53f17d..fb2c5c7 100644
--- a/toolbox/Android.mk
+++ b/toolbox/Android.mk
@@ -1,4 +1,17 @@
LOCAL_PATH:= $(call my-dir)
+
+common_cflags := \
+ -std=gnu99 \
+ -Werror -Wno-unused-parameter \
+ -include bsd-compatibility.h \
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := upstream-netbsd/bin/kill/kill.c
+LOCAL_CFLAGS += $(common_cflags) -Dmain=kill_main
+LOCAL_MODULE := libtoolbox_kill
+LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
+include $(BUILD_STATIC_LIBRARY)
+
include $(CLEAR_VARS)
TOOLS := \
@@ -24,7 +37,6 @@ TOOLS := \
insmod \
ioctl \
ionice \
- kill \
ln \
load_policy \
log \
@@ -79,7 +91,8 @@ endif
ALL_TOOLS = $(TOOLS)
ALL_TOOLS += \
cp \
- grep
+ grep \
+ kill \
LOCAL_SRC_FILES := \
cp/cp.c \
@@ -94,10 +107,7 @@ LOCAL_SRC_FILES := \
toolbox.c \
uid_from_user.c \
-LOCAL_CFLAGS += \
- -std=gnu99 \
- -Werror -Wno-unused-parameter \
- -include bsd-compatibility.h \
+LOCAL_CFLAGS += $(common_cflags)
LOCAL_C_INCLUDES += external/openssl/include
@@ -111,6 +121,9 @@ LOCAL_SHARED_LIBRARIES := \
LOCAL_STATIC_LIBRARIES := \
libusbhost \
+LOCAL_WHOLE_STATIC_LIBRARIES := \
+ libtoolbox_kill \
+
LOCAL_MODULE := toolbox
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
diff --git a/toolbox/kill.c b/toolbox/kill.c
deleted file mode 100644
index fa2f649..0000000
--- a/toolbox/kill.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include <sys/types.h>
-#include <signal.h>
-
-static struct {
- unsigned int number;
- char *name;
-} signals[] = {
-#define _SIG(name) {SIG##name, #name}
- /* Single Unix Specification signals */
- _SIG(ABRT),
- _SIG(ALRM),
- _SIG(FPE),
- _SIG(HUP),
- _SIG(ILL),
- _SIG(INT),
- _SIG(KILL),
- _SIG(PIPE),
- _SIG(QUIT),
- _SIG(SEGV),
- _SIG(TERM),
- _SIG(USR1),
- _SIG(USR2),
- _SIG(CHLD),
- _SIG(CONT),
- _SIG(STOP),
- _SIG(TSTP),
- _SIG(TTIN),
- _SIG(TTOU),
- _SIG(BUS),
- _SIG(POLL),
- _SIG(PROF),
- _SIG(SYS),
- _SIG(TRAP),
- _SIG(URG),
- _SIG(VTALRM),
- _SIG(XCPU),
- _SIG(XFSZ),
- /* non-SUS signals */
- _SIG(IO),
- _SIG(PWR),
-#ifdef SIGSTKFLT
- _SIG(STKFLT),
-#endif
- _SIG(WINCH),
-#undef _SIG
-};
-
-/* To indicate a matching signal was not found */
-static const unsigned int SENTINEL = (unsigned int) -1;
-
-void list_signals()
-{
- unsigned int sorted_signals[_NSIG];
- unsigned int i;
- unsigned int num;
-
- memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
-
- // Sort the signals
- for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
- sorted_signals[signals[i].number] = i;
- }
-
- num = 0;
- for (i = 1; i < _NSIG; i++) {
- unsigned int index = sorted_signals[i];
- if (index == SENTINEL) {
- continue;
- }
-
- fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
-
- if ((num++ % 4) == 3) {
- fprintf(stderr, "\n");
- }
- }
-
- if ((num % 4) == 3) {
- fprintf(stderr, "\n");
- }
-}
-
-unsigned int name_to_signal(const char* name)
-{
- unsigned int i;
-
- for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
- if (!strcasecmp(name, signals[i].name)) {
- return signals[i].number;
- }
- }
-
- return SENTINEL;
-}
-
-int kill_main(int argc, char **argv)
-{
- unsigned int sig = SIGTERM;
- int result = 0;
-
- argc--;
- argv++;
-
- if (argc >= 1 && argv[0][0] == '-') {
- char *endptr;
- size_t arg_len = strlen(argv[0]);
- if (arg_len < 2) {
- fprintf(stderr, "invalid argument: -\n");
- return -1;
- }
-
- char* arg = argv[0] + 1;
- if (arg_len == 2 && *arg == 'l') {
- list_signals();
- return 0;
- }
-
- sig = strtol(arg, &endptr, 10);
- if (*endptr != '\0') {
- sig = name_to_signal(arg);
- if (sig == SENTINEL) {
- fprintf(stderr, "invalid signal name: %s\n", arg);
- return -1;
- }
- }
-
- argc--;
- argv++;
- }
-
- while(argc > 0){
- int pid = atoi(argv[0]);
- int err = kill(pid, sig);
- if (err < 0) {
- result = err;
- fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
- }
-
- argc--;
- argv++;
- }
-
- return result;
-}
diff --git a/toolbox/upstream-netbsd/bin/kill/kill.c b/toolbox/upstream-netbsd/bin/kill/kill.c
new file mode 100644
index 0000000..0592577
--- /dev/null
+++ b/toolbox/upstream-netbsd/bin/kill/kill.c
@@ -0,0 +1,253 @@
+/* $NetBSD: kill.c,v 1.27 2011/08/29 14:51:18 joerg Exp $ */
+
+/*
+ * Copyright (c) 1988, 1993, 1994
+ * The Regents of the University of California. 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. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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.
+ */
+
+#include <sys/cdefs.h>
+#if !defined(lint) && !defined(SHELL)
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\
+ The Regents of the University of California. All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)kill.c 8.4 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: kill.c,v 1.27 2011/08/29 14:51:18 joerg Exp $");
+#endif
+#endif /* not lint */
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <inttypes.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <locale.h>
+#include <sys/ioctl.h>
+
+#ifdef SHELL /* sh (aka ash) builtin */
+int killcmd(int, char *argv[]);
+#define main killcmd
+#include "../../bin/sh/bltin/bltin.h"
+#endif /* SHELL */
+
+__dead static void nosig(char *);
+static void printsignals(FILE *);
+static int signame_to_signum(char *);
+__dead static void usage(void);
+
+int
+main(int argc, char *argv[])
+{
+ int errors;
+ intmax_t numsig, pid;
+ char *ep;
+
+ setprogname(argv[0]);
+ setlocale(LC_ALL, "");
+ if (argc < 2)
+ usage();
+
+ numsig = SIGTERM;
+
+ argc--, argv++;
+ if (strcmp(*argv, "-l") == 0) {
+ argc--, argv++;
+ if (argc > 1)
+ usage();
+ if (argc == 1) {
+ if (isdigit((unsigned char)**argv) == 0)
+ usage();
+ numsig = strtoimax(*argv, &ep, 10);
+ /* check for correctly parsed number */
+ if (*ep != '\0' || numsig == INTMAX_MIN || numsig == INTMAX_MAX) {
+ errx(EXIT_FAILURE, "illegal signal number: %s",
+ *argv);
+ /* NOTREACHED */
+ }
+ if (numsig >= 128)
+ numsig -= 128;
+ /* and whether it fits into signals range */
+ if (numsig <= 0 || numsig >= NSIG)
+ nosig(*argv);
+ printf("%s\n", sys_signame[(int) numsig]);
+ exit(0);
+ }
+ printsignals(stdout);
+ exit(0);
+ }
+
+ if (!strcmp(*argv, "-s")) {
+ argc--, argv++;
+ if (argc < 1) {
+ warnx("option requires an argument -- s");
+ usage();
+ }
+ if (strcmp(*argv, "0")) {
+ if ((numsig = signame_to_signum(*argv)) < 0)
+ nosig(*argv);
+ } else
+ numsig = 0;
+ argc--, argv++;
+ } else if (**argv == '-') {
+ char *sn = *argv + 1;
+ if (isalpha((unsigned char)*sn)) {
+ if ((numsig = signame_to_signum(sn)) < 0)
+ nosig(sn);
+ } else if (isdigit((unsigned char)*sn)) {
+ numsig = strtoimax(sn, &ep, 10);
+ /* check for correctly parsed number */
+ if (*ep || numsig == INTMAX_MIN || numsig == INTMAX_MAX ) {
+ errx(EXIT_FAILURE, "illegal signal number: %s",
+ sn);
+ /* NOTREACHED */
+ }
+ /* and whether it fits into signals range */
+ if (numsig < 0 || numsig >= NSIG)
+ nosig(sn);
+ } else
+ nosig(sn);
+ argc--, argv++;
+ }
+
+ if (argc == 0)
+ usage();
+
+ for (errors = 0; argc; argc--, argv++) {
+#ifdef SHELL
+ extern int getjobpgrp(const char *);
+ if (*argv[0] == '%') {
+ pid = getjobpgrp(*argv);
+ if (pid == 0) {
+ warnx("illegal job id: %s", *argv);
+ errors = 1;
+ continue;
+ }
+ } else
+#endif
+ {
+ pid = strtoimax(*argv, &ep, 10);
+ /* make sure the pid is a number and fits into pid_t */
+ if (!**argv || *ep || pid == INTMAX_MIN ||
+ pid == INTMAX_MAX || pid != (pid_t) pid) {
+
+ warnx("illegal process id: %s", *argv);
+ errors = 1;
+ continue;
+ }
+ }
+ if (kill((pid_t) pid, (int) numsig) == -1) {
+ warn("%s", *argv);
+ errors = 1;
+ }
+#ifdef SHELL
+ /* Wakeup the process if it was suspended, so it can
+ exit without an explicit 'fg'. */
+ if (numsig == SIGTERM || numsig == SIGHUP)
+ kill((pid_t) pid, SIGCONT);
+#endif
+ }
+
+ exit(errors);
+ /* NOTREACHED */
+}
+
+static int
+signame_to_signum(char *sig)
+{
+ int n;
+
+ if (strncasecmp(sig, "sig", 3) == 0)
+ sig += 3;
+ for (n = 1; n < NSIG; n++) {
+ if (!strcasecmp(sys_signame[n], sig))
+ return (n);
+ }
+ return (-1);
+}
+
+static void
+nosig(char *name)
+{
+
+ warnx("unknown signal %s; valid signals:", name);
+ printsignals(stderr);
+ exit(1);
+ /* NOTREACHED */
+}
+
+static void
+printsignals(FILE *fp)
+{
+ int sig;
+ int len, nl;
+ const char *name;
+ int termwidth = 80;
+
+ if (isatty(fileno(fp))) {
+ struct winsize win;
+ if (ioctl(fileno(fp), TIOCGWINSZ, &win) == 0 && win.ws_col > 0)
+ termwidth = win.ws_col;
+ }
+
+ for (len = 0, sig = 1; sig < NSIG; sig++) {
+ name = sys_signame[sig];
+ nl = 1 + strlen(name);
+
+ if (len + nl >= termwidth) {
+ fprintf(fp, "\n");
+ len = 0;
+ } else
+ if (len != 0)
+ fprintf(fp, " ");
+ len += nl;
+ fprintf(fp, "%s", name);
+ }
+ if (len != 0)
+ fprintf(fp, "\n");
+}
+
+static void
+usage(void)
+{
+
+ fprintf(stderr, "usage: %s [-s signal_name] pid ...\n"
+ " %s -l [exit_status]\n"
+ " %s -signal_name pid ...\n"
+ " %s -signal_number pid ...\n",
+ getprogname(), getprogname(), getprogname(), getprogname());
+ exit(1);
+ /* NOTREACHED */
+}