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 bool member_name_is_valid(const char *p) {
175 for (q = p; *q; q++) {
179 (*q >= 'a' && *q <= 'z') ||
180 (*q >= 'A' && *q <= 'Z') ||
181 (*q >= '0' && *q <= '9') ||
194 static bool complex_pattern_check(char c, const char *a, const char *b) {
195 bool separator = false;
205 return (separator && (*a == 0 || *b == 0)) ||
206 (*a == 0 && *b == c && b[1] == 0) ||
207 (*b == 0 && *a == c && a[1] == 0);
218 bool namespace_complex_pattern(const char *pattern, const char *value) {
219 return complex_pattern_check('.', pattern, value);
222 bool path_complex_pattern(const char *pattern, const char *value) {
223 return complex_pattern_check('/', pattern, value);
226 static bool simple_pattern_check(char c, const char *a, const char *b) {
236 return *a == 0 && *b == c;
245 bool namespace_simple_pattern(const char *pattern, const char *value) {
246 return simple_pattern_check('.', pattern, value);
249 bool path_simple_pattern(const char *pattern, const char *value) {
250 return simple_pattern_check('/', pattern, value);
253 int bus_message_type_from_string(const char *s, uint8_t *u) {
254 if (streq(s, "signal"))
255 *u = SD_BUS_MESSAGE_SIGNAL;
256 else if (streq(s, "method_call"))
257 *u = SD_BUS_MESSAGE_METHOD_CALL;
258 else if (streq(s, "error"))
259 *u = SD_BUS_MESSAGE_METHOD_ERROR;
260 else if (streq(s, "method_return"))
261 *u = SD_BUS_MESSAGE_METHOD_RETURN;
268 const char *bus_message_type_to_string(uint8_t u) {
269 if (u == SD_BUS_MESSAGE_SIGNAL)
271 else if (u == SD_BUS_MESSAGE_METHOD_CALL)
272 return "method_call";
273 else if (u == SD_BUS_MESSAGE_METHOD_ERROR)
275 else if (u == SD_BUS_MESSAGE_METHOD_RETURN)
276 return "method_return";
281 char *bus_address_escape(const char *v) {
285 r = new(char, strlen(v)*3+1);
289 for (a = v, b = r; *a; a++) {
291 if ((*a >= '0' && *a <= '9') ||
292 (*a >= 'a' && *a <= 'z') ||
293 (*a >= 'A' && *a <= 'Z') ||
298 *(b++) = hexchar(*a >> 4);
299 *(b++) = hexchar(*a & 0xF);