diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-08-01 01:55:31 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-08-01 01:55:31 +0200 |
commit | 70132bd0425ce0a65ed24197a2bcbf1cb2931352 (patch) | |
tree | dedff73a402ae075c71499d23e16b323db539b9f | |
parent | 911a4828e054a531be961cea34de89b666bda710 (diff) |
util: various optimizations, using join()
-rw-r--r-- | src/cgroup-util.c | 53 | ||||
-rw-r--r-- | src/service.c | 3 | ||||
-rw-r--r-- | src/unit-name.c | 7 |
3 files changed, 30 insertions, 33 deletions
diff --git a/src/cgroup-util.c b/src/cgroup-util.c index 090573bd31..8e574bf98a 100644 --- a/src/cgroup-util.c +++ b/src/cgroup-util.c @@ -482,13 +482,26 @@ finish: int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) { const char *p; - char *mp; - int r; + char *t; static __thread bool good = false; assert(controller); assert(fs); + if (!good) { + int r; + + r = path_is_mount_point("/sys/fs/cgroup"); + if (r <= 0) + return r < 0 ? r : -ENOENT; + + /* Cache this to save a few stat()s */ + good = true; + } + + if (isempty(controller)) + return -EINVAL; + /* This is a very minimal lookup from controller names to * paths. Since we have mounted most hierarchies ourselves * should be kinda safe, but eventually we might want to @@ -502,34 +515,22 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch else p = controller; - if (asprintf(&mp, "/sys/fs/cgroup/%s", p) < 0) - return -ENOMEM; - - if (!good) { - if ((r = path_is_mount_point(mp)) <= 0) { - free(mp); - return r < 0 ? r : -ENOENT; - } - - /* Cache this to save a few stat()s */ - good = true; - } - if (path && suffix) - r = asprintf(fs, "%s/%s/%s", mp, path, suffix); + t = join("/sys/fs/cgroup/", p, "/", path, "/", suffix, NULL); else if (path) - r = asprintf(fs, "%s/%s", mp, path); + t = join("/sys/fs/cgroup/", p, "/", path, NULL); else if (suffix) - r = asprintf(fs, "%s/%s", mp, suffix); - else { - path_kill_slashes(mp); - *fs = mp; - return 0; - } + t = join("/sys/fs/cgroup/", p, "/", suffix, NULL); + else + t = join("/sys/fs/cgroup/", p, NULL); - free(mp); - path_kill_slashes(*fs); - return r < 0 ? -ENOMEM : 0; + if (!t) + return -ENOMEM; + + path_kill_slashes(t); + + *fs = t; + return 0; } int cg_trim(const char *controller, const char *path, bool delete_root) { diff --git a/src/service.c b/src/service.c index 340eb1baa4..5c17413a59 100644 --- a/src/service.c +++ b/src/service.c @@ -2988,7 +2988,8 @@ static int service_enumerate(Manager *m) { free(path); path = NULL; - if (asprintf(&path, "%s/%s", *p, rcnd_table[i].path) < 0) { + path = join(*p, "/", rcnd_table[i].path, NULL); + if (!path) { r = -ENOMEM; goto finish; } diff --git a/src/unit-name.c b/src/unit-name.c index 6d45576f85..1cbb804561 100644 --- a/src/unit-name.c +++ b/src/unit-name.c @@ -167,8 +167,6 @@ char *unit_name_change_suffix(const char *n, const char *suffix) { } char *unit_name_build(const char *prefix, const char *instance, const char *suffix) { - char *r; - assert(prefix); assert(unit_prefix_is_valid(prefix)); assert(!instance || unit_instance_is_valid(instance)); @@ -177,10 +175,7 @@ char *unit_name_build(const char *prefix, const char *instance, const char *suff if (!instance) return strappend(prefix, suffix); - if (asprintf(&r, "%s@%s%s", prefix, instance, suffix) < 0) - return NULL; - - return r; + return join(prefix, "@", instance, suffix, NULL); } static char* do_escape(const char *f, char *t) { |