summaryrefslogtreecommitdiffstats
path: root/doc/dbus-specification.sgml
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-09-30 03:34:00 +0000
committerHavoc Pennington <hp@redhat.com>2003-09-30 03:34:00 +0000
commit78b69c683ea27514c0787b2d1e2244d7182bc72d (patch)
treede33636f51b016788b75390f87026fcf4d802338 /doc/dbus-specification.sgml
parent9a4bd6bf72a8c06227eaf94a59ebf1645faa1e6d (diff)
2003-09-29 Havoc Pennington <hp@pobox.com>
* configure.in: split checks for Doxygen from XML docs, check for xmlto * doc/Makefile.am: XML-ify all the docs, and add a blank dbus-tutorial.xml
Diffstat (limited to 'doc/dbus-specification.sgml')
-rw-r--r--doc/dbus-specification.sgml2197
1 files changed, 0 insertions, 2197 deletions
diff --git a/doc/dbus-specification.sgml b/doc/dbus-specification.sgml
deleted file mode 100644
index 696c3f45..00000000
--- a/doc/dbus-specification.sgml
+++ /dev/null
@@ -1,2197 +0,0 @@
-<!doctype article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
-]>
-<article id="index">
- <artheader>
- <title>D-BUS Specification</title>
- <releaseinfo>Version 0.8</releaseinfo>
- <date>06 September 2003</date>
- <authorgroup>
- <author>
- <firstname>Havoc</firstname>
- <surname>Pennington</surname>
- <affiliation>
- <orgname>Red Hat, Inc</orgname>
- <address>
- <email>hp@pobox.com</email>
- </address>
- </affiliation>
- </author>
- <author>
- <firstname>Anders</firstname>
- <surname>Carlsson</surname>
- <affiliation>
- <orgname>CodeFactory AB</orgname>
- <address>
- <email>andersca@codefactory.se</email>
- </address>
- </affiliation>
- </author>
- <author>
- <firstname>Alexander</firstname>
- <surname>Larsson</surname>
- <affiliation>
- <orgname>Red Hat, Inc</orgname>
- <address>
- <email>alexl@redhat.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
- </artheader>
-
- <sect1 id="introduction">
- <title>Introduction</title>
- <para>
- D-BUS is a system for low-latency, low-overhead, easy to use
- interprocess communication (IPC). In more detail:
- <itemizedlist>
- <listitem>
- <para>
- D-BUS is <emphasis>low-latency</emphasis> because it is designed
- to avoid round trips and allow asynchronous operation, much like
- the X protocol.
- </para>
- </listitem>
- <listitem>
- <para>
- D-BUS is <emphasis>low-overhead</emphasis> because it uses a
- binary protocol, and does not have to convert to and from a text
- format such as XML. Because D-BUS is intended for potentially
- high-resolution same-machine IPC, not primarily for Internet IPC,
- this is an interesting optimization.
- </para>
- </listitem>
- <listitem>
- <para>
- D-BUS is <emphasis>easy to use</emphasis> because it works in terms
- of <firstterm>messages</firstterm> rather than byte streams, and
- automatically handles a lot of the hard IPC issues. Also, the D-BUS
- library is designed to be wrapped in a way that lets developers use
- their framework's existing object/type system, rather than learning
- a new one specifically for IPC.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- The base D-BUS protocol is a peer-to-peer protocol, specified in <xref
- linkend="message-protocol">. That is, it is a system for one application
- to talk to a single other application. However, the primary intended
- application of D-BUS is the D-BUS <firstterm>message bus</firstterm>,
- specified in <xref linkend="message-bus">. The message bus is a special
- application that accepts connections from multiple other applications, and
- forwards messages among them.
- </para>
- <para>
- Uses of D-BUS include notification of system changes (notification of when
- a camera is plugged in to a computer, or a new version of some software
- has been installed), or desktop interoperablity, for example a file
- monitoring service or a configuration service.
- </para>
- </sect1>
-
- <sect1 id="message-protocol">
- <title>Message Protocol</title>
- <para>
- A <firstterm>message</firstterm> consists of a
- <firstterm>header</firstterm> and a <firstterm>body</firstterm>. If you
- think of a message as a package, the header is the address, and the body
- contains the package contents. The message delivery system uses the header
- information to figure out where to send the message and how to interpret
- it; the recipient inteprets the body of the message.
- </para>
-
- <para>
- The body of the message is made up of zero or more
- <firstterm>arguments</firstterm>, which are typed
- values, such as an integer or a byte array.
- </para>
-
- <sect2 id="message-protocol-header-encoding">
- <title>Header Encoding</title>
- <para>
- Following the mandatory fields, there are zero or more named fields (see
- <xref linkend="message-protocol-header-fields">), and then nul bytes
- padding the header such that its total length in bytes is a multiple of
- 8.
- </para>
- <para>
- The header MUST begin with the following mandatory fields in the following
- order:
- <informaltable>
- <tgroup cols=2>
- <thead>
- <row>
- <entry>Size</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>1 byte</entry>
- <entry>Endianness flag; ASCII 'l' for little-endian
- or ASCII 'B' for big-endian.</entry>
- </row>
- <row>
- <entry>1 byte</entry>
- <entry>Type of message. Unknown types MUST be ignored.
- Currently-defined types are described below.
- </entry>
- </row>
- <row>
- <entry>1 byte</entry>
- <entry>Bitwise OR of flags. Unknown flags
- MUST be ignored. Currently-defined flags are described below.
- </entry>
- </row>
- <row>
- <entry>1 byte</entry>
- <entry>Major protocol version of the sending application. If
- the major protocol version of the receiving application does not
- match, the applications will not be able to communicate and the
- D-BUS connection MUST be disconnected. The major protocol
- version for this version of the specification is 0.
- </entry>
- </row>
- <row>
- <entry>4 bytes</entry>
- <entry>An unsigned 32-bit integer in the
- message's byte order, indicating the total length in bytes of
- the header including named fields and any alignment padding.
- MUST be a multiple of 8.
- </entry>
- </row>
- <row>
- <entry>4 bytes</entry>
- <entry>An unsigned 32-bit integer in the
- message's byte order, indicating the total length in bytes of
- the message body.
- </entry>
- </row>
- <row>
- <entry>4 bytes</entry>
- <entry>The message's serial number, an unsigned 32-bit integer in
- the message's byte order. The serial number is a cookie used to
- identify message replies; thus all outstanding unreplied-to messages
- from the same connection MUST have a different serial number.
- Zero is not a valid serial number, but all other numbers are
- allowed.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Types that can appear in the second byte of the header:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Conventional name</entry>
- <entry>Decimal value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>INVALID</entry>
- <entry>0</entry>
- <entry>This is an invalid type, if seen in a message
- the connection should be dropped immediately.</entry>
- </row>
- <row>
- <entry>METHOD_CALL</entry>
- <entry>1</entry>
- <entry>Method call.</entry>
- </row>
- <row>
- <entry>METHOD_RETURN</entry>
- <entry>2</entry>
- <entry>Method reply with returned data.</entry>
- </row>
- <row>
- <entry>ERROR</entry>
- <entry>3</entry>
- <entry>Error reply. If the first argument exists and is a
- string, it is an error message.</entry>
- </row>
- <row>
- <entry>SIGNAL</entry>
- <entry>4</entry>
- <entry>Signal emission.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Flags that can appear in the third byte of the header:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Conventional name</entry>
- <entry>Hex value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>NO_REPLY_EXPECTED</entry>
- <entry>0x1</entry>
- <entry>This message does not expect method return replies or
- error replies; the reply can be omitted as an
- optimization. However, it is compliant with this specification
- to return the reply despite this flag.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect2>
-
- <sect2 id="message-protocol-header-fields">
- <title>Header Fields</title>
- <para>
- In addition to the required header information mentioned
- in <xref linkend="message-protocol-header-encoding">,
- the header may contain zero or more named
- header fields. Future versions of this protocol
- specification may add new fields. Implementations must
- ignore fields they do not understand. Implementations
- must not invent their own header fields; only changes to
- this specification may introduce new header fields.
- </para>
-
- <para>
- Header field names MUST consist of a single byte, possible values
- of which are defined below. Following the name, the field MUST have
- a type code represented as a single unsigned byte, and then a
- properly-aligned value of that type. See <xref
- linkend="message-protocol-arguments"> for a description of how each
- type is encoded. If an implementation sees a header field name that
- it does not understand, it MUST ignore that field.
- </para>
-
- <para>
- Here are the currently-defined named header fields:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Conventional Name</entry>
- <entry>Decimal Value</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>INVALID</entry>
- <entry>0</entry>
- <entry>INVALID</entry>
- <entry>Not a valid field name (error if it appears in a message)</entry>
- </row>
- <row>
- <entry>PATH</entry>
- <entry>1</entry>
- <entry>STRING</entry>
- <entry>The object to send the message to; objects are identified by
- a path, "/foo/bar"</entry>
- </row>
- <row>
- <entry>INTERFACE</entry>
- <entry>2</entry>
- <entry>STRING</entry>
- <entry>The interface to invoke a method call on, or
- that a signal is emitted from. e.g. "org.freedesktop.Introspectable"</entry>
- </row>
- <row>
- <entry>MEMBER</entry>
- <entry>3</entry>
- <entry>STRING</entry>
- <entry>The member, either the method name or signal name.
- e.g. "Frobate"</entry>
- </row>
- <row>
- <entry>ERROR_NAME</entry>
- <entry>4</entry>
- <entry>STRING</entry>
- <entry>The name of the error that occurred, for errors</entry>
- </row>
- <row>
- <entry>REPLY_SERIAL</entry>
- <entry>5</entry>
- <entry>UINT32</entry>
- <entry>The serial number of the message this message is a reply
- to. (The serial number is one of the mandatory header fields,
- see <xref linkend="message-protocol-header-encoding">.)</entry>
- </row>
- <row>
- <entry>SERVICE</entry>
- <entry>6</entry>
- <entry>STRING</entry>
- <entry>The name of the service this message should be routed to.
- Only used in combination with the message bus, see
- <xref linkend="message-bus">.</entry>
- </row>
- <row>
- <entry>SENDER_SERVICE</entry>
- <entry>7</entry>
- <entry>STRING</entry>
- <entry>Sender service. The name of the base service that sent
- this message. The message bus fills in this field; the field is
- only meaningful in combination with the message bus.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
-
- </sect2>
- <sect2 id="message-protocol-header-padding">
- <title>Header Alignment Padding</title>
- <para>
- To allow implementations to keep the header and the body in a single
- buffer while keeping data types aligned, the total length of the header
- must be a multiple of 8 bytes. To achieve this, the header MUST be padded
- with nul bytes to align its total length on an 8-byte boundary.
- The minimum number of padding bytes MUST be used. Because zero is an
- invalid field name, implementations can distinguish padding (which must be
- zero initialized) from additional named fields.
- </para>
- </sect2>
-
- <sect2 id="message-protocol-arguments">
- <title>Message Arguments</title>
- <para>
- The message body is made up of arguments. Each argument is a type code,
- represented by a single unsigned byte, followed by the aligned value of
- the argument in a type-dependent format. Alignment padding between the
- typecode and the value is initialized to zero.
- </para>
- <para>
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Type name</entry>
- <entry>Code</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>INVALID</entry>
- <entry>0</entry>
- <entry>Not a valid type code (error if it appears in a message)</entry>
- </row><row>
- <entry>NIL</entry>
- <entry>1</entry>
- <entry>Marks an "unset" or "nonexistent" argument</entry>
- </row><row>
- <entry>BYTE</entry>
- <entry>2</entry>
- <entry>8-bit unsigned integer</entry>
- </row><row>
- <entry>BOOLEAN</entry>
- <entry>3</entry>
- <entry>Boolean value, 0 is FALSE and 1 is TRUE. Everything else is invalid.</entry>
- </row><row>
- <entry>INT32</entry>
- <entry>4</entry>
- <entry>32-bit signed integer</entry>
- </row><row>
- <entry>UINT32</entry>
- <entry>5</entry>
- <entry>32-bit unsigned integer</entry>
- </row><row>
- <entry>INT64</entry>
- <entry>6</entry>
- <entry>64-bit signed integer</entry>
- </row><row>
- <entry>UINT64</entry>
- <entry>7</entry>
- <entry>64-bit unsigned integer</entry>
- </row><row>
- <entry>DOUBLE</entry>
- <entry>8</entry>
- <entry>IEEE 754 double</entry>
- </row><row>
- <entry>STRING</entry>
- <entry>9</entry>
- <entry>UTF-8 string (<emphasis>must</emphasis> be valid UTF-8). Must be zero terminated. </entry>
- </row><row>
- <entry>NAMED</entry>
- <entry>10</entry>
- <entry>A named byte array, used for custom types</entry>
- </row><row>
- <entry>ARRAY</entry>
- <entry>11</entry>
- <entry>Array</entry>
- </row><row>
- <entry>DICT</entry>
- <entry>12</entry>
- <entry>A dictionary of key/value pairs</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- The types are encoded as follows:
- <informaltable>
- <tgroup cols=2>
- <thead>
- <row>
- <entry>Type name</entry>
- <entry>Encoding</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>INVALID</entry>
- <entry>Not applicable; cannot be encoded.</entry>
- </row><row>
- <entry>NIL</entry>
- <entry>No data is encoded; the type code is followed immediately
- by the type code of the next argument.</entry>
- </row><row>
- <entry>BYTE</entry>
- <entry>A byte.</entry>
- </row><row>
- <entry>BOOLEAN</entry>
- <entry>A byte, with valid values 0 and 1.</entry>
- </row><row>
- <entry>INT32</entry>
- <entry>32-bit signed integer in the message's byte order, aligned to 4-byte boundary.</entry>
- </row><row>
- <entry>UINT32</entry>
- <entry>32-bit unsigned integer in the message's byte order, aligned to 4-byte boundary.</entry>
- </row><row>
- <entry>INT64</entry>
- <entry>64-bit signed integer in the message's byte order, aligned to 8-byte boundary.</entry>
- </row><row>
- <entry>UINT64</entry>
- <entry>64-bit unsigned integer in the message's byte order, aligned to 8-byte boundary.</entry>
- </row><row>
- <entry>DOUBLE</entry>
- <entry>64-bit IEEE 754 double in the message's byte order, aligned to 8-byte boundary.</entry>
- </row><row>
- <entry>STRING</entry>
- <entry>UINT32 aligned to 4-byte boundary indicating the string's
- length in bytes excluding its terminating nul, followed by
- string data of the given length, followed by a terminating nul
- byte.
- </entry>
- </row><row>
- <entry>NAMED</entry>
- <entry>A string (encoded as the STRING type above) giving the
- name of the type followed by an UINT32 aligned to 4-byte boundary
- indicating the data length in bytes, followed by the data.
- </entry>
- </row><row>
- <entry>ARRAY</entry>
- <entry>A sequence of bytes giving the element type of the array, terminated
- by a type different from ARRAY (just one byte for one-dimensional arrays, but
- larger for multi-dimensional arrays), followed by an UINT32 (aligned to 4 bytes)
- giving the length of the array data in bytes. This is followed by each array entry
- encoded the way it would normally be encoded, except arrays, which are encoded
- without the type information, since that is already declared above. Arrays containing
- NIL are not allowed.
- </entry>
- </row><row>
- <entry>DICT</entry>
- <entry>UINT32 giving the length of the dictionary data in bytes.
- This is followed by a number of keyname/value pairs, where the
- keyname is encoded as a STRING above, and the value is encoded
- as a byte with typecode and how that type normally would be encoded
- alone.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect2>
-
- <sect2 id="message-protocol-names">
- <title>Valid names</title>
- <para>
- The various header fields of type STRING have some restrictions
- on the string's format.
- </para>
- <sect3 id="message-protocol-names-service">
- <title>Service names</title>
- <para>
- Services have names with type STRING, meaning that
- they must be valid UTF-8. However, there are also some
- additional restrictions that apply to service names
- specifically:
- <itemizedlist>
- <listitem><para>They must contain at least one '.' (period) character</para></listitem>
- <listitem><para>They must not begin with a '.' (period) character</para></listitem>
- <listitem><para>They must not exceed 256 bytes in length</para></listitem>
- <listitem><para>They must be at least 1 byte in length</para></listitem>
- </itemizedlist>
-
- As a special exception, base service names (those beginning with a colon
- (':') character) need not contain a period.
- </para>
- <para>
- FIXME really, shouldn't we ban basically everything non-alphanumeric
- so the name will work in all programming languages?
- </para>
- </sect3>
- <sect3 id="message-protocol-names-interface">
- <title>Interface names</title>
- <para>
- Interface names have the same restrictions as service names,
- but do not have the special exception for names beginning with
- a colon.
- </para>
- <para>
- FIXME really, shouldn't we ban basically everything non-alphanumeric
- so the name will work in all programming languages?
- </para>
- </sect3>
- <sect3 id="message-protocol-names-method">
- <title>Method names</title>
- <para>
- Method names:
- <itemizedlist>
- <listitem><para>May not contain the '.' (period) character</para></listitem>
- <listitem><para>Must not exceed 256 bytes in length</para></listitem>
- <listitem><para>Must be at least 1 byte in length</para></listitem>
- </itemizedlist>
- </para>
- <para>
- FIXME really, shouldn't we ban basically everything non-alphanumeric
- so the name will work in all programming languages?
- </para>
- </sect3>
- <sect3 id="message-protocol-names-path">
- <title>Path names</title>
- <para>
- A path must begin with an ASCII '/' (slash) character. Paths may not
- end with a slash character unless the path is the one-byte string
- "/". Two slash characters may not appear adjacent to one another (the
- empty string is not a valid "subdirectory"). Paths may not exceed
- 256 bytes in length.
- </para>
- </sect3>
- <sect3 id="message-protocol-names-error">
- <title>Error names</title>
- <para>
- Error names have the same restrictions as interface names.
- </para>
- <para>
- FIXME really, shouldn't we ban basically everything non-alphanumeric
- so the name will work in all programming languages?
- </para>
- </sect3>
- </sect2>
-
- <sect2 id="message-protocol-types">
- <title>Message types</title>
- <para>
- Each of the message types (METHOD_CALL, METHOD_RETURN, ERROR, and
- SIGNAL) has its own expected usage conventions and header fields.
- </para>
- <sect3 id="message-protocol-types-method">
- <title>Method Calls, Returns, and Errors</title>
- <para>
- Some messages invoke an operation on a remote object. These are
- called method call messages and have the type tag METHOD_CALL. Such
- messages map naturally to methods on objects in a typical program.
- </para>
- <para>
- A method call message is expected to have a MEMBER header field
- indicating the name of the method. Optionally, the message has an
- INTERFACE field giving the interface the method is a part of. In the
- absence of an INTERFACE field, if two interfaces on the same object have
- a method with the same name, it is undefined which of the two methods
- will be invoked. Implementations may also choose to return an error in
- this ambiguous case. However, if a method name is unique
- implementations should not require an interface field.
- </para>
- <para>
- Method call messages also include a PATH field indicating the
- object to invoke the method on. If the call is passing through
- a message bus, the message will also have a SERVICE field giving
- the service to receive the message.
- </para>
- <para>
- When an application handles a method call message, it is expected to
- return a reply. The reply is identified by a REPLY_SERIAL header field
- indicating the serial number of the METHOD_CALL being replied to. The
- reply can have one of two types; either METHOD_RETURN or ERROR.
- </para>
- <para>
- If the reply has type METHOD_RETURN, the arguments to the reply message
- are the return value(s) or "out parameters" of the method call.
- If the reply has type ERROR, then an "exception" has been thrown,
- and the call fails; no return value will be provided. It makes
- no sense to send multiple replies to the same method call.
- </para>
- <para>
- Even if a method call has no return values, a METHOD_RETURN
- reply is expected, so the caller will know the method
- was successfully processed.
- </para>
- <para>
- If a METHOD_CALL message has the flag NO_REPLY_EXPECTED,
- then as an optimization the application receiving the method
- call may choose to omit the reply message (regardless of
- whether the reply would have been METHOD_RETURN or ERROR).
- However, it is also acceptable to ignore the NO_REPLY_EXPECTED
- flag and reply anyway.
- </para>
- <sect4 id="message-protocol-types-method-apis">
- <title>Mapping method calls to native APIs</title>
- <para>
- APIs for D-BUS may map method calls to a method call in a specific
- programming language, such as C++, or may map a method call written
- in an IDL to a D-BUS message.
- </para>
- <para>
- In APIs of this nature, arguments to a method are often termed "in"
- (which implies sent in the METHOD_CALL), or "out" (which implies
- returned in the METHOD_RETURN). Some APIs such as CORBA also have
- "inout" arguments, which are both sent and received, i.e. the caller
- passes in a value which is modified. Mapped to D-BUS, an "inout"
- argument is equivalent to an "in" argument, followed by an "out"
- argument. You can't pass things "by reference" over the wire, so
- "inout" is purely an illusion of the in-process API.
- </para>
- <para>
- Given a method with zero or one return values, followed by zero or more
- arguments, where each argument may be "in", "out", or "inout", the
- caller constructs a message by appending each "in" or "inout" argument,
- in order. "out" arguments are not represented in the caller's message.
- </para>
- <para>
- The recipient constructs a reply by appending first the return value
- if any, then each "out" or "inout" argument, in order.
- "in" arguments are not represented in the reply message.
- </para>
- </sect4>
-
- </sect3>
-
- <sect3 id="message-protocol-types-signal">
- <title>Signal Emission</title>
- <para>
- Unlike method calls, signal emissions have no replies.
- A signal emission is simply a single message of type SIGNAL.
- It must have three header fields: PATH giving the object
- the signal was emitted from, plus INTERFACE and MEMBER giving
- the fully-qualified name of the signal.
- </para>
- </sect3>
-
- <sect3 id="message-protocol-types-notation">
- <title>Notation in this document</title>
- <para>
- This document uses a simple pseudo-IDL to describe particular method
- calls and signals. Here is an example of a method call:
- <programlisting>
- org.freedesktop.DBus.ActivateService (in STRING service_name, in UINT32 flags,
- out UINT32 resultcode)
- </programlisting>
- This means INTERFACE = org.freedesktop.DBus, MEMBER = ActivateService,
- METHOD_CALL arguments are STRING and UINT32, METHOD_RETURN argument
- is UINT32. Remember that the MEMBER field can't contain any '.' (period)
- characters so it's known that the last part of the name in
- the "IDL" is the member name.
- </para>
- <para>
- In C++ that might end up looking like this:
- <programlisting>
- unsigned int org::freedesktop::DBus::ActivateService (const char *service_name,
- unsigned int flags);
- </programlisting>
- or equally valid, the return value could be done as an argument:
- <programlisting>
- void org::freedesktop::DBus::ActivateService (const char *service_name,
- unsigned int flags,
- unsigned int *resultcode);
- </programlisting>
- It's really up to the API designer how they want to make
- this look. You could design an API where the namespace wasn't used
- in C++, using STL or Qt, using varargs, or whatever you wanted.
- </para>
- <para>
- Signals are written as follows:
- <programlisting>
- org.freedesktop.DBus.ServiceLost (STRING service_name)
- </programlisting>
- Signals don't specify "in" vs. "out" because only
- a single direction is possible.
- </para>
- <para>
- In this ad hoc notation, the special type name ANY means any type
- other than NIL, and the special type name ANY_OR_NIL means any valid
- type.
- </para>
- <para>
- It isn't especially encouraged to use this lame pseudo-IDL in actual
- API implementations; you might use the native notation for the
- language you're using, or you might use COM or CORBA IDL, for example.
- </para>
- </sect3>
- </sect2>
-
- </sect1>
-
- <sect1 id="auth-protocol">
- <title>Authentication Protocol</title>
- <para>
- Before the flow of messages begins, two applications must
- authenticate. A simple plain-text protocol is used for
- authentication; this protocol is a SASL profile, and maps fairly
- directly from the SASL specification. The message encoding is
- NOT used here, only plain text messages.
- </para>
- <para>
- In examples, "C:" and "S:" indicate lines sent by the client and
- server respectively.
- </para>
- <sect2 id="auth-protocol-overview">
- <title>Protocol Overview</title>
- <para>
- The protocol is a line-based protocol, where each line ends with
- \r\n. Each line begins with an all-caps ASCII command name containing
- only the character range [A-Z], a space, then any arguments for the
- command, then the \r\n ending the line. The protocol is
- case-sensitive. All bytes must be in the ASCII character set.
-
- Commands from the client to the server are as follows:
-
- <itemizedlist>
- <listitem><para>AUTH [mechanism] [initial-response]</para></listitem>
- <listitem><para>CANCEL</para></listitem
- <listitem><para>BEGIN</para></listitem>
- <listitem><para>DATA &lt;data in base 64 encoding&gt;</para></listitem>
- <listitem><para>ERROR [human-readable error explanation]</para></listitem>
- </itemizedlist>
-
- From server to client are as follows:
-
- <itemizedlist>
- <listitem><para>REJECTED &lt;space-separated list of mechanism names&gt;</para></listitem>
- <listitem><para>OK</para></listitem>
- <listitem><para>DATA &lt;data in base 64 encoding&gt;</para></listitem>
- <listitem><para>ERROR</para></listitem>
- </itemizedlist>
- </para>
- </sect2>
- <sect2 id="auth-nul-byte">
- <title>Special credentials-passing nul byte</title>
- <para>
- Immediately after connecting to the server, the client must send a
- single nul byte. This byte may be accompanied by credentials
- information on some operating systems that use sendmsg() with
- SCM_CREDS or SCM_CREDENTIALS to pass credentials over UNIX domain
- sockets. However, the nul byte MUST be sent even on other kinds of
- socket, and even on operating systems that do not require a byte to be
- sent in order to transmit credentials. The text protocol described in
- this document begins after the single nul byte. If the first byte
- received from the client is not a nul byte, the server may disconnect
- that client.
- </para>
- <para>
- A nul byte in any context other than the initial byte is an error;
- the protocol is ASCII-only.
- </para>
- <para>
- The credentials sent along with the nul byte may be used with the
- SASL mechanism EXTERNAL.
- </para>
- </sect2>
- <sect2 id="auth-command-auth">
- <title>AUTH command</title>
- <para>
- If an AUTH command has no arguments, it is a request to list
- available mechanisms. The server SHOULD respond with a REJECTED
- command listing the mechanisms it understands.
- </para>
- <para>
- If an AUTH command specifies a mechanism, and the server supports
- said mechanism, the server SHOULD begin exchanging SASL
- challenge-response data with the client using DATA commands.
- </para>
- <para>
- If the server does not support the mechanism given in the AUTH
- command, it SHOULD send a REJECTED command listing the mechanisms
- it does support.
- </para>
- <para>
- If the [initial-response] argument is provided, it is intended for
- use with mechanisms that have no initial challenge (or an empty
- initial challenge), as if it were the argument to an initial DATA
- command. If the selected mechanism has an initial challenge, the
- server should reject authentication by sending REJECTED.
- </para>
- <para>
- If authentication succeeds after exchanging DATA commands,
- an OK command should be sent to the client.
- </para>
- <para>
- The first octet received by the client after the \r\n of the OK
- command MUST be the first octet of the authenticated/encrypted
- stream of D-BUS messages.
- </para>
- <para>
- The first octet received by the server after the \r\n of the BEGIN
- command from the client MUST be the first octet of the
- authenticated/encrypted stream of D-BUS messages.
- </para>
- </sect2>
- <sect2 id="auth-command-cancel">
- <title>CANCEL Command</title>
- <para>
- At any time up to sending the BEGIN command, the client may send a
- CANCEL command. On receiving the CANCEL command, the server MUST
- send a REJECTED command and abort the current authentication
- exchange.
- </para>
- </sect2>
- <sect2 id="auth-command-data">
- <title>DATA Command</title>
- <para>
- The DATA command may come from either client or server, and simply
- contains a base64-encoded block of data to be interpreted
- according to the SASL mechanism in use.
- </para>
- <para>
- Some SASL mechanisms support sending an "empty string";
- FIXME we need some way to do this.
- </para>
- </sect2>
- <sect2 id="auth-command-begin">
- <title>BEGIN Command</title>
- <para>
- The BEGIN command acknowledges that the client has received an
- OK command from the server, and that the stream of messages
- is about to begin.
- </para>
- <para>
- The first octet received by the server after the \r\n of the BEGIN
- command from the client MUST be the first octet of the
- authenticated/encrypted stream of D-BUS messages.
- </para>
- </sect2>
- <sect2 id="auth-command-rejected">
- <title>REJECTED Command</title>
- <para>
- The REJECTED command indicates that the current authentication
- exchange has failed, and further exchange of DATA is inappropriate.
- The client would normally try another mechanism, or try providing
- different responses to challenges.
- </para><para>
- Optionally, the REJECTED command has a space-separated list of
- available auth mechanisms as arguments. If a server ever provides
- a list of supported mechanisms, it MUST provide the same list
- each time it sends a REJECTED message. Clients are free to
- ignore all lists received after the first.
- </para>
- </sect2>
- <sect2 id="auth-command-ok">
- <title>OK Command</title>
- <para>
- The OK command indicates that the client has been authenticated,
- and that further communication will be a stream of D-BUS messages
- (optionally encrypted, as negotiated) rather than this protocol.
- </para>
- <para>
- The first octet received by the client after the \r\n of the OK
- command MUST be the first octet of the authenticated/encrypted
- stream of D-BUS messages.
- </para>
- <para>
- The client MUST respond to the OK command by sending a BEGIN
- command, followed by its stream of messages, or by disconnecting.
- The server MUST NOT accept additional commands using this protocol
- after the OK command has been sent.
- </para>
- </sect2>
- <sect2 id="auth-command-error">
- <title>ERROR Command</title>
- <para>
- The ERROR command indicates that either server or client did not
- know a command, does not accept the given command in the current
- context, or did not understand the arguments to the command. This
- allows the protocol to be extended; a client or server can send a
- command present or permitted only in new protocol versions, and if
- an ERROR is received instead of an appropriate response, fall back
- to using some other technique.
- </para>
- <para>
- If an ERROR is sent, the server or client that sent the
- error MUST continue as if the command causing the ERROR had never been
- received. However, the the server or client receiving the error
- should try something other than whatever caused the error;
- if only canceling/rejecting the authentication.
- </para>
- </sect2>
- <sect2 id="auth-examples">
- <title>Authentication examples</title>
-
- <para>
- <figure>
- <title>Example of successful magic cookie authentication</title>
- <programlisting>
- (MAGIC_COOKIE is a made up mechanism)
-
- C: AUTH MAGIC_COOKIE BsAY3g4gBNo=
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- <figure>
- <title>Example of finding out mechanisms then picking one</title>
- <programlisting>
- C: AUTH
- S: REJECTED KERBEROS_V4 SKEY
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: DATA Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA==
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- <figure>
- <title>Example of client sends unknown command then falls back to regular auth</title>
- <programlisting>
- C: FOOBAR
- S: ERROR
- C: AUTH MAGIC_COOKIE BsAY3g4gBNo=
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- <figure>
- <title>Example of server doesn't support initial auth mechanism</title>
- <programlisting>
- C: AUTH MAGIC_COOKIE BsAY3g4gBNo=
- S: REJECTED KERBEROS_V4 SKEY
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: DATA Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA==
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- <figure>
- <title>Example of wrong password or the like followed by successful retry</title>
- <programlisting>
- C: AUTH MAGIC_COOKIE BsAY3g4gBNo=
- S: REJECTED KERBEROS_V4 SKEY
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: DATA Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA==
- S: REJECTED
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: DATA Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA==
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- <figure>
- <title>Example of skey cancelled and restarted</title>
- <programlisting>
- C: AUTH MAGIC_COOKIE BsAY3g4gBNo=
- S: REJECTED KERBEROS_V4 SKEY
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: CANCEL
- S: REJECTED
- C: AUTH SKEY bW9yZ2Fu
- S: DATA OTUgUWE1ODMwOA==
- C: DATA Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA==
- S: OK
- C: BEGIN
- </programlisting>
- </figure>
- </para>
- </sect2>
- <sect2 id="auth-states">
- <title>Authentication state diagrams</title>
-
- <para>
- WRITEME
- </para>
- </sect2>
- <sect2 id="auth-mechanisms">
- <title>Authentication mechanisms</title>
- <para>
- This section describes some new authentication mechanisms.
- D-BUS also allows any standard SASL mechanism of course.
- </para>
- <sect3 id="auth-mechanisms-sha">
- <title>DBUS_COOKIE_SHA1</title>
- <para>
- The DBUS_COOKIE_SHA1 mechanism is designed to establish that a client
- has the ability to read a private file owned by the user being
- authenticated. If the client can prove that it has access to a secret
- cookie stored in this file, then the client is authenticated.
- Thus the security of DBUS_COOKIE_SHA1 depends on a secure home
- directory.
- </para>
- <para>
- Authentication proceeds as follows:
- <itemizedlist>
- <listitem>
- <para>
- The client sends the username it would like to authenticate
- as.
- </para>
- </listitem>
- <listitem>
- <para>
- The server sends the name of its "cookie context" (see below); a
- space character; the integer ID of the secret cookie the client
- must demonstrate knowledge of; a space character; then a
- hex-encoded randomly-generated challenge string.
- </para>
- </listitem>
- <listitem>
- <para>
- The client locates the cookie, and generates its own hex-encoded
- randomly-generated challenge string. The client then
- concatentates the server's hex-encoded challenge, a ":"
- character, its own hex-encoded challenge, another ":" character,
- and the hex-encoded cookie. It computes the SHA-1 hash of this
- composite string. It sends back to the server the client's
- hex-encoded challenge string, a space character, and the SHA-1
- hash.
- </para>
- </listitem>
- <listitem>
- <para>
- The server generates the same concatenated string used by the
- client and computes its SHA-1 hash. It compares the hash with
- the hash received from the client; if the two hashes match, the
- client is authenticated.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Each server has a "cookie context," which is a name that identifies a
- set of cookies that apply to that server. A sample context might be
- "org_freedesktop_session_bus". Context names must be valid ASCII,
- nonzero length, and may not contain the characters slash ("/"),
- backslash ("\"), space (" "), newline ("\n"), carriage return ("\r"),
- tab ("\t"), or period ("."). There is a default context,
- "org_freedesktop_global" that's used by servers that do not specify
- otherwise.
- </para>
- <para>
- Cookies are stored in a user's home directory, in the directory
- <filename>~/.dbus-keyrings/</filename>. This directory must
- not be readable or writable by other users. If it is,
- clients and servers must ignore it. The directory
- contains cookie files named after the cookie context.
- </para>
- <para>
- A cookie file contains one cookie per line. Each line
- has three space-separated fields:
- <itemizedlist>
- <listitem>
- <para>
- The cookie ID number, which must be a non-negative integer and
- may not be used twice in the same file.
- </para>
- </listitem>
- <listitem>
- <para>
- The cookie's creation time, in UNIX seconds-since-the-epoch
- format.
- </para>
- </listitem>
- <listitem>
- <para>
- The cookie itself, a hex-encoded random block of bytes.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Only server processes modify the cookie file.
- They must do so with this procedure:
- <itemizedlist>
- <listitem>
- <para>
- Create a lockfile name by appending ".lock" to the name of the
- cookie file. The server should attempt to create this file
- using <literal>O_CREAT | O_EXCL</literal>. If file creation
- fails, the lock fails. Servers should retry for a reasonable
- period of time, then they may choose to delete an existing lock
- to keep users from having to manually delete a stale
- lock. <footnote><para>Lockfiles are used instead of real file
- locking <literal>fcntl()</literal> because real locking
- implementations are still flaky on network
- filesystems.</para></footnote>
- </para>
- </listitem>
- <listitem>
- <para>
- Once the lockfile has been created, the server loads the cookie
- file. It should then delete any cookies that are old (the
- timeout can be fairly short), or more than a reasonable
- time in the future (so that cookies never accidentally
- become permanent, if the clock was set far into the future
- at some point). If no recent keys remain, the
- server may generate a new key.
- </para>
- </listitem>
- <listitem>
- <para>
- The pruned and possibly added-to cookie file
- must be resaved atomically (using a temporary
- file which is rename()'d).
- </para>
- </listitem>
- <listitem>
- <para>
- The lock must be dropped by deleting the lockfile.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Clients need not lock the file in order to load it,
- because servers are required to save the file atomically.
- </para>
- </sect3>
- </sect2>
- </sect1>
- <sect1 id="addresses">
- <title>Server Addresses</title>
- <para>
- Server addresses consist of a transport name followed by a colon, and
- then an optional, comma-separated list of keys and values in the form key=value.
- [FIXME how do you escape colon, comma, and semicolon in the values of the key=value pairs?]
- </para>
- <para>
- For example:
- <programlisting>unix:path=/tmp/dbus-test</programlisting>
- Which is the address to a unix socket with the path /tmp/dbus-test.
- </para>
- <para>
- [FIXME clarify if attempting to connect to each is a requirement
- or just a suggestion]
- When connecting to a server, multiple server addresses can be
- separated by a semi-colon. The library will then try to connect
- to the first address and if that fails, it'll try to connect to
- the next one specified, and so forth. For example
- <programlisting>unix:path=/tmp/dbus-test;unix:path=/tmp/dbus-test2</programlisting>
- </para>
- <para>
- [FIXME we need to specify in detail each transport and its possible arguments]
- Current transports include: unix domain sockets (including
- abstract namespace on linux), TCP/IP, and a debug/testing transport using
- in-process pipes. Future possible transports include one that
- tunnels over X11 protocol.
- </para>
- </sect1>
-
- <sect1 id="standard-messages">
- <title>Standard Peer-to-Peer Messages</title>
- <para>
- See <xref linkend="message-protocol-types-notation"> for details on
- the notation used in this section.
- </para>
- <sect2 id="standard-messages-ping">
- <title><literal>org.freedesktop.Peer.Ping</literal></title>
- <para>
- <programlisting>
- org.freedesktop.Peer.Ping ()
- </programlisting>
- </para>
- <para>
- On receipt of the METHOD_CALL
- message <literal>org.freedesktop.Peer.Ping</literal>, an application
- should do nothing other than reply with a METHOD_RETURN as usual.
- </para>
- </sect2>
-
- <sect2 id="standard-messages-get-props">
- <title><literal>org.freedesktop.Props.Get</literal></title>
- <para>
- [FIXME this is just a bogus made-up method that isn't implemented
- or thought through, to save an example of table formatting for the
- argument descriptions]
- <programlisting>
- org.freedesktop.Props.Get (in STRING property_name,
- out ANY_OR_NIL property_value)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>in STRING</entry>
- <entry>Name of the property to get</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>out ANY_OR_NIL</entry>
- <entry>The value of the property. The type depends on the property.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect2>
- </sect1>
-
- <sect1 id="message-bus">
- <title>Message Bus Specification</title>
- <sect2 id="message-bus-overview">
- <title>Message Bus Overview</title>
- <para>
- The message bus accepts connections from one or more applications.
- Once connected, applications can send and receive messages from
- the message bus, as in the peer-to-peer case.
- </para>
- <para>
- The message bus keeps track of a set of
- <firstterm>services</firstterm>. A service is simply a name, such as
- <literal>com.yoyodyne.Screensaver</literal>, which can be
- <firstterm>owned</firstterm> by one or more of the connected
- applications. The message bus itself always owns the special service
- <literal>org.freedesktop.DBus</literal>.
- </para>
- <para>
- Services may have <firstterm>secondary owners</firstterm>. Secondary owners
- of a service are kept in a queue; if the primary owner of a service
- disconnects, or releases the service, the next secondary owner becomes
- the new owner of the service.
- </para>
- <para>
- Messages may have a <literal>SERVICE</literal> field (see <xref
- linkend="message-protocol-header-fields">). When the message bus
- receives a message, if the <literal>SERVICE</literal> field is absent, the
- message is taken to be a standard peer-to-peer message and interpreted
- by the message bus itself. For example, sending
- an <literal>org.freedesktop.Peer.Ping</literal> message with no
- <literal>SERVICE</literal> will cause the message bus itself to reply
- to the ping immediately; the message bus would never make
- this message visible to other applications.
- </para>
- <para>
- If the <literal>SERVICE</literal> field is present, then it indicates a
- request for the message bus to route the message. In the usual case,
- messages are routed to the owner of the named service.
- Messages may also be <firstterm>broadcast</firstterm>
- by sending them to the special service
- <literal>org.freedesktop.DBus.Broadcast</literal>. Broadcast messages are
- sent to all applications with <firstterm>message matching
- rules</firstterm> that match the message.
- </para>
- <para>
- Continuing the <literal>org.freedesktop.Peer.Ping</literal> example, if
- the ping message were sent with a <literal>SERVICE</literal> name of
- <literal>com.yoyodyne.Screensaver</literal>, then the ping would be
- forwarded, and the Yoyodyne Corporation screensaver application would be
- expected to reply to the ping. If
- <literal>org.freedesktop.Peer.Ping</literal> were sent to
- <literal>org.freedesktop.DBus.Broadcast</literal>, then multiple applications
- might receive the ping, and all would normally reply to it.
- </para>
- </sect2>
-
- <sect2 id="message-bus-services">
- <title>Message Bus Services</title>
- <para>
- A service is a name that identifies a certain application. Each
- application connected to the message bus has at least one service name
- assigned at connection time and returned in response to the
- <literal>org.freedesktop.DBus.Hello</literal> message.
- This automatically-assigned service name is called
- the application's <firstterm>base service</firstterm>.
- Base service names are unique and MUST never be reused for two different
- applications.
- </para>
- <para>
- Ownership of the base service is a prerequisite for interaction with
- the message bus. It logically follows that the base service is always
- the first service that an application comes to own, and the last
- service that it loses ownership of.
- </para>
- <para>
- Base service names must begin with the character ':' (ASCII colon
- character); service names that are not base service names must not begin
- with this character. (The bus must reject any attempt by an application
- to manually create a service name beginning with ':'.) This restriction
- categorically prevents "spoofing"; messages sent to a base service name
- will always go to a single application instance and that instance only.
- </para>
- <para>
- An application can request additional service names to be associated
- with it using the
- <literal>org.freedesktop.DBus.AcquireService</literal>
- message. [FIXME what service names are allowed; ASCII or unicode;
- length limit; etc.]
- </para>
- <para>
- [FIXME this needs more detail, and should move the service-related message
- descriptions up into this section perhaps]
- Service ownership handling can be specified in the flags part
- of the <literal>org.freedesktop.DBus.AcquireService</literal>
- message. If an application specifies the
- DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT flag, then all applications
- trying to acquire the service will be put in a queue. When the
- primary owner disconnects from the bus or removes ownership
- from the service, the next application in the queue will be the
- primary owner. If the DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT
- flag is not specified, then the primary owner will lose
- ownership whenever another application requests ownership of the
- service.
- </para>
- <para>
- When a client disconnects from the bus, all the services that
- the clients own are deleted, or in the case of a service that
- prohibits replacement, ownership is transferred to the next
- client in the queue, if any.
- </para>
- </sect2>
- <sect2 id="message-bus-routing">
- <title>Message Bus Message Routing</title>
- <para>
- When a message is received by the message bus, the message's
- <literal>sndr</literal> header field MUST be set to the base service of
- the application which sent the message. If the service already has
- a <literal>sndr</literal> field, the pre-existing field is replaced.
- This rule means that a replies are always sent to the base service name,
- i.e. to the same application that sent the message being replied to.
- </para>
- <para>
- [FIXME go into detail about broadcast, multicast, unicast, etc.]
- </para>
- </sect2>
- <sect2 id="message-bus-activation">
- <title>Message Bus Service Activation</title>
- <para>
- <firstterm>Activation</firstterm> means to locate a service
- owner for a service that is currently unowned. For now, it
- means to launch an executable that will take ownership of
- a particular service.
- </para>
- <para>
- To find an executable corresponding to a particular service, the bus
- daemon looks for <firstterm>service description files</firstterm>.
- Service description files define a mapping from service names to
- executables. Different kinds of message bus will look for these files
- in different places, see <xref linkend="message-bus-types">.
- </para>
- <para>
- [FIXME the file format should be much better specified than
- "similar to .desktop entries" esp. since desktop entries are
- already badly-specified. ;-)] Service description files have
- the ".service" file extension. The message bus will only load
- service description files ending with .service; all other
- files will be ignored. The file format is similar to that of
- <ulink
- url="http://www.freedesktop.org/standards/desktop-entry-spec/desktop-entry-spec.html">desktop
- entries</ulink>. All service description files must be in
- UTF-8 encoding. To ensure that there will be no name
- collisions, service files must be namespaced using the same
- mechanism as messages and service names.
-
- <figure>
- <title>Example service description file</title>
- <programlisting>
- # Sample service description file
- [D-BUS Service]
- Name=org.gnome.ConfigurationDatabase
- Exec=/usr/libexec/gconfd-2
- </programlisting>
- </figure>
- </para>
- <para>
- When an application requests a service to be activated, the
- bus daemon tries to find it in the list of activation
- entries. It then tries to spawn the executable associated with
- it. If this fails, it will report an error. [FIXME what
- happens if two .service files offer the same service; what
- kind of error is reported, should we have a way for the client
- to choose one?]
- </para>
- <para>
- The executable launched will have the environment variable
- <literal>DBUS_ACTIVATION_ADDRESS</literal> set to the address of the
- message bus so it can connect and register the appropriate services.
- </para>
- <para>
- The executable being launched may want to know whether the message bus
- activating it is one of the well-known message buses (see <xref
- linkend="message-bus-types">). To facilitate this, the bus MUST also set
- the <literal>DBUS_ACTIVATION_BUS_TYPE</literal> environment variable if it is one
- of the well-known buses. The currently-defined values for this variable
- are <literal>system</literal> for the systemwide message bus,
- and <literal>session</literal> for the per-login-session message
- bus. The activated executable must still connect to the address given
- in <literal>DBUS_ACTIVATION_ADDRESS</literal>, but may assume that the
- resulting connection is to the well-known bus.
- </para>
- <para>
- [FIXME there should be a timeout somewhere, either specified
- in the .service file, by the client, or just a global value
- and if the client being activated fails to connect within that
- timeout, an error should be sent back.]
- </para>
- </sect2>
-
- <sect2 id="message-bus-types">
- <title>Well-known Message Bus Instances</title>
- <para>
- Two standard message bus instances are defined here, along with how
- to locate them and where their service files live.
- </para>
- <sect3 id="message-bus-types-login">
- <title>Login session message bus</title>
- <para>
- Each time a user logs in, a <firstterm>login session message
- bus</firstterm> may be started. All applications in the user's login
- session may interact with one another using this message bus.
- </para>
- <para>
- The address of the login session message bus is given
- in the <literal>DBUS_SESSION_BUS_ADDRESS</literal> environment
- variable. If that variable is not set, applications may
- also try to read the address from the X Window System root
- window property <literal>_DBUS_SESSION_BUS_ADDRESS</literal>.
- The root window property must have type <literal>STRING</literal>.
- The environment variable should have precedence over the
- root window property.
- </para>
- <para>
- [FIXME specify location of .service files, probably using
- DESKTOP_DIRS etc. from basedir specification, though login session
- bus is not really desktop-specific]
- </para>
- </sect3>
- <sect3 id="message-bus-types-system">
- <title>System message bus</title>
- <para>
- A computer may have a <firstterm>system message bus</firstterm>,
- accessible to all applications on the system. This message bus may be
- used to broadcast system events, such as adding new hardware devices,
- changes in the printer queue, and so forth.
- </para>
- <para>
- The address of the login session message bus is given
- in the <literal>DBUS_SYSTEM_BUS_ADDRESS</literal> environment
- variable. If that variable is not set, applications should try
- to connect to the well-known address
- <literal>unix:path=/var/run/dbus/system_bus_socket</literal>.
- <footnote>
- <para>
- The D-BUS reference implementation actually honors the
- <literal>$(localstatedir)</literal> configure option
- for this address, on both client and server side.
- </para>
- </footnote>
- </para>
- <para>
- [FIXME specify location of system bus .service files]
- </para>
- </sect3>
- </sect2>
-
- <sect2 id="message-bus-messages">
- <title>Message Bus Messages</title>
- <para>
- The special message bus service <literal>org.freedesktop.DBus</literal>
- responds to a number of messages, allowing applications to
- interact with the message bus.
- </para>
-
- <sect3 id="bus-messages-hello">
- <title><literal>org.freedesktop.DBus.Hello</literal></title>
- <para>
- As a method:
- <programlisting>
- STRING Hello ()
- </programlisting>
- Reply arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service assigned to the application</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Before an application is able to send messages to other
- applications it must send the
- <literal>org.freedesktop.DBus.Hello</literal> message to the
- message bus service. If an application tries to send a
- message to another application, or a message to the message
- bus service that isn't the
- <literal>org.freedesktop.DBus.Hello</literal> message, it
- will be disconnected from the bus. If a client wishes to
- disconnect from the bus, it just has to disconnect from the
- transport used. No de-registration message is necessary.
- </para>
- <para>
- The reply message contains the name of the application's base service.
- </para>
- </sect3>
- <sect3 id="bus-messages-list-services">
- <title><literal>org.freedesktop.DBus.ListServices</literal></title>
- <para>
- As a method:
- <programlisting>
- STRING_ARRAY ListServices ()
- </programlisting>
- Reply arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING_ARRAY</entry>
- <entry>Array of strings where each string is the name of a service</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Returns a list of all existing services registered with the message bus.
- </para>
- </sect3>
- <sect3 id="bus-messages-service-exists">
- <title><literal>org.freedesktop.DBus.ServiceExists</literal></title>
- <para>
- As a method:
- <programlisting>
- BOOLEAN ServiceExists (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- Reply arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>BOOLEAN</entry>
- <entry>Return value, true if the service exists</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Checks if a service with a specified name exists.
- </para>
- </sect3>
-
- <sect3 id="bus-messages-acquire-service">
- <title><literal>org.freedesktop.DBus.AcquireService</literal></title>
- <para>
- As a method:
- <programlisting>
- UINT32 AcquireService (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- Reply arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>UINT32</entry>
- <entry>Return value</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Tries to become owner of a specific service. The flags
- specified can be the following values logically ORed together:
-
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Identifier</entry>
- <entry>Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT</entry>
- <entry>0x1</entry>
- <entry>
- If the application succeeds in being the owner of the specified service,
- then ownership of the service can't be transferred until the service
- disconnects. If this flag is not set, then any application trying to become
- the owner of the service will succeed and the previous owner will be
- sent a <literal>org.freedesktop.DBus.ServiceLost</literal> message.
- </entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_FLAGS_REPLACE_EXISTING</entry>
- <entry>0x2</entry>
- <entry>Try to replace the current owner if there is one. If this flag
- is not set the application will only become the owner of the service if
- there is no current owner.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- [FIXME if it's one of the following values, why are the values
- done as flags instead of just 0, 1, 2, 3, 4]
- The return value can be one of the following values:
-
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Identifier</entry>
- <entry>Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>DBUS_SERVICE_REPLY_PRIMARY_OWNER</entry>
- <entry>0x1</entry>
- <entry>The application is now the primary owner of the service.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_IN_QUEUE</entry>
- <entry>0x2</entry>
- <entry>The service already has an owner which do not want to give up ownership and therefore the application has been put in a queue.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_SERVICE_EXISTS</entry>
- <entry>0x4</entry>
- <entry>The service does already have a primary owner, and DBUS_SERVICE_FLAG_REPLACE_EXISTING was not specified when trying to acquire the service.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_ALREADY_OWNER</entry>
- <entry>0x8</entry>
- <entry>The application trying to request ownership of the service is already the owner of it.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect3>
- <sect3 id="bus-messages-service-acquired">
- <title><literal>org.freedesktop.DBus.ServiceAcquired</literal></title>
- <para>
- As a method:
- <programlisting>
- ServiceAcquired (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- This message is sent to a specific application when it becomes the
- primary owner of a service.
- </para>
- </sect3>
- <sect3 id="bus-messages-service-lost">
- <title><literal>org.freedesktop.DBus.ServiceLost</literal></title>
- <para>
- As a method:
- <programlisting>
- ServiceLost (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- This message is sent to a specific application when it loses primary
- ownership of a service.
-
- [FIXME instead of ServiceLost/ServiceCreated going only to
- a specific app, why not just OwnerChanged that covers both
- lost and created and changed owner and deleted]
- </para>
- </sect3>
-
- <sect3 id="bus-messages-service-created">
- <title><literal>org.freedesktop.DBus.ServiceCreated</literal></title>
- <para>
- As a method:
- <programlisting>
- ServiceCreated (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- This message is broadcast to all applications when a service has been
- successfully registered on the message bus.
- </para>
- </sect3>
-
- <sect3 id="bus-messages-service-deleted">
- <title><literal>org.freedesktop.DBus.ServiceDeleted</literal></title>
- <para>
- As a method:
- <programlisting>
- ServiceDeleted (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- This message is broadcast to all applications when a service has been
- deleted from the message bus.
- </para>
- </sect3>
-
- <sect3 id="bus-messages-activate-service">
- <title><literal>org.freedesktop.DBus.ActivateService</literal></title>
- <para>
- As a method:
- <programlisting>
- UINT32 ActivateService (in STRING service_name, in UINT32 flags)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service to activate</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags (currently not used)</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- Reply arguments:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>UINT32</entry>
- <entry>Return value</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- Tries to launch the executable associated with a service. For more information, see <xref linkend="message-bus-activation">.
-
- [FIXME need semantics in much more detail here; for example,
- if I activate a service then send it a message, is the message
- queued for the new service or is there a race]
- </para>
- <para>
- The return value can be one of the following values:
- <informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Identifier</entry>
- <entry>Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>DBUS_ACTIVATION_REPLY_ACTIVATED</entry>
- <entry>0x0</entry>
- <entry>The service was activated successfully.</entry>
- </row>
- <row>
- <entry>DBUS_ACTIVATION_REPLY_ALREADY_ACTIVE</entry>
- <entry>0x1</entry>
- <entry>The service is already active.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
-
- </sect3>
-
- <sect3 id="bus-messages-out-of-memory">
- <title><literal>org.freedesktop.DBus.Error.NoMemory</literal></title>
- <para>
- As a method:
- <programlisting>
- void NoMemory ()
- </programlisting>
- </para>
- <para>
- Sent by the message bus when it can't process a message due to an out of memory failure.
- </para>
- </sect3>
-
- <sect3 id="bus-messages-service-does-not-exist">
- <title><literal>org.freedesktop.DBus.Error.ServiceDoesNotExist</literal></title>
- <para>
- As a method:
- <programlisting>
- void ServiceDoesNotExist (in STRING error)
- </programlisting>
- </para>
- <para>
- Sent by the message bus as a reply to a client that tried to send a message to a service that doesn't exist.
- </para>
- </sect3>
- </sect2>
-
- </sect1>
-<!--
- <appendix id="implementation-notes">
- <title>Implementation notes</title>
- <sect1 id="implementation-notes-subsection">
- <title></title>
- <para>
- </para>
- </sect1>
- </appendix>
--->
-
- <glossary><title>Glossary</title>
- <para>
- This glossary defines some of the terms used in this specification.
- </para>
-
- <glossentry id="term-activation"><glossterm>Activation</glossterm>
- <glossdef>
- <para>
- The process of creating an owner for a particular service,
- typically by launching an executable.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-base-service"><glossterm>Base Service</glossterm>
- <glossdef>
- <para>
- The special service automatically assigned to an application by the
- message bus. This service may never change owner, and the service
- name will be unique (never reused during the lifetime of the
- message bus).
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-broadcast"><glossterm>Broadcast</glossterm>
- <glossdef>
- <para>
- A message sent to the special <literal>org.freedesktop.DBus.Broadcast</literal>
- service; the message bus will forward the broadcast message
- to all applications that have expressed interest in it.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-message"><glossterm>Message</glossterm>
- <glossdef>
- <para>
- A message is the atomic unit of communication via the D-BUS
- protocol. It consists of a <firstterm>header</firstterm> and a
- <firstterm>body</firstterm>; the body is made up of
- <firstterm>arguments</firstterm>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-message-bus"><glossterm>Message Bus</glossterm>
- <glossdef>
- <para>
- The message bus is a special application that forwards
- or broadcasts messages between a group of applications
- connected to the message bus. It also manages
- <firstterm>services</firstterm>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="namespace"><glossterm>Namespace</glossterm>
- <glossdef>
- <para>
- Used to prevent collisions when defining message and service
- names. The convention used is the same as Java uses for
- defining classes: a reversed domain name.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-object"><glossterm>Object</glossterm>
- <glossdef>
- <para>
- Each application contains <firstterm>objects</firstterm>,
- which have <firstterm>interfaces</firstterm> and
- <firstterm>methods</firstterm>. Objects are referred to
- by a name, called a <firstterm>path</firstterm> or
- <firstterm>object reference</firstterm>.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-path"><glossterm>Path</glossterm>
- <glossdef>
- <para>
- Object references (object names) in D-BUS are
- organized into a filesystem-style hierarchy, so
- each object is named by a path. As in LDAP,
- there's no difference between "files" and "directories";
- a path can refer to an object, while still having
- child objects below it.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="peer-to-peer"><glossterm>Peer-to-peer</glossterm>
- <glossdef>
- <para>
- An application talking directly to another application, without going through a message bus.
- </para>
- </glossdef>
- </glossentry>
- <glossentry id="term-secondary-owner"><glossterm>Secondary service owner</glossterm>
- <glossdef>
- <para>
- Each service has a primary owner; messages sent to the service name
- go to the primary owner. However, certain services also maintain
- a queue of secondary owners "waiting in the wings." If
- the primary owner releases the service, then the first secondary
- owner in the queue automatically becomes the primary owner.
- </para>
- </glossdef>
- </glossentry>
- <glossentry id="term-service"><glossterm>Service</glossterm>
- <glossdef>
- <para>
- A service is simply a named list of applications. For example, the
- hypothetical <literal>com.yoyodyne.Screensaver</literal> service might
- accept messages that affect a screensaver from Yoyodyne Corporation.
- An application is said to <firstterm>own</firstterm> a service if the
- message bus has associated the application with the service name.
- Services may also have <firstterm>secondary owners</firstterm> (see
- <xref linkend="term-secondary-owner">).
- </para>
- </glossdef>
- </glossentry>
- <glossentry id="term-service-name"><glossterm>Service name</glossterm>
- <glossdef>
- <para>
- The name used when referring to a service. If the service is
- a base service it has a unique service name, for example
- ":1-20", and otherwise it should be namespaced.
- </para>
- </glossdef>
- </glossentry>
- <glossentry id="term-service-description-files"><glossterm>Service Description Files</glossterm>
- <glossdef>
- <para>
- ".service files" tell the bus how to activate a particular service.
- See <xref linkend="term-activation">
- </para>
- </glossdef>
- </glossentry>
-
- </glossary>
-</article>
-