static void()

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;
}