summaryrefslogtreecommitdiffstats
path: root/src/shared/varlink.h
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-01-20 19:15:55 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-01-20 23:31:58 +0100
commit9807fdc1da8e037ddedfa4e2c6d2728b6e60051e (patch)
tree0d0f31c99faeae5b22b91beace27c455dbe911d9 /src/shared/varlink.h
parentMerge pull request #18311 from poettering/sysext-fixups (diff)
downloadsystemd-9807fdc1da8e037ddedfa4e2c6d2728b6e60051e.tar.xz
systemd-9807fdc1da8e037ddedfa4e2c6d2728b6e60051e.zip
varlink: make 'userdata' pointer inheritance from varlink server to connection optional
@keszybz's right on https://github.com/systemd/systemd/pull/18248#issuecomment-760798473: swapping out the userdata pointer of a live varlink connection is iffy. Let's fix this by making the userdata inheritance from VarlinkServer object to the Varlink connection object optional: we want it for most cases, but not all, i.e. all those cases where the calls implemented as varlink methods are stateless and can be answered synchronously. For the other cases (i.e. where we want per-connection objects that wrap the asynchronous operation as it goes on) let's not do such inheritance but initialize the userdata pointer only once we have it. THis means the original manager object must be manually retrieved from the VarlinkServer object, which in turn needs to be requested from the Varlink connection object. The userdata inheritance is now controlled by the VARLINK_INHERIT_USERDATA flag passed at VarlinkServer construction. Alternative-to: #18248
Diffstat (limited to 'src/shared/varlink.h')
-rw-r--r--src/shared/varlink.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/shared/varlink.h b/src/shared/varlink.h
index 7ea1f9113f..66a1ff630e 100644
--- a/src/shared/varlink.h
+++ b/src/shared/varlink.h
@@ -41,11 +41,12 @@ typedef enum VarlinkMethodFlags {
} VarlinkMethodFlags;
typedef enum VarlinkServerFlags {
- VARLINK_SERVER_ROOT_ONLY = 1 << 0, /* Only accessible by root */
- VARLINK_SERVER_MYSELF_ONLY = 1 << 1, /* Only accessible by our own UID */
- VARLINK_SERVER_ACCOUNT_UID = 1 << 2, /* Do per user accounting */
+ VARLINK_SERVER_ROOT_ONLY = 1 << 0, /* Only accessible by root */
+ VARLINK_SERVER_MYSELF_ONLY = 1 << 1, /* Only accessible by our own UID */
+ VARLINK_SERVER_ACCOUNT_UID = 1 << 2, /* Do per user accounting */
+ VARLINK_SERVER_INHERIT_USERDATA = 1 << 3, /* Initialize Varlink connection userdata from VarlinkServer userdata */
- _VARLINK_SERVER_FLAGS_ALL = (1 << 3) - 1,
+ _VARLINK_SERVER_FLAGS_ALL = (1 << 4) - 1,
} VarlinkServerFlags;
typedef int (*VarlinkMethod)(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata);