11 char *checker_state_names[] = {
21 static LIST_HEAD(checkers);
23 char * checker_state_name (int i)
25 return checker_state_names[i];
28 int init_checkers (void)
30 if (!add_checker(DEFAULT_CHECKER))
35 struct checker * alloc_checker (void)
37 return MALLOC(sizeof(struct checker));
40 void free_checker (struct checker * c)
45 void cleanup_checkers (void)
47 struct checker * checker_loop;
48 struct checker * checker_temp;
50 list_for_each_entry_safe(checker_loop, checker_temp, &checkers, node) {
51 list_del(&checker_loop->node);
52 free_checker(checker_loop);
56 struct checker * checker_lookup (char * name)
60 list_for_each_entry(c, &checkers, node) {
61 if (!strncmp(name, c->name, CHECKER_NAME_LEN))
64 return add_checker(name);
67 struct checker * add_checker (char * name)
69 char libname[LIB_CHECKER_NAMELEN];
77 snprintf(libname, LIB_CHECKER_NAMELEN, "%s/libcheck%s.so",
78 conf->multipath_dir, name);
79 condlog(3, "loading %s checker", libname);
80 handle = dlopen(libname, RTLD_NOW);
83 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
87 c->check = (int (*)(struct checker *)) dlsym(handle, "libcheck_check");
90 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
94 c->init = (int (*)(struct checker *)) dlsym(handle, "libcheck_init");
97 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
101 c->free = (void (*)(struct checker *)) dlsym(handle, "libcheck_free");
104 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
108 snprintf(c->name, CHECKER_NAME_LEN, "%s", name);
111 list_add(&c->node, &checkers);
118 void checker_set_fd (struct checker * c, int fd)
123 void checker_set_sync (struct checker * c)
128 void checker_set_async (struct checker * c)
133 void checker_enable (struct checker * c)
138 void checker_disable (struct checker * c)
143 int checker_init (struct checker * c, void ** mpctxt_addr)
145 c->mpcontext = mpctxt_addr;
149 void checker_put (struct checker * c)
153 memset(c, 0x0, sizeof(struct checker));
156 int checker_check (struct checker * c)
161 return PATH_UNCHECKED;
163 MSG(c, "no usable fd");
171 int checker_selected (struct checker * c)
173 return (c->check) ? 1 : 0;
176 char * checker_name (struct checker * c)
181 char * checker_message (struct checker * c)
186 void checker_get (struct checker * dst, char * name)
188 struct checker * src = checker_lookup(name);
195 dst->sync = src->sync;
196 strncpy(dst->name, src->name, CHECKER_NAME_LEN);
197 strncpy(dst->message, src->message, CHECKER_MSG_LEN);
198 dst->check = src->check;
199 dst->init = src->init;
200 dst->free = src->free;