diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp')
-rw-r--r-- | contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp b/contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp new file mode 100644 index 0000000000..e9de60713d --- /dev/null +++ b/contrib/libs/poco/Foundation/src/SharedLibrary_VX.cpp @@ -0,0 +1,141 @@ +// +// SharedLibrary_VX.cpp +// +// Library: Foundation +// Package: SharedLibrary +// Module: SharedLibrary +// +// Copyright (c) 2004-2011, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/SharedLibrary_VX.h" +#include "Poco/Exception.h" +#include "Poco/Format.h" +#error #include <loadLib.h> +#error #include <unldLib.h> +#include <ioLib.h> +#error #include <symLib.h> +#error #include <sysSymTbl.h> +#include <cstring> + + +struct SymLookup +{ + const char* name; + int group; + void* addr; +}; + + +extern "C" bool lookupFunc(char* name, int val, SYM_TYPE type, int arg, UINT16 group) +{ + SymLookup* symLookup = reinterpret_cast<SymLookup*>(arg); + if (group == symLookup->group && std::strcmp(name, symLookup->name) == 0) + { + symLookup->addr = reinterpret_cast<void*>(val); + return TRUE; + } + else return FALSE; +} + + +namespace Poco { + + +FastMutex SharedLibraryImpl::_mutex; + + +SharedLibraryImpl::SharedLibraryImpl(): + _moduleId(0) +{ +} + + +SharedLibraryImpl::~SharedLibraryImpl() +{ +} + + +void SharedLibraryImpl::loadImpl(const std::string& path, int /*flags*/) +{ + FastMutex::ScopedLock lock(_mutex); + + if (_moduleId) throw LibraryAlreadyLoadedException(path); + int fd = open(const_cast<char*>(path.c_str()), O_RDONLY, 0); + if (fd) + { + _moduleId = loadModule(fd, LOAD_GLOBAL_SYMBOLS); + if (!_moduleId) + { + int err = errno; + close(fd); + throw LibraryLoadException(Poco::format("error %d", err)); + } + } + else + { + int err = errno; + throw LibraryLoadException(Poco::format("cannot open library (error %d)", err)); + } + _path = path; +} + + +void SharedLibraryImpl::unloadImpl() +{ + FastMutex::ScopedLock lock(_mutex); + + if (_moduleId) + { + unldByModuleId(_moduleId, 0); + _moduleId = 0; + } +} + + +bool SharedLibraryImpl::isLoadedImpl() const +{ + return _moduleId != 0; +} + + +void* SharedLibraryImpl::findSymbolImpl(const std::string& name) +{ + poco_assert (_moduleId != 0); + + FastMutex::ScopedLock lock(_mutex); + + MODULE_INFO mi; + if (!moduleInfoGet(_moduleId, &mi)) return 0; + SymLookup symLookup; + symLookup.name = name.c_str(); + symLookup.group = mi.group; + symLookup.addr = 0; + symEach(sysSymTbl, reinterpret_cast<FUNCPTR>(lookupFunc), reinterpret_cast<int>(&symLookup)); + return symLookup.addr; +} + + +const std::string& SharedLibraryImpl::getPathImpl() const +{ + return _path; +} + + +std::string SharedLibraryImpl::suffixImpl() +{ + return ".out"; +} + + +bool SharedLibraryImpl::setSearchPathImpl(const std::string&) +{ + return false; +} + + +} // namespace Poco |