diff options
author | des <des@FreeBSD.org> | 1998-07-12 22:34:40 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 1998-07-12 22:34:40 +0000 |
commit | 54143a63f80a2475a26b79155d70cd29d4852b61 (patch) | |
tree | 1f893e49f8094a6d683a2997270fc22c324aec85 /lib/libfetch/ftp.c | |
parent | 2480a048bed9522e1b2d9121e44db4c7398791b9 (diff) | |
download | FreeBSD-src-54143a63f80a2475a26b79155d70cd29d4852b61.zip FreeBSD-src-54143a63f80a2475a26b79155d70cd29d4852b61.tar.gz |
Base64 code (and the MIT copyright) moved to http.c
FTP STORe and APPEnd added.
FTP proxy support added (untested).
Diffstat (limited to 'lib/libfetch/ftp.c')
-rw-r--r-- | lib/libfetch/ftp.c | 139 |
1 files changed, 62 insertions, 77 deletions
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c index 9f93297..b38a4e7 100644 --- a/lib/libfetch/ftp.c +++ b/lib/libfetch/ftp.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: ftp.c,v 1.1.1.1 1998/07/09 16:52:42 des Exp $ + * $Id: ftp.c,v 1.3 1998/07/11 21:29:08 des Exp $ */ /* @@ -190,10 +190,10 @@ _ftp_cmd(FILE *f, char *fmt, ...) } /* - * Retrieve file + * Transfer file */ static FILE * -_ftp_retrieve(FILE *cf, char *file, int pasv) +_ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv) { struct sockaddr_in sin; int sd = -1, l; @@ -252,7 +252,7 @@ _ftp_retrieve(FILE *cf, char *file, int pasv) goto sysouch; /* make the server initiate the transfer */ - if (_ftp_cmd(cf, "RETR %s" ENDL, s) != FTP_OPEN_DATA_CONNECTION) + if (_ftp_cmd(cf, "%s %s" ENDL, oper, s) != FTP_OPEN_DATA_CONNECTION) goto ouch; } else { @@ -281,7 +281,7 @@ _ftp_retrieve(FILE *cf, char *file, int pasv) goto ouch; /* make the server initiate the transfer */ - if (_ftp_cmd(cf, "RETR %s" ENDL, s) != FTP_OPEN_DATA_CONNECTION) + if (_ftp_cmd(cf, "%s %s" ENDL, oper, s) != FTP_OPEN_DATA_CONNECTION) goto ouch; /* accept the incoming connection and go to town */ @@ -291,7 +291,7 @@ _ftp_retrieve(FILE *cf, char *file, int pasv) sd = d; } - if ((df = fdopen(sd, "r")) == NULL) + if ((df = fdopen(sd, mode)) == NULL) goto sysouch; return df; @@ -303,33 +303,38 @@ ouch: } /* - * Store file - */ -static FILE * -_ftp_store(FILE *cf, char *file, int pasv) -{ - fprintf(stderr, "_ftp_store: not implemented yet.\n"); - - cf = cf; - file = file; - pasv = pasv; - return NULL; -} - -/* * Log on to FTP server */ static FILE * _ftp_connect(char *host, int port, char *user, char *pwd) { - int sd, e; + int sd, e, pp = FTP_DEFAULT_PORT; + char *p, *q; FILE *f; - /* establish control connection */ - if ((sd = fetchConnect(host, port)) < 0) { + /* check for proxy */ + if ((p = getenv("FTP_PROXY")) != NULL) { + if ((q = strchr(p, ':')) != NULL) { + /* XXX check that it's a valid number */ + pp = atoi(q+1); + } + if (q) + *q = 0; + sd = fetchConnect(p, pp); + if (q) + *q = ':'; + } else { + /* no proxy, go straight to target */ + sd = fetchConnect(host, port); + } + + /* check connection */ + if (sd < 0) { _ftp_syserr(); return NULL; } + + /* streams make life easier */ if ((f = fdopen(sd, "r+")) == NULL) { _ftp_syserr(); goto ouch; @@ -340,20 +345,32 @@ _ftp_connect(char *host, int port, char *user, char *pwd) goto fouch; /* send user name and password */ - e = _ftp_cmd(f, "USER %s" ENDL, user); - if (e == FTP_NEED_PASSWORD) /* server requested a password */ + if (!user || !*user) + user = FTP_ANONYMOUS_USER; + e = p ? _ftp_cmd(f, "USER %s@%s@%d" ENDL, user, host, port) + : _ftp_cmd(f, "USER %s" ENDL, user); + + /* did the server request a password? */ + if (e == FTP_NEED_PASSWORD) { + if (!pwd || !*pwd) + pwd = FTP_ANONYMOUS_PASSWORD; e = _ftp_cmd(f, "PASS %s" ENDL, pwd); - if (e == FTP_NEED_ACCOUNT) /* server requested an account */ + } + + /* did the server request an account? */ + if (e == FTP_NEED_ACCOUNT) /* help! */ ; - if (e != FTP_LOGGED_IN) /* won't let us near the WaReZ */ + + /* we should be done by now */ + if (e != FTP_LOGGED_IN) goto fouch; /* might as well select mode and type at once */ #ifdef FTP_FORCE_STREAM_MODE - if (_ftp_cmd(f, "MODE S" ENDL) != FTP_OK) + if (_ftp_cmd(f, "MODE S" ENDL) != FTP_OK) /* default is S */ goto ouch; #endif - if (_ftp_cmd(f, "TYPE I" ENDL) != FTP_OK) + if (_ftp_cmd(f, "TYPE I" ENDL) != FTP_OK) /* default is A */ goto ouch; /* done */ @@ -390,19 +407,15 @@ _ftp_isconnected(url_t *url) && (url->port == cached_host.port)); } -FILE * -fetchGetFTP(url_t *url, char *flags) +/* + * FTP session + */ +static FILE * +fetchXxxFTP(url_t *url, char *oper, char *mode, char *flags) { FILE *cf = NULL; int e; -#ifdef DEFAULT_TO_ANONYMOUS - if (!url->user[0]) { - strcpy(url->user, FTP_ANONYMOUS_USER); - strcpy(url->pwd, FTP_ANONYMOUS_PASSWORD); - } -#endif - /* set default port */ if (!url->port) url->port = FTP_DEFAULT_PORT; @@ -427,50 +440,22 @@ fetchGetFTP(url_t *url, char *flags) } /* initiate the transfer */ - return _ftp_retrieve(cf, url->doc, (flags && strchr(flags, 'p'))); + return _ftp_transfer(cf, oper, url->doc, mode, (flags && strchr(flags, 'p'))); } /* - * Upload a file. - * Hmmm, that's almost an exact duplicate of the above... + * Itsy bitsy teeny weenie */ FILE * -fetchPutFTP(url_t *url, char *flags) +fetchGetFTP(url_t *url, char *flags) { - FILE *cf = NULL; - int e; - -#ifdef DEFAULT_TO_ANONYMOUS - if (!url->user[0]) { - strcpy(url->user, FTP_ANONYMOUS_USER); - strcpy(url->pwd, FTP_ANONYMOUS_PASSWORD); - } -#endif - - /* set default port */ - if (!url->port) - url->port = htons(FTP_DEFAULT_PORT); - - /* try to use previously cached connection */ - if (_ftp_isconnected(url)) { - fprintf(cached_socket, "PWD" ENDL); - _ftp_chkerr(cached_socket, &e); - if (e > 0) - cf = cached_socket; - } - - /* connect to server */ - if (!cf) { - cf = _ftp_connect(url->host, url->port, url->user, url->pwd); - if (!cf) - return NULL; - if (cached_socket) - _ftp_disconnect(cached_socket); - cached_socket = cf; - memcpy(&cached_host, url, sizeof(url_t)); - } - + return fetchXxxFTP(url, "RETR", "r", flags); +} - /* initiate the transfer */ - return _ftp_store(cf, url->doc, (flags && strchr(flags, 'p'))); +FILE * +fetchPutFTP(url_t *url, char *flags) +{ + if (flags && strchr(flags, 'a')) + return fetchXxxFTP(url, "APPE", "w", flags); + else return fetchXxxFTP(url, "STOR", "w", flags); } |