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-head mailing list