1
0
Fork 0
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:
Linus Nielsen Feltzing 2004-07-22 07:51:02 +00:00
parent 1f019981e4
commit e93aa4b09c
2 changed files with 25 additions and 5 deletions

View file

@ -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);
@ -79,12 +85,24 @@ 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:

View file

@ -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