int env_save(void) { int size; unsigned char *buffer; unsigned char *buffer_end; unsigned char *ptr; queue_t *qb; cfe_envvar_t *env; int namelen; int valuelen; int flg; flg = nvram_open(); if (flg < 0) return flg; nvram_erase(); size = nvram_getsize(); buffer = KMALLOC(size,0); if (buffer == NULL) return CFE_ERR_NOMEM; buffer_end = buffer + size; ptr = buffer; for (qb = env_envvars.q_next; qb != &env_envvars; qb = qb->q_next) { env = (cfe_envvar_t *) qb; if (env->flags & (ENV_FLG_BUILTIN)) continue; namelen = strlen(env->name); valuelen = strlen(env->value); if ((ptr + 2 + namelen + valuelen + 1 + 1 + 1) > buffer_end) break; *ptr++ = ENV_TLV_TYPE_ENV; /* TLV record type */ *ptr++ = (namelen + valuelen + 1 + 1); /* TLV record length */ *ptr++ = (unsigned char)env->flags; memcpy(ptr,env->name,namelen); /* TLV record data */ ptr += namelen; *ptr++ = '='; memcpy(ptr,env->value,valuelen); ptr += valuelen; } *ptr++ = ENV_TLV_TYPE_END; size = nvram_write(buffer,0,ptr-buffer); KFREE(buffer); nvram_close(); return (size == (ptr-buffer)) ? 0 : CFE_ERR_IOERR; }
static retval_t cmd_nvram_erase_all(const subsystem_t *self, frame_t *iframe, frame_t *oframe) { uint32_t key; if (RV_SUCCESS != frame_get_u32(iframe, &key)) return RV_ILLEGAL; if (0x5ABEDA7A != key) return RV_PERM; return nvram_erase(); }