summaryrefslogtreecommitdiff
path: root/boost/dll/detail/posix/program_location_impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/dll/detail/posix/program_location_impl.hpp')
-rw-r--r--boost/dll/detail/posix/program_location_impl.hpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/boost/dll/detail/posix/program_location_impl.hpp b/boost/dll/detail/posix/program_location_impl.hpp
new file mode 100644
index 0000000000..bca9b8caef
--- /dev/null
+++ b/boost/dll/detail/posix/program_location_impl.hpp
@@ -0,0 +1,140 @@
+// Copyright 2014 Renato Tegon Forti, Antony Polukhin.
+// Copyright 2015 Antony Polukhin.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DLL_DETAIL_POSIX_PROGRAM_LOCATION_IMPL_HPP
+#define BOOST_DLL_DETAIL_POSIX_PROGRAM_LOCATION_IMPL_HPP
+
+#include <boost/config.hpp>
+#include <boost/dll/detail/system_error.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/predef/os.h>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+#if BOOST_OS_MACOS || BOOST_OS_IOS
+
+#include <mach-o/dyld.h>
+
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code &ec) {
+ ec.clear();
+
+ char path[1024];
+ uint32_t size = sizeof(path);
+ if (_NSGetExecutablePath(path, &size) == 0)
+ return boost::filesystem::path(path);
+
+ char *p = new char[size];
+ if (_NSGetExecutablePath(p, &size) != 0) {
+ ec = boost::system::error_code(
+ boost::system::errc::bad_file_descriptor,
+ boost::system::generic_category()
+ );
+ }
+
+ boost::filesystem::path ret(p);
+ delete[] p;
+ return ret;
+ }
+}}} // namespace boost::dll::detail
+
+#elif BOOST_OS_SOLARIS
+
+#include <stdlib.h>
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code& ec) {
+ ec.clear();
+
+ return boost::filesystem::path(getexecname());
+ }
+}}} // namespace boost::dll::detail
+
+#elif BOOST_OS_BSD_FREE
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <stdlib.h>
+
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code& ec) {
+ ec.clear();
+
+ int mib[4];
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PATHNAME;
+ mib[3] = -1;
+ char buf[10240];
+ size_t cb = sizeof(buf);
+ sysctl(mib, 4, buf, &cb, NULL, 0);
+
+ return boost::filesystem::path(buf);
+ }
+}}} // namespace boost::dll::detail
+
+
+
+#elif BOOST_OS_BSD_NET
+
+#include <boost/filesystem/operations.hpp>
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code &ec) {
+ return boost::filesystem::read_symlink("/proc/curproc/exe", ec);
+ }
+}}} // namespace boost::dll::detail
+
+#elif BOOST_OS_BSD_DRAGONFLY
+
+#include <boost/filesystem/operations.hpp>
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code &ec) {
+ return boost::filesystem::read_symlink("/proc/curproc/file", ec);
+ }
+}}} // namespace boost::dll::detail
+
+#elif BOOST_OS_QNX
+
+#include <fstream>
+#include <string> // for std::getline
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code &ec) {
+ ec.clear();
+
+ std::string s;
+ std::ifstream ifs("/proc/self/exefile");
+ std::getline(ifs, s);
+
+ if (ifs.fail() || s.empty()) {
+ ec = boost::system::error_code(
+ boost::system::errc::bad_file_descriptor,
+ boost::system::generic_category()
+ );
+ }
+
+ return boost::filesystem::path(s);
+ }
+}}} // namespace boost::dll::detail
+
+#else // BOOST_OS_LINUX || BOOST_OS_UNIX || BOOST_OS_HPUX || BOOST_OS_ANDROID
+
+#include <boost/filesystem/operations.hpp>
+namespace boost { namespace dll { namespace detail {
+ inline boost::filesystem::path program_location_impl(boost::system::error_code &ec) {
+ // We can not use
+ // boost::dll::detail::path_from_handle(dlopen(NULL, RTLD_LAZY | RTLD_LOCAL), ignore);
+ // because such code returns empty path.
+
+ return boost::filesystem::read_symlink("/proc/self/exe", ec); // Linux specific
+ }
+}}} // namespace boost::dll::detail
+
+#endif
+
+#endif // BOOST_DLL_DETAIL_POSIX_PROGRAM_LOCATION_IMPL_HPP
+