X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=unit.c;h=7723393db95163d112ccc9118a1bb4af64efd14f;hp=2f39d887fefff6c93474d96776e8616c82b1f5ce;hb=b08d03ffe58332f590aae5c78a85e4fc0b8588ce;hpb=b5ea5d95b40315ed9bb21a443480f717092d4981 diff --git a/unit.c b/unit.c index 2f39d887f..7723393db 100644 --- a/unit.c +++ b/unit.c @@ -155,6 +155,21 @@ int unit_add_name(Unit *u, const char *text) { return 0; } +int unit_choose_id(Unit *u, const char *name) { + char *s; + + assert(u); + assert(name); + + /* Selects one of the names of this unit as the id */ + + if (!(s = set_get(u->meta.names, (char*) name))) + return -ENOENT; + + u->meta.id = s; + return 0; +} + void unit_add_to_load_queue(Unit *u) { assert(u); @@ -887,3 +902,51 @@ int set_unit_path(const char *p) { return 0; } + +char *unit_name_escape_path(const char *prefix, const char *path, const char *suffix) { + char *r, *t; + const char *f; + size_t a, b, c; + + assert(path); + + /* Takes a path and a suffix and prefix and makes a nice + * string suitable as 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 \ and ., of course. This + * escaping is hence reversible. + */ + + if (!prefix) + prefix = ""; + + if (!suffix) + suffix = ""; + + a = strlen(prefix); + b = strlen(path); + c = strlen(suffix); + + if (!(r = new(char, a+b*4+c+1))) + return NULL; + + memcpy(r, prefix, a); + + for (f = path, t = r+a; *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, c+1); + + return r; +}