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