a cool feature to have would be plugin uam modules. that way, we can
make it simpler for people to write their own modules and just stick
them in afpd.

here are my current thoughts: 
     uam module dealings:
       

     this actually allows us to replace any afp function with anything
       else. afs needs it as they specify new switches:
       afpswitch_add() - add a switch.
       afpswitch_get() - get an existing switch. return NULL if there
		         isn't one. 
       afpswitch_del() - remove a switch.

     afpd.conf:
     name -uampath path -uamlist cleartxt rand2num randnum

     afpd:
     module_load(conf, name):
         mod  = dlopen("name", RTLD_NOW);
	 mod->name = name;
	 mod->cleanup = dlsym(mod, "cleanup");
	 mod->uam = dlsym(mod, "uam");
     module_unload(conf, name):
         mod->cleanup(mod);
     uam_register(conf, mod->uam) - add uam to uam list. add appropriate bits
	  to afp_changepw (encrypted or cleartext).
     uam_unregister(conf, mod->uam) - delete it from the list
     ...

     helper functions:
       uam_getpwname()


prototype structs:
struct uam {
       struct afp_uams uam;
       int (*change_clrtxt)(), (*change_encrypted)();
       struct uam *prevp, *next; 
}
       
struct uam_switch {
       int (*function)();
       int location;
       struct uam_switch *prevp, *next;
}
