#include <error.h>
#include <errno.h>
#include <mach.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int
main (int argc, char *argv[])
{
  error_t err;

  mach_port_array_t names;
  mach_msg_type_number_t names_len;
  mach_port_type_array_t types;
  mach_msg_type_number_t types_len;
  err = mach_port_names (mach_task_self (),
		         &names, &names_len,
			 &types, &types_len);
  if (err)
    error (1, 0, "mach_port_names");

  char *oldstr;

  if (argc == 1)
    {
      char *str;
      asprintf (&str, "%d", names_len);
      execv (argv[0], (char *[]) { argv[0], str, 0 });
      error (1, errno, "exec %s", argv[0]);
    }
  else
   {
     int old = atoi (argv[1]);
     printf ("%d ports leaked\n", names_len - old);
   }

  return 0;
}
