/* { dg-additional-options "-Wno-analyzer-too-complex -Wno-analyzer-fd-leak" } */
// TODO: remove need for these options

typedef __SIZE_TYPE__ size_t;
#define NULL ((void *)0)
#define POLLIN 0x001

typedef struct {
  unsigned long int __val[(1024 / (8 * sizeof(unsigned long int)))];
} __sigset_t;

typedef unsigned int socklen_t;

struct timespec {
  /* [...snip...] */
};

typedef unsigned long int nfds_t;

struct pollfd {
  int fd;
  short int events;
  short int revents;
};

extern int ppoll(struct pollfd *__fds, nfds_t __nfds,
                 const struct timespec *__timeout, const __sigset_t *__ss);

struct sockaddr_un {
  /* [...snip...] */
  char sun_path[108];
};

typedef union {
  /* [...snip...] */
  struct sockaddr_un *__restrict __sockaddr_un__;
  /* [...snip...] */
} __SOCKADDR_ARG __attribute__((transparent_union));

extern int accept(int __fd, __SOCKADDR_ARG __addr,
                  socklen_t *__restrict __addr_len);

extern void *calloc(size_t __nmemb, size_t __size)
  __attribute__((__nothrow__, __leaf__))
  __attribute__((__malloc__))
  __attribute__((__alloc_size__(1, 2)));

extern void *realloc(void *__ptr, size_t __size)
  __attribute__((__nothrow__, __leaf__))
  __attribute__((__warn_unused_result__))
  __attribute__((__alloc_size__(2)));

extern void exit(int __status)
  __attribute__((__nothrow__, __leaf__))
  __attribute__((__noreturn__));

int main() {
  int rc;
  int nsockets = 1;
  struct pollfd *pollfds, *newpollfds;
  struct sockaddr_un remote;
  socklen_t len = sizeof(remote);

  pollfds = calloc(1, sizeof(struct pollfd));
  if (!pollfds) {
    exit(1);
  }

  while (1) {
    rc = ppoll(pollfds, nsockets, NULL, NULL);
    if (rc < 0) {
      continue;
    }

    if (pollfds[0].revents & POLLIN) {
      nsockets++;
      newpollfds = realloc(pollfds, nsockets * sizeof(*pollfds));
      if (!newpollfds) {
        exit(1);
      }
      pollfds = newpollfds;
      pollfds[nsockets - 1].fd = accept(pollfds[0].fd, &remote, &len);
    }
  }
  return 0;
}
