Annotation of embedtools/src/ub_env.c, revision 1.1.2.16

1.1.2.1   misho       1: #include "global.h"
                      2: #include "ub_env.h"
                      3: 
                      4: 
1.1.2.4   misho       5: env_t *env;
                      6: 
1.1.2.3   misho       7: static int
1.1.2.5   misho       8: ub_flash_io(const char *csSec, int mode)
1.1.2.3   misho       9: {
1.1.2.7   misho      10:        int f, l, rlen;
1.1.2.5   misho      11:        const char *str;
1.1.2.14  misho      12:        ssize_t siz, esiz;
1.1.2.7   misho      13:        ait_val_t v;
1.1.2.12  misho      14:        u_int crc;
1.1.2.3   misho      15: 
                     16:        FTRACE(4);
                     17: 
1.1.2.12  misho      18:        str = cfg_getAttribute(&cfg, csSec, "drive_size");
1.1.2.6   misho      19:        siz = strtol(str, NULL, 0);
                     20:        if (!siz)
                     21:                return -1;
1.1.2.12  misho      22:        str = cfg_getAttribute(&cfg, csSec, "env_size");
                     23:        if (!str)
                     24:                esiz = siz - sizeof env->env_crc;
                     25:        else
                     26:                esiz = strtol(str, NULL, 0);
                     27:        str = cfg_getAttribute(&cfg, csSec, "drive_name");
1.1.2.5   misho      28:        if (!str) {
                     29:                printf("Error:: drive not found!\n");
                     30:                return -1;
                     31:        }
                     32: 
1.1.2.7   misho      33:        cfg_loadAttribute(&cfg, "ube", "lock", &v, UBE_LOCK);
1.1.2.8   misho      34:        l = open(AIT_GET_STR(&v), O_CREAT | O_EXCL | O_WRONLY, 0644);
1.1.2.7   misho      35:        if (l == -1) {
1.1.2.8   misho      36:                printf("Error:: Locked u-boot-env map %s\n", AIT_GET_STR(&v));
1.1.2.7   misho      37:                AIT_FREE_VAL(&v);
                     38:                return -1;
                     39:        }
                     40: 
1.1.2.5   misho      41:        f = open(str, mode);
1.1.2.3   misho      42:        if (f == -1) {
1.1.2.5   misho      43:                printf("Error:: Can't access u-boot-env device %s\n", str);
1.1.2.7   misho      44:                close(l);
                     45:                unlink(AIT_GET_STR(&v));
                     46:                AIT_FREE_VAL(&v);
1.1.2.3   misho      47:                return -1;
                     48:        }
                     49: 
                     50:        if (mode & O_RDWR) {
1.1.2.13  misho      51:                env->env_crc = crc32(0, (u_char*) env->env_data, esiz);
1.1.2.16! misho      52:                VERB(5) printf("Write CRC32 0x%x\n", env->env_crc);
1.1.2.6   misho      53:                rlen = write(f, env, siz);
                     54:                if (rlen != siz)
                     55:                        printf("Error:: written %d bytes != %d\n", rlen, siz);
                     56:                else
                     57:                        VERB(3) printf("Written %d bytes\n", rlen);
                     58:                lseek(f, 0, SEEK_SET);
1.1.2.3   misho      59:        }
                     60: 
1.1.2.6   misho      61:        rlen = read(f, env, siz);
                     62:        if (rlen != siz)
                     63:                printf("Error:: readed %d bytes != %d\n", rlen, siz);
                     64:        else
                     65:                VERB(3) printf("Readed %d bytes\n", rlen);
                     66: 
1.1.2.12  misho      67:        crc = crc32(0, (u_char*) env->env_data, esiz);
1.1.2.16! misho      68:        VERB(5) printf("Calculated CRC32 0x%x\n", crc);
1.1.2.12  misho      69:        if (crc != env->env_crc)
1.1.2.13  misho      70:                VERB(1) printf("Warning:: Bad CRC, Flash crc32 0x%x != 0x%x\n", 
                     71:                                env->env_crc, crc);
1.1.2.12  misho      72: 
1.1.2.3   misho      73:        close(f);
1.1.2.7   misho      74:        close(l);
                     75:        unlink(AIT_GET_STR(&v));
                     76:        AIT_FREE_VAL(&v);
                     77:        return 0;
1.1.2.3   misho      78: }
                     79: 
1.1.2.10  misho      80: static inline const char *
                     81: ub_envmatch(const char *csName, const char *e)
                     82: {
                     83:        while (*csName == *e++)
                     84:                if (*csName++ == '=')
                     85:                        return e;
                     86:        if (!*csName && *(e - 1) == '=')
                     87:                return e;
                     88: 
                     89:        return NULL;
                     90: }
                     91: 
1.1.2.4   misho      92: int
                     93: ub_load(const char *csSec)
                     94: {
                     95:        const char *str;
                     96:        size_t siz;
                     97: 
1.1.2.5   misho      98:        FTRACE(4);
                     99: 
1.1.2.12  misho     100:        str = cfg_getAttribute(&cfg, csSec, "drive_size");
1.1.2.4   misho     101:        siz = strtol(str, NULL, 0);
                    102:        if (!siz)
                    103:                return -1;
                    104: 
                    105:        env = e_malloc(siz);
                    106:        if (!env) {
                    107:                ELIBERR(elwix);
                    108:                return -1;
                    109:        }
                    110: 
1.1.2.7   misho     111:        return ub_flash_io(csSec, O_RDONLY);
1.1.2.4   misho     112: }
                    113: 
                    114: void
                    115: ub_unload()
                    116: {
1.1.2.5   misho     117:        FTRACE(4);
                    118: 
1.1.2.4   misho     119:        if (env)
                    120:                e_free(env);
                    121: }
                    122: 
1.1.2.2   misho     123: const char*
1.1.2.5   misho     124: ub_getenv(const char *csSec, const char *csName)
1.1.2.2   misho     125: {
1.1.2.10  misho     126:        char *e, *nxt;
1.1.2.14  misho     127:        size_t dlen = 0;
1.1.2.2   misho     128:        const char *str = NULL;
                    129: 
1.1.2.3   misho     130:        FTRACE(3);
                    131: 
1.1.2.12  misho     132:        str = cfg_getAttribute(&cfg, csSec, "env_size");
                    133:        if (!str) {
                    134:                str = cfg_getAttribute(&cfg, csSec, "drive_size");
                    135:                if (!str)
1.1.2.13  misho     136:                        return NULL;
1.1.2.14  misho     137:                dlen -= sizeof env->env_crc;
1.1.2.12  misho     138:        }
1.1.2.14  misho     139:        dlen += strtol(str, NULL, 0);
1.1.2.10  misho     140:        if (!dlen)
                    141:                return NULL;
                    142:        else
                    143:                dlen--;
                    144: 
                    145:        for (e = env->env_data; *e; e = nxt + 1) {
                    146:                for (nxt = e; *nxt; nxt++)
                    147:                        if (nxt >= env->env_data + dlen) {
                    148:                                printf("Error:: environment not terminated\n");
                    149:                                return NULL;
                    150:                        }
                    151: 
                    152:                str = ub_envmatch(csName, e);
                    153:                if (str)
                    154:                        break;
                    155:        }
                    156: 
1.1.2.2   misho     157:        return str;
                    158: }
                    159: 
                    160: int
1.1.2.5   misho     161: ub_setenv(const char *csSec, const char *csName, const char *csValue)
1.1.2.2   misho     162: {
1.1.2.11  misho     163:        char *e, *nxt;
1.1.2.14  misho     164:        ssize_t dlen = 0, len;
1.1.2.11  misho     165:        const char *str, *old = NULL;
                    166: 
1.1.2.3   misho     167:        FTRACE(3);
                    168: 
1.1.2.12  misho     169:        str = cfg_getAttribute(&cfg, csSec, "env_size");
                    170:        if (!str) {
                    171:                str = cfg_getAttribute(&cfg, csSec, "drive_size");
                    172:                if (!str)
                    173:                        return -1;
1.1.2.14  misho     174:                dlen -= sizeof env->env_crc;
1.1.2.12  misho     175:        }
1.1.2.14  misho     176:        dlen += strtol(str, NULL, 0);
1.1.2.11  misho     177:        if (!dlen)
                    178:                return -1;
                    179:        else
                    180:                dlen--;
                    181: 
                    182:        for (e = env->env_data; *e; e = nxt + 1) {
                    183:                for (nxt = e; *nxt; nxt++)
                    184:                        if (nxt >= env->env_data + dlen) {
                    185:                                printf("Error:: environment not terminated\n");
                    186:                                return -1;
                    187:                        }
                    188: 
                    189:                old = ub_envmatch(csName, e);
                    190:                if (old)
                    191:                        break;
                    192:        }
                    193: 
                    194:        /* Delete any existing definition */
                    195:        if (old) {
                    196:                if (!*++nxt)
                    197:                        *e = 0;
                    198:                else
                    199:                        while (42) {
                    200:                                *e = *nxt++;
                    201:                                if (!*e && !*nxt)
                    202:                                        break;
                    203:                                e++;
                    204:                        }
                    205:                *++e = 0;
                    206:        }
                    207: 
                    208:        if (csValue) {
                    209:                /* Append new definition at the end */
                    210:                for (e = env->env_data; *e || *(e + 1); e++);
                    211:                if (e > env->env_data)
                    212:                        e++;
1.1.2.15  misho     213:                /* "name" + "=" + "val" +"\0\0" check u-boot-env size */
1.1.2.11  misho     214:                len = strlen(csName) + 2; /* add '=' for first arg, ' ' for all others */
                    215:                len += strlen(csValue) + 1;
                    216:                if (len > env->env_data + dlen - e) {
                    217:                        printf("Error:: Environment overflow!\n");
                    218:                        return -1;
                    219:                }
                    220: 
                    221:                /* av pair */
                    222:                while ((*e = *csName++))
                    223:                        e++;
                    224:                *e = '=';
                    225:                while ((*++e = *csValue++));
                    226: 
                    227:                /* end is marked with double '\0' */
                    228:                *++e = 0;
                    229:        }
                    230: 
                    231:        if (ub_flash_io(csSec, O_RDWR)) {
                    232:                printf("Error:: Can't write environment to flash!\n");
                    233:                return -1;
                    234:        }
                    235: 
1.1.2.2   misho     236:        return 0;
                    237: }
1.1.2.9   misho     238: 
                    239: int
                    240: ub_env(const char *csSec)
                    241: {
                    242:        char *e, *nxt;
1.1.2.14  misho     243:        ssize_t dlen = 0;
1.1.2.9   misho     244:        const char *str;
                    245: 
                    246:        FTRACE(3);
                    247: 
1.1.2.12  misho     248:        str = cfg_getAttribute(&cfg, csSec, "env_size");
                    249:        if (!str) {
                    250:                str = cfg_getAttribute(&cfg, csSec, "drive_size");
                    251:                if (!str)
                    252:                        return -1;
1.1.2.14  misho     253:                dlen -= sizeof env->env_crc;
1.1.2.12  misho     254:        }
1.1.2.14  misho     255:        dlen += strtol(str, NULL, 0);
1.1.2.9   misho     256:        if (!dlen)
                    257:                return -1;
                    258:        else
                    259:                dlen--;
                    260: 
                    261:        for (e = env->env_data; *e; e = nxt + 1) {
                    262:                for (nxt = e; *nxt; nxt++)
                    263:                        if (nxt >= env->env_data + dlen) {
                    264:                                printf("Error:: environment not terminated\n");
                    265:                                return -1;
                    266:                        }
                    267: 
                    268:                printf("%s\n", e);
                    269:        }
                    270: 
                    271:        return 0;
                    272: }

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