From f47bf1f4e6a3f541e2923ccc99ff4e21f9b60094 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 28 Aug 2000 22:09:38 +0000 Subject: After positive feedback from a few folks, activate a switchover to using killall.c instead of the perl version that depends on procfs. The C version uses sysctl(). The program is based on a hack that was originally written about 6 years ago and has evolved somewhat since then. (which is why it is a superset of killall.pl, rather than being a clone.) With apologies to: wosch --- usr.bin/killall/Makefile | 7 +-- usr.bin/killall/killall.1 | 48 +++++++++++------ usr.bin/killall/killall.c | 5 +- usr.bin/killall/killall.pl | 131 --------------------------------------------- 4 files changed, 36 insertions(+), 155 deletions(-) delete mode 100755 usr.bin/killall/killall.pl (limited to 'usr.bin/killall') diff --git a/usr.bin/killall/Makefile b/usr.bin/killall/Makefile index 0a0ced7..ff772a8 100644 --- a/usr.bin/killall/Makefile +++ b/usr.bin/killall/Makefile @@ -1,10 +1,5 @@ # $FreeBSD$ -MAINTAINER= wosch -MAN1= killall.1 - -beforeinstall: - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - ${.CURDIR}/killall.pl ${DESTDIR}${BINDIR}/killall +PROG= killall .include diff --git a/usr.bin/killall/killall.1 b/usr.bin/killall/killall.1 index c7b3c3e..dbfcf32 100644 --- a/usr.bin/killall/killall.1 +++ b/usr.bin/killall/killall.1 @@ -38,8 +38,11 @@ .Op Fl l .Op Fl m .Op Fl s +.Op Fl u Ar user +.Op Fl t Ar tty +.Op Fl c Ar procname .Op Fl SIGNAL -.Ar procname ... +.Op Ar procname ... .Sh DESCRIPTION .Nm Killall kills processes selected by name, as opposed to the selection by pid @@ -61,12 +64,7 @@ Be more verbose about what will be done. For a single .Fl d option, a list of the processes that will be sent the signal will be printed, or a message indicating that no matching processes have been -found. If the option -.Fl d -has been specified at least twice, the effective UID, PID, and name -of all processes found in -.Xr procfs 5 -will be listed in addition. +found. .It Fl h \&| Ns Fl \&? .It Fl help Give a help on the command usage and exit. @@ -77,12 +75,9 @@ List the names of the available signals and exit, like in Match the argument .Ar procname as a (case insensitive) regular expression against the names -of processes found in -.Xr procfs 5 . +of processes found. CAUTION! This is dangerous, a single dot will match any process -running under the effective UID of the caller. The regular expression -syntax in effect is that used by -.Xr perl 1 . +running under the effective UID of the caller. .It Fl s Show only what would be done, but do not send any signal. .It Fl SIGNAL @@ -91,8 +86,23 @@ Send a different signal instead of the default The signal may be specified either as a name .Pq with \&or without a leading Dv SIG , or numerically. +.It Fl u Ar user +Limit potentially matching processes to those belonging to +the specified +.Ar user . +.It Fl c Ar tty +Limit potentially matching processes to those running on +the specified +.Ar tty . +.It Fl c Ar procname +When used with the +.Fl u +or +.Fl t +flags, limit potentially matching processes to those matching +the specified +.Ar progname . .El - .Sh ALL PROCESSES Sending a signal to all processes with uid .Nm XYZ @@ -102,8 +112,6 @@ So use .Xr kill 1 for this job (e.g. $ kill -TERM -1 or as root $ echo kill -TERM -1 | su -m ) - - .Sh DIAGNOSTICS The .Nm @@ -118,7 +126,7 @@ Diagnostic messages will only be printed if requested by options. .Sh SEE ALSO .Xr kill 1 , -.Xr procfs 5 +.Xr sysctl 3 .Sh HISTORY The .Nm @@ -128,8 +136,14 @@ It has been modeled after the .Nm command as available on other platforms. .Sh AUTHORS -The program has been contributed by +The +.Nm +program was originally written in Perl and was contributed by .An Wolfram Schneider , this manual page has been written by .if n Joerg Wunsch. .if t J\(:org Wunsch. +The current version of +.Nm +was rewritten in C by Peter Wemm using +.Xr sysctl 3 . diff --git a/usr.bin/killall/killall.c b/usr.bin/killall/killall.c index 0cf417d..12de0c8 100644 --- a/usr.bin/killall/killall.c +++ b/usr.bin/killall/killall.c @@ -27,6 +27,7 @@ * $FreeBSD$ */ +#include #include #include #include @@ -46,7 +47,7 @@ static char *prog; -static void +static void __dead2 usage(void) { @@ -138,6 +139,8 @@ main(int ac, char **av) printsig(stdout); exit(0); } + if (strcmp(*av, "-help") == 0) + usage(); if (**av == '-') { ++*av; switch (**av) { diff --git a/usr.bin/killall/killall.pl b/usr.bin/killall/killall.pl deleted file mode 100755 index 6238c7b..0000000 --- a/usr.bin/killall/killall.pl +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) 1995-1996 Wolfram Schneider . Berlin. -# 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. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. -# -# killall - kill processes by name -# -# $FreeBSD$ - - -$ENV{'PATH'} = '/bin:/usr/bin'; # security -$procfs = '/proc'; -$signal = 'SIGTERM'; # default signal for kill -$debug = 0; -$match = 0; # 0 match exactly program name -$show = 0; # do nothings - -# see /sys/miscfs/procfs/procfs_status.c -$PROC_NAME = 0; -$PROC_EUID = 11; -$PROC_RUID = 12; - -sub usage { - $! = 2; - die "killall [-?|-help] [-d] [-l] [-m] [-s] [-SIGNAL] procname ...\n"; -} - -$id = $<; # real uid of this process / your id -while ($_ = $ARGV[0], /^-/) { - shift @ARGV; - if (/^--$/) { $_ = $ARGV[0]; last } - elsif (/^-(h|help|\?)$/) { &usage } - elsif (/^-[dv]$/) { $debug++ } - elsif (/^-l$/) { exec 'kill', '-l' } - elsif (/^-m$/) { $match = 1 } - elsif (/^-s$/) { $show = 1 } - elsif (/^-([a-z][a-z0-9]+|[0-9]+)$/i) { $signal = $1 } - elsif (/^-/) { &usage } -} - -&usage if $#ARGV < 0; # no arguments -die "Maybe $procfs is not mounted\n" unless -e "$procfs/0/status"; - -opendir(PROCFS, "$procfs") || die "$procfs $!\n"; -print " PID EUID RUID COMMAND\n" if $debug > 1; - -undef %pidu; -undef %thiskill; - -foreach (sort{$a <=> $b} grep(/^[0-9]/, readdir(PROCFS))) { - $status = "$procfs/$_/status"; - $pid = $_; - next if $pid == $$; # don't kill yourself - - open(STATUS, "$status") || next; # process maybe already terminated - while() { - @proc = split; - - printf "%5d %5d %5d %s\n", $pid, $proc[$PROC_EUID], - $proc[$PROC_RUID], $proc[$PROC_NAME] if $debug > 1; - - foreach $program (@ARGV) { - # quote meta characters - ($programMatch = $program) =~ s/(\W)/\\$1/g if $match; - - # match program name - if ($proc[$PROC_NAME] eq $program || - ($match && $proc[$PROC_NAME] =~ /$programMatch/i)) { - - # id test - if ($proc[$PROC_EUID] eq $id || # effective uid - $proc[$PROC_RUID] eq $id || # real uid - !$id) # root - { - push(@kill, $pid) if !$pidu{"$pid"}; - $pidu{"$pid"} = $pid; - $thiskill{"$program"}++; - } - - # process exists, but does not belong to you - else { - $notkillable{"$program"}++; - } - } - } - } - close STATUS; -} -closedir PROCFS; - -# nothing found -foreach $program (@ARGV) { - if (!$thiskill{"$program"}) { - print STDERR "No processes matching ``$program''"; - print STDERR " belong to you" if $notkillable{"$program"}; - print STDERR "\n"; - } -} - - -# nothing found -exit(1) if $#kill < 0; - -$signal =~ y/a-z/A-Z/; # signal name in upper case -$signal =~ s/^SIG//; # strip a leading SIG if present -print "kill -$signal @kill\n" if $debug || $show; - -$cnt = kill ($signal, @kill) unless $show; # kill processes -exit(0) if $show || $cnt == $#kill + 1; -exit(1); -- cgit v1.1