summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2005-08-08 17:05:57 +0000
committer/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2005-08-08 17:05:57 +0000
commitcb9192a15b78d373ac802d640f4b29cac4b24633 (patch)
tree4dd1ecdaed7afc588b77e06161aa523196168df4
parentb5f3a0dc6d9a0d69b3deec116b66a756c3b67e09 (diff)
- more verbose dump_packet
- add new nfnl_recv() function
-rw-r--r--include/libnfnetlink/libnfnetlink.h1
-rw-r--r--src/libnfnetlink.c31
2 files changed, 32 insertions, 0 deletions
diff --git a/include/libnfnetlink/libnfnetlink.h b/include/libnfnetlink/libnfnetlink.h
index acda88d..4935a3e 100644
--- a/include/libnfnetlink/libnfnetlink.h
+++ b/include/libnfnetlink/libnfnetlink.h
@@ -65,6 +65,7 @@ extern int nfnl_listen(struct nfnl_handle *,
void *);
/* receiving */
+extern ssize_t nfnl_recv(const struct nfnl_handle *h, unsigned char *buf, size_t len);
extern int nfnl_callback_register(struct nfnl_handle *,
u_int8_t type, struct nfnl_callback *cb);
extern int nfnl_callback_unregister(struct nfnl_handle *, u_int8_t type);
diff --git a/src/libnfnetlink.c b/src/libnfnetlink.c
index c6ccc4b..37cea70 100644
--- a/src/libnfnetlink.c
+++ b/src/libnfnetlink.c
@@ -43,6 +43,7 @@ void nfnl_dump_packet(struct nlmsghdr *nlh, int received_len, char *desc)
(nlmsg_data - (void *)nlh));
printf(" NFM_NFA(NLMSG_DATA(nlh)) = %p (+%td bytes)\n",
nfa, ((void *)nfa - (void *)nlh));
+ printf(" NFM_PAYLOAD(nlh) = %u\n", len);
printf(" nlmsg_type = %u, nlmsg_len = %u, nlmsg_seq = %u "
"nlmsg_flags = 0x%x\n", nlh->nlmsg_type, nlh->nlmsg_len,
nlh->nlmsg_seq, nlh->nlmsg_flags);
@@ -221,6 +222,36 @@ nfnl_parse_hdr(const struct nfnl_handle *nfnlh,
return ((void *)nlh + NLMSG_LENGTH(sizeof(struct nfgenmsg)));
}
+ssize_t
+nfnl_recv(const struct nfnl_handle *h, unsigned char *buf, size_t len)
+{
+ socklen_t addrlen;
+ int status;
+ struct nlmsghdr *nlh;
+ struct sockaddr_nl peer;
+
+ if (len < sizeof(struct nlmsgerr)
+ || len < sizeof(struct nlmsghdr))
+ return -1;
+
+ addrlen = sizeof(h->peer);
+ status = recvfrom(h->fd, buf, len, 0, (struct sockaddr *)&peer,
+ &addrlen);
+ if (status <= 0)
+ return status;
+
+ if (addrlen != sizeof(peer))
+ return -1;
+
+ if (peer.nl_pid != 0)
+ return -1;
+
+ nlh = (struct nlmsghdr *)buf;
+ if (nlh->nlmsg_flags & MSG_TRUNC || status > len)
+ return -1;
+
+ return status;
+}
/**
* nfnl_listen: listen for one or more netlink messages
*