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

[tyndur-devel] [PATCH v2 2/6] libc: lio_compat_open()



+ libc: lio_compat_open() öffnet einen io_resource_t und wird von
  fopen() benutzt um ein FILE zu öffnen. Die Idee ist, dass
  lio_compat_*() die Weiche zwischen LIOv1 und LIOv2 eingebaut
  bekommen und stdio von den Unterschieden isoliert bleibt.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/include/io_struct.h      |    1 -
 src/modules/include/lostio.h         |    2 +
 src/modules/lib/lostio/client/file.c |   67 ++++++++++++++++++++++++++++++
 src/modules/lib/stdlibc/file.c       |   75 ++++++++++++----------------------
 4 files changed, 95 insertions(+), 50 deletions(-)
 create mode 100644 src/modules/lib/lostio/client/file.c

diff --git a/src/modules/include/io_struct.h b/src/modules/include/io_struct.h
index 813fa5d..b769b09 100644
--- a/src/modules/include/io_struct.h
+++ b/src/modules/include/io_struct.h
@@ -48,7 +48,6 @@ typedef uint8_t io_direntry_type_t;
 typedef struct
 {
     io_resource_id_t    id;
-    char*               path;
     pid_t               pid;
     io_resource_id_t    resid;
 
diff --git a/src/modules/include/lostio.h b/src/modules/include/lostio.h
index ac13525..4bff6e7 100644
--- a/src/modules/include/lostio.h
+++ b/src/modules/include/lostio.h
@@ -189,6 +189,8 @@ void lostio_type_directory_use(void);
 void lostio_type_directory_use_as(typeid_t id);
 
 
+/// Stream oeffnen
+io_resource_t* lio_compat_open(const char* filename, uint8_t attr);
 
 /// Stream-Position setzen
 bool lio_seek(struct lostio_internal_file* io_res, uint64_t offset, int origin);
diff --git a/src/modules/lib/lostio/client/file.c b/src/modules/lib/lostio/client/file.c
new file mode 100644
index 0000000..2e3dfbf
--- /dev/null
+++ b/src/modules/lib/lostio/client/file.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2006 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Antoine Kaufmann.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <lostio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include <rpc.h>
+
+io_resource_t* lio_compat_open(const char* filename, uint8_t attr)
+{
+    char* full_path = io_get_absolute_path(filename);
+    io_resource_t* result;
+
+    if (!full_path) {
+        return NULL;
+    }
+
+    // RPC-Daten zusammenstellen
+    char msg[strlen(full_path) + 2];
+    msg[0] = attr;
+    memcpy(msg + 1, full_path, strlen(full_path) + 1);
+
+    response_t* resp = rpc_get_response(1, "IO_OPEN ", strlen(full_path) + 2,
+        (char*) msg);
+    if (resp == NULL || resp->data_length == 0) {
+        result = NULL;
+        goto out;
+    };
+
+    result = resp->data;
+    if (result->pid == 0) {
+        result = NULL;
+        goto out;
+    }
+
+out:
+    free(full_path);
+    free(resp);
+
+    return result;
+}
diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index 313eef4..6c3c63f 100644
--- a/src/modules/lib/stdlibc/file.c
+++ b/src/modules/lib/stdlibc/file.c
@@ -73,92 +73,69 @@ static void* get_shm(size_t size)
  */
 FILE* fopen (const char* filename, const char* mode)
 {
-    char* full_path = io_get_absolute_path(filename);
-    if (!full_path) {
-        return NULL;
-    }
+    uint8_t attr;
 
-    //RPC-Daten zusammenstellen
-    char msg[strlen(full_path) + 2];
-    uint8_t* attr = (uint8_t*) msg;
-    
     //Attribute aus dem mode-String parsen
-    *attr = 0;
+    attr = 0;
     int i;
     for (i = 0; i < strlen(mode); i++) {
         switch (mode[i]) {
             case 'r':
-                *attr |= IO_OPEN_MODE_READ;
+                attr |= IO_OPEN_MODE_READ;
                 if (mode[i + 1] == '+') {
-                    *attr |= IO_OPEN_MODE_WRITE;
+                    attr |= IO_OPEN_MODE_WRITE;
                 }
                 break;
 
             case 'w':
-                *attr |= IO_OPEN_MODE_WRITE | IO_OPEN_MODE_CREATE |
+                attr |= IO_OPEN_MODE_WRITE | IO_OPEN_MODE_CREATE |
                     IO_OPEN_MODE_TRUNC;
 
                 // Bei w+ muss Lesen auch aktiviert werden.
                 if (mode[i + 1] == '+') {
-                    *attr |= IO_OPEN_MODE_READ;
+                    attr |= IO_OPEN_MODE_READ;
                 }
                 break;
 
             case 'a':
-                *attr |= IO_OPEN_MODE_WRITE | IO_OPEN_MODE_CREATE 
+                attr |= IO_OPEN_MODE_WRITE | IO_OPEN_MODE_CREATE
                     | IO_OPEN_MODE_APPEND;
                 break;
 
             case 'd':
-                *attr |= IO_OPEN_MODE_DIRECTORY;
+                attr |= IO_OPEN_MODE_DIRECTORY;
                 break;
 
             case 'l':
-                *attr |= IO_OPEN_MODE_LINK;
+                attr |= IO_OPEN_MODE_LINK;
                 break;
 
         }
     }
 
-    //Dateiname inkl Null-Byte kopieren
-    memcpy((void*) ((uint32_t)msg + 1), full_path, strlen(full_path) + 1);
-
-    response_t* resp = rpc_get_response(1, "IO_OPEN ", strlen(full_path) + 2, 
-        (char*) msg);
-
-    //Da der Pfad vorhin allokiert wurde, muss er hier wieder freigegeben
-    //weren.
-    free(full_path);
+    // Datei oeffnen
+    io_resource_t* io_res = lio_compat_open(filename, attr);
+    if (io_res == NULL) {
+        return NULL;
+    }
 
+    // FILE-Struktur anlegen
     FILE* int_res;
-    io_resource_t* io_res = (io_resource_t*) resp->data;
 
-    //Wenn ein Fehler beim oeffnen aufgetreten ist, wird NULL zurueck gegeben.
-    if ((io_res == NULL) || (io_res->pid == 0) || (resp->data_length == 0)) {
-        int_res = NULL;
-    } else {
-
-        // Pfad im Handle hinterlegen
-        io_res->path = malloc(strlen(filename) + 1);
-        strcpy(io_res->path, filename);
+    int_res = calloc(1, sizeof(*int_res));
+    int_res->res = malloc(sizeof(*int_res->res));
+    *int_res->res = *io_res;
 
+    int_res->buffer_mode = IO_BUFFER_MODE_NONE;
+    int_res->buffer_ptr = NULL;
+    int_res->buffer_size = 0;
+    int_res->buffer_pos = 0;
+    int_res->free_buffer = false;
+    setvbuf(int_res, malloc(BUFSIZ), _IOFBF, BUFSIZ);
+    int_res->free_buffer = true;
 
-        int_res = calloc(1, sizeof(*int_res));
-        int_res->res = malloc(sizeof(*int_res->res));
-        *int_res->res = *io_res;
-
-        int_res->buffer_mode = IO_BUFFER_MODE_NONE;
-        int_res->buffer_ptr = NULL;
-        int_res->buffer_size = 0;
-        int_res->buffer_pos = 0;
-        int_res->free_buffer = false;
-        setvbuf(int_res, malloc(BUFSIZ), _IOFBF, BUFSIZ);
-        int_res->free_buffer = true;
+    free(io_res);
 
-        free(io_res);
-    }
-    free(resp);
-    
     return int_res;
 }
 
-- 
1.6.0.2