in output.c [25:73]
static void (*outputs[MAXOUTS])(int, struct in6_addr *, struct msg_buf *,
struct ncrx_msg *);
static int nr_outputs;
int register_output_module(char *path, int nr_workers)
{
void *dl, *dlsym_addr;
int (*mod_init)(int);
int ret;
if (nr_outputs == MAXOUTS) {
warn("Too many output modules!\n");
return -1;
}
log("Loading module '%s'\n", path);
dl = dlopen(path, RTLD_NOW|RTLD_LOCAL);
if (!dl) {
warn("Can't open '%s': %s", path, dlerror());
return -1;
}
dlsym_addr = dlsym(dl, "netconsd_output_handler");
if (!dlsym_addr) {
warn("Can't find handler sym in '%s': %s", path, dlerror());
goto err_close;
}
mod_init = dlsym(dl, "netconsd_output_init");
if (mod_init) {
log("Calling mod_init() for '%s'\n", path);
ret = mod_init(nr_workers);
if (ret) {
warn("mod_init() for '%s' failed: %d\n", path, ret);
goto err_close;
}
}
log("Module '%s' registered (#%d@%p)\n", path, nr_outputs, dlsym_addr);
output_dlhandles[nr_outputs] = dl;
outputs[nr_outputs] = dlsym_addr;
nr_outputs++;
return 0;
err_close:
dlclose(dl);
return -1;
}