bus-util.h revision f38857914ab5c9cc55aac05795e1886963a5fd04
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#pragma once
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek/***
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek This file is part of systemd.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Copyright 2013 Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek systemd is free software; you can redistribute it and/or modify it
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek under the terms of the GNU Lesser General Public License as published by
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek the Free Software Foundation; either version 2.1 of the License, or
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek (at your option) any later version.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek systemd is distributed in the hope that it will be useful, but
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek WITHOUT ANY WARRANTY; without even the implied warranty of
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek Lesser General Public License for more details.
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek You should have received a copy of the GNU Lesser General Public License
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek along with systemd; If not, see <http://www.gnu.org/licenses/>.
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering***/
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering#include "sd-event.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "sd-bus.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "hashmap.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "time-util.h"
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#include "util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poetteringtypedef enum BusTransport {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering BUS_TRANSPORT_LOCAL,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering BUS_TRANSPORT_REMOTE,
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering BUS_TRANSPORT_CONTAINER,
74df0fca09b3c31ed19e14ba80f996fdff772417Lennart Poettering _BUS_TRANSPORT_MAX,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering _BUS_TRANSPORT_INVALID = -1
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering} BusTransport;
430f0182b72373145c839dbfe99d2382855cb8f8Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmektypedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
a09561746f15b84da9471b5c4be74e53d19e4f3fLennart Poetteringstruct bus_properties_map {
0dec689b098cf62b948d43dc78bde859665056ecTom Gundersen const char *member;
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering const char *signature;
958b66ea16deddd794b3a52643bd44633e165eadLennart Poettering bus_property_set_t set;
f4f15635ec05293ffcc83a5b39f624bbabbd8fd0Lennart Poettering size_t offset;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering};
958b66ea16deddd794b3a52643bd44633e165eadLennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_map_all_properties(sd_bus *bus,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *destination,
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *path,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const struct bus_properties_map *map,
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek void *userdata);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poetteringint bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringtypedef bool (*check_idle_t)(void *userdata);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poetteringint bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout, check_idle_t check_idle, void *userdata);
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poetteringint bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poetteringint bus_check_peercred(sd_bus *c);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poetteringint bus_verify_polkit(sd_bus_message *call, int capability, const char *action, bool interactive, bool *_challenge, sd_bus_error *e);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
8b43440b7ef4b81c69c31de7ff820dc07a780254Lennart Poetteringint bus_verify_polkit_async(sd_bus_message *call, int capability, const char *action, bool interactive, Hashmap **registry, sd_bus_error *error);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poetteringvoid bus_verify_polkit_async_registry_free(Hashmap *registry);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_open_system_systemd(sd_bus **_bus);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_open_user_systemd(sd_bus **_bus);
26687bf8a907009dedcff79346860ed41511405eOleksii Shevchuk
7f1ad696a273703789b624fe0b209fb63e953016Lennart Poetteringint bus_open_transport(BusTransport transport, const char *host, bool user, sd_bus **bus);
7f1ad696a273703789b624fe0b209fb63e953016Lennart Poetteringint bus_open_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
e150e82097211f09b911c7784a89ef9efed713caMichał Bartoszkiewicz
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_print_property(const char *name, sd_bus_message *property, bool all);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool all);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_usec ((sd_bus_property_get_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_set_usec ((sd_bus_property_set_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringassert_cc(sizeof(int) == sizeof(int32_t));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_int ((sd_bus_property_get_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringassert_cc(sizeof(unsigned) == sizeof(unsigned));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer/* On 64bit machines we can use the default serializer for size_t and
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * friends, otherwise we need to cast this manually */
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#if __SIZEOF_SIZE_T__ == 8
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_size ((sd_bus_property_get_t) NULL)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_property_get_size(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#endif
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#if __SIZEOF_LONG__ == 8
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_long ((sd_bus_property_get_t) NULL)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#else
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_property_get_long(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_property_get_ulong(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#endif
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering/* uid_t and friends on Linux 32 bit. This means we can just use the
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * default serializer for 32bit unsigned, for serializing it, and map
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering * it to NULL here */
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekassert_cc(sizeof(uid_t) == sizeof(uint32_t));
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#define bus_property_get_uid ((sd_bus_property_get_t) NULL)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekassert_cc(sizeof(gid_t) == sizeof(uint32_t));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_gid ((sd_bus_property_get_t) NULL)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekassert_cc(sizeof(pid_t) == sizeof(uint32_t));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_pid ((sd_bus_property_get_t) NULL)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekassert_cc(sizeof(mode_t) == sizeof(uint32_t));
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define bus_property_get_mode ((sd_bus_property_get_t) NULL)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_log_parse_error(int r);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_log_create_error(int r);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmektypedef struct UnitInfo {
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *machine;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *id;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *description;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *load_state;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *active_state;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *sub_state;
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *following;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *unit_path;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek uint32_t job_id;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *job_type;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek const char *job_path;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek} UnitInfo;
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmekint bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringstatic inline void sd_bus_close_unrefp(sd_bus **bus) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (*bus) {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering sd_bus_flush(*bus);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering sd_bus_close(*bus);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering sd_bus_unref(*bus);
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek }
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering}
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
348ced909724a1331b85d57aede80a102a00e428Zbigniew Jędrzejewski-SzmekDEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_slot*, sd_bus_slot_unref);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
348ced909724a1331b85d57aede80a102a00e428Zbigniew Jędrzejewski-SzmekDEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart PoetteringDEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_track*, sd_bus_track_unref);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
d025f1e4dca8fc1436aff76f9e6185fe3e728daaZbigniew Jędrzejewski-Szmek#define _cleanup_bus_close_unref_ _cleanup_(sd_bus_close_unrefp)
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek#define _cleanup_bus_slot_unref_ _cleanup_(sd_bus_slot_unrefp)
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek#define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek#define _cleanup_bus_track_unref_ _cleanup_(sd_bus_slot_unrefp)
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek#define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
da2e288bbc4d8cebaa1d38a80f6eec8cde3e9cceLennart Poettering#define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type) \
da2e288bbc4d8cebaa1d38a80f6eec8cde3e9cceLennart Poettering int function(sd_bus *bus, \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *path, \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *interface, \
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek const char *property, \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering sd_bus_message *reply, \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering void *userdata, \
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek sd_bus_error *error) { \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering const char *value; \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering type *field = userdata; \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering int r; \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(bus); \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(reply); \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering assert(field); \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering value = strempty(name##_to_string(*field)); \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering r = sd_bus_message_append_basic(reply, 's', value); \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering if (r < 0) \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return r; \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering return 1; \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering } \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering struct __useless_struct_to_allow_trailing_semicolon__
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering#define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poetteringint bus_append_unit_property_assignment(sd_bus_message *m, const char *assignment);
670b110c3b59dfa335ac43065b2038400d1d04a9Zbigniew Jędrzejewski-Szmek