[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] losh: Erneut KRITIKEL gefixt
* commmands.c: Nun heißt die Datei commands.c und der Text wurde verfeinert
Signed-off-by: Alexander Kluth <hartmut@xxxxxxxxxx>
---
src/modules/c/shell/commands.c | 356 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 356 insertions(+), 0 deletions(-)
create mode 100644 src/modules/c/shell/commands.c
diff --git a/src/modules/c/shell/commands.c b/src/modules/c/shell/commands.c
new file mode 100644
index 0000000..6310735
--- /dev/null
+++ b/src/modules/c/shell/commands.c
@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 2007 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the tyndur Project
+ * and its contributors.
+ * 4. Neither the name of the tyndur 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 <stdbool.h>
+#include <types.h>
+#include <syscall.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <rpc.h>
+#include "shell.h"
+#include <dirent.h>
+#include <sys/wait.h>
+#include <init.h>
+#include <io.h>
+#include <env.h>
+
+#define TMS_MODULE cmd
+#include <tms.h>
+
+#include <lost/config.h>
+
+
+//Hier koennen die Debug-Nachrichten aktiviert werden
+#define DEBUG 0
+
+#if DEBUG == 1
+ #define DEBUG_MSG(s) printf("[ SHELL ] debug: %s() '%s'\n",__FUNCTION__,s)
+ #define DEBUG_MSG1(x, y) \
+ printf("[ SHELL ] debug: %s() '", __FUNCTION__); \
+ printf(x, y); \
+ printf("'\n");
+ #define DEBUG_MSG2(x, y, z) \
+ printf("[ SHELL ] debug: %s() '", __FUNCTION__); \
+ printf(x, y, z); \
+ printf("'\n");
+#else
+ #define DEBUG_MSG(s)
+ #define DEBUG_MSG1(s,x)
+ #define DEBUG_MSG2(s,x,y)
+#endif
+
+
+int shell_start_path_app(const char* cmd, bool wait)
+{
+ DEBUG_MSG1("Starte das Programm %s", cmd);
+ pid_t pid;
+
+ // Fuehrende Leerzeichen im Befehl grosszuegig ueberspringen
+ while (*cmd == ' ') {
+ cmd++;
+ }
+
+ pid = init_execute(cmd);
+
+ // Fehler ist aufgetreten
+ if (pid == 0) {
+ return -1;
+ }
+
+ // Wenn es gewuenscht wurde, wird jetzt gewartet, bis der Prozess beendet
+ // wird.
+ if (wait == true) {
+ int status;
+ while (waitpid(pid, &status, 0) != pid);
+ }
+ return 0;
+}
+
+/**
+ * Wird aufgerufen, wenn keiner der internen Befehle passt.
+ */
+int shell_command_default(int argc, char* argv[], const char* cmd)
+{
+ // Leere Kommandozeilen sollen keine Fehlermeldungen bringen
+ if (strlen(cmd) == 0) {
+ return 0;
+ }
+
+ if (shell_start_path_app(cmd, true) == 0) {
+ return 0;
+ }
+
+ puts(TMS(exec_not_found, "Befehl wurde nicht gefunden!"));
+ return -1;
+}
+
+/**
+ * Eine ausfuerbare Datei im aktuellen Verzeichnis oder in PATH starten.
+ */
+int shell_command_start(int argc, char* argv[], const char* cmd)
+{
+ const char* program;
+ DEBUG_MSG("start");
+
+ if (argc < 2) {
+ printf(TMS(start_usage, "\nAufruf: start <Pfad> [Argumente ...]\n"));
+ return -1;
+ }
+
+ program = strchr(cmd, ' ') + 1;
+ if (program == NULL) {
+ return -1;
+ }
+
+ if (shell_start_path_app(program, false) == 0) {
+ return 0;
+ }
+
+ puts(TMS(start_not_found, "Datei nicht gefunden!"));
+ return -1;
+}
+
+
+/**
+ *
+ */
+int shell_command_help(int argc, char* argv[], const char* args)
+{
+ char* help_args = strchr(args, ' ');
+ char* cmd;
+ int ret;
+
+ // Erstmal versuchen, ob thelp installiert ist
+ if (help_args == NULL) {
+ cmd = strdup("thelp tyndur");
+ } else {
+ asprintf(&cmd, "thelp %s", help_args + 1);
+ }
+
+ ret = shell_start_path_app(cmd, true);
+ free(cmd);
+ if (ret == 0) {
+ return 0;
+ }
+
+ // Wenn nicht, gibt es eben die klassische Hilfe
+ puts(TMS(help_text,
+ "Verfügbare Befehle:\n"
+
+ " <Pfad> Startet das Programm an <Pfad> im Vordergrund\n"
+ " start <Pfad> Startet das Programm an <Pfad> im Hintergrund\n"
+ " echo <Text> Zeigt <Text> an\n"
+ "\n"
+ " pwd Zeigt den aktuellen Verzeichnisnamen an\n"
+ " ls Zeigt den Verzeichnisinhalt an\n"
+ " stat Zeigt Informationen zur einer Datei an\n"
+ " cd <Pfad> Wechselt das Verzeichnis\n"
+ " mkdir <Pfad> Erstellt das Verzeichnis\n"
+ "\n"
+ " cp <Q> <Z> Kopiert die Datei <Q> nach <Z>\n"
+ " ln <Q> <Z> Erstellt einen auf <Q> verweisenden Link <Z>\n"
+ " symlink <Q><Z> Erstellt einen symbolischen Link <Z> auf <Q>\n"
+ " readlink <L> Liest das Ziel des Symlinks <L> aus\n"
+ " rm <Pfad> Löscht eine Datei\n"
+ "\n"
+ " cat <Pfad> Zeigt den Inhalt der Datei an\n"
+ " bincat <Pfad> Zeigt den Inhalt der Datei als einzelne Bytes an\n"
+ " pipe <Pfad> Ein-/Ausgabe auf einer Datei (z.B. TCP-Verbindung)\n"
+ " sync Alle veränderten Blöcke im Cache zurückschreiben\n"
+ "\n"
+ " date Zeigt das Datum und die Uhrzeit an\n"
+ " free Zeigt den Speicherverbrauch des Systems an\n"
+ " ps Zeigt eine Liste mit allen Prozessen an\n"
+ " pstree Zeigt die Prozesshierarchie als Baum an\n"
+ " kill <PID> Beendet den Prozess <PID>\n"
+ " dbg_st <PID> Zeigt einen Stack Backtrace des Prozesses <PID> an\n"
+
+ " set Setzt Umgebungsvariablen oder zeigt sie an\n"
+ " read <S> Liest einen Wert für die Umgebungsvariable <S> ein\n"
+ " source <S> Führt das Skript <S> in der aktuellen Shell aus\n"
+ " sleep <S> Wartet <S> Sekunden\n"
+
+ " exit Beendet die Shell\n"
+ "\n"
+ "Diese Hilfe wird in den meisten Fällen nicht auf den Bildschirm"
+ " passen. Um\n"
+ "weiter oben stehende Befehle anzuzeigen, bitte Shift-BildAuf"
+ " drücken.\n"
+ "Shift-BildAb blättert wieder nach unten. Andere Tasten springen"
+ " zurück an die\n"
+ "aktuelle Position.\n"
+ "\n"
+ ));
+
+ return 0;
+}
+
+/**
+ *
+ */
+int shell_command_version(int argc, char* argv[], const char* args)
+{
+ puts("tyndur Shell " TYNDUR_VERSION);
+ return 0;
+}
+
+/**
+ *
+ */
+int shell_command_exit(int argc, char* argv[], const char* args)
+{
+ exit(0);
+ return 0;
+}
+
+int shell_command_cd(int argc, char* argv[], const char* args)
+{
+ char* cd_args = strchr(args, ' ');
+ char* path;
+ DIR* dir;
+
+ if (cd_args == NULL) {
+ goto usage;
+ }
+
+ cd_args++;
+ path = io_get_absolute_path(cd_args);
+ if (path == NULL) {
+ goto usage;
+ }
+
+ dir = opendir(path);
+ if (dir == NULL) {
+ printf(TMS(cd_error, "Wechseln in das Verzeichnis '%s' "
+ "nicht möglich!\n"), path);
+ } else {
+ chdir(path);
+ closedir(dir);
+ }
+ free(path);
+
+ return 0;
+
+usage:
+ puts(TMS(cd_usage, "\nAufruf: cd <Verzeichnis>"));
+ return -1;
+}
+
+int shell_command_source(int argc, char* argv[], const char* args)
+{
+ const char* path;
+ if (argc != 2) {
+ printf(TMS(source_usage, "\nAufruf: source <Pfad>\n"));
+ return -1;
+ }
+
+ path = argv[1];
+ if (shell_script(path)) {
+ return 0;
+ } else {
+ printf(TMS(source_error, "Ausführen des Skripts '%s' "
+ "fehlgeschlagen.\n"), path);
+ return -1;
+ }
+}
+
+int shell_command_clear(int argc, char* argv[], const char* args)
+{
+ printf("\033[1;1H\033[2J");
+
+ return 0;
+}
+
+void set_display_usage(void);
+void set_list_vars(void);
+
+int shell_command_set(int argc, char* argv[], const char* args)
+{
+ int overwrite = 1;
+
+ while (argc > 1) {
+ if (!strcmp(argv[1], "-d")) {
+ overwrite = 0;
+ } else if (!strcmp(argv[1], "-h")) {
+ set_display_usage();
+ return EXIT_SUCCESS;
+ } else {
+ break;
+ }
+ argc--;
+ argv++;
+ }
+
+ switch (argc) {
+ case 1:
+ set_list_vars();
+ break;
+
+ case 2:
+ unsetenv(argv[1]);
+ break;
+
+ case 3:
+ setenv(argv[1], argv[2], overwrite);
+ break;
+
+ default:
+ set_display_usage();
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+void set_list_vars()
+{
+ int i, cnt;
+
+ cnt = getenv_count();
+ for (i = 0; i < cnt; i++) {
+ printf("%s = %s\n", getenv_name_by_index(i), getenv_index(i));
+ }
+}
+
+void set_display_usage()
+{
+ puts(TMS(set_usage, "\nAufruf: set [-d] [<Variable> [<Wert>]]\n\n"
+ "Optionen:\n"
+ " -d: Defaultwert setzen. Wenn die Variable schon gesetzt ist, wird "
+ "ihr Wert\n nicht geändert.\n"));
+}
+
--
1.7.7