Merge pull request #22195 from keszybz/more-specifiers

Add unit specifiers for fragment path and directory
This commit is contained in:
Luca Boccassi
2022-01-21 11:22:22 +00:00
committed by GitHub
6 changed files with 119 additions and 83 deletions
+12 -31
View File
@@ -13,28 +13,22 @@
#include "user-util.h"
static int specifier_prefix_and_instance(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
assert(u);
const Unit *u = ASSERT_PTR(userdata);
return unit_name_to_prefix_and_instance(u->id, ret);
}
static int specifier_prefix(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
assert(u);
const Unit *u = ASSERT_PTR(userdata);
return unit_name_to_prefix(u->id, ret);
}
static int specifier_prefix_unescaped(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
_cleanup_free_ char *p = NULL;
const Unit *u = userdata;
const Unit *u = ASSERT_PTR(userdata);
int r;
assert(u);
r = unit_name_to_prefix(u->id, &p);
if (r < 0)
return r;
@@ -43,21 +37,17 @@ static int specifier_prefix_unescaped(char specifier, const void *data, const ch
}
static int specifier_instance_unescaped(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
assert(u);
const Unit *u = ASSERT_PTR(userdata);
return unit_name_unescape(strempty(u->instance), ret);
}
static int specifier_last_component(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
const Unit *u = ASSERT_PTR(userdata);
_cleanup_free_ char *prefix = NULL;
char *dash;
int r;
assert(u);
r = unit_name_to_prefix(u->id, &prefix);
if (r < 0)
return r;
@@ -82,9 +72,7 @@ static int specifier_last_component_unescaped(char specifier, const void *data,
}
static int specifier_filename(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
assert(u);
const Unit *u = ASSERT_PTR(userdata);
if (u->instance)
return unit_name_path_unescape(u->instance, ret);
@@ -97,11 +85,9 @@ static void bad_specifier(const Unit *u, char specifier) {
}
static int specifier_cgroup(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
const Unit *u = ASSERT_PTR(userdata);
char *n;
assert(u);
bad_specifier(u, specifier);
if (u->cgroup_path)
@@ -116,11 +102,9 @@ static int specifier_cgroup(char specifier, const void *data, const char *root,
}
static int specifier_cgroup_root(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
const Unit *u = ASSERT_PTR(userdata);
char *n;
assert(u);
bad_specifier(u, specifier);
n = strdup(u->manager->cgroup_root);
@@ -132,11 +116,9 @@ static int specifier_cgroup_root(char specifier, const void *data, const char *r
}
static int specifier_cgroup_slice(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata, *slice;
const Unit *u = ASSERT_PTR(userdata), *slice;
char *n;
assert(u);
bad_specifier(u, specifier);
slice = UNIT_GET_SLICE(u);
@@ -155,11 +137,9 @@ static int specifier_cgroup_slice(char specifier, const void *data, const char *
}
static int specifier_special_directory(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
const Unit *u = userdata;
const Unit *u = ASSERT_PTR(userdata);
char *n = NULL;
assert(u);
n = strdup(u->manager->prefix[PTR_TO_UINT(data)]);
if (!n)
return -ENOMEM;
@@ -169,7 +149,6 @@ static int specifier_special_directory(char specifier, const void *data, const c
}
int unit_name_printf(const Unit *u, const char* format, char **ret) {
/*
* This will use the passed string as format string and replace the following specifiers (which should all be
* safe for inclusion in unit names):
@@ -240,6 +219,8 @@ int unit_full_printf_full(const Unit *u, const char *format, size_t max_length,
{ 'P', specifier_prefix_unescaped, NULL },
{ 'f', specifier_filename, NULL },
{ 'y', specifier_real_path, u->fragment_path },
{ 'Y', specifier_real_directory, u->fragment_path },
{ 'c', specifier_cgroup, NULL },
{ 'r', specifier_cgroup_slice, NULL },