int plugin_register(plugin_t *plugin) { if (!plugin) { errno = EINVAL; return 1; } /* Setup default name if none is provided */ if (!plugin->name) { #ifndef ENABLE_STATIC Dl_info info; if (dladdr(plugin, &info) && info.dli_fname) plugin->name = basename(info.dli_fname); #endif if (!plugin->name) plugin->name = "unknown"; } plugin->name = trim_ext(strdup(plugin->name)); /* Already registered? */ if (plugin_find(plugin->name)) { _d("... %s already loaded", plugin->name); free(plugin->name); return 0; } #ifndef ENABLE_STATIC /* Resolve plugin dependencies */ check_plugin_depends(plugin); #endif TAILQ_INSERT_TAIL(&plugins, plugin, link); return 0; }
int plugin_register(plugin_t *plugin) { int i, inuse = 0; if (!plugin) { errno = EINVAL; return 1; } if (!plugin->name) { Dl_info info; if (!dladdr(plugin, &info) || !info.dli_fname) plugin->name = "unknown"; else plugin->name = (char *)info.dli_fname; } /* Already registered? */ if (plugin_find(plugin->name)) { _d("... %s already loaded.", plugin->name); return 0; } check_plugin_depends(plugin); if (is_io_plugin(plugin)) { if (num_fds + 1 >= MAX_NUM_FDS) { num_fds = MAX_NUM_SVC; errno = ENOMEM; return 1; } num_fds++; inuse++; } if (plugin->svc.cb) { svc_t *svc = svc_find(plugin->name); if (svc) { inuse++; svc->cb = plugin->svc.cb; svc->dynamic = plugin->svc.dynamic; svc->dynamic_stop = plugin->svc.dynamic_stop; } } for (i = 0; i < HOOK_MAX_NUM; i++) { if (plugin->hook[i].cb) inuse++; } if (!inuse) { _d("No service \"%s\" loaded, and no I/O or finit hooks, skipping plugin.", basename(plugin->name)); return 1; } TAILQ_INSERT_TAIL(&plugins, plugin, link); return 0; }