diff options
author | William Wilgus <wilgus.william@gmail.com> | 2022-11-17 01:25:41 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2022-11-17 01:43:16 -0500 |
commit | 0b7a387671a56a1b526b3672cd695b5764597f3e (patch) | |
tree | 07c9c337f002a647c5e6c7eaf0a6b3c5245097cb /apps/open_plugin.c | |
parent | 4c3937591c510a22c724d18dae9367bb1b786698 (diff) | |
download | rockbox-0b7a387671a56a1b526b3672cd695b5764597f3e.tar.gz rockbox-0b7a387671a56a1b526b3672cd695b5764597f3e.zip |
open_plugins add name when plugin can't open & check LANG_LAST_INDEX_IN_ARRAY
can't open '' was confusing for users so pass the key to open plugin
in theory you could have a plugin that defaulted to these lang_ids
run but its good enough to tell the user what failed to open IMO
lang_id changes mess with open_plugin since it uses them as look-up keys
so add checks for LANG_LAST_INDEX_IN_ARRAY to the checksum
the plugin now removes entries with an invalid checksum
devices with harddrives only append their .dat file so have them skip entries
with invalid checksums and only notify user if a valid entry wasn't found
(these users can run the open_plugins plugin to remove invalid entries)
Change-Id: Icf157675beaccda785643d5a9ed032a7cde30f12
Diffstat (limited to 'apps/open_plugin.c')
-rw-r--r-- | apps/open_plugin.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/apps/open_plugin.c b/apps/open_plugin.c index 67b6f6d318..45dd7cdd2c 100644 --- a/apps/open_plugin.c +++ b/apps/open_plugin.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include "lang.h" | 28 | #include "lang.h" |
29 | 29 | ||
30 | /* Define LOGF_ENABLE to enable logf output in this file */ | 30 | /* Define LOGF_ENABLE to enable logf output in this file */ |
31 | //#define LOGF_ENABLE | 31 | /*#define LOGF_ENABLE*/ |
32 | #include "logf.h" | 32 | #include "logf.h" |
33 | 33 | ||
34 | #define ROCK_EXT "rock" | 34 | #define ROCK_EXT "rock" |
@@ -60,8 +60,12 @@ static inline void op_clear_entry(struct open_plugin_entry_t *entry) | |||
60 | 60 | ||
61 | static int op_entry_checksum(struct open_plugin_entry_t *entry) | 61 | static int op_entry_checksum(struct open_plugin_entry_t *entry) |
62 | { | 62 | { |
63 | if (entry == NULL || entry->checksum != open_plugin_csum) | 63 | if (entry == NULL || entry->checksum != open_plugin_csum + |
64 | (entry->lang_id <= OPEN_PLUGIN_LANG_INVALID ? 0 : LANG_LAST_INDEX_IN_ARRAY)) | ||
65 | { | ||
66 | logf("OP entry bad checksum"); | ||
64 | return 0; | 67 | return 0; |
68 | } | ||
65 | return 1; | 69 | return 1; |
66 | } | 70 | } |
67 | 71 | ||
@@ -81,6 +85,14 @@ static int op_find_entry(int fd, struct open_plugin_entry_t *entry, | |||
81 | if (entry->lang_id == lang_id || entry->hash == hash || | 85 | if (entry->lang_id == lang_id || entry->hash == hash || |
82 | (lang_id == OPEN_PLUGIN_LANG_IGNOREALL))/* return first entry found */ | 86 | (lang_id == OPEN_PLUGIN_LANG_IGNOREALL))/* return first entry found */ |
83 | { | 87 | { |
88 | #if (CONFIG_STORAGE & STORAGE_ATA) | ||
89 | /* may have invalid entries but we append the file so continue looking*/ | ||
90 | if (op_entry_checksum(entry) <= 0) | ||
91 | { | ||
92 | ret = OPEN_PLUGIN_INVALID_ENTRY; | ||
93 | continue; | ||
94 | } | ||
95 | #endif | ||
84 | ret = record; | 96 | ret = record; |
85 | /* NULL terminate fields NOTE -- all are actually +1 larger */ | 97 | /* NULL terminate fields NOTE -- all are actually +1 larger */ |
86 | entry->name[OPEN_PLUGIN_NAMESZ] = '\0'; | 98 | entry->name[OPEN_PLUGIN_NAMESZ] = '\0'; |
@@ -98,7 +110,12 @@ static int op_find_entry(int fd, struct open_plugin_entry_t *entry, | |||
98 | } | 110 | } |
99 | 111 | ||
100 | /* sanity check */ | 112 | /* sanity check */ |
101 | if (ret > OPEN_PLUGIN_NOT_FOUND && op_entry_checksum(entry) <= 0) | 113 | #if (CONFIG_STORAGE & STORAGE_ATA) |
114 | if (ret == OPEN_PLUGIN_INVALID_ENTRY || | ||
115 | #else | ||
116 | if( | ||
117 | #endif | ||
118 | (ret > OPEN_PLUGIN_NOT_FOUND && op_entry_checksum(entry) <= 0)) | ||
102 | { | 119 | { |
103 | splash(HZ * 2, "OpenPlugin Invalid entry"); | 120 | splash(HZ * 2, "OpenPlugin Invalid entry"); |
104 | ret = OPEN_PLUGIN_NOT_FOUND; | 121 | ret = OPEN_PLUGIN_NOT_FOUND; |
@@ -144,7 +161,7 @@ static int op_update_dat(struct open_plugin_entry_t *entry, bool clear) | |||
144 | hash_langid_csum[2] == open_plugin_csum) | 161 | hash_langid_csum[2] == open_plugin_csum) |
145 | { | 162 | { |
146 | logf("OP update *Entry Exists* hash: %x langid: %d", | 163 | logf("OP update *Entry Exists* hash: %x langid: %d", |
147 | hash_langid_csum[0], (int32_t)hash_langid[1]); | 164 | hash_langid_csum[0], (int32_t)hash_langid_csum[1]); |
148 | lseek(fd, 0-hlc_sz, SEEK_CUR);/* back to the start of record */ | 165 | lseek(fd, 0-hlc_sz, SEEK_CUR);/* back to the start of record */ |
149 | break; | 166 | break; |
150 | } | 167 | } |
@@ -261,7 +278,8 @@ uint32_t open_plugin_add_path(const char *key, const char *plugin, const char *p | |||
261 | { | 278 | { |
262 | open_plugin_entry.hash = hash; | 279 | open_plugin_entry.hash = hash; |
263 | open_plugin_entry.lang_id = lang_id; | 280 | open_plugin_entry.lang_id = lang_id; |
264 | open_plugin_entry.checksum = open_plugin_csum; | 281 | open_plugin_entry.checksum = open_plugin_csum + |
282 | (lang_id <= OPEN_PLUGIN_LANG_INVALID ? 0 : LANG_LAST_INDEX_IN_ARRAY); | ||
265 | /* name */ | 283 | /* name */ |
266 | if (path_basename(plugin, (const char **)&pos) == 0) | 284 | if (path_basename(plugin, (const char **)&pos) == 0) |
267 | pos = "\0"; | 285 | pos = "\0"; |
@@ -337,7 +355,7 @@ int open_plugin_get_entry(const char *key, struct open_plugin_entry_t *entry) | |||
337 | opret = op_get_entry(hash, lang_id, entry, OPEN_PLUGIN_DAT); | 355 | opret = op_get_entry(hash, lang_id, entry, OPEN_PLUGIN_DAT); |
338 | logf("OP entry hash: %x lang id: %d ret: %d key: %s", hash, lang_id, opret, skey); | 356 | logf("OP entry hash: %x lang id: %d ret: %d key: %s", hash, lang_id, opret, skey); |
339 | 357 | ||
340 | if (opret == OPEN_PLUGIN_NOT_FOUND && lang_id > OPEN_PLUGIN_LANG_INVALID) | 358 | if (opret == OPEN_PLUGIN_NOT_FOUND && lang_id > OPEN_PLUGIN_LANG_INVALID) |
341 | { /* try rb defaults */ | 359 | { /* try rb defaults */ |
342 | opret = op_get_entry(hash, lang_id, entry, OPEN_RBPLUGIN_DAT); | 360 | opret = op_get_entry(hash, lang_id, entry, OPEN_RBPLUGIN_DAT); |
343 | logf("OP rb_entry hash: %x lang id: %d ret: %d key: %s", hash, lang_id, opret, skey); | 361 | logf("OP rb_entry hash: %x lang id: %d ret: %d key: %s", hash, lang_id, opret, skey); |
@@ -364,6 +382,8 @@ int open_plugin_run(const char *key) | |||
364 | 382 | ||
365 | if (param[0] == '\0') | 383 | if (param[0] == '\0') |
366 | param = NULL; | 384 | param = NULL; |
385 | if (path[0] == '\0' && key) | ||
386 | path = P2STR((unsigned char *)key); | ||
367 | 387 | ||
368 | ret = plugin_load(path, param); | 388 | ret = plugin_load(path, param); |
369 | 389 | ||