diff options
author | Lennart Poettering <lennart@poettering.net> | 2023-01-03 13:05:32 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2023-01-05 18:24:21 +0100 |
commit | ea575e176aac9fa8f430bb30a3e8abd8da767a10 (patch) | |
tree | e0299499fce39c3b74c9c73d13a941032642ded5 /src/shared/creds-util.c | |
parent | bc0b2d377f4f8cf4dcf29651c8570f93bd52408e (diff) | |
download | systemd-ea575e176aac9fa8f430bb30a3e8abd8da767a10.tar.gz |
vconsole: permit configuration of vconsole settings via credentials
Diffstat (limited to 'src/shared/creds-util.c')
-rw-r--r-- | src/shared/creds-util.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/shared/creds-util.c b/src/shared/creds-util.c index 9f4d0832ab..a68837b70b 100644 --- a/src/shared/creds-util.c +++ b/src/shared/creds-util.c @@ -86,6 +86,56 @@ int read_credential(const char *name, void **ret, size_t *ret_size) { (char**) ret, ret_size); } +int read_credential_strings_many_internal( + const char *first_name, char **first_value, + ...) { + + _cleanup_free_ void *b = NULL; + int r, ret = 0; + + /* Reads a bunch of credentials into the specified buffers. If the specified buffers are already + * non-NULL frees them if a credential is found. Only supports string-based credentials + * (i.e. refuses embedded NUL bytes) */ + + if (!first_name) + return 0; + + r = read_credential(first_name, &b, NULL); + if (r == -ENXIO) /* no creds passed at all? propagate this */ + return r; + if (r < 0) + ret = r; + else + free_and_replace(*first_value, b); + + va_list ap; + va_start(ap, first_value); + + for (;;) { + _cleanup_free_ void *bb = NULL; + const char *name; + char **value; + + name = va_arg(ap, const char *); + if (!name) + break; + + value = va_arg(ap, char **); + if (*value) + continue; + + r = read_credential(name, &bb, NULL); + if (r < 0) { + if (ret >= 0) + ret = r; + } else + free_and_replace(*value, bb); + } + + va_end(ap); + return ret; +} + int get_credential_user_password(const char *username, char **ret_password, bool *ret_is_hashed) { _cleanup_(erase_and_freep) char *creds_password = NULL; _cleanup_free_ char *cn = NULL; |