bus-message.h revision eccd47c5beb72211ce33c9a33a1bb36366d43e22
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen#pragma once
551b849ce88d596dc52dda2f78229a932b339c78Lubos Kosco
551b849ce88d596dc52dda2f78229a932b339c78Lubos Kosco/***
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen This file is part of systemd.
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye Copyright 2013 Lennart Poettering
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye systemd is free software; you can redistribute it and/or modify it
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye under the terms of the GNU Lesser General Public License as published by
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye the Free Software Foundation; either version 2.1 of the License, or
bcae302a5f4b516d2f3c05f657df054e1a0efde7Knut Anders Hatlen (at your option) any later version.
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
98774b0b90e4da0f3f2c5e4856bcbbf366ed0fe0Knut Anders Hatlen systemd is distributed in the hope that it will be useful, but
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye WITHOUT ANY WARRANTY; without even the implied warranty of
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye Lesser General Public License for more details.
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
afb218f076cae538126a5f931299a82a114a075aKnut Anders Hatlen You should have received a copy of the GNU Lesser General Public License
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye along with systemd; If not, see <http://www.gnu.org/licenses/>.
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye***/
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include <stdbool.h>
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include <byteswap.h>
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include <sys/socket.h>
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#include "macro.h"
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include "sd-bus.h"
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include "time-util.h"
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen#include "bus-creds.h"
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye#include "bus-protocol.h"
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
2ee41fb5c7467f453a1282e3afdfacdd4aa4e6b8Trond Norbyestruct bus_container {
2ee41fb5c7467f453a1282e3afdfacdd4aa4e6b8Trond Norbye char enclosing;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool need_offsets:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye /* Indexes into the signature string */
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye unsigned index, saved_index;
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Berg char *signature;
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Berg
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye size_t before, begin, end;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye /* dbus1: pointer to the array size value, if this is a value */
9661674ed58ba62a40e43d1a4b38d5e77c3c6545Knut Anders Hatlen uint32_t *array_size;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye /* gvariant: list of offsets to end of children if this is struct/dict entry/array */
2ee41fb5c7467f453a1282e3afdfacdd4aa4e6b8Trond Norbye size_t *offsets, n_offsets, offsets_allocated, offset_index;
2ee41fb5c7467f453a1282e3afdfacdd4aa4e6b8Trond Norbye size_t item_size;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye char *peeked_signature;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye};
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Berg
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Bergstruct bus_body_part {
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Berg struct bus_body_part *next;
ca37bb3c4127b35d333203398bd983ee730d9da5Jan S Berg void *data;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye void *mmap_begin;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye size_t size;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye size_t mapped;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye size_t allocated;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye uint64_t memfd_offset;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye int memfd;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool free_this:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool munmap_this:1;
4bb936310d8f131aa850821e9254ac14242c7f95Knut Anders Hatlen bool sealed:1;
4bb936310d8f131aa850821e9254ac14242c7f95Knut Anders Hatlen bool is_zero:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye};
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbyestruct sd_bus_message {
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye unsigned n_ref;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye sd_bus *bus;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye uint64_t reply_cookie;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye const char *path;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye const char *interface;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye const char *member;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye const char *destination;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye const char *sender;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye sd_bus_error error;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye sd_bus_creds creds;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye usec_t monotonic;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye usec_t realtime;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye uint64_t seqnum;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye int64_t priority;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye uint64_t verify_destination_id;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool sealed:1;
8d5c49b3d8edaa0069e4f802cf8bd70af9994c35Knut Anders Hatlen bool dont_send:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool allow_fds:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool free_header:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool free_kdbus:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool free_fds:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool release_kdbus:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye bool poisoned:1;
a1318a82916028f363b3c5b52e7fd7256b632497Trond Norbye
/* The first and last bytes of the message */
struct bus_header *header;
void *footer;
/* How many bytes are accessible in the above pointers */
size_t header_accessible;
size_t footer_accessible;
size_t fields_size;
size_t body_size;
size_t user_body_size;
struct bus_body_part body;
struct bus_body_part *body_end;
unsigned n_body_parts;
size_t rindex;
struct bus_body_part *cached_rindex_part;
size_t cached_rindex_part_begin;
uint32_t n_fds;
int *fds;
struct bus_container root_container, *containers;
size_t n_containers;
size_t containers_allocated;
struct iovec *iovec;
struct iovec iovec_fixed[2];
unsigned n_iovec;
struct kdbus_msg *kdbus;
char *peeked_signature;
/* If set replies to this message must carry the signature
* specified here to successfully seal. This is initialized
* from the vtable data */
const char *enforced_reply_signature;
usec_t timeout;
char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
char *destination_ptr;
size_t header_offsets[_BUS_MESSAGE_HEADER_MAX];
unsigned n_header_offsets;
};
static inline bool BUS_MESSAGE_NEED_BSWAP(sd_bus_message *m) {
return m->header->endian != BUS_NATIVE_ENDIAN;
}
static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message *m, uint16_t u) {
return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_16(u) : u;
}
static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message *m, uint32_t u) {
return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
}
static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message *m, uint64_t u) {
return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_64(u) : u;
}
static inline uint64_t BUS_MESSAGE_COOKIE(sd_bus_message *m) {
if (m->header->version == 2)
return BUS_MESSAGE_BSWAP64(m, m->header->dbus2.cookie);
return BUS_MESSAGE_BSWAP32(m, m->header->dbus1.serial);
}
static inline size_t BUS_MESSAGE_SIZE(sd_bus_message *m) {
return
sizeof(struct bus_header) +
ALIGN8(m->fields_size) +
m->body_size;
}
static inline size_t BUS_MESSAGE_BODY_BEGIN(sd_bus_message *m) {
return
sizeof(struct bus_header) +
ALIGN8(m->fields_size);
}
static inline void* BUS_MESSAGE_FIELDS(sd_bus_message *m) {
return (uint8_t*) m->header + sizeof(struct bus_header);
}
static inline bool BUS_MESSAGE_IS_GVARIANT(sd_bus_message *m) {
return m->header->version == 2;
}
int bus_message_seal(sd_bus_message *m, uint64_t serial, usec_t timeout);
int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
int bus_message_from_header(
sd_bus *bus,
void *header,
size_t header_accessible,
void *footer,
size_t footer_accessible,
size_t message_size,
int *fds,
unsigned n_fds,
const char *label,
size_t extra,
sd_bus_message **ret);
int bus_message_from_malloc(
sd_bus *bus,
void *buffer,
size_t length,
int *fds,
unsigned n_fds,
const char *label,
sd_bus_message **ret);
int bus_message_get_arg(sd_bus_message *m, unsigned i, const char **str);
int bus_message_get_arg_strv(sd_bus_message *m, unsigned i, char ***strv);
int bus_message_append_ap(sd_bus_message *m, const char *types, va_list ap);
int bus_message_parse_fields(sd_bus_message *m);
struct bus_body_part *message_append_part(sd_bus_message *m);
#define MESSAGE_FOREACH_PART(part, i, m) \
for ((i) = 0, (part) = &(m)->body; (i) < (m)->n_body_parts; (i)++, (part) = (part)->next)
int bus_body_part_map(struct bus_body_part *part);
void bus_body_part_unmap(struct bus_body_part *part);
int bus_message_to_errno(sd_bus_message *m);
int bus_message_new_synthetic_error(sd_bus *bus, uint64_t serial, const sd_bus_error *e, sd_bus_message **m);
int bus_message_remarshal(sd_bus *bus, sd_bus_message **m);
int bus_message_append_sender(sd_bus_message *m, const char *sender);
void bus_message_set_sender_driver(sd_bus *bus, sd_bus_message *m);
void bus_message_set_sender_local(sd_bus *bus, sd_bus_message *m);