chiark / gitweb /
add new hexchar() call
[elogind.git] / unit.c
diff --git a/unit.c b/unit.c
index a5f4ac76767d1c412db7d166b7d62a3559d860d3..c8a6f669615f309506574d21d9c89181b0dc9aba 100644 (file)
--- a/unit.c
+++ b/unit.c
@@ -44,7 +44,7 @@ UnitType unit_name_to_type(const char *n) {
         "0123456789"                            \
         "abcdefghijklmnopqrstuvwxyz"            \
         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"            \
-        "-_"
+        "-_.\\"
 
 bool unit_name_is_valid(const char *n) {
         UnitType t;
@@ -887,3 +887,42 @@ int set_unit_path(const char *p) {
 
         return 0;
 }
+
+char *unit_name_escape_path(const char *path, const char *suffix) {
+        char *r, *t;
+        const char *f;
+        size_t a, b;
+
+        assert(path);
+        assert(suffix);
+
+        /* Takes a path and a util suffix and makes a nice unit name
+         * of it, escaping all weird chars on the way.
+         *
+         * / becomes _, and all chars not alloweed in a unit name get
+         * escaped as \xFF, including the _ and the \ itself, of
+         * course. This escaping is hence reversible.
+         */
+
+        a = strlen(path);
+        b = strlen(suffix);
+
+        if (!(r = new(char, a*4+b+1)))
+                return NULL;
+
+        for (f = path, t = r; *f; f++) {
+                if (*f == '/')
+                        *(t++) = '_';
+                else if (*f == '_' || *f == '\\' || !strchr(VALID_CHARS, *f)) {
+                        *(t++) = '\\';
+                        *(t++) = 'x';
+                        *(t++) = hexchar(*f > 4);
+                        *(t++) = hexchar(*f);
+                } else
+                        *(t++) = *f;
+        }
+
+        memcpy(t, suffix, b+1);
+
+        return r;
+}