diff options
Diffstat (limited to 'apps/plugins/lib/configfile.c')
-rw-r--r-- | apps/plugins/lib/configfile.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/apps/plugins/lib/configfile.c b/apps/plugins/lib/configfile.c index 0fbba81580..476f776878 100644 --- a/apps/plugins/lib/configfile.c +++ b/apps/plugins/lib/configfile.c | |||
@@ -55,12 +55,14 @@ int configfile_save(const char *filename, struct configdata *cfg, | |||
55 | if(fd < 0) | 55 | if(fd < 0) |
56 | return fd*10 - 1; | 56 | return fd*10 - 1; |
57 | 57 | ||
58 | cfg_rb->fdprintf(fd, "file version: %d\n", version); | 58 | /* pre-allocate 10 bytes for INT */ |
59 | cfg_rb->fdprintf(fd, "file version: %10d\n", version); | ||
59 | 60 | ||
60 | for(i = 0;i < num_items;i++) { | 61 | for(i = 0;i < num_items;i++) { |
61 | switch(cfg[i].type) { | 62 | switch(cfg[i].type) { |
62 | case TYPE_INT: | 63 | case TYPE_INT: |
63 | cfg_rb->fdprintf(fd, "%s: %d\n", | 64 | /* pre-allocate 10 bytes for INT */ |
65 | cfg_rb->fdprintf(fd, "%s: %10d\n", | ||
64 | cfg[i].name, | 66 | cfg[i].name, |
65 | *cfg[i].val); | 67 | *cfg[i].val); |
66 | break; | 68 | break; |
@@ -141,3 +143,72 @@ int configfile_load(const char *filename, struct configdata *cfg, | |||
141 | cfg_rb->close(fd); | 143 | cfg_rb->close(fd); |
142 | return 0; | 144 | return 0; |
143 | } | 145 | } |
146 | |||
147 | int configfile_get_value(const char* filename, const char* name) | ||
148 | { | ||
149 | int fd; | ||
150 | char *pname; | ||
151 | char *pval; | ||
152 | char buf[MAX_PATH]; | ||
153 | |||
154 | get_cfg_filename(buf, MAX_PATH, filename); | ||
155 | fd = cfg_rb->open(buf, O_RDONLY); | ||
156 | if(fd < 0) | ||
157 | return -1; | ||
158 | |||
159 | while(cfg_rb->read_line(fd, buf, MAX_PATH) > 0) | ||
160 | { | ||
161 | cfg_rb->settings_parseline(buf, &pname, &pval); | ||
162 | if(!cfg_rb->strcmp(name, pname)) | ||
163 | { | ||
164 | cfg_rb->close(fd); | ||
165 | return cfg_rb->atoi(pval); | ||
166 | } | ||
167 | } | ||
168 | |||
169 | cfg_rb->close(fd); | ||
170 | return -1; | ||
171 | } | ||
172 | |||
173 | int configfile_update_entry(const char* filename, const char* name, int val) | ||
174 | { | ||
175 | int fd; | ||
176 | char *pname; | ||
177 | char *pval; | ||
178 | char path[MAX_PATH]; | ||
179 | char buf[256]; | ||
180 | int found = 0; | ||
181 | int line_len = 0; | ||
182 | int pos = 0; | ||
183 | |||
184 | /* open the current config file */ | ||
185 | get_cfg_filename(path, MAX_PATH, filename); | ||
186 | fd = cfg_rb->open(path, O_RDWR); | ||
187 | if(fd < 0) | ||
188 | return -1; | ||
189 | |||
190 | /* read in the current stored settings */ | ||
191 | while((line_len = cfg_rb->read_line(fd, buf, 256)) > 0) | ||
192 | { | ||
193 | cfg_rb->settings_parseline(buf, &pname, &pval); | ||
194 | |||
195 | if(!cfg_rb->strcmp(name, pname)) | ||
196 | { | ||
197 | found = 1; | ||
198 | cfg_rb->lseek(fd, pos, SEEK_SET); | ||
199 | /* pre-allocate 10 bytes for INT */ | ||
200 | cfg_rb->fdprintf(fd, "%s: %10d\n", pname, val); | ||
201 | break; | ||
202 | } | ||
203 | pos += line_len; | ||
204 | } | ||
205 | |||
206 | /* if (name/val) is a new entry just append to file */ | ||
207 | if (found == 0) | ||
208 | /* pre-allocate 10 bytes for INT */ | ||
209 | cfg_rb->fdprintf(fd, "%s: %10d\n", name, val); | ||
210 | |||
211 | cfg_rb->close(fd); | ||
212 | |||
213 | return found; | ||
214 | } | ||