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