]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-timer.c
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / dbus-timer.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
871d7de4
LP
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
871d7de4
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
871d7de4 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
871d7de4
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include <errno.h>
23
24#include "dbus-unit.h"
25#include "dbus-timer.h"
26#include "dbus-execute.h"
bfebab7f 27#include "dbus-common.h"
871d7de4
LP
28
29#define BUS_TIMER_INTERFACE \
30 " <interface name=\"org.freedesktop.systemd1.Timer\">\n" \
707e5e52
LP
31 " <property name=\"Unit\" type=\"s\" access=\"read\"/>\n" \
32 " <property name=\"Timers\" type=\"a(stt)\" access=\"read\"/>\n" \
03fae018 33 " <property name=\"NextElapseUSec\" type=\"t\" access=\"read\"/>\n" \
067d72c9 34 " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
707e5e52 35 " </interface>\n"
871d7de4
LP
36
37#define INTROSPECTION \
38 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
39 "<node>\n" \
40 BUS_UNIT_INTERFACE \
41 BUS_TIMER_INTERFACE \
42 BUS_PROPERTIES_INTERFACE \
c4e2ceae 43 BUS_PEER_INTERFACE \
871d7de4
LP
44 BUS_INTROSPECTABLE_INTERFACE \
45 "</node>\n"
46
05feefe0
LP
47#define INTERFACES_LIST \
48 BUS_UNIT_INTERFACES_LIST \
49 "org.freedesktop.systemd1.Timer\0"
50
9a60da28 51const char bus_timer_interface[] _introspect_("Timer") = BUS_TIMER_INTERFACE;
871d7de4 52
c4e2ceae
LP
53const char bus_timer_invalidating_properties[] =
54 "Timers\0"
067d72c9
LP
55 "NextElapseUSec\0"
56 "Result\0";
c4e2ceae 57
bfebab7f 58static int bus_timer_append_timers(DBusMessageIter *i, const char *property, void *data) {
707e5e52
LP
59 Timer *p = data;
60 DBusMessageIter sub, sub2;
61 TimerValue *k;
62
707e5e52
LP
63 assert(i);
64 assert(property);
65 assert(p);
66
67 if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(stt)", &sub))
68 return -ENOMEM;
69
70 LIST_FOREACH(value, k, p->values) {
03fae018
LP
71 char *buf;
72 const char *t;
73 size_t l;
74 bool b;
707e5e52 75
03fae018
LP
76 t = timer_base_to_string(k->base);
77 assert(endswith(t, "Sec"));
78
79 /* s/Sec/USec/ */
80 l = strlen(t);
81 if (!(buf = new(char, l+2)))
82 return -ENOMEM;
83
84 memcpy(buf, t, l-3);
85 memcpy(buf+l-3, "USec", 5);
86
87 b = dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) &&
88 dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &buf) &&
89 dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &k->value) &&
90 dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &k->next_elapse) &&
91 dbus_message_iter_close_container(&sub, &sub2);
92
93 free(buf);
94 if (!b)
707e5e52
LP
95 return -ENOMEM;
96 }
97
98 if (!dbus_message_iter_close_container(i, &sub))
99 return -ENOMEM;
100
101 return 0;
102}
103
bfebab7f 104static int bus_timer_append_unit(DBusMessageIter *i, const char *property, void *data) {
b284eabd 105 Unit *u = data;
ac155bb8 106 Timer *timer = TIMER(u);
b284eabd
LP
107 const char *t;
108
b284eabd
LP
109 assert(i);
110 assert(property);
111 assert(u);
112
ac155bb8 113 t = UNIT_DEREF(timer->unit) ? UNIT_DEREF(timer->unit)->id : "";
b284eabd
LP
114
115 return dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t) ? 0 : -ENOMEM;
116}
117
067d72c9
LP
118static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_timer_append_timer_result, timer_result, TimerResult);
119
d200735e
MS
120static const BusProperty bus_timer_properties[] = {
121 { "Unit", bus_timer_append_unit, "s", 0 },
122 { "Timers", bus_timer_append_timers, "a(stt)", 0 },
123 { "NextElapseUSec", bus_property_append_usec, "t", offsetof(Timer, next_elapse) },
067d72c9 124 { "Result", bus_timer_append_timer_result,"s", offsetof(Timer, result) },
d200735e
MS
125 { NULL, }
126};
127
5e8d1c9a 128DBusHandlerResult bus_timer_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) {
ac155bb8 129 Timer *t = TIMER(u);
d200735e
MS
130 const BusBoundProperties bps[] = {
131 { "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
132 { "org.freedesktop.systemd1.Timer", bus_timer_properties, t },
133 { NULL, }
871d7de4
LP
134 };
135
d200735e 136 return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps);
871d7de4 137}