Home | History | Annotate | Download | only in doc
      1 <?xml version="1.0" standalone="no"?>
      2 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
      3 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"
      4 [
      5 ]>
      6 
      7 <article id="index">
      8   <articleinfo>
      9     <title>D-Bus FAQ</title>
     10     <releaseinfo>Version 0.3</releaseinfo>
     11     <date>17 November 2006</date>
     12     <authorgroup>
     13       <author>
     14 	<firstname>Havoc</firstname>
     15 	<surname>Pennington</surname>
     16 	<affiliation>
     17 	  <orgname>Red Hat, Inc.</orgname>
     18 	  <address>
     19 	    <email>hp (a] pobox.com</email>
     20 	  </address>
     21 	</affiliation>
     22       </author>
     23       <author>
     24 	<firstname>David</firstname>
     25         <othername role="mi">A</othername>
     26 	<surname>Wheeler</surname>
     27       </author>
     28     </authorgroup>
     29   </articleinfo>
     30 
     31   <qandaset id="faq">
     32 
     33     <qandaentry>
     34       <question>
     35         <para>
     36           What is D-Bus?
     37         </para>
     38       </question>
     39       <answer>
     40         <para>
     41           This is probably best answered by reading the D-Bus <ulink url="dbus-tutorial.html">tutorial</ulink> or
     42           the introduction to the <ulink url="dbus-specification.html">specification</ulink>. In
     43           short, it is a system consisting of 1) a wire protocol for exposing a
     44           typical object-oriented language/framework to other applications; and
     45           2) a bus daemon that allows applications to find and monitor one another.
     46           Phrased differently, D-Bus is 1) an interprocess communication (IPC) system and 2) some higher-level 
     47           structure (lifecycle tracking, service activation, security policy) provided by two bus daemons,
     48           one systemwide and one per-user-session.
     49         </para>
     50       </answer>
     51     </qandaentry>
     52 
     53     <qandaentry>
     54       <question>
     55         <para>
     56           Is D-Bus stable/finished?
     57         </para>
     58       </question>
     59       <answer>
     60         <para>
     61           The low-level library "libdbus" and the protocol specification are considered 
     62           ABI stable. The <ulink url="README">README</ulink>
     63           file has a discussion of the API/ABI stability guarantees.
     64           Higher-level bindings (such as those for Qt, GLib, Python, Java, C#) each 
     65           have their own release schedules and degree of maturity, not linked to 
     66           the low-level library and bus daemon release. Check the project page for
     67           the binding you're considering to understand that project's policies.
     68         </para>
     69       </answer>
     70     </qandaentry>
     71 
     72     <qandaentry>
     73       <question>
     74         <para>
     75           How is the reference implementation licensed? Can I use it in 
     76           proprietary applications?
     77         </para>
     78       </question>
     79       <answer>
     80         <para>
     81           The short answer is yes, you can use it in proprietary applications.
     82           You should read the <ulink url="COPYING">COPYING</ulink> file, which
     83           offers you the choice of two licenses. These are the GPL and the
     84           AFL. The GPL requires that your application be licensed under the GPL
     85           as well. The AFL is an "X-style" or "BSD-style" license compatible
     86           with proprietary licensing, but it does have some requirements; in
     87           particular it prohibits you from filing a lawsuit alleging that the
     88           D-Bus software infringes your patents <emphasis>while you continue to
     89           use D-Bus</emphasis>.  If you're going to sue, you have to stop using
     90           the software. Read the licenses to determine their meaning, this FAQ
     91           entry is not intended to change the meaning or terms of the licenses.
     92         </para>
     93       </answer>
     94     </qandaentry>
     95 
     96     <qandaentry>
     97       <question>
     98         <para>
     99           What is the difference between a bus name, and object path, 
    100           and an interface?
    101         </para>
    102       </question>
    103       <answer>
    104         <para>
    105           If you imagine a C++ program that implements a network service, then
    106           the bus name is the hostname of the computer running this C++ program,
    107           the object path is a C++ object instance pointer, and an interface is
    108           a C++ class (a pure virtual or abstract class, to be exact).
    109         </para>
    110         <para>
    111           In Java terms, the object path is an object reference, 
    112           and an interface is a Java interface.
    113         </para>
    114         <para>
    115           People get confused because if they write an application 
    116           with a single object instance and a single interface, 
    117           then the bus name, object path, and interface look 
    118           redundant. For example, you might have a text editor 
    119           that uses the bus name <literal>org.freedesktop.TextEditor</literal>,
    120           has a global singleton object called 
    121           <literal>/org/freedesktop/TextEditor</literal>, and 
    122           that singleton object could implement the interface 
    123           <literal>org.freedesktop.TextEditor</literal>.
    124         </para>
    125         <para>
    126           However, a text editor application could as easily own multiple bus
    127           names (for example, <literal>org.kde.KWrite</literal> in addition to
    128           generic <literal>TextEditor</literal>), have multiple objects (maybe
    129           <literal>/org/kde/documents/4352</literal> where the number changes
    130           according to the document), and each object could implement multiple
    131           interfaces, such as <literal>org.freedesktop.DBus.Introspectable</literal>,
    132           <literal>org.freedesktop.BasicTextField</literal>,
    133           <literal>org.kde.RichTextDocument</literal>.
    134         </para>
    135       </answer>
    136     </qandaentry>
    137 
    138 
    139     <qandaentry id="service">
    140       <question>
    141         <para>
    142           What is a "service"?
    143         </para>
    144       </question>
    145       <answer>
    146         <para>
    147           A service is a program that can be launched by the bus daemon 
    148           to provide some functionality to other programs. Services
    149           are normally launched according to the bus name they will 
    150           have.
    151         </para>
    152         <para>
    153           People often misuse the word "service" for any 
    154           bus name, but this tends to be ambiguous and confusing so is discouraged.
    155           In the D-Bus docs we try to use "service" only when talking about 
    156           programs the bus knows how to launch, i.e. a service always has a 
    157           .service file.
    158         </para>
    159       </answer>
    160     </qandaentry>
    161 
    162     <qandaentry id="components">
    163       <question>
    164         <para>
    165           Is D-Bus a "component system"?
    166         </para>
    167       </question>
    168       <answer>
    169         <para>
    170           It helps to keep these concepts separate in your mind:
    171           <orderedlist>
    172             <listitem>
    173               <para>
    174                 Object/component system
    175               </para>
    176             </listitem>
    177             <listitem>
    178               <para>
    179                 GUI control/widget embedding interfaces
    180               </para>
    181             </listitem>
    182             <listitem>
    183               <para>
    184                 Interprocess communication system or wire protocol
    185               </para>
    186             </listitem>
    187           </orderedlist>
    188         </para>
    189         <para>
    190           D-Bus is not a component system. "Component system" was originally
    191           defined by COM, and was essentially a workaround for the limitations
    192           of the C++ object system (adding introspection, runtime location of
    193           objects, ABI guarantees, and so forth). With the C# language and CLR,
    194           Microsoft added these features to the primary object system, leaving
    195           COM obsolete. Similarly, Java has much less need for something like
    196           COM than C++ did. Even QObject (from Qt) and GObject (from GLib) offer
    197           some of the same features found in COM.
    198         </para>
    199         <para>
    200           Component systems are not about GUI control embedding. Embedding
    201           a spreadsheet in a word processor document is a matter of defining
    202           some specific <emphasis>interfaces</emphasis> that objects
    203           can implement. These interfaces provide methods related to 
    204           GUI controls. So an object implementing those interfaces 
    205           can be embedded.
    206         </para>
    207         <para>
    208           The word "component" just means "object with some fancy features" and
    209           in modern languages all objects are effectively "components."
    210         </para>
    211         <para>
    212           So components are fancy objects, and some objects are GUI controls.
    213         </para>
    214         <para>
    215           A third, unrelated feature is interprocess communication or IPC.
    216           D-Bus is an IPC system. Given an object (or "component" if you must), 
    217           you can expose the functionality of that object over an IPC system.
    218           Examples of IPC systems are DCOM, CORBA, SOAP, XML-RPC, and D-Bus.
    219           You can use any of these IPC systems with any object/component system,
    220           though some of them are "tuned" for specific object systems.
    221           You can think of an IPC system primarily as a wire protocol.
    222         </para>
    223         <para>
    224           If you combine an IPC system with a set of GUI control interfaces, 
    225           then you can have an out-of-process or dynamically-loaded GUI control.
    226         </para>
    227         <para>
    228           Another related concept is the <firstterm>plugin</firstterm> or
    229           <firstterm>extension</firstterm>.  Generic plugin systems such as the
    230           <ulink url="http://eclipse.org">Eclipse</ulink> system are not so different
    231           from component/object systems, though perhaps a "plugin" tends to be a
    232           bundle of objects with a user-visible name and can be
    233           downloaded/packaged as a unit.
    234         </para>
    235       </answer>
    236     </qandaentry>
    237 
    238     <qandaentry id="speed">
    239       <question>
    240         <para>
    241           How fast is the D-Bus reference implementation?
    242         </para>
    243       </question>
    244       <answer>
    245         <para>
    246           Of course it depends a bit on what you're doing. 
    247           <ulink url="http://lists.freedesktop.org/pipermail/dbus/2004-November/001779.html">
    248             This mail</ulink> contains some benchmarking.  At the time of that
    249           benchmark, D-Bus one-to-one communication was about 2.5x slower than
    250           simply pushing the data raw over a socket. After the recent rewrite of
    251           the marshaling code, D-Bus is slower than that because a lot of
    252           optimization work was lost. But it can probably be sped up again.
    253         </para>
    254         <para>
    255           D-Bus communication with the intermediate bus daemon should be 
    256           (and as last profiled, was) about twice as slow as one-to-one 
    257           mode, because a round trip involves four socket reads/writes rather 
    258           than two socket reads/writes.
    259         </para>
    260         <para>
    261           The overhead comes from a couple of places; part of it is simply 
    262           "abstraction penalty" (there are layers of code to support 
    263           multiple main loops, multiple transport types, security, etc.).
    264           Probably the largest part comes from data validation
    265           (because the reference implementation does not trust incoming data).
    266           It would be simple to add a "no validation" mode, but probably 
    267           not a good idea all things considered.
    268         </para>
    269         <para>
    270           Raw bandwidth isn't the only concern; D-Bus is designed to 
    271           enable asynchronous communication and avoid round trips.
    272           This is frequently a more important performance issue 
    273           than throughput.
    274         </para>
    275       </answer>
    276     </qandaentry>
    277 
    278 
    279     <qandaentry id="size">
    280       <question>
    281         <para>
    282           How large is the D-Bus reference implementation?
    283         </para>
    284       </question>
    285       <answer>
    286         <para>
    287           A production build (with assertions, unit tests, and verbose logging
    288           disabled) is on the order of a 150K shared library.
    289         </para>
    290         <para>
    291           A much, much smaller implementation would be possible by omitting out
    292           of memory handling, hardcoding a main loop (or always using blocking
    293           I/O), skipping validation, and otherwise simplifying things.
    294         </para>
    295       </answer>
    296     </qandaentry>
    297     
    298     <qandaentry id="other-ipc">
    299       <question>
    300         <para>
    301           How does D-Bus differ from other interprocess communication
    302           or networking protocols?
    303         </para>
    304       </question>
    305       <answer>
    306         <para>
    307           Keep in mind, it is not only an IPC system; it also includes
    308           lifecycle tracking, service activation, security policy, and other
    309           higher-level structure and assumptions.
    310         </para>
    311         <para>
    312           The best place to start is to read the D-Bus <ulink url="dbus-tutorial.html">tutorial</ulink>, so 
    313           you have a concrete idea what D-Bus actually is. If you 
    314           understand other protocols on a wire format level, you 
    315           may also want to read the D-Bus <ulink url="dbus-specification.html">specification</ulink> to see what 
    316           D-Bus looks like on a low level.
    317         </para>
    318         <para>
    319           As the <ulink url="dbus-tutorial.html">tutorial</ulink> and <ulink url="dbus-specification.html">specification</ulink> both explain, D-Bus is tuned 
    320           for some specific use cases. Thus, it probably isn't tuned 
    321           for what you want to do, unless you are doing the things 
    322           D-Bus was designed for. Don't make the mistake of thinking 
    323           that any system involving "IPC" is the same thing.
    324         </para>
    325         <para>
    326           The D-Bus authors would not recommend using D-Bus 
    327           for applications where it doesn't make sense.
    328           The following questions compare D-Bus to some other 
    329           protocols primarily to help you understand D-Bus 
    330           and decide whether it's appropriate; D-Bus is neither intended
    331           nor claimed to be the right choice for every application.
    332         </para>
    333         <para>
    334           It should be possible to bridge D-Bus to other IPC systems, 
    335           just as D-Bus can be bridged to object systems.
    336         </para>
    337         <para>
    338           Note: the D-Bus mailing list subscribers are <emphasis>very much not
    339           interested</emphasis> in debating which IPC system is the One True
    340           System. So if you want to discuss that, please use another forum.
    341         </para>
    342       </answer>      
    343     </qandaentry>
    344 
    345     
    346     <qandaentry id="corba">
    347       <question>
    348         <para>
    349           How does D-Bus differ from CORBA?
    350         </para>
    351       </question>
    352       <answer>
    353         <para>
    354           Start by reading <xref linkend="other-ipc"/>.
    355         </para>
    356         <para>
    357           <ulink url="http://www.omg.org">CORBA</ulink> is designed to support
    358          object-oriented IPC between objects, automatically marshalling
    359          parameters as necessary. CORBA is strongly supported by the <ulink
    360          url="http://www.omg.org">Open Management Group (OMG)</ulink>, which
    361          produces various standards and supporting documents for CORBA and has
    362          the backing of many large organizations.  There are many CORBA ORBs
    363          available, both proprietary ORBs and free / open source software ORBs
    364          (the latter include <ulink
    365          url="http://orbit-resource.sourceforge.net/">ORBit</ulink>, <ulink
    366          url="http://www.mico.org/">MICO</ulink>, and <ulink
    367          url="http://www.theaceorb.com/">The ACE Orb (TAO)</ulink>).  Many
    368          organizations continue to use CORBA ORBs for various kinds of IPC.
    369         </para>
    370         <para>
    371           Both GNOME and KDE have used CORBA and then moved away from it.  KDE
    372           had more success with a system called DCOP, and GNOME layered a system
    373           called Bonobo on top of CORBA. Without custom extensions, CORBA does
    374           not support many of the things one wants to do in a desktop
    375           environment with the GNOME/KDE architecture.
    376         </para>
    377         <para>
    378           CORBA on the other hand has a number of features of interest for
    379           enterprise and web application development, though XML systems such as
    380           SOAP are the latest fad.
    381         </para>
    382         <para>
    383           Like D-Bus, CORBA uses a fast binary protocol (IIOP). Both systems
    384           work in terms of objects and methods, and have concepts such as
    385           "oneway" calls. Only D-Bus has direct support for "signals" as in
    386           GLib/Qt (or Java listeners, or C# delegates).
    387         </para>
    388         <para>
    389           D-Bus hardcodes and specifies a lot of things that CORBA leaves open-ended,
    390           because CORBA is more generic and D-Bus has two specific use-cases in mind.
    391           This makes D-Bus a bit simpler.
    392         </para>
    393         <para>
    394           However, unlike CORBA D-Bus does <emphasis>not</emphasis> specify the
    395           API for the language bindings. Instead, "native" bindings adapted
    396           specifically to the conventions of a framework such as QObject,
    397           GObject, C#, Java, Python, etc. are encouraged. The libdbus reference
    398           implementation is designed to be a backend for bindings of this
    399           nature, rather than to be used directly. The rationale is that an IPC
    400           system API should not "leak" all over a program; it should come into
    401           play only just before data goes over the wire. As an aside, OMG is
    402           apparently working on a simpler C++ binding for CORBA.
    403         </para>
    404         <para>
    405           Many CORBA implementations such as ORBit are faster than the libdbus
    406           reference implementation.  One reason is that D-Bus considers data
    407           from the other end of the connection to be untrusted and extensively
    408           validates it. But generally speaking other priorities were placed
    409           ahead of raw speed in the libdbus implementation. A fast D-Bus
    410           implementation along the lines of ORBit should be possible, of course.
    411         </para>
    412         <para>
    413           On a more trivial note, D-Bus involves substantially fewer acronyms
    414           than CORBA.
    415         </para>
    416       </answer>
    417     </qandaentry>
    418 
    419 
    420     <qandaentry id="xmlrpcsoap">
    421       <question>
    422         <para>
    423           How does D-Bus differ from XML-RPC and SOAP?
    424         </para>
    425       </question>
    426       <answer>
    427         <para>
    428           Start by reading <xref linkend="other-ipc"/>.
    429         </para>
    430         <para>
    431           In <ulink url="http://www.w3.org/TR/SOAP/">SOAP</ulink> and <ulink
    432             url="http://www.xmlrpc.com">XML-RPC</ulink>, RPC calls are transformed
    433           into an XML-based format, then sent over the wire (typically using the
    434           HTTP protocol), where they are processed and returned.  XML-RPC is the
    435           simple protocol (its spec is only a page or two), and SOAP is the
    436           full-featured protocol.
    437         </para>
    438         <para>
    439           XML-RPC and SOAP impose XML parsing overhead that is normally
    440           irrelevant in the context of the Internet, but significant for
    441           constant fine-grained IPC among applications in a desktop session.
    442         </para>
    443         <para>
    444           D-Bus offers persistent connections and with the bus daemon 
    445           supports lifecycle tracking of other applications connected
    446           to the bus. With XML-RPC and SOAP, typically each method call 
    447           exists in isolation and has its own HTTP connection.
    448         </para>
    449       </answer>
    450     </qandaentry>
    451 
    452     <qandaentry id="dce">
    453       <question>
    454         <para>
    455           How does D-Bus differ from DCE?
    456         </para>
    457       </question>
    458       <answer>
    459         <para>
    460           Start by reading <xref linkend="other-ipc"/>.
    461         </para>
    462         <para>
    463           <ulink url="http://www.opengroup.org/dce/">Distributed Computing
    464           Environment (DCE)</ulink> is an industry-standard vendor-neutral
    465           standard that includes an IPC mechanism.  <ulink
    466           url="http://www.opengroup.org/comm/press/05-01-12.htm">The Open Group
    467           has released an implementation as open source software</ulink>.  DCE
    468           is quite capable, and includes a vast amount of functionality such as
    469           a distributed time service.  As the name implies, DCE is intended for
    470           use in a large, multi-computer distributed application. D-Bus would
    471           not be well-suited for this.
    472         </para>
    473       </answer>
    474     </qandaentry>    
    475 
    476 
    477     <qandaentry id="dcom">
    478       <question>
    479         <para>
    480           How does D-Bus differ from DCOM and COM?
    481         </para>
    482       </question>
    483       <answer>
    484         <para>
    485           Start by reading <xref linkend="other-ipc"/>.
    486         </para>
    487         <para>
    488           Comparing D-Bus to COM is apples and oranges; 
    489           see <xref linkend="components"/>.
    490         </para>
    491         <para>
    492           DCOM (distributed COM) is a Windows IPC system designed for use with
    493           the COM object system. It's similar in some ways to DCE and CORBA.
    494         </para>
    495       </answer>
    496     </qandaentry>    
    497 
    498     <qandaentry id="internet-communications-engine">
    499       <question>
    500         <para>
    501           How does D-Bus differ from ZeroC's Internet Communications Engine (Ice)
    502         </para>
    503       </question>
    504       <answer>
    505         <para>
    506           Start by reading <xref linkend="other-ipc"/>.
    507         </para>
    508         <para>
    509           The <ulink url="http://www.zeroc.com/ice.html"> Internet
    510           Communications Engine (Ice)</ulink> is a powerful IPC mechanism more
    511           on the level of SOAP or CORBA than D-Bus.  Ice has a "dual-license"
    512           business around it; i.e. you can use it under the GPL, or pay for a
    513           proprietary license.
    514         </para>
    515       </answer>
    516     </qandaentry>    
    517 
    518     <qandaentry id="inter-client-exchange">
    519       <question>
    520         <para>
    521           How does D-Bus differ from Inter-Client Exchange (ICE)?
    522         </para>
    523       </question>
    524       <answer>
    525         <para>
    526           <ulink url="http://www.x.org/X11R6.8.1/docs/ICE/ice.pdf">ICE</ulink>
    527           was developed for the X Session Management protocol (XSMP), as part of
    528           the X Window System (X11R6.1). The idea was to allow desktop sessions
    529           to contain nongraphical clients in addition to X clients.
    530         </para>
    531         <para>
    532           ICE is a binary protocol designed for desktop use, and KDE's DCOP
    533           builds on ICE.  ICE is substantially simpler than D-Bus (in contrast
    534           to most of the other IPC systems mentioned here, which are more
    535           complex). ICE doesn't really define a mapping to objects and methods
    536           (DCOP adds that layer).  The reference implementation of ICE (libICE)
    537           is often considered to be horrible (and horribly insecure).
    538         </para>
    539         <para>
    540           DCOP and XSMP are the only two widely-used applications of ICE,
    541           and both could in principle be replaced by D-Bus. (Though whether 
    542           GNOME and KDE will bother is an open question.)
    543         </para>
    544       </answer>
    545     </qandaentry>
    546 
    547     
    548 
    549     <qandaentry id="dcop">
    550       <question>
    551         <para>
    552           How does D-Bus differ from DCOP?
    553         </para>
    554       </question>
    555       <answer>
    556         <para>
    557           Start by reading <xref linkend="other-ipc"/>.
    558         </para>
    559         <para>
    560           D-Bus is intentionally pretty similar to <ulink
    561           url="http://developer.kde.org/documentation/library/kdeqt/dcop.html">DCOP</ulink>,
    562           and can be thought of as a "DCOP the next generation" suitable for 
    563           sharing between the various open source desktop projects.
    564         </para>
    565         <para>
    566           D-Bus is a bit more complex than DCOP, though the Qt binding for D-Bus
    567           should not be more complex for programmers. The additional complexity
    568           of D-Bus arises from its separation of object references vs. bus names
    569           vs. interfaces as distinct concepts, and its support for one-to-one
    570           connections in addition to connections over the bus. The libdbus
    571           reference implementation has a lot of API to support multiple bindings
    572           and main loops, and performs data validation and out-of-memory handling 
    573           in order to support secure applications such as the systemwide bus.
    574         </para>
    575         <para>
    576           D-Bus is probably somewhat slower than DCOP due to data validation 
    577           and more "layers" in the reference implementation. A comparison 
    578           hasn't been posted to the list though.
    579         </para>
    580         <para>
    581           At this time, KDE has not committed to using D-Bus, but there have
    582           been discussions of KDE bridging D-Bus and DCOP, or even changing
    583           DCOP's implementation to use D-Bus internally (so that GNOME and KDE
    584           would end up using exactly the same bus). See the KDE mailing list 
    585           archives for some of these discussions.
    586         </para>
    587       </answer>
    588     </qandaentry>
    589 
    590 
    591     <qandaentry id="yet-more-ipc">
    592       <question>
    593         <para>
    594           How does D-Bus differ from [yet more IPC mechanisms]?
    595         </para>
    596       </question>
    597       <answer>
    598         <para>
    599           Start by reading <xref linkend="other-ipc"/>.
    600         </para>
    601         <para>
    602           There are countless uses of network sockets in the world.  <ulink
    603           url="http://www.mbus.org/">MBUS</ulink>, Sun ONC/RPC, Jabber/XMPP,
    604           SIP, are some we can think of quickly.
    605         </para>
    606       </answer>
    607     </qandaentry>
    608 
    609 
    610     <qandaentry id="which-ipc">
    611       <question>
    612         <para>
    613           Which IPC mechanism should I use?
    614         </para>
    615       </question>
    616       <answer>
    617         <para>
    618           Start by reading <xref linkend="other-ipc"/>.
    619         </para>
    620         <para>
    621           If you're writing an Internet or Intranet application, XML-RPC or SOAP
    622           work for many people. These are standard, available for most
    623           languages, simple to debug and easy to use.
    624         </para>
    625         <para>
    626           If you're writing a desktop application for UNIX, 
    627           then D-Bus is of course our recommendation for 
    628           talking to other parts of the desktop session.
    629         </para>
    630         <para>
    631           D-Bus is also designed for communications between system daemons and
    632           communications between the desktop and system daemons.
    633         </para>
    634         <para>
    635           If you're doing something complicated such as clustering, 
    636           distributed swarms, peer-to-peer, or whatever then 
    637           the authors of this FAQ don't have expertise in these
    638           areas and you should ask someone else or try a search engine.
    639           D-Bus is most likely a poor choice but could be appropriate
    640           for some things.
    641         </para>
    642         <para>
    643           Note: the D-Bus mailing list is probably not the place to 
    644           discuss which system is appropriate for your application, 
    645           though you are welcome to ask specific questions about 
    646           D-Bus <emphasis>after reading this FAQ, the tutorial, and 
    647             searching the list archives</emphasis>. The best way 
    648           to search the list archives is probably to use 
    649           an Internet engine such as Google. On Google, 
    650           include "site:freedesktop.org" in your search.
    651         </para>
    652       </answer>
    653     </qandaentry>
    654 
    655 
    656     <qandaentry>
    657       <question>
    658         <para>
    659           How can I submit a bug or patch?
    660         </para>
    661       </question>
    662       <answer>
    663         <para>
    664           The D-Bus <ulink url="http://dbus.freedesktop.org">web site</ulink>
    665           has a link to the bug tracker, which is the best place to store
    666           patches.  You can also post them to the list, especially if you want
    667           to discuss the patch or get feedback.
    668         </para>
    669       </answer>
    670     </qandaentry>
    671 
    672   </qandaset>
    673 
    674 </article>
    675