These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / SLOF / lib / libnvram / envvar.c
index 87aaf27..ee943fc 100644 (file)
@@ -17,7 +17,7 @@
 #include "nvram.h"
 
 /* returns the offset of the first byte after the searched envvar */
-static int get_past_env_pos(partition_t part, char *envvar)
+static int get_past_env_pos(partition_t part, char *envvar, int evlen)
 {
        int offset, len;
        static char temp[256];
@@ -32,7 +32,7 @@ static int get_past_env_pos(partition_t part, char *envvar)
                while((data=nvram_read_byte(offset++)) && len < 256) {
                        temp[len++]=data;
                }
-               if (!strncmp(envvar, temp, strlen(envvar))) {
+               if (!strncmp(envvar, temp, evlen)) {
                        return offset;
                }
        } while (len);
@@ -43,16 +43,16 @@ static int get_past_env_pos(partition_t part, char *envvar)
 /**
  * @param partition name of the envvar partition
  * @param envvar name of the environment variable
+ * @param evlen string length of the envvar parameter
  * @return pointer to temporary string containing the value of envvar
  */
-
-char *get_env(partition_t part, char *envvar)
+char *nvram_get_env(partition_t part, char *envvar, int evlen)
 {
        static char temp[256+1];
        int len, offset;
        uint8_t data;
 
-       DEBUG("get_env %s... ", envvar);
+       DEBUG("nvram_get_env %p... ", envvar);
        if(!part.addr) {
                /* ERROR: No environment variable partition */
                DEBUG("invalid partition.\n");
@@ -68,7 +68,7 @@ char *get_env(partition_t part, char *envvar)
                }
                temp[len]=0;
 
-               if (!strncmp(envvar, temp, strlen(envvar))) {
+               if (!strncmp(envvar, temp, evlen)) {
                        int pos=0;
                        while (temp[pos]!='=' && pos < len) pos++;
                        // DEBUG("value='%s'\n", temp+pos+1); 
@@ -100,7 +100,7 @@ static int find_last_envvar(partition_t part)
        return -1;
 }
 
-int add_env(partition_t part, char *envvar, char *value)
+int nvram_add_env(partition_t part, char *envvar, int evlen, char *value, int vallen)
 {
        int freespace, last, len, offset;
        unsigned int i;
@@ -112,7 +112,7 @@ int add_env(partition_t part, char *envvar, char *value)
        freespace = part.addr+part.len-last;
 
        /* how long is the entry we want to write? */
-       len = strlen(envvar) + strlen(value) + 2;
+       len = evlen + vallen + 2;
 
        if(freespace<len) {
                // TODO try to increase partition size
@@ -121,18 +121,18 @@ int add_env(partition_t part, char *envvar, char *value)
 
        offset=last;
 
-       for(i=0; i<strlen(envvar); i++)
+       for (i = 0; i < evlen; i++)
                nvram_write_byte(offset++, envvar[i]);
 
        nvram_write_byte(offset++, '=');
 
-       for(i=0; i<strlen(value); i++)
+       for (i = 0; i < vallen; i++)
                nvram_write_byte(offset++, value[i]);
 
        return 0;
 }
 
-int del_env(partition_t part, char *envvar)
+int nvram_del_env(partition_t part, char *envvar, int evlen)
 {
        int last, current, pos, i;
        char *buffer;
@@ -141,7 +141,7 @@ int del_env(partition_t part, char *envvar)
                return -1;
 
        last=find_last_envvar(part);
-       current = pos = get_past_env_pos(part, envvar);
+       current = pos = get_past_env_pos(part, envvar, evlen);
        
        // TODO is this really required?
        /* go back to non-0 value */
@@ -168,25 +168,25 @@ int del_env(partition_t part, char *envvar)
        return 0;
 }
 
-int set_env(partition_t part, char *envvar, char *value)
+int nvram_set_env(partition_t part, char *envvar, int evlen, char *value, int vallen)
 {
        char *oldvalue, *buffer;
        int last, current, buffersize, i;
 
-       DEBUG("set_env %lx[%lx]: %s=%s\n", part.addr, part.len, envvar, value);
+       DEBUG("nvram_set_env %lx[%lx]: %p=>%p\n", part.addr, part.len, envvar, value);
 
        if(!part.addr)
                return -1;
 
        /* Check whether the environment variable exists already */
-       oldvalue = get_env(part, envvar);
+       oldvalue = nvram_get_env(part, envvar, evlen);
 
-       if(oldvalue==NULL)
-               return add_env(part, envvar, value);
+       if (oldvalue == NULL)
+               return nvram_add_env(part, envvar, evlen, value, vallen);
 
 
        /* The value did not change. So we succeeded! */
-       if(!strncmp(oldvalue, value, strlen(value)+1))
+       if (strlen(oldvalue) == vallen && !strncmp(oldvalue, value, vallen))
                return 0;
 
        /* we need to overwrite environment variables, back them up first */
@@ -195,7 +195,7 @@ int set_env(partition_t part, char *envvar, char *value)
 
        /* allocate a buffer */
        last=find_last_envvar(part);
-       current=get_past_env_pos(part, envvar);
+       current = get_past_env_pos(part, envvar, evlen);
        buffersize = last - current;
        buffer=get_nvram_buffer(buffersize);
        if(!buffer)
@@ -214,7 +214,7 @@ int set_env(partition_t part, char *envvar, char *value)
        current++;
 
        /* Write the new value */
-       for(i=0; i<(int)strlen(value); i++) {
+       for(i = 0; i < vallen; i++) {
                nvram_write_byte(current++, value[i]);
        }