chiark / gitweb /
sd-bus,sd-event: unify error handling of object descriptions
[elogind.git] / src / libsystemd / sd-bus / bus-kernel.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2013 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <stdbool.h>
25
26 #include "busname.h"
27 #include "bus-endpoint.h"
28 #include "sd-bus.h"
29
30 #define KDBUS_ITEM_NEXT(item) \
31         (typeof(item))(((uint8_t *)item) + ALIGN8((item)->size))
32
33 #define KDBUS_ITEM_FOREACH(part, head, first)                           \
34         for (part = (head)->first;                                      \
35              ((uint8_t *)(part) < (uint8_t *)(head) + (head)->size) &&  \
36                 ((uint8_t *) part >= (uint8_t *) head);                 \
37              part = KDBUS_ITEM_NEXT(part))
38
39 #define KDBUS_ITEM_HEADER_SIZE offsetof(struct kdbus_item, data)
40 #define KDBUS_ITEM_SIZE(s) ALIGN8((s) + KDBUS_ITEM_HEADER_SIZE)
41
42 #define MEMFD_CACHE_MAX 32
43
44 /* When we cache a memfd block for reuse, we will truncate blocks
45  * longer than this in order not to keep too much data around. */
46 #define MEMFD_CACHE_ITEM_SIZE_MAX (128*1024)
47
48 /* This determines at which minimum size we prefer sending memfds over
49  * sending vectors */
50 #define MEMFD_MIN_SIZE (512*1024)
51
52 /* The size of the per-connection memory pool that we set up and where
53  * the kernel places our incoming messages */
54 #define KDBUS_POOL_SIZE (16*1024*1024)
55
56 struct memfd_cache {
57         int fd;
58         void *address;
59         size_t mapped;
60         size_t allocated;
61 };
62
63 int bus_kernel_connect(sd_bus *b);
64 int bus_kernel_take_fd(sd_bus *b);
65
66 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call);
67 int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority);
68
69 int bus_kernel_open_bus_fd(const char *bus, char **path);
70 int bus_kernel_make_starter(int fd, const char *name, bool activating, bool accept_fd, BusNamePolicy *policy, BusPolicyAccess world_policy);
71
72 int bus_kernel_create_bus(const char *name, bool world, char **s);
73 int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **path);
74 int bus_kernel_create_domain(const char *name, char **s);
75
76 int bus_kernel_set_endpoint_policy(int fd, uid_t uid, BusEndpoint *ep);
77
78 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated);
79 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated);
80
81 void bus_kernel_flush_memfd(sd_bus *bus);
82
83 int bus_kernel_parse_unique_name(const char *s, uint64_t *id);
84
85 int kdbus_translate_request_name_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
86 int kdbus_translate_attach_flags(uint64_t sd_bus_flags, uint64_t *kdbus_flags);
87
88 int bus_kernel_try_close(sd_bus *bus);
89
90 int bus_kernel_drop_one(int fd);