]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/dbus-util.c
tree-wide: drop license boilerplate
[thirdparty/systemd.git] / src / core / dbus-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6 ***/
7
8 #include "bus-util.h"
9 #include "dbus-util.h"
10 #include "parse-util.h"
11 #include "path-util.h"
12 #include "unit-printf.h"
13 #include "user-util.h"
14 #include "unit.h"
15
16 BUS_DEFINE_SET_TRANSIENT(mode_t, "u", uint32_t, mode_t, "%040o");
17 BUS_DEFINE_SET_TRANSIENT(unsigned, "u", uint32_t, unsigned, "%" PRIu32);
18 BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(user, valid_user_group_name_or_id);
19 BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(path, path_is_absolute);
20
21 int bus_set_transient_string(
22 Unit *u,
23 const char *name,
24 char **p,
25 sd_bus_message *message,
26 UnitWriteFlags flags,
27 sd_bus_error *error) {
28
29 const char *v;
30 int r;
31
32 assert(p);
33
34 r = sd_bus_message_read(message, "s", &v);
35 if (r < 0)
36 return r;
37
38 if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
39 r = free_and_strdup(p, empty_to_null(v));
40 if (r < 0)
41 return r;
42
43 unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name,
44 "%s=%s", name, strempty(v));
45 }
46
47 return 1;
48 }
49
50 int bus_set_transient_bool(
51 Unit *u,
52 const char *name,
53 bool *p,
54 sd_bus_message *message,
55 UnitWriteFlags flags,
56 sd_bus_error *error) {
57
58 int v, r;
59
60 assert(p);
61
62 r = sd_bus_message_read(message, "b", &v);
63 if (r < 0)
64 return r;
65
66 if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
67 *p = v;
68 unit_write_settingf(u, flags, name, "%s=%s", name, yes_no(v));
69 }
70
71 return 1;
72 }
73
74 int bus_set_transient_usec_internal(
75 Unit *u,
76 const char *name,
77 usec_t *p,
78 bool fix_0,
79 sd_bus_message *message,
80 UnitWriteFlags flags,
81 sd_bus_error *error) {
82
83 uint64_t v;
84 int r;
85
86 assert(p);
87
88 r = sd_bus_message_read(message, "t", &v);
89 if (r < 0)
90 return r;
91
92 if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
93 char *n, ts[FORMAT_TIMESPAN_MAX];
94
95 if (fix_0)
96 *p = v != 0 ? v: USEC_INFINITY;
97 else
98 *p = v;
99
100 n = strndupa(name, strlen(name) - 4);
101 unit_write_settingf(u, flags, name, "%sSec=%s", n,
102 format_timespan(ts, sizeof(ts), v, USEC_PER_MSEC));
103 }
104
105 return 1;
106 }