1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* dbus-server-unix.c Server implementation for Unix network protocols.
3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
4961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington * Copyright (C) 2002, 2003, 2004  Red Hat Inc.
5041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
7dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering *
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.
17dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering *
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-internals.h"
26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-server-unix.h"
278027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-server-socket.h"
284299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat#include "dbus-server-launchd.h"
29041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-transport-unix.h"
30041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-connection-internal.h"
318027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-sysdeps-unix.h"
321d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington#include "dbus-string.h"
33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
34041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusServerUnix DBusServer implementations for UNIX
36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @ingroup  DBusInternals
37041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @brief Implementation details of DBusServer on UNIX
38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{
40041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
4289e6dfd29cfbdb92f15e8fb2bde76d94a4c5a7b3Alexander Larsson/**
438027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Tries to interpret the address entry in a platform-specific
448027efc97b4bec85f674570f878919cb72456745Havoc Pennington * way, creating a platform-specific server type if appropriate.
458027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Sets error if the result is not OK.
46dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering *
478027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param entry an address entry
4815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @param server_p location to store a new DBusServer, or #NULL on failure.
498027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param error location to store rationale for failure on bad address
508027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the outcome
51dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering *
5289e6dfd29cfbdb92f15e8fb2bde76d94a4c5a7b3Alexander Larsson */
538027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServerListenResult
548027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_listen_platform_specific (DBusAddressEntry *entry,
558027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                       DBusServer      **server_p,
568027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                       DBusError        *error)
57041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
588027efc97b4bec85f674570f878919cb72456745Havoc Pennington  const char *method;
59f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
608027efc97b4bec85f674570f878919cb72456745Havoc Pennington  *server_p = NULL;
61dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
628027efc97b4bec85f674570f878919cb72456745Havoc Pennington  method = dbus_address_entry_get_method (entry);
63f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
648027efc97b4bec85f674570f878919cb72456745Havoc Pennington  if (strcmp (method, "unix") == 0)
65041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    {
668027efc97b4bec85f674570f878919cb72456745Havoc Pennington      const char *path = dbus_address_entry_get_value (entry, "path");
678027efc97b4bec85f674570f878919cb72456745Havoc Pennington      const char *tmpdir = dbus_address_entry_get_value (entry, "tmpdir");
688027efc97b4bec85f674570f878919cb72456745Havoc Pennington      const char *abstract = dbus_address_entry_get_value (entry, "abstract");
69dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
708027efc97b4bec85f674570f878919cb72456745Havoc Pennington      if (path == NULL && tmpdir == NULL && abstract == NULL)
718027efc97b4bec85f674570f878919cb72456745Havoc Pennington        {
72fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          _dbus_set_bad_address(error, "unix",
73fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                "path or tmpdir or abstract",
74fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                NULL);
758027efc97b4bec85f674570f878919cb72456745Havoc Pennington          return DBUS_SERVER_LISTEN_BAD_ADDRESS;
768027efc97b4bec85f674570f878919cb72456745Havoc Pennington        }
77041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
788027efc97b4bec85f674570f878919cb72456745Havoc Pennington      if ((path && tmpdir) ||
798027efc97b4bec85f674570f878919cb72456745Havoc Pennington          (path && abstract) ||
808027efc97b4bec85f674570f878919cb72456745Havoc Pennington          (tmpdir && abstract))
818027efc97b4bec85f674570f878919cb72456745Havoc Pennington        {
82fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington          _dbus_set_bad_address(error, NULL, NULL,
83fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                "cannot specify two of \"path\" and \"tmpdir\" and \"abstract\" at the same time");
848027efc97b4bec85f674570f878919cb72456745Havoc Pennington          return DBUS_SERVER_LISTEN_BAD_ADDRESS;
858027efc97b4bec85f674570f878919cb72456745Havoc Pennington        }
86041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
878027efc97b4bec85f674570f878919cb72456745Havoc Pennington      if (tmpdir != NULL)
88041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington        {
898027efc97b4bec85f674570f878919cb72456745Havoc Pennington          DBusString full_path;
908027efc97b4bec85f674570f878919cb72456745Havoc Pennington          DBusString filename;
91dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
928027efc97b4bec85f674570f878919cb72456745Havoc Pennington          if (!_dbus_string_init (&full_path))
938027efc97b4bec85f674570f878919cb72456745Havoc Pennington            {
948027efc97b4bec85f674570f878919cb72456745Havoc Pennington              dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
958027efc97b4bec85f674570f878919cb72456745Havoc Pennington              return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
968027efc97b4bec85f674570f878919cb72456745Havoc Pennington            }
97dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
988027efc97b4bec85f674570f878919cb72456745Havoc Pennington          if (!_dbus_string_init (&filename))
998027efc97b4bec85f674570f878919cb72456745Havoc Pennington            {
1008027efc97b4bec85f674570f878919cb72456745Havoc Pennington              _dbus_string_free (&full_path);
1018027efc97b4bec85f674570f878919cb72456745Havoc Pennington              dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1028027efc97b4bec85f674570f878919cb72456745Havoc Pennington              return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
1038027efc97b4bec85f674570f878919cb72456745Havoc Pennington            }
104dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
1058027efc97b4bec85f674570f878919cb72456745Havoc Pennington          if (!_dbus_string_append (&filename,
1068027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                    "dbus-") ||
1078027efc97b4bec85f674570f878919cb72456745Havoc Pennington              !_dbus_generate_random_ascii (&filename, 10) ||
1088027efc97b4bec85f674570f878919cb72456745Havoc Pennington              !_dbus_string_append (&full_path, tmpdir) ||
1098027efc97b4bec85f674570f878919cb72456745Havoc Pennington              !_dbus_concat_dir_and_file (&full_path, &filename))
1108027efc97b4bec85f674570f878919cb72456745Havoc Pennington            {
1118027efc97b4bec85f674570f878919cb72456745Havoc Pennington              _dbus_string_free (&full_path);
1128027efc97b4bec85f674570f878919cb72456745Havoc Pennington              _dbus_string_free (&filename);
1138027efc97b4bec85f674570f878919cb72456745Havoc Pennington              dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1148027efc97b4bec85f674570f878919cb72456745Havoc Pennington              return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
1158027efc97b4bec85f674570f878919cb72456745Havoc Pennington            }
116dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
1178027efc97b4bec85f674570f878919cb72456745Havoc Pennington          /* Always use abstract namespace if possible with tmpdir */
118dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
1198027efc97b4bec85f674570f878919cb72456745Havoc Pennington          *server_p =
1208027efc97b4bec85f674570f878919cb72456745Havoc Pennington            _dbus_server_new_for_domain_socket (_dbus_string_get_const_data (&full_path),
1218027efc97b4bec85f674570f878919cb72456745Havoc Pennington#ifdef HAVE_ABSTRACT_SOCKETS
1228027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                                TRUE,
1238027efc97b4bec85f674570f878919cb72456745Havoc Pennington#else
1248027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                                FALSE,
1258027efc97b4bec85f674570f878919cb72456745Havoc Pennington#endif
1268027efc97b4bec85f674570f878919cb72456745Havoc Pennington                                                error);
1278027efc97b4bec85f674570f878919cb72456745Havoc Pennington
1288027efc97b4bec85f674570f878919cb72456745Havoc Pennington          _dbus_string_free (&full_path);
1298027efc97b4bec85f674570f878919cb72456745Havoc Pennington          _dbus_string_free (&filename);
1308027efc97b4bec85f674570f878919cb72456745Havoc Pennington        }
1318027efc97b4bec85f674570f878919cb72456745Havoc Pennington      else
1328027efc97b4bec85f674570f878919cb72456745Havoc Pennington        {
1338027efc97b4bec85f674570f878919cb72456745Havoc Pennington          if (path)
1348027efc97b4bec85f674570f878919cb72456745Havoc Pennington            *server_p = _dbus_server_new_for_domain_socket (path, FALSE, error);
135041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington          else
1368027efc97b4bec85f674570f878919cb72456745Havoc Pennington            *server_p = _dbus_server_new_for_domain_socket (abstract, TRUE, error);
1378027efc97b4bec85f674570f878919cb72456745Havoc Pennington        }
138f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington
1398027efc97b4bec85f674570f878919cb72456745Havoc Pennington      if (*server_p != NULL)
1408027efc97b4bec85f674570f878919cb72456745Havoc Pennington        {
1418027efc97b4bec85f674570f878919cb72456745Havoc Pennington          _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1428027efc97b4bec85f674570f878919cb72456745Havoc Pennington          return DBUS_SERVER_LISTEN_OK;
143041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington        }
144041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington      else
145041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington        {
1468027efc97b4bec85f674570f878919cb72456745Havoc Pennington          _DBUS_ASSERT_ERROR_IS_SET(error);
1478027efc97b4bec85f674570f878919cb72456745Havoc Pennington          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
148041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington        }
149041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    }
150dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering  else if (strcmp (method, "systemd") == 0)
151dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering    {
152dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      int n, *fds;
153dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      DBusString address;
154dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
155dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      n = _dbus_listen_systemd_sockets (&fds, error);
156dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      if (n < 0)
157dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering        {
158dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          _DBUS_ASSERT_ERROR_IS_SET (error);
159dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
160dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering        }
161dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
162dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      _dbus_string_init_const (&address, "systemd:");
163dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
164dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      *server_p = _dbus_server_new_for_socket (fds, n, &address, NULL);
165dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      if (*server_p == NULL)
166dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering        {
167dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          int i;
168dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
169dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          for (i = 0; i < n; i++)
170dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering            {
171dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering              _dbus_close_socket (fds[i], NULL);
172dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering            }
173dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          dbus_free (fds);
174dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
175dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
176dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
177dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering        }
178dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
179dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      dbus_free (fds);
180dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
181dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering      return DBUS_SERVER_LISTEN_OK;
1824299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat	}
1834299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat#ifdef DBUS_ENABLE_LAUNCHD
1844299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  else if (strcmp (method, "launchd") == 0)
1854299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1864299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      const char *launchd_env_var = dbus_address_entry_get_value (entry, "env");
1874299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (launchd_env_var == NULL)
1884299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        {
1894299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          _dbus_set_bad_address (error, "launchd", "env", NULL);
1904299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
1914299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        }
1924299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      *server_p = _dbus_server_new_for_launchd (launchd_env_var, error);
1934299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1944299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (*server_p != NULL)
1954299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        {
1964299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1974299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          return DBUS_SERVER_LISTEN_OK;
1984299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        }
1994299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      else
2004299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        {
2014299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          _DBUS_ASSERT_ERROR_IS_SET(error);
2024299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
2034299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        }
204dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering    }
2054299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat#endif
2068027efc97b4bec85f674570f878919cb72456745Havoc Pennington  else
207041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    {
2088027efc97b4bec85f674570f878919cb72456745Havoc Pennington      /* If we don't handle the method, we return NULL with the
2098027efc97b4bec85f674570f878919cb72456745Havoc Pennington       * error unset
2108027efc97b4bec85f674570f878919cb72456745Havoc Pennington       */
2118027efc97b4bec85f674570f878919cb72456745Havoc Pennington      _DBUS_ASSERT_ERROR_IS_CLEAR(error);
2128027efc97b4bec85f674570f878919cb72456745Havoc Pennington      return DBUS_SERVER_LISTEN_NOT_HANDLED;
213041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    }
214041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
215041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
216041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
217041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Creates a new server listening on the given Unix domain socket.
218041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
219041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param path the path for the domain socket.
220a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington * @param abstract #TRUE to use abstract socket namespace
221ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error location to store reason for failure.
222041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns the new server, or #NULL on failure.
223041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
224041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusServer*
225041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_server_new_for_domain_socket (const char     *path,
226a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington                                    dbus_bool_t     abstract,
227ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington                                    DBusError      *error)
228041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
229041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  DBusServer *server;
230041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  int listen_fd;
23129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusString address;
2326d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington  char *path_copy;
233aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington  DBusString path_str;
234dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
235ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
23629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
237fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&address))
23829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
23929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
24029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return NULL;
24129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
24229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
243aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington  _dbus_string_init_const (&path_str, path);
244a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington  if ((abstract &&
245a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington       !_dbus_string_append (&address, "unix:abstract=")) ||
246a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington      (!abstract &&
247a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington       !_dbus_string_append (&address, "unix:path=")) ||
248aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington      !_dbus_address_append_escaped (&address, &path_str))
24929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
25029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2516d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington      goto failed_0;
2526d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington    }
2536d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington
2544299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (abstract)
2556d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington    {
2564299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      path_copy = NULL;
2574299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
2584299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  else
2594299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
2604299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      path_copy = _dbus_strdup (path);
2614299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (path_copy == NULL)
2624299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        {
2634299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2644299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat          goto failed_0;
2654299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        }
26629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
267dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
268a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington  listen_fd = _dbus_listen_unix_socket (path, abstract, error);
26989318bbeb4076d8d9de9831d69621fc1411760d3Lennart Poettering
270041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (listen_fd < 0)
27129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
2726d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
2736d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington      goto failed_1;
27429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
275dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
2765e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld  server = _dbus_server_new_for_socket (&listen_fd, 1, &address, 0);
277041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  if (server == NULL)
278041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    {
279ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington      dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2806d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington      goto failed_2;
281041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    }
282041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
2834299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (path_copy != NULL)
2844299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    _dbus_server_socket_own_filename(server, path_copy);
285dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
28629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  _dbus_string_free (&address);
287dd31130a971593b5e20a1c4cb04f93c2aae90c84Lennart Poettering
288041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  return server;
2896d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington
2906d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington failed_2:
29108079a5bdedd6ec91cda413983e4bd3b6ee0252dHavoc Pennington  _dbus_close_socket (listen_fd, NULL);
2926d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington failed_1:
2936d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington  dbus_free (path_copy);
2946d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington failed_0:
2956d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington  _dbus_string_free (&address);
2966d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington
2976d54407dbb089dd0b0d8d79189b029c4d82bae81Havoc Pennington  return NULL;
298041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
299041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
300041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */
301