Changeset 4439

Show
Ignore:
Timestamp:
04/25/09 00:38:45 (4 years ago)
Author:
jow
Message:

contrib/userspace-nvram:

  • fix checksum calculation
  • better handle invalid cli invokation
  • get rid of hard coded erase size
  • fix data type of crc8 function
Location:
luci/trunk/contrib/userspace-nvram
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • luci/trunk/contrib/userspace-nvram/cli.c

    r4438 r4439  
    9090    int write = 0; 
    9191    int stat = 1; 
     92    int done = 0; 
    9293    int i; 
    9394 
     
    103104 
    104105 
    105     if( (nvram = write ? nvram_open_staging() : nvram_open_rdonly()) != NULL ) 
     106    if( (nvram = write ? nvram_open_staging() : nvram_open_rdonly()) != NULL && argc > 1 ) 
    106107    { 
    107108        for( i = 1; i < argc; i++ ) 
     
    110111            { 
    111112                stat = do_show(nvram); 
     113                done++; 
    112114            } 
    113115            else if( !strcmp(argv[i], "get") && ++i < argc ) 
    114116            { 
    115117                stat = do_get(nvram, argv[i]); 
     118                done++; 
    116119            } 
    117120            else if( !strcmp(argv[i], "unset") && ++i < argc ) 
    118121            { 
    119122                stat = do_unset(nvram, argv[i]); 
     123                done++; 
    120124            } 
    121125            else if( !strcmp(argv[i], "set") && ++i < argc ) 
    122126            { 
    123127                stat = do_set(nvram, argv[i]); 
     128                done++; 
    124129            } 
    125130            else if( !strcmp(argv[i], "commit") ) 
    126131            { 
    127132                commit = 1; 
     133                done++; 
    128134            } 
    129135            else 
    130136            { 
    131                 fprintf(stderr, 
    132                     "Usage:\n" 
    133                     "   nvram show\n" 
    134                     "   nvram get variable\n" 
    135                     "   nvram set variable=value [set ...]\n" 
    136                     "   nvram unset variable [unset ...]\n" 
    137                     "   nvram commit\n" 
    138                 ); 
    139  
    140                 return 1; 
     137                done = 0; 
     138                break; 
    141139            } 
    142140        } 
     
    151149    } 
    152150 
     151    if( !nvram ) 
     152    { 
     153        fprintf(stderr, 
     154            "Could not open nvram! Possible reasons are:\n" 
     155            "   - No device found (/proc not mounted or no nvram present)\n" 
     156            "   - Insufficient permissions to open mtd device\n" 
     157            "   - Insufficient memory to complete operation\n" 
     158            "   - Memory mapping failed or not supported\n" 
     159        ); 
     160 
     161        stat = 1; 
     162    } 
     163    else if( !done ) 
     164    { 
     165        fprintf(stderr, 
     166            "Usage:\n" 
     167            "   nvram show\n" 
     168            "   nvram get variable\n" 
     169            "   nvram set variable=value [set ...]\n" 
     170            "   nvram unset variable [unset ...]\n" 
     171            "   nvram commit\n" 
     172        ); 
     173 
     174        stat = 1; 
     175    } 
     176 
    153177    return stat; 
    154178} 
  • luci/trunk/contrib/userspace-nvram/crc.c

    r4438 r4439  
    5959 
    6060uint8_t hndcrc8 ( 
    61     uint8_t * pdata,  /* pointer to array of data to process */ 
     61    const char * pdata,  /* pointer to array of data to process */ 
    6262    uint32_t nbytes,  /* number of input data bytes to process */ 
    6363    uint8_t crc       /* either CRC8_INIT_VALUE or previous return value */ 
  • luci/trunk/contrib/userspace-nvram/nvram.c

    r4438 r4439  
    1515#include "nvram.h" 
    1616 
    17 #define TRACE() \ 
    18     printf("%s(%i) in %s()\n", \ 
    19         __FILE__, __LINE__, __FUNCTION__) 
     17#define TRACE(msg) \ 
     18    printf("%s(%i) in %s(): %s\n", \ 
     19        __FILE__, __LINE__, __FUNCTION__, msg ? msg : "?") 
     20 
     21size_t nvram_erase_size = 0; 
     22 
    2023 
    2124/* 
     
    9295static int _nvram_rehash(nvram_handle_t *h) 
    9396{ 
    94     nvram_header_t *header = (nvram_header_t *) &h->mmap[NVRAM_SPACE]; 
    95     char buf[] = "0xXXXXXXXX", *name, *value, *end, *eq; 
     97    nvram_header_t *header = (nvram_header_t *) &h->mmap[NVRAM_START(nvram_erase_size)]; 
     98    char buf[] = "0xXXXXXXXX", *name, *value, *eq; 
    9699 
    97100    /* (Re)initialize hash table */ 
     
    100103    /* Parse and set "name=value\0 ... \0\0" */ 
    101104    name = (char *) &header[1]; 
    102     /* 
    103     end = (char *) header + NVRAM_SPACE - 2; 
    104     end[0] = end[1] = '\0'; 
    105     */ 
     105 
    106106    for (; *name; name = value + strlen(value) + 1) { 
    107107        if (!(eq = strchr(name, '='))) 
     
    252252int nvram_commit(nvram_handle_t *h) 
    253253{ 
    254     nvram_header_t *header = (nvram_header_t *) &h->mmap[NVRAM_SPACE]; 
     254    nvram_header_t *header = (nvram_header_t *) &h->mmap[NVRAM_START(nvram_erase_size)]; 
    255255    char *init, *config, *refresh, *ncdl; 
    256256    char *ptr, *end; 
     
    281281    ptr = (char *) header + sizeof(nvram_header_t); 
    282282    memset(ptr, 0xFF, NVRAM_SPACE - sizeof(nvram_header_t)); 
     283    memset(&tmp, 0, sizeof(nvram_header_t)); 
    283284 
    284285    /* Leave space for a double NUL at the end */ 
     
    329330    nvram_header_t *header; 
    330331 
     332    /* If erase size or file are undefined then try to define them */ 
     333    if( (nvram_erase_size == 0) || (file == NULL) ) 
     334    { 
     335        /* Finding the mtd will set the appropriate erase size */ 
     336        if( file == NULL ) 
     337            file = nvram_find_mtd(); 
     338        else 
     339            (void) nvram_find_mtd(); 
     340 
     341        if( nvram_erase_size == 0 ) 
     342            return NULL; 
     343    } 
     344 
    331345    if( (fd = open(file, O_RDWR)) > -1 ) 
    332346    { 
    333347        char *mmap_area = (char *) mmap( 
    334             NULL, 0x10000, PROT_READ | PROT_WRITE, 
     348            NULL, nvram_erase_size, PROT_READ | PROT_WRITE, 
    335349            ( rdonly == NVRAM_RO ) ? MAP_PRIVATE : MAP_SHARED, fd, 0); 
    336350 
    337351        if( mmap_area != MAP_FAILED ) 
    338352        { 
    339             memset(mmap_area, 0xFF, NVRAM_SPACE); 
     353            memset(mmap_area, 0xFF, NVRAM_START(nvram_erase_size)); 
    340354 
    341355            if((h = (nvram_handle_t *) malloc(sizeof(nvram_handle_t))) != NULL) 
     
    345359                h->fd     = fd; 
    346360                h->mmap   = mmap_area; 
    347                 h->length = 0x10000; 
    348  
    349                 header = (nvram_header_t *) &h->mmap[NVRAM_SPACE]; 
     361                h->length = nvram_erase_size; 
     362 
     363                header = (nvram_header_t *) &h->mmap[NVRAM_START(nvram_erase_size)]; 
    350364 
    351365                if( header->magic == NVRAM_MAGIC ) 
     
    380394const char * nvram_find_mtd(void) 
    381395{ 
    382     //return "./samples/nvram.1"; 
    383  
    384396    FILE *fp; 
    385     int i; 
     397    int i, esz; 
    386398    char dev[PATH_MAX]; 
    387     char *path; 
    388  
    389     // "/dev/mtdblock/" + ( 0 < x < 99 ) + "ro" + \0 = 19 
     399    char *path = NULL; 
     400 
     401    // "/dev/mtdblock/" + ( 0 < x < 99 ) + \0 = 19 
    390402    if( (path = (char *) malloc(19)) == NULL ) 
    391403        return NULL; 
     
    393405    if ((fp = fopen("/proc/mtd", "r"))) { 
    394406        while (fgets(dev, sizeof(dev), fp)) { 
    395             if (sscanf(dev, "mtd%d:", &i) && strstr(dev, "nvram")) { 
    396                 snprintf(path, 19, "/dev/mtdblock/%d", i); 
     407            if (strstr(dev, "nvram") && sscanf(dev, "mtd%d: %08x", &i, &esz)) { 
     408                if( (path = (char *) malloc(19)) != NULL ) 
     409                { 
     410                    nvram_erase_size = esz; 
     411                    snprintf(path, 19, "/dev/mtdblock/%d", i); 
     412                    break; 
     413                } 
    397414            } 
    398415        } 
     
    400417    } 
    401418 
    402     return (const char *) path; 
     419    return path; 
    403420} 
    404421 
     
    420437{ 
    421438    int fdmtd, fdstg, stat; 
    422     const char *mtd; 
    423     char buf[0x10000]; 
     439    const char *mtd = nvram_find_mtd(); 
     440    char buf[nvram_erase_size]; 
    424441 
    425442    stat = -1; 
    426443 
    427     if( (mtd = nvram_find_mtd()) != NULL ) 
     444    if( (mtd != NULL) && (nvram_erase_size > 0) ) 
    428445    { 
    429446        if( (fdmtd = open(mtd, O_RDONLY)) > -1 ) 
     
    452469{ 
    453470    int fdmtd, fdstg, stat; 
    454     const char *mtd; 
    455     char buf[0x10000]; 
     471    const char *mtd = nvram_find_mtd(); 
     472    char buf[nvram_erase_size]; 
    456473 
    457474    stat = -1; 
    458475 
    459     if( (mtd = nvram_find_mtd()) != NULL ) 
     476    if( (mtd != NULL) && (nvram_erase_size > 0) ) 
    460477    { 
    461478        if( (fdstg = open(NVRAM_STAGING, O_RDONLY)) > -1 ) 
  • luci/trunk/contrib/userspace-nvram/nvram.h

    r4438 r4439  
    8383 
    8484/* Computes a crc8 over the input data. */ 
    85 uint8_t hndcrc8 (uint8_t * pdata, uint32_t nbytes, uint8_t crc ); 
     85uint8_t hndcrc8 (const char * pdata, uint32_t nbytes, uint8_t crc ); 
    8686 
    8787/* Returns the crc value of the nvram. */ 
     
    114114 
    115115/* NVRAM constants */ 
     116#define NVRAM_SPACE         0x8000 
     117#define NVRAM_START(x)      x - NVRAM_SPACE 
    116118#define NVRAM_MAGIC         0x48534C46  /* 'FLSH' */ 
    117119#define NVRAM_CLEAR_MAGIC   0x0 
     
    119121#define NVRAM_VERSION       1 
    120122#define NVRAM_HEADER_SIZE   20 
    121 #define NVRAM_SPACE         0x8000 
    122123 
    123124#define NVRAM_MAX_VALUE_LEN 255