
//typedef long long ino64_t;
#define _GNU_SOURCE

#include <hurd.h>
#include <argp.h>
#include <error.h>
#include <stdio.h>
#include <cthreads.h>

typedef int (*probe_handler) (int probe, char* mem, int mem_size, void* data);

#define PROBE_CONT 0
#define PROBE_STOP 1


int instrument_sym(char* name, char* mem, int mem_size
		   , probe_handler pre, probe_handler post
		   , void* data)
{
  host_t host = mach_host_self();

  int status, probe;
  int ret = mach_arm_probe(host, 0, "mach_host_self", mem, mem_size, &probe, &status);

  int* memory = malloc(mem_size);  
  probe_dispatch(probe, memory, mem_size, pre, post, data);

  mach_disarm_probe(host,probe);

  return 0;
}

int probe_dispatch(int probe, char* mem, int mem_size
		   , probe_handler pre, probe_handler post
		   , void* data)
{
  host_t host = mach_host_self();

  while(1)
  {
    int status = PROBE_STOP, probe_ret, mem_len = mem_size;
    int ret = mach_wait_probe(host, probe, mem, &mem_len, &status);

      if(status == 2)//PROBE_STATUS_PRE)
	probe_ret = pre(probe, mem, mem_size, data);

      if(status == 3)//PROBE_STATUS_POST)
	probe_ret = post(probe, mem, mem_size, data);

      if(PROBE_CONT == probe_ret)
	continue;

      if(PROBE_STOP == probe_ret)
	return 0;
  }
}
