svn commit: r216629 - in head: bin/kill bin/sh bin/sh/bltin
share/man/man1
Jilles Tjoelker
jilles at FreeBSD.org
Tue Dec 21 22:47:35 UTC 2010
Author: jilles
Date: Tue Dec 21 22:47:34 2010
New Revision: 216629
URL: http://svn.freebsd.org/changeset/base/216629
Log:
sh: Add kill builtin.
This allows specifying a %job (which is equivalent to the corresponding
process group).
Additionally, it improves reliability of kill from sh in high-load
situations and ensures "kill" finds the correct utility regardless of PATH,
as required by POSIX (unless the undocumented %builtin mechanism is used).
Side effect: fatal errors (any error other than kill(2) failure) now return
exit status 2 instead of 1. (This is consistent with other sh builtins, but
not in NetBSD.)
Code size increases about 1K on i386.
Obtained from: NetBSD
Modified:
head/bin/kill/kill.1
head/bin/kill/kill.c
head/bin/sh/Makefile
head/bin/sh/bltin/bltin.h
head/bin/sh/builtins.def
head/bin/sh/jobs.c
head/bin/sh/sh.1
head/share/man/man1/builtin.1
Modified: head/bin/kill/kill.1
==============================================================================
--- head/bin/kill/kill.1 Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/kill/kill.1 Tue Dec 21 22:47:34 2010 (r216629)
@@ -134,6 +134,7 @@ Terminate the process group with PGID 11
.Xr csh 1 ,
.Xr killall 1 ,
.Xr ps 1 ,
+.Xr sh 1 ,
.Xr kill 2 ,
.Xr sigaction 2
.Sh STANDARDS
Modified: head/bin/kill/kill.c
==============================================================================
--- head/bin/kill/kill.c Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/kill/kill.c Tue Dec 21 22:47:34 2010 (r216629)
@@ -49,6 +49,12 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
+#ifdef SHELL
+#define main killcmd
+#include "bltin/bltin.h"
+#include "error.h"
+#endif
+
static void nosig(const char *);
static void printsignals(FILE *);
static int signame_to_signum(const char *);
@@ -75,16 +81,16 @@ main(int argc, char *argv[])
usage();
numsig = strtol(*argv, &ep, 10);
if (!**argv || *ep)
- errx(1, "illegal signal number: %s", *argv);
+ errx(2, "illegal signal number: %s", *argv);
if (numsig >= 128)
numsig -= 128;
if (numsig <= 0 || numsig >= sys_nsig)
nosig(*argv);
printf("%s\n", sys_signame[numsig]);
- exit(0);
+ return (0);
}
printsignals(stdout);
- exit(0);
+ return (0);
}
if (!strcmp(*argv, "-s")) {
@@ -107,7 +113,7 @@ main(int argc, char *argv[])
} else if (isdigit(**argv)) {
numsig = strtol(*argv, &ep, 10);
if (!**argv || *ep)
- errx(1, "illegal signal number: %s", *argv);
+ errx(2, "illegal signal number: %s", *argv);
if (numsig < 0)
nosig(*argv);
} else
@@ -122,16 +128,23 @@ main(int argc, char *argv[])
usage();
for (errors = 0; argc; argc--, argv++) {
- pid = strtol(*argv, &ep, 10);
- if (!**argv || *ep)
- errx(1, "illegal process id: %s", *argv);
- else if (kill(pid, numsig) == -1) {
+#ifdef SHELL
+ if (**argv == '%')
+ pid = getjobpgrp(*argv);
+ else
+#endif
+ {
+ pid = strtol(*argv, &ep, 10);
+ if (!**argv || *ep)
+ errx(2, "illegal process id: %s", *argv);
+ }
+ if (kill(pid, numsig) == -1) {
warn("%s", *argv);
errors = 1;
}
}
- exit(errors);
+ return (errors);
}
static int
@@ -154,7 +167,11 @@ nosig(const char *name)
warnx("unknown signal %s; valid signals:", name);
printsignals(stderr);
- exit(1);
+#ifdef SHELL
+ error(NULL);
+#else
+ exit(2);
+#endif
}
static void
@@ -180,5 +197,9 @@ usage(void)
" kill -l [exit_status]",
" kill -signal_name pid ...",
" kill -signal_number pid ...");
- exit(1);
+#ifdef SHELL
+ error(NULL);
+#else
+ exit(2);
+#endif
}
Modified: head/bin/sh/Makefile
==============================================================================
--- head/bin/sh/Makefile Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/sh/Makefile Tue Dec 21 22:47:34 2010 (r216629)
@@ -4,7 +4,7 @@
PROG= sh
INSTALLFLAGS= -S
SHSRCS= alias.c arith.y arith_lex.l cd.c echo.c error.c eval.c exec.c expand.c \
- histedit.c input.c jobs.c mail.c main.c memalloc.c miscbltin.c \
+ histedit.c input.c jobs.c kill.c mail.c main.c memalloc.c miscbltin.c \
mystring.c options.c output.c parser.c printf.c redir.c show.c \
test.c trap.c var.c
GENSRCS= builtins.c init.c nodes.c syntax.c
@@ -26,6 +26,7 @@ WARNS?= 2
WFORMAT=0
.PATH: ${.CURDIR}/bltin \
+ ${.CURDIR}/../kill \
${.CURDIR}/../test \
${.CURDIR}/../../usr.bin/printf
Modified: head/bin/sh/bltin/bltin.h
==============================================================================
--- head/bin/sh/bltin/bltin.h Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/sh/bltin/bltin.h Tue Dec 21 22:47:34 2010 (r216629)
@@ -43,6 +43,7 @@
#include "../mystring.h"
#ifdef SHELL
#include "../output.h"
+#define FILE struct output
#undef stdout
#define stdout out1
#undef stderr
@@ -58,6 +59,7 @@
#define fflush flushout
#define INITARGS(argv)
#define warnx warning
+#define warn(fmt, ...) warning(fmt ": %s", __VA_ARGS__, strerror(errno))
#define errx(exitstatus, ...) error(__VA_ARGS__)
#else
@@ -67,8 +69,11 @@
#define INITARGS(argv) if ((commandname = argv[0]) == NULL) {fputs("Argc is zero\n", stderr); exit(2);} else
#endif
+#include <unistd.h>
+
pointer stalloc(int);
void error(const char *, ...) __printf0like(1, 2);
+pid_t getjobpgrp(char *);
int echocmd(int, char **);
int testcmd(int, char **);
Modified: head/bin/sh/builtins.def
==============================================================================
--- head/bin/sh/builtins.def Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/sh/builtins.def Tue Dec 21 22:47:34 2010 (r216629)
@@ -70,6 +70,7 @@ hashcmd hash
histcmd -h fc
jobidcmd jobid
jobscmd jobs
+killcmd kill
localcmd local
printfcmd printf
pwdcmd pwd
Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/sh/jobs.c Tue Dec 21 22:47:34 2010 (r216629)
@@ -632,6 +632,14 @@ currentjob: if ((jp = getcurjob(NULL)) =
}
+pid_t
+getjobpgrp(char *name)
+{
+ struct job *jp;
+
+ jp = getjob(name);
+ return -jp->ps[0].pid;
+}
/*
* Return a new job structure,
Modified: head/bin/sh/sh.1
==============================================================================
--- head/bin/sh/sh.1 Tue Dec 21 22:03:12 2010 (r216628)
+++ head/bin/sh/sh.1 Tue Dec 21 22:47:34 2010 (r216629)
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd December 3, 2010
+.Dd December 21, 2010
.Dt SH 1
.Os
.Sh NAME
@@ -2049,6 +2049,10 @@ If the
.Fl s
option is specified, only the PIDs of the job commands are printed, one per
line.
+.It Ic kill
+A built-in equivalent of
+.Xr kill 1
+that additionally supports sending signals to jobs.
.It Ic local Oo Ar variable ... Oc Op Fl
See the
.Sx Functions
@@ -2477,6 +2481,7 @@ will return the argument.
.Xr echo 1 ,
.Xr ed 1 ,
.Xr emacs 1 ,
+.Xr kill 1 ,
.Xr printf 1 ,
.Xr pwd 1 ,
.Xr test 1 ,
Modified: head/share/man/man1/builtin.1
==============================================================================
--- head/share/man/man1/builtin.1 Tue Dec 21 22:03:12 2010 (r216628)
+++ head/share/man/man1/builtin.1 Tue Dec 21 22:47:34 2010 (r216629)
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 19, 2010
+.Dd December 21, 2010
.Dt BUILTIN 1
.Os
.Sh NAME
@@ -251,7 +251,7 @@ but are implemented as scripts using a b
.It Ic if Ta \&No Ta Yes Ta Yes
.It Ic jobid Ta \&No Ta \&No Ta Yes
.It Ic jobs Ta No** Ta Yes Ta Yes
-.It Ic kill Ta Yes Ta Yes Ta \&No
+.It Ic kill Ta Yes Ta Yes Ta Yes
.It Ic limit Ta \&No Ta Yes Ta \&No
.It Ic local Ta \&No Ta \&No Ta Yes
.It Ic log Ta \&No Ta Yes Ta \&No
More information about the svn-src-all
mailing list