D-Bus spec issue (Was Re: Windows DBus shared memory name depends on _DEBUG?)

Thiago Macieira thiago at kde.org
Tue Sep 28 11:13:14 PDT 2010


Em Terça-feira 28 Setembro 2010, às 16:16:57, David Zeuthen escreveu:
> First, autolaunch: isn't really a transport - it's an implementation
> detail of the dbus codebase. It really shouldn't be in the spec. E.g.
> we don't want to require every implementation of the D-Bus protocol
> (such as GDBus or NDesk) to support such a complicated "transport"
> (which isn't a transport in the first place - if anything, it's an
> address string).

What needs to be specified is what a binding must do if it is told to connect 
to "autolaunch:". How the code does that is beyond the scope.

> Second, in <sect3
> id="transports-autolaunch-windows-implementation-notes"> you mention
> how to obtain the session bus address on Windows (including possibly
> launching a bus if necessary). This is good but it really isn't an
> implementation detail - it's really necessary to implement this in
> each and every D-Bus implementation that is supposed to work on
> Windows.

Agreed.

> that specifies how to obtain (and set) the session bus address on
> Win32 (e.g. the part with cDBusDaemonMutex and DBusDaemonAddressInfo).
> Ideally as simple as what we have for X11 [1]:
> 
>     If that variable is not set, applications may also try to read the
> address from
>     the X Window System root window property _DBUS_SESSION_BUS_ADDRESS.
>     The root window property must have type STRING.
> 
> What do you think about this?

Well, that part:

> [1] : The X11 part of this is actually wrong and the spec needs to be
> updated to reflect the current behavior. But that's orthogonal to the
> problem at hand.

Yeah :-)

Here's some wording:

If DBUS_SESSION_BUS_ADDRESS is not set, or if it's set to the string 
"autolaunch:", the system should use platform-specific methods of locating a 
running D-Bus session server, or starting one if a running instance cannot be 
found.

Note that this mechanism is not recommended for attempting to determine if a 
daemon is running. It is inherently racy to attempt to make this 
determination, since the bus daemon may be started just before or just after 
the determination is made. Therefore, it is recommended that applications do 
not try to make this determination for their functionality purposes, and 
instead they should attempt to start the server.

X Windowing System
--------

For the X Windowing System, the application must locate the window owner of 
the selection represented by the atom formed by concatenating:

	the literal string "_DBUS_SESSION_BUS_SELECTION_"
	the current user's username
	the literal character '_' (underscore)
	the machine's ID

The following properties are defined for the window that owns this X selection:

	Atom						meaning
	_DBUS_SESSION_BUS_ADDRESS	the actual address of the server socket
	_DBUS_SESSION_BUS_PID			the PID of the server process

At least the _DBUS_SESSION_BUS_ADDRESS property MUST be present in this 
window.

If the X selection cannot be located or if reading the properties from the 
window fails, the implementation MUST conclude that there is no D-Bus server 
running and proceed to start a new server. (See below on concurrency issues)

Failure to connect to the D-Bus server address thus obtained MUST be treated 
as a fatal connection error and should be reported to the application.

As an alternative, an implementation MAY find the information in the following 
file located in the current user's home directory, in subdirectory 
.dbus/session-bus/:

	the machine's ID
	the literal character '-' (dash)
	the X display without the screen number, with the following prefixes 		
		removed, if present:
		- ":"
		- "localhost:"
		- "localhost.localdomain:"
		that is, a display of "localhost:10.0" produces just the number "10"

The contents of this file NAME=value assignment pairs and lines starting with # 
are comments (no comments are allowed otherwise). The following variable names 
are defined:
		
	Variable						meaning
	DBUS_SESSION_BUS_ADDRESS		the actual address of the server socket
	DBUS_SESSION_BUS_PID			the PID of the server process
	DBUS_SESSION_BUS_WINDOWID	the window ID

At least the DBUS_SESSION_BUS_ADDRESS variable MUST be present in this file.

Failure to open this file MUST be interpreted as absence of a running server. 
Therefore, the implementation MUST proceed to attempting to launch a new bus 
server if the file cannot be opened. 

However, success in opening this file MUST NOT lead to the conclusion that the 
server is running. Thus, a failure to connect to the bus address obtained by 
the alternative method MUST NOT be considered a fatal error. If the connection 
cannot be established, the implementation MUST proceed to check the X 
selection settings or to start the server on its own.

If the implementation concludes that the D-Bus server is not running it MUST 
attempt to start a new server and it MUST also ensure that the daemon started 
as an effect of the "autolaunch" mechanism provides the lookup mechanisms 
described above, so subsequent calls can locate the newly started server. The 
implementation MUST also ensure that if two or more concurrent initiations 
happen, only one server remains running and all other initiations are able to 
obtain the address of this server and connect to it. In other words, the 
implementation MUST ensure that the X selection is not present when it 
attempts to set it, without allowing another process to set the selection 
between the verification and the setting (e.g., by using XGrabServer / 
XUngrabServer).



Note: I think the X selection atom should include the user's ID (UID), not the 
username. We can change this and simply set both selections until D-Bus 1.6.

The above makes it so that the X selection & property mechanism is 
authoritative necessary and sufficient condition: the absence of the information 
means the server is *definitely* not running (right now, at least) and its 
presence means the server is *definitely* running.

The file in $HOME is not authoritative: it's a way for an implementation to 
perform a connection without consulting the X server or running dbus-launch. 
The presence of the file is only a necessary condition: if the server is 
running, the file is present and contains correct information. However, the file 
may be present and the server may not be running (e.g., stale file). That's why 
failing to connect to the socket should not be a fatal error.

I also wrote it in such a way that implementations are not allowed to query 
for whether the server is running.

-- 
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
  Senior Product Manager - Nokia, Qt Development Frameworks
      PGP/GPG: 0x6EF45358; fingerprint:
      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358

Qt Developer Days 2010  -  Munich Oct 11-13  -  San Francisco Nov 1-3
For more information and to register: http://qt.nokia.com/qtdevdays2010
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/dbus/attachments/20100928/7d80bd2c/attachment.pgp>


More information about the dbus mailing list