On Thu, Nov 23, 2017 at 09:44:04PM +0100, Jan Kiszka wrote:
> 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.
Done.
> 
> 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

-- 
Andreas Reichel
Dipl.-Phys. (Univ.)
Software Consultant

[email protected], +49-174-3180074
TNG Technology Consulting GmbH, Betastr. 13a, 85774 Unterfoehring
Geschaeftsfuehrer: Henrik Klagges, Dr. Robert Dahlke, Gerhard Mueller
Sitz: Unterfoehring * Amtsgericht Muenchen * HRB 135082

-- 
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/20171127120752.GC31085%40iiotirae.
For more options, visit https://groups.google.com/d/optout.

Reply via email to