#!/usr/bin/python

#old version

from bcc import BPF
from time import sleep
from ctypes import c_ushort, c_int, c_ulonglong
from sys import argv


def usage():
	print("USAGE: %s [--histogram]" % argv[0])
	exit()

mode = 0

if len(argv) > 2:
	usage()
	exit(1)
if len(argv) == 2:
	if argv[1] == "--histogram":
		mode = 1
	else:
		usage()

print("Hit Ctrl-C to end.")
count = 100
interval = 5
loop = 0

# load BPF program

b = BPF(src_file="dbus-message-size.c")
if mode == 1:
	b.attach_uretprobe(name="dbus-1", sym="do_writing", fn_name="do_write_exit")
	b.attach_uretprobe(name="dbus-1", sym="do_authentication", fn_name="do_write_exit")
b.attach_uretprobe(name="dbus-1", sym="_dbus_write_socket_with_unix_fds_two", fn_name="do_return")
b.attach_uretprobe(name="dbus-1", sym="_dbus_write_socket_two", fn_name="do_return")
b.attach_uretprobe(name="dbus-1", sym="_dbus_write_socket", fn_name="do_return")

while (1):
	if count > 0:
		loop += 1
		if loop > count:
			exit()
	sleep(interval)
	print ("%d : \n" % loop)
	stats_t = b["size_sent"]
	if mode == 0:
		print ("%10s %20s %20s" % ("PID", "NAME", "BYTES SENT"))
		for v, p in sorted(stats_t.items(), key=lambda stats_t: stats_t[1].bytes, reverse=True):
			print("%10d %20s %20d \n" % (v.pid, v.comm.encode('string-escape'), p.bytes))
	b["sizes"].print_log2_hist("bytes");
