systemctl: append default suffix only if none present

Simplify unit_name_mangle() and unit_name_mangle_with_suffix() to
always behave the same, and only append a suffix if there is no
type suffix. If a user says 'isolate blah.device' it is better to
return an error that the type cannot be isolated, than to try to
isolate blah.device.target.

(cherry picked from commit 5e03c6e3b5)
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2015-01-15 21:55:34 -05:00
parent d52dba7e3f
commit 2d686078fe
3 changed files with 16 additions and 37 deletions
+12 -32
View File
@@ -502,37 +502,11 @@ int unit_name_from_dbus_path(const char *path, char **name) {
}
/**
* Try to turn a string that might not be a unit name into a
* sensible unit name.
*/
char *unit_name_mangle(const char *name, enum unit_name_mangle allow_globs) {
char *r, *t;
assert(name);
if (is_device_path(name))
return unit_name_from_path(name, ".device");
if (path_is_absolute(name))
return unit_name_from_path(name, ".mount");
r = new(char, strlen(name) * 4 + strlen(".service") + 1);
if (!r)
return NULL;
t = do_escape_mangle(name, allow_globs, r);
if (unit_name_to_type(name) < 0)
strcpy(t, ".service");
else
*t = 0;
return r;
}
/**
* Similar to unit_name_mangle(), but is called when we know
* that this is about a specific unit type.
* Convert a string to a unit name. /dev/blah is converted to dev-blah.device,
* /blah/blah is converted to blah-blah.mount, anything else is left alone,
* except that @suffix is appended if a valid unit suffix is not present.
*
* If @allow_globs, globs characters are preserved. Otherwise they are escaped.
*/
char *unit_name_mangle_with_suffix(const char *name, enum unit_name_mangle allow_globs, const char *suffix) {
char *r, *t;
@@ -541,13 +515,19 @@ char *unit_name_mangle_with_suffix(const char *name, enum unit_name_mangle allow
assert(suffix);
assert(suffix[0] == '.');
if (is_device_path(name))
return unit_name_from_path(name, ".device");
if (path_is_absolute(name))
return unit_name_from_path(name, ".mount");
r = new(char, strlen(name) * 4 + strlen(suffix) + 1);
if (!r)
return NULL;
t = do_escape_mangle(name, allow_globs, r);
if (!endswith(name, suffix))
if (unit_name_to_type(name) < 0)
strcpy(t, suffix);
else
*t = 0;
+3 -1
View File
@@ -156,8 +156,10 @@ enum unit_name_mangle {
MANGLE_GLOB,
};
char *unit_name_mangle(const char *name, enum unit_name_mangle allow_globs);
char *unit_name_mangle_with_suffix(const char *name, enum unit_name_mangle allow_globs, const char *suffix);
static inline char *unit_name_mangle(const char *name, enum unit_name_mangle allow_globs) {
return unit_name_mangle_with_suffix(name, allow_globs, ".service");
}
int build_subslice(const char *slice, const char*name, char **subslice);
+1 -4
View File
@@ -2700,10 +2700,7 @@ static int expand_names(sd_bus *bus, char **names, const char* suffix, char ***r
STRV_FOREACH(name, names) {
char *t;
if (suffix)
t = unit_name_mangle_with_suffix(*name, MANGLE_GLOB, suffix);
else
t = unit_name_mangle(*name, MANGLE_GLOB);
t = unit_name_mangle_with_suffix(*name, MANGLE_GLOB, suffix);
if (!t)
return log_oom();