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

Re: [Lost] [Patch] getterm



Am Samstag, 9. Februar 2008 14.25:47 schrieb Kevin Wolf:
> Antoine Kaufmann schrieb:
> > Index: src/modules/c/getterm/Makefile.all
> > ===================================================================
> > --- src/modules/c/getterm/Makefile.all	(Revision 0)
> > +++ src/modules/c/getterm/Makefile.all	(Revision 0)
> > @@ -0,0 +1,8 @@
> > +shopt -s extglob
> > +source $LOST_BUILDMK_ROOT/config.sh
> > +
> > +echo "LD   $1/apps/getterm"
> > +
> > +$LOST_TOOLS_LD -ogetterm -Ttext=0x40000000 --start-group *.o $2
> > --end-group +
> > +mv getterm $1/apps/
>
> Ersetz das bitte durch die mittlerweile übliche strip-Zeile.

Mach ich.

> > Index: src/modules/c/getterm/main.c
> > ===================================================================
> > --- src/modules/c/getterm/main.c	(Revision 0)
> > +++ src/modules/c/getterm/main.c	(Revision 0)
> > @@ -0,0 +1,125 @@
> > +/*
> > + * Copyright (c) 2007 The LOST Project. All rights reserved.
>
> Ja, ich weiß, das Jahr ist noch jung... ;-)

Der Code liegt bei mir auch schon seit Dezember letzen Jahres rum und wartet 
darauf eingecheckt zu werden. ;-)

> > +// Aufruf an Console zum aendern der Terminal-Optionen
> > +typedef enum {STDIN, STDOUT, STDERR} console_handle_t;
> > +typedef struct {
> > +    pid_t pid;
> > +    console_handle_t type;
> > +    char path[];
> > +} __attribute__((packed)) console_ctrl_t;
> > +
> > +/**
> > + * Pfad fuer Terminal aendern
> > + */
> > +static void console_set_handle(console_handle_t handle, const char*
> > path) +{
> > +    size_t path_len = strlen(path);
> > +    size_t size = sizeof(console_ctrl_t) + path_len + 1;
> > +
> > +    // Buffer vorbereiten
> > +    uint8_t buffer[size];
> > +    console_ctrl_t* ctrl = (console_ctrl_t*) buffer;
> > +
> > +    // Befehlsstruktur auffuellen
> > +    ctrl->pid = -1;
> > +    ctrl->type = handle;
> > +    memcpy(ctrl->path, path, path_len + 1);
> > +
> > +    // RPC durchfuehren
> > +    pid_t console_pid = init_service_get("console");
> > +    dword result = rpc_get_dword(console_pid, "CONS_SET",
> > +        size, (char*) buffer);
> > +    if (result == 0) {
> > +        printf("Fehler beim setzen des Pfades fuer die I/O-Handles.");
> > +        exit(-1);
> > +    }
> > +}
> > +
> > +/**
> > + * Hauptfunktion
> > + */
> > +int main(int argc, char* argv[])
> > +{
> > +    // Wenn die Anzahl der Argumente nicht stimmt wird abgebrochen
> > +    if (argc != 5) {
> > +        puts("Aufruf: getterm <stdin> <stdout> <stderr> <Programm>");
> > +        return -1;
> > +    }
> > +
> > +    // Ein bisschen warten, bis vterm und co bereit sind;
> > +    msleep(2000);
>
> Ähem. Wir haben schon genug von diesem Mist im SVN...

Was soll ich denn sonst hinschreiben?
Ok ein Fixme ist sicher nicht zuviel verlangt.

> > +    // Lokale Ein- und Ausgabehandles auch anpassen
> > +    stdio_init();
>
> stdio_init() ist nicht dafür vorgesehen, mehrmals aufgerufen zu werden.
> Konkret: Mindestens Leaks, weil stdin/out/err nicht geschlossen werden.

Ach, wegen diesem Bisschen Speicher... *g*

> > +
> > +    while (TRUE) {
> > +        char input = 0;
> > +        printf("\n\nEingabetaste druecken um eine Shell zu
> > starten...\n");
>
> Vielleicht besser "um %s zu starten" mit dem Pfad des Programms?

Ok.

> > +        // Auf Druecken der Eingabetaste warten
> > +        while((fread(&input, 1, 1, stdin) != 1) || (input != '\n')) {
> > +            msleep(100);
>
> yield();


In dieser 2. Version habe ich stdio_init angepasst und die vorgeschlagenen 
Änderungen durchgeführt.
Index: src/modules/c/getterm/Makefile.all
===================================================================
--- src/modules/c/getterm/Makefile.all	(Revision 0)
+++ src/modules/c/getterm/Makefile.all	(Revision 0)
@@ -0,0 +1,8 @@
+shopt -s extglob
+source $LOST_BUILDMK_ROOT/config.sh
+
+echo "LD   $1/apps/getterm"
+
+$LOST_TOOLS_LD -ogetterm -Ttext=0x40000000 --start-group *.o $2 --end-group
+
+$LOST_TOOLS_STRIP -s getterm -o $1/apps/getterm
Index: src/modules/c/getterm/main.c
===================================================================
--- src/modules/c/getterm/main.c	(Revision 0)
+++ src/modules/c/getterm/main.c	(Revision 0)
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the LOST Project
+ *     and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * 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 <stdio.h>
+#include <rpc.h>
+#include <syscall.h>
+#include <stdint.h>
+#include <sleep.h>
+#include <sys/wait.h>
+
+#define _USE_START_
+#include "init.h"
+#undef _USE_START_
+
+// Aufruf an Console zum aendern der Terminal-Optionen
+typedef enum {STDIN, STDOUT, STDERR} console_handle_t;
+typedef struct {
+    pid_t pid;
+    console_handle_t type;
+    char path[];
+} __attribute__((packed)) console_ctrl_t;
+
+/**
+ * Pfad fuer Terminal aendern
+ */
+static void console_set_handle(console_handle_t handle, const char* path)
+{
+    size_t path_len = strlen(path);
+    size_t size = sizeof(console_ctrl_t) + path_len + 1;
+    
+    // Buffer vorbereiten
+    uint8_t buffer[size];
+    console_ctrl_t* ctrl = (console_ctrl_t*) buffer;
+
+    // Befehlsstruktur auffuellen
+    ctrl->pid = -1;
+    ctrl->type = handle;
+    memcpy(ctrl->path, path, path_len + 1);
+    
+    // RPC durchfuehren
+    pid_t console_pid = init_service_get("console");
+    dword result = rpc_get_dword(console_pid, "CONS_SET",
+        size, (char*) buffer);
+    if (result == 0) {
+        printf("Fehler beim setzen des Pfades fuer die I/O-Handles.");
+        exit(-1);
+    }
+}
+
+/**
+ * Hauptfunktion
+ */
+int main(int argc, char* argv[])
+{
+    const char* program;
+
+    // Wenn die Anzahl der Argumente nicht stimmt wird abgebrochen
+    if (argc != 5) {
+        puts("Aufruf: getterm <stdin> <stdout> <stderr> <Programm>");
+        return -1;
+    }
+    program = argv[4];
+
+    // FIXME: Ein bisschen warten, bis vterm und co bereit sind
+    msleep(2000);
+
+    // Pfade bei console aendern
+    console_set_handle(STDIN, argv[1]);
+    console_set_handle(STDOUT, argv[2]);
+    console_set_handle(STDERR, argv[3]);
+
+    // Lokale Ein- und Ausgabehandles auch anpassen
+    stdio_init();
+
+    while (TRUE) {
+        char input = 0;
+        printf("\n\nEingabetaste druecken um %s zu starten...\n", program);
+        // Auf Druecken der Eingabetaste warten
+        while((fread(&input, 1, 1, stdin) != 1) || (input != '\n')) {
+            yield();
+        }
+
+        pid_t pid = init_execute(program);
+            
+        // Fehler ist aufgetreten
+        if (pid == 0) {
+            printf("Fehler beim ausfuehren von '%s'\n", program);
+            return -1;
+        }
+
+        // Jetzt wird gewartet, bis der Prozess terminiert
+        waitpid(pid, NULL, 0);
+    }
+
+    return 0;
+}
+
Index: src/modules/lib/stdlibc/stdio.c
===================================================================
--- src/modules/lib/stdlibc/stdio.c	(Revision 702)
+++ src/modules/lib/stdlibc/stdio.c	(Arbeitskopie)
@@ -50,6 +50,7 @@
     FILE* path_file;
     char path[129];
     size_t size;
+    
 
     // stdin aktualisieren
     path_file = fopen("console:/stdin",  "r");
@@ -61,8 +62,13 @@
         size = fread(path, 1, 128, path_file);
         path[size] = 0;
 
-        // stdin oeffnen
-        stdin  = fopen(path,  "rs");
+        // Falls stdin schon geoeffnet wurde, wird freopen benutzt, damit siche
+        // nichts durcheinander kommt
+        if (stdin) {
+            freopen(path, "rs", stdin);
+        } else {
+            stdin  = fopen(path,  "rs");
+        }
         fclose(path_file);
     }
 
@@ -76,8 +82,12 @@
         size = fread(path, 1, 128, path_file);
         path[size] = 0;
 
-        // stdin oeffnen
-        stdout = fopen(path,  "w");
+        // Siehe oben bei stdin
+        if (stdout) {
+            freopen(path, "a", stdout);
+        } else {
+            stdout = fopen(path,  "a");
+        }
         fclose(path_file);
     }
 
@@ -91,8 +101,12 @@
         size = fread(path, 1, 128, path_file);
         path[size] = 0;
 
-        // stdin oeffnen
-        stderr = fopen(path,  "w");
+        // Siehe oben bei stdin
+        if (stderr) {
+            freopen(path, "a", stderr);
+        } else {
+            stderr = fopen(path,  "a");
+        }
         fclose(path_file);
     }
 }