summaryrefslogtreecommitdiffstats
path: root/apps/tree.c
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-08-27 10:33:09 +0000
committerThomas Martitz <kugel@rockbox.org>2010-08-27 10:33:09 +0000
commit79798ff5f30dea7419f360e197763abb3b46259a (patch)
treefc06addfd06c88337ccaca1ee79bda6809cf9cfd /apps/tree.c
parent194174a371b16dfc24960d1e33371c0a7ef1c2c2 (diff)
downloadrockbox-79798ff5f30dea7419f360e197763abb3b46259a.tar.gz
rockbox-79798ff5f30dea7419f360e197763abb3b46259a.zip
Make getcwd match the posix variant, make get_current_file() behave similar to it and add a few sanity checks.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27903 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/apps/tree.c b/apps/tree.c
index 5e841e4dae..4d915ca3b8 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -511,17 +511,17 @@ void resume_directory(const char *dir)
/* Returns the current working directory and also writes cwd to buf if
non-NULL. In case of error, returns NULL. */
-char *getcwd(char *buf, int size)
+char *getcwd(char *buf, size_t size)
{
if (!buf)
return tc.currdir;
- else if (size > 0)
+ else if (size)
{
- strlcpy(buf, tc.currdir, size);
- return buf;
+ if (strlcpy(buf, tc.currdir, size) < size)
+ return buf;
}
- else
- return NULL;
+ /* size == 0, or truncation in strlcpy */
+ return NULL;
}
/* Force a reload of the directory next time directory browser is called */
@@ -530,19 +530,28 @@ void reload_directory(void)
reload_dir = true;
}
-void get_current_file(char* buffer, int buffer_len)
+char* get_current_file(char* buffer, size_t buffer_len)
{
#ifdef HAVE_TAGCACHE
/* in ID3DB mode it is a bad idea to call this function */
/* (only happens with `follow playlist') */
if( *tc.dirfilter == SHOW_ID3DB )
- return;
+ return NULL;
#endif
struct entry* dc = tc.dircache;
struct entry* e = &dc[tc.selected_item];
- snprintf(buffer, buffer_len, "%s/%s", getcwd(NULL,0),
- tc.dirlength ? e->name : "");
+ if (getcwd(buffer, buffer_len))
+ {
+ if (tc.dirlength)
+ {
+ strlcat(buffer, "/", buffer_len);
+ if (strlcat(buffer, e->name, buffer_len) >= buffer_len)
+ return NULL;
+ }
+ return buffer;
+ }
+ return NULL;
}
/* Allow apps to change our dirfilter directly (required for sub browsers)