[libcamera-devel] [PATCH LIBCAMERA v3 3/6] libcamera: utils: add Libcamera installed & path
Kaaira Gupta
kgupta at es.iitr.ac.in
Wed Mar 18 12:58:43 CET 2020
Add a global functions 'isLibcameraInstalled' to check if libcamera is
installed or not, and another global function 'libcameraPath' to return
the path of libcamera.so in utils.
Signed-off-by: Kaaira Gupta <kgupta at es.iitr.ac.in>
---
src/libcamera/include/utils.h | 4 +++
src/libcamera/utils.cpp | 48 +++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
index 9405977..bc96e79 100644
--- a/src/libcamera/include/utils.h
+++ b/src/libcamera/include/utils.h
@@ -143,6 +143,10 @@ private:
details::StringSplitter split(const std::string &str, const std::string &delim);
+bool isLibcameraInstalled();
+
+std::string libcameraPath();
+
} /* namespace utils */
} /* namespace libcamera */
diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
index f566e88..aeaf163 100644
--- a/src/libcamera/utils.cpp
+++ b/src/libcamera/utils.cpp
@@ -12,12 +12,18 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <dlfcn.h>
+#include <elf.h>
+#include <link.h>
/**
* \file utils.h
* \brief Miscellaneous utility functions
*/
+/* musl doesn't declare _DYNAMIC in link.h, declare it manually. */
+extern ElfW(Dyn) _DYNAMIC[];
+
namespace libcamera {
namespace utils {
@@ -310,6 +316,48 @@ details::StringSplitter split(const std::string &str, const std::string &delim)
return details::StringSplitter(str, delim);
}
+/**
+ * \brief Checks if Libcamera is installed or not
+ *
+ * Utilises the build_rpath dynamic tag which is stripped out by meson at
+ * install time to determine at runtime if the library currently executing
+ * has been installed or not.
+ *
+ * \return A bool stating if libcamera is installed or not
+ */
+bool isLibcameraInstalled()
+{
+ /*
+ * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on
+ * install.
+ */
+ for (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) {
+ if (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH)
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * \brief Identifies libcamera path
+ *
+ * Identifies the location by finding the path of the active libcamera.so itself.
+ *
+ * \return A string stating the path.
+ */
+std::string libcameraPath()
+{
+ Dl_info info;
+
+ /* Look up our own symbol. */
+ int ret = dladdr(reinterpret_cast<void *>(libcameraPath), &info);
+ if (ret == 0)
+ return nullptr;
+
+ return info.dli_fname;
+}
+
} /* namespace utils */
} /* namespace libcamera */
--
2.17.1
More information about the libcamera-devel
mailing list