summaryrefslogtreecommitdiff
path: root/lib/microtar/src/microtar-rockbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/microtar/src/microtar-rockbox.c')
-rw-r--r--lib/microtar/src/microtar-rockbox.c115
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
26static int fd_write(mtar_t *tar, const void *data, unsigned size) { 26static 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
35static 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
44static int fd_seek(mtar_t *tar, unsigned offset) { 35static 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
53static 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
44static 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
60int mtar_open(mtar_t *tar, const char *filename, const char *mode) { 53static 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 */ 59static 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 */ 66int 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}