chiark / gitweb /
add unit_name_escape_path() call
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2010 05:44:30 +0000 (06:44 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2010 05:44:30 +0000 (06:44 +0100)
unit.c
unit.h

diff --git a/unit.c b/unit.c
index 2f39d887fefff6c93474d96776e8616c82b1f5ce..c8a6f669615f309506574d21d9c89181b0dc9aba 100644 (file)
--- a/unit.c
+++ b/unit.c
@@ -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;
+}
diff --git a/unit.h b/unit.h
index 5321d5f1a36950f5e314f5fa6f3c0719b8b3ed4c..f9d96c7efcd9a2d7dd115c7c97f5ec5ddb1608fb 100644 (file)
--- a/unit.h
+++ b/unit.h
@@ -235,5 +235,6 @@ bool unit_job_is_applicable(Unit *u, JobType j);
 const char *unit_path(void);
 int set_unit_path(const char *p);
 
+char *unit_name_escape_path(const char *path, const char *suffix);
 
 #endif