[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 4/4] 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/posix/socket.c   |    9 +++++----
 src/modules/lib/stdlibc/file.c   |   29 +++++++++++++++++++++++++++--
 src/modules/lib/stdlibc/stdio.c  |    4 ++++
 5 files changed, 51 insertions(+), 9 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..271738e 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(int_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(int_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/posix/socket.c b/src/modules/lib/posix/socket.c
index b8941d7..87112e8 100644
--- a/src/modules/lib/posix/socket.c
+++ b/src/modules/lib/posix/socket.c
@@ -29,6 +29,7 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <unistd.h>
+#include <lostio.h>
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -42,7 +43,7 @@ struct socket {
     struct tree_item    tinfo;
 
     sa_family_t         sa_family;
-    FILE                conn;
+    struct lostio_internal_file conn;
 };
 
 static tree_t* sockets = NULL;
@@ -68,7 +69,7 @@ static int create_socket(struct socket* socket)
         sockets = tree_create(struct socket, tinfo, id);
     }
 
-    socket->id = fileno(&socket->conn);
+    socket->id = fileno(&socket->conn.res);
     tree_insert(sockets, socket);
     return socket->id;
 }
@@ -126,7 +127,7 @@ int connect(int sock, struct sockaddr* address, socklen_t address_len)
     uint16_t port;
     char* path;
     int ret = 0;
-    FILE* conn;
+    struct lostio_internal_file* conn;
 
     if (socket == NULL) {
         errno = EBADF;
@@ -147,7 +148,7 @@ int connect(int sock, struct sockaddr* address, socklen_t address_len)
         goto out_ip_string;
     }
 
-    conn = fopen(path, "r+");
+    conn = (struct lostio_internal_file*) fopen(path, "r+");
     if (conn == NULL) {
         errno = ETIMEDOUT;
         ret = -1;
diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index f7b94e2..5bb60cd 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);
     
@@ -192,6 +202,7 @@ int fclose (FILE* io_res)
     }
 
     fflush(io_res);
+    setvbuf(io_res, NULL, _IONBF, 0);
 
     result = rpc_get_dword(io_res->pid, "IO_CLOSE", sizeof(io_resource_id_t),
         (char*) &(io_res->id));
@@ -753,15 +764,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
@@ -795,7 +812,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 3bb54d6..e6a1955 100644
--- a/src/modules/lib/stdlibc/stdio.c
+++ b/src/modules/lib/stdlibc/stdio.c
@@ -111,6 +111,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