tree-wide: support a bunch of additional specifiers

This commit is contained in:
Lennart Poettering
2020-04-28 22:47:21 +02:00
parent 76410e9849
commit 268f5a5463
9 changed files with 112 additions and 12 deletions
+48
View File
@@ -9,10 +9,12 @@
#include "sd-id128.h"
#include "alloc-util.h"
#include "architecture.h"
#include "format-util.h"
#include "fs-util.h"
#include "hostname-util.h"
#include "macro.h"
#include "os-util.h"
#include "specifier.h"
#include "string-util.h"
#include "strv.h"
@@ -175,6 +177,52 @@ int specifier_kernel_release(char specifier, const void *data, const void *userd
return 0;
}
int specifier_architecture(char specifier, const void *data, const void *userdata, char **ret) {
char *t;
t = strdup(architecture_to_string(uname_architecture()));
if (!t)
return -ENOMEM;
*ret = t;
return 0;
}
static int specifier_os_release_common(const char *field, char **ret) {
char *t = NULL;
int r;
r = parse_os_release(NULL, field, &t, NULL);
if (r < 0)
return r;
if (!t) {
/* fields in /etc/os-release might quite possibly be missing, even if everything is entirely
* valid otherwise. Let's hence return "" in that case. */
t = strdup("");
if (!t)
return -ENOMEM;
}
*ret = t;
return 0;
}
int specifier_os_id(char specifier, const void *data, const void *userdata, char **ret) {
return specifier_os_release_common("ID", ret);
}
int specifier_os_version_id(char specifier, const void *data, const void *userdata, char **ret) {
return specifier_os_release_common("VERSION_ID", ret);
}
int specifier_os_build_id(char specifier, const void *data, const void *userdata, char **ret) {
return specifier_os_release_common("BUILD_ID", ret);
}
int specifier_os_variant_id(char specifier, const void *data, const void *userdata, char **ret) {
return specifier_os_release_common("VARIANT_ID", ret);
}
int specifier_group_name(char specifier, const void *data, const void *userdata, char **ret) {
char *t;