[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] FTP-Client
*ftp: Kommando 'help' hinzugefügt und ein paar Änderungen übernommen
Singed-off-by: Paul Lange <matheeguru@xxxxxx>
---
src/modules/c/ftp/Makefile.all | 7 +
src/modules/c/ftp/command.c | 219 ++++++++++++++++++++++++++++++++++
src/modules/c/ftp/command.h | 68 +++++++++++
src/modules/c/ftp/ftp.c | 252 ++++++++++++++++++++++++++++++++++++++++
src/modules/c/ftp/ftp.h | 45 +++++++
src/modules/c/ftp/help.c | 52 ++++++++
src/modules/c/ftp/main.c | 167 ++++++++++++++++++++++++++
7 files changed, 810 insertions(+), 0 deletions(-)
create mode 100644 src/modules/c/ftp/Makefile.all
create mode 100644 src/modules/c/ftp/command.c
create mode 100644 src/modules/c/ftp/command.h
create mode 100644 src/modules/c/ftp/ftp.c
create mode 100644 src/modules/c/ftp/ftp.h
create mode 100644 src/modules/c/ftp/help.c
create mode 100644 src/modules/c/ftp/main.c
diff --git a/src/modules/c/ftp/Makefile.all b/src/modules/c/ftp/Makefile.all
new file mode 100644
index 0000000..fb31509
--- /dev/null
+++ b/src/modules/c/ftp/Makefile.all
@@ -0,0 +1,7 @@
+shopt -s extglob
+source $LOST_BUILDMK_ROOT/config.sh
+
+echo "LD $1/apps/ftp"
+$LOST_TOOLS_LD -oftp -Ttext=0x40000000 *.o --start-group $2 --end-group
+
+mv ftp $1/apps/
diff --git a/src/modules/c/ftp/command.c b/src/modules/c/ftp/command.c
new file mode 100644
index 0000000..361793d
--- /dev/null
+++ b/src/modules/c/ftp/command.c
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <types.h>
+#include <ctype.h>
+#include <libgen.h>
+#include <sys/stat.h>
+#include <readline/readline.h>
+#include "ftp.h"
+
+#define BLOCK_128K 131072
+
+extern char* host;
+extern FILE* handle;
+
+void ftp_account(void)
+{
+ char* input, *prompt, *c;
+
+ // falls keine Verbindung besteht, abbrechen
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ asprintf(&prompt, "\033[1;37mBenutzer (%s): \033[0m", host);
+ input = readline(prompt);
+ free(prompt);
+
+ // sorgt dafür, dass die Leerzeichen entfernt werden
+ for (; isspace(*input); input++);
+ for (c = input; !isspace(*c) && *c; c++);
+ *c = '\0';
+
+ fprintf(handle, "USER %s\r\n", input);
+ fflush(handle);
+ response();
+
+ free(input);
+ input = readline("\033[1;37mPasswort: \033[0m");
+
+ for (; isspace(*input); input++);
+ for (c = input; !isspace(*c) && *c; c++);
+ *c = '\0';
+
+ fprintf(handle, "PASS %s\r\n", input);
+ fflush(handle);
+ response();
+ free(input);
+}
+
+void ftp_ls(void)
+{
+ FILE* data_handle;
+ char buffer[BLOCK_128K];
+
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ data_handle = ftp_data_connect();
+ request("LIST");
+
+ while (!feof(data_handle)) {
+ fwrite(buffer, 1, fread(buffer, 1, BLOCK_128K, data_handle),stdout);
+ }
+
+ // das verbraucht noch viel Zeit, da tyndur lange braucht für das fclose()
+ fclose(data_handle);
+ response();
+ puts("\033[1;37mDatenverbindung beendet\033[0m");
+}
+
+void ftp_get(char* pathname)
+{
+ FILE* data_handle;
+ FILE* file_handle;
+ char* filename;
+ char buffer[BLOCK_128K];
+
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ filename = basename(pathname);
+ file_handle = fopen(filename, "w+");
+ data_handle = ftp_data_connect();
+
+ fprintf(handle, "RETR %s\r\n", pathname);
+ fflush(handle);
+
+ // falls 550 zurückgegeben wird, ist die Datei nicht vorhanden
+ response();
+
+ while (!feof(data_handle)) {
+ fwrite(buffer, 1, fread(buffer, 1, BLOCK_128K, data_handle),file_handle);
+ }
+
+ fclose(file_handle);
+ fclose(data_handle);
+ response();
+ puts("\033[1;37mDatenverbindung beendet\033[0m");
+}
+
+void ftp_put(char* pathname)
+{
+ FILE* data_handle;
+ FILE* file_handle;
+ char* filename;
+ char buffer[BLOCK_128K];
+ size_t count;
+
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ filename = basename(pathname);
+ file_handle = fopen(pathname, "r");
+ data_handle = ftp_data_connect();
+
+ fprintf(handle, "STOR %s\r\n", filename);
+ fflush(handle);
+ response();
+
+ while (!feof(file_handle)) {
+ count = fread(buffer, 1, BLOCK_128K, file_handle);
+ fwrite(buffer, 1, count, data_handle);
+ }
+
+ fclose(file_handle);
+ fclose(data_handle);
+ response();
+ puts("\033[1;37mDatenverbindung beendet\033[0m");
+}
+
+void ftp_mkdir(const char* pathname)
+{
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ fprintf(handle, "MKD %s\r\n", pathname);
+ fflush(handle);
+ response();
+}
+
+void ftp_rmdir(const char* pathname)
+{
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ fprintf(handle, "RMD %s\r\n", pathname);
+ fflush(handle);
+ response();
+}
+
+void ftp_cd(const char* pathname)
+{
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ fprintf(handle, "CWD %s\r\n", pathname);
+ fflush(handle);
+ response();
+}
+
+void ftp_cdup(void)
+{
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ fprintf(handle, "%s\r\n", "CDUP");
+ fflush(handle);
+ response();
+}
diff --git a/src/modules/c/ftp/command.h b/src/modules/c/ftp/command.h
new file mode 100644
index 0000000..a5a27e9
--- /dev/null
+++ b/src/modules/c/ftp/command.h
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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.
+ */
+
+#ifndef COMMAND_H
+#define COMMAND_H
+
+// listet die Dateien aus dem aktuellen Verzeichniss des FTP-Servers auf
+void ftp_ls(void);
+
+// auf dem FTP-Server einloggen
+void ftp_account(void);
+
+// erzeugt ein Verzeichniss auf dem FTP-Server
+// @param Pfadname+Dateiname
+void ftp_mkdir(const char*);
+
+// loescht ein Verzeichniss auf dem FTP-Server
+// @param Pfadname+Dateiname
+void ftp_rmdir(const char*);
+
+// wechselt das Verzeichniss auf dem FTP-Server
+// @param Pfadname
+void ftp_cd(const char*);
+
+// zeigt das Hauptverzeichniss auf dem FTP-Server an
+void ftp_cdup(void);
+
+// uebertraegt eine Datei auf den FTP-Server
+// @param Pfadname+Dateiname
+void ftp_get(const char*);
+
+// speichert eine Datei vom FTP-Server
+// @param Pfadname+Dateiname
+void ftp_put(const char*);
+
+#endif
diff --git a/src/modules/c/ftp/ftp.c b/src/modules/c/ftp/ftp.c
new file mode 100644
index 0000000..6650565
--- /dev/null
+++ b/src/modules/c/ftp/ftp.c
@@ -0,0 +1,252 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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, INCZLUDING, 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 <stdlib.h>
+#include <types.h>
+#include <ctype.h>
+#include <string.h>
+#include <readline/readline.h>
+
+#define COMMAND_PORT 21
+#define LINE_LENGTH 80
+
+extern char* host;
+extern FILE* handle;
+
+/**
+ * sendet einen Befehl an den Server und gibt den Request aus
+ *
+ * @param command enthaelt den Befehl für den Server
+ */
+void request(const char* command)
+{
+ char buffer;
+ char response[LINE_LENGTH];
+ bool line_end = TRUE;
+ int i = 0;
+
+ fprintf(handle, "%s\r\n", command);
+ fflush(handle);
+
+ while (line_end) {
+ while (((buffer = fgetc(handle)) != '\n') && i < (LINE_LENGTH - 1)) {
+ if (buffer != EOF) {
+ response[i++] = buffer;
+ }
+ }
+ response[i] = '\0';
+ printf("%s\n", response);
+ line_end = FALSE;
+
+ if ((i > 3) && (response[3] == '-')) {
+ line_end = TRUE;
+ i = 0;
+ }
+ }
+}
+
+
+/**
+ * gibt den Request string auf dem Bildschirm aus
+ */
+void response(void)
+{
+ char buffer;
+ char response[LINE_LENGTH];
+ bool line_end = TRUE;
+ int i = 0;
+
+ while (line_end) {
+ while (((buffer = fgetc(handle)) != '\n') && i < (LINE_LENGTH - 1)) {
+ if (buffer != EOF) {
+ response[i++] = buffer;
+ }
+ }
+ response[i] = '\0';
+ printf("%s\n", response);
+ line_end = FALSE;
+
+ if ((i > 3) && (response[3] == '-')) {
+ line_end = TRUE;
+ i = 0;
+ }
+ }
+}
+
+
+/**
+ * Stellt eine Verbindung zum Server her
+ */
+void ftp_connect(void)
+{
+ char* host_path;
+ char* prompt;
+ char* input;
+ char* c;
+
+ if (handle) return;
+ puts("\033[1;37mVerbinde...\033[0m");
+ asprintf(&host_path, "tcpip:/%s:%d", host, COMMAND_PORT);
+ handle = fopen(host_path, "r+");
+ free(host_path);
+
+ if (!handle) {
+ puts("\033[1;37mFehler: Host nicht erreichbar!\033[0m");
+ handle = NULL;
+ return;
+ }
+ printf("\033[1;37mVerbunden mit %s, warte auf Antwort...\033[0m\n", host);
+ response();
+
+ asprintf(&prompt, "\033[1;37mBenutzer (%s): \033[0m", host);
+ input = readline(prompt);
+ free(prompt);
+
+ // sorgt dafür, dass die Leerzeichen entfernt werden
+ for (; isspace(*input); input++);
+ for (c = input; !isspace(*c) && *c; c++);
+ *c = '\0';
+
+ fprintf(handle, "USER %s\r\n", input);
+ fflush(handle);
+ response();
+
+ input = readline("\033[1;37mPasswort: \033[0m");
+
+ for (; isspace(*input); input++);
+ for (c = input; !isspace(*c) && *c; c++);
+ *c = '\0';
+
+ fprintf(handle, "PASS %s\r\n", input);
+ fflush(handle);
+ response();
+
+ request("TYPE A");
+}
+
+
+/**
+ * Schliest die Verbindung zum Server
+ */
+void ftp_disconnect(void)
+{
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung...\033[0m");
+ return;
+ }
+
+ request("QUIT");
+ fclose(handle);
+ handle = NULL;
+ puts("\033[1;37mVerbindung getrennt...\033[0m");
+}
+
+
+/**
+ * Öffnet eine passive Datenverbindung zum Server
+ *
+ * @return Handle zum Datenfluss
+ */
+FILE* ftp_data_connect(void)
+{
+ char buffer;
+ char* c, *host_path;
+ char response[LINE_LENGTH], portI[4], portII[4];
+ bool line_end = TRUE;
+ unsigned int port, port_low;
+ int i = 0;
+ FILE* data_handle = NULL;
+
+ puts("\033[1;37mDatenverbindung wird geöffnet...\033[0m");
+ fprintf(handle, "%s\r\n", "PASV");
+ fflush(handle);
+
+ // hier wird statt response() aufzurufen, der Inhalt dieser Funktion
+ // wiedergegeben, da der Inhalt des response noch gebraucht wird
+ while (line_end) {
+ while (((buffer = fgetc(handle)) != '\n') && i < (LINE_LENGTH - 1)) {
+ if (buffer != EOF) {
+ response[i++] = buffer;
+ }
+ }
+ response[i] = '\0';
+ printf("%s\n", response);
+ line_end = FALSE;
+
+ if ((i > 3) && (response[3] == '-')) {
+ line_end = TRUE;
+ i = 0;
+ }
+ }
+ // bis zum zur Klammer Parsen
+ for (c = response; *c != '(' || *c == '\n'; c++);
+
+ // hier wird der Port rausgeparst, der dann noch in Zahlenwerte umgewandelt
+ // werden sowie noch zusammengerechnet werden muss, da der Port so vom
+ // Server verschickt wird '(127, 0, 0, 1, p1,p2)'. Vorne die IP dahinter
+ // der Port, der so zusammengerechnet werden muss p1*256 + p2!
+ i = 0;
+ while (i < 4) {
+ for (; *(c++) != ',' || *c == '\n';);
+ i++;
+ }
+
+ i = 0;
+ while (*c != ',' || *c == '\n') {
+ portI[i] = *c;
+ i++;
+ c++;
+ }
+ portI[i++] = '\0';
+ c++;
+ i = 0;
+ while (*c != ')' || *c == '\n') {
+ portII[i] = *c;
+ i++;
+ c++;
+ }
+ portII[i++] = '\0';
+ port = atoi(portI);
+ port *= 256;
+ port_low = atoi(portII);
+ port += port_low;
+
+ asprintf(&host_path, "tcpip:/%s:%d", host, port);
+ data_handle = fopen(host_path, "r+");
+ free(host_path);
+
+ return data_handle;
+}
diff --git a/src/modules/c/ftp/ftp.h b/src/modules/c/ftp/ftp.h
new file mode 100644
index 0000000..efb797e
--- /dev/null
+++ b/src/modules/c/ftp/ftp.h
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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.
+ */
+
+#ifndef FTP_H
+#define FTP_H
+
+extern void ftp_connect(void);
+extern FILE* ftp_data_connect(void);
+extern void ftp_disconnect(void);
+extern void request(const char*);
+extern void response(void);
+
+#endif
diff --git a/src/modules/c/ftp/help.c b/src/modules/c/ftp/help.c
new file mode 100644
index 0000000..3150c88
--- /dev/null
+++ b/src/modules/c/ftp/help.c
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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.
+ */
+
+char* help =
+"FTP-Client Befehlsliste:\n\n"
+"account - einloggen mit Benutzername und Passwort\n"
+"ascii - ascii Mode einschalten\n"
+"binary - binary Mode einschalten\n"
+"cd - [Pfad] wechseln des Verzeichnisses auf dem Server\n"
+"cdup - zeigt das Stammverzeichniss auf dem Server an\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"
+"rmdir - [Pfad+Ordnername] löscht einen Ordner auf dem Server\n";
diff --git a/src/modules/c/ftp/main.c b/src/modules/c/ftp/main.c
new file mode 100644
index 0000000..48e4ac6
--- /dev/null
+++ b/src/modules/c/ftp/main.c
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Paul Lange.
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <readline/readline.h>
+#include <types.h>
+#include "command.h"
+#include "ftp.h"
+
+char* host;
+FILE* handle;
+
+extern char* help;
+
+int main(int argc, char* argv[])
+{
+ bool prgm_end = FALSE;
+ char* input, *buffer;
+
+ if (argc == 2) {
+ host = argv[1];
+ ftp_connect();
+ }
+
+ // 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);
+ } 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();
+ } 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, "rmdir", 5)) {
+ input += 5;
+ for (; isspace(*input); input++);
+ if (*input != '\0') {
+ for (buffer = input; !isspace(*buffer) && *buffer;
+ buffer++);
+ *buffer = '\0';
+
+ ftp_rmdir(input);
+ }
+ } else if (!strncmp(input, "cdup", 4)) {
+ ftp_cdup();
+ } else if (!strncmp(input, "ascii", 5)) {
+ // falls keine Verbindung besteht, abbrechen
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung..."
+ "\033[0m");
+ continue;
+ }
+ request("TYPE A");
+ } else if (!strncmp(input, "binary", 6)) {
+ if (handle == NULL) {
+ puts("\033[1;37mes besteht keine Serververbindung..."
+ "\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);
+ }
+
+ free(input);
+ } while (!prgm_end);
+ return 0;
+}
--
1.6.0.4