diff options
Diffstat (limited to 'usr.bin/pkill/pkill.c')
-rw-r--r-- | usr.bin/pkill/pkill.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/usr.bin/pkill/pkill.c b/usr.bin/pkill/pkill.c index 94bc70c..2547744 100644 --- a/usr.bin/pkill/pkill.c +++ b/usr.bin/pkill/pkill.c @@ -84,6 +84,7 @@ enum listtype { LT_GROUP, LT_TTY, LT_PGRP, + LT_JID, LT_SID }; @@ -235,7 +236,7 @@ main(int argc, char **argv) cflags |= REG_ICASE; break; case 'j': - makelist(&jidlist, LT_GENERIC, optarg); + makelist(&jidlist, LT_JID, optarg); criteria = 1; break; case 'l': @@ -451,12 +452,12 @@ main(int argc, char **argv) } SLIST_FOREACH(li, &jidlist, li_chain) { - if (kp->ki_jid > 0) { - if (li->li_number == 0) - break; - if (kp->ki_jid == (int)li->li_number) - break; - } + /* A particular jail ID, including 0 (not in jail) */ + if (kp->ki_jid == (int)li->li_number) + break; + /* Any jail */ + if (kp->ki_jid > 0 && li->li_number == -1) + break; } if (SLIST_FIRST(&jidlist) != NULL && li == NULL) { selected[i] = 0; @@ -636,6 +637,14 @@ makelist(struct listhead *head, enum listtype type, char *src) if (li->li_number == 0) li->li_number = getsid(mypid); break; + case LT_JID: + if (li->li_number < 0) + errx(STATUS_BADUSAGE, + "Negative jail ID `%s'", sp); + /* For compatibility with old -j */ + if (li->li_number == 0) + li->li_number = -1; /* any jail */ + break; case LT_TTY: usage(); /* NOTREACHED */ @@ -683,6 +692,15 @@ makelist(struct listhead *head, enum listtype type, char *src) li->li_number = st.st_rdev; break; + case LT_JID: + if (strcmp(sp, "none") == 0) + li->li_number = 0; + else if (strcmp(sp, "any") == 0) + li->li_number = -1; + else if (*ep != '\0') + errx(STATUS_BADUSAGE, + "Invalid jail ID `%s'", sp); + break; default: usage(); } |