From owner-svn-src-head@FreeBSD.ORG Tue Dec 21 22:47:35 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6685A106566B; Tue, 21 Dec 2010 22:47:35 +0000 (UTC) (envelope-from jilles@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 542798FC08; Tue, 21 Dec 2010 22:47:35 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id oBLMlZdQ077724; Tue, 21 Dec 2010 22:47:35 GMT (envelope-from jilles@svn.freebsd.org) Received: (from jilles@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oBLMlZdr077715; Tue, 21 Dec 2010 22:47:35 GMT (envelope-from jilles@svn.freebsd.org) Message-Id: <201012212247.oBLMlZdr077715@svn.freebsd.org> From: Jilles Tjoelker Date: Tue, 21 Dec 2010 22:47:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r216629 - in head: bin/kill bin/sh bin/sh/bltin share/man/man1 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Dec 2010 22:47:35 -0000 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 #include +#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 + 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