11 static LIST_HEAD(checkers);
13 int init_checkers (void)
15 INIT_LIST_HEAD(&checkers);
16 if (!add_checker(DEFAULT_CHECKER))
21 struct checker * alloc_checker (void)
23 return zalloc(sizeof(struct checker));
26 void free_checker (struct checker * c)
31 void cleanup_checkers (void)
33 struct checker * checker_loop;
34 struct checker * checker_temp;
36 list_for_each_entry_safe(checker_loop, checker_temp, &checkers, node) {
37 list_del(&checker_loop->node);
42 struct checker * checker_lookup (char * name)
46 list_for_each_entry(c, &checkers, node) {
47 if (!strncmp(name, c->name, CHECKER_NAME_LEN))
50 c = add_checker(name);
53 return checker_default();
56 struct checker * add_checker (char * name)
58 char libname[LIB_CHECKER_NAMELEN];
66 snprintf(libname, LIB_CHECKER_NAMELEN, "%s/libcheck%s.so",
67 conf->multipath_dir, name);
68 condlog(3, "loading %s checker", libname);
69 handle = dlopen(libname, RTLD_NOW);
72 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
76 c->check = (int (*)(struct checker *)) dlsym(handle, "libcheck_check");
79 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
83 c->init = (int (*)(struct checker *)) dlsym(handle, "libcheck_init");
86 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
90 c->free = (void (*)(struct checker *)) dlsym(handle, "libcheck_free");
93 condlog(0, "A dynamic linking error occurred: (%s)", errstr);
97 snprintf(c->name, CHECKER_NAME_LEN, "%s", name);
100 list_add(&c->node, &checkers);
107 void checker_set_fd (struct checker * c, int fd)
112 void checker_set_sync (struct checker * c)
117 void checker_set_async (struct checker * c)
122 void checker_enable (struct checker * c)
127 void checker_disable (struct checker * c)
132 int checker_init (struct checker * c, void ** mpctxt_addr)
134 c->mpcontext = mpctxt_addr;
138 void checker_put (struct checker * c)
142 memset(c, 0x0, sizeof(struct checker));
145 int checker_check (struct checker * c)
150 return PATH_UNCHECKED;
152 MSG(c, "no usable fd");
160 int checker_selected (struct checker * c)
162 return (c->check) ? 1 : 0;
165 char * checker_name (struct checker * c)
170 char * checker_message (struct checker * c)
175 struct checker * checker_default (void)
177 return checker_lookup(DEFAULT_CHECKER);
180 void checker_get (struct checker * dst, struct checker * src)
183 dst->sync = src->sync;
184 strncpy(dst->name, src->name, CHECKER_NAME_LEN);
185 strncpy(dst->message, src->message, CHECKER_MSG_LEN);
186 dst->check = src->check;
187 dst->init = src->init;
188 dst->free = src->free;