summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/stdio_compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lib/stdio_compat.c')
-rw-r--r--apps/plugins/lib/stdio_compat.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/apps/plugins/lib/stdio_compat.c b/apps/plugins/lib/stdio_compat.c
index d2b8f9bbc7..957dd0ddc1 100644
--- a/apps/plugins/lib/stdio_compat.c
+++ b/apps/plugins/lib/stdio_compat.c
@@ -20,12 +20,16 @@
20 20
21#include "plugin.h" 21#include "plugin.h"
22#include "stdio_compat.h" 22#include "stdio_compat.h"
23#include "errno.h"
23 24
24static _FILE_ __file__[MAX_STDIO_FILES] = { 25static _FILE_ __file__[MAX_STDIO_FILES] = {
25 {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0}, 26 {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0},
26 {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0} 27 {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0},
28 {-1,-1,0},{-1,-1,0},{-1,-1,0}
27}; 29};
28 30
31_FILE_ *_stdout_ = NULL, *_stderr_ = NULL;
32
29_FILE_ *_fopen_(const char *path, const char *mode) 33_FILE_ *_fopen_(const char *path, const char *mode)
30{ 34{
31 _FILE_ *f = __file__; 35 _FILE_ *f = __file__;
@@ -34,13 +38,16 @@ _FILE_ *_fopen_(const char *path, const char *mode)
34 int i; 38 int i;
35 39
36 /* look for free slot */ 40 /* look for free slot */
37 for (i=0; i<MAX_OPEN_FILES; i++, f++) 41 for (i=0; i<MAX_STDIO_FILES; i++, f++)
38 if (f->fd == -1) 42 if (f->fd == -1)
39 break; 43 break;
40 44
41 /* no empty slots */ 45 /* no empty slots */
42 if (i == MAX_STDIO_FILES) 46 if (i == MAX_STDIO_FILES)
47 {
48 rb->splash(HZ, "no open slots");
43 return NULL; 49 return NULL;
50 }
44 51
45 if (*mode != 'r') 52 if (*mode != 'r')
46 { 53 {
@@ -72,10 +79,14 @@ _FILE_ *_fopen_(const char *path, const char *mode)
72 } 79 }
73 80
74 81
75 fd = rb->open(path, flags); 82 fd = rb->open(path, flags, 0666);
76 83
77 if (fd == -1) 84 if (fd < 0)
85 {
86 //extern int errno;
87 //rb->splashf(HZ*2, "open of %s failed (%d)", path, errno);
78 return NULL; 88 return NULL;
89 }
79 90
80 /* initialize */ 91 /* initialize */
81 f->fd = fd; 92 f->fd = fd;
@@ -97,23 +108,40 @@ size_t _fread_(void *ptr, size_t size, size_t nmemb, _FILE_ *stream)
97 108
98 if (ret < (ssize_t)(size*nmemb)) 109 if (ret < (ssize_t)(size*nmemb))
99 stream->error = -1; 110 stream->error = -1;
100 111 return ret / size;
101 return ret;
102} 112}
103 113
104size_t _fwrite_(const void *ptr, size_t size, size_t nmemb, _FILE_ *stream) 114size_t _fwrite_(const void *ptr, size_t size, size_t nmemb, _FILE_ *stream)
105{ 115{
106 ssize_t ret = rb->write(stream->fd, ptr, size*nmemb); 116 if(stream)
117 {
118 ssize_t ret = rb->write(stream->fd, ptr, size*nmemb);
107 119
108 if (ret < (ssize_t)(size*nmemb)) 120 if (ret < (ssize_t)(size*nmemb))
109 stream->error = -1; 121 stream->error = -1;
110 122
111 return ret; 123 return ret / size;
124 }
125#if 1
126 else
127 {
128 char buf[10];
129 rb->snprintf(buf, 10, "%%%ds", size*nmemb);
130 rb->splashf(HZ, buf, ptr);
131 return size * nmemb;
132 }
133#endif
112} 134}
113 135
114int _fseek_(_FILE_ *stream, long offset, int whence) 136int _fseek_(_FILE_ *stream, long offset, int whence)
115{ 137{
116 return rb->lseek(stream->fd, offset, whence); 138 if(rb->lseek(stream->fd, offset, whence) >= 0)
139 return 0;
140 else
141 {
142 rb->splashf(HZ, "lseek() failed: %d fd:%d", errno, stream->fd);
143 return -1;
144 }
117} 145}
118 146
119long _ftell_(_FILE_ *stream) 147long _ftell_(_FILE_ *stream)