]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/varlink.h
catalog: update Polish translation
[thirdparty/systemd.git] / src / shared / varlink.h
CommitLineData
d41bd96f
LP
1/* SPDX-License-Identifier: LGPL-2.1+ */
2#pragma once
3
4#include "sd-event.h"
5
6#include "json.h"
7#include "time-util.h"
8
9/* A minimal Varlink implementation. We only implement the minimal, obvious bits here though. No validation,
10 * no introspection, no name service, just the stuff actually needed.
11 *
12 * You might wonder why we aren't using libvarlink here? Varlink is a very simple protocol, which allows us
13 * to write our own implementation relatively easily. However, the main reasons are these:
14 *
15 * • We want to use our own JSON subsystem, with all the benefits that brings (i.e. accurate unsigned+signed
16 * 64bit integers, full fuzzing, logging during parsing and so on). If we'd want to use that with
17 * libvarlink we'd have to serialize and deserialize all the time from its own representation which is
18 * inefficient and nasty.
19 *
20 * • We want integration into sd-event, but also synchronous event-loop-less operation
21 *
22 * • We need proper per-UID accounting and access control, since we want to allow communication between
23 * unprivileged clients and privileged servers.
24 *
25 * • And of course, we don't want the name service and introspection stuff for now (though that might
26 * change).
27 */
28
29typedef struct Varlink Varlink;
30typedef struct VarlinkServer VarlinkServer;
31
32typedef enum VarlinkReplyFlags {
33 VARLINK_REPLY_ERROR = 1 << 0,
34 VARLINK_REPLY_CONTINUES = 1 << 1,
35 VARLINK_REPLY_LOCAL = 1 << 2,
36} VarlinkReplyFlags;
37
38typedef enum VarlinkMethodFlags {
39 VARLINK_METHOD_ONEWAY = 1 << 0,
40 VARLINK_METHOD_MORE = 2 << 1,
41} VarlinkMethodFlags;
42
43typedef enum VarlinkServerFlags {
44 VARLINK_SERVER_ROOT_ONLY = 1 << 0, /* Only accessible by root */
45 VARLINK_SERVER_MYSELF_ONLY = 1 << 1, /* Only accessible by our own UID */
46 VARLINK_SERVER_ACCOUNT_UID = 1 << 2, /* Do per user accounting */
47
48 _VARLINK_SERVER_FLAGS_ALL = (1 << 3) - 1,
49} VarlinkServerFlags;
50
51typedef int (*VarlinkMethod)(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata);
52typedef int (*VarlinkReply)(Varlink *link, JsonVariant *parameters, const char *error_id, VarlinkReplyFlags flags, void *userdata);
53typedef int (*VarlinkConnect)(VarlinkServer *server, Varlink *link, void *userdata);
6d4d6002 54typedef void (*VarlinkDisconnect)(VarlinkServer *server, Varlink *link, void *userdata);
d41bd96f
LP
55
56int varlink_connect_address(Varlink **ret, const char *address);
57int varlink_connect_fd(Varlink **ret, int fd);
58
59Varlink* varlink_ref(Varlink *link);
60Varlink* varlink_unref(Varlink *v);
61
62int varlink_get_fd(Varlink *v);
63int varlink_get_events(Varlink *v);
64int varlink_get_timeout(Varlink *v, usec_t *ret);
65
66int varlink_attach_event(Varlink *v, sd_event *e, int64_t priority);
67void varlink_detach_event(Varlink *v);
68sd_event *varlink_get_event(Varlink *v);
69
70int varlink_process(Varlink *v);
71int varlink_wait(Varlink *v, usec_t timeout);
72
73int varlink_flush(Varlink *v);
74int varlink_close(Varlink *v);
75
76Varlink* varlink_flush_close_unref(Varlink *v);
9652d740 77Varlink* varlink_close_unref(Varlink *v);
d41bd96f
LP
78
79/* Enqueue method call, not expecting a reply */
80int varlink_send(Varlink *v, const char *method, JsonVariant *parameters);
81int varlink_sendb(Varlink *v, const char *method, ...);
82
83/* Send method call and wait for reply */
84int varlink_call(Varlink *v, const char *method, JsonVariant *parameters, JsonVariant **ret_parameters, const char **ret_error_id, VarlinkReplyFlags *ret_flags);
85int varlink_callb(Varlink *v, const char *method, JsonVariant **ret_parameters, const char **ret_error_id, VarlinkReplyFlags *ret_flags, ...);
86
87/* Enqueue method call, expect a reply, which is eventually delivered to the reply callback */
88int varlink_invoke(Varlink *v, const char *method, JsonVariant *parameters);
89int varlink_invokeb(Varlink *v, const char *method, ...);
90
45a6c965
LP
91/* Enqueue method call, expect a reply now, and possibly more later, which are all delivered to the reply callback */
92int varlink_observe(Varlink *v, const char *method, JsonVariant *parameters);
93int varlink_observeb(Varlink *v, const char *method, ...);
94
d41bd96f
LP
95/* Enqueue a final reply */
96int varlink_reply(Varlink *v, JsonVariant *parameters);
97int varlink_replyb(Varlink *v, ...);
98
99/* Enqueue a (final) error */
100int varlink_error(Varlink *v, const char *error_id, JsonVariant *parameters);
101int varlink_errorb(Varlink *v, const char *error_id, ...);
102int varlink_error_invalid_parameter(Varlink *v, JsonVariant *parameters);
103
104/* Enqueue a "more" reply */
105int varlink_notify(Varlink *v, JsonVariant *parameters);
106int varlink_notifyb(Varlink *v, ...);
107
108/* Bind a disconnect, reply or timeout callback */
109int varlink_bind_reply(Varlink *v, VarlinkReply reply);
110
111void* varlink_set_userdata(Varlink *v, void *userdata);
112void* varlink_get_userdata(Varlink *v);
113
114int varlink_get_peer_uid(Varlink *v, uid_t *ret);
115int varlink_get_peer_pid(Varlink *v, pid_t *ret);
116
117int varlink_set_relative_timeout(Varlink *v, usec_t usec);
118
119VarlinkServer* varlink_get_server(Varlink *v);
120
121int varlink_set_description(Varlink *v, const char *d);
122
123/* Create a varlink server */
124int varlink_server_new(VarlinkServer **ret, VarlinkServerFlags flags);
125VarlinkServer *varlink_server_ref(VarlinkServer *s);
126VarlinkServer *varlink_server_unref(VarlinkServer *s);
127
128/* Add addresses or fds to listen on */
129int varlink_server_listen_address(VarlinkServer *s, const char *address, mode_t mode);
130int varlink_server_listen_fd(VarlinkServer *s, int fd);
131int varlink_server_add_connection(VarlinkServer *s, int fd, Varlink **ret);
132
133/* Bind callbacks */
134int varlink_server_bind_method(VarlinkServer *s, const char *method, VarlinkMethod callback);
135int varlink_server_bind_method_many_internal(VarlinkServer *s, ...);
136#define varlink_server_bind_method_many(s, ...) varlink_server_bind_method_many_internal(s, __VA_ARGS__, NULL)
137int varlink_server_bind_connect(VarlinkServer *s, VarlinkConnect connect);
6d4d6002 138int varlink_server_bind_disconnect(VarlinkServer *s, VarlinkDisconnect disconnect);
d41bd96f
LP
139
140void* varlink_server_set_userdata(VarlinkServer *s, void *userdata);
141void* varlink_server_get_userdata(VarlinkServer *s);
142
143int varlink_server_attach_event(VarlinkServer *v, sd_event *e, int64_t priority);
144int varlink_server_detach_event(VarlinkServer *v);
145sd_event *varlink_server_get_event(VarlinkServer *v);
146
147int varlink_server_shutdown(VarlinkServer *server);
148
149unsigned varlink_server_connections_max(VarlinkServer *s);
150unsigned varlink_server_connections_per_uid_max(VarlinkServer *s);
151
152int varlink_server_set_connections_per_uid_max(VarlinkServer *s, unsigned m);
153int varlink_server_set_connections_max(VarlinkServer *s, unsigned m);
154
c4f601f2
LP
155unsigned varlink_server_current_connections(VarlinkServer *s);
156
d41bd96f
LP
157int varlink_server_set_description(VarlinkServer *s, const char *description);
158
159DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_unref);
9652d740 160DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_close_unref);
d41bd96f
LP
161DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_flush_close_unref);
162DEFINE_TRIVIAL_CLEANUP_FUNC(VarlinkServer *, varlink_server_unref);
163
164#define VARLINK_ERROR_DISCONNECTED "io.systemd.Disconnected"
165#define VARLINK_ERROR_TIMEOUT "io.systemd.TimedOut"
166#define VARLINK_ERROR_PROTOCOL "io.systemd.Protocol"
167#define VARLINK_ERROR_SYSTEM "io.systemd.System"
168
169#define VARLINK_ERROR_INTERFACE_NOT_FOUND "org.varlink.service.InterfaceNotFound"
170#define VARLINK_ERROR_METHOD_NOT_FOUND "org.varlink.service.MethodNotFound"
171#define VARLINK_ERROR_METHOD_NOT_IMPLEMENTED "org.varlink.service.MethodNotImplemented"
172#define VARLINK_ERROR_INVALID_PARAMETER "org.varlink.service.InvalidParameter"