X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fdbus-socket.c;h=728958131db6db045fa7c7a135b232927614eedb;hb=4e6db59202ad2dbbef56a69985643390ffdd57bd;hp=095a0316120c16a7d6fe8546dac5919ecee195bc;hpb=f274ece0f76b5709408821e317e87aef76123db6;p=elogind.git diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c index 095a03161..728958131 100644 --- a/src/core/dbus-socket.c +++ b/src/core/dbus-socket.c @@ -39,6 +39,7 @@ BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \ BUS_EXEC_CONTEXT_INTERFACE \ BUS_KILL_CONTEXT_INTERFACE \ + BUS_UNIT_CGROUP_INTERFACE \ " \n" \ " \n" \ " \n" \ @@ -62,6 +63,7 @@ " \n" \ " \n" \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -97,6 +99,66 @@ const char bus_socket_invalidating_properties[] = static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_socket_append_bind_ipv6_only, socket_address_bind_ipv6_only, SocketAddressBindIPv6Only); static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_socket_append_socket_result, socket_result, SocketResult); +static int bus_socket_append_listen(DBusMessageIter *i, const char *property, void *data) { + + Socket *s = SOCKET(data); + SocketPort *p; + DBusMessageIter array, stru; + + assert(data); + assert(property); + assert(s); + + if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(ss)", &array)) + return log_oom(); + + LIST_FOREACH(port, p, s->ports) { + const char *type = socket_port_type_to_string(p); + char _cleanup_free_ *address = NULL; + const char *a; + + if (!dbus_message_iter_open_container(&array, DBUS_TYPE_STRUCT, NULL, &stru)) + return log_oom(); + + if (!dbus_message_iter_append_basic(&stru, DBUS_TYPE_STRING, &type)) + return log_oom(); + + switch (p->type) { + case SOCKET_SOCKET: { + int r; + + r = socket_address_print(&p->address, &address); + if (r) { + log_error("socket_address_print failed: %s", strerror(-r)); + return r; + } + a = address; + break; + } + + case SOCKET_SPECIAL: + case SOCKET_MQUEUE: + case SOCKET_FIFO: + a = p->path; + break; + + default: + a = type; + } + + if (!dbus_message_iter_append_basic(&stru, DBUS_TYPE_STRING, &a)) + return -ENOMEM; + + if (!dbus_message_iter_close_container(&array, &stru)) + return -ENOMEM; + } + + if (!dbus_message_iter_close_container(i, &array)) + return -ENOMEM; + + return 0; +} + static const BusProperty bus_socket_properties[] = { { "BindIPv6Only", bus_socket_append_bind_ipv6_only, "s", offsetof(Socket, bind_ipv6_only) }, { "Backlog", bus_property_append_unsigned, "u", offsetof(Socket, backlog) }, @@ -122,6 +184,7 @@ static const BusProperty bus_socket_properties[] = { { "Broadcast", bus_property_append_bool, "b", offsetof(Socket, broadcast) }, { "PassCredentials",bus_property_append_bool, "b", offsetof(Socket, pass_cred) }, { "PassSecurity", bus_property_append_bool, "b", offsetof(Socket, pass_sec) }, + { "Listen", bus_socket_append_listen, "a(ss)", 0, }, { "Mark", bus_property_append_int, "i", offsetof(Socket, mark) }, { "MaxConnections", bus_property_append_unsigned, "u", offsetof(Socket, max_connections) }, { "NConnections", bus_property_append_unsigned, "u", offsetof(Socket, n_connections) }, @@ -142,6 +205,7 @@ DBusHandlerResult bus_socket_message_handler(Unit *u, DBusConnection *c, DBusMes { "org.freedesktop.systemd1.Socket", bus_socket_properties, s }, { "org.freedesktop.systemd1.Socket", bus_exec_context_properties, &s->exec_context }, { "org.freedesktop.systemd1.Socket", bus_kill_context_properties, &s->kill_context }, + { "org.freedesktop.systemd1.Socket", bus_unit_properties, u }, { NULL, } };