diff options
-rw-r--r-- | Makefile.am | 31 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/sd-bus.c | 69 | ||||
-rw-r--r-- | src/shared/bus-label.c | 102 | ||||
-rw-r--r-- | src/shared/bus-label.h | 25 | ||||
-rw-r--r-- | src/shared/unit-name.c | 6 |
5 files changed, 150 insertions, 83 deletions
diff --git a/Makefile.am b/Makefile.am index feadc9821d..2ed987de61 100644 --- a/Makefile.am +++ b/Makefile.am @@ -769,7 +769,9 @@ libsystemd_shared_la_SOURCES = \ src/shared/xml.c \ src/shared/xml.h \ src/shared/condition-util.c \ - src/shared/condition-util.h + src/shared/condition-util.h \ + src/shared/bus-label.c \ + src/shared/bus-label.h nodist_libsystemd_shared_la_SOURCES = \ src/shared/errno-from-name.h \ @@ -1392,7 +1394,8 @@ test_cgroup_SOURCES = \ test_cgroup_LDADD = \ libsystemd-label.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd-internal.la test_cgroup_mask_SOURCES = \ src/test/test-cgroup-mask.c @@ -1455,8 +1458,8 @@ test_install_SOURCES = \ test_install_LDADD = \ libsystemd-units.la \ libsystemd-label.la \ - libsystemd-internal.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd-internal.la test_watchdog_SOURCES = \ src/test/test-watchdog.c @@ -2328,8 +2331,8 @@ test_bus_introspect_SOURCES = \ src/libsystemd/sd-bus/test-bus-introspect.c test_bus_introspect_LDADD = \ - libsystemd-shared.la \ - libsystemd-internal.la + libsystemd-internal.la \ + libsystemd-shared.la test_event_SOURCES = \ src/libsystemd/sd-event/test-event.c @@ -4321,8 +4324,8 @@ id128_la_LDFLAGS = \ id128_la_LIBADD = \ $(PYTHON_DEVEL_LIBS) \ - libsystemd.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd.la _daemon_la_SOURCES = \ src/python-systemd/_daemon.c \ @@ -4343,8 +4346,8 @@ _daemon_la_LDFLAGS = \ _daemon_la_LIBADD = \ $(PYTHON_DEVEL_LIBS) \ - libsystemd.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd.la _reader_la_SOURCES = \ src/python-systemd/_reader.c \ @@ -4364,8 +4367,8 @@ _reader_la_LDFLAGS = \ _reader_la_LIBADD = \ $(PYTHON_DEVEL_LIBS) \ - libsystemd.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd.la login_la_SOURCES = \ src/python-systemd/login.c \ @@ -4385,8 +4388,8 @@ login_la_LDFLAGS = \ login_la_LIBADD = \ $(PYTHON_DEVEL_LIBS) \ - libsystemd.la \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd.la dist_pkgpyexec_PYTHON = \ src/python-systemd/journal.py \ diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 427d53061c..20f540df58 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -36,6 +36,7 @@ #include "missing.h" #include "def.h" #include "cgroup-util.h" +#include "bus-label.h" #include "sd-bus.h" #include "bus-internal.h" @@ -3041,75 +3042,11 @@ _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) { } _public_ char *sd_bus_label_escape(const char *s) { - char *r, *t; - const char *f; - - assert_return(s, NULL); - - /* Escapes all chars that D-Bus' object path cannot deal - * with. Can be reversed with bus_path_unescape(). We special - * case the empty string. */ - - if (*s == 0) - return strdup("_"); - - r = new(char, strlen(s)*3 + 1); - if (!r) - return NULL; - - for (f = s, t = r; *f; f++) { - - /* Escape everything that is not a-zA-Z0-9. We also - * escape 0-9 if it's the first character */ - - if (!(*f >= 'A' && *f <= 'Z') && - !(*f >= 'a' && *f <= 'z') && - !(f > s && *f >= '0' && *f <= '9')) { - *(t++) = '_'; - *(t++) = hexchar(*f >> 4); - *(t++) = hexchar(*f); - } else - *(t++) = *f; - } - - *t = 0; - - return r; + return bus_label_escape(s); } _public_ char *sd_bus_label_unescape(const char *f) { - char *r, *t; - - assert_return(f, NULL); - - /* Special case for the empty string */ - if (streq(f, "_")) - return strdup(""); - - r = new(char, strlen(f) + 1); - if (!r) - return NULL; - - for (t = r; *f; f++) { - - if (*f == '_') { - int a, b; - - if ((a = unhexchar(f[1])) < 0 || - (b = unhexchar(f[2])) < 0) { - /* Invalid escape code, let's take it literal then */ - *(t++) = '_'; - } else { - *(t++) = (char) ((a << 4) | b); - f += 2; - } - } else - *(t++) = *f; - } - - *t = 0; - - return r; + return bus_label_unescape(f); } _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) { diff --git a/src/shared/bus-label.c b/src/shared/bus-label.c new file mode 100644 index 0000000000..61eb75bca2 --- /dev/null +++ b/src/shared/bus-label.c @@ -0,0 +1,102 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <assert.h> +#include <stdlib.h> +#include <unistd.h> + +#include "util.h" +#include "macro.h" +#include "def.h" + +#include "bus-label.h" + +char *bus_label_escape(const char *s) { + char *r, *t; + const char *f; + + assert_return(s, NULL); + + /* Escapes all chars that D-Bus' object path cannot deal + * with. Can be reversed with bus_path_unescape(). We special + * case the empty string. */ + + if (*s == 0) + return strdup("_"); + + r = new(char, strlen(s)*3 + 1); + if (!r) + return NULL; + + for (f = s, t = r; *f; f++) { + + /* Escape everything that is not a-zA-Z0-9. We also + * escape 0-9 if it's the first character */ + + if (!(*f >= 'A' && *f <= 'Z') && + !(*f >= 'a' && *f <= 'z') && + !(f > s && *f >= '0' && *f <= '9')) { + *(t++) = '_'; + *(t++) = hexchar(*f >> 4); + *(t++) = hexchar(*f); + } else + *(t++) = *f; + } + + *t = 0; + + return r; +} + +char *bus_label_unescape(const char *f) { + char *r, *t; + + assert_return(f, NULL); + + /* Special case for the empty string */ + if (streq(f, "_")) + return strdup(""); + + r = new(char, strlen(f) + 1); + if (!r) + return NULL; + + for (t = r; *f; f++) { + + if (*f == '_') { + int a, b; + + if ((a = unhexchar(f[1])) < 0 || + (b = unhexchar(f[2])) < 0) { + /* Invalid escape code, let's take it literal then */ + *(t++) = '_'; + } else { + *(t++) = (char) ((a << 4) | b); + f += 2; + } + } else + *(t++) = *f; + } + + *t = 0; + + return r; +} diff --git a/src/shared/bus-label.h b/src/shared/bus-label.h new file mode 100644 index 0000000000..c27c8517fd --- /dev/null +++ b/src/shared/bus-label.h @@ -0,0 +1,25 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +char *bus_label_escape(const char *s); +char *bus_label_unescape(const char *f); diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c index 408323b8fb..2924c473df 100644 --- a/src/shared/unit-name.c +++ b/src/shared/unit-name.c @@ -23,8 +23,8 @@ #include <string.h> #include <assert.h> -#include "sd-bus.h" #include "path-util.h" +#include "bus-label.h" #include "util.h" #include "unit-name.h" #include "def.h" @@ -459,7 +459,7 @@ char *unit_dbus_path_from_name(const char *name) { assert(name); - e = sd_bus_label_escape(name); + e = bus_label_escape(name); if (!e) return NULL; @@ -474,7 +474,7 @@ int unit_name_from_dbus_path(const char *path, char **name) { if (!e) return -EINVAL; - n = sd_bus_label_unescape(e); + n = bus_label_unescape(e); if (!n) return -ENOMEM; |