summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/SOURCES3
-rw-r--r--firmware/common/dircache.c11
-rw-r--r--firmware/common/filefuncs.c37
-rw-r--r--firmware/common/rbpaths.c84
-rw-r--r--firmware/common/unicode.c4
-rw-r--r--firmware/export/filefuncs.h5
-rw-r--r--firmware/export/rbpaths.h132
-rw-r--r--firmware/font.c20
-rw-r--r--firmware/include/dircache.h1
-rw-r--r--firmware/include/file.h5
10 files changed, 284 insertions, 18 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index b4f5301a84..d8cfadef11 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -105,6 +105,9 @@ common/dircache.c
105#endif /* HAVE_DIRCACHE */ 105#endif /* HAVE_DIRCACHE */
106common/filefuncs.c 106common/filefuncs.c
107common/format.c 107common/format.c
108#ifdef APPLICATION
109common/rbpaths.c
110#endif
108common/strcasecmp.c 111common/strcasecmp.c
109common/strcasestr.c 112common/strcasestr.c
110common/strnatcmp.c 113common/strnatcmp.c
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c
index 906527f8f2..7b2cdd1d75 100644
--- a/firmware/common/dircache.c
+++ b/firmware/common/dircache.c
@@ -88,10 +88,13 @@ static int fdbind_idx = 0;
88 */ 88 */
89static int open_dircache_file(unsigned flags, int permissions) 89static int open_dircache_file(unsigned flags, int permissions)
90{ 90{
91 char path[MAX_PATH];
92 const char *file = get_user_file_path(DIRCACHE_FILE, IS_FILE|NEED_WRITE,
93 path, sizeof(path));
91 if (permissions != 0) 94 if (permissions != 0)
92 return open(DIRCACHE_FILE, flags, permissions); 95 return open(file, flags, permissions);
93 96
94 return open(DIRCACHE_FILE, flags); 97 return open(file, flags);
95} 98}
96 99
97/** 100/**
@@ -99,7 +102,9 @@ static int open_dircache_file(unsigned flags, int permissions)
99 */ 102 */
100static int remove_dircache_file(void) 103static int remove_dircache_file(void)
101{ 104{
102 return remove(DIRCACHE_FILE); 105 char path[MAX_PATH];
106 return remove(get_user_file_path(DIRCACHE_FILE, IS_FILE|NEED_WRITE,
107 path, sizeof(path)));
103} 108}
104#endif 109#endif
105/** 110/**
diff --git a/firmware/common/filefuncs.c b/firmware/common/filefuncs.c
index ca9113250a..c058267094 100644
--- a/firmware/common/filefuncs.c
+++ b/firmware/common/filefuncs.c
@@ -22,6 +22,7 @@
22#include "dir.h" 22#include "dir.h"
23#include "stdlib.h" 23#include "stdlib.h"
24#include "string.h" 24#include "string.h"
25#include "debug.h"
25 26
26#ifdef HAVE_MULTIVOLUME 27#ifdef HAVE_MULTIVOLUME
27/* returns on which volume this is, and copies the reduced name 28/* returns on which volume this is, and copies the reduced name
@@ -50,3 +51,39 @@ int strip_volume(const char* name, char* namecopy)
50 return volume; 51 return volume;
51} 52}
52#endif /* #ifdef HAVE_MULTIVOLUME */ 53#endif /* #ifdef HAVE_MULTIVOLUME */
54
55#ifndef __PCTOOL__
56/* Test file existence, using dircache of possible */
57bool file_exists(const char *file)
58{
59 int fd;
60
61#ifdef DEBUG
62 if (!file || strlen(file) <= 0)
63 {
64 DEBUGF("%s(): Invalid parameter!\n");
65 return false;
66 }
67#endif
68
69#ifdef HAVE_DIRCACHE
70 if (dircache_is_enabled())
71 return (dircache_get_entry_ptr(file) != NULL);
72#endif
73
74 fd = open(file, O_RDONLY);
75 if (fd < 0)
76 return false;
77 close(fd);
78 return true;
79}
80
81bool dir_exists(const char *path)
82{
83 DIR* d = opendir(path);
84 if (!d)
85 return false;
86 closedir(d);
87 return true;
88}
89#endif /* __PCTOOL__ */
diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c
new file mode 100644
index 0000000000..69bc1387ef
--- /dev/null
+++ b/firmware/common/rbpaths.c
@@ -0,0 +1,84 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22
23#include <stdio.h> /* snprintf */
24#include <stdlib.h>
25#include "rbpaths.h"
26#include "file.h" /* MAX_PATH */
27#include "dir.h"
28#include "gcc_extensions.h"
29#include "string-extra.h"
30#include "filefuncs.h"
31
32
33void paths_init(void)
34{
35 /* make sure $HOME/.config/rockbox.org exists, it's needed for config.cfg */
36 char home_path[MAX_PATH];
37 snprintf(home_path, sizeof(home_path), "%s/.config/rockbox.org", getenv("HOME"));
38 mkdir(home_path);
39}
40
41const char* get_user_file_path(const char *path,
42 unsigned flags,
43 char* buf,
44 const size_t bufsize)
45{
46 const char *ret = path;
47 const char *pos = path;
48 printf("%s(): looking for %s\n", __func__, path);
49 /* replace ROCKBOX_DIR in path with $HOME/.config/rockbox.org */
50 pos += ROCKBOX_DIR_LEN;
51 if (*pos == '/') pos += 1;
52
53 if (snprintf(buf, bufsize, "%s/.config/rockbox.org/%s", getenv("HOME"), pos)
54 >= (int)bufsize)
55 return NULL;
56
57 /* always return the replacement buffer (pointing to $HOME) if
58 * write access is needed */
59 if (flags & NEED_WRITE)
60 ret = buf;
61 else
62 {
63 if (flags & IS_FILE)
64 {
65 if (file_exists(buf))
66 ret = buf;
67 }
68 else
69 {
70 if (dir_exists(buf))
71 ret = buf;
72 }
73 }
74
75 /* make a copy if we're about to return the path*/
76 if (UNLIKELY((flags & FORCE_BUFFER_COPY) && (ret != buf)))
77 {
78 strlcpy(buf, ret, bufsize);
79 ret = buf;
80 }
81
82 printf("%s(): %s\n", __func__, ret);
83 return ret;
84}
diff --git a/firmware/common/unicode.c b/firmware/common/unicode.c
index 4ef6eaae2b..25d4a9129e 100644
--- a/firmware/common/unicode.c
+++ b/firmware/common/unicode.c
@@ -27,16 +27,16 @@
27 */ 27 */
28 28
29#include <stdio.h> 29#include <stdio.h>
30#include "config.h"
30#include "file.h" 31#include "file.h"
31#include "debug.h" 32#include "debug.h"
32#include "rbunicode.h" 33#include "rbunicode.h"
33#include "config.h" 34#include "rbpaths.h"
34 35
35#ifndef O_BINARY 36#ifndef O_BINARY
36#define O_BINARY 0 37#define O_BINARY 0
37#endif 38#endif
38 39
39#define CODEPAGE_DIR ROCKBOX_DIR"/codepages"
40static int default_codepage = 0; 40static int default_codepage = 0;
41static int loaded_cp_table = 0; 41static int loaded_cp_table = 0;
42 42
diff --git a/firmware/export/filefuncs.h b/firmware/export/filefuncs.h
index 130c5ff4be..3745c6bee3 100644
--- a/firmware/export/filefuncs.h
+++ b/firmware/export/filefuncs.h
@@ -28,4 +28,9 @@
28int strip_volume(const char* name, char* namecopy); 28int strip_volume(const char* name, char* namecopy);
29#endif 29#endif
30 30
31#ifndef __PCTOOL__
32bool file_exists(const char *file);
33bool dir_exists(const char *path);
34#endif
35
31#endif /* __INCLUDE_FILEFUNCS_H_ */ 36#endif /* __INCLUDE_FILEFUNCS_H_ */
diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
new file mode 100644
index 0000000000..cd87888cef
--- /dev/null
+++ b/firmware/export/rbpaths.h
@@ -0,0 +1,132 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#ifndef __PATHS_H__
23#define __PATHS_H__
24
25#include <stdbool.h>
26#include "autoconf.h"
27#include "string-extra.h"
28
29/* flags for get_user_file_path() */
30/* whether you need write access to that file/dir, especially true
31 * for runtime generated files (config.cfg) */
32#define NEED_WRITE (1<<0)
33/* file or directory? */
34#define IS_FILE (1<<1)
35/* make sure the path is copied into the passed buffer (it may return
36 * the passed path directly otherwise, e.g. always on target builds) */
37#define FORCE_BUFFER_COPY (1<<2)
38
39
40
41/* name of directory where configuration, fonts and other data
42 * files are stored */
43#ifdef __PCTOOL__
44#undef ROCKBOX_DIR
45#undef ROCKBOX_DIR_LEN
46#undef WPS_DIR
47#define ROCKBOX_DIR "."
48#define ROCKBOX_DIR_LEN 1
49#else
50
51/* ROCKBOX_DIR is now defined in autoconf.h for flexible build types */
52#ifndef ROCKBOX_DIR
53#error ROCKBOX_DIR not defined (should be in autoconf.h)
54#endif
55#define ROCKBOX_DIR_LEN (sizeof(ROCKBOX_DIR)-1)
56#endif /* def __PCTOOL__ */
57
58#ifndef APPLICATION
59
60/* make sure both are the same for native builds */
61#undef ROCKBOX_LIBRARY_PATH
62#define ROCKBOX_LIBRARY_PATH ROCKBOX_DIR
63
64#define PLUGIN_DIR ROCKBOX_DIR "/rocks"
65#define CODECS_DIR ROCKBOX_DIR "/codecs"
66
67#define REC_BASE_DIR "/"
68#define PLAYLIST_CATALOG_DEFAULT_DIR "/Playlists"
69
70#ifndef PLUGIN
71static inline __attribute__((always_inline)) const char* get_user_file_path(const char *path,
72 unsigned flags,
73 char* buf,
74 const size_t bufsize)
75{
76 if (flags & FORCE_BUFFER_COPY)
77 {
78 strlcpy(buf, path, bufsize);
79 return buf;
80 }
81 return path;
82}
83#endif
84
85#define paths_init()
86#else /* application */
87
88#define PLUGIN_DIR ROCKBOX_LIBRARY_PATH "/rockbox/rocks"
89#define CODECS_DIR ROCKBOX_LIBRARY_PATH "/rockbox/codecs"
90
91#define REC_BASE_DIR ROCKBOX_DIR "/"
92#define PLAYLIST_CATALOG_DEFAULT_DIR ROCKBOX_DIR "/Playlists"
93
94extern void paths_init(void);
95extern const char* get_user_file_path(const char *path,
96 unsigned flags,
97 char* buf,
98 const size_t bufsize);
99#endif /* APPLICATION */
100
101#define LANG_DIR ROCKBOX_DIR "/langs"
102
103#define PLUGIN_GAMES_DIR PLUGIN_DIR "/games"
104#define PLUGIN_APPS_DIR PLUGIN_DIR "/apps"
105#define PLUGIN_DEMOS_DIR PLUGIN_DIR "/demos"
106#define VIEWERS_DIR PLUGIN_DIR "/viewers"
107
108
109#define WPS_DIR ROCKBOX_DIR "/wps"
110#define SBS_DIR WPS_DIR
111#define THEME_DIR ROCKBOX_DIR "/themes"
112#define FONT_DIR ROCKBOX_DIR "/fonts"
113#define ICON_DIR ROCKBOX_DIR "/icons"
114
115#define BACKDROP_DIR ROCKBOX_DIR "/backdrops"
116#define EQS_DIR ROCKBOX_DIR "/eqs"
117
118/* need to fix this once the application gets record/radio abilities */
119#define RECPRESETS_DIR ROCKBOX_DIR "/recpresets"
120#define FMPRESET_PATH ROCKBOX_DIR "/fmpresets"
121
122#define DIRCACHE_FILE ROCKBOX_DIR "/dircache.dat"
123#define CODEPAGE_DIR ROCKBOX_DIR "/codepages"
124
125#define VIEWERS_CONFIG ROCKBOX_DIR "/viewers.config"
126#define CONFIGFILE ROCKBOX_DIR "/config.cfg"
127#define FIXEDSETTINGSFILE ROCKBOX_DIR "/fixed.cfg"
128
129#define PLAYLIST_CONTROL_FILE ROCKBOX_DIR "/.playlist_control"
130#define NVRAM_FILE ROCKBOX_DIR "/nvram.bin"
131#define GLYPH_CACHE_FILE ROCKBOX_DIR "/.glyphcache"
132#endif /* __PATHS_H__ */
diff --git a/firmware/font.c b/firmware/font.c
index f1584713ed..b8ad76ec3a 100644
--- a/firmware/font.c
+++ b/firmware/font.c
@@ -36,6 +36,7 @@
36#include "panic.h" 36#include "panic.h"
37#include "rbunicode.h" 37#include "rbunicode.h"
38#include "diacritic.h" 38#include "diacritic.h"
39#include "rbpaths.h"
39 40
40#define MAX_FONTSIZE_FOR_16_BIT_OFFSETS 0xFFDB 41#define MAX_FONTSIZE_FOR_16_BIT_OFFSETS 0xFFDB
41 42
@@ -56,7 +57,6 @@
56#define FONT_HEADER_SIZE 36 57#define FONT_HEADER_SIZE 36
57#endif 58#endif
58 59
59#define GLYPH_CACHE_FILE ROCKBOX_DIR"/.glyphcache"
60 60
61#ifndef BOOTLOADER 61#ifndef BOOTLOADER
62/* Font cache includes */ 62/* Font cache includes */
@@ -606,12 +606,13 @@ void glyph_cache_save(struct font* pf)
606 pf = &font_ui; 606 pf = &font_ui;
607 if (pf->fd >= 0 && pf == &font_ui) 607 if (pf->fd >= 0 && pf == &font_ui)
608 { 608 {
609#ifdef WPSEDITOR 609 char path[MAX_PATH];
610 cache_fd = open(GLYPH_CACHE_FILE, O_WRONLY|O_CREAT|O_TRUNC, 0666); 610 const char *file = get_user_file_path(GLYPH_CACHE_FILE, IS_FILE|NEED_WRITE,
611#else 611 path, sizeof(path));
612 cache_fd = creat(GLYPH_CACHE_FILE, 0666); 612
613#endif 613 cache_fd = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
614 if (cache_fd < 0) return; 614 if (cache_fd < 0)
615 return;
615 616
616 lru_traverse(&pf->cache._lru, glyph_file_write); 617 lru_traverse(&pf->cache._lru, glyph_file_write);
617 618
@@ -630,9 +631,10 @@ static void glyph_cache_load(struct font* pf)
630 int fd; 631 int fd;
631 unsigned char tmp[2]; 632 unsigned char tmp[2];
632 unsigned short ch; 633 unsigned short ch;
634 char path[MAX_PATH];
633 635
634 fd = open(GLYPH_CACHE_FILE, O_RDONLY|O_BINARY); 636 fd = open(get_user_file_path(GLYPH_CACHE_FILE, IS_FILE|NEED_WRITE,
635 637 path, sizeof(path)), O_RDONLY|O_BINARY);
636 if (fd >= 0) { 638 if (fd >= 0) {
637 639
638 while (read(fd, tmp, 2) == 2) { 640 while (read(fd, tmp, 2) == 2) {
diff --git a/firmware/include/dircache.h b/firmware/include/dircache.h
index 4472d5fbe0..650b92632d 100644
--- a/firmware/include/dircache.h
+++ b/firmware/include/dircache.h
@@ -27,7 +27,6 @@
27 27
28#define DIRCACHE_RESERVE (1024*64) 28#define DIRCACHE_RESERVE (1024*64)
29#define DIRCACHE_LIMIT (1024*1024*6) 29#define DIRCACHE_LIMIT (1024*1024*6)
30#define DIRCACHE_FILE ROCKBOX_DIR"/dircache.dat"
31 30
32#define DIRCACHE_APPFLAG_TAGCACHE 0x0001 31#define DIRCACHE_APPFLAG_TAGCACHE 0x0001
33 32
diff --git a/firmware/include/file.h b/firmware/include/file.h
index 91b701d6d2..a9d1d05a11 100644
--- a/firmware/include/file.h
+++ b/firmware/include/file.h
@@ -22,13 +22,12 @@
22#ifndef _FILE_H_ 22#ifndef _FILE_H_
23#define _FILE_H_ 23#define _FILE_H_
24 24
25#undef MAX_PATH /* this avoids problems when building simulator */
26#define MAX_PATH 260
27
28#include <sys/types.h> 25#include <sys/types.h>
29#include "config.h" 26#include "config.h"
30#include "gcc_extensions.h" 27#include "gcc_extensions.h"
31 28
29#undef MAX_PATH /* this avoids problems when building simulator */
30#define MAX_PATH 260
32#define MAX_OPEN_FILES 11 31#define MAX_OPEN_FILES 11
33 32
34#ifndef SEEK_SET 33#ifndef SEEK_SET