summaryrefslogtreecommitdiffstats
path: root/bin/pkill
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2015-08-29 02:41:59 +0000
committerjamie <jamie@FreeBSD.org>2015-08-29 02:41:59 +0000
commit9e4b124ba9f2b548c4360e61b1b979fee54875b4 (patch)
treee38abb8a227df077065d2d687582878be10cc65e /bin/pkill
parentb90ab2596fccb7f1eb0655e5a0f8450c61b7f331 (diff)
downloadFreeBSD-src-9e4b124ba9f2b548c4360e61b1b979fee54875b4.zip
FreeBSD-src-9e4b124ba9f2b548c4360e61b1b979fee54875b4.tar.gz
MFC r287012:
Make pkill/pgrep -j ARG take jname, not just jid. PR: 201588 Submitted by: Daniel Shahaf <danielsh at apache.org>
Diffstat (limited to 'bin/pkill')
-rw-r--r--bin/pkill/Makefile4
-rw-r--r--bin/pkill/pkill.122
-rw-r--r--bin/pkill/pkill.c18
-rw-r--r--bin/pkill/tests/pgrep-j_test.sh27
-rw-r--r--bin/pkill/tests/pkill-j_test.sh28
5 files changed, 78 insertions, 21 deletions
diff --git a/bin/pkill/Makefile b/bin/pkill/Makefile
index bb4d865..7dc8c6a 100644
--- a/bin/pkill/Makefile
+++ b/bin/pkill/Makefile
@@ -5,8 +5,8 @@
PROG= pkill
-DPADD= ${LIBKVM}
-LDADD= -lkvm
+DPADD= ${LIBKVM} ${LIBJAIL}
+LDADD= -lkvm -ljail
LINKS= ${BINDIR}/pkill ${BINDIR}/pgrep
MLINKS= pkill.1 pgrep.1
diff --git a/bin/pkill/pkill.1 b/bin/pkill/pkill.1
index 1ca383f..d5a2ea6 100644
--- a/bin/pkill/pkill.1
+++ b/bin/pkill/pkill.1
@@ -29,7 +29,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd August 9, 2013
+.Dd August 21, 2015
.Dt PKILL 1
.Os
.Sh NAME
@@ -47,7 +47,7 @@
.Op Fl c Ar class
.Op Fl d Ar delim
.Op Fl g Ar pgrp
-.Op Fl j Ar jid
+.Op Fl j Ar jail
.Op Fl s Ar sid
.Op Fl t Ar tty
.Op Fl u Ar euid
@@ -63,7 +63,7 @@
.Op Fl U Ar uid
.Op Fl c Ar class
.Op Fl g Ar pgrp
-.Op Fl j Ar jid
+.Op Fl j Ar jail
.Op Fl s Ar sid
.Op Fl t Ar tty
.Op Fl u Ar euid
@@ -149,16 +149,16 @@ or
command.
.It Fl i
Ignore case distinctions in both the process table and the supplied pattern.
-.It Fl j Ar jid
-Restrict matches to processes inside jails with a jail ID in the comma-separated
-list
-.Ar jid .
-The value
+.It Fl j Ar jail
+Restrict matches to processes inside the specified jails.
+The argument
+.Ar jail
+may be
.Dq Li any
-matches processes in any jail.
-The value
+to match processes in any jail,
.Dq Li none
-matches processes not in jail.
+to match processes not in jail,
+or a comma-separated list of jail IDs or names.
.It Fl l
Long output.
For
diff --git a/bin/pkill/pkill.c b/bin/pkill/pkill.c
index add989f..a15620a 100644
--- a/bin/pkill/pkill.c
+++ b/bin/pkill/pkill.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include <grp.h>
#include <errno.h>
#include <locale.h>
+#include <jail.h>
#define STATUS_MATCH 0
#define STATUS_NOMATCH 1
@@ -78,7 +79,7 @@ enum listtype {
LT_GROUP,
LT_TTY,
LT_PGRP,
- LT_JID,
+ LT_JAIL,
LT_SID,
LT_CLASS
};
@@ -245,7 +246,7 @@ main(int argc, char **argv)
cflags |= REG_ICASE;
break;
case 'j':
- makelist(&jidlist, LT_JID, optarg);
+ makelist(&jidlist, LT_JAIL, optarg);
criteria = 1;
break;
case 'l':
@@ -582,7 +583,7 @@ usage(void)
fprintf(stderr,
"usage: %s %s [-F pidfile] [-G gid] [-M core] [-N system]\n"
- " [-P ppid] [-U uid] [-c class] [-g pgrp] [-j jid]\n"
+ " [-P ppid] [-U uid] [-c class] [-g pgrp] [-j jail]\n"
" [-s sid] [-t tty] [-u euid] pattern ...\n",
getprogname(), ustr);
@@ -697,7 +698,7 @@ makelist(struct listhead *head, enum listtype type, char *src)
if (li->li_number == 0)
li->li_number = getsid(mypid);
break;
- case LT_JID:
+ case LT_JAIL:
if (li->li_number < 0)
errx(STATUS_BADUSAGE,
"Negative jail ID `%s'", sp);
@@ -763,15 +764,20 @@ foundtty: if ((st.st_mode & S_IFCHR) == 0)
li->li_number = st.st_rdev;
break;
- case LT_JID:
+ case LT_JAIL: {
+ int jid;
+
if (strcmp(sp, "none") == 0)
li->li_number = 0;
else if (strcmp(sp, "any") == 0)
li->li_number = -1;
+ else if ((jid = jail_getid(sp)) != -1)
+ li->li_number = jid;
else if (*ep != '\0')
errx(STATUS_BADUSAGE,
- "Invalid jail ID `%s'", sp);
+ "Invalid jail ID or name `%s'", sp);
break;
+ }
case LT_CLASS:
li->li_number = -1;
li->li_name = strdup(sp);
diff --git a/bin/pkill/tests/pgrep-j_test.sh b/bin/pkill/tests/pgrep-j_test.sh
index e24e5c2..1d62813 100644
--- a/bin/pkill/tests/pgrep-j_test.sh
+++ b/bin/pkill/tests/pgrep-j_test.sh
@@ -14,7 +14,7 @@ if [ `id -u` -ne 0 ]; then
exit 0
fi
-echo "1..3"
+echo "1..4"
sleep=$(pwd)/sleep.txt
ln -sf /bin/sleep $sleep
@@ -87,5 +87,30 @@ else
fi
[ -f ${PWD}/${base}_3_1.pid ] && kill $(cat $PWD/${base}_3_1.pid)
[ -f ${PWD}/${base}_3_2.pid ] && kill $(cat $PWD/${base}_3_2.pid)
+wait
+
+# test 4 is like test 1 except with jname instead of jid.
+name="pgrep -j <jname>"
+sleep_amount=8
+jail -c path=/ name=${base}_4_1 ip4.addr=127.0.0.1 \
+ command=daemon -p ${PWD}/${base}_4_1.pid $sleep $sleep_amount &
+
+jail -c path=/ name=${base}_4_2 ip4.addr=127.0.0.1 \
+ command=daemon -p ${PWD}/${base}_4_2.pid $sleep $sleep_amount &
+
+sleep 0.5
+
+jname="${base}_4_1,${base}_4_2"
+pid1="$(pgrep -f -x -j "$jname" "$sleep $sleep_amount" | sort)"
+pid2=$(printf "%s\n%s" "$(cat ${PWD}/${base}_4_1.pid)" \
+ $(cat ${PWD}/${base}_4_2.pid) | sort)
+if [ "$pid1" = "$pid2" ]; then
+ echo "ok 4 - $name"
+else
+ echo "not ok 4 - $name # pgrep output: '$(echo $pid1)', pidfile output: '$(echo $pid2)'"
+fi
+[ -f ${PWD}/${base}_4_1.pid ] && kill $(cat ${PWD}/${base}_4_1.pid)
+[ -f ${PWD}/${base}_4_2.pid ] && kill $(cat ${PWD}/${base}_4_2.pid)
+wait
rm -f $sleep
diff --git a/bin/pkill/tests/pkill-j_test.sh b/bin/pkill/tests/pkill-j_test.sh
index 26e185f..0af24cf 100644
--- a/bin/pkill/tests/pkill-j_test.sh
+++ b/bin/pkill/tests/pkill-j_test.sh
@@ -14,7 +14,7 @@ if [ `id -u` -ne 0 ]; then
exit 0
fi
-echo "1..3"
+echo "1..4"
sleep=$(pwd)/sleep.txt
ln -sf /bin/sleep $sleep
@@ -90,5 +90,31 @@ else
fi 2>/dev/null
[ -f ${PWD}/${base}_3_1.pid ] && kill $(cat ${base}_3_1.pid)
[ -f ${PWD}/${base}_3_2.pid ] && kill $(cat ${base}_3_2.pid)
+wait
+
+# test 4 is like test 1 except with jname instead of jid.
+name="pkill -j <jname>"
+sleep_amount=8
+jail -c path=/ name=${base}_4_1 ip4.addr=127.0.0.1 \
+ command=daemon -p ${PWD}/${base}_4_1.pid $sleep $sleep_amount &
+
+jail -c path=/ name=${base}_4_2 ip4.addr=127.0.0.1 \
+ command=daemon -p ${PWD}/${base}_4_2.pid $sleep $sleep_amount &
+
+$sleep $sleep_amount &
+
+sleep 0.5
+
+jname="${base}_4_1,${base}_4_2"
+if pkill -f -j "$jname" $sleep && sleep 0.5 &&
+ ! -f ${PWD}/${base}_4_1.pid &&
+ ! -f ${PWD}/${base}_4_2.pid ; then
+ echo "ok 4 - $name"
+else
+ echo "not ok 4 - $name"
+fi 2>/dev/null
+[ -f ${PWD}/${base}_4_1.pid ] && kill $(cat ${PWD}/${base}_4_1.pid)
+[ -f ${PWD}/${base}_4_2.pid ] && kill $(cat ${PWD}/${base}_4_2.pid)
+wait
rm -f $sleep
OpenPOWER on IntegriCloud