2013-03-19 20:03:16 +01:00
|
|
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/***
|
|
|
|
This file is part of systemd.
|
|
|
|
|
|
|
|
Copyright 2013 Lennart Poettering
|
|
|
|
|
|
|
|
systemd is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
systemd is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <byteswap.h>
|
|
|
|
|
|
|
|
#include "macro.h"
|
|
|
|
#include "sd-bus.h"
|
|
|
|
|
|
|
|
struct bus_container {
|
|
|
|
char enclosing;
|
|
|
|
|
|
|
|
char *signature;
|
|
|
|
unsigned index;
|
|
|
|
|
|
|
|
uint32_t *array_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
_packed_ struct bus_header {
|
|
|
|
uint8_t endian;
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t flags;
|
|
|
|
uint8_t version;
|
|
|
|
uint32_t body_size;
|
|
|
|
uint32_t serial;
|
|
|
|
uint32_t fields_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct sd_bus_message {
|
|
|
|
unsigned n_ref;
|
|
|
|
|
|
|
|
uint32_t reply_serial;
|
|
|
|
|
|
|
|
const char *path;
|
|
|
|
const char *interface;
|
|
|
|
const char *member;
|
|
|
|
const char *destination;
|
|
|
|
const char *sender;
|
|
|
|
const char *signature;
|
|
|
|
|
|
|
|
sd_bus_error error;
|
|
|
|
|
|
|
|
uid_t uid;
|
|
|
|
gid_t gid;
|
|
|
|
pid_t pid;
|
|
|
|
pid_t tid;
|
|
|
|
|
|
|
|
bool sealed:1;
|
|
|
|
bool uid_valid:1;
|
|
|
|
bool gid_valid:1;
|
|
|
|
bool free_header:1;
|
|
|
|
bool free_fields:1;
|
|
|
|
bool free_body:1;
|
2013-03-19 20:16:27 +01:00
|
|
|
bool dont_send:1;
|
2013-03-19 20:03:16 +01:00
|
|
|
|
|
|
|
struct bus_header *header;
|
|
|
|
void *fields;
|
|
|
|
void *body;
|
|
|
|
|
|
|
|
uint32_t n_fds;
|
|
|
|
int *fds;
|
|
|
|
|
|
|
|
struct bus_container root_container, *sub_containers;
|
|
|
|
unsigned n_containers;
|
|
|
|
|
|
|
|
struct iovec iovec[4];
|
|
|
|
unsigned n_iovec;
|
|
|
|
};
|
|
|
|
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
|
|
#define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_BIG_ENDIAN)
|
|
|
|
#else
|
|
|
|
#define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_LITTLE_ENDIAN)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static inline uint32_t BUS_MESSAGE_BSWAP(sd_bus_message *m, uint32_t u) {
|
|
|
|
return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t BUS_MESSAGE_SERIAL(sd_bus_message *m) {
|
|
|
|
return BUS_MESSAGE_BSWAP(m, m->header->serial);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t BUS_MESSAGE_BODY_SIZE(sd_bus_message *m) {
|
|
|
|
return BUS_MESSAGE_BSWAP(m, m->header->body_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t BUS_MESSAGE_FIELDS_SIZE(sd_bus_message *m) {
|
|
|
|
return BUS_MESSAGE_BSWAP(m, m->header->fields_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void bus_message_unrefp(sd_bus_message **m) {
|
|
|
|
sd_bus_message_unref(*m);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define _cleanup_bus_message_unref_ __attribute__((cleanup(bus_message_unrefp)))
|
|
|
|
|
|
|
|
int message_parse(sd_bus_message *m);
|
|
|
|
int message_seal(sd_bus_message *m, uint64_t serial);
|
|
|
|
void message_dump(sd_bus_message *m);
|
|
|
|
int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
|