From 88066b3a67b78329a02ffca3ac76ba1230de6b12 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Jan 2010 06:44:30 +0100 Subject: [PATCH] add unit_name_escape_path() call --- unit.c | 39 +++++++++++++++++++++++++++++++++++++++ unit.h | 1 + 2 files changed, 40 insertions(+) diff --git a/unit.c b/unit.c index 2f39d887..c8a6f669 100644 --- 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 5321d5f1..f9d96c7e 100644 --- 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 -- 2.39.5