#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <limits.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/epoll.h>

/* typedef in latch.h */
struct WaitEventSet
{
  int nevents;
  int nevents_space;
  int epoll_fd;
  struct epoll_event *epoll_ret_events;
};


int main(int argc, char *argv[], char *envp[]) {

  int rc;
  int nevents = 0;
  int align = 0;
  int size;
  struct WaitEventSet *set;

  if (argc >= 3)
    align = atoi(argv[2]);
  if (argc >= 2)
    nevents = atoi(argv[1]);

  size = sizeof(struct WaitEventSet);
  size += sizeof(struct epoll_event) * nevents;
  size += align;
  
  set = malloc(size);
  set->nevents = nevents;
  set->nevents_space = nevents;
  set->epoll_fd = rc = epoll_create(nevents);
  if (rc < 0) {
    perror("epoll_create");
    exit(1);
  }
  set->epoll_ret_events = (struct epoll_event*)(((char*)&set->epoll_ret_events) + sizeof(char *) + align);
  
  struct epoll_event event;
  event.events = EPOLLERR | EPOLLHUP | EPOLLIN;
  event.data.u64 = 0;
  rc = epoll_ctl(set->epoll_fd, EPOLL_CTL_ADD, 0, &event);
  if (rc < 0) {
    perror("epoll_ctl(epoll_ctl_add)");
    exit(1);
  }

  printf("epoll_wait(epfd=%d, events=%p, maxevents=%d, timeout=%d)\n",
	 set->epoll_fd, set->epoll_ret_events, nevents, -1);

  rc = epoll_wait(set->epoll_fd, set->epoll_ret_events, nevents, -1);
  if (rc < 0) {
    perror("epoll_wait");
    exit(1);
  }
  printf("success\n");
  exit(0);
}
