diff options
Diffstat (limited to 'uisimulator/x11')
-rw-r--r-- | uisimulator/x11/dir.h | 16 | ||||
-rw-r--r-- | uisimulator/x11/io.c | 38 |
2 files changed, 45 insertions, 9 deletions
diff --git a/uisimulator/x11/dir.h b/uisimulator/x11/dir.h index b1df855311..a3898076f6 100644 --- a/uisimulator/x11/dir.h +++ b/uisimulator/x11/dir.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #define dirent x11_dirent | 20 | #define dirent x11_dirent |
21 | #define readdir(x) x11_readdir(x) | 21 | #define readdir(x) x11_readdir(x) |
22 | #define opendir(x) x11_opendir(x) | 22 | #define opendir(x) x11_opendir(x) |
23 | #define closedir(x) x11_closedir(x) | ||
23 | 24 | ||
24 | /* | 25 | /* |
25 | * The defines above should let us use the readdir() and opendir() in target | 26 | * The defines above should let us use the readdir() and opendir() in target |
@@ -38,6 +39,17 @@ | |||
38 | 39 | ||
39 | #include "../../firmware/common/dir.h" | 40 | #include "../../firmware/common/dir.h" |
40 | 41 | ||
41 | extern DIR *x11_opendir(char *name); | 42 | #define SIMULATOR_ARCHOS_ROOT "archos" |
42 | extern struct dirent* x11_readdir(DIR* dir); | ||
43 | 43 | ||
44 | struct mydir { | ||
45 | DIR *dir; | ||
46 | char *name; | ||
47 | }; | ||
48 | |||
49 | typedef struct mydir MYDIR; | ||
50 | |||
51 | extern MYDIR *x11_opendir(char *name); | ||
52 | extern struct dirent* x11_readdir(MYDIR* dir); | ||
53 | extern void x11_closedir(MYDIR *dir); | ||
54 | |||
55 | #define DIR MYDIR | ||
diff --git a/uisimulator/x11/io.c b/uisimulator/x11/io.c index 0452d65ae8..726bfa26a2 100644 --- a/uisimulator/x11/io.c +++ b/uisimulator/x11/io.c | |||
@@ -1,31 +1,55 @@ | |||
1 | 1 | ||
2 | #include <sys/stat.h> | ||
2 | #include "dir.h" | 3 | #include "dir.h" |
3 | 4 | ||
4 | #define SIMULATOR_ARCHOS_ROOT "archos" | 5 | #undef DIR |
5 | 6 | ||
6 | DIR *x11_opendir(char *name) | 7 | MYDIR *x11_opendir(char *name) |
7 | { | 8 | { |
8 | char buffer[256]; /* sufficiently big */ | 9 | char buffer[256]; /* sufficiently big */ |
10 | MYDIR *my = (MYDIR *)malloc(sizeof(MYDIR)); | ||
9 | 11 | ||
10 | if(name[0] == '/') { | 12 | if(name[0] == '/') { |
11 | sprintf(buffer, "%s%s", SIMULATOR_ARCHOS_ROOT, name); | 13 | sprintf(buffer, "%s%s", SIMULATOR_ARCHOS_ROOT, name); |
12 | return opendir(buffer); | 14 | my->dir=(DIR *)opendir(buffer); |
13 | } | 15 | } |
14 | return opendir(name); | 16 | else |
17 | my->dir=(DIR *)opendir(name); | ||
18 | |||
19 | my->name = (char *)strdup(name); | ||
20 | |||
21 | return my; | ||
15 | } | 22 | } |
16 | 23 | ||
17 | struct dirent *x11_readdir(DIR *dir) | 24 | struct dirent *x11_readdir(MYDIR *dir) |
18 | { | 25 | { |
26 | char buffer[512]; /* sufficiently big */ | ||
19 | static struct dirent secret; | 27 | static struct dirent secret; |
28 | struct stat s; | ||
20 | 29 | ||
21 | struct x11_dirent *x11 = (readdir)(dir); | 30 | struct x11_dirent *x11 = (readdir)(dir->dir); |
22 | 31 | ||
23 | strcpy(secret.d_name, x11->d_name); | 32 | strcpy(secret.d_name, x11->d_name); |
24 | secret.attribute = (x11->d_type == DT_DIR)?ATTR_DIRECTORY:0; | 33 | |
34 | /* build file name */ | ||
35 | sprintf(buffer, SIMULATOR_ARCHOS_ROOT "%s/%s", | ||
36 | dir->name, x11->d_name); | ||
37 | stat(buffer, &s); /* get info */ | ||
38 | |||
39 | secret.attribute = S_ISDIR(s.st_mode)?ATTR_DIRECTORY:0; | ||
40 | secret.size = s.st_size; | ||
25 | 41 | ||
26 | return &secret; | 42 | return &secret; |
27 | } | 43 | } |
28 | 44 | ||
45 | void x11_closedir(MYDIR *dir) | ||
46 | { | ||
47 | free(dir->name); | ||
48 | (closedir)(dir->dir); | ||
49 | |||
50 | free(dir); | ||
51 | } | ||
52 | |||
29 | 53 | ||
30 | int x11_open(char *name, int opts) | 54 | int x11_open(char *name, int opts) |
31 | { | 55 | { |