diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-10-22 19:58:26 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-11-16 15:52:22 +0100 |
commit | cea72d53f89131e8c60679eeef6644ed5720156d (patch) | |
tree | 504fce2aa32cc77e3ad479d29333076344984e9a /src/shared/efivars.c | |
parent | c57ed5735fd59ac8dc643c04cb4c1cfbb311b316 (diff) | |
download | systemd-cea72d53f89131e8c60679eeef6644ed5720156d.tar.gz |
efivars: add new helper efi_set_variable_string()
Let's make it easier to parse an UTF-16 string properly.
Diffstat (limited to 'src/shared/efivars.c')
-rw-r--r-- | src/shared/efivars.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/src/shared/efivars.c b/src/shared/efivars.c index e536f0d94e..360ef03400 100644 --- a/src/shared/efivars.c +++ b/src/shared/efivars.c @@ -246,6 +246,24 @@ int efi_get_variable( return 0; } +int efi_get_variable_string(sd_id128_t vendor, const char *name, char **p) { + _cleanup_free_ void *s = NULL; + size_t ss = 0; + int r; + char *x; + + r = efi_get_variable(vendor, name, NULL, &s, &ss); + if (r < 0) + return r; + + x = utf16_to_utf8(s, ss); + if (!x) + return -ENOMEM; + + *p = x; + return 0; +} + int efi_set_variable( sd_id128_t vendor, const char *name, @@ -326,22 +344,14 @@ finish: return r; } -int efi_get_variable_string(sd_id128_t vendor, const char *name, char **p) { - _cleanup_free_ void *s = NULL; - size_t ss = 0; - int r; - char *x; +int efi_set_variable_string(sd_id128_t vendor, const char *name, const char *v) { + _cleanup_free_ char16_t *u16 = NULL; - r = efi_get_variable(vendor, name, NULL, &s, &ss); - if (r < 0) - return r; - - x = utf16_to_utf8(s, ss); - if (!x) + u16 = utf8_to_utf16(v, strlen(v)); + if (!u16) return -ENOMEM; - *p = x; - return 0; + return efi_set_variable(vendor, name, u16, (char16_strlen(u16) + 1) * sizeof(char16_t)); } static size_t utf16_size(const uint16_t *s) { |