1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <string.h>
5 #include <assert.h>
6 
7 #include "src/tcpcrypt.h"
8 #include "src/tcpcrypt_ctl.h"
9 #include "src/inc.h"
10 
open_socket()11 int open_socket()
12 {
13     int s;
14     struct sockaddr_in s_in;
15 #ifdef __WIN32__
16     WSADATA wsadata;
17     if (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR)
18 	errx(1, "WSAStartup()");
19 #endif
20 
21     memset(&s_in, 0, sizeof(s_in));
22     s_in.sin_family = PF_INET;
23     s_in.sin_port = 0;
24     s_in.sin_addr.s_addr = INADDR_ANY;
25 
26     s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
27     if (s == -1)
28         err(1, "socket()");
29 
30     if (bind(s, (struct sockaddr*) &s_in, sizeof(s_in)) == -1)
31         err(1, "bind()");
32 
33     return s;
34 }
35 
do_netstat(void)36 static void do_netstat(void)
37 {
38 	unsigned char buf[2048];
39 	unsigned int len = sizeof(buf);
40 	int s, sl, i;
41 	struct tc_netstat *n = (struct tc_netstat*) buf;
42 	char src[64];
43 	char dst[64];
44 
45 	s = open_socket();
46 	if (tcpcrypt_getsockopt(s, IPPROTO_TCP, TCP_CRYPT_NETSTAT, buf, &len) == -1)
47             err(1, "tcpcrypt_getsockopt()");
48 
49 	printf("Local address\t\tForeign address\t\tSID\n");
50 
51 	while (len > sizeof(*n)) {
52 		sl = ntohs(n->tn_len);
53 
54 		assert(len >= sizeof(*n) + sl);
55 
56 		sprintf(src, "%s:%d", inet_ntoa(n->tn_sip), ntohs(n->tn_sport));
57 		sprintf(dst, "%s:%d", inet_ntoa(n->tn_dip), ntohs(n->tn_dport));
58 		printf("%-21s\t%-21s\t", src, dst);
59 
60 		for (i = 0; i < sl; i++)
61 			printf("%.2X", n->tn_sid[i]);
62 
63 		printf("\n");
64 
65 		sl  += sizeof(*n);
66 		n    = (struct tc_netstat*) ((unsigned long) n + sl);
67 		len -= sl;
68 	}
69 	assert(len == 0);
70 }
71 
main(int argc,char ** argv)72 int main(int argc, char **argv)
73 {
74 	if (argc >= 3 && !strcmp(argv[1], "-u")) {
75 		tcpcrypt_setparam(TCPCRYPT_PARAM_CTLPATH, argv[2]);
76 	}
77 	do_netstat();
78 	return 0;
79 }
80