]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: add TUN.IFFACE, a column for interfaces behind tun devices
authorMasatake YAMATO <yamato@redhat.com>
Sun, 25 Jun 2023 17:41:33 +0000 (02:41 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Mon, 26 Jun 2023 16:21:42 +0000 (01:21 +0900)
An example output:

  # ./lsfd -Q '(SOURCE == "misc:tun")'  -o+TUN.IFACE
  COMMAND             PID       USER ASSOC MODE TYPE   SOURCE MNTID INODE NAME          TUN.IFACE
  qemu-system-x86 2846033       qemu    48  rw-  CHR misc:tun    23   306 iface=vnet89     vnet89
  qemu-system-x86 2865022       qemu    56  rw-  CHR misc:tun    23   306 iface=vnet103   vnet103
  openvpn         3113730 nm-openvpn     7  rw-  CHR misc:tun   588   306 iface=tun0         tun0
  qemu-system-x86 3608136       qemu    36  rw-  CHR misc:tun    23   306 iface=vnet104   vnet104
  qemu-system-x86 3608136       qemu    39  rw-  CHR misc:tun    23   306 iface=vnet105   vnet105
  qemu-system-x86 3608238       qemu    40  rw-  CHR misc:tun    23   306 iface=vnet106   vnet106
  qemu-system-x86 3608238       qemu    43  rw-  CHR misc:tun    23   306 iface=vnet107   vnet107
  qemu-system-x86 3608338       qemu    54  rw-  CHR misc:tun    23   306 iface=vnet108   vnet108
  qemu-system-x86 3608338       qemu    60  rw-  CHR misc:tun    23   306 iface=vnet109   vnet109

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
misc-utils/lsfd-cdev.c
misc-utils/lsfd.1.adoc
misc-utils/lsfd.c
misc-utils/lsfd.h

index 4b37b128adbc73601e4f151d44225d2f34d28189..5f0f306500b7463f88761ac2ebbf009894a03ade 100644 (file)
@@ -255,7 +255,82 @@ static struct cdev_ops cdev_misc_ops = {
        .fill_column = cdev_misc_fill_column,
 };
 
+/*
+ * tun devcie driver
+ */
+static bool cdev_tun_probe(const struct cdev *cdev)
+{
+       const char *miscdev;
+
+       if ((!cdev->devdrv) || strcmp(cdev->devdrv, "misc"))
+               return false;
+
+       miscdev = get_miscdev(minor(cdev->file.stat.st_rdev));
+       if (miscdev && strcmp(miscdev, "tun") == 0)
+               return true;
+       return false;
+}
+
+static void cdev_tun_free(const struct cdev *cdev)
+{
+       if (cdev->cdev_data)
+               free(cdev->cdev_data);
+}
+
+static char * cdev_tun_get_name(struct cdev *cdev)
+{
+       char *str = NULL;
+
+       if (cdev->cdev_data == NULL)
+               return NULL;
+
+       xasprintf(&str, "iface=%s", (const char *)cdev->cdev_data);
+       return str;
+}
+
+static bool cdev_tun_fill_column(struct proc *proc  __attribute__((__unused__)),
+                                struct cdev *cdev,
+                                struct libscols_line *ln __attribute__((__unused__)),
+                                int column_id,
+                                size_t column_index __attribute__((__unused__)),
+                                char **str)
+{
+       switch(column_id) {
+       case COL_MISCDEV:
+               *str = xstrdup("tun");
+               return true;
+       case COL_SOURCE:
+               *str = xstrdup("misc:tun");
+               return true;
+       case COL_TUN_IFACE:
+               if (cdev->cdev_data) {
+                       *str = xstrdup(cdev->cdev_data);
+                       return true;
+               }
+       }
+       return false;
+}
+
+static int cdev_tun_handle_fdinfo(struct cdev *cdev, const char *key, const char *val)
+{
+       if (strcmp(key, "iff") == 0 && cdev->cdev_data == NULL) {
+               cdev->cdev_data = xstrdup(val);
+               return 1;
+       }
+       return false;
+}
+
+static struct cdev_ops cdev_tun_ops = {
+       .parent = &cdev_misc_ops,
+       .probe = cdev_tun_probe,
+       .free  = cdev_tun_free,
+       .get_name = cdev_tun_get_name,
+       .fill_column = cdev_tun_fill_column,
+       .handle_fdinfo = cdev_tun_handle_fdinfo,
+};
+
 static const struct cdev_ops *cdev_ops[] = {
+       &cdev_tun_ops,
        &cdev_misc_ops,
        &cdev_generic_ops                 /* This must be at the end. */
 };
index ee53cec4992b79c3f33688201ab85e7140dd8246..8a78d8e23338123683e3c8cb5f036d1a3f5f077b 100644 (file)
@@ -247,6 +247,9 @@ id=_EVENTFD.ID_
 inotify:::
 inodes=_INOTIFY.INODES_
 +
+misc:tun:::
+iface=_TUN.IFACE_
++
 NETLINK:::
 protocol=_NETLINK.PROTOCOL_[ lport=_NETLINK.LPORT_[ group=_NETLINK.GROUPS_]]
 +
@@ -426,6 +429,9 @@ Interval.
 TIMERFD.REMAINING <``number``>::
 Remaining time.
 
+TUN.IFACE <``string``>::
+Network intrface behind the tun device.
+
 TYPE <``string``>::
 Cooked version of STTYPE. It is same as STTYPE with exceptions.
 For SOCK, print the value for SOCK.PROTONAME.
index 7672a026aa644bb22671c38bed141282b6098d9a..520fe182c9880196854bdc66cb46704e8fd139e0 100644 (file)
@@ -312,6 +312,9 @@ static const struct colinfo infos[] = {
        [COL_TIMERFD_REMAINING]= { "TIMERFD.REMAINING",
                                   0,   SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER,
                                   N_("remaining time") },
+       [COL_TUN_IFACE]        = { "TUN.IFACE",
+                                  0,   SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
+                                  N_("network interface behind the tun device") },
        [COL_TYPE]             = { "TYPE",
                                   0,   SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
                                   N_("file type (cooked)") },
index 1b86b625b3c3b48a25d84d47eca7cdb9e3d2d30a..f2c4c0e973f559986206da0682b4c0778233df7b 100644 (file)
@@ -101,6 +101,7 @@ enum {
        COL_TIMERFD_CLOCKID,
        COL_TIMERFD_INTERVAL,
        COL_TIMERFD_REMAINING,
+       COL_TUN_IFACE,
        COL_TYPE,
        COL_UDP_LADDR,
        COL_UDP_RADDR,