/* Initialize hash table. Should be locked. */ int BCMINITFN(_nvram_init)(void *sih) { struct nvram_header *header; int ret; if (!(header = (struct nvram_header *) MALLOC(si_osh(sih), NVRAM_SPACE))) { printf("nvram_init: out of memory\n"); return -12; /* -ENOMEM */ } #if 0 if ((ret = _nvram_read(header)) == 0 && header->magic == NVRAM_MAGIC) nvram_rehash(header); #else // nvram_rehash - may corrupt correct header _nvram_read(header); if (header->magic != NVRAM_MAGIC) nvram_rehash(header); #endif MFREE(si_osh(sih), header, NVRAM_SPACE); return ret; }
/* Initialize hash table. Should be locked. */ int _nvram_init(void) { struct nvram_header *header; int ret; if (!(header = (struct nvram_header *)MALLOC(NVRAM_SPACE))) { printk(KERN_INFO "nvram_init: out of memory\n"); return -12; /* -ENOMEM */ } if ((ret = _nvram_read(header)) == 0 && header->magic == NVRAM_MAGIC) nvram_rehash(header); MFREE(header, NVRAM_SPACE); return ret; }
char* cfe_env_get(unsigned char *nv_buf, char* name) { int size; unsigned char *buffer; unsigned char *ptr; unsigned char *envval; unsigned int reclen; unsigned int rectype; int offset; int flg; size = NVRAM_SIZE; buffer = &_nvdata[0]; ptr = buffer; offset = 0; /* Read the record type and length */ if (_nvram_read(nv_buf, ptr,offset,1) != 1) { goto error; } while ((*ptr != ENV_TLV_TYPE_END) && (size > 1)) { /* Adjust pointer for TLV type */ rectype = *(ptr); offset++; size--; /* * Read the length. It can be either 1 or 2 bytes * depending on the code */ if (rectype & ENV_LENGTH_8BITS) { /* Read the record type and length - 8 bits */ if (_nvram_read(nv_buf, ptr,offset,1) != 1) { goto error; } reclen = *(ptr); size--; offset++; } else { /* Read the record type and length - 16 bits, MSB first */ if (_nvram_read(nv_buf, ptr,offset,2) != 2) { goto error; } reclen = (((unsigned int) *(ptr)) << 8) + (unsigned int) *(ptr+1); size -= 2; offset += 2; } if (reclen > size) break; /* should not happen, bad NVRAM */ switch (rectype) { case ENV_TLV_TYPE_ENV: /* Read the TLV data */ if (_nvram_read(nv_buf, ptr,offset,reclen) != reclen) goto error; flg = *ptr++; envval = (unsigned char *) _strnchr(ptr,'=',(reclen-1)); if (envval) { *envval++ = '\0'; memcpy(_valuestr,envval,(reclen-1)-(envval-ptr)); _valuestr[(reclen-1)-(envval-ptr)] = '\0'; #if 0 printk(KERN_INFO "NVRAM:%s=%s\n", ptr, _valuestr); #endif if(!strcmp(ptr, name)){ return _valuestr; } if((strlen(ptr) > 1) && !strcmp(&ptr[1], name)) return _valuestr; } break; default: /* Unknown TLV type, skip it. */ break; } /* * Advance to next TLV */ size -= (int)reclen; offset += reclen; /* Read the next record type */ ptr = buffer; if (_nvram_read(nv_buf, ptr,offset,1) != 1) goto error; } error: return NULL; }