int set_env(char *name,char *value) { int len, oldval; char *env, *nxt = NULL; int ret; char *env_data = g_env.env_data; printk("[%s]set_env %s %s\n",MODULE_NAME,name,value); oldval = -1; if(!env_buffer){ return -1; } if(!env_valid){ env = env_data; goto add; } for (env=env_data; *env; env=nxt+1) { for (nxt=env; *nxt; ++nxt) ; if ((oldval = envmatch((char *)name, env-env_data)) >= 0) break; } if(oldval>0){ if (*++nxt == '\0') { if (env > env_data) { env--; } else { *env = '\0'; } } else { for (;;) { *env = *nxt++; if ((*env == '\0') && (*nxt == '\0')) break; ++env; } } *++env = '\0'; } for (env=env_data; *env || *(env+1); ++env) ; if (env > env_data) ++env; add: if(*value == '\0'){ printk("[LK_ENV]clear %s\n",name); goto write_env; } /* * Overflow when: * "name" + "=" + "val" +"\0\0" > ENV_SIZE - (env-env_data) */ len = strlen(name) + 2; /* add '=' for first arg, ' ' for all others */ len += strlen(value) + 1; if (len > (&env_data[CFG_ENV_DATA_SIZE]-env)) { printk ("## Error: environment overflow, \"%s\" deleted\n", name); return -1; } while ((*env = *name++) != '\0') env++; *env = '='; while ((*++env = *value++) != '\0') ; write_env: /* end is marked with double '\0' */ *++env = '\0'; memset(env,0x00,CFG_ENV_DATA_SIZE-(env-env_data)); ret = write_env_area(env_buffer); if(ret < 0){ printk("[%s]write env fail\n",MODULE_NAME); memset(env_buffer,0x00,CFG_ENV_SIZE); return -1; } env_valid = 1; return 0; }
int set_env(char *name,char *value) { int len; int oldval = -1; char *env, *nxt = NULL; int ret = 0; char *env_data = NULL; pr_notice("[%s]set env, name=%s,value=%s\n", MODULE_NAME, name, value); env_init(); env_data = g_env.env_data; if (!env_buffer) { return (-1); } if (!env_valid) { env = env_data; goto add; } /* find match name and return the val header pointer*/ for (env = env_data; *env; env = nxt + 1) { for (nxt=env; *nxt; ++nxt) { ; } if ((oldval = envmatch((char *)name, env-env_data)) >= 0) break; }/* end find */ if (oldval>0) { if (*++nxt == '\0') { if (env > env_data) { env--; } else { *env = '\0'; } } else { for (;;) { *env = *nxt++; if ((*env == '\0') && (*nxt == '\0')) break; ++env; } } *++env = '\0'; } for (env=env_data; *env || *(env+1); ++env) { ; } if (env > env_data) { ++env; } add: if (*value == '\0') { pr_notice("[%s]clear env name=%s\n", MODULE_NAME, name); goto write_env; } len = strlen(name) + 2; len += strlen(value) + 1; if (len > (&env_data[CFG_ENV_DATA_SIZE] - env)) { pr_err("[%s]env data overflow, %s deleted\n", MODULE_NAME, name); return -1; } while ((*env = *name++) != '\0') { env++; } *env = '='; while ((*++env = *value++) != '\0') { ; } write_env: /* end is marked with double '\0' */ *++env = '\0'; memset(env, 0x00, CFG_ENV_DATA_SIZE - (env - env_data)); ret = write_env_area(env_buffer); if (ret < 0) { pr_err("[%s]%s error: write env area fail\n", MODULE_NAME, __FUNCTION__); memset(env_buffer, 0x00, CFG_ENV_SIZE); return -1; } env_valid = 1; return 0; }