Browse Source

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.
tags/debian/1.5_rc2
Julian Andres Klode 3 years ago
parent
commit
96b4580561
8 changed files with 63 additions and 52 deletions
  1. +25
    -0
      CMake/FindUdev.cmake
  2. +3
    -0
      CMake/config.h.in
  3. +5
    -0
      CMakeLists.txt
  4. +2
    -0
      apt-pkg/CMakeLists.txt
  5. +10
    -37
      apt-pkg/cdrom.cc
  6. +16
    -15
      apt-pkg/cdrom.h
  7. +1
    -0
      debian/control
  8. +1
    -0
      prepare-release

+ 25
- 0
CMake/FindUdev.cmake View File

@@ -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)

+ 3
- 0
CMake/config.h.in View File

@@ -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


+ 5
- 0
CMakeLists.txt View File

@@ -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)


+ 2
- 0
apt-pkg/CMakeLists.txt View File

@@ -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})


+ 10
- 37
apt-pkg/cdrom.cc View File

@@ -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);
}
/*}}}*/



+ 16
- 15
apt-pkg/cdrom.h View File

@@ -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();


+ 1
- 0
debian/control View File

@@ -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,


+ 1
- 0
prepare-release View File

@@ -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' \


Loading…
Cancel
Save