summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2017-09-09 20:36:04 +0200
committerJulian Andres Klode <jak@debian.org>2017-09-09 21:07:31 +0200
commit96b4580561cd2a8d1467143d67d2a612f0ddc75a (patch)
treef5b66586835dbf895ac63fa606f4303ffc135d7c
parent8d23827be3043daf7fed1b86da1d41578889eaeb (diff)
Directly link against libudev on Linux systems
We previously dlopen()ed it, but it seems painful to do that without any real gain, except for possibly not having libudev in the address space and not having code #ifdefed for Linux. The latter means that we are a bit more likely to break stuff for non-Linux systems now if we play with udev, but at least we don't end up with it silently breaking because of a libudev ABI break. The existing function pointers in the struct were renamed and kept for compat purposes. Fixes Debian/apt#48 Also adjust prepare-release to strip [linux-any] from build-depends for travis.
-rw-r--r--CMake/FindUdev.cmake25
-rw-r--r--CMake/config.h.in3
-rw-r--r--CMakeLists.txt5
-rw-r--r--apt-pkg/CMakeLists.txt2
-rw-r--r--apt-pkg/cdrom.cc47
-rw-r--r--apt-pkg/cdrom.h31
-rw-r--r--debian/control1
-rwxr-xr-xprepare-release1
8 files changed, 63 insertions, 52 deletions
diff --git a/CMake/FindUdev.cmake b/CMake/FindUdev.cmake
new file mode 100644
index 000000000..e416c43da
--- /dev/null
+++ b/CMake/FindUdev.cmake
@@ -0,0 +1,25 @@
+# - Try to find UDEV
+# Once done, this will define
+#
+# UDEV_FOUND - system has UDEV
+# UDEV_INCLUDE_DIRS - the UDEV include directories
+# UDEV_LIBRARIES - the UDEV library
+find_package(PkgConfig)
+
+pkg_check_modules(UDEV_PKGCONF libudev)
+
+find_path(UDEV_INCLUDE_DIRS
+ NAMES libudev.h
+ PATHS ${UDEV_PKGCONF_INCLUDE_DIRS}
+)
+
+
+find_library(UDEV_LIBRARIES
+ NAMES udev
+ PATHS ${UDEV_PKGCONF_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Udev DEFAULT_MSG UDEV_INCLUDE_DIRS UDEV_LIBRARIES)
+
+mark_as_advanced(UDEV_INCLUDE_DIRS UDEV_LIBRARIES)
diff --git a/CMake/config.h.in b/CMake/config.h.in
index f5a03eedd..e1e4f83a1 100644
--- a/CMake/config.h.in
+++ b/CMake/config.h.in
@@ -17,6 +17,9 @@
/* Define if we have the lz4 library for lz4 */
#cmakedefine HAVE_LZ4
+/* Define if we have the udev library */
+#cmakedefine HAVE_UDEV
+
/* These two are used by the statvfs shim for glibc2.0 and bsd */
/* Define if we have sys/vfs.h */
#cmakedefine HAVE_VFS_H
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f9ad2cd71..28d5cce07 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -119,6 +119,11 @@ if (LZ4_FOUND)
set(HAVE_LZ4 1)
endif()
+find_package(Udev)
+if (UDEV_FOUND)
+ set(HAVE_UDEV 1)
+endif()
+
# Mount()ing and stat()ing and friends
check_symbol_exists(statfs sys/vfs.h HAVE_VFS_H)
check_include_files(sys/params.h HAVE_PARAMS_H)
diff --git a/apt-pkg/CMakeLists.txt b/apt-pkg/CMakeLists.txt
index e3e078b81..651e55c79 100644
--- a/apt-pkg/CMakeLists.txt
+++ b/apt-pkg/CMakeLists.txt
@@ -44,6 +44,7 @@ target_include_directories(apt-pkg
${BZIP2_INCLUDE_DIR}
${LZMA_INCLUDE_DIRS}
${LZ4_INCLUDE_DIRS}
+ ${UDEV_INCLUDE_DIRS}
${ICONV_INCLUDE_DIRS}
)
@@ -54,6 +55,7 @@ target_link_libraries(apt-pkg
${BZIP2_LIBRARIES}
${LZMA_LIBRARIES}
${LZ4_LIBRARIES}
+ ${UDEV_LIBRARIES}
${ICONV_LIBRARIES}
)
set_target_properties(apt-pkg PROPERTIES VERSION ${MAJOR}.${MINOR})
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc
index 2dccc6d12..4f57153f9 100644
--- a/apt-pkg/cdrom.cc
+++ b/apt-pkg/cdrom.cc
@@ -27,6 +27,10 @@
#include <apti18n.h>
+#ifdef HAVE_UDEV
+#include <libudev.h>
+#endif
+
using namespace std;
// FindPackages - Find the package files on the CDROM /*{{{*/
@@ -913,43 +917,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
return true;
}
/*}}}*/
-pkgUdevCdromDevices::pkgUdevCdromDevices() /*{{{*/
-: d(NULL), libudev_handle(NULL), udev_new(NULL), udev_enumerate_add_match_property(NULL),
- udev_enumerate_scan_devices(NULL), udev_enumerate_get_list_entry(NULL),
- udev_device_new_from_syspath(NULL), udev_enumerate_get_udev(NULL),
- udev_list_entry_get_name(NULL), udev_device_get_devnode(NULL),
- udev_enumerate_new(NULL), udev_list_entry_get_next(NULL),
- udev_device_get_property_value(NULL), udev_enumerate_add_match_sysattr(NULL)
+
+pkgUdevCdromDevices::pkgUdevCdromDevices() /*{{{*/
+ : d(NULL)
{
}
/*}}}*/
bool pkgUdevCdromDevices::Dlopen() /*{{{*/
{
- // alread open
- if(libudev_handle != NULL)
- return true;
-
- // see if we can get libudev
- void *h = ::dlopen("libudev.so.0", RTLD_LAZY);
- if(h == NULL)
- return false;
-
- // get the pointers to the udev structs
- libudev_handle = h;
- udev_new = (udev* (*)(void)) dlsym(h, "udev_new");
- udev_enumerate_add_match_property = (int (*)(udev_enumerate*, const char*, const char*))dlsym(h, "udev_enumerate_add_match_property");
- udev_enumerate_add_match_sysattr = (int (*)(udev_enumerate*, const char*, const char*))dlsym(h, "udev_enumerate_add_match_sysattr");
- udev_enumerate_scan_devices = (int (*)(udev_enumerate*))dlsym(h, "udev_enumerate_scan_devices");
- udev_enumerate_get_list_entry = (udev_list_entry* (*)(udev_enumerate*))dlsym(h, "udev_enumerate_get_list_entry");
- udev_device_new_from_syspath = (udev_device* (*)(udev*, const char*))dlsym(h, "udev_device_new_from_syspath");
- udev_enumerate_get_udev = (udev* (*)(udev_enumerate*))dlsym(h, "udev_enumerate_get_udev");
- udev_list_entry_get_name = (const char* (*)(udev_list_entry*))dlsym(h, "udev_list_entry_get_name");
- udev_device_get_devnode = (const char* (*)(udev_device*))dlsym(h, "udev_device_get_devnode");
- udev_enumerate_new = (udev_enumerate* (*)(udev*))dlsym(h, "udev_enumerate_new");
- udev_list_entry_get_next = (udev_list_entry* (*)(udev_list_entry*))dlsym(h, "udev_list_entry_get_next");
- udev_device_get_property_value = (const char* (*)(udev_device *, const char *))dlsym(h, "udev_device_get_property_value");
-
return true;
}
/*}}}*/
@@ -963,13 +939,11 @@ vector<CdromDevice> pkgUdevCdromDevices::Scan()
vector<CdromDevice> pkgUdevCdromDevices::ScanForRemovable(bool CdromOnly)/*{{{*/
{
vector<CdromDevice> cdrom_devices;
+#ifdef HAVE_UDEV
struct udev_enumerate *enumerate;
struct udev_list_entry *l, *devices;
struct udev *udev_ctx;
- if(libudev_handle == NULL)
- return cdrom_devices;
-
udev_ctx = udev_new();
enumerate = udev_enumerate_new (udev_ctx);
if (CdromOnly)
@@ -1008,15 +982,14 @@ vector<CdromDevice> pkgUdevCdromDevices::ScanForRemovable(bool CdromOnly)/*{{{*/
cdrom.MountPath = "";
}
cdrom_devices.push_back(cdrom);
- }
+ }
+#endif
return cdrom_devices;
}
/*}}}*/
pkgUdevCdromDevices::~pkgUdevCdromDevices() /*{{{*/
{
- if (libudev_handle != NULL)
- dlclose(libudev_handle);
}
/*}}}*/
diff --git a/apt-pkg/cdrom.h b/apt-pkg/cdrom.h
index 7425c09c1..6bc2b34f9 100644
--- a/apt-pkg/cdrom.h
+++ b/apt-pkg/cdrom.h
@@ -99,22 +99,23 @@ struct CdromDevice /*{{{*/
class pkgUdevCdromDevices /*{{{*/
{
void * const d;
+
protected:
- // libudev dlopen structure
- void *libudev_handle;
- struct udev* (*udev_new)(void);
- int (*udev_enumerate_add_match_property)(struct udev_enumerate *udev_enumerate, const char *property, const char *value);
- int (*udev_enumerate_scan_devices)(struct udev_enumerate *udev_enumerate);
- struct udev_list_entry* (*udev_enumerate_get_list_entry)(struct udev_enumerate *udev_enumerate);
- struct udev_device* (*udev_device_new_from_syspath)(struct udev *udev, const char *syspath);
- struct udev* (*udev_enumerate_get_udev)(struct udev_enumerate *udev_enumerate);
- const char* (*udev_list_entry_get_name)(struct udev_list_entry *list_entry);
- const char* (*udev_device_get_devnode)(struct udev_device *udev_device);
- struct udev_enumerate *(*udev_enumerate_new) (struct udev *udev);
- struct udev_list_entry *(*udev_list_entry_get_next)(struct udev_list_entry *list_entry);
- const char* (*udev_device_get_property_value)(struct udev_device *udev_device, const char *key);
- int (*udev_enumerate_add_match_sysattr)(struct udev_enumerate *udev_enumerate, const char *property, const char *value);
- // end libudev dlopen
+ // old libudev dlopen structure, not used anymore, but can't break ABI
+ void *_padding;
+ struct _padding *(*_padding__new)(void);
+ int (*_padding__enumerate_add_match_property)(struct _padding_enumerate *_padding_enumerate, const char *property, const char *value);
+ int (*_padding__enumerate_scan_devices)(struct _padding_enumerate *_padding_enumerate);
+ struct _padding_list_entry *(*_padding__enumerate_get_list_entry)(struct _padding_enumerate *_padding_enumerate);
+ struct _padding_device *(*_padding__device_new_from_syspath)(struct _padding *_padding, const char *syspath);
+ struct _padding *(*_padding__enumerate_get__padding)(struct _padding_enumerate *_padding_enumerate);
+ const char *(*_padding__list_entry_get_name)(struct _padding_list_entry *list_entry);
+ const char *(*_padding__device_get_devnode)(struct _padding_device *_padding_device);
+ struct _padding_enumerate *(*_padding__enumerate_new)(struct _padding *_padding);
+ struct _padding_list_entry *(*_padding__list_entry_get_next)(struct _padding_list_entry *list_entry);
+ const char *(*_padding__device_get_property_value)(struct _padding_device *_padding_device, const char *key);
+ int (*_padding__enumerate_add_match_sysattr)(struct _padding_enumerate *_padding_enumerate, const char *property, const char *value);
+ // end lib_padding dlopen
public:
pkgUdevCdromDevices();
diff --git a/debian/control b/debian/control
index 0ea6d2b55..8af75e9f0 100644
--- a/debian/control
+++ b/debian/control
@@ -21,6 +21,7 @@ Build-Depends: cmake (>= 3.4),
libgnutls28-dev (>= 3.4.6),
liblz4-dev (>= 0.0~r126),
liblzma-dev,
+ libudev-dev [linux-any],
pkg-config,
po4a (>= 0.34-2),
xsltproc,
diff --git a/prepare-release b/prepare-release
index d7eb14705..e12ca2dc9 100755
--- a/prepare-release
+++ b/prepare-release
@@ -39,6 +39,7 @@ test_deb_control() {
) | tr '\n' ' '\
| sed -r -e 's#<[^,<>()@]*>##g' \
-e 's#@[^,<>()@]*@##g' \
+ -e 's#\[linux-any\]*##g' \
-e 's#dpkg-dev \([^)]*\)#dpkg-dev#g' \
-e 's#debhelper \([^)]*\)#debhelper#g' \
-e 's#g\+\+ \([^)]*\)#g++#g' \