[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;
> > +}