Author: jamie
Date: Tue Jul  3 23:47:20 2018
New Revision: 335921
URL: https://svnweb.freebsd.org/changeset/base/335921

Log:
  Allow jail names (not just IDs) to be specified for: cpuset(1), ipfw(8),
   sockstat(1), ugidfw(8)
  These are the last of the jail-aware userland utilities that didn't work
   with names.
  
  PR:           229266
  MFC after:    3 days
  Differential Revision:        D16047

Modified:
  head/lib/libugidfw/ugidfw.c
  head/sbin/ipfw/Makefile
  head/sbin/ipfw/ipfw.8
  head/sbin/ipfw/ipfw2.c
  head/usr.bin/cpuset/Makefile
  head/usr.bin/cpuset/cpuset.1
  head/usr.bin/cpuset/cpuset.c
  head/usr.bin/sockstat/Makefile
  head/usr.bin/sockstat/sockstat.1
  head/usr.bin/sockstat/sockstat.c

Modified: head/lib/libugidfw/ugidfw.c
==============================================================================
--- head/lib/libugidfw/ugidfw.c Tue Jul  3 23:45:02 2018        (r335920)
+++ head/lib/libugidfw/ugidfw.c Tue Jul  3 23:47:20 2018        (r335921)
@@ -34,9 +34,11 @@
  */
 #include <sys/param.h>
 #include <sys/errno.h>
+#include <sys/jail.h>
 #include <sys/time.h>
 #include <sys/sysctl.h>
 #include <sys/ucred.h>
+#include <sys/uio.h>
 #include <sys/mount.h>
 
 #include <security/mac_bsdextended/mac_bsdextended.h>
@@ -600,16 +602,45 @@ bsde_parse_gidrange(char *spec, gid_t *min, gid_t *max
 }
 
 static int
+bsde_get_jailid(const char *name, size_t buflen, char *errstr)
+{
+       char *ep;
+       int jid;
+       struct iovec jiov[4];
+
+       /* Copy jail_getid(3) instead of messing with library dependancies */
+       jid = strtoul(name, &ep, 10);
+       if (*name && !*ep)
+               return jid;
+       jiov[0].iov_base = __DECONST(char *, "name");
+       jiov[0].iov_len = sizeof("name");
+       jiov[1].iov_len = strlen(name) + 1;
+       jiov[1].iov_base = alloca(jiov[1].iov_len);
+       strcpy(jiov[1].iov_base, name);
+       if (errstr && buflen) {
+               jiov[2].iov_base = __DECONST(char *, "errmsg");
+               jiov[2].iov_len = sizeof("errmsg");
+               jiov[3].iov_base = errstr;
+               jiov[3].iov_len = buflen;
+               errstr[0] = 0;
+               jid = jail_get(jiov, 4, 0);
+               if (jid < 0 && !errstr[0])
+                       snprintf(errstr, buflen, "jail_get: %s",
+                           strerror(errno));
+       } else
+               jid = jail_get(jiov, 2, 0);
+       return jid;
+}
+
+static int
 bsde_parse_subject(int argc, char *argv[],
     struct mac_bsdextended_subject *subject, size_t buflen, char *errstr)
 {
        int not_seen, flags;
        int current, neg, nextnot;
-       char *endp;
        uid_t uid_min, uid_max;
        gid_t gid_min, gid_max;
        int jid = 0;
-       long value;
 
        current = 0;
        flags = 0;
@@ -668,13 +699,9 @@ bsde_parse_subject(int argc, char *argv[],
                                snprintf(errstr, buflen, "one jail only");
                                return (-1);
                        }
-                       value = strtol(argv[current+1], &endp, 10);
-                       if (*endp != '\0') {
-                               snprintf(errstr, buflen, "invalid jid: '%s'",
-                                   argv[current+1]);
+                       jid = bsde_get_jailid(argv[current+1], buflen, errstr);
+                       if (jid < 0)
                                return (-1);
-                       }
-                       jid = value;
                        flags |= MBS_PRISON_DEFINED;
                        if (nextnot) {
                                neg ^= MBS_PRISON_DEFINED;

Modified: head/sbin/ipfw/Makefile
==============================================================================
--- head/sbin/ipfw/Makefile     Tue Jul  3 23:45:02 2018        (r335920)
+++ head/sbin/ipfw/Makefile     Tue Jul  3 23:47:20 2018        (r335921)
@@ -13,7 +13,7 @@ SRCS+=        altq.c
 CFLAGS+=-DPF
 .endif
 
-LIBADD=        util
+LIBADD=        jail util
 MAN=   ipfw.8
 
 .include <bsd.prog.mk>

Modified: head/sbin/ipfw/ipfw.8
==============================================================================
--- head/sbin/ipfw/ipfw.8       Tue Jul  3 23:45:02 2018        (r335920)
+++ head/sbin/ipfw/ipfw.8       Tue Jul  3 23:47:20 2018        (r335921)
@@ -1,7 +1,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 28, 2018
+.Dd July 3, 2018
 .Dt IPFW 8
 .Os
 .Sh NAME
@@ -1535,10 +1535,10 @@ Matches all TCP or UDP packets sent by or received for
 A
 .Ar group
 may be specified by name or number.
-.It Cm jail Ar prisonID
+.It Cm jail Ar jail
 Matches all TCP or UDP packets sent by or received for the
-jail whos prison ID is
-.Ar prisonID .
+jail whose ID or name is
+.Ar jail .
 .It Cm icmptypes Ar types
 Matches ICMP packets whose ICMP type is in the list
 .Ar types .

Modified: head/sbin/ipfw/ipfw2.c
==============================================================================
--- head/sbin/ipfw/ipfw2.c      Tue Jul  3 23:45:02 2018        (r335920)
+++ head/sbin/ipfw/ipfw2.c      Tue Jul  3 23:47:20 2018        (r335921)
@@ -32,6 +32,7 @@
 #include <err.h>
 #include <errno.h>
 #include <grp.h>
+#include <jail.h>
 #include <netdb.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -4581,13 +4582,12 @@ read_options:
                case TOK_JAIL:
                        NEED1("jail requires argument");
                    {
-                       char *end;
                        int jid;
 
                        cmd->opcode = O_JAIL;
-                       jid = (int)strtol(*av, &end, 0);
-                       if (jid < 0 || *end != '\0')
-                               errx(EX_DATAERR, "jail requires prison ID");
+                       jid = jail_getid(*av);
+                       if (jid < 0)
+                               errx(EX_DATAERR, "%s", jail_errmsg);
                        cmd32->d[0] = (uint32_t)jid;
                        cmd->len |= F_INSN_SIZE(ipfw_insn_u32);
                        av++;

Modified: head/usr.bin/cpuset/Makefile
==============================================================================
--- head/usr.bin/cpuset/Makefile        Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/cpuset/Makefile        Tue Jul  3 23:47:20 2018        
(r335921)
@@ -2,4 +2,6 @@
 
 PROG=   cpuset
 
+LIBADD=        jail
+
 .include <bsd.prog.mk>

Modified: head/usr.bin/cpuset/cpuset.1
==============================================================================
--- head/usr.bin/cpuset/cpuset.1        Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/cpuset/cpuset.1        Tue Jul  3 23:47:20 2018        
(r335921)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 26, 2018
+.Dd July 3, 2018
 .Dt CPUSET 1
 .Os
 .Sh NAME
@@ -56,7 +56,7 @@
 .Nm
 .Fl g
 .Op Fl cir
-.Op Fl d Ar domain | Fl j Ar jailid | Fl p Ar pid | Fl t Ar tid | Fl s Ar 
setid | Fl x Ar irq
+.Op Fl d Ar domain | Fl j Ar jail | Fl p Ar pid | Fl t Ar tid | Fl s Ar setid 
| Fl x Ar irq
 .Sh DESCRIPTION
 The
 .Nm
@@ -68,7 +68,7 @@ available processors and memory domains in the system.
 .Nm
 requires a target to modify or query.
 The target may be specified as a command, process id, thread id, a
-cpuset id, an irq, a jail id, or a NUMA domain.
+cpuset id, an irq, a jail, or a NUMA domain.
 Using
 .Fl g
 the target's set id or mask may be queried.
@@ -136,8 +136,8 @@ the id of the target.
 When used with the
 .Fl g
 option print the id rather than the valid mask of the target.
-.It Fl j Ar jailid
-Specifies a jail id as the target of the operation.
+.It Fl j Ar jail
+Specifies a jail id or name as the target of the operation.
 .It Fl l Ar cpu-list
 Specifies a list of CPUs to apply to a target.
 Specification may include

Modified: head/usr.bin/cpuset/cpuset.c
==============================================================================
--- head/usr.bin/cpuset/cpuset.c        Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/cpuset/cpuset.c        Tue Jul  3 23:47:20 2018        
(r335921)
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <jail.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -320,7 +321,9 @@ main(int argc, char *argv[])
                case 'j':
                        jflag = 1;
                        which = CPU_WHICH_JAIL;
-                       id = atoi(optarg);
+                       id = jail_getid(optarg);
+                       if (id < 0)
+                               errx(EXIT_FAILURE, "%s", jail_errmsg);
                        break;
                case 'l':
                        lflag = 1;

Modified: head/usr.bin/sockstat/Makefile
==============================================================================
--- head/usr.bin/sockstat/Makefile      Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/sockstat/Makefile      Tue Jul  3 23:47:20 2018        
(r335921)
@@ -2,4 +2,6 @@
 
 PROG=          sockstat
 
+LIBADD=                jail
+
 .include <bsd.prog.mk>

Modified: head/usr.bin/sockstat/sockstat.1
==============================================================================
--- head/usr.bin/sockstat/sockstat.1    Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/sockstat/sockstat.1    Tue Jul  3 23:47:20 2018        
(r335921)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 23, 2018
+.Dd July 3, 2018
 .Dt SOCKSTAT 1
 .Os
 .Sh NAME
@@ -58,8 +58,8 @@ Show
 (IPv6) sockets.
 .It Fl c
 Show connected sockets.
-.It Fl j Ar jid
-Show only sockets belonging to the specified jail ID.
+.It Fl j Ar jail
+Show only sockets belonging to the specified jail ID or name.
 .It Fl L
 Only show Internet sockets if the local and foreign addresses are not
 in the loopback network prefix

Modified: head/usr.bin/sockstat/sockstat.c
==============================================================================
--- head/usr.bin/sockstat/sockstat.c    Tue Jul  3 23:45:02 2018        
(r335920)
+++ head/usr.bin/sockstat/sockstat.c    Tue Jul  3 23:47:20 2018        
(r335921)
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <jail.h>
 #include <netdb.h>
 #include <pwd.h>
 #include <stdarg.h>
@@ -1263,7 +1264,9 @@ main(int argc, char *argv[])
                        opt_c = 1;
                        break;
                case 'j':
-                       opt_j = atoi(optarg);
+                       opt_j = jail_getid(optarg);
+                       if (opt_j < 0)
+                               errx(1, "%s", jail_errmsg);
                        break;
                case 'L':
                        opt_L = 1;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to