Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Sep 1997 02:38:32 -0600 (MDT)
From:      Wes Peters <softweyr@xmission.com>
To:        "Paul Missman" <missmanp@milo.cfw.com>
Cc:        questions@freebsd.org
Subject:   Re: FTP under program control 
Message-ID:  <199709040838.CAA14489@obie.softweyr.ml.org>
In-Reply-To: <199709040033.TAA07859@nospam.hiwaay.net>
References:  <missmanp@milo.cfw.com> <199709032320.QAA14728@hub.freebsd.org> <199709040033.TAA07859@nospam.hiwaay.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Paul asked:
 % I was interested in using ftp as a mechanism, under program control,
 % to transfer files from a series of data collection programs to a
 % central database program.  I know that the FreeBSD make files for the
 % ports programs make use of ftp, to transfer the ports sources
 % automatically.  How is this being done?  Can anyone point me to some
 % sample code?

man ftpio.  This library contains simple routines to talk to FTP servers
programmatically.  Here is a sample, a small command-line ftp client
that allows you to 'stuff' a file onto another system:

/*
 * Stuff - ftp put a file on a remote system using a URL.
 */

#include <stdio.h>
#include <ftpio.h>

static char *programName;

void
usage(void)
{
    printf("\
usage: %s [-v] host user pass local remote\n\
\n\
\t    -a - ascii mode.\n\
\t    -b - binary mode.\n\
\t    -v - be verbose.\n\
\n\
\t  host - hostname to stuff the file on.\n\
\t  user - username on host.\n\
\t  pass - password for user.\n\
\t local - local file to stuff.\n\
\tremote - directory on remote host.\n",
           programName);
}


main(int argc, char *argv[])
{
    int status = 0, errors = 0, nbytes;
    int verbose = 0, binary = 0, ascii = 0;
    char buf[BUFSIZ];
    FILE *file;
    FILE *serv;
    FILE *sess;

    char *host, *user, *pass, *local, *remote;

    programName = argv[0];

    /*
     * Parse command-line options.
     */
    while (argc > 6 && *argv[1] == '-')
    {
        char opt = *(argv[1] + 1);
        switch (opt)
        {
        case 'a':
            ascii = 1;
            if (verbose)
                printf("%s: ascii mode.\n", programName);
            break;

        case 'b':
            binary = 1;
            if (verbose)
                printf("%s: binary mode.\n", programName);
            break;

        case 'v':
            verbose = 1;
            printf("%s: being verbose.\n", programName);
            break;

        default:
            printf("%s: unknown option %c.\n", programName, opt);
        }
            
        /*
         * Fixup the command line so we don't see the options anymore.
         */
        ++argv;
        --argc;
    }

    if (argc != 6)
    {
        usage();
        return -1;
    }

    host = argv[1];
    user = argv[2];
    pass = argv[3];
    local = argv[4];
    remote = argv[5];

    file = fopen(local, "r");
    if (file == NULL)
    {
        printf("%s: cannot open %s for reading.\n", programName, local);
        ++errors;
    }
    else
    {
        printf("Opened %s for reading.\n", local);
    }

    serv = ftpLogin(host, user, pass, 0, verbose, &status);
    if (serv == NULL)
    {
        printf("%s: cannot open %s@%s for writing.\n", programName, user, host);
        ++errors;
    }
    else
    {
        printf("Opened %s@%s for writing.\n", user, host);
    }

    if ((status = ftpChdir(serv, remote)) != 0)
    {
        printf("%s: cannot chdir to %s:%s.\n", programName, host, remote);
        ++errors;
    }
    else
    {
        printf("%s: current working directory %s:%s.\n", programName, host, remote);
    }

    if (ascii)
    {
        if ((status = ftpAscii(serv)) != 0)
        {
            printf("%s: cannot put %s in ASCII mode.\n", programName, host);
            ++errors;
        }
        else
        {
            printf("%s: %s ASCII mode.\n", programName, host, remote);
        }
    }

    if (binary)
    {
        if ((status = ftpBinary(serv)) != 0)
        {
            printf("%s: cannot put %s in BINARY mode.\n", programName, host);
            ++errors;
        }
        else
        {
            printf("%s: %s BINARY mode.\n", programName, host, remote);
        }
    }

    sess = ftpPut(serv, local);
    if (sess == NULL)
    {
        printf("%s: cannot create remote file %s.\n", programName, file);
        ++errors;
    }
    else
    {
        printf("%s: created %s.\n", programName, local);
    }

    if (status)
    {
        printf("%s: %s\n", programName, ftpErrString(status));
        return status;
    }

    if (errors)
    {
        return -errors;
    }

    errors = 0;
    while ((nbytes = fread(buf, 1, BUFSIZ, file)) > 0)
    {
        if (verbose)
            printf("Writing %d bytes to block #%d\n", nbytes, errors++);
        if (fwrite(buf, 1, nbytes, sess) != nbytes)
        {
            printf("%s: error writing block #%d.\n", programName, errors - 1);
        }
    }

    fclose(sess);
    fclose(serv);
    fclose(file);

    return status;
}

-- 
          "Where am I, and what am I doing in this handbasket?"

Wes Peters                                                       Softweyr LLC
http://www.xmission.com/~softweyr                       softweyr@xmission.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199709040838.CAA14489>