#include <u.h>
#include <sys/types.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/dkstat.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/if_types.h>
#include <ifaddrs.h>
#include <sys/ioctl.h>
#include <limits.h>
#include <libc.h>
#include <bio.h>

#include <mach/mach.h>
#include <mach/mach_time.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/ps/IOPowerSources.h>
AUTOFRAMEWORK(CoreFoundation)
AUTOFRAMEWORK(IOKit)

#include "dat.h"

typedef struct Sample Sample;

struct Sample
{
	uint seq;
	host_cpu_load_info_data_t cpu, p_cpu;
	vm_size_t pgsize;
	double divisor;
	uint64_t time, p_time;
	vm_statistics_data_t vm_stat, p_vm_stat;
	boolean_t purgeable_is_valid;
	struct xsw_usage xsu;
	boolean_t xsu_valid;
	integer_t syscalls_mach, p_syscalls_mach;
	integer_t syscalls_unix, p_syscalls_unix;
	ulong csw, p_csw;
	uint net_ifaces;
	uvlong net_ipackets, p_net_ipackets;
	uvlong net_opackets, p_net_opackets;
	uvlong net_ibytes, p_net_ibytes;
	uvlong net_obytes, p_net_obytes;
	uvlong net_errors, p_net_errors;
	ulong usecs;
};

static Sample sample;

void xsample(int);
void xapm(int);
void xloadavg(int);
void xcpu(int);
void xswap(int);
void xvm(int);
void xnet(int);

void (*statfn[])(int) =
{
	xsample,
	xapm,
	xloadavg,
	xswap,
	xcpu,
	xvm,
	xnet,
	0
};

static mach_port_t stat_port;

void
sampleinit(void)
{
	mach_timebase_info_data_t info;
	
	if(stat_port)
		return;

	stat_port = mach_host_self();
	memset(&sample, 0, sizeof sample);
	if(host_page_size(stat_port, &sample.pgsize) != KERN_SUCCESS)
		sample.pgsize = 4096;

	// populate clock tick info for timestamps
	mach_timebase_info(&info);
        sample.divisor = 1000.0 * (double)info.denom/info.numer;
	sample.time = mach_absolute_time();
}

void
samplenet(void)
{
	struct ifaddrs *ifa_list, *ifa;
	struct if_data *if_data;

	ifa_list = nil;
	sample.net_ifaces = 0;
	if(getifaddrs(&ifa_list) == 0){
		sample.p_net_ipackets = sample.net_ipackets;
		sample.p_net_opackets = sample.net_opackets;
		sample.p_net_ibytes = sample.net_ibytes;
		sample.p_net_obytes = sample.net_obytes;
		sample.p_net_errors = sample.net_errors;

		sample.net_ipackets = 0;
		sample.net_opackets = 0;
		sample.net_ibytes = 0;
		sample.net_obytes = 0;
		sample.net_errors = 0;
		sample.net_ifaces = 0;
		
		for(ifa=ifa_list; ifa; ifa=ifa->ifa_next){
			if(ifa->ifa_addr->sa_family != AF_LINK)
				continue;
			if((ifa->ifa_flags&(IFF_UP|IFF_RUNNING)) == 0)
				continue;
			if(ifa->ifa_data == nil)
				continue;
			if(strncmp(ifa->ifa_name, "lo", 2) == 0)	/* loopback */
				continue;
			
			if_data = (struct if_data*)ifa->ifa_data;
			sample.net_ipackets += if_data->ifi_ipackets;
			sample.net_opackets += if_data->ifi_opackets;
			sample.net_ibytes += if_data->ifi_ibytes;
			sample.net_obytes += if_data->ifi_obytes;
			sample.net_errors += if_data->ifi_ierrors + if_data->ifi_oerrors;
			sample.net_ifaces++;
		}
		freeifaddrs(ifa_list);
	}
}


/*
 * The following forces the program to be run with the suid root as
 * all the other stat monitoring apps get set:
 *
 * -rwsr-xr-x   1 root  wheel  83088 Mar 20  2005 /usr/bin/top
 * -rwsrwxr-x   1 root  admin  54048 Mar 20  2005 
 *	/Applications/Utilities/Activity Monitor.app/Contents/Resources/pmTool
 *
 * If Darwin eventually encompases more into sysctl then this
 * won't be required.
 */
void
samplevents(void)
{
	uint i, j, pcnt, tcnt;
	mach_msg_type_number_t count;
	kern_return_t error;
	processor_set_t *psets, pset;
	task_t *tasks;
	task_events_info_data_t events;

	if((error = host_processor_sets(stat_port, &psets, &pcnt)) != KERN_SUCCESS){
		Bprint(&bout, "host_processor_sets: %s (make sure auxstats is setuid root)\n",
			mach_error_string(error));
		return;
	}
	
	sample.p_syscalls_mach = sample.syscalls_mach;
	sample.p_syscalls_unix = sample.syscalls_unix;
	sample.p_csw = sample.csw;

	sample.syscalls_mach = 0;
	sample.syscalls_unix = 0;
	sample.csw = 0;
	
	for(i=0; i<pcnt; i++){
		if((error=host_processor_set_priv(stat_port, psets[i], &pset)) != KERN_SUCCESS){
			Bprint(&bout, "host_processor_set_priv: %s\n", mach_error_string(error));
			return;
		}
		if((error=processor_set_tasks(pset, &tasks, &tcnt)) != KERN_SUCCESS){
			Bprint(&bout, "processor_set_tasks: %s\n", mach_error_string(error));
			return;
		}
		for(j=0; j<tcnt; j++){
			count = TASK_EVENTS_INFO_COUNT;
			if(task_info(tasks[j], TASK_EVENTS_INFO, (task_info_t)&events, &count) == KERN_SUCCESS){
				sample.syscalls_mach += events.syscalls_mach;
				sample.syscalls_unix += events.syscalls_unix;
				sample.csw += events.csw;
			}
			
			if(tasks[j] != mach_task_self())
				mach_port_deallocate(mach_task_self(), tasks[j]);
		}
		
		if((error = vm_deallocate((vm_map_t)mach_task_self(), 
				(vm_address_t)tasks, tcnt*sizeof(task_t))) != KERN_SUCCESS){
			Bprint(&bout, "vm_deallocate: %s\n", mach_error_string(error));
			return;
		}
		
		if((error = mach_port_deallocate(mach_task_self(), pset)) != KERN_SUCCESS
		|| (error = mach_port_deallocate(mach_task_self(), psets[i])) != KERN_SUCCESS){
			Bprint(&bout, "mach_port_deallocate: %s\n", mach_error_string(error));
			return;
		}
	}
	
	if((error = vm_deallocate((vm_map_t)mach_task_self(), (vm_address_t)psets,
			pcnt*sizeof(processor_set_t))) != KERN_SUCCESS){
		Bprint(&bout, "vm_deallocate: %s\n", mach_error_string(error));
		return;
	}
}

void
xsample(int first)
{
	int mib[2];
	mach_msg_type_number_t count;
	size_t len;
	
	if(first){
		sampleinit();
		return;
	}
	
	sample.seq++;
	sample.p_time = sample.time;
	sample.time = mach_absolute_time();

	sample.p_vm_stat = sample.vm_stat;
	count = sizeof(sample.vm_stat) / sizeof(natural_t);
	host_statistics(stat_port, HOST_VM_INFO, (host_info_t)&sample.vm_stat, &count);
	
	if(sample.seq == 1)
		sample.p_vm_stat = sample.vm_stat;

	mib[0] = CTL_VM;
	mib[1] = VM_SWAPUSAGE;
	len = sizeof sample.xsu;
	sample.xsu_valid = TRUE;
	if(sysctl(mib, 2, &sample.xsu, &len, NULL, 0) < 0 && errno == ENOENT)
		sample.xsu_value = FALSE;
		
	samplenet();
	sampleevents();

	sample.p_cpu = sample.cpu;
	count = HOST_CPU_LOAD_INFO_COUNT;
	host_statistics(stat_port, HOST_CPU_LOAD_INFO, (host_info_t)&sample.cpu, &count);
	sample.usecs = (double)(sample.time - sample.p_time)/sample.divisor;
	Bprint(&bout, "usecs %lud\n", sample.usecs);
}

void
xapm(int first)
{
	int i, battery;
	CFArrayRef array;
	CFDictionaryRef dict;
	CFTypeRef cf, src, value;

	if(first)
		return;
		
	src = IOPSCopyPowerSourcesInfo();
	array = IOPSCopyPowerSourcesList(src);

	for(i=0; i<CFArrayGetCount(array); i++){
		cf = CFArrayGetValueAtIndex(array, i);
		dict = IOPSGetPowerSourceDescription(src, cf);
		if(dict != nil){
			value = CFDictionaryGetValue(dict, CFSTR("Current Capacity"));
			if(value != nil){
				if(!CFNumberGetValue(value, kCFNumberIntType, &battery))
					battery = 100;
				Bprint(&bout, "battery =%d 100\n", battery);
				break;
			}
		}
	}

	CFRelease(array);
	CFRelease(src);
}

void
xnet(int first)
{
	uint n;
	uvlong err, in, inb, out, outb;
	
	n = sample.net_ifaces;
	in = sample.net_ipackets;
	out = sample.net_opackets;
	inb = sample.net_ibytes;
	outb = sample.net_obytes;
	err = sample.net_errors;
	
       Bprint(&bout, "etherb %llud %d\n", inb+outb, n*1000000);
       Bprint(&bout, "ether %llud %d\n", in+out, n*1000);
       Bprint(&bout, "ethererr %llud %d\n", err, n*1000);
       Bprint(&bout, "etherin %llud %d\n", in, n*1000);
       Bprint(&bout, "etherout %llud %d\n", out, n*1000);
       Bprint(&bout, "etherinb %llud %d\n", inb, n*1000);
       Bprint(&bout, "etheroutb %llud %d\n", outb, n*1000);
}

int
rsys(char *name, char *buf, int len)
{
	size_t l;

	l = len;
	if(sysctlbyname(name, buf, &l, nil, 0) < 0)
		return -1;
	buf[l] = 0;
	return l;
}

vlong
isys(char *name)
{
	ulong u;
	size_t l;

	l = sizeof u;
	if(sysctlbyname(name, &u, &l, nil, 0) < 0)
		return 0;
	return u;
}

void
xvm(int first)
{
	uvlong total;

	if(first)
		return;

	total = sample.vm_stat.free_count
		+ sample.vm_stat.active_count
		+ sample.vm_stat.inactive_count
		+ sample.vm_stat.wire_count;
	if(total)
		Bprint(&bout, "mem =%lld %lld\n", sample.vm_stat.active_count, total);

	Bprint(&bout, "context %lld 1000\n", (vlong)sample.csw);
	Bprint(&bout, "syscall %lld 1000\n", (vlong)sample.syscalls_mach+sample.syscalls_unix);
	Bprint(&bout, "intr %lld 1000\n", 
		isys("vm.stats.sys.v_intr")
		+isys("vm.stats.sys.v_trap"));
	
	Bprint(&bout, "fault %lld 1000\n", sample.vm_stat.faults);
	Bprint(&bout, "fork %lld 1000\n",
		isys("vm.stats.vm.v_rforks")
		+isys("vm.stats.vm.v_vforks"));

//    Bprint(&bout, "hits %lud of %lud lookups (%d%% hit rate)\n",
//               (asamp.vm_stat.hits),
//               (asamp.vm_stat.lookups),
//               (natural_t)(((double)asamp.vm_stat.hits*100)/ (double)asamp.vm_stat.lookups));
}

void
xcpu(int first)
{
	ulong user, sys, idle, nice, t;

	if(first)
		return;

	sys = sample.cpu.cpu_ticks[CPU_STATE_SYSTEM] -
		sample.p_cpu.cpu_ticks[CPU_STATE_SYSTEM];
	idle = sample.cpu.cpu_ticks[CPU_STATE_IDLE] -
		sample.p_cpu.cpu_ticks[CPU_STATE_IDLE];
	user = sample.cpu.cpu_ticks[CPU_STATE_USER] -
		sample.p_cpu.cpu_ticks[CPU_STATE_USER];
	nice = sample.cpu.cpu_ticks[CPU_STATE_NICE] -
		sample.p_cpu.cpu_ticks[CPU_STATE_NICE];
	
	t = sys+idle+user+nice;

	Bprint(&bout, "user =%lud %lud\n", user, t);
	Bprint(&bout, "sys =%lud %lud\n", sys, t);
	Bprint(&bout, "idle =%lud %lud\n", idle, t);
	Bprint(&bout, "nice =%lud %lud\n", nice, t);
}

void
xloadavg(int first)
{
	double l[3];

	if(first)
		return;

	if(getloadavg(l, 3) < 0)
		return;
	Bprint(&bout, "load %d 1000\n", (int)(l[0]*1000.0));
}

void
xswap(int first)
{
	if(first)
		return;
	
	if(sample.xsu_valid)
		Bprint(&bout, "swap %lld %lld\n", 
			(vlong)sample.xsu.xsu_used, 
			(vlong)sample.xsu.xsu_total);
}
