VirtualBox

Changeset 15057 in vbox for trunk/src/VBox/Main/linux


Ignore:
Timestamp:
Dec 5, 2008 9:47:30 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40443
Message:

Main: load libdbus-1 dynamically on Linux hosts

Location:
trunk/src/VBox/Main/linux
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/linux/HostHardwareLinux.cpp

    r14992 r15057  
    4949# include <linux/cdrom.h>
    5050# ifdef VBOX_WITH_DBUS
    51 #  include <dbus/dbus.h>
    52 /* These are defined by the dbus headers and by VBox header files. */
    53 #  undef TRUE
    54 #  undef FALSE
     51#  include <vbox-dbus.h>
    5552# endif
    5653# include <errno.h>
     
    7774#ifdef VBOX_WITH_DBUS
    7875static int halInit(DBusConnection **ppConnection);
     76/* This must be extern to be used in the RTMemAutoPtr template */
     77extern void halShutdown (DBusConnection *pConnection);
    7978static int halFindDeviceStringMatch (DBusConnection *pConnection,
    8079                                     const char *pszKey, const char *pszValue,
     
    103102#if defined(RT_OS_LINUX)
    104103#ifdef VBOX_WITH_DBUS
    105         if (RT_SUCCESS (rc) && (!success || testing()))
     104        if (RT_SUCCESS (rc) && VBoxDBusCheckPresence() && (!success || testing()))
    106105            rc = getDriveInfoFromHal(&mDVDList, true /* isDVD */, &success);
    107106#endif /* VBOX_WITH_DBUS defined */
     
    153152#if defined(RT_OS_LINUX)
    154153#ifdef VBOX_WITH_DBUS
    155         if (RT_SUCCESS (rc) && (!success || testing()))
     154        if (RT_SUCCESS (rc) && VBoxDBusCheckPresence() && (!success || testing()))
    156155            rc = getDriveInfoFromHal(&mFloppyList, false /* isDVD */, &success);
    157156#endif /* VBOX_WITH_DBUS defined */
     
    403402    ~autoDBusError ()
    404403    {
    405         if (dbus_error_is_set (&mError))
     404        if (IsSet())
    406405            dbus_error_free (&mError);
    407406    }
    408407    DBusError &get () { return mError; }
    409     bool IsSet () { return dbus_error_is_set (&mError); }
     408    bool IsSet ()
     409    {
     410        Assert ((mError.name == NULL) == (mError.message == NULL));
     411        return (mError.name != NULL);
     412    }
    410413    bool HasName (const char *pszName)
    411414    {
    412         return dbus_error_has_name (&mError, pszName);
     415        Assert ((mError.name == NULL) == (mError.message == NULL));
     416        return (RTStrCmp (mError.name, pszName) == 0);
    413417    }
    414418    void FlowLog ()
     
    449453                            "interface='org.freedesktop.Hal.Manager',"
    450454                            "sender='org.freedesktop.Hal',"
    451                             "path='/org/freedesktop/Hal/Manager'", &dbusError.get());
     455                            "path='/org/freedesktop/Hal/Manager'",
     456                            &dbusError.get());
    452457        halSuccess = !dbusError.IsSet();
    453458    }
     
    458463    dbusError.FlowLog();
    459464    return rc;
     465}
     466
     467/**
     468 * Helper function for shutting down a connection to hal
     469 * @param   pConnection  the connection handle
     470 */
     471/* static */
     472void halShutdown (DBusConnection *pConnection)
     473{
     474    AssertReturnVoid(VALID_PTR (pConnection));
     475    LogFlowFunc (("pConnection=%p\n", pConnection));
     476    autoDBusError dbusError;
     477
     478    dbus_bus_remove_match (pConnection,
     479                           "type='signal',"
     480                           "interface='org.freedesktop.Hal.Manager',"
     481                           "sender='org.freedesktop.Hal',"
     482                           "path='/org/freedesktop/Hal/Manager'",
     483                           &dbusError.get());
     484    dbus_connection_unref (pConnection);
     485    LogFlowFunc(("returning\n"));
     486    dbusError.FlowLog();
    460487}
    461488
     
    624651
    625652    rc = halInit (&pConnection);
    626     RTMemAutoPtr <DBusConnection, dbus_connection_unref> dbusConnection;
     653    RTMemAutoPtr <DBusConnection, halShutdown> dbusConnection;
    627654    dbusConnection = pConnection;
    628655    if (!dbusConnection)
  • trunk/src/VBox/Main/linux/vbox-dbus.cpp

    r15022 r15057  
    11/** @file
    22 *
    3  * Module to dynamically load libhal and libdbus and load all symbols
     3 * Module to dynamically load libdbus and load all symbols
    44 * which are needed by VirtualBox.
    55 */
    66
    77/*
    8  * Copyright (C) 2006-2007 Sun Microsystems, Inc.
     8 * Copyright (C) 2008 Sun Microsystems, Inc.
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    2121 */
    2222
    23 #include "vbox-libhal.h"
     23#include "vbox-dbus.h"
    2424
    2525#include <iprt/err.h>
     
    2727
    2828/**
    29  * Whether we have tried to load libdbus and libhal yet.  This flag should only be set
    30  * to "true" after we have either loaded both libraries and all symbols which we need,
    31  * or failed to load something and unloaded and set back to zero pLibDBus and pLibHal.
     29 * Whether we have tried to load libdbus-1 yet.  This flag should only be set
     30 * to "true" after we have either loaded the library and all symbols which we
     31 * need, or failed to load something and unloaded and set back to zero
     32 * pLibDBus.
    3233 */
    33 static bool gCheckedForLibHal = false;
     34static bool gCheckedForLibDBus = false;
    3435/**
    35  * Pointer to the libhal shared object.  This should only be set once all needed libraries
    36  * and symbols have been successfully loaded.
     36 * Pointer to the libdbus-1 shared object.  This should only be set once all
     37 * needed libraries and symbols have been successfully loaded.
    3738 */
    38 static RTLDRMOD ghLibHal = 0;
     39static RTLDRMOD ghLibDBus = NULL;
    3940
    40 /** The following are the symbols which we need from libdbus and libhal. */
    41 void (*gDBusErrorInit)(DBusError *);
    42 DBusConnection *(*gDBusBusGet)(DBusBusType, DBusError *);
    43 void (*gDBusErrorFree)(DBusError *);
    44 void (*gDBusConnectionUnref)(DBusConnection *);
    45 LibHalContext *(*gLibHalCtxNew)(void);
    46 dbus_bool_t (*gLibHalCtxSetDBusConnection)(LibHalContext *, DBusConnection *);
    47 dbus_bool_t (*gLibHalCtxInit)(LibHalContext *, DBusError *);
    48 char **(*gLibHalFindDeviceStringMatch)(LibHalContext *, const char *, const char *, int *,
    49         DBusError *);
    50 char *(*gLibHalDeviceGetPropertyString)(LibHalContext *, const char *, const char *, DBusError *);
    51 void (*gLibHalFreeString)(char *);
    52 void (*gLibHalFreeStringArray)(char **);
    53 dbus_bool_t (*gLibHalCtxShutdown)(LibHalContext *, DBusError *);
    54 dbus_bool_t (*gLibHalCtxFree)(LibHalContext *);
     41/** The following are the symbols which we need from libdbus. */
     42void (*dbus_error_init)(DBusError *);
     43DBusConnection *(*dbus_bus_get)(DBusBusType, DBusError *);
     44void (*dbus_error_free)(DBusError *);
     45void (*dbus_connection_unref)(DBusConnection *);
     46void (*dbus_connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t);
     47dbus_bool_t (*dbus_bus_name_has_owner)(DBusConnection *, const char *,
     48                                       DBusError *);
     49void (*dbus_bus_add_match)(DBusConnection *, const char *, DBusError *);
     50void (*dbus_bus_remove_match)(DBusConnection *, const char *, DBusError *);
     51void (*dbus_message_unref)(DBusMessage *);
     52DBusMessage* (*dbus_message_new_method_call)(const char *, const char *,
     53                                             const char *, const char *);
     54void (*dbus_message_iter_init_append)(DBusMessage *, DBusMessageIter *);
     55dbus_bool_t (*dbus_message_iter_append_basic)(DBusMessageIter *, int,
     56                                              const void *);
     57DBusMessage * (*dbus_connection_send_with_reply_and_block)(DBusConnection *,
     58                                                           DBusMessage *, int,
     59                                                           DBusError *error);
     60dbus_bool_t (*dbus_message_iter_init) (DBusMessage *, DBusMessageIter *);
     61int (*dbus_message_iter_get_arg_type) (DBusMessageIter *);
     62int (*dbus_message_iter_get_element_type) (DBusMessageIter *);
     63void (*dbus_message_iter_recurse) (DBusMessageIter *, DBusMessageIter *);
     64void (*dbus_message_iter_get_basic) (DBusMessageIter *, void *);
     65dbus_bool_t (*dbus_message_iter_next) (DBusMessageIter *);
    5566
    56 bool gLibHalCheckPresence(void)
     67bool VBoxDBusCheckPresence(void)
    5768{
    58     RTLDRMOD hLibHal;
     69    RTLDRMOD hLibDBus;
    5970
    60     if (ghLibHal != 0 && gCheckedForLibHal == true)
     71    if (ghLibDBus != 0 && gCheckedForLibDBus == true)
    6172        return true;
    62     if (gCheckedForLibHal == true)
     73    if (gCheckedForLibDBus == true)
    6374        return false;
    64     if (!RT_SUCCESS(RTLdrLoad(LIB_HAL, &hLibHal)))
     75    if (   !RT_SUCCESS(RTLdrLoad(LIB_DBUS_1_3, &hLibDBus))
     76        && !RT_SUCCESS(RTLdrLoad(LIB_DBUS_1_2, &hLibDBus)))
    6577    {
    6678        return false;
    6779    }
    68     if (   RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_error_init", (void **) &gDBusErrorInit))
    69         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_bus_get", (void **) &gDBusBusGet))
    70         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_error_free", (void **) &gDBusErrorFree))
    71         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_connection_unref",
    72                                      (void **) &gDBusConnectionUnref))
    73         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_new", (void **) &gLibHalCtxNew))
    74         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_set_dbus_connection",
    75                                      (void **) &gLibHalCtxSetDBusConnection))
    76         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_init", (void **) &gLibHalCtxInit))
    77         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_manager_find_device_string_match",
    78                                      (void **) &gLibHalFindDeviceStringMatch))
    79         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_device_get_property_string",
    80                                      (void **) &gLibHalDeviceGetPropertyString))
    81         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_free_string", (void **) &gLibHalFreeString))
    82         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_free_string_array",
    83                                      (void **) &gLibHalFreeStringArray))
    84         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_shutdown", (void **) &gLibHalCtxShutdown))
    85         && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_free", (void **) &gLibHalCtxFree))
     80    if (   RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_error_init",
     81                                     (void **) &dbus_error_init))
     82        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_bus_get",
     83                                     (void **) &dbus_bus_get))
     84        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_error_free",
     85                                     (void **) &dbus_error_free))
     86        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_connection_unref",
     87                                     (void **) &dbus_connection_unref))
     88        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_connection_set_exit_on_disconnect",
     89                                     (void **) &dbus_connection_set_exit_on_disconnect))
     90        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_bus_name_has_owner",
     91                                     (void **) &dbus_bus_name_has_owner))
     92        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_bus_add_match",
     93                                     (void **) &dbus_bus_add_match))
     94        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_bus_remove_match",
     95                                     (void **) &dbus_bus_remove_match))
     96        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_unref",
     97                                     (void **) &dbus_message_unref))
     98        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_new_method_call",
     99                                     (void **) &dbus_message_new_method_call))
     100        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_init_append",
     101                                     (void **) &dbus_message_iter_init_append))
     102        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_append_basic",
     103                                     (void **) &dbus_message_iter_append_basic))
     104        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_connection_send_with_reply_and_block",
     105                                     (void **) &dbus_connection_send_with_reply_and_block))
     106        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_init",
     107                                     (void **) &dbus_message_iter_init))
     108        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_get_arg_type",
     109                                     (void **) &dbus_message_iter_get_arg_type))
     110        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_get_element_type",
     111                                     (void **) &dbus_message_iter_get_element_type))
     112        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_recurse",
     113                                     (void **) &dbus_message_iter_recurse))
     114        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_get_basic",
     115                                     (void **) &dbus_message_iter_get_basic))
     116        && RT_SUCCESS(RTLdrGetSymbol(hLibDBus, "dbus_message_iter_next",
     117                                     (void **) &dbus_message_iter_next))
    86118       )
    87119    {
    88         ghLibHal = hLibHal;
    89         gCheckedForLibHal = true;
     120        ghLibDBus = hLibDBus;
     121        gCheckedForLibDBus = true;
    90122        return true;
    91123    }
    92124    else
    93125    {
    94         RTLdrClose(hLibHal);
    95         gCheckedForLibHal = true;
     126        RTLdrClose(hLibDBus);
     127        gCheckedForLibDBus = true;
    96128        return false;
    97129    }
    98130}
     131
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette