[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH v2 5/6] libc: Rückgabewerte von fread/fwrite gefixt
! libc: Die Rückgabewerte von fread und fwrite sind eigentlich nicht
in Bytes, sondern in Blocks.
Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
src/modules/lib/stdlibc/file.c | 98 +++++++++++++++++++++++-----------------
1 files changed, 57 insertions(+), 41 deletions(-)
diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index b1b9aec..c8aa4cf 100644
--- a/src/modules/lib/stdlibc/file.c
+++ b/src/modules/lib/stdlibc/file.c
@@ -230,7 +230,7 @@ size_t fread(void* dest, size_t blocksize, size_t blockcount, FILE* io_res)
return 0;
}
- return read_bytes + ret;
+ return (read_bytes + ret) / blocksize;
}
@@ -344,9 +344,10 @@ int ungetc(int c, FILE* io_res)
size_t fwrite(const void* data, size_t blocksize, size_t blockcount,
FILE* io_res)
{
- size_t data_size = blocksize * blockcount;
-
- if ((io_res == NULL) || (io_res->res->pid == 0)) {
+ size_t data_size = blocksize * blockcount;
+ int ret;
+
+ if ((io_res == NULL) || (io_res->res->pid == 0) || (blocksize == 0)) {
return 0;
}
@@ -363,53 +364,68 @@ size_t fwrite(const void* data, size_t blocksize, size_t blockcount,
{
io_res->buffer_mode = IO_BUFFER_MODE_NONE;
}
-
+
//Wenn die Daten groesser als 64 Kilobyte sind, werden sie nicht im Buffer
// gespeichert, sondern direkt an den Zielprozess gesendet.
- switch (io_res->buffer_mode) {
- case IO_BUFFER_MODE_NONE:
- return lio_compat_write(data, blocksize, blockcount, io_res->res);
- break;
-
- case IO_BUFFER_MODE_FULL:
- //Ueberpruefen, ob genug Platz im Buffer ist, dann werden die Daten
- // in den Buffer kopiert, sonst wird der Buffer geleert, und die
- // Daten werden direkt geschrieben.
+ switch (io_res->buffer_mode) {
+ case IO_BUFFER_MODE_NONE:
+ ret = lio_compat_write(data, blocksize, blockcount, io_res->res);
+ if (ret < 0) {
+ return 0;
+ } else {
+ return ret / blocksize;
+ }
+ break;
+
+ case IO_BUFFER_MODE_FULL:
+ //Ueberpruefen, ob genug Platz im Buffer ist, dann werden die Daten
+ // in den Buffer kopiert, sonst wird der Buffer geleert, und die
+ // Daten werden direkt geschrieben.
if (io_res->buffer_size >= (io_res->buffer_pos + data_size)) {
- //Daten in den Buffer kopieren.
+ //Daten in den Buffer kopieren.
memcpy(io_res->buffer_ptr + io_res->buffer_pos, data,
- data_size);
- io_res->buffer_pos += data_size;
- return data_size;
- } else {
- if (fflush(io_res) == EOF) {
+ data_size);
+ io_res->buffer_pos += data_size;
+ return data_size / blocksize;
+ } else {
+ if (fflush(io_res) == EOF) {
return 0;
}
- return lio_compat_write(data, blocksize, blockcount, io_res->res);
- }
- break;
-
- case IO_BUFFER_MODE_LINE: {
- //Ueberpruefen, ob genug Platz im Buffer ist, sonst wird der Buffer
- // geleert, und die Daten werden auch direkt geschrieben. Auch wenn
- // die Daten mindestens einen Zeilenumbruch enthalten, wird der
- // Buffer geleert.
- if ((io_res->buffer_size < (io_res->buffer_pos + data_size)) ||
- (memchr(data, '\n', data_size) != NULL))
- {
- if (fflush(io_res) == EOF) {
+ ret = lio_compat_write(data, blocksize, blockcount, io_res->res);
+ if (ret < 0) {
return 0;
+ } else {
+ return ret / blocksize;
}
- return lio_compat_write(data, blocksize, blockcount, io_res->res);
- } else {
- //Daten in den Buffer kopieren.
- memcpy((void*)((uint32_t) io_res->buffer_ptr +
+ }
+ break;
+
+ case IO_BUFFER_MODE_LINE: {
+ //Ueberpruefen, ob genug Platz im Buffer ist, sonst wird der Buffer
+ // geleert, und die Daten werden auch direkt geschrieben. Auch wenn
+ // die Daten mindestens einen Zeilenumbruch enthalten, wird der
+ // Buffer geleert.
+ if ((io_res->buffer_size < (io_res->buffer_pos + data_size)) ||
+ (memchr(data, '\n', data_size) != NULL))
+ {
+ if (fflush(io_res) == EOF) {
+ return 0;
+ }
+ ret = lio_compat_write(data, blocksize, blockcount, io_res->res);
+ if (ret < 0) {
+ return 0;
+ } else {
+ return ret / blocksize;
+ }
+ } else {
+ //Daten in den Buffer kopieren.
+ memcpy((void*)((uint32_t) io_res->buffer_ptr +
io_res->buffer_pos), data, data_size);
- io_res->buffer_pos += data_size;
- return data_size;
- }
+ io_res->buffer_pos += data_size;
+ return data_size / blocksize;
+ }
}
- }
+ }
return 0;
}
--
1.6.0.2