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

Re: [tyndur-devel] [PATCH] FTP-Client



Op maandag 21-09-2009 om 18:23 uur [tijdzone +0200], schreef Paul Lange:

Das sieht mir alles irgendwie sehr "hardcoded" aus...wofür ist die libc
schließlich da ;-)

Zur Formatierung: In tyndur gehört der Stern für Pointer an den Typ,
nicht an die Variable (ich mach's persönlich auch anders, aber ist halt
so *g*) 

Weiter unten noch ein paar Sachen, die ich angemerkt hab.

> From: Paul Lange <matheguru94@xxxxxxxxxxxxxx>
> 
> +ftp: ftp wurde hinzugefügt
> 
> Paul Lange<matheeguru@xxxxxx>
> ---
>  src/modules/c/ftp/Makefile.all |    7 +
>  src/modules/c/ftp/command.c    |  185 ++++++++++++++++++++++++++++++
>  src/modules/c/ftp/command.h    |   43 +++++++
>  src/modules/c/ftp/ftp.c        |  241 ++++++++++++++++++++++++++++++++++++++++
>  src/modules/c/ftp/ftp.h        |   40 +++++++
>  src/modules/c/ftp/main.c       |  152 +++++++++++++++++++++++++
>  6 files changed, 668 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/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..e951c92
> --- /dev/null
> +++ b/src/modules/c/ftp/command.c
> @@ -0,0 +1,185 @@
> +/**
> + * 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 LINE_LENGTH 80
> +#define _128K 131072
> +#define _56K 57344

Die Unterstriche verwirren ein wenig (sieht man sie doch meist bei
Bibliotheksfunktionen).

> +
> +extern char *host;
> +extern FILE *handle;
> +
> +void ftp_account(void)
> +{
> +    char *input, *prompt, *c;
> +
> +    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();
> +}
> +
> +void ftp_ls(void)
> +{
> +    FILE *data_handle;
> +    char c;
> +    char buffer[LINE_LENGTH];
> +    long  i;
> +
> +    data_handle = ftp_data_connect();
> +    request("LIST");
> +
> +    while (!feof(data_handle)) {
> +        i = 0;
> +        while (((c = fgetc(data_handle)) != '\n') &&
> +               i < (LINE_LENGTH - 1) && !feof(data_handle)) {
> +            if (c != EOF) {
> +                buffer[i++] = c;
> +            }
> +        }
> +        buffer[i] = '\0';
> +        printf("%s\n", buffer);
> +    }
> +
> +    fclose(data_handle);
> +    data_handle = NULL;
> +    response();
> +    puts("\033[1;37mDatenverbindung beendet\033[0m");
> +}
> +
> +void ftp_get(char *pathname)
> +{
> +    FILE *data_handle;
> +    FILE *file_handle;
> +    char *filename;
> +    char buffer[_128K];
> +
> +    filename = basename(pathname);
> +    file_handle = fopen(filename, "w+");
> +    data_handle = ftp_data_connect();
> +
> +    fprintf(handle, "RETR %s\r\n", pathname);
> +    fflush(handle);
> +    response();
> +
> +    while (!feof(data_handle)) {
> +        fwrite(buffer, 1, fread(buffer, 1, _128K, data_handle), file_handle);
> +    }
> +
> +    fclose(file_handle);
> +    response();
> +    puts("\033[1;37mDatenverbindung beendet\033[0m");
> +}
> +
> +void ftp_put(char *pathname)
> +{
> +    FILE *data_handle;
> +    FILE *file_handle;
> +    char *filename;
> +    char buffer[_128K];
> +    size_t count;
> +
> +    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, _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)
> +{
> +    fprintf(handle, "MKD %s\r\n", pathname);
> +    fflush(handle);
> +    response();
> +}
> +
> +void ftp_rmdir(const char *pathname)
> +{
> +    fprintf(handle, "RMD %s\r\n", pathname);
> +    fflush(handle);
> +    response();
> +}
> +
> +void ftp_cd(const char *pathname)
> +{
> +    fprintf(handle, "CWD %s\r\n", pathname);
> +    fflush(handle);
> +    response();
> +}
> +
> +void ftp_cdup(void)
> +{
> +    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..565f2a3
> --- /dev/null
> +++ b/src/modules/c/ftp/command.h
> @@ -0,0 +1,43 @@
> +/**
> + * 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.
> + */
> +
> +void ftp_ls(void);
> +void ftp_account(void);
> +void ftp_mkdir(const char*);
> +void ftp_rmdir(const char*);
> +void ftp_cd(const char*);
> +void ftp_cdup(void);
> +void ftp_get(const char*);
> +void ftp_put(const char*);

Sollte man hier nicht eventuell auch noch die Parameternamen
zuschreiben?

> diff --git a/src/modules/c/ftp/ftp.c b/src/modules/c/ftp/ftp.c
> new file mode 100644
> index 0000000..c8f9298
> --- /dev/null
> +++ b/src/modules/c/ftp/ftp.c
> @@ -0,0 +1,241 @@
> +/**
> + * 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++);

Sollte es nicht evt. !isspace(*c) || *c; heißen?

> +    *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) 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);
> +
> +    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;
> +        }
> +    }
> +    for (c = response; *c != '(' || *c == '\n'; c++);
> +
> +    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++;
> +    }

Kommentieren wäre ganz nett ;-)

> +    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..bb7189e
> --- /dev/null
> +++ b/src/modules/c/ftp/ftp.h
> @@ -0,0 +1,40 @@
> +/**
> + * 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.
> + */
> +
> +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);
> diff --git a/src/modules/c/ftp/main.c b/src/modules/c/ftp/main.c
> new file mode 100644
> index 0000000..f6fe89e
> --- /dev/null
> +++ b/src/modules/c/ftp/main.c
> @@ -0,0 +1,152 @@
> +/**
> + * 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;
> +
> +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", 3)) {
> +                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)) {
> +            } else if (!strncmp(input, "open", 4)) {
So viel Zeit muss doch sein, oder ;-)
> +                // 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)) {
> +                request("TYPE A");
> +            } else if (!strncmp(input, "binary", 6)) {
> +                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 {
> +                puts("\033[1;37mFehler: Falschen Befehl eingegeben! Geben sie "
> +                   "help ein um eine Liste aller\nBefehle zu erhalten\033[0m");
> +            }
> +        } while (!prgm_end);
> +    return 0;
> +}