1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
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
11 (at your option) any later version.
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
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include "bus-internal.h"
24 bool object_path_is_valid(const char *p) {
37 for (slash = true, q = p+1; *q; q++)
47 (*q >= 'a' && *q <= 'z') ||
48 (*q >= 'A' && *q <= 'Z') ||
49 (*q >= '0' && *q <= '9') ||
64 char* object_path_startswith(const char *a, const char *b) {
67 if (!object_path_is_valid(a) ||
68 !object_path_is_valid(b))
87 bool interface_name_is_valid(const char *p) {
89 bool dot, found_dot = false;
94 for (dot = true, q = p; *q; q++)
99 found_dot = dot = true;
104 (*q >= 'a' && *q <= 'z') ||
105 (*q >= 'A' && *q <= 'Z') ||
106 (!dot && *q >= '0' && *q <= '9') ||
127 bool service_name_is_valid(const char *p) {
129 bool dot, found_dot = false, unique;
134 unique = p[0] == ':';
136 for (dot = true, q = unique ? p+1 : p; *q; q++)
141 found_dot = dot = true;
146 (*q >= 'a' && *q <= 'z') ||
147 (*q >= 'A' && *q <= 'Z') ||
148 ((!dot || unique) && *q >= '0' && *q <= '9') ||
149 *q == '_' || *q == '-';
169 char* service_name_startswith(const char *a, const char *b) {
172 if (!service_name_is_valid(a) ||
173 !service_name_is_valid(b))
176 p = startswith(a, b);
184 return (char*) p + 1;
189 bool member_name_is_valid(const char *p) {
195 for (q = p; *q; q++) {
199 (*q >= 'a' && *q <= 'z') ||
200 (*q >= 'A' && *q <= 'Z') ||
201 (*q >= '0' && *q <= '9') ||
214 static bool complex_pattern_check(char c, const char *a, const char *b) {
215 bool separator = false;
225 return (separator && (*a == 0 || *b == 0)) ||
226 (*a == 0 && *b == c && b[1] == 0) ||
227 (*b == 0 && *a == c && a[1] == 0);
238 bool namespace_complex_pattern(const char *pattern, const char *value) {
239 return complex_pattern_check('.', pattern, value);
242 bool path_complex_pattern(const char *pattern, const char *value) {
243 return complex_pattern_check('/', pattern, value);
246 static bool simple_pattern_check(char c, const char *a, const char *b) {
256 return *a == 0 && *b == c;
265 bool namespace_simple_pattern(const char *pattern, const char *value) {
266 return simple_pattern_check('.', pattern, value);
269 bool path_simple_pattern(const char *pattern, const char *value) {
270 return simple_pattern_check('/', pattern, value);
273 int bus_message_type_from_string(const char *s, uint8_t *u) {
274 if (streq(s, "signal"))
275 *u = SD_BUS_MESSAGE_SIGNAL;
276 else if (streq(s, "method_call"))
277 *u = SD_BUS_MESSAGE_METHOD_CALL;
278 else if (streq(s, "error"))
279 *u = SD_BUS_MESSAGE_METHOD_ERROR;
280 else if (streq(s, "method_return"))
281 *u = SD_BUS_MESSAGE_METHOD_RETURN;
288 const char *bus_message_type_to_string(uint8_t u) {
289 if (u == SD_BUS_MESSAGE_SIGNAL)
291 else if (u == SD_BUS_MESSAGE_METHOD_CALL)
292 return "method_call";
293 else if (u == SD_BUS_MESSAGE_METHOD_ERROR)
295 else if (u == SD_BUS_MESSAGE_METHOD_RETURN)
296 return "method_return";
301 char *bus_address_escape(const char *v) {
305 r = new(char, strlen(v)*3+1);
309 for (a = v, b = r; *a; a++) {
311 if ((*a >= '0' && *a <= '9') ||
312 (*a >= 'a' && *a <= 'z') ||
313 (*a >= 'A' && *a <= 'Z') ||
318 *(b++) = hexchar(*a >> 4);
319 *(b++) = hexchar(*a & 0xF);