#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <dlfcn.h>

int *fd;
int size = 1024;

int eatallfds(void) {
	int i = 0;
	int j, myfd;

	while (1) {
		myfd = dup(0);
		if (myfd < 0) {
			fprintf (stderr, "dup() failed: %s\n", strerror(errno));
			break;
		}
		fd[i++] = myfd;
		if (i >= size) {
			size *= 2;
			fd = realloc(fd, size);
			if (fd == NULL) {
				fprintf (stderr, "Can't allocate: %s\n",
						strerror(errno));
				fprintf (stderr, "Had used %d descriptors\n",
						i);
				exit(1);
			}
		}
	}
	for (j = 0 ; j < i ; ++j) {
		close(fd[j]);
	}
	return i;
}


int main (int argc, char *argv[]) {
	int n, na;
	int i;
	void *addr;

	size = 1024;
	fd = malloc(size * sizeof(*fd));
	if (fd == NULL) {
		fprintf (stderr, "Can't allocate: %s\n", strerror(errno));
		return 1;
	}
	n = eatallfds();
	printf ("Was able to use %d file descriptors\n", n);

	na = 0;
	for (i = 1 ; i < argc ; ++i) {
		addr = dlopen(argv[i], RTLD_LAZY);
		if (addr != NULL) na++;
	}
	n = eatallfds();
	printf ("Was able to use %d file descriptors after opening %d shared libs\n", n, na);
	return 0;
}

