void dlmod_unload_module(struct dlmod *dlm) { char sym_deinit[64]; int (*dl_deinit) (void); if (!dlm || dlm->status != DLMOD_LOADED) return; snprintf(sym_deinit, sizeof(sym_deinit), "deinit_%s", dlm->name); dl_deinit = dlsym(dlm->handle, sym_deinit); if (dl_deinit) { DEBUGMSGTL(("dlmod", "Calling deinit_%s()\n", dlm->name)); dl_deinit(); } else { snprintf(sym_deinit, sizeof(sym_deinit), "shutdown_%s", dlm->name); dl_deinit = dlsym(dlm->handle, sym_deinit); if (dl_deinit) { DEBUGMSGTL(("dlmod", "Calling shutdown_%s()\n", dlm->name)); dl_deinit(); } else { DEBUGMSGTL(("dlmod", "No destructor for %s\n", dlm->name)); } } dlclose(dlm->handle); dlm->status = DLMOD_UNLOADED; DEBUGMSGTL(("dlmod", "Module %s unloaded\n", dlm->name)); }
void dlmod_unload_module(struct dlmod *dlm) { char sym_deinit[64]; char buf[256]; int (*dl_deinit) (void); if (!dlm || dlm->status != DLMOD_LOADED) return; snprintf(sym_deinit, sizeof(sym_deinit), "_dynamic_deinit_%s", dlm->name); dl_deinit = dlsym(dlm->handle, sym_deinit); if (dl_deinit == NULL) { /** it's right way ? */ dlm->status = DLMOD_ERROR; return; } dl_deinit(); dlclose(dlm->handle); dlm->status = DLMOD_UNLOADED; #if 1 DEBUGMSGTL(("dlmod", "Module %s unloaded\n", dlm->name)); #endif }