144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * nl-list-sockets.c	Pretty-print /proc/net/netlink
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
98808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
128808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h>
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf#define PROC_NETLINK "/proc/net/netlink"
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf
1644d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[])
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf	FILE *fd;
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf	char buf[2048], p[64];
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf	fd = fopen(PROC_NETLINK, "r");
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (fd == NULL) {
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf		perror("fopen");
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf		return -1;
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf
2725ccbf1dab4d40ddd0fa5343c31aed0a49d76c46Thomas Graf	printf("Address            Family           PID    Groups   rmem   "
2825ccbf1dab4d40ddd0fa5343c31aed0a49d76c46Thomas Graf	       "wmem   CB         refcnt\n");
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf	while (fgets(buf, sizeof(buf), fd)) {
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf		unsigned long sk, cb;
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf		int ret, proto, pid, rmem, wmem, refcnt;
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf		uint32_t groups;
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf		ret = sscanf(buf, "%lx %d %d %08x %d %d %lx %d\n",
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf			     &sk, &proto, &pid, &groups, &rmem, &wmem,
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf			     &cb, &refcnt);
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (ret != 8)
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf			continue;
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf
4125ccbf1dab4d40ddd0fa5343c31aed0a49d76c46Thomas Graf		printf("0x%016lx %-16s %-6d %08x %-6d %-6d 0x%08lx %d\n",
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf			sk, nl_nlfamily2str(proto, p, sizeof(p)), pid,
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf			groups, rmem, wmem, cb, refcnt);
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf	fclose(fd);
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
50