bus-control.c revision f3c0588651927ebac691130aa861b878fa22e527
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering This file is part of systemd.
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering Copyright 2013 Lennart Poettering
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering systemd is free software; you can redistribute it and/or modify it
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering under the terms of the GNU Lesser General Public License as published by
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering (at your option) any later version.
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering systemd is distributed in the hope that it will be useful, but
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering Lesser General Public License for more details.
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering You should have received a copy of the GNU Lesser General Public License
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering_public_ int sd_bus_get_unique_name(sd_bus *bus, const char **unique) {
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering assert_return(!bus_pid_changed(bus), -ECHILD);
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poetteringstatic int bus_request_name_kernel(sd_bus *bus, const char *name, uint64_t flags) {
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering size = offsetof(struct kdbus_cmd_name, items) + KDBUS_ITEM_SIZE(l);
872a590ef83b23a65071242a8082d25d5efa6db6Lennart Poettering kdbus_translate_request_name_flags(flags, (uint64_t *) &n->flags);
872a590ef83b23a65071242a8082d25d5efa6db6Lennart Poettering n->items[0].size = KDBUS_ITEM_HEADER_SIZE + l;
#ifdef HAVE_VALGRIND_MEMCHECK_H
return -errno;
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
name,
param);
return -EALREADY;
return -EEXIST;
return -EIO;
assert_return(!(flags & ~(SD_BUS_NAME_ALLOW_REPLACEMENT|SD_BUS_NAME_REPLACE_EXISTING|SD_BUS_NAME_QUEUE)), -EINVAL);
return -ENOTCONN;
struct kdbus_cmd_name *n;
#ifdef HAVE_VALGRIND_MEMCHECK_H
return -errno;
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
name);
return -ESRCH;
return -EADDRINUSE;
return -EINVAL;
return -ENOTCONN;
return -errno;
return -errno;
r = -ENOMEM;
goto fail;
r = strv_consume(x, n);
goto fail;
r = -ENOMEM;
goto fail;
fail:
if (acquired) {
if (activatable) {
*activatable = y;
y = NULL;
if (acquired) {
*acquired = x;
x = NULL;
if (acquired) {
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
NULL);
if (activatable) {
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
NULL);
*activatable = y;
y = NULL;
if (acquired) {
*acquired = x;
x = NULL;
return -ENOTCONN;
static int bus_populate_creds_from_items(
sd_bus_creds *c) {
uint64_t m;
case KDBUS_ITEM_PIDS:
case KDBUS_ITEM_CREDS:
case KDBUS_ITEM_PID_COMM:
case KDBUS_ITEM_TID_COMM:
case KDBUS_ITEM_EXE:
case KDBUS_ITEM_CMDLINE:
if (!c->cmdline)
return -ENOMEM;
case KDBUS_ITEM_CGROUP:
c->mask |= m;
case KDBUS_ITEM_CAPS:
if (!c->capability)
return -ENOMEM;
c->mask |= m;
case KDBUS_ITEM_SECLABEL:
case KDBUS_ITEM_AUDIT:
case KDBUS_ITEM_OWNED_NAME:
case KDBUS_ITEM_AUXGROUPS:
size_t i, n;
uid_t *u;
return -ENOMEM;
c->supplementary_gids = u;
c->n_supplementary_gids = n;
static int bus_get_name_creds_kdbus(
const char *name,
SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID|
SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS|
return -errno;
r = -ENXIO;
r = -ESRCH;
goto fail;
c = bus_creds_new();
r = -ENOMEM;
goto fail;
r = -ENOMEM;
goto fail;
goto fail;
goto fail;
if (creds) {
*creds = c;
c = NULL;
fail:
static int bus_get_name_creds_dbus1(
const char *name,
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
name);
if (mask != 0) {
c = bus_creds_new();
return -ENOMEM;
if (!c->unique_name)
return -ENOMEM;
SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID|
SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS|
uint32_t u;
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
pid = u;
c->pid = u;
uint32_t u;
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
&reply,
c->uid = u;
const void *p = NULL;
r = sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
&error,
&reply,
if (!c->label)
return -ENOMEM;
if (creds) {
*creds = c;
c = NULL;
const char *name,
return -ENOTCONN;
return -ENOTCONN;
return -ENODATA;
c = bus_creds_new();
return -ENOMEM;
if (!c->label)
return -ENOMEM;
SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID|
SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS|
return -errno;
*ret = c;
c = NULL;
const char *name,
const char *old_owner,
const char *new_owner) {
if (name) {
if (is_name_id < 0)
if (is_name_id <= 0) {
struct kdbus_cmd_match *m;
if (name)
return -errno;
return -errno;
return -errno;
if (is_name_id != 0) {
struct kdbus_cmd_match *m;
sizeof(struct kdbus_notify_id_change));
sizeof(struct kdbus_notify_id_change);
return -errno;
return -errno;
unsigned n_components,
struct kdbus_cmd_match *m;
bool using_bloom = false;
bool matches_name_change = true;
for (i = 0; i < n_components; i++) {
switch (c->type) {
case BUS_MATCH_SENDER:
matches_name_change = false;
case BUS_MATCH_MESSAGE_TYPE:
matches_name_change = false;
bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "message-type", bus_message_type_to_string(c->value_u8));
using_bloom = true;
case BUS_MATCH_INTERFACE:
matches_name_change = false;
using_bloom = true;
case BUS_MATCH_MEMBER:
matches_name_change = false;
using_bloom = true;
case BUS_MATCH_PATH:
matches_name_change = false;
using_bloom = true;
case BUS_MATCH_PATH_NAMESPACE:
using_bloom = true;
using_bloom = true;
using_bloom = true;
using_bloom = true;
case BUS_MATCH_DESTINATION:
case BUS_MATCH_ROOT:
case BUS_MATCH_VALUE:
case BUS_MATCH_LEAF:
case _BUS_MATCH_NODE_TYPE_MAX:
if (using_bloom)
if (using_bloom) {
if (sender) {
return -errno;
if (matches_name_change) {
static int bus_add_match_internal_dbus1(
const char *match) {
return sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
NULL,
const char *match,
unsigned n_components,
struct kdbus_cmd_match m;
zero(m);
return -errno;
static int bus_remove_match_internal_dbus1(
const char *match) {
return sd_bus_call_method(
bus,
"/org/freedesktop/DBus",
NULL,
NULL,
const char *match,
const char *mid;
return -ENOTCONN;
bus,
name,
r = sd_bus_message_set_auto_start(m, false);