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

[tyndur-devel] [PATCH] FTP-Client: Befehlserweiterung und mehrere kleine Bugs behoben



!ftp: Wenn 'get' mit einer nicht vorhandenen Datei aufgerufen wird hängt das
+ftp: 'pwd' und 'system' wurden hinzugefügt
*ftp: 'account' und 'quit' heisen jetzt 'user' und 'bye'
-ftp: 'exit' wurde entfernt

Signed-off-by: Paul Lange <matheeguru@xxxxxx>
---
 src/modules/c/ftp/command.c |  146 +++++++++++++++++++++++++++++++++++++++----
 src/modules/c/ftp/command.h |    8 ++-
 src/modules/c/ftp/ftp.c     |   49 +++++++++++----
 src/modules/c/ftp/ftp.h     |    5 +-
 src/modules/c/ftp/help.c    |   11 ++--
 src/modules/c/ftp/main.c    |  135 ++++++++++++++-------------------------
 6 files changed, 233 insertions(+), 121 deletions(-)

diff --git a/src/modules/c/ftp/command.c b/src/modules/c/ftp/command.c
index bf326c5..4525c01 100644
--- a/src/modules/c/ftp/command.c
+++ b/src/modules/c/ftp/command.c
@@ -37,6 +37,7 @@
 #include <stdlib.h>
 #include <types.h>
 #include <ctype.h>
+#include <string.h>
 #include <libgen.h>
 #include <sys/stat.h>
 #include <readline/readline.h>
@@ -44,14 +45,21 @@
 #include "ftp.h"
 
 #define BLOCK_128K 131072
+#define LINE_LENGTH 80
 
-void ftp_account(void)
+
+/**
+ * fragt den Benutzernamen und das Passwort ab und gibt es an den FTP-Server
+ * weiter
+ */
+void ftp_user(void)
 {
     char* input, *prompt, *c;
 
     // falls keine Verbindung besteht, abbrechen
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -81,13 +89,18 @@ void ftp_account(void)
     free(input);
 }
 
+
+/**
+ * listet die Dateien in dem aktuellen Verzeichniss auf dem FTP-Server auf
+ */
 void ftp_ls(void)
 {
     FILE* data_handle;
     char buffer[BLOCK_128K];
 
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -104,15 +117,25 @@ void ftp_ls(void)
     puts("\033[1;37mDatenverbindung beendet\033[0m");
 }
 
+
+/**
+ * laedt Dateien vom FTP-Server in das aktuelle Verzeichniss
+ *
+ * @param pathname Pfadname zur ladenten Datei
+ */
 void ftp_get(char* pathname)
 {
     FILE* data_handle;
     FILE* file_handle;
+    bool line_end = TRUE;
+    int i = 0;
     char* filename;
-    char buffer[BLOCK_128K];
+    char buffer[BLOCK_128K], string[LINE_LENGTH], c;
+    size_t count;
 
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -124,10 +147,32 @@ void ftp_get(char* pathname)
     fflush(handle);
 
     // falls 550 zurückgegeben wird, ist die Datei nicht vorhanden
-    response();
+    while (line_end) {
+        while (((c = fgetc(handle)) != '\n') && i < (LINE_LENGTH - 1)) {
+            if (c != EOF) {
+               string[i++] = c;
+            }
+        }
+        string[i] = '\0';
+        printf("%s\n", string);
+        // ueberpruefen auf 550
+        if (strncmp("550", string, 3) == 0) {
+            fclose(file_handle);
+            fclose(data_handle);
+            puts("\033[1;37mDatenverbindung beendet\033[0m");
+            return;
+        }
+        line_end = FALSE;
+
+        if ((i > 3) && (string[3] == '-')) {
+            line_end = TRUE;
+            i = 0;
+        }
+    }
 
     while (!feof(data_handle)) {
-      fwrite(buffer, 1, fread(buffer, 1, BLOCK_128K, data_handle),file_handle);
+      count = fread(buffer, 1, BLOCK_128K, data_handle);
+      fwrite(buffer, 1, count ,file_handle);
     }
 
     fclose(file_handle);
@@ -136,6 +181,12 @@ void ftp_get(char* pathname)
     puts("\033[1;37mDatenverbindung beendet\033[0m");
 }
 
+
+/**
+ * speichert eine Datei in dem aktuellen Verzeichniss auf dem FTP-Server
+ *
+ * @param pathname Pfadname zur speichernden Datei
+ */
 void ftp_put(char* pathname)
 {
     FILE* data_handle;
@@ -145,7 +196,8 @@ void ftp_put(char* pathname)
     size_t count;
 
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -155,6 +207,7 @@ void ftp_put(char* pathname)
 
     fprintf(handle, "STOR %s\r\n", filename);
     fflush(handle);
+
     response();
 
     while (!feof(file_handle)) {
@@ -168,10 +221,17 @@ void ftp_put(char* pathname)
     puts("\033[1;37mDatenverbindung beendet\033[0m");
 }
 
+
+/**
+ * erstellt ein neues Verzeichniss auf dem FTP-Server
+ *
+ * @param pathname Pfad des Ordners, der erstellt werden soll
+ */
 void ftp_mkdir(const char* pathname)
 {
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -180,10 +240,17 @@ void ftp_mkdir(const char* pathname)
     response();
 }
 
+
+/**
+ * loescht eine Datei auf dem FTP-Server
+ *
+ * @param pathname Pfad zur Datei
+ */
 void ftp_rm(const char* pathname)
 {
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -192,10 +259,17 @@ void ftp_rm(const char* pathname)
     response();
 }
 
+
+/**
+ * loescht ein Verzeichniss auf dem FTP-Server
+ *
+ * @param pathname Pfad des zu loeschenden Ordners
+ */
 void ftp_rmdir(const char* pathname)
 {
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -204,10 +278,17 @@ void ftp_rmdir(const char* pathname)
     response();
 }
 
+
+/**
+ * wechselt das Verzeichniss auf dem FTP-Server
+ *
+ * @param pathname Pfad zum neuen Verzeichniss
+ */
 void ftp_cd(const char* pathname)
 {
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -216,10 +297,15 @@ void ftp_cd(const char* pathname)
     response();
 }
 
+
+/**
+ * wechselt ins Stammverzeichniss auf dem FTP-Server
+ */
 void ftp_cdup(void)
 {
     if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
         return;
     }
 
@@ -227,3 +313,37 @@ void ftp_cdup(void)
     fflush(handle);
     response();
 }
+
+
+/**
+ * zeigt das akutell geoeffnete Verzeichniss auf dem FTP-Server an
+ */
+void ftp_pwd(void)
+{
+    if (handle == NULL) {
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
+        return;
+    }
+
+    fprintf(handle, "%s\r\n", "PWD");
+    fflush(handle);
+    response();
+}
+
+
+/**
+ * gibt den Namen des Betriebssystems vom FTP-Server aus
+ */
+void ftp_sys(void)
+{
+    if (handle == NULL) {
+        puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
+             "\033[0m");
+        return;
+    }
+
+    fprintf(handle, "%s\r\n", "SYST");
+    fflush(handle);
+    response();
+}
diff --git a/src/modules/c/ftp/command.h b/src/modules/c/ftp/command.h
index 3d4366b..d3f4f51 100644
--- a/src/modules/c/ftp/command.h
+++ b/src/modules/c/ftp/command.h
@@ -40,7 +40,7 @@
 void ftp_ls(void);
 
 // auf dem FTP-Server einloggen
-void ftp_account(void);
+void ftp_user(void);
 
 // erzeugt ein Verzeichniss auf dem FTP-Server
 // @param Pfadname+Dateiname
@@ -61,6 +61,12 @@ void ftp_cd(const char*);
 // zeigt das Hauptverzeichniss auf dem FTP-Server an
 void ftp_cdup(void);
 
+// gibt den Namen des Betriebssystems vom FTP-Server aus
+void ftp_sys(void);
+
+// zeigt das akutell geoeffnete Verzeichniss auf dem FTP-Server an
+void ftp_pwd(void);
+
 // uebertraegt eine Datei auf den FTP-Server
 // @param Pfadname+Dateiname
 void ftp_get(const char*);
diff --git a/src/modules/c/ftp/ftp.c b/src/modules/c/ftp/ftp.c
index fc600b4..5d6d023 100644
--- a/src/modules/c/ftp/ftp.c
+++ b/src/modules/c/ftp/ftp.c
@@ -45,10 +45,32 @@
 #define COMMAND_PORT 21
 #define LINE_LENGTH 80
 
+
+/**
+ * parst die Zweitangabe aus dem Eingabestring, da die Leerzeichen
+ * stoeren
+ *
+ * @param string zeigt auf den Eingabestring
+ * @return gibt Pointer auf die Zweitangabe zurueck
+ */
+char* parser(char* string)
+{
+    char* buffer;
+
+    for (; isspace(*string); string++);
+    if (*string != '\0') {
+        for (buffer = string; !isspace(*buffer) && *buffer; buffer++);
+        *buffer = '\0';
+        return string;
+    }
+    return NULL;
+}
+
+
 /**
- * sendet einen Befehl an den Server und gibt den Request aus
+ * sendet einen Befehl an den FTP-Server und gibt den Request aus
  *
- * @param command enthaelt den Befehl für den Server
+ * @param command enthaelt den Befehl für den FTP-Server
  */
 void request(const char* command)
 {
@@ -79,7 +101,7 @@ void request(const char* command)
 
 
 /**
- * gibt den Request string auf dem Bildschirm aus
+ * gibt den Requeststring auf dem Bildschirm aus
  */
 void response(void)
 {
@@ -107,18 +129,22 @@ void response(void)
 
 
 /**
- * Stellt eine Verbindung zum Server her
+ * Stellt eine Verbindung zum FTP-Server her
+ *
+ * @param hostname Name des Hostes
  */
-void ftp_connect(void)
+void ftp_connect(char* hostname)
 {
     char* host_path;
     char* prompt;
     char* input;
     char* c;
 
-    if (handle) return;
+    if (handle != NULL) return;
     puts("\033[1;37mVerbinde...\033[0m");
-    asprintf(&host_path, "tcpip:/%s:%d", host, COMMAND_PORT);
+
+    // tcpip-Pfad erzeugen
+    asprintf(&host_path, "tcpip:/%s:%d", hostname, COMMAND_PORT);
     handle = fopen(host_path, "r+");
     free(host_path);
 
@@ -158,14 +184,11 @@ void ftp_connect(void)
 
 
 /**
- * Schliest die Verbindung zum Server
+ * Schliest die Verbindung zum FTP-Server
  */
 void ftp_disconnect(void)
 {
-    if (handle == NULL) {
-        puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
-        return;
-    }
+    if (handle == NULL) return;
 
     request("QUIT");
     fclose(handle);
@@ -175,7 +198,7 @@ void ftp_disconnect(void)
 
 
 /**
- * Öffnet eine passive Datenverbindung zum Server
+ * Oeffnet eine passive Datenverbindung zum FTP-Server
  *
  * @return Handle zum Datenfluss
  */
diff --git a/src/modules/c/ftp/ftp.h b/src/modules/c/ftp/ftp.h
index d755beb..3725768 100644
--- a/src/modules/c/ftp/ftp.h
+++ b/src/modules/c/ftp/ftp.h
@@ -36,14 +36,15 @@
 #ifndef FTP_H
 #define FTP_H
 
-extern void ftp_connect(void);
 extern FILE* ftp_data_connect(void);
+extern char* parser(char*);
+extern void ftp_connect(char*);
 extern void ftp_disconnect(void);
 extern void request(const char*);
 extern void response(void);
 
-extern char* host;
 extern FILE* handle;
+extern char* host;
 extern const char* help;
 
 #endif
diff --git a/src/modules/c/ftp/help.c b/src/modules/c/ftp/help.c
index bd15e60..b7dbf59 100644
--- a/src/modules/c/ftp/help.c
+++ b/src/modules/c/ftp/help.c
@@ -35,19 +35,20 @@
 
 const char* help =
     "FTP-Client Befehlsliste:\n\n"
-    "account - einloggen mit Benutzername und Passwort\n"
     "ascii   - ascii Mode einschalten\n"
     "binary  - binary Mode einschalten\n"
+    "bye     - schließt die Verbindung zum Server und beendet den FTP-Client\n"
     "cd      - [Pfad] wechseln des Verzeichnisses auf dem Server\n"
-    "cdup    - zeigt das Stammverzeichniss auf dem Server an\n"
+    "cdup    - wechselt zum Stammverzeichniss auf dem Server\n"
     "clear   - löscht den Inhalt des Terminals\n"
     "close   - schließt die Verbindung zum Server\n"
-    "exit    - beendet den FTP-Client\n"
     "get     - [Pfad+Dateiname] holt eine Datei vom Server\n"
     "help    - zeigt diese Hilfe an\n"
     "mkdir   - [Pfad+Ordnername] erstellt einen Ordner auf dem Server\n"
     "open    - [ftp.name.net] öffnet eine Verbindung zu einem Server\n"
     "put     - [Pfad+Dateiname] speichert eine Datei auf dem Server\n"
-    "quit    - schließt die Verbindung zum Server und beendet den FTP-Client\n"
+    "pwd     - zeigt das akutell geoeffnete Verzeichniss auf dem Server an\n"
     "rm      - [Pfad+Dateiname] löscht die Datei auf dem Server\n"
-    "rmdir   - [Pfad+Verzeichnisname] löscht ein Verzeichnis auf dem Server\n";
+    "rmdir   - [Pfad+Verzeichnisname] löscht ein Verzeichnis auf dem Server\n"
+    "system  - zeigt den Namen des Betriebssystems vom Server an\n"
+    "user    - einloggen mit Benutzername und Passwort\n";
diff --git a/src/modules/c/ftp/main.c b/src/modules/c/ftp/main.c
index 34acd62..f158723 100644
--- a/src/modules/c/ftp/main.c
+++ b/src/modules/c/ftp/main.c
@@ -49,125 +49,86 @@ FILE* handle;
 int main(int argc, char* argv[])
 {
     bool prgm_end = FALSE;
-    char* input, *buffer;
+    char* input;
 
+    // nur ein Parameter ist gueltig
     if (argc == 2) {
         host = argv[1];
-        ftp_connect();
+        ftp_connect(argv[1]);
     }
 
-    // Bildet den Ablauf des kompletten Programmes
+    // bildet den Ablauf des kompletten Programmes
     do {
         input = readline("\033[1;37mFTP> \033[0m");
         // durchlaeuft den String bis zum ersten Zeichen
         for (; isspace(*input); input++);
 
-            if (!strncmp(input, "exit", 4)) {
-                prgm_end = TRUE;
-            } else if (!strncmp(input, "close", 5)) {
-                ftp_disconnect();
-            } else if (!strncmp(input, "quit", 4)) {
-                ftp_disconnect();
-                prgm_end = TRUE;
-            } else if (!strncmp(input, "help", 4)) {
-                printf(help);
+            if (!strncmp(input, "rm", 2)) {
+                input += 2;
+                input = parser(input);
+                if (input != NULL) ftp_rm(input);
+            } else if (!strncmp(input, "cd", 2)) {
+                input += 2;
+                input = parser(input);
+                if (input != NULL) ftp_cd(input);
+            } else if (!strncmp(input, "put", 3)) {
+                input += 3;
+                input = parser(input);
+                if (input != NULL) ftp_put(input);
+            } else if (!strncmp(input, "get", 3)) {
+                input += 3;
+                input = parser(input);
+                if (input != NULL) ftp_get(input);
             } else if (!strncmp(input, "open", 4)) {
-                // parst den host aus dem string
                 input += 4;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                    *buffer = '\0';
-
-                    host = input;
-                    ftp_connect();
-                }
-            } else if (!strncmp(input, "account", 7)) {
-                ftp_account();
+                input = parser(input);
+                host = input;
+                if (input != NULL) ftp_connect(input);
             } else if (!strncmp(input, "mkdir", 5)) {
                 input += 5;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                    *buffer = '\0';
-
-                    ftp_mkdir(input);
-                }
-            } else if (!strncmp(input, "rm", 2)) {
-                input += 2;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                         *buffer = '\0';
-
-                         ftp_rm(input);
-                }
+                input = parser(input);
+                if (input != NULL) ftp_mkdir(input);
             } else if (!strncmp(input, "rmdir", 5)) {
                 input += 5;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                         *buffer = '\0';
-
-                         ftp_rmdir(input);
-                }
+                input = parser(input);
+                if (input != NULL) ftp_rmdir(input);
+            } else if (!strncmp(input, "bye", 3)) {
+                ftp_disconnect();
+                prgm_end = TRUE;
+            } else if (!strncmp(input, "help", 4)) {
+                printf(help);
+            } else if (!strncmp(input, "close", 5)) {
+                ftp_disconnect();
+            } else if (!strncmp(input, "user", 4)) {
+                ftp_user();
+            } else if (!strncmp(input, "system", 6)) {
+                ftp_sys();
             } else if (!strncmp(input, "cdup", 4)) {
                 ftp_cdup();
+            } else if (!strncmp(input, "pwd", 3)) {
+                ftp_pwd();
+            } else if (!strncmp(input, "ls", 2)) {
+                ftp_ls();
+            } else if (!strncmp(input, "clear", 5)) {
+                puts("\33[2J\33[H");
             } else if (!strncmp(input, "ascii", 5)) {
                 // falls keine Verbindung besteht, abbrechen
                 if (handle == NULL) {
-                    puts("\033[1;37mEs besteht keine Serververbindung..."
+                    puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
                         "\033[0m");
                     continue;
                 }
                 request("TYPE A");
             } else if (!strncmp(input, "binary", 6)) {
                 if (handle == NULL) {
-                    puts("\033[1;37mEs besteht keine Serververbindung..."
+                    puts("\033[1;37mFehler: keine Serververbindung vorhanden..."
                         "\033[0m");
                     continue;
                 }
                 request("TYPE I");
-            } else if (!strncmp(input, "clear", 5)) {
-                puts("\33[2J\33[H");
-            } else if (!strncmp(input, "get", 3)) {
-                input += 3;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                         *buffer = '\0';
-
-                         ftp_get(input);
-                }
-            } else if (!strncmp(input, "put", 3)) {
-                input += 3;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                         *buffer = '\0';
-
-                         ftp_put(input);
-                }
-            } else if (!strncmp(input, "cd", 2)) {
-                input += 2;
-                for (; isspace(*input); input++);
-                if (*input != '\0') {
-                    for (buffer = input; !isspace(*buffer) && *buffer;
-                         buffer++);
-                    *buffer = '\0';
-
-                    ftp_cd(input);
-                }
-            } else if (!strncmp(input, "ls", 2)) {
-                ftp_ls();
             } else {
-                printf(help);
+                puts("\033[1;37mGeben sie help ein um eine Liste aller Befehle "
+                        "zu erhalten!\033[0m");
             }
 
             free(input);
-- 
1.6.0.4