Diff for /embedtools/src/ub_env.c between versions 1.1.2.10 and 1.1.2.14

version 1.1.2.10, 2014/01/29 01:40:35 version 1.1.2.14, 2014/01/29 13:46:16
Line 4 Line 4
   
 env_t *env;  env_t *env;
   
   
 static int  static int
 ub_flash_io(const char *csSec, int mode)  ub_flash_io(const char *csSec, int mode)
 {  {
         int f, l, rlen;          int f, l, rlen;
         const char *str;          const char *str;
        size_t siz;        ssize_t siz, esiz;
         ait_val_t v;          ait_val_t v;
           u_int crc;
   
         FTRACE(4);          FTRACE(4);
   
        str = cfg_getAttribute(&cfg, csSec, "size");        str = cfg_getAttribute(&cfg, csSec, "drive_size");
         siz = strtol(str, NULL, 0);          siz = strtol(str, NULL, 0);
         if (!siz)          if (!siz)
                 return -1;                  return -1;
        str = cfg_getAttribute(&cfg, csSec, "drive");        str = cfg_getAttribute(&cfg, csSec, "env_size");
         if (!str)
                 esiz = siz - sizeof env->env_crc;
         else
                 esiz = strtol(str, NULL, 0);
         str = cfg_getAttribute(&cfg, csSec, "drive_name");
         if (!str) {          if (!str) {
                 printf("Error:: drive not found!\n");                  printf("Error:: drive not found!\n");
                 return -1;                  return -1;
Line 43  ub_flash_io(const char *csSec, int mode) Line 48  ub_flash_io(const char *csSec, int mode)
         }          }
   
         if (mode & O_RDWR) {          if (mode & O_RDWR) {
                   env->env_crc = crc32(0, (u_char*) env->env_data, esiz);
                 rlen = write(f, env, siz);                  rlen = write(f, env, siz);
                 if (rlen != siz)                  if (rlen != siz)
                         printf("Error:: written %d bytes != %d\n", rlen, siz);                          printf("Error:: written %d bytes != %d\n", rlen, siz);
Line 57  ub_flash_io(const char *csSec, int mode) Line 63  ub_flash_io(const char *csSec, int mode)
         else          else
                 VERB(3) printf("Readed %d bytes\n", rlen);                  VERB(3) printf("Readed %d bytes\n", rlen);
   
           crc = crc32(0, (u_char*) env->env_data, esiz);
           if (crc != env->env_crc)
                   VERB(1) printf("Warning:: Bad CRC, Flash crc32 0x%x != 0x%x\n", 
                                   env->env_crc, crc);
   
         close(f);          close(f);
         close(l);          close(l);
         unlink(AIT_GET_STR(&v));          unlink(AIT_GET_STR(&v));
Line 67  ub_flash_io(const char *csSec, int mode) Line 78  ub_flash_io(const char *csSec, int mode)
 static inline const char *  static inline const char *
 ub_envmatch(const char *csName, const char *e)  ub_envmatch(const char *csName, const char *e)
 {  {
         const char *str = NULL;  
   
         while (*csName == *e++)          while (*csName == *e++)
                 if (*csName++ == '=')                  if (*csName++ == '=')
                         return e;                          return e;
Line 86  ub_load(const char *csSec) Line 95  ub_load(const char *csSec)
   
         FTRACE(4);          FTRACE(4);
   
        str = cfg_getAttribute(&cfg, csSec, "size");        str = cfg_getAttribute(&cfg, csSec, "drive_size");
         siz = strtol(str, NULL, 0);          siz = strtol(str, NULL, 0);
         if (!siz)          if (!siz)
                 return -1;                  return -1;
Line 113  const char* Line 122  const char*
 ub_getenv(const char *csSec, const char *csName)  ub_getenv(const char *csSec, const char *csName)
 {  {
         char *e, *nxt;          char *e, *nxt;
        size_t dlen;        size_t dlen = 0;
         const char *str = NULL;          const char *str = NULL;
   
   
         FTRACE(3);          FTRACE(3);
   
        str = cfg_getAttribute(&cfg, csSec, "size");        str = cfg_getAttribute(&cfg, csSec, "env_size");
        dlen = strtol(str, NULL, 0);        if (!str) {
                 str = cfg_getAttribute(&cfg, csSec, "drive_size");
                 if (!str)
                         return NULL;
                 dlen -= sizeof env->env_crc;
         }
         dlen += strtol(str, NULL, 0);
         if (!dlen)          if (!dlen)
                 return NULL;                  return NULL;
         else          else
Line 144  ub_getenv(const char *csSec, const char *csName) Line 158  ub_getenv(const char *csSec, const char *csName)
 int  int
 ub_setenv(const char *csSec, const char *csName, const char *csValue)  ub_setenv(const char *csSec, const char *csName, const char *csValue)
 {  {
           char *e, *nxt;
           ssize_t dlen = 0, len;
           const char *str, *old = NULL;
   
         FTRACE(3);          FTRACE(3);
   
           str = cfg_getAttribute(&cfg, csSec, "env_size");
           if (!str) {
                   str = cfg_getAttribute(&cfg, csSec, "drive_size");
                   if (!str)
                           return -1;
                   dlen -= sizeof env->env_crc;
           }
           dlen += strtol(str, NULL, 0);
           if (!dlen)
                   return -1;
           else
                   dlen--;
   
           for (e = env->env_data; *e; e = nxt + 1) {
                   for (nxt = e; *nxt; nxt++)
                           if (nxt >= env->env_data + dlen) {
                                   printf("Error:: environment not terminated\n");
                                   return -1;
                           }
   
                   old = ub_envmatch(csName, e);
                   if (old)
                           break;
           }
   
           /* Delete any existing definition */
           if (old) {
                   if (!*++nxt)
                           *e = 0;
                   else
                           while (42) {
                                   *e = *nxt++;
                                   if (!*e && !*nxt)
                                           break;
                                   e++;
                           }
                   *++e = 0;
           }
   
           if (csValue) {
                   /* Append new definition at the end */
                   for (e = env->env_data; *e || *(e + 1); e++);
                   if (e > env->env_data)
                           e++;
                   /* "name" + "=" + "val" +"\0\0"  > u-boot-env size */
                   len = strlen(csName) + 2; /* add '=' for first arg, ' ' for all others */
                   len += strlen(csValue) + 1;
                   if (len > env->env_data + dlen - e) {
                           printf("Error:: Environment overflow!\n");
                           return -1;
                   }
   
                   /* av pair */
                   while ((*e = *csName++))
                           e++;
                   *e = '=';
                   while ((*++e = *csValue++));
   
                   /* end is marked with double '\0' */
                   *++e = 0;
           }
   
           if (ub_flash_io(csSec, O_RDWR)) {
                   printf("Error:: Can't write environment to flash!\n");
                   return -1;
           }
   
         return 0;          return 0;
 }  }
   
Line 153  int Line 238  int
 ub_env(const char *csSec)  ub_env(const char *csSec)
 {  {
         char *e, *nxt;          char *e, *nxt;
        size_t dlen;        ssize_t dlen = 0;
         const char *str;          const char *str;
   
         FTRACE(3);          FTRACE(3);
   
        str = cfg_getAttribute(&cfg, csSec, "size");        str = cfg_getAttribute(&cfg, csSec, "env_size");
        dlen = strtol(str, NULL, 0);        if (!str) {
                 str = cfg_getAttribute(&cfg, csSec, "drive_size");
                 if (!str)
                         return -1;
                 dlen -= sizeof env->env_crc;
         }
         dlen += strtol(str, NULL, 0);
         if (!dlen)          if (!dlen)
                 return -1;                  return -1;
         else          else

Removed from v.1.1.2.10  
changed lines
  Added in v.1.1.2.14


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>