[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] libc: Blockpuffer auf allen Dateien aktivieren
* libc: Blockpuffer auf allen Dateien aktivieren
* libc: Buffer fuer stderr deaktivieren
---
src/modules/include/lostio.h | 6 ++++++
src/modules/lib/lostio/handler.c | 12 +++++++++---
src/modules/lib/stdlibc/file.c | 30 ++++++++++++++++++++++++++++--
src/modules/lib/stdlibc/stdio.c | 4 ++++
4 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/src/modules/include/lostio.h b/src/modules/include/lostio.h
index 60cddf1..57e3cf7 100644
--- a/src/modules/include/lostio.h
+++ b/src/modules/include/lostio.h
@@ -117,6 +117,12 @@ typedef struct
} typehandle_t;
+/// Geoeffnete Datei auf Clientseite (Wrapper fuer FILE)
+struct lostio_internal_file {
+ io_resource_t res;
+ bool free_buffer;
+};
+
///LostIO-Schnittstelle initialisieren
void lostio_init(void);
diff --git a/src/modules/lib/lostio/handler.c b/src/modules/lib/lostio/handler.c
index ce61485..0c9c1b6 100644
--- a/src/modules/lib/lostio/handler.c
+++ b/src/modules/lib/lostio/handler.c
@@ -63,6 +63,12 @@ void rpc_io_open(pid_t pid, dword correlation_id, size_t data_size, void* data)
//Wird bei pipes als quelle verwendet
io_resource_t* io_source = (io_resource_t*) ((dword)data + 1 + sizeof(pid_t));
+
+ // FIXME
+ struct lostio_internal_file* int_source = malloc(sizeof(*int_source));
+ int_source->res = *io_source;
+ int_source->free_buffer = FALSE;
+ io_source = &int_source->res;
byte* attr = (byte*) data;
pid_t* caller_pid = (pid_t*) ((dword)data + 1 );
@@ -79,6 +85,7 @@ void rpc_io_open(pid_t pid, dword correlation_id, size_t data_size, void* data)
{
io_res.pid = 0;
rpc_send_response(pid, correlation_id, sizeof(io_resource_t), (char*) &io_res);
+ free(io_source);
}
else
{
@@ -120,6 +127,7 @@ void rpc_io_open(pid_t pid, dword correlation_id, size_t data_size, void* data)
if(io_res.id == 0)
{
io_res.pid = 0;
+ free(io_source);
}
rpc_send_response(pid, correlation_id, sizeof(io_resource_t), (char*) &io_res);
@@ -562,13 +570,11 @@ static lostio_filehandle_t* lostio_open(char* path, byte attr, pid_t pid, io_res
handle->id = handle_id++;
handle->pid = pid;
handle->flags = attr;
- handle->source = malloc(sizeof(io_resource_t));
+ handle->source = io_source;
handle->pos = 0;
handle->data = NULL;
handle->node = node;
- memcpy(handle->source, io_source, sizeof(io_resource_t));
-
filehandles = list_push(filehandles, (void*) handle);
//printf("[ LOSTIO ] Oeffne '%s' '%s'\n", node->name, path);
diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index bd4cb1c..34b8171 100644
--- a/src/modules/lib/stdlibc/file.c
+++ b/src/modules/lib/stdlibc/file.c
@@ -142,6 +142,16 @@ FILE* fopen (const char* filename, const char* mode)
// Pfad im Handle hinterlegen
io_res->path = malloc(strlen(filename) + 1);
strcpy(io_res->path, filename);
+
+
+ struct lostio_internal_file* int_res = malloc(sizeof(*int_res));
+ int_res->res = *io_res;
+ int_res->free_buffer = FALSE;
+ setvbuf(&int_res->res, malloc(BUFSIZ), _IOFBF, BUFSIZ);
+ int_res->free_buffer = TRUE;
+
+ free(io_res);
+ io_res = &int_res->res;
}
free(resp);
@@ -191,6 +201,8 @@ int fclose (FILE* io_res)
return EOF;
}
+ setvbuf(io_res, NULL, _IONBF, 0);
+
result = rpc_get_dword(io_res->pid, "IO_CLOSE", sizeof(io_resource_id_t),
(char*) &(io_res->id));
free(io_res);
@@ -749,15 +761,21 @@ int fpurge(io_resource_t* io_res)
*/
int setvbuf(FILE* io_res, char* buffer, int mode, size_t size)
{
+ struct lostio_internal_file* int_res =
+ (struct lostio_internal_file*) io_res;
+ char* old_buffer;
+
// Wenn das Dateihandle nicht in Ordung ist, wird abgebrochen
if (io_res == NULL) {
return -1;
}
+ old_buffer = io_res->buffer_ptr;
+
if (buffer == NULL) {
io_res->buffer_ptr = NULL;
io_res->buffer_mode = IO_BUFFER_MODE_NONE;
- return 0;
+ goto out;
}
//Hier wird ein switch benutzt, damit keine nicht Definierten Werte fuer
@@ -791,7 +809,15 @@ int setvbuf(FILE* io_res, char* buffer, int mode, size_t size)
default:
return -1;
}
-
+
+out:
+ // Wenn bis jetzt ein intern Alloziierter Puffer benutzt wurde, muss er
+ // freigegeben werden.
+ if (int_res->free_buffer && old_buffer && (old_buffer != buffer)) {
+ free(old_buffer);
+ int_res->free_buffer = FALSE;
+ }
+
return 0;
}
diff --git a/src/modules/lib/stdlibc/stdio.c b/src/modules/lib/stdlibc/stdio.c
index 6685a82..e1fa127 100644
--- a/src/modules/lib/stdlibc/stdio.c
+++ b/src/modules/lib/stdlibc/stdio.c
@@ -102,6 +102,10 @@ void stdio_init(void)
} else {
stderr = fopen(path, "a");
}
+
+ // stderr soll ungepuffert sein
+ setvbuf(stderr, NULL, _IONBF, 0);
+
fclose(path_file);
}
}
--
1.6.0.6