From: Andreas Reichel <andreas.reichel....@siemens.com>

Remove duplicate code and refactor functions.

Signed-off-by: Andreas Reichel <andreas.reichel....@siemens.com>
---
 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;
+}
+
+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;
-- 
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 efibootguard-dev+unsubscr...@googlegroups.com.
To post to this group, send email to efibootguard-dev@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/efibootguard-dev/20171122115942.960-3-andreas.reichel.ext%40siemens.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to