FD_ALLOC_BLOCK = size of pollfd and fd arrays allocated at one time

struct clnt_info {
	char * name;
	int index;  /* index into all arrays */
};	

/* globals */
int *info_fd;
struct pollfd *pollnull;

struct supp_mech {
	char * name;
}; 

#define SUPP_MECH 1
/* per supported mech*/
struct pollfd *pollkrb5;
struct supp_mech supp_mech_list[SUPP_MECH] = {"krb5"};

/* architeture description */

init:
create info array of fd, size FD_ALLOC_BLOCK rooted in a global
	set all fd's to -1
create nullproc array of fd, size FD_ALLOC_BLOCK rooted in a global
	set all fields to 0.
for each supported mechanism,
 create an array of struct pollfd for mechanism upcall rooted in a global
	set all fields to 0.

INIT_LIST_HEAD clnt_list

for each clntXX directory in /rpcsec
/* FIRST PASS - assume krb5 only */

1) search info array for first -1 entry, index = clnt_info index;
2) readdir clntXX for mech specific filenames
				
		if!strncmp(dirent->d_name,"krb5",4)
		open "clntXX/krb5"
		check for IS_FIFO
		check for pollkrb5[index].fd = 0;
		set pollkrb5[index].event,revent = 0;

		if!strncmp(dirent->d_name,"nullproc",4)
		open "clntXX/nullproc"		
		check for IS_FIFO
		check for pollnull[index].fd = 0;
		set pollnull[index].event,revent = 0; 

		if!strncmp(dirent->d_name,"info",4)
		open "clntXX/info"		
		check for info[index].fd = 0;

3) if #2, 
	create clnt_info and insert into clnt_list
	put krb5fd -> krb5poll[index].fd	
	set krb5poll[index].event | POLLIN;

	put nullfd -> nullpoll[index].fd	
	set nullpoll[index].event | POLLIN;

	put infofd -> infofd[index].fd	

At this point, the poll arrays are all setup.

Eventually, fork a child to 
poll the each mech pollfd list.  (only krb5 for now)

when data arrives:
Eventuatlly fork (or have a pool of threads) to service request.

for now, service the requests in serial fashion.

for each request, read the uid,flags from the mech file
