summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-08-01 01:55:31 +0200
committerLennart Poettering <lennart@poettering.net>2011-08-01 01:55:31 +0200
commit70132bd0425ce0a65ed24197a2bcbf1cb2931352 (patch)
treededff73a402ae075c71499d23e16b323db539b9f
parent911a4828e054a531be961cea34de89b666bda710 (diff)
util: various optimizations, using join()
-rw-r--r--src/cgroup-util.c53
-rw-r--r--src/service.c3
-rw-r--r--src/unit-name.c7
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) {