From: Andreas Reichel <[email protected]> Remove duplicate code and refactor functions.
Signed-off-by: Andreas Reichel <[email protected]> --- env/env_api_fat.c | 162 +++++++++++++++++++++++++----------------------------- 1 file changed, 75 insertions(+), 87 deletions(-) diff --git a/env/env_api_fat.c b/env/env_api_fat.c index 89eb3f0..8636922 100644 --- a/env/env_api_fat.c +++ b/env/env_api_fat.c @@ -239,6 +239,36 @@ bool bgenv_close(BGENV *env) return false; } +static int bgenv_get_uint(char *buffer, uint64_t *type, void *data, + unsigned int src, uint64_t t) +{ + int res; + + res = sprintf(buffer, "%u", src); + if (!data) { + return res+1; + } + strncpy(data, buffer, res+1); + if (type) { + *type = t; + } + return 0; +} + +static int bgenv_get_string(char *buffer, uint64_t *type, void *data, + wchar_t *srcstr) +{ + str16to8(buffer, srcstr); + if (!data) { + return strlen(buffer)+1; + } + strncpy(data, buffer, strlen(buffer)+1); + if (type) { + *type = USERVAR_TYPE_STRING_ASCII; + } + return 0; +} + int bgenv_get(BGENV *env, char *key, uint64_t *type, void *data, uint32_t maxlen) { @@ -265,72 +295,50 @@ int bgenv_get(BGENV *env, char *key, uint64_t *type, void *data, } switch (e) { case EBGENV_KERNELFILE: - str16to8(buffer, env->data->kernelfile); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_STRING_ASCII; - } - break; + return bgenv_get_string(buffer, type, data, + env->data->kernelfile); case EBGENV_KERNELPARAMS: - str16to8(buffer, env->data->kernelparams); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_STRING_ASCII; - } - break; + return bgenv_get_string(buffer, type, data, + env->data->kernelparams); case EBGENV_WATCHDOG_TIMEOUT_SEC: - sprintf(buffer, "%u", env->data->watchdog_timeout_sec); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_UINT16; - } - break; + return bgenv_get_uint(buffer, type, data, + env->data->watchdog_timeout_sec, + USERVAR_TYPE_UINT16); case EBGENV_REVISION: - sprintf(buffer, "%u", env->data->revision); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_UINT16; - } - break; + return bgenv_get_uint(buffer, type, data, + env->data->revision, + USERVAR_TYPE_UINT16); case EBGENV_USTATE: - sprintf(buffer, "%u", env->data->ustate); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_UINT16; - } - break; + return bgenv_get_uint(buffer, type, data, + env->data->ustate, + USERVAR_TYPE_UINT16); case EBGENV_IN_PROGRESS: - sprintf(buffer, "%u", env->data->in_progress); - if (!data) { - return strlen(buffer)+1; - } - strncpy(data, buffer, strlen(buffer)+1); - if (type) { - *type = USERVAR_TYPE_UINT8; - } - break; + return bgenv_get_uint(buffer, type, data, + env->data->in_progress, + USERVAR_TYPE_UINT8); default: if (!data) { return 0; } return -EINVAL; } - return 0; +} + +static long bgenv_convert_to_long(char *value) +{ + long val; + char *p; + + errno = 0; + val = strtol(value, &p, 10); + if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || + (errno != 0 && val == 0)) { + return -errno; + } + if (p == value) { + return -EINVAL; + } + return val; } int bgenv_set(BGENV *env, char *key, uint64_t type, void *data, @@ -355,14 +363,9 @@ int bgenv_set(BGENV *env, char *key, uint64_t type, void *data, } switch (e) { case EBGENV_REVISION: - errno = 0; - val = strtol(value, &p, 10); - if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || - (errno != 0 && val == 0)) { - return -errno; - } - if (p == value) { - return -EINVAL; + val = bgenv_convert_to_long(value); + if (val < 0) { + return val; } env->data->revision = val; break; @@ -373,38 +376,23 @@ int bgenv_set(BGENV *env, char *key, uint64_t type, void *data, str8to16(env->data->kernelparams, value); break; case EBGENV_WATCHDOG_TIMEOUT_SEC: - errno = 0; - val = strtol(value, &p, 10); - if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || - (errno != 0 && val == 0)) { - return -errno; - } - if (p == value) { - return -EINVAL; + val = bgenv_convert_to_long(value); + if (val < 0) { + return val; } env->data->watchdog_timeout_sec = val; break; case EBGENV_USTATE: - errno = 0; - val = strtol(value, &p, 10); - if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || - (errno != 0 && val == 0)) { - return -errno; - } - if (p == value) { - return -EINVAL; + val = bgenv_convert_to_long(value); + if (val < 0) { + return val; } env->data->ustate = val; break; case EBGENV_IN_PROGRESS: - errno = 0; - val = strtol(value, &p, 10); - if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || - (errno != 0 && val == 0)) { - return -errno; - } - if (p == value) { - return -EINVAL; + val = bgenv_convert_to_long(value); + if (val < 0) { + return val; } env->data->in_progress = val; break; -- 2.15.0 -- You received this message because you are subscribed to the Google Groups "EFI Boot Guard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/efibootguard-dev/20171127121430.31448-3-andreas.reichel.ext%40siemens.com. For more options, visit https://groups.google.com/d/optout.
