B_DB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user, const char *db_password, const char *db_address, int db_port, const char *db_socket, bool mult_db_connections, bool disable_batch_insert, bool need_private) { struct stat st; char *backend_dir; void *dl_handle = NULL; POOL_MEM shared_library_name(PM_FNAME); backend_interface_mapping_t *backend_interface_mapping; backend_shared_library_t *backend_shared_library; t_backend_instantiate backend_instantiate; t_flush_backend flush_backend; /* * For dynamic loading catalog backends there must be a list of backend dirs set. */ if (!backend_dirs) { Jmsg(jcr, M_ABORT, 0, _("Catalog Backends Dir not configured.\n")); } /* * A db_driver is mandatory for dynamic loading of backends to work. */ if (!db_driver) { Jmsg(jcr, M_ABORT, 0, _("Driver type not specified in Catalog resource.\n")); } /* * If we didn't find a mapping its fatal because we don't know what database backend to use. */ backend_interface_mapping = lookup_backend_interface_mapping(db_driver); if (backend_interface_mapping == NULL) { Jmsg(jcr, M_ABORT, 0, _("Unknown database type: %s\n"), db_driver); return (B_DB *)NULL; } /* * See if the backend is already loaded. */ if (loaded_backends) { foreach_alist(backend_shared_library, loaded_backends) { if (backend_shared_library->interface_type_id == backend_interface_mapping->interface_type_id) { return backend_shared_library->backend_instantiate(jcr, db_driver, db_name, db_user, db_password, db_address, db_port, db_socket, mult_db_connections, disable_batch_insert, need_private); } } } /* * This is a new backend try to use dynamic loading to load the backend library. */ foreach_alist(backend_dir, backend_dirs) { Mmsg(shared_library_name, "%s/libbareoscats-%s%s", backend_dir, backend_interface_mapping->interface_name, DYN_LIB_EXTENSION); Dmsg3(100, "db_init_database: testing backend %s/libbareoscats-%s%s\n", backend_dir, backend_interface_mapping->interface_name, DYN_LIB_EXTENSION); /* * Make sure the shared library with this name exists. */ if (stat(shared_library_name.c_str(), &st) == 0) { dl_handle = dlopen(shared_library_name.c_str(), RTLD_NOW); if (!dl_handle) { Jmsg(jcr, M_ERROR, 0, _("Unable to load shared library: %s ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); continue; } /* * Lookup the backend_instantiate function. */ backend_instantiate = (t_backend_instantiate)dlsym(dl_handle, "backend_instantiate"); if (backend_instantiate == NULL) { Jmsg(jcr, M_ERROR, 0, _("Lookup of backend_instantiate in shared library %s failed: ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); dlclose(dl_handle); dl_handle = NULL; continue; } /* * Lookup the flush_backend function. */ flush_backend = (t_flush_backend)dlsym(dl_handle, "flush_backend"); if (flush_backend == NULL) { Jmsg(jcr, M_ERROR, 0, _("Lookup of flush_backend in shared library %s failed: ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); dlclose(dl_handle); dl_handle = NULL; continue; } /* * We found the shared library and it has the right entry points. */ break; } }
DEVICE *init_backend_dev(JCR *jcr, int device_type) { struct stat st; char *backend_dir; void *dl_handle = NULL; POOL_MEM shared_library_name(PM_FNAME); backend_interface_mapping_t *backend_interface_mapping; backend_shared_library_t *backend_shared_library; t_backend_instantiate backend_instantiate; t_flush_backend flush_backend; /* * For dynamic loading storage backends there must be a list of backend dirs set. */ if (!backend_dirs) { Jmsg(jcr, M_ERROR_TERM, 0, _("Catalog Backends Dir not configured.\n")); } backend_interface_mapping = lookup_backend_interface_mapping(device_type); if (backend_interface_mapping == NULL) { return (DEVICE *)NULL; } /* * See if the backend is already loaded. */ if (loaded_backends) { foreach_alist(backend_shared_library, loaded_backends) { if (backend_shared_library->interface_type_id == backend_interface_mapping->interface_type_id) { return backend_shared_library->backend_instantiate(jcr, device_type); } } } /* * This is a new backend try to use dynamic loading to load the backend library. */ foreach_alist(backend_dir, backend_dirs) { Mmsg(shared_library_name, "%s/libbareossd-%s%s", backend_dir, backend_interface_mapping->interface_name, DYN_LIB_EXTENSION); Dmsg3(100, "init_backend_dev: testing backend %s/libbareossd-%s%s\n", backend_dir, backend_interface_mapping->interface_name, DYN_LIB_EXTENSION); /* * Make sure the shared library with this name exists. */ if (stat(shared_library_name.c_str(), &st) == 0) { dl_handle = dlopen(shared_library_name.c_str(), RTLD_NOW); if (!dl_handle) { Jmsg(jcr, M_ERROR, 0, _("Unable to load shared library: %s ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); continue; } /* * Lookup the backend_instantiate function. */ backend_instantiate = (t_backend_instantiate)dlsym(dl_handle, "backend_instantiate"); if (backend_instantiate == NULL) { Jmsg(jcr, M_ERROR, 0, _("Lookup of backend_instantiate in shared library %s failed: ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); dlclose(dl_handle); dl_handle = NULL; continue; } /* * Lookup the flush_backend function. */ flush_backend = (t_flush_backend)dlsym(dl_handle, "flush_backend"); if (flush_backend == NULL) { Jmsg(jcr, M_ERROR, 0, _("Lookup of flush_backend in shared library %s failed: ERR=%s\n"), shared_library_name.c_str(), NPRT(dlerror())); dlclose(dl_handle); dl_handle = NULL; continue; } /* * We found the shared library and it has the right entry points. */ break; } }