diff options
Diffstat (limited to 'lib/microtar/src/microtar-rockbox.c')
-rw-r--r-- | lib/microtar/src/microtar-rockbox.c | 115 |
1 files changed, 53 insertions, 62 deletions
diff --git a/lib/microtar/src/microtar-rockbox.c b/lib/microtar/src/microtar-rockbox.c index 04ba93cc42..d0f579fefb 100644 --- a/lib/microtar/src/microtar-rockbox.c +++ b/lib/microtar/src/microtar-rockbox.c | |||
@@ -20,81 +20,72 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | 21 | ||
22 | #include "file.h" | 22 | #include "file.h" |
23 | #include "microtar.h" | 23 | #include "microtar-rockbox.h" |
24 | #include <stdint.h> | 24 | #include <stdint.h> |
25 | 25 | ||
26 | static int fd_write(mtar_t *tar, const void *data, unsigned size) { | 26 | static int fd_read(void* stream, void* data, unsigned size) |
27 | intptr_t fd = (intptr_t)tar->stream; | 27 | { |
28 | ssize_t res = write(fd, data, size); | 28 | ssize_t res = read((intptr_t)stream, data, size); |
29 | if(res < 0 || ((unsigned)res != size)) | 29 | if(res < 0) |
30 | return MTAR_EWRITEFAIL; | 30 | return MTAR_EREADFAIL; |
31 | else | ||
32 | return MTAR_ESUCCESS; | ||
33 | } | ||
34 | 31 | ||
35 | static int fd_read(mtar_t *tar, void *data, unsigned size) { | 32 | return res; |
36 | intptr_t fd = (intptr_t)tar->stream; | ||
37 | ssize_t res = read(fd, data, size); | ||
38 | if(res < 0 || ((unsigned)res != size)) | ||
39 | return MTAR_EREADFAIL; | ||
40 | else | ||
41 | return MTAR_ESUCCESS; | ||
42 | } | 33 | } |
43 | 34 | ||
44 | static int fd_seek(mtar_t *tar, unsigned offset) { | 35 | static int fd_write(void* stream, const void* data, unsigned size) |
45 | intptr_t fd = (intptr_t)tar->stream; | 36 | { |
46 | off_t res = lseek(fd, offset, SEEK_SET); | 37 | ssize_t res = write((intptr_t)stream, data, size); |
47 | if(res < 0 || ((unsigned)res != offset)) | 38 | if(res < 0) |
48 | return MTAR_ESEEKFAIL; | 39 | return MTAR_EWRITEFAIL; |
49 | else | ||
50 | return MTAR_ESUCCESS; | ||
51 | } | ||
52 | 40 | ||
53 | static int fd_close(mtar_t *tar) { | 41 | return res; |
54 | intptr_t fd = (intptr_t)tar->stream; | ||
55 | close(fd); | ||
56 | return MTAR_ESUCCESS; | ||
57 | } | 42 | } |
58 | 43 | ||
44 | static int fd_seek(void* stream, unsigned offset) | ||
45 | { | ||
46 | off_t res = lseek((intptr_t)stream, offset, SEEK_SET); | ||
47 | if(res < 0 || ((unsigned)res != offset)) | ||
48 | return MTAR_ESEEKFAIL; | ||
49 | else | ||
50 | return MTAR_ESUCCESS; | ||
51 | } | ||
59 | 52 | ||
60 | int mtar_open(mtar_t *tar, const char *filename, const char *mode) { | 53 | static int fd_close(void* stream) |
61 | int err; | 54 | { |
62 | int openmode; | 55 | close((intptr_t)stream); |
63 | int fd; | 56 | return MTAR_ESUCCESS; |
64 | 57 | } | |
65 | /* Init tar struct and functions */ | ||
66 | memset(tar, 0, sizeof(*tar)); | ||
67 | tar->write = fd_write; | ||
68 | tar->read = fd_read; | ||
69 | tar->seek = fd_seek; | ||
70 | tar->close = fd_close; | ||
71 | 58 | ||
72 | /* Get correct mode flags */ | 59 | static const mtar_ops_t fd_ops = { |
73 | if ( strchr(mode, 'r') ) | 60 | .read = fd_read, |
74 | openmode = O_RDONLY; | 61 | .write = fd_write, |
75 | else if ( strchr(mode, 'w') ) | 62 | .seek = fd_seek, |
76 | openmode = O_CREAT|O_TRUNC|O_WRONLY; | 63 | .close = fd_close, |
77 | else if ( strchr(mode, 'a') ) | 64 | }; |
78 | openmode = O_WRONLY|O_APPEND; | ||
79 | else | ||
80 | return MTAR_EFAILURE; | ||
81 | 65 | ||
82 | /* Open file */ | 66 | int mtar_open(mtar_t* tar, const char* filename, int flags) |
83 | fd = open(filename, openmode); | 67 | { |
84 | if(fd < 0) | 68 | /* Determine access mode */ |
85 | return MTAR_EOPENFAIL; | 69 | int access; |
70 | switch(flags & O_ACCMODE) { | ||
71 | case O_RDONLY: | ||
72 | access = MTAR_READ; | ||
73 | break; | ||
86 | 74 | ||
87 | tar->stream = (void*)(intptr_t)fd; | 75 | case O_WRONLY: |
76 | access = MTAR_WRITE; | ||
77 | break; | ||
88 | 78 | ||
89 | /* Read first header to check it is valid if mode is `r` */ | 79 | default: |
90 | if ( openmode & O_RDONLY ) { | 80 | /* Note - O_RDWR isn't very useful so we don't allow it */ |
91 | err = mtar_read_header(tar, &tar->header); | 81 | return MTAR_EAPI; |
92 | if (err != MTAR_ESUCCESS) { | ||
93 | mtar_close(tar); | ||
94 | return err; | ||
95 | } | 82 | } |
96 | } | ||
97 | 83 | ||
98 | /* Return ok */ | 84 | int fd = open(filename, flags); |
99 | return MTAR_ESUCCESS; | 85 | if(fd < 0) |
86 | return MTAR_EOPENFAIL; | ||
87 | |||
88 | /* Init tar struct and functions */ | ||
89 | mtar_init(tar, access, &fd_ops, (void*)(intptr_t)fd); | ||
90 | return MTAR_ESUCCESS; | ||
100 | } | 91 | } |