On Fri, 2014-05-02 at 15:05 +0000, Bryan Drewery wrote:
> Author: bdrewery
> Date: Fri May  2 15:05:47 2014
> New Revision: 265229
> URL: http://svnweb.freebsd.org/changeset/base/265229
> 
> Log:
>   Add -J to filter by matching jail IDs and names.
>   
>   -J 0 can be used to show only host processes.
>   
>   Patch partially based on work by bz@
>   
>   PR:         bin/78763
>   MFC after:  2 weeks
>   Relnotes:   yes
> 
> Modified:
>   head/bin/ps/Makefile
>   head/bin/ps/ps.1
>   head/bin/ps/ps.c
> 
> Modified: head/bin/ps/Makefile
> ==============================================================================
> --- head/bin/ps/Makefile      Fri May  2 14:47:53 2014        (r265228)
> +++ head/bin/ps/Makefile      Fri May  2 15:05:47 2014        (r265229)
> @@ -11,7 +11,7 @@ SRCS=       fmt.c keyword.c nlist.c print.c ps
>  # on large systems.
>  #
>  CFLAGS+=-DLAZY_PS
> -DPADD=       ${LIBM} ${LIBKVM}
> -LDADD=       -lm -lkvm
> +DPADD=       ${LIBM} ${LIBKVM} ${LIBJAIL}
> +LDADD=       -lm -lkvm -ljail
>  
>  .include <bsd.prog.mk>
> 
> Modified: head/bin/ps/ps.1
> ==============================================================================
> --- head/bin/ps/ps.1  Fri May  2 14:47:53 2014        (r265228)
> +++ head/bin/ps/ps.1  Fri May  2 15:05:47 2014        (r265229)
> @@ -29,7 +29,7 @@
>  .\"     @(#)ps.1     8.3 (Berkeley) 4/18/94
>  .\" $FreeBSD$
>  .\"
> -.Dd December 27, 2013
> +.Dd May 2, 2014
>  .Dt PS 1
>  .Os
>  .Sh NAME
> @@ -40,6 +40,7 @@
>  .Op Fl aCcdefHhjlmrSTuvwXxZ
>  .Op Fl O Ar fmt | Fl o Ar fmt
>  .Op Fl G Ar gid Ns Op , Ns Ar gid Ns Ar ...
> +.Op Fl J Ar jid Ns Op , Ns Ar jid Ns Ar ...
>  .Op Fl M Ar core
>  .Op Fl N Ar system
>  .Op Fl p Ar pid Ns Op , Ns Ar pid Ns Ar ...
> @@ -62,7 +63,7 @@ will also display processes that do not 
>  .Pp
>  A different set of processes can be selected for display by using any
>  combination of the
> -.Fl a , G , p , T , t ,
> +.Fl a , G , J , p , T , t ,
>  and
>  .Fl U
>  options.
> @@ -152,6 +153,20 @@ Print information associated with the fo
>  .Cm user , pid , ppid , pgid , sid , jobc , state , tt , time ,
>  and
>  .Cm command .
> +.It Fl J
> +Display information about processes which match the specified jail IDs.
> +This may be either the
> +.Cm jid
> +or
> +.Cm name
> +of the jail.
> +Use
> +.Fl J
> +.Sy 0
> +to display only host processes.
> +This flag implies
> +.Fl x
> +by default.
>  .It Fl L
>  List the set of keywords available for the
>  .Fl O
> 
> Modified: head/bin/ps/ps.c
> ==============================================================================
> --- head/bin/ps/ps.c  Fri May  2 14:47:53 2014        (r265228)
> +++ head/bin/ps/ps.c  Fri May  2 15:05:47 2014        (r265229)
> @@ -50,6 +50,7 @@ static char sccsid[] = "@(#)ps.c    8.4 (Be
>  __FBSDID("$FreeBSD$");
>  
>  #include <sys/param.h>
> +#include <sys/jail.h>
>  #include <sys/proc.h>
>  #include <sys/user.h>
>  #include <sys/stat.h>
> @@ -62,6 +63,7 @@ __FBSDID("$FreeBSD$");
>  #include <errno.h>
>  #include <fcntl.h>
>  #include <grp.h>
> +#include <jail.h>
>  #include <kvm.h>
>  #include <limits.h>
>  #include <locale.h>
> @@ -124,6 +126,7 @@ struct listinfo {
>       const char      *lname;
>       union {
>               gid_t   *gids;
> +             int     *jids;
>               pid_t   *pids;
>               dev_t   *ttys;
>               uid_t   *uids;
> @@ -132,6 +135,7 @@ struct listinfo {
>  };
>  
>  static int    addelem_gid(struct listinfo *, const char *);
> +static int    addelem_jid(struct listinfo *, const char *);
>  static int    addelem_pid(struct listinfo *, const char *);
>  static int    addelem_tty(struct listinfo *, const char *);
>  static int    addelem_uid(struct listinfo *, const char *);
> @@ -163,12 +167,12 @@ static char vfmt[] = "pid,state,time,sl,
>                       "%cpu,%mem,command";
>  static char Zfmt[] = "label";
>  
> -#define      PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjLlM:mN:O:o:p:rSTt:U:uvwXxZ"
> +#define      PS_ARGS "AaCcde" OPT_LAZY_f "G:gHhjJ:LlM:mN:O:o:p:rSTt:U:uvwXxZ"
>  
>  int
>  main(int argc, char *argv[])
>  {
> -     struct listinfo gidlist, pgrplist, pidlist;
> +     struct listinfo gidlist, jidlist, pgrplist, pidlist;
>       struct listinfo ruidlist, sesslist, ttylist, uidlist;
>       struct kinfo_proc *kp;
>       KINFO *kinfo = NULL, *next_KINFO;
> @@ -208,6 +212,7 @@ main(int argc, char *argv[])
>       prtheader = showthreads = wflag = xkeep_implied = 0;
>       xkeep = -1;                     /* Neither -x nor -X. */
>       init_list(&gidlist, addelem_gid, sizeof(gid_t), "group");
> +     init_list(&jidlist, addelem_jid, sizeof(int), "jail id");
>       init_list(&pgrplist, addelem_pid, sizeof(pid_t), "process group");
>       init_list(&pidlist, addelem_pid, sizeof(pid_t), "process id");
>       init_list(&ruidlist, addelem_uid, sizeof(uid_t), "ruser");
> @@ -275,6 +280,11 @@ main(int argc, char *argv[])
>               case 'h':
>                       prtheader = ws.ws_row > 5 ? ws.ws_row : 22;
>                       break;
> +             case 'J':
> +                     add_list(&jidlist, optarg);
> +                     xkeep_implied = 1;
> +                     nselectors++;
> +                     break;
>               case 'j':
>                       parsefmt(jfmt, 0);
>                       _fmt = 1;
> @@ -538,6 +548,11 @@ main(int argc, char *argv[])
>                                       if (kp->ki_rgid == gidlist.l.gids[elem])
>                                               goto keepit;
>                       }
> +                     if (jidlist.count > 0) {
> +                             for (elem = 0; elem < jidlist.count; elem++)
> +                                     if (kp->ki_jid == jidlist.l.jids[elem])
> +                                             goto keepit;
> +                     }
>                       if (pgrplist.count > 0) {
>                               for (elem = 0; elem < pgrplist.count; elem++)
>                                       if (kp->ki_pgid ==
> @@ -666,6 +681,7 @@ main(int argc, char *argv[])
>               }
>       }
>       free_list(&gidlist);
> +     free_list(&jidlist);
>       free_list(&pidlist);
>       free_list(&pgrplist);
>       free_list(&ruidlist);
> @@ -727,6 +743,30 @@ addelem_gid(struct listinfo *inf, const 
>  }
>  
>  static int
> +addelem_jid(struct listinfo *inf, const char *elem)
> +{
> +     int tempid;
> +
> +     if (*elem == '\0') {
> +             warnx("Invalid (zero-length) jail id");
> +             optfatal = 1;
> +             return (0);             /* Do not add this value. */
> +     }
> +
> +     tempid = jail_getid(elem);
> +     if (tempid < 0) {
> +             warnx("Invalid %s: %s", inf->lname, elem);
> +             optfatal = 1;
> +             return (0);
> +     }
> +
> +     if (inf->count >= inf->maxcount)
> +             expand_list(inf);
> +     inf->l.jids[(inf->count)++] = tempid;
> +     return (1);
> +}
> +
> +static int
>  addelem_pid(struct listinfo *inf, const char *elem)
>  {
>       char *endp;
> @@ -1373,7 +1413,7 @@ usage(void)
>  
>       (void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
>           "usage: ps " SINGLE_OPTS " [-O fmt | -o fmt] [-G gid[,gid...]]",
> -         "          [-M core] [-N system]",
> +         "          [-J jid[,jid...]] [-M core] [-N system]",
>           "          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]",
>           "       ps [-L]");
>       exit(1);
> 

I'm getting an error building rescue after this change:

--- rescue.all__D ---
ps.lo: In function `_$$hide$$ ps.lo $a':
_$$hide$$ ps.lo ps.c:(.text+0x26ec): undefined reference to `jail_getid'
*** [rescue] Error code 1

bmake[4]: stopped
in 
/local/build/staging/freebsd/wand/obj/arm.armv6/local/build/staging/freebsd/wand/src/rescue/rescue
1 error

This is on arm, building with gcc, but I'm not sure whether that's
germane or not.

-- Ian


_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to