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; }
static rc_t ReportBinary(const ReportFuncs *f, uint32_t indent, const char* argv0) { rc_t rc = 0; KDyld *dyld = NULL; assert(argv0); rc = KDyldMake(&dyld); if (rc != 0) { reportError(indent + 1, rc, "KDyldMake"); } else { const KDirectory* dir = NULL; rc = KDyldHomeDirectory(dyld, &dir, (fptr_t) ReportFinalize); if (rc != 0) { reportError(indent + 1, rc, "KDyldHomeDirectory"); } else { char binary[PATH_MAX + 1]; const char* name = strpbrk(argv0, "/\\"); const char* last_name = name; if (last_name) { ++last_name; } while (name) { name = strpbrk(last_name, "/\\"); if (name) { last_name = name; if (last_name) { ++last_name; } } } name = last_name ? last_name : argv0; rc = KDirectoryResolvePath(dir, true, binary, sizeof binary, "%s", name); if (rc != 0) { reportErrorStr(indent + 1, rc, "KDirectoryResolvePath", "origin", "KDyldHomeDirectory"); } else { bool found = false; const char tag[] = "Binary"; const char* sType = NULL; uint8_t digest[16]; uint32_t type = KDirectoryPathType(dir, "%s", binary); switch (type & ~kptAlias) { case kptFile: sType = type & kptAlias ? "alias" : "file"; found = true; break; case kptNotFound: sType = "not found"; break; default: sType = "unknown"; break; } if (found) { rc = md5(name, digest, dir); } if (type & kptAlias) { if (found && rc == 0) { reportOpen(indent, tag, 3, "path", 's', binary, "type", 's', sType, "md5", 'M', digest); } else { reportOpen(indent, tag, 2, "path", 's', binary, "type", 's', sType); } if (rc == 0 && type & kptAlias) { rc = ReportAlias(f, indent + 1, name, dir); } reportClose(indent, tag); } else { if (found && rc == 0) { report(indent, tag, 3, "path", 's', binary, "type", 's', sType, "md5", 'M', digest); } else { report(indent, tag, 2, "path", 's', binary, "type", 's', sType); } } } } RELEASE(KDirectory, dir); } RELEASE(KDyld, dyld); return rc; }
rc_t CC KMain ( int argc, char *argv [] ) { Args * args; rc_t rc; rc = ArgsMakeAndHandle (&args, argc, argv, 1, MyOptions, sizeof MyOptions / sizeof (OptDef)); if (rc) LOGERR (klogInt, rc, "failed to parse arguments"); else { do { KDyld *dl; uint32_t num_libs; rc = ArgsParamCount (args, &num_libs); if (rc) { LOGERR ( klogInt, rc, "Failure to count parameters" ); break; } if (num_libs == 0) { rc = MiniUsage(args); break; } /* create loader */ rc = KDyldMake (&dl); if (rc) { LOGERR ( klogInt, rc, "failed to create dynamic loader" ); break; } else { do { KDlset *libs; const char * path; uint32_t ix; uint32_t num_paths; rc = ArgsOptionCount (args, OPTION_LOAD, &num_paths); if (rc) { LOGERR (klogInt, rc, "failed to count paths"); break; } for (ix = 0; ix < num_paths; ix++) { rc = ArgsOptionValue (args, OPTION_LOAD, ix, (const void **)&path); if (rc) { LOGERR (klogInt, rc, "failed to access a path option"); break; } testld_update_libpath (dl, path); } if (rc) break; /* append contents of LD_LIBRARY_PATH */ path = getenv ( "LD_LIBRARY_PATH" ); if (path) testld_update_libpath (dl, path); /* create libset */ rc = KDyldMakeSet (dl, & libs); if (rc) { LOGERR (klogInt, rc, "failed to create dl library set"); break; } else { /* test it */ for (ix = 0; ix < num_libs; ++ ix ) { rc = ArgsParamValue (args, ix, (const void **)&path); if (rc) break; testld_load_library (dl, libs, path); } KDlsetRelease ( libs ); } } while (0); KDyldRelease ( dl ); } } while (0); ArgsWhack (args); } return rc; }