]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
MFC posixshm: Add a -j option to posixshmcontrol ls, to specify a jail
authorJamie Gritton <jamie@FreeBSD.org>
Sun, 27 Feb 2022 01:45:28 +0000 (17:45 -0800)
committerJamie Gritton <jamie@FreeBSD.org>
Wed, 2 Mar 2022 23:10:33 +0000 (15:10 -0800)
PR: 257556
Reported by: grembo@

(cherry picked from commit be7cf3f4b8c2818155f5a4a83c64c9ef6a60a320)

usr.bin/posixshmcontrol/Makefile
usr.bin/posixshmcontrol/posixshmcontrol.1
usr.bin/posixshmcontrol/posixshmcontrol.c

index c6f847e1847831e07d0f28b8f27a5460ea369131..e5e9588df7bb407ef9c73b66deb4d266758ecc3a 100644 (file)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
 PROG=   posixshmcontrol
-LIBADD=        util
+LIBADD=        jail util
 
 .include <bsd.prog.mk>
index f6743b070b50f8c98b34a51bd905313766b77672..1d8c3438b165adc70d1e40f4511e4a5af4028b16 100644 (file)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 18, 2020
+.Dd February 26, 2022
 .Dt POSIXSHMCONTROL 1
 .Os
 .Sh NAME
@@ -45,6 +45,7 @@
 .Ar ls
 .Op Fl h
 .Op Fl n
+.Op Fl j Ar jail
 .Nm
 .Ar dump
 .Op Pa path \&...
@@ -87,6 +88,11 @@ Unlink the paths specified.
 .It Ic ls
 List all linked named shared memory segments visible to the caller.
 For each segment, the user and group owner, size, and path are displayed.
+The
+.Fl j
+option limits the output to segments within the specified
+.Ar jail
+name or id.
 .It Ic dump
 Output raw bytes values from the segment to standard output.
 .It Ic stat
index 47a19b78a9d20bee6a64c903dd12754fb2be9700..f64fcd3dd6634c667f026cd2236c45e2f041732c 100644 (file)
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
 #include <err.h>
 #include <fcntl.h>
 #include <grp.h>
+#include <jail.h>
 #include <libutil.h>
 #include <pwd.h>
 #include <stdbool.h>
@@ -54,7 +55,7 @@ usage(void)
        fprintf(stderr, "Usage:\n"
            "posixshmcontrol create [-m <mode>] [-l <largepage>] <path> ...\n"
            "posixshmcontrol rm <path> ...\n"
-           "posixshmcontrol ls [-h] [-n]\n"
+           "posixshmcontrol ls [-h] [-n] [-j jail]\n"
            "posixshmcontrol dump <path> ...\n"
            "posixshmcontrol stat [-h] [-n] <path> ...\n"
            "posixshmcontrol truncate [-s <newlen>] <path> ...\n");
@@ -221,17 +222,19 @@ shm_decode_mode(mode_t m, char *str)
 static int
 list_shm(int argc, char **argv)
 {
-       char *buf, *bp, sizebuf[8], str[10];
+       char *buf, *bp, *ep, jailpath[MAXPATHLEN], sizebuf[8], str[10];
+       const char *jailparam;
        const struct kinfo_file *kif;
        struct stat st;
-       int c, error, fd, mib[3], ret;
-       size_t len, miblen;
-       bool hsize, uname;
+       int c, error, fd, jid, mib[3], ret;
+       size_t len, jailpathlen, miblen;
+       bool hsize, jailed, uname;
 
        hsize = false;
+       jailed = false;
        uname = true;
 
-       while ((c = getopt(argc, argv, "hn")) != -1) {
+       while ((c = getopt(argc, argv, "hj:n")) != -1) {
                switch (c) {
                case 'h':
                        hsize = true;
@@ -239,6 +242,28 @@ list_shm(int argc, char **argv)
                case 'n':
                        uname = false;
                        break;
+               case 'j':
+                       jid = strtoul(optarg, &ep, 10);
+                       if (ep > optarg && !*ep) {
+                               jailparam = "jid";
+                               jailed = jid > 0;
+                       } else {
+                               jailparam = "name";
+                               jailed = true;
+                       }
+                       if (jailed) {
+                               if (jail_getv(0, jailparam, optarg, "path",
+                                   jailpath, NULL) < 0) {
+                                       if (errno == ENOENT)
+                                               warnx("no such jail: %s", optarg);
+                                       else
+                                               warnx("%s", jail_errmsg);
+                                       return (1);
+                               }
+                               jailpathlen = strlen(jailpath);
+                               jailpath[jailpathlen] = '/';
+                       }
+                       break;
                default:
                        usage();
                        return (2);
@@ -279,6 +304,8 @@ list_shm(int argc, char **argv)
                kif = (const struct kinfo_file *)(void *)bp;
                if (kif->kf_structsize == 0)
                        break;
+               if (jailed && strncmp(kif->kf_path, jailpath, jailpathlen + 1))
+                       continue;
                fd = shm_open(kif->kf_path, O_RDONLY, 0);
                if (fd == -1) {
                        warn("open %s", kif->kf_path);