1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-transport.c DBusTransport object (internal to D-Bus implementation)
3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
4502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Copyright (C) 2002, 2003  Red Hat Inc.
5041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
7041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
8041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is free software; you can redistribute it and/or modify
9041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it under the terms of the GNU General Public License as published by
10041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
11041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * (at your option) any later version.
12041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
13041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is distributed in the hope that it will be useful,
14041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
15041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * GNU General Public License for more details.
17041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
18041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * You should have received a copy of the GNU General Public License
19041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * along with this program; if not, write to the Free Software
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
25041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-transport-protected.h"
26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-transport-unix.h"
278027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-transport-socket.h"
28041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-connection-internal.h"
29d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#include "dbus-watch.h"
30ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#include "dbus-auth.h"
315ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson#include "dbus-address.h"
3223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington#include "dbus-credentials.h"
33a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#include "dbus-message-private.h"
34a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#include "dbus-marshal-header.h"
35dec1fa3bd5f106ba5b2c749372231e3dd4bf9e7bAnders Carlsson#ifdef DBUS_BUILD_TESTS
36169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#include "dbus-server-debug-pipe.h"
37dec1fa3bd5f106ba5b2c749372231e3dd4bf9e7bAnders Carlsson#endif
38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
40041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusTransport DBusTransport object
41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @ingroup  DBusInternals
42041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @brief "Backend" for a DBusConnection.
43041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
44041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Types and functions related to DBusTransport.  A transport is an
45041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * abstraction that can send and receive data via various kinds of
46041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * network connections or other IPC mechanisms.
47041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
48041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{
49041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
50041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
51041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
52041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @typedef DBusTransport
53041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
54041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Opaque object representing a way message stream.
55041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * DBusTransport abstracts various kinds of actual
56041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * transport mechanism, such as different network protocols,
57041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or encryption schemes.
58041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
59041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
60502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonstatic void
61bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlive_messages_notify (DBusCounter *counter,
62502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                           void        *user_data)
63502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{
64502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  DBusTransport *transport = user_data;
65502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
66fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_ref (transport);
67502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
68502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington#if 0
69bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_verbose ("Size counter value is now %d\n",
70bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                 (int) _dbus_counter_get_size_value (counter));
71bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_verbose ("Unix FD counter value is now %d\n",
72bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                 (int) _dbus_counter_get_unix_fd_value (counter));
73502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington#endif
74502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
75502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  /* disable or re-enable the read watch for the transport if
76502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington   * required.
77502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington   */
785ee4ac1a303b3c66ff300eef55abd5f5d312cc0aJohn (J  if (transport->vtable->live_messages_changed)
79502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington    (* transport->vtable->live_messages_changed) (transport);
80502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
81fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_unref (transport);
82502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington}
83ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
84ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/**
85ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * Initializes the base class members of DBusTransport.  Chained up to
86ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * by subclasses in their constructor.  The server GUID is the
87ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * globally unique ID for the server creating this connection
88ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * and will be #NULL for the client side of a connection. The GUID
89ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * is in hex format.
90041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport being created.
92041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param vtable the subclass vtable.
93ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * @param server_guid non-#NULL if this transport is on the server side of a connection
9429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @param address the address of the transport
95041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns #TRUE on success.
96041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
97041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t
98041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_init_base (DBusTransport             *transport,
99ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington                           const DBusTransportVTable *vtable,
100ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington                           const DBusString          *server_guid,
10129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                           const DBusString          *address)
102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  DBusMessageLoader *loader;
104ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  DBusAuth *auth;
105502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  DBusCounter *counter;
10629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  char *address_copy;
10723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  DBusCredentials *creds;
108ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
109041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  loader = _dbus_message_loader_new ();
110041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (loader == NULL)
111041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    return FALSE;
112502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
113ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  if (server_guid)
114ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington    auth = _dbus_auth_server_new (server_guid);
115ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  else
116ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    auth = _dbus_auth_client_new ();
117ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  if (auth == NULL)
118ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    {
119ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington      _dbus_message_loader_unref (loader);
120ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington      return FALSE;
121ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    }
122502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
123502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  counter = _dbus_counter_new ();
124502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  if (counter == NULL)
125502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington    {
126502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington      _dbus_auth_unref (auth);
127502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington      _dbus_message_loader_unref (loader);
128502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington      return FALSE;
12929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
13023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington
13123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  creds = _dbus_credentials_new ();
13223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  if (creds == NULL)
13323832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington    {
13423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      _dbus_counter_unref (counter);
13523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      _dbus_auth_unref (auth);
13623832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      _dbus_message_loader_unref (loader);
13723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      return FALSE;
13823832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington    }
13929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
140ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  if (server_guid)
14129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
14229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      _dbus_assert (address == NULL);
14329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      address_copy = NULL;
14429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
14529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  else
14629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
14729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      _dbus_assert (address != NULL);
14829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
14929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (!_dbus_string_copy_data (address, &address_copy))
15029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
15123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington          _dbus_credentials_unref (creds);
15229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          _dbus_counter_unref (counter);
15329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          _dbus_auth_unref (auth);
15429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          _dbus_message_loader_unref (loader);
15529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          return FALSE;
15629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
157502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington    }
158041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
159041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->refcount = 1;
160041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->vtable = vtable;
161041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->loader = loader;
162ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  transport->auth = auth;
163bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  transport->live_messages = counter;
164ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  transport->authenticated = FALSE;
165ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  transport->disconnected = FALSE;
166ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  transport->is_server = (server_guid != NULL);
167ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  transport->send_credentials_pending = !transport->is_server;
168ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  transport->receive_credentials_pending = transport->is_server;
16929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  transport->address = address_copy;
17029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
171b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->unix_user_function = NULL;
172b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->unix_user_data = NULL;
173b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->free_unix_user_data = NULL;
1744db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
1757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->windows_user_function = NULL;
1767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->windows_user_data = NULL;
1777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->free_windows_user_data = NULL;
1787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
1794db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  transport->expected_guid = NULL;
180b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
181502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  /* Try to default to something that won't totally hose the system,
182502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington   * but doesn't impose too much of a limitation.
183502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington   */
184502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  transport->max_live_messages_size = _DBUS_ONE_MEGABYTE * 63;
185502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
186bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  /* On Linux RLIMIT_NOFILE defaults to 1024, so allowing 4096 fds live
187bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering     should be more than enough */
188bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  transport->max_live_messages_unix_fds = 4096;
189bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering
19023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  /* credentials read from socket if any */
19123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  transport->credentials = creds;
192a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
193bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_counter_set_notify (transport->live_messages,
194502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                            transport->max_live_messages_size,
195bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            transport->max_live_messages_unix_fds,
196bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            live_messages_notify,
197502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                            transport);
19829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
19929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (transport->address)
20029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    _dbus_verbose ("Initialized transport on address %s\n", transport->address);
201a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
202041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  return TRUE;
203041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
204041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
205041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
206041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Finalizes base class members of DBusTransport.
207041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Chained up to from subclass finalizers.
208041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
209041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
210041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
211041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
212041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_finalize_base (DBusTransport *transport)
213041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
214041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (!transport->disconnected)
215041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    _dbus_transport_disconnect (transport);
216b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
217b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  if (transport->free_unix_user_data != NULL)
218b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington    (* transport->free_unix_user_data) (transport->unix_user_data);
2197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
2207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (transport->free_windows_user_data != NULL)
2217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    (* transport->free_windows_user_data) (transport->windows_user_data);
222502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
223041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_message_loader_unref (transport->loader);
224ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  _dbus_auth_unref (transport->auth);
225bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_counter_set_notify (transport->live_messages,
226bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            0, 0, NULL, NULL);
227bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_counter_unref (transport->live_messages);
22829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  dbus_free (transport->address);
2294db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  dbus_free (transport->expected_guid);
23023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  if (transport->credentials)
23123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington    _dbus_credentials_unref (transport->credentials);
232041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
233041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
234f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
235f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira/**
236f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * Verifies if a given D-Bus address is a valid address
237f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * by attempting to connect to it. If it is, returns the
238f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * opened DBusTransport object. If it isn't, returns #NULL
239f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * and sets @p error.
240f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira *
241f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @param error address where an error can be returned.
242f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @returns a new transport, or #NULL on failure.
243f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira */
244f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransport*
245f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieiracheck_address (const char *address, DBusError *error)
246f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{
247f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  DBusAddressEntry **entries;
248f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  DBusTransport *transport = NULL;
249f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  int len, i;
250f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
251f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  _dbus_assert (address != NULL);
252f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  _dbus_assert (*address != '\0');
253f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
254f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  if (!dbus_parse_address (address, &entries, &len, error))
2553c89788fa483ebda858ab66797e2834af94b798fKjartan Maraas    return NULL;              /* not a valid address */
256f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
257f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  for (i = 0; i < len; i++)
258f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    {
259f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      transport = _dbus_transport_open (entries[i], error);
260f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      if (transport != NULL)
261f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira        break;
262f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    }
263f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
264f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  dbus_address_entries_free (entries);
265f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  return transport;
266f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira}
267f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
268f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira/**
269f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * Creates a new transport for the "autostart" method.
270f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * This creates a client-side of a transport.
271f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira *
272f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @param error address where an error can be returned.
273f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @returns a new transport, or #NULL on failure.
274f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira */
275f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransport*
276f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira_dbus_transport_new_for_autolaunch (DBusError      *error)
277f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{
278f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  DBusString address;
279f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  DBusTransport *result = NULL;
280f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
281f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
282f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
283f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  if (!_dbus_string_init (&address))
284f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    {
285f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
286f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      return NULL;
287f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    }
288f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
289f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  if (!_dbus_get_autolaunch_address (&address, error))
290f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    {
291f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      _DBUS_ASSERT_ERROR_IS_SET (error);
292f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      goto out;
293f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    }
294f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
295f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  result = check_address (_dbus_string_get_const_data (&address), error);
296f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  if (result == NULL)
297f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    _DBUS_ASSERT_ERROR_IS_SET (error);
298f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  else
299f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
300f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
301f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira out:
302f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  _dbus_string_free (&address);
303f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  return result;
304f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira}
305f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
306f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransportOpenResult
307f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira_dbus_transport_open_autolaunch (DBusAddressEntry  *entry,
308f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira                                 DBusTransport    **transport_p,
309f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira                                 DBusError         *error)
310f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{
311f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  const char *method;
312f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
313f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  method = dbus_address_entry_get_method (entry);
314f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  _dbus_assert (method != NULL);
315f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
316f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  if (strcmp (method, "autolaunch") == 0)
317f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    {
318f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      *transport_p = _dbus_transport_new_for_autolaunch (error);
319f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
320f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      if (*transport_p == NULL)
321f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira        {
322f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira          _DBUS_ASSERT_ERROR_IS_SET (error);
323f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira          return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT;
324f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira        }
325f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      else
326f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira        {
327f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira          _DBUS_ASSERT_ERROR_IS_CLEAR (error);
328f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira          return DBUS_TRANSPORT_OPEN_OK;
329f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira        }
330f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    }
331f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  else
332f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    {
333f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      _DBUS_ASSERT_ERROR_IS_CLEAR (error);
334f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira      return DBUS_TRANSPORT_OPEN_NOT_HANDLED;
335f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira    }
336f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira}
337f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
338fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Penningtonstatic const struct {
339fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  DBusTransportOpenResult (* func) (DBusAddressEntry *entry,
340fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                    DBusTransport   **transport_p,
341fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                    DBusError        *error);
342fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington} open_funcs[] = {
343fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  { _dbus_transport_open_socket },
344f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  { _dbus_transport_open_platform_specific },
345f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira  { _dbus_transport_open_autolaunch }
346fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington#ifdef DBUS_BUILD_TESTS
347fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  , { _dbus_transport_open_debug_pipe }
348fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington#endif
349fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington};
350fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington
351041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
352ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * Try to open a new transport for the given address entry.  (This
353ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * opens a client-side-of-the-connection transport.)
354041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
355ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * @param entry the address entry
356ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error location to store reason for failure.
357041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns new transport of #NULL on failure.
358041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
359041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusTransport*
360ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington_dbus_transport_open (DBusAddressEntry *entry,
361ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington                      DBusError        *error)
362041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
363041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  DBusTransport *transport;
3644db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  const char *expected_guid_orig;
3654db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  char *expected_guid;
366fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  int i;
367f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie  DBusError tmp_error = DBUS_ERROR_INIT;
368f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie
36951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
37051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
3715ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson  transport = NULL;
3724db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  expected_guid_orig = dbus_address_entry_get_value (entry, "guid");
3734db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  expected_guid = _dbus_strdup (expected_guid_orig);
3744db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
3754db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  if (expected_guid_orig != NULL && expected_guid == NULL)
3764db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    {
3774db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington      _DBUS_SET_OOM (error);
3784db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington      return NULL;
3794db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    }
380a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington
381fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  for (i = 0; i < (int) _DBUS_N_ELEMENTS (open_funcs); ++i)
382ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington    {
383fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington      DBusTransportOpenResult result;
3846180d6954c41a2412c166e5a9e8a2851cf39c6d1Mikael Hallendal
3850d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu      _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error);
386fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington      result = (* open_funcs[i].func) (entry, &transport, &tmp_error);
387169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington
388fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington      switch (result)
389ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington        {
390fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington        case DBUS_TRANSPORT_OPEN_OK:
3910d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu          _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error);
392fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          goto out;
393fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          break;
394fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington        case DBUS_TRANSPORT_OPEN_NOT_HANDLED:
3950d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu          _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error);
396fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          /* keep going through the loop of open funcs */
397fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          break;
398fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington        case DBUS_TRANSPORT_OPEN_BAD_ADDRESS:
3990d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu          _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error);
400fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          goto out;
401fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          break;
402fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington        case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT:
4030d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu          _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error);
404fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          goto out;
405fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          break;
406ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington        }
40751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
408ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington
409fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington out:
410fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington
411ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington  if (transport == NULL)
4124db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    {
413fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington      if (!dbus_error_is_set (&tmp_error))
414fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington        _dbus_set_bad_address (&tmp_error,
415fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                               NULL, NULL,
416fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                               "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")");
417fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington
4180d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu      _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error);
419fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington      dbus_move_error(&tmp_error, error);
4204db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington      dbus_free (expected_guid);
4214db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    }
4224db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington  else
4234db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    {
4240d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu      _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error);
425ca87b90981e88623589b7d1d42ce5bafcb644213John (J
426ca87b90981e88623589b7d1d42ce5bafcb644213John (J      /* In the case of autostart the initial guid is NULL
427ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * and the autostart transport recursively calls
428ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * _dbus_open_transport wich returns a transport
429ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * with a guid.  That guid is the definitive one.
430ca87b90981e88623589b7d1d42ce5bafcb644213John (J       *
431ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * FIXME: if more transports are added they may have
432ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * an effect on the expected_guid semantics (i.e.
433ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * expected_guid and transport->expected_guid may
434ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * both have values).  This is very unlikely though
435ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * we should either throw asserts here for those
436ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * corner cases or refactor the code so it is
437ca87b90981e88623589b7d1d42ce5bafcb644213John (J       * clearer on what is expected and what is not
438ca87b90981e88623589b7d1d42ce5bafcb644213John (J       */
439ca87b90981e88623589b7d1d42ce5bafcb644213John (J      if(expected_guid)
440ca87b90981e88623589b7d1d42ce5bafcb644213John (J        transport->expected_guid = expected_guid;
4414db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington    }
4425ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson
443fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington  return transport;
444041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
445041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
446041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
447041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Increments the reference count for the transport.
448041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
449041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
4509f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal * @returns the transport.
451041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
4529f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalDBusTransport *
453041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_ref (DBusTransport *transport)
454041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
455b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  _dbus_assert (transport->refcount > 0);
456b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
457041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->refcount += 1;
4589f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal
4599f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal  return transport;
460041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
461041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
462041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
463041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Decrements the reference count for the transport.
464041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Disconnects and finalizes the transport if
465041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the reference count reaches zero.
466041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
467041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
468041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
469041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
470041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_unref (DBusTransport *transport)
471041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
472041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport != NULL);
473041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->refcount > 0);
474f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
475041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->refcount -= 1;
476041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (transport->refcount == 0)
477041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    {
478d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("finalizing\n");
479f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
480041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington      _dbus_assert (transport->vtable->finalize != NULL);
481041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
482041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington      (* transport->vtable->finalize) (transport);
483041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    }
484041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
485041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
486041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
487041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Closes our end of the connection to a remote application. Further
488041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * attempts to use this transport will fail. Only the first call to
489041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * _dbus_transport_disconnect() will have an effect.
490041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
491041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
492041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
493041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
494041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
495041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_disconnect (DBusTransport *transport)
496041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
497d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("start\n");
498f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
499041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->vtable->disconnect != NULL);
500f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
501041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (transport->disconnected)
502041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    return;
503ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
504041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  (* transport->vtable->disconnect) (transport);
50501af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington
506041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->disconnected = TRUE;
507f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
508d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("end\n");
509041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
510041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
511041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
512041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns #TRUE if the transport has not been disconnected.
513041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Disconnection can result from _dbus_transport_disconnect()
514041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or because the server drops its end of the connection.
515041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
516041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
517ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns whether we're connected
518041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
519041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t
520041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_get_is_connected (DBusTransport *transport)
521041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
522041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  return !transport->disconnected;
523041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
524041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
5257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t
5267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_unix_user_function (DBusTransport *transport)
5277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
5287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusCredentials *auth_identity;
5297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  dbus_bool_t allow;
5307be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusConnection *connection;
5317be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusAllowUnixUserFunction unix_user_function;
5327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  void *unix_user_data;
5337be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  dbus_uid_t uid;
5347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  /* Dropping the lock here probably isn't that safe. */
5367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
5387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_assert (auth_identity != NULL);
5397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  connection = transport->connection;
5417be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  unix_user_function = transport->unix_user_function;
5427be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  unix_user_data = transport->unix_user_data;
543e3d30a03225dd1d26012ecd39b09e4ccf91befb5Havoc Pennington  uid = _dbus_credentials_get_unix_uid (auth_identity);
5447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
545d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("unlock\n");
5467be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_connection_unlock (connection);
5477be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5487be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  allow = (* unix_user_function) (connection,
5497be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                  uid,
5507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                  unix_user_data);
5517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
552d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("lock post unix user function\n");
5537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_connection_lock (connection);
5547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (allow)
5567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
5577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_verbose ("Client UID "DBUS_UID_FORMAT" authorized\n", uid);
5587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
5597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  else
5607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
5617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_verbose ("Client UID "DBUS_UID_FORMAT
5627be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                     " was rejected, disconnecting\n",
5637be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                     _dbus_credentials_get_unix_uid (auth_identity));
5647be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_transport_disconnect (transport);
5657be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
5667be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  return allow;
5687be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
5697be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5707be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t
5717be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_windows_user_function (DBusTransport *transport)
5727be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
5737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusCredentials *auth_identity;
5747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  dbus_bool_t allow;
5757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusConnection *connection;
5767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusAllowWindowsUserFunction windows_user_function;
5777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  void *windows_user_data;
5787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  char *windows_sid;
5797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5807be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  /* Dropping the lock here probably isn't that safe. */
5817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5827be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
5837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_assert (auth_identity != NULL);
5847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  connection = transport->connection;
5867be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  windows_user_function = transport->windows_user_function;
5877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  windows_user_data = transport->unix_user_data;
5887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  windows_sid = _dbus_strdup (_dbus_credentials_get_windows_sid (auth_identity));
5897be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5907be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (windows_sid == NULL)
5917be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
5927be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* OOM */
5937be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      return FALSE;
5947be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
5957be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
596d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("unlock\n");
5977be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_connection_unlock (connection);
5987be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
5997be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  allow = (* windows_user_function) (connection,
6007be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                     windows_sid,
6017be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                     windows_user_data);
6027be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
603d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("lock post windows user function\n");
6047be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_connection_lock (connection);
6057be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6067be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (allow)
6077be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
6087be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_verbose ("Client SID '%s' authorized\n", windows_sid);
6097be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
6107be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  else
6117be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
6127be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_verbose ("Client SID '%s' was rejected, disconnecting\n",
6137be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                     _dbus_credentials_get_windows_sid (auth_identity));
6147be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_transport_disconnect (transport);
6157be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
6167be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6177be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  return allow;
6187be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
6197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t
6217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_default_rules (DBusTransport *transport)
6227be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
6237be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusCredentials *auth_identity;
6247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusCredentials *our_identity;
6257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  dbus_bool_t allow;
6267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
6287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_assert (auth_identity != NULL);
6297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
63094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  /* By default, connection is allowed if the client is 1) root or 2)
63194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington   * has the same UID as us or 3) anonymous is allowed.
6327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington   */
63394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington
6347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  our_identity = _dbus_credentials_new_from_current_process ();
6357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (our_identity == NULL)
6367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
6377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* OOM */
6387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      return FALSE;
6397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
6407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
64194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  if (transport->allow_anonymous ||
64294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington      _dbus_credentials_get_unix_uid (auth_identity) == 0 ||
6437be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_credentials_same_user (our_identity,
6447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                   auth_identity))
6457be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
64662c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker      if (_dbus_credentials_include(our_identity,DBUS_CREDENTIAL_WINDOWS_SID))
64762c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker          _dbus_verbose ("Client authorized as SID '%s'"
64862c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         "matching our SID '%s'\n",
64962c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         _dbus_credentials_get_windows_sid(auth_identity),
65062c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         _dbus_credentials_get_windows_sid(our_identity));
65162c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker      else
65262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker          _dbus_verbose ("Client authorized as UID "DBUS_UID_FORMAT
65362c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         " matching our UID "DBUS_UID_FORMAT"\n",
65462c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         _dbus_credentials_get_unix_uid(auth_identity),
65562c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         _dbus_credentials_get_unix_uid(our_identity));
6567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* We have authenticated! */
6577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      allow = TRUE;
6587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
6597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  else
6607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
66162c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker      if (_dbus_credentials_include(our_identity,DBUS_CREDENTIAL_WINDOWS_SID))
66262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker          _dbus_verbose ("Client authorized as SID '%s'"
66362c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         " but our SID is '%s', disconnecting\n",
6648c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist                         (_dbus_credentials_get_windows_sid(auth_identity) ?
6658c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist                          _dbus_credentials_get_windows_sid(auth_identity) : "<null>"),
6668c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist                         (_dbus_credentials_get_windows_sid(our_identity) ?
6678c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist                          _dbus_credentials_get_windows_sid(our_identity) : "<null>"));
66862c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker      else
66962c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker          _dbus_verbose ("Client authorized as UID "DBUS_UID_FORMAT
67062c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         " but our UID is "DBUS_UID_FORMAT", disconnecting\n",
671ef86bcedc8ec33b77b710a0e1ff84b4ae2539bc1Tor Lillqvist                         _dbus_credentials_get_unix_uid(auth_identity),
67262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker                         _dbus_credentials_get_unix_uid(our_identity));
6737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      _dbus_transport_disconnect (transport);
6747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      allow = FALSE;
6757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
6767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_credentials_unref (our_identity);
6787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  return allow;
6807be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
6817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
6827be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
683041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
684ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * Returns #TRUE if we have been authenticated.  Will return #TRUE
685ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * even if the transport is disconnected.
686ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington *
687f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington * @todo we drop connection->mutex when calling the unix_user_function,
6887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * and windows_user_function, which may not be safe really.
689b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington *
690ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @param transport the transport
691ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns whether we're authenticated
692ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington */
693ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Penningtondbus_bool_t
694ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington_dbus_transport_get_is_authenticated (DBusTransport *transport)
69523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington{
696ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  if (transport->authenticated)
697ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    return TRUE;
698ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  else
699ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    {
700a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      dbus_bool_t maybe_authenticated;
701a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
70201af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington      if (transport->disconnected)
70301af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington        return FALSE;
704f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
705f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington      /* paranoia ref since we call user callbacks sometimes */
706f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington      _dbus_connection_ref_unlocked (transport->connection);
70701af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington
708a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      maybe_authenticated =
70901af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington        (!(transport->send_credentials_pending ||
710777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington           transport->receive_credentials_pending));
711ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
712777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      if (maybe_authenticated)
713777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington        {
714777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington          switch (_dbus_auth_do_work (transport->auth))
715777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington            {
716777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington            case DBUS_AUTH_STATE_AUTHENTICATED:
717777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington              /* leave as maybe_authenticated */
718777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington              break;
719777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington            default:
720777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington              maybe_authenticated = FALSE;
721777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington            }
722777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington        }
7234db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
7247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* If we're the client, verify the GUID
7257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington       */
7264db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington      if (maybe_authenticated && !transport->is_server)
7274db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington        {
7284db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington          const char *server_guid;
7294db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
7304db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington          server_guid = _dbus_auth_get_guid_from_server (transport->auth);
7314db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington          _dbus_assert (server_guid != NULL);
7324db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
7334db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington          if (transport->expected_guid &&
7344db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              strcmp (transport->expected_guid, server_guid) != 0)
7354db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington            {
7364db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              _dbus_verbose ("Client expected GUID '%s' and we got '%s' from the server\n",
7374db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington                             transport->expected_guid, server_guid);
7384db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              _dbus_transport_disconnect (transport);
7394db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              _dbus_connection_unref_unlocked (transport->connection);
7404db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              return FALSE;
7414db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington            }
7424db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
7434db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington          if (transport->expected_guid == NULL)
7444db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington            {
7454db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              transport->expected_guid = _dbus_strdup (server_guid);
7464db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington
7474db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington              if (transport->expected_guid == NULL)
7484db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington                {
749d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker                  _dbus_verbose ("No memory to complete auth\n");
7504db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington                  return FALSE;
7514db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington                }
7524db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington            }
7534db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington        }
7547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
7557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* If we're the server, see if we want to allow this identity to proceed.
75601af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington       */
757a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      if (maybe_authenticated && transport->is_server)
75801af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington        {
7597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington          dbus_bool_t allow;
76023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington          DBusCredentials *auth_identity;
7617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
76223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington          auth_identity = _dbus_auth_get_identity (transport->auth);
76323832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington          _dbus_assert (auth_identity != NULL);
7647be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
7657be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington          /* If we have an auth'd user and a user function, delegate
7667be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington           * deciding whether auth credentials are good enough to the
7677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington           * app; otherwise, use our default decision process.
76823832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington           */
76923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington          if (transport->unix_user_function != NULL &&
77023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington              _dbus_credentials_include (auth_identity, DBUS_CREDENTIAL_UNIX_USER_ID))
77101af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington            {
7727be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington              allow = auth_via_unix_user_function (transport);
77301af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington            }
7747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington          else if (transport->windows_user_function != NULL &&
7757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                   _dbus_credentials_include (auth_identity, DBUS_CREDENTIAL_WINDOWS_SID))
7767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington            {
7777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington              allow = auth_via_windows_user_function (transport);
7787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington            }
77901af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington          else
78001af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington            {
7817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington              allow = auth_via_default_rules (transport);
78201af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington            }
7837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
7847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington          if (!allow)
7857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington            maybe_authenticated = FALSE;
78601af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington        }
7877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
788a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      transport->authenticated = maybe_authenticated;
789f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
790f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington      _dbus_connection_unref_unlocked (transport->connection);
791f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington      return maybe_authenticated;
792ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    }
793ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington}
794ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
795ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/**
79694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * See dbus_connection_get_is_anonymous().
79794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington *
79894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param transport the transport
79994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @returns #TRUE if not authenticated or authenticated as anonymous
80094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington */
80194125e89b6be74cb20100d5321a98aa6529187a9Havoc Penningtondbus_bool_t
80294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington_dbus_transport_get_is_anonymous (DBusTransport *transport)
80394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington{
80494125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  DBusCredentials *auth_identity;
80594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington
80694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  if (!transport->authenticated)
80794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington    return TRUE;
80894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington
80994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
81094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington
81194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  if (_dbus_credentials_are_anonymous (auth_identity))
81294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington    return TRUE;
81394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  else
81494125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington    return FALSE;
81594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington}
81694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington
81794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington/**
818a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Returns TRUE if the transport supports sending unix fds.
819a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *
820a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param transport the transport
821a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @returns #TRUE if TRUE it is possible to send unix fds across the transport.
822a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */
823a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringdbus_bool_t
824a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_transport_can_pass_unix_fd(DBusTransport *transport)
825a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{
826a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport);
827a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering}
828a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
829a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/**
83029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * Gets the address of a transport. It will be
83129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * #NULL for a server-side transport.
83229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington *
83329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @param transport the transport
83429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @returns transport's address
83529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington */
83629c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonconst char*
83729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington_dbus_transport_get_address (DBusTransport *transport)
83829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{
83929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  return transport->address;
84029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington}
84129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
84229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington/**
84354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * Gets the id of the server we are connected to (see
84454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * dbus_server_get_id()). Only works on client side.
84554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington *
84654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * @param transport the transport
84754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * @returns transport's server's id or #NULL if we are the server side
84854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington */
84954b943432c7c947db88066751dd36a372cc9a618Havoc Penningtonconst char*
85054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington_dbus_transport_get_server_id (DBusTransport *transport)
85154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington{
85254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (transport->is_server)
85354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    return NULL;
85454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  else
85554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    return transport->expected_guid;
85654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington}
85754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
85854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington/**
859041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Handles a watch by reading data, writing data, or disconnecting
860041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the transport, as appropriate for the given condition.
861041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
862041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
863041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param watch the watch.
864041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param condition the current state of the watched file descriptor.
865b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington * @returns #FALSE if not enough memory to fully handle the watch
866041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
867b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtondbus_bool_t
868041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_handle_watch (DBusTransport           *transport,
869041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                              DBusWatch               *watch,
870041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                              unsigned int             condition)
871041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
872b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  dbus_bool_t retval;
873b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
874041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->vtable->handle_watch != NULL);
875041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
876041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (transport->disconnected)
877b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    return TRUE;
878041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
87998f19852078cf03f8b50a93d49d83b85c0dd400bHavoc Pennington  if (dbus_watch_get_socket (watch) < 0)
880ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    {
881f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      _dbus_warn_check_failed ("Tried to handle an invalidated watch; this watch should have been removed\n");
882b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      return TRUE;
883ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington    }
884041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
885ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  _dbus_watch_sanitize_condition (watch, &condition);
886ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
887fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_ref (transport);
888ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  _dbus_watch_ref (watch);
889b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  retval = (* transport->vtable->handle_watch) (transport, watch, condition);
890ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington  _dbus_watch_unref (watch);
891fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_unref (transport);
892b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
893b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  return retval;
894041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
895041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
896041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
897041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Sets the connection using this transport. Allows the transport
898041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * to add watches to the connection, queue incoming messages,
899041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * and pull outgoing messages.
900041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
901041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
902041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param connection the connection.
903f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington * @returns #FALSE if not enough memory
904041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
905f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Penningtondbus_bool_t
906041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_set_connection (DBusTransport  *transport,
907041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                                DBusConnection *connection)
908041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
909041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->vtable->connection_set != NULL);
910041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->connection == NULL);
911041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
912041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  transport->connection = connection;
913041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
914fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_ref (transport);
915f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington  if (!(* transport->vtable->connection_set) (transport))
916f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington    transport->connection = NULL;
917fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_unref (transport);
918f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington
919f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington  return transport->connection != NULL;
920041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
921041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
922041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
9238027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Get the socket file descriptor, if any.
9241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington *
9251e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @param transport the transport
9261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @param fd_p pointer to fill in with the descriptor
9271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @returns #TRUE if a descriptor was available
9281e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington */
9291e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtondbus_bool_t
9308027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_transport_get_socket_fd (DBusTransport *transport,
9318027efc97b4bec85f674570f878919cb72456745Havoc Pennington                               int           *fd_p)
9321e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{
9331e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  dbus_bool_t retval;
9341e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9358027efc97b4bec85f674570f878919cb72456745Havoc Pennington  if (transport->vtable->get_socket_fd == NULL)
9361e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    return FALSE;
9371e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9381e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  if (transport->disconnected)
9391e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    return FALSE;
9401e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9411e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  _dbus_transport_ref (transport);
9421e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9438027efc97b4bec85f674570f878919cb72456745Havoc Pennington  retval = (* transport->vtable->get_socket_fd) (transport,
9448027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                                 fd_p);
9451e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  _dbus_transport_unref (transport);
9471e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9481e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  return retval;
9491e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington}
9501e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
9511e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington/**
952041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Performs a single poll()/select() on the transport's file
953041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * descriptors and then reads/writes data as appropriate,
954041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * queueing incoming messages and sending outgoing messages.
955041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This is the backend for _dbus_connection_do_iteration().
956041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * See _dbus_connection_do_iteration() for full details.
957041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
958041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport.
959041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param flags indicates whether to read or write, and whether to block.
960041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param timeout_milliseconds if blocking, timeout or -1 for no timeout.
961041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
962041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
963041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_do_iteration (DBusTransport  *transport,
964041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                              unsigned int    flags,
965041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                              int             timeout_milliseconds)
966041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
967041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  _dbus_assert (transport->vtable->do_iteration != NULL);
968041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
9697265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington  _dbus_verbose ("Transport iteration flags 0x%x timeout %d connected = %d\n",
9707265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington                 flags, timeout_milliseconds, !transport->disconnected);
9717265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington
972041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if ((flags & (DBUS_ITERATION_DO_WRITING |
973041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                DBUS_ITERATION_DO_READING)) == 0)
974041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    return; /* Nothing to do */
975041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
976041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (transport->disconnected)
9770363701c341796278041fb9ea7de80eaaf41479aHavoc Pennington    return;
978ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
979fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_ref (transport);
980041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  (* transport->vtable->do_iteration) (transport, flags,
981041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                                       timeout_milliseconds);
982fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson  _dbus_transport_unref (transport);
983f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
984d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("end\n");
985041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
986041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
987b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t
988b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonrecover_unused_bytes (DBusTransport *transport)
989b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington{
990b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  if (_dbus_auth_needs_decoding (transport->auth))
991b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    {
992b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      DBusString plaintext;
993b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      const DBusString *encoded;
994b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      DBusString *buffer;
995b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      int orig_len;
996b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
997fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington      if (!_dbus_string_init (&plaintext))
998b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        goto nomem;
999b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1000b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_auth_get_unused_bytes (transport->auth,
1001b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                   &encoded);
1002b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1003b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      if (!_dbus_auth_decode_data (transport->auth,
1004b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                   encoded, &plaintext))
1005b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        {
1006b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington          _dbus_string_free (&plaintext);
1007b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington          goto nomem;
1008b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        }
1009b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1010b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_message_loader_get_buffer (transport->loader,
1011b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                       &buffer);
1012b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1013b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      orig_len = _dbus_string_get_length (buffer);
1014b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1015b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      if (!_dbus_string_move (&plaintext, 0, buffer,
1016b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                              orig_len))
1017b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        {
1018b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington          _dbus_string_free (&plaintext);
1019b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington          goto nomem;
1020b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        }
1021b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1022b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_verbose (" %d unused bytes sent to message loader\n",
1023b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                     _dbus_string_get_length (buffer) -
1024b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                     orig_len);
1025b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1026b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_message_loader_return_buffer (transport->loader,
1027b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          buffer,
1028b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          _dbus_string_get_length (buffer) -
1029b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          orig_len);
1030b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1031b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_auth_delete_unused_bytes (transport->auth);
1032b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1033b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_string_free (&plaintext);
1034b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    }
1035b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  else
1036b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    {
1037b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      const DBusString *bytes;
1038b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      DBusString *buffer;
1039b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      int orig_len;
1040b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      dbus_bool_t succeeded;
1041b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1042b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_message_loader_get_buffer (transport->loader,
1043b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                       &buffer);
1044b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1045b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      orig_len = _dbus_string_get_length (buffer);
1046b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1047b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_auth_get_unused_bytes (transport->auth,
1048b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                   &bytes);
1049b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1050b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      succeeded = TRUE;
1051b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      if (!_dbus_string_copy (bytes, 0, buffer, _dbus_string_get_length (buffer)))
1052b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        succeeded = FALSE;
1053b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1054b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_verbose (" %d unused bytes sent to message loader\n",
1055b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                     _dbus_string_get_length (buffer) -
1056b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                     orig_len);
1057b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1058b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      _dbus_message_loader_return_buffer (transport->loader,
1059b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          buffer,
1060b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          _dbus_string_get_length (buffer) -
1061b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington                                          orig_len);
1062b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1063b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      if (succeeded)
1064b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        _dbus_auth_delete_unused_bytes (transport->auth);
1065b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington      else
1066b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington        goto nomem;
1067b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    }
1068b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1069b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  return TRUE;
1070b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1071b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington nomem:
1072b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  _dbus_verbose ("Not enough memory to transfer unused bytes from auth conversation\n");
1073b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  return FALSE;
1074b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington}
1075b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1076502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/**
1077ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Reports our current dispatch status (whether there's buffered
1078ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * data to be queued as messages, or not, or we need memory).
1079ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington *
1080ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param transport the transport
1081ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns current status
1082ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */
1083ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc PenningtonDBusDispatchStatus
1084ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_transport_get_dispatch_status (DBusTransport *transport)
1085ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{
1086bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  if (_dbus_counter_get_size_value (transport->live_messages) >= transport->max_live_messages_size ||
1087bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering      _dbus_counter_get_unix_fd_value (transport->live_messages) >= transport->max_live_messages_unix_fds)
1088ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    return DBUS_DISPATCH_COMPLETE; /* complete for now */
1089ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1090b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  if (!_dbus_transport_get_is_authenticated (transport))
1091b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    {
1092777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      if (_dbus_auth_do_work (transport->auth) ==
1093777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington          DBUS_AUTH_STATE_WAITING_FOR_MEMORY)
1094777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington        return DBUS_DISPATCH_NEED_MEMORY;
1095e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else if (!_dbus_transport_get_is_authenticated (transport))
1096777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington        return DBUS_DISPATCH_COMPLETE;
1097b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington    }
1098777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1099777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!transport->unused_bytes_recovered &&
1100777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      !recover_unused_bytes (transport))
1101777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    return DBUS_DISPATCH_NEED_MEMORY;
1102777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1103777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  transport->unused_bytes_recovered = TRUE;
1104b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
1105ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  if (!_dbus_message_loader_queue_messages (transport->loader))
1106ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    return DBUS_DISPATCH_NEED_MEMORY;
1107ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1108ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  if (_dbus_message_loader_peek_message (transport->loader) != NULL)
1109ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    return DBUS_DISPATCH_DATA_REMAINS;
1110ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  else
1111ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    return DBUS_DISPATCH_COMPLETE;
1112ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington}
1113ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1114ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/**
1115ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Processes data we've read while handling a watch, potentially
1116ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * converting some of it to messages and queueing those messages on
1117ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * the connection.
1118ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington *
1119ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param transport the transport
1120ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns #TRUE if we had enough memory to queue all messages
1121ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */
1122ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Penningtondbus_bool_t
1123ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_transport_queue_messages (DBusTransport *transport)
1124ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{
1125ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  DBusDispatchStatus status;
112651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
1127a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#if 0
112851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("_dbus_transport_queue_messages()\n");
1129a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#endif
1130ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1131ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  /* Queue any messages */
1132ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  while ((status = _dbus_transport_get_dispatch_status (transport)) == DBUS_DISPATCH_DATA_REMAINS)
1133ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    {
1134ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      DBusMessage *message;
1135ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      DBusList *link;
1136ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1137ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      link = _dbus_message_loader_pop_message_link (transport->loader);
1138ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      _dbus_assert (link != NULL);
1139ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1140ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      message = link->data;
1141ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1142ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      _dbus_verbose ("queueing received message %p\n", message);
1143ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1144bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering      if (!_dbus_message_add_counter (message, transport->live_messages))
11454b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington        {
11464b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington          _dbus_message_loader_putback_message_link (transport->loader,
11474b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington                                                     link);
11484b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington          status = DBUS_DISPATCH_NEED_MEMORY;
11494b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington          break;
11504b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington        }
11514b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington      else
11524b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington        {
11534b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington          /* pass ownership of link and message ref to connection */
11544b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington          _dbus_connection_queue_received_message_link (transport->connection,
11554b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington                                                        link);
11564b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington        }
1157ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    }
1158ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1159ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  if (_dbus_message_loader_get_is_corrupted (transport->loader))
1160ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    {
1161ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      _dbus_verbose ("Corrupted message stream, disconnecting\n");
1162ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington      _dbus_transport_disconnect (transport);
1163ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington    }
1164ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1165ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  return status != DBUS_DISPATCH_NEED_MEMORY;
1166ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington}
1167ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
1168ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/**
1169502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * See dbus_connection_set_max_message_size().
1170502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington *
1171502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport
1172502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max size of a single message
1173502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */
1174502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid
1175502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_transport_set_max_message_size (DBusTransport  *transport,
1176502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                                      long            size)
1177502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{
1178502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  _dbus_message_loader_set_max_message_size (transport->loader, size);
1179502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington}
1180502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
1181502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/**
1182bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_message_unix_fds().
1183bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering *
1184bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport
1185bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param n the max number of unix fds of a single message
1186bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */
1187bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringvoid
1188bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_set_max_message_unix_fds (DBusTransport  *transport,
1189bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                                          long            n)
1190bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{
1191bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_message_loader_set_max_message_unix_fds (transport->loader, n);
1192bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering}
1193bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering
1194bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/**
1195502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * See dbus_connection_get_max_message_size().
1196502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington *
1197502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport
1198502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max message size
1199502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */
1200502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong
1201502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_transport_get_max_message_size (DBusTransport  *transport)
1202502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{
1203502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  return _dbus_message_loader_get_max_message_size (transport->loader);
1204502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington}
1205502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
1206502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/**
1207bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_get_max_message_unix_fds().
1208bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering *
1209bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport
1210bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @returns max message unix fds
1211bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */
1212bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlong
1213bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_get_max_message_unix_fds (DBusTransport  *transport)
1214bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{
1215bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  return _dbus_message_loader_get_max_message_unix_fds (transport->loader);
1216bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering}
1217bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering
1218bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/**
12194b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * See dbus_connection_set_max_received_size().
1220502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington *
1221502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport
1222502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max size of all incoming messages
1223502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */
1224502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid
12254b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_transport_set_max_received_size (DBusTransport  *transport,
12264b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington                                       long            size)
1227502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{
1228502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  transport->max_live_messages_size = size;
1229bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_counter_set_notify (transport->live_messages,
1230502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                            transport->max_live_messages_size,
1231bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            transport->max_live_messages_unix_fds,
1232bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            live_messages_notify,
1233502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington                            transport);
1234502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington}
1235502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
1236bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/**
1237bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_received_unix_fds().
1238bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering *
1239bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport
1240bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param n the max unix fds of all incoming messages
1241bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */
1242bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringvoid
1243bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_set_max_received_unix_fds (DBusTransport  *transport,
1244bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                                           long            n)
1245bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{
1246bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  transport->max_live_messages_unix_fds = n;
1247bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  _dbus_counter_set_notify (transport->live_messages,
1248bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            transport->max_live_messages_size,
1249bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            transport->max_live_messages_unix_fds,
1250bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            live_messages_notify,
1251bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering                            transport);
1252bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering}
1253502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
1254502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/**
12554b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * See dbus_connection_get_max_received_size().
1256502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington *
1257502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport
1258502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max bytes for all live messages
1259502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */
1260502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong
12614b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_transport_get_max_received_size (DBusTransport  *transport)
1262502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{
1263502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington  return transport->max_live_messages_size;
1264502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington}
1265502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington
1266b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington/**
1267bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_received_unix_fds().
1268bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering *
1269bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport
1270bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @returns max unix fds for all live messages
1271bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */
1272bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlong
1273bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_get_max_received_unix_fds (DBusTransport  *transport)
1274bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{
1275bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  return transport->max_live_messages_unix_fds;
1276bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering}
1277bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering
1278bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/**
1279b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * See dbus_connection_get_unix_user().
1280b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington *
1281b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param transport the transport
1282b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param uid return location for the user ID
1283b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @returns #TRUE if uid is filled in with a valid user ID
1284b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington */
1285b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtondbus_bool_t
1286b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington_dbus_transport_get_unix_user (DBusTransport *transport,
1287b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                               unsigned long *uid)
1288b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington{
128923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  DBusCredentials *auth_identity;
1290b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
12913ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington  *uid = _DBUS_INT32_MAX; /* better than some root or system user in
12923ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington                           * case of bugs in the caller. Caller should
12933ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington                           * never use this value on purpose, however.
12943ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington                           */
1295b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
1296b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  if (!transport->authenticated)
1297b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington    return FALSE;
1298b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
129923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
1300b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
130123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  if (_dbus_credentials_include (auth_identity,
130223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington                                 DBUS_CREDENTIAL_UNIX_USER_ID))
1303b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington    {
130423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      *uid = _dbus_credentials_get_unix_uid (auth_identity);
1305b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington      return TRUE;
1306b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington    }
1307b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  else
1308b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington    return FALSE;
1309b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington}
1310b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
1311b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington/**
1312c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * See dbus_connection_get_unix_process_id().
1313c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen *
1314c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @param transport the transport
1315c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @param pid return location for the process ID
1316c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @returns #TRUE if uid is filled in with a valid process ID
1317c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen */
1318c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthendbus_bool_t
1319c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen_dbus_transport_get_unix_process_id (DBusTransport *transport,
1320c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen				     unsigned long *pid)
1321c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
132223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  DBusCredentials *auth_identity;
1323c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1324c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  *pid = DBUS_PID_UNSET; /* Caller should never use this value on purpose,
1325c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			  * but we set it to a safe number, INT_MAX,
1326c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			  * just to root out possible bugs in bad callers.
1327c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			  */
1328c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1329c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!transport->authenticated)
1330c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    return FALSE;
1331c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
133223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
1333c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
133423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  if (_dbus_credentials_include (auth_identity,
133523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington                                 DBUS_CREDENTIAL_UNIX_PROCESS_ID))
1336c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
133723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      *pid = _dbus_credentials_get_unix_pid (auth_identity);
1338c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      return TRUE;
1339c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1340c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  else
1341c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    return FALSE;
1342c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1343c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1344c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen/**
1345ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * See dbus_connection_get_adt_audit_session_data().
1346ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters *
1347ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param transport the transport
1348ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param data return location for the ADT audit data
1349ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param data_size return length of audit data
1350ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @returns #TRUE if audit data is filled in with a valid ucred
1351ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters */
1352ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Waltersdbus_bool_t
1353ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters_dbus_transport_get_adt_audit_session_data (DBusTransport      *transport,
1354ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                                            void              **data,
1355ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                                            int                *data_size)
1356ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters{
1357ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  DBusCredentials *auth_identity;
1358ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1359ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  *data = NULL;
1360ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  *data_size = 0;
1361ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1362ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (!transport->authenticated)
1363ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    return FALSE;
1364ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1365ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  auth_identity = _dbus_auth_get_identity (transport->auth);
1366ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1367ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (_dbus_credentials_include (auth_identity,
1368ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                                 DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID))
1369ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    {
1370ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      *data = (void *) _dbus_credentials_get_adt_audit_data (auth_identity);
1371ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      *data_size = _dbus_credentials_get_adt_audit_data_size (auth_identity);
1372ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      return TRUE;
1373ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    }
1374ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  else
1375ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    return FALSE;
1376ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters}
1377ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1378ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters/**
1379b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * See dbus_connection_set_unix_user_function().
1380b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington *
1381b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param transport the transport
1382b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param function the predicate
1383b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param data data to pass to the predicate
1384b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param free_data_function function to free the data
1385b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param old_data the old user data to be freed
1386b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param old_free_data_function old free data function to free it with
1387b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington */
1388b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtonvoid
1389b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington_dbus_transport_set_unix_user_function (DBusTransport             *transport,
1390b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                                        DBusAllowUnixUserFunction  function,
1391b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                                        void                      *data,
1392b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                                        DBusFreeFunction           free_data_function,
1393b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                                        void                     **old_data,
1394b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington                                        DBusFreeFunction          *old_free_data_function)
1395b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington{
1396b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  *old_data = transport->unix_user_data;
1397b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  *old_free_data_function = transport->free_unix_user_data;
1398b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
1399b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->unix_user_function = function;
1400b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->unix_user_data = data;
1401b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  transport->free_unix_user_data = free_data_function;
1402b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington}
1403b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
140444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/**
14057be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * See dbus_connection_get_windows_user().
14067be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *
14077be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param transport the transport
14087be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param windows_sid_p return location for the user ID
14097be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @returns #TRUE if user is available; the returned value may still be #NULL if no memory to copy it
14107be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */
14117be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtondbus_bool_t
14127be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington_dbus_transport_get_windows_user (DBusTransport              *transport,
14137be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                  char                      **windows_sid_p)
14147be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
14157be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  DBusCredentials *auth_identity;
14167be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14177be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  *windows_sid_p = NULL;
14187be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (!transport->authenticated)
14207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    return FALSE;
14217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14227be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  auth_identity = _dbus_auth_get_identity (transport->auth);
14237be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  if (_dbus_credentials_include (auth_identity,
14257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                 DBUS_CREDENTIAL_WINDOWS_SID))
14267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    {
14277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      /* If no memory, we are supposed to return TRUE and set NULL */
14287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      *windows_sid_p = _dbus_strdup (_dbus_credentials_get_windows_sid (auth_identity));
14297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14307be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington      return TRUE;
14317be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    }
14327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  else
14337be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington    return FALSE;
14347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
14357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington/**
14377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * See dbus_connection_set_windows_user_function().
14387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *
14397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param transport the transport
14407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param function the predicate
14417be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param data data to pass to the predicate
14427be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param free_data_function function to free the data
14437be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param old_data the old user data to be freed
14447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param old_free_data_function old free data function to free it with
14457be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */
14467be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14477be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonvoid
14487be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington_dbus_transport_set_windows_user_function (DBusTransport              *transport,
14497be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                           DBusAllowWindowsUserFunction   function,
14507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                           void                       *data,
14517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                           DBusFreeFunction            free_data_function,
14527be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                           void                      **old_data,
14537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                           DBusFreeFunction           *old_free_data_function)
14547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
14557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  *old_data = transport->windows_user_data;
14567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  *old_free_data_function = transport->free_windows_user_data;
14577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->windows_user_function = function;
14597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->windows_user_data = data;
14607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  transport->free_windows_user_data = free_data_function;
14617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
14627be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
14637be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington/**
146444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Sets the SASL authentication mechanisms supported by this transport.
146544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
146644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param transport the transport
146744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param mechanisms the #NULL-terminated array of mechanisms
146844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
146944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns #FALSE if no memory
147044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */
147144ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t
147244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_transport_set_auth_mechanisms (DBusTransport  *transport,
147344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington                                     const char    **mechanisms)
147444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
147544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  return _dbus_auth_set_mechanisms (transport->auth, mechanisms);
147644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington}
147744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
147894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington/**
147994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * See dbus_connection_set_allow_anonymous()
148094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington *
148194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param transport the transport
148294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param value #TRUE to allow anonymous connection
148394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington */
148494125e89b6be74cb20100d5321a98aa6529187a9Havoc Penningtonvoid
148594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington_dbus_transport_set_allow_anonymous (DBusTransport              *transport,
148694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington                                     dbus_bool_t                 value)
148794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington{
148894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington  transport->allow_anonymous = value != FALSE;
148994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington}
149044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
1491041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */
1492