2 * $Id: auth.c,v 1.9 2009-10-13 22:55:37 didg Exp $
4 * Copyright (c) 1990,1993 Regents of The University of Michigan.
5 * All Rights Reserved. See COPYRIGHT.
10 #endif /* HAVE_CONFIG_H */
16 #endif /* HAVE_UNISTD_H */
17 #include <sys/types.h>
18 #include <sys/param.h>
20 #include <netatalk/endian.h>
21 #include <atalk/afp.h>
22 #include <atalk/compat.h>
23 #include <atalk/util.h>
29 #include <atalk/logger.h>
33 static struct uam_mod uam_modules = {NULL, NULL, &uam_modules, &uam_modules};
34 static struct uam_obj uam_login = {"", "", 0, {{NULL, NULL, NULL}}, &uam_login,
36 static struct uam_obj uam_changepw = {"", "", 0, {{NULL, NULL, NULL}}, &uam_changepw,
38 static struct uam_obj uam_printer = {"", "", 0, {{NULL, NULL, NULL}}, &uam_printer,
43 * Return a list of names for loaded uams
45 int getuamnames(const int type, char *uamnames)
47 struct uam_obj *prev, *start;
49 if (!(start = UAM_LIST(type)))
54 while((prev = prev->uam_prev) != start) {
55 strcat(uamnames, prev->uam_name);
56 strcat(uamnames, "\n");
59 strcat(uamnames, "*\n");
64 /* just do a linked list search. this could be sped up with a hashed
65 * list, but i doubt anyone's going to have enough uams to matter. */
66 struct uam_obj *auth_uamfind(const int type, const char *name,
69 struct uam_obj *prev, *start;
71 if (!name || !(start = UAM_LIST(type)))
75 while ((prev = prev->uam_prev) != start)
76 if (strndiacasecmp(prev->uam_name, name, len) == 0)
82 int auth_register(const int type, struct uam_obj *uam)
84 struct uam_obj *start;
86 if (!uam || !uam->uam_name || (*uam->uam_name == '\0'))
89 if (!(start = UAM_LIST(type)))
92 uam_attach(start, uam);
96 /* load all of the modules */
97 int auth_load(const char *path, const char *list)
99 char name[MAXPATHLEN + 1], buf[MAXPATHLEN + 1], *p;
104 if (!path || !list || (len = strlen(path)) > sizeof(name) - 2)
107 strlcpy(buf, list, sizeof(buf));
108 if ((p = strtok(buf, ",")) == NULL)
112 if (name[len - 1] != '/') {
118 strlcpy(name + len, p, sizeof(name) - len);
119 if ((stat(name, &st) == 0) && (mod = uam_load(name, p))) {
120 uam_attach(&uam_modules, mod);
121 LOG(log_info, logtype_papd, "uam: %s loaded", p);
123 p = strtok(NULL, ",");
128 /* get rid of all of the uams */
129 void auth_unload(void)
131 struct uam_mod *mod, *prev, *start = &uam_modules;
133 prev = start->uam_prev;
134 while ((mod = prev) != start) {
135 prev = prev->uam_prev;