LIB_EXPORT rc_t CC KDlsetAddLib ( KDlset *self, KDylib *lib ) { rc_t rc; if ( self == NULL ) rc = RC ( rcFS, rcDylib, rcInserting, rcSelf, rcNull ); else if ( lib == NULL ) rc = RC ( rcFS, rcDylib, rcInserting, rcDylib, rcNull ); else { rc = KDylibAddRef ( lib ); if ( rc == 0 ) { rc = KDlsetAddLibInt ( self, lib ); if ( rc == 0 ) return 0; KDylibRelease ( lib ); } } return rc; }
/* AddAll * adds all dynamic libraries found in dl search path */ static rc_t CC KDlsetTryLib ( const KDirectory *dir, uint32_t type, const char *name, void *data ) { KDlset *self = data; if ( ( type & ~ kptAlias ) == kptFile ) { rc_t rc; KDylib *lib; #ifdef SHLX /* force simple shared library extension */ if ( sizeof SHLX >= 2 ) { /* SHLX has at least 1 character plus NUL byte */ size_t len = strlen ( name ); /* name must be at least 1 character larger */ if ( len <= ( sizeof SHLX - 1 ) ) return 0; /* name must end with shared library extension */ if ( memcmp ( & name [ len - ( sizeof SHLX - 1 ) ], SHLX, sizeof SHLX - 1 ) != 0 ) return 0; } #endif rc = KDyldTryLoadLib ( self -> dl, & lib, dir, name ); if ( rc == 0 ) { rc = KDlsetAddLibInt ( self, lib ); if ( rc == 0 ) return 0; KDylibRelease ( lib ); } } return 0; }
/* load library */ static void testld_load_library ( KDyld *dl, KDlset *libs, const char *libname ) { KDylib *lib; rc_t rc = KDyldLoadLib ( dl, & lib, libname ); if ( rc != 0 ) { PLOGERR ( klogErr, ( klogErr, rc, "failed to load library '$(name)'", "name=%s", libname )); } else { printf ( "loaded library '%s'\n", libname); rc = KDlsetAddLib ( libs, lib ); if ( rc != 0 ) { PLOGERR ( klogInt, ( klogInt, rc, "failed to retain library '$(name)'", "name=%s", libname )); } KDylibRelease ( lib ); } }
/* MakeSet * load a dynamic library * * "set" [ OUT ] - return parameter for lib set */ LIB_EXPORT rc_t CC KDyldMakeSet ( const KDyld *self, KDlset **setp ) { rc_t rc = 0; if ( setp == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcSelf, rcNull ); else { KDlset *set = malloc ( sizeof * set ); if ( set == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted ); else { set -> dl = KDyldAttach ( self ); VectorInit ( & set -> name, 0, 16 ); VectorInit ( & set -> ord, 0, 16 ); KRefcountInit ( & set -> refcount, 1, "KDlset", "make", "dlset" ); #if ! ALWAYS_ADD_EXE { KDylib *jni; const char* libname = "vdb_jni.dll"; rc = KDyldLoadLib ( ( KDyld* ) self, & jni, libname ); if ( rc == 0 ) { rc = KDlsetAddLib ( set, jni ); KDylibRelease ( jni ); } /*if (rc == 0)*/ /* if JNI code is not there, C tools should not suffer */ { * setp = set; return 0; } } #else { KDylib *exe; rc = KDyldLoadLib ( ( KDyld* ) self, & exe, NULL ); if ( rc == 0 ) { rc = KDlsetAddLib ( set, exe ); KDylibRelease ( exe ); if ( rc == 0 ) { * setp = set; return 0; } } } KDlsetRelease ( set ); #endif } } * setp = NULL; } return rc; }
static void CC KDylibVectRelease ( void *item, void *ignore ) { KDylib *self = item; KDylibRelease ( self ); }
static rc_t KNSManagerLoadLib( struct KNSManager *self ) { KDyld *dl; /* make a dynamic-library loader */ rc_t rc = KDyldMake ( &dl ); if ( rc == 0 ) { /* load the curl-library */ rc = KDyldLoadLib( dl, &lib_curl_handle, LPFX "curl" SHLX ); if ( rc == 0 ) { KSymAddr *sym; /* resolve symbols */ /* curl_easy_init() */ rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_init" ); if ( rc == 0 ) { KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_init_fkt) ); KSymAddrRelease( sym ); } /* curl_easy_cleanup() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_cleanup" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_cleanup_fkt) ); KSymAddrRelease( sym ); } /* curl_easy_setopt() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_setopt" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_setopt_fkt) ); KSymAddrRelease( sym ); } /* curl_easy_perform() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_perform" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_perform_fkt) ); KSymAddrRelease( sym ); } /* curl_easy_getinfo() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_getinfo" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_getinfo_fkt) ); KSymAddrRelease( sym ); } /* curl_slist_append() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_append" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_append_fkt) ); KSymAddrRelease( sym ); } /* curl_version() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_version" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_version_fkt) ); KSymAddrRelease( sym ); } /* curl_slist_free_all() */ if ( rc == 0 ) { rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_free_all" ); KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_free_all_fkt) ); KSymAddrRelease( sym ); } /* bail on error */ if ( rc != 0 ) { KDylibRelease ( lib_curl_handle ); lib_curl_handle = NULL; self->curl_easy_init_fkt = NULL; self->curl_easy_cleanup_fkt = NULL; self->curl_easy_setopt_fkt = NULL; self->curl_easy_perform_fkt = NULL; self->curl_slist_append_fkt = NULL; self->curl_version_fkt = NULL; self->curl_easy_getinfo_fkt = NULL; } } KDyldRelease ( dl ); } return rc; }