summaryrefslogtreecommitdiffstats
path: root/misc-utils/lsfd-sock-xinfo.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--misc-utils/lsfd-sock-xinfo.c51
1 files changed, 45 insertions, 6 deletions
diff --git a/misc-utils/lsfd-sock-xinfo.c b/misc-utils/lsfd-sock-xinfo.c
index a293806..71be41a 100644
--- a/misc-utils/lsfd-sock-xinfo.c
+++ b/misc-utils/lsfd-sock-xinfo.c
@@ -179,9 +179,12 @@ static void load_sock_xinfo_no_nsswitch(struct netns *nsobj)
load_xinfo_from_proc_packet(netns);
diagsd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_SOCK_DIAG);
+ DBG(ENDPOINTS, ul_debug("made a diagnose socket [fd=%d; %s]", diagsd,
+ (diagsd >= 0)? "successful": strerror(errno)));
if (diagsd >= 0) {
load_xinfo_from_diag_unix(diagsd, netns);
close(diagsd);
+ DBG(ENDPOINTS, ul_debug("close the diagnose socket"));
}
if (nsobj)
@@ -337,6 +340,7 @@ static void send_diag_request(int diagsd, void *req, size_t req_size,
bool (*cb)(ino_t, size_t, void *),
ino_t netns)
{
+ int r;
struct sockaddr_nl nladdr = {
.nl_family = AF_NETLINK,
};
@@ -361,30 +365,45 @@ static void send_diag_request(int diagsd, void *req, size_t req_size,
__attribute__((aligned(sizeof(void *)))) uint8_t buf[8192];
- if (sendmsg(diagsd, &mhd, 0) < 0)
+ r = sendmsg(diagsd, &mhd, 0);
+ DBG(ENDPOINTS, ul_debug("sendmsg [rc=%d; %s]",
+ r, (r >= 0)? "successful": strerror(errno)));
+ if (r < 0)
return;
for (;;) {
const struct nlmsghdr *h;
- int r = recvfrom(diagsd, buf, sizeof(buf), 0, NULL, NULL);
+ r = recvfrom(diagsd, buf, sizeof(buf), 0, NULL, NULL);
+ DBG(ENDPOINTS, ul_debug("recvfrom [rc=%d; %s]",
+ r, (r >= 0)? "successful": strerror(errno)));
if (r < 0)
return;
h = (void *) buf;
+ DBG(ENDPOINTS, ul_debug(" OK: %d", NLMSG_OK(h, (size_t)r)));
if (!NLMSG_OK(h, (size_t)r))
return;
for (; NLMSG_OK(h, (size_t)r); h = NLMSG_NEXT(h, r)) {
- if (h->nlmsg_type == NLMSG_DONE)
+ if (h->nlmsg_type == NLMSG_DONE) {
+ DBG(ENDPOINTS, ul_debug(" DONE"));
return;
- if (h->nlmsg_type == NLMSG_ERROR)
+ }
+ if (h->nlmsg_type == NLMSG_ERROR) {
+ struct nlmsgerr *e = (struct nlmsgerr *)NLMSG_DATA(h);
+ DBG(ENDPOINTS, ul_debug(" ERROR: %s",
+ strerror(- e->error)));
return;
+ }
if (h->nlmsg_type == SOCK_DIAG_BY_FAMILY) {
+ DBG(ENDPOINTS, ul_debug(" FAMILY"));
if (!cb(netns, h->nlmsg_len, NLMSG_DATA(h)))
return;
}
+ DBG(ENDPOINTS, ul_debug(" NEXT"));
}
+ DBG(ENDPOINTS, ul_debug(" OK: 0"));
}
}
@@ -639,6 +658,8 @@ static void load_xinfo_from_proc_unix(ino_t netns_inode)
FILE *unix_fp;
unix_fp = fopen("/proc/net/unix", "r");
+ DBG(ENDPOINTS, ul_debug("open /proc/net/unix [fp=%p; %s]", unix_fp,
+ unix_fp? "successful": strerror(errno)));
if (!unix_fp)
return;
@@ -655,13 +676,18 @@ static void load_xinfo_from_proc_unix(ino_t netns_inode)
unsigned long inode;
struct unix_xinfo *ux;
char path[UNIX_LINE_LEN + 1] = { 0 };
+ int r;
+ DBG(ENDPOINTS, ul_debug(" line: %s", line));
- if (sscanf(line, "%*x: %*x %*x %" SCNx64 " %x %x %lu %"
+ r = sscanf(line, "%*x: %*x %*x %" SCNx64 " %x %x %lu %"
stringify_value(UNIX_LINE_LEN) "[^\n]",
- &flags, &type, &st, &inode, path) < 4)
+ &flags, &type, &st, &inode, path);
+ DBG(ENDPOINTS, ul_debug(" scanf: %d", r));
+ if (r < 4)
continue;
+ DBG(ENDPOINTS, ul_debug(" inode: %lu", inode));
if (inode == 0)
continue;
@@ -675,10 +701,12 @@ static void load_xinfo_from_proc_unix(ino_t netns_inode)
ux->st = st;
xstrncpy(ux->path, path, sizeof(ux->path));
+ DBG(ENDPOINTS, ul_debug(" path: %s", ux->path));
add_sock_info(&ux->sock);
}
out:
+ DBG(ENDPOINTS, ul_debug("close /proc/net/unix"));
fclose(unix_fp);
}
@@ -712,6 +740,9 @@ static bool handle_diag_unix(ino_t netns __attribute__((__unused__)),
if (diag->udiag_family != AF_UNIX)
return false;
+ DBG(ENDPOINTS, ul_debug(" UNIX"));
+ DBG(ENDPOINTS, ul_debug(" LEN: %zu (>= %zu)", nlmsg_len,
+ (size_t)(NLMSG_LENGTH(sizeof(*diag)))));
if (nlmsg_len < NLMSG_LENGTH(sizeof(*diag)))
return false;
@@ -719,21 +750,29 @@ static bool handle_diag_unix(ino_t netns __attribute__((__unused__)),
inode = (ino_t)diag->udiag_ino;
xinfo = get_sock_xinfo(inode);
+ DBG(ENDPOINTS, ul_debug(" inode: %llu", (unsigned long long)inode));
+ DBG(ENDPOINTS, ul_debug(" xinfo: %p", xinfo));
+
if (xinfo == NULL)
/* The socket is found in the diag response
but not in the proc fs. */
return true;
+ DBG(ENDPOINTS, ul_debug(" xinfo->class == &unix_xinfo_class: %d",
+ xinfo->class == &unix_xinfo_class));
if (xinfo->class != &unix_xinfo_class)
return true;
unix_xinfo = (struct unix_xinfo *)xinfo;
rta_len = nlmsg_len - NLMSG_LENGTH(sizeof(*diag));
+ DBG(ENDPOINTS, ul_debug(" rta_len: %zu", rta_len));
for (struct rtattr *attr = (struct rtattr *)(diag + 1);
RTA_OK(attr, rta_len);
attr = RTA_NEXT(attr, rta_len)) {
size_t len = RTA_PAYLOAD(attr);
+ DBG(ENDPOINTS, ul_debug(" len = %2zu, type: %d",
+ rta_len, attr->rta_type));
switch (attr->rta_type) {
case UNIX_DIAG_NAME:
unix_refill_name(xinfo, RTA_DATA(attr), len);