On 2017-11-22 12:59, Andreas J. Reichel wrote:
> From: Andreas Reichel <[email protected]>
>
> Remove duplicate code and refactor functions.
>
> Signed-off-by: Andreas Reichel <[email protected]>
> ---
> env/env_api_fat.c | 153
> ++++++++++++++++++++++++------------------------------
> 1 file changed, 67 insertions(+), 86 deletions(-)
>
> diff --git a/env/env_api_fat.c b/env/env_api_fat.c
> index 89eb3f0..471084a 100644
> --- a/env/env_api_fat.c
> +++ b/env/env_api_fat.c
> @@ -243,6 +243,9 @@ int bgenv_get(BGENV *env, char *key, uint64_t *type, void
> *data,
> uint32_t maxlen)
> {
> EBGENVKEY e;
> + unsigned int src;
> + uint64_t t;
> + wchar_t *srcstr;
> char buffer[ENV_STRING_LENGTH];
>
> if (!key || maxlen == 0) {
> @@ -265,72 +268,70 @@ 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;
> + srcstr = env->data->kernelfile;
> + goto bgenv_get_string;
> 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;
> + srcstr = env->data->kernelparams;
> + goto bgenv_get_string;
> 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;
> + t = USERVAR_TYPE_UINT16;
> + src = env->data->watchdog_timeout_sec;
> + goto bgenv_get_uint;
> 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;
> + t = USERVAR_TYPE_UINT16;
> + src = env->data->revision;
> + goto bgenv_get_uint;
> 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;
> + t = USERVAR_TYPE_UINT16;
> + src = env->data->ustate;
> + goto bgenv_get_uint;
> 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;
> + t = USERVAR_TYPE_UINT8;
> + src = env->data->in_progress;
> + goto bgenv_get_uint;
> default:
> if (!data) {
> return 0;
> }
> return -EINVAL;
> }
> +bgenv_get_uint:
> + sprintf(buffer, "%u", src);
> + if (!data) {
> + return strlen(buffer)+1;
> + }
> + strncpy(data, buffer, strlen(buffer)+1);
> + if (type) {
> + *type = t;
> + }
> return 0;
> +bgenv_get_string:
> + str16to8(buffer, srcstr);
> + if (!data) {
> + return strlen(buffer)+1;
> + }
> + strncpy(data, buffer, strlen(buffer)+1);
> + if (type) {
> + *type = USERVAR_TYPE_STRING_ASCII;
> + }
> + return 0;
goto is fine for some cases, but this one screams for using helper
functions instead. Just like you do below.
Jan
> +}
> +
> +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 +356,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 +369,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;
>
--
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux
--
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/e92af849-dfe0-4931-fa8a-a596554b4564%40siemens.com.
For more options, visit https://groups.google.com/d/optout.