forked from len0rd/rockbox
Now keeps integers within range, and saves a version number in the cfg file, refusing to load too old versions
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4916 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1f019981e4
commit
e93aa4b09c
2 changed files with 25 additions and 5 deletions
|
@ -26,7 +26,8 @@ void configfile_init(struct plugin_api* newrb)
|
||||||
cfg_rb = newrb;
|
cfg_rb = newrb;
|
||||||
}
|
}
|
||||||
|
|
||||||
int configfile_save(char *filename, struct configdata *cfg, int num_items)
|
int configfile_save(const char *filename, struct configdata *cfg,
|
||||||
|
int num_items, int version)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int i;
|
int i;
|
||||||
|
@ -37,6 +38,8 @@ int configfile_save(char *filename, struct configdata *cfg, int num_items)
|
||||||
if(fd < 0)
|
if(fd < 0)
|
||||||
return fd*10 - 1;
|
return fd*10 - 1;
|
||||||
|
|
||||||
|
cfg_rb->fprintf(fd, "file version: %d\n", version);
|
||||||
|
|
||||||
for(i = 0;i < num_items;i++) {
|
for(i = 0;i < num_items;i++) {
|
||||||
switch(cfg[i].type) {
|
switch(cfg[i].type) {
|
||||||
case TYPE_INT:
|
case TYPE_INT:
|
||||||
|
@ -64,13 +67,16 @@ int configfile_save(char *filename, struct configdata *cfg, int num_items)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int configfile_load(char *filename, struct configdata *cfg, int num_items)
|
int configfile_load(const char *filename, struct configdata *cfg,
|
||||||
|
int num_items, int min_version)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int i, j;
|
int i, j;
|
||||||
char *name;
|
char *name;
|
||||||
char *val;
|
char *val;
|
||||||
char buf[MAX_PATH];
|
char buf[MAX_PATH];
|
||||||
|
int file_version = -1;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
|
cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
|
||||||
fd = cfg_rb->open(buf, O_RDONLY);
|
fd = cfg_rb->open(buf, O_RDONLY);
|
||||||
|
@ -80,11 +86,23 @@ int configfile_load(char *filename, struct configdata *cfg, int num_items)
|
||||||
while(cfg_rb->read_line(fd, buf, MAX_PATH) > 0) {
|
while(cfg_rb->read_line(fd, buf, MAX_PATH) > 0) {
|
||||||
cfg_rb->settings_parseline(buf, &name, &val);
|
cfg_rb->settings_parseline(buf, &name, &val);
|
||||||
|
|
||||||
|
/* Bail out if the file version is too old */
|
||||||
|
if(!cfg_rb->strcmp("file version", name)) {
|
||||||
|
file_version = cfg_rb->atoi(val);
|
||||||
|
if(file_version < min_version) {
|
||||||
|
cfg_rb->close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(i = 0;i < num_items;i++) {
|
for(i = 0;i < num_items;i++) {
|
||||||
if(!cfg_rb->strcmp(cfg[i].name, name)) {
|
if(!cfg_rb->strcmp(cfg[i].name, name)) {
|
||||||
switch(cfg[i].type) {
|
switch(cfg[i].type) {
|
||||||
case TYPE_INT:
|
case TYPE_INT:
|
||||||
*cfg[i].val = cfg_rb->atoi(val);
|
tmp = cfg_rb->atoi(val);
|
||||||
|
/* Only set it if it's within range */
|
||||||
|
if(tmp >= cfg[i].min && tmp <= cfg[i].max)
|
||||||
|
*cfg[i].val = tmp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_ENUM:
|
case TYPE_ENUM:
|
||||||
|
|
|
@ -38,7 +38,9 @@ struct configdata
|
||||||
};
|
};
|
||||||
|
|
||||||
void configfile_init(struct plugin_api* newrb);
|
void configfile_init(struct plugin_api* newrb);
|
||||||
int configfile_save(char *filename, struct configdata *cfg, int num_items);
|
int configfile_save(const char *filename, struct configdata *cfg,
|
||||||
int configfile_load(char *filename, struct configdata *cfg, int num_items);
|
int num_items, int version);
|
||||||
|
int configfile_load(const char *filename, struct configdata *cfg,
|
||||||
|
int num_items, int min_version);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue