]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-bus/bus-match.h
autogen: use -O0 for "autogen.sh c" after all
[thirdparty/systemd.git] / src / libsystemd-bus / bus-match.h
CommitLineData
392d5b37
LP
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 "hashmap.h"
25
26#include "sd-bus.h"
27
28enum bus_match_node_type {
29 BUS_MATCH_ROOT,
30 BUS_MATCH_VALUE,
31 BUS_MATCH_LEAF,
32
33 /* The following are all different kinds of compare nodes */
34 BUS_MATCH_MESSAGE_TYPE,
35 BUS_MATCH_SENDER,
36 BUS_MATCH_DESTINATION,
37 BUS_MATCH_INTERFACE,
38 BUS_MATCH_MEMBER,
39 BUS_MATCH_PATH,
40 BUS_MATCH_PATH_NAMESPACE,
41 BUS_MATCH_ARG,
42 BUS_MATCH_ARG_LAST = BUS_MATCH_ARG + 63,
43 BUS_MATCH_ARG_PATH,
44 BUS_MATCH_ARG_PATH_LAST = BUS_MATCH_ARG_PATH + 63,
45 BUS_MATCH_ARG_NAMESPACE,
46 BUS_MATCH_ARG_NAMESPACE_LAST = BUS_MATCH_ARG_NAMESPACE + 63,
47 _BUS_MATCH_NODE_TYPE_MAX,
48 _BUS_MATCH_NODE_TYPE_INVALID = -1
49};
50
51struct bus_match_node {
52 enum bus_match_node_type type;
53 struct bus_match_node *parent, *next, *prev, *child;
54
55 union {
56 struct {
392d5b37 57 char *str;
7286037f 58 uint8_t u8;
392d5b37
LP
59 } value;
60 struct {
52f3ba91 61 sd_bus_message_handler_t callback;
392d5b37 62 void *userdata;
7286037f 63 unsigned last_iteration;
c7819669 64 uint64_t cookie;
392d5b37
LP
65 } leaf;
66 struct {
67 /* If this is set, then the child is NULL */
68 Hashmap *children;
69 } compare;
70 };
71};
72
c7819669
LP
73struct bus_match_component {
74 enum bus_match_node_type type;
75 uint8_t value_u8;
76 char *value_str;
77};
78
eb01ba5d 79int bus_match_run(sd_bus *bus, struct bus_match_node *root, sd_bus_message *m);
392d5b37 80
c7819669
LP
81int bus_match_add(struct bus_match_node *root, struct bus_match_component *components, unsigned n_components, sd_bus_message_handler_t callback, void *userdata, uint64_t cookie, struct bus_match_node **ret);
82int bus_match_remove(struct bus_match_node *root, struct bus_match_component *components, unsigned n_components, sd_bus_message_handler_t callback, void *userdata, uint64_t *cookie);
392d5b37
LP
83
84void bus_match_free(struct bus_match_node *node);
85
86void bus_match_dump(struct bus_match_node *node, unsigned level);
87
88const char* bus_match_node_type_to_string(enum bus_match_node_type t, char buf[], size_t l);
89enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n);
c7819669
LP
90
91int bus_match_parse(const char *match, struct bus_match_component **_components, unsigned *_n_components);
92void bus_match_parse_free(struct bus_match_component *components, unsigned n_components);