#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
#include <errno.h>

extern int errno;

char *get_ip (int ip)
{
	static char ipe[16];
	int a, b, c, d;

	d = (ip >> 24) & 0xFF;
	c = (ip >> 16) & 0xFF;
	b = (ip >> 8) & 0xFF;
	a = ip & 0xFF;

	sprintf (ipe, "%u.%u.%u.%u", a, b, c, d);

	return ipe;
}

char *user (int uid)
{
	static struct passwd *pw;

	pw = getpwuid(uid);

	if (pw)
		return pw->pw_name;

	return "unknown";
}

int main (int argc, char **argv)
{
	char *tcpfile = "/proc/net/tcp";
	char line[1024];
	int loc_ip, rem_ip;
	int loc_p, rem_p;
	int uid;
	int no;
	FILE *fp;

	printf ("tcptrace (c) 2003 adam wysocki <gophi@linux.net.pl>\n");

	if (argc >= 2)
		tcpfile = argv[1];

	fp = fopen(tcpfile, "r");
	if (!fp) {
		perror (tcpfile);
		return -1;
	}

	fgets (line, 1024, fp);

	while (!feof(fp)) {
		fgets (line, 1024, fp);
		if (feof(fp))
			continue;
		sscanf (line, "%u: %X:%X %X:%X %*X %*X:%*X %*X:%*X %*X %u", &no, &loc_ip, &loc_p, &rem_ip, &rem_p, &uid);
		printf ("%5u: local %16s:%-5u ", no, get_ip(loc_ip), loc_p);
		printf ("remote %16s:%-5u uid %5u (%s)\n", get_ip(rem_ip), rem_p, uid, user(uid));
	}

	fclose (fp);

	return 0;
}
