12 char *checker_state_names[] = {
22 static LIST_HEAD(checkers);
24 char * checker_state_name (int i)
26 return checker_state_names[i];
29 int init_checkers (void)
31 if (!add_checker(DEFAULT_CHECKER))
36 struct checker * alloc_checker (void)
40 c = MALLOC(sizeof(struct checker));
42 INIT_LIST_HEAD(&c->node);
48 void free_checker (struct checker * c)
54 condlog(3, "%s checker refcount %d",
55 c->name, c->refcount);
58 condlog(3, "unloading %s checker", c->name);
61 if (dlclose(c->handle) != 0) {
62 condlog(0, "Cannot unload checker %s: %s",
69 void cleanup_checkers (void)
71 struct checker * checker_loop;
72 struct checker * checker_temp;
74 list_for_each_entry_safe(checker_loop, checker_temp, &checkers, node) {
75 free_checker(checker_loop);
79 struct checker * checker_lookup (char * name)
83 if (!name || !strlen(name))
85 list_for_each_entry(c, &checkers, node) {
86 if (!strncmp(name, c->name, CHECKER_NAME_LEN))
89 return add_checker(name);
92 struct checker * add_checker (char * name)
94 char libname[LIB_CHECKER_NAMELEN];
102 snprintf(c->name, CHECKER_NAME_LEN, "%s", name);
103 snprintf(libname, LIB_CHECKER_NAMELEN, "%s/libcheck%s.so",
104 conf->multipath_dir, name);
105 if (stat(libname,&stbuf) < 0) {
106 condlog(0,"Checker '%s' not found in %s",
107 name, conf->multipath_dir);
110 condlog(3, "loading %s checker", libname);
111 c->handle = dlopen(libname, RTLD_NOW);
113 if ((errstr = dlerror()) != NULL)
114 condlog(0, "A dynamic linking error occurred: (%s)",
118 c->check = (int (*)(struct checker *)) dlsym(c->handle, "libcheck_check");
121 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
125 c->init = (int (*)(struct checker *)) dlsym(c->handle, "libcheck_init");
128 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
132 c->free = (void (*)(struct checker *)) dlsym(c->handle, "libcheck_free");
135 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
141 list_add(&c->node, &checkers);
148 void checker_set_fd (struct checker * c, int fd)
155 void checker_set_sync (struct checker * c)
162 void checker_set_async (struct checker * c)
169 void checker_enable (struct checker * c)
176 void checker_disable (struct checker * c)
183 int checker_init (struct checker * c, void ** mpctxt_addr)
187 c->mpcontext = mpctxt_addr;
191 void checker_put (struct checker * dst)
193 struct checker * src;
197 src = checker_lookup(dst->name);
200 memset(dst, 0x0, sizeof(struct checker));
204 int checker_check (struct checker * c)
211 c->message[0] = '\0';
213 MSG(c, "checker disabled");
214 return PATH_UNCHECKED;
217 MSG(c, "no usable fd");
225 int checker_selected (struct checker * c)
229 return (c->check) ? 1 : 0;
232 char * checker_name (struct checker * c)
239 char * checker_message (struct checker * c)
246 void checker_clear_message (struct checker *c)
250 c->message[0] = '\0';
253 void checker_get (struct checker * dst, char * name)
255 struct checker * src = checker_lookup(name);
265 dst->sync = src->sync;
266 strncpy(dst->name, src->name, CHECKER_NAME_LEN);
267 strncpy(dst->message, src->message, CHECKER_MSG_LEN);
268 dst->check = src->check;
269 dst->init = src->init;
270 dst->free = src->free;