]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
monitor: Print NEWGEN events
authorPhil Sutter <phil@nwl.cc>
Wed, 19 Jul 2017 14:32:57 +0000 (16:32 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 24 Jul 2017 18:23:02 +0000 (20:23 +0200)
Now that they contain process information, they're actually interesting.
For backwards compatibility, print process information only if it was
present in the message.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/linux/netfilter/nf_tables.h
src/netlink.c

index 683f6f88fcacefa0898e3898cd75f31422fc0f9a..40096de04e96311114e27d775dfc7d189d8e7ad6 100644 (file)
@@ -1221,6 +1221,8 @@ enum nft_objref_attributes {
 enum nft_gen_attributes {
        NFTA_GEN_UNSPEC,
        NFTA_GEN_ID,
+       NFTA_GEN_PROC_ID,
+       NFTA_GEN_PROC_NAME,
        __NFTA_GEN_MAX
 };
 #define NFTA_GEN_MAX           (__NFTA_GEN_MAX - 1)
index 2c47227328ed80c3d6764622838d23213fb04ddd..9cef4c48f805a265637fcae286eb2c5cf4f2dc2a 100644 (file)
@@ -2987,6 +2987,45 @@ static void netlink_events_debug(uint16_t type)
 #endif /* DEBUG */
 }
 
+static int netlink_events_newgen_cb(const struct nlmsghdr *nlh, int type,
+                                   struct netlink_mon_handler *monh)
+{
+       const struct nlattr *attr;
+       char name[256] = "";
+       int genid = -1, pid = -1;
+
+       mnl_attr_for_each(attr, nlh, sizeof(struct nfgenmsg)) {
+               switch (mnl_attr_get_type(attr)) {
+               case NFTA_GEN_ID:
+                       if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+                               break;
+                       genid = ntohl(mnl_attr_get_u32(attr));
+                       break;
+               case NFTA_GEN_PROC_NAME:
+                       if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+                               break;
+                       strncpy(name, mnl_attr_get_str(attr), sizeof(name));
+                       break;
+               case NFTA_GEN_PROC_ID:
+                       if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+                               break;
+                       pid = ntohl(mnl_attr_get_u32(attr));
+                       break;
+               }
+       }
+       if (genid >= 0) {
+               printf("# new generation %d", genid);
+               if (pid >= 0) {
+                       printf(" by process %d", pid);
+                       if (!monh->ctx->octx->numeric)
+                               printf(" (%s)", name);
+               }
+               printf("\n");
+       }
+
+       return MNL_CB_OK;
+}
+
 static int netlink_events_cb(const struct nlmsghdr *nlh, void *data)
 {
        int ret = MNL_CB_OK;
@@ -3027,6 +3066,9 @@ static int netlink_events_cb(const struct nlmsghdr *nlh, void *data)
        case NFT_MSG_DELOBJ:
                ret = netlink_events_obj_cb(nlh, type, monh);
                break;
+       case NFT_MSG_NEWGEN:
+               ret = netlink_events_newgen_cb(nlh, type, monh);
+               break;
        }
        fflush(stdout);