summaryrefslogtreecommitdiffstats
path: root/lib/libfetch/ftp.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2001-05-26 19:37:15 +0000
committerdes <des@FreeBSD.org>2001-05-26 19:37:15 +0000
commit4f0b3412631a0bb351436f8e864770c93ee8bdaa (patch)
tree45383a280be7a49c45a9398fdd6c445a08024420 /lib/libfetch/ftp.c
parent4edf66ad45433dfe5f2ebdca625183c9481390f2 (diff)
downloadFreeBSD-src-4f0b3412631a0bb351436f8e864770c93ee8bdaa.zip
FreeBSD-src-4f0b3412631a0bb351436f8e864770c93ee8bdaa.tar.gz
Add rudimentary support for an authentication callback function.
Diffstat (limited to 'lib/libfetch/ftp.c')
-rw-r--r--lib/libfetch/ftp.c86
1 files changed, 45 insertions, 41 deletions
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
index 0cc9910..ff7bf86 100644
--- a/lib/libfetch/ftp.c
+++ b/lib/libfetch/ftp.c
@@ -712,6 +712,49 @@ ouch:
}
/*
+ * Authenticate
+ */
+static int
+_ftp_authenticate(int cd, struct url *url, struct url *purl)
+{
+ char *user, *pwd, *logname;
+ char pbuf[MAXHOSTNAMELEN + MAXLOGNAME + 1];
+ int e, len;
+
+ /* XXX FTP_AUTH, and maybe .netrc */
+
+ /* send user name and password */
+ user = url->user;
+ if (!user || !*user)
+ user = getenv("FTP_LOGIN");
+ if (!user || !*user)
+ user = FTP_ANONYMOUS_USER;
+ if (purl && url->port == _fetch_default_port(url->scheme))
+ e = _ftp_cmd(cd, "USER %s@%s", user, url->host);
+ else if (purl)
+ e = _ftp_cmd(cd, "USER %s@%s@%d", user, url->host, url->port);
+ else
+ e = _ftp_cmd(cd, "USER %s", user);
+
+ /* did the server request a password? */
+ if (e == FTP_NEED_PASSWORD) {
+ pwd = url->pwd;
+ if (!pwd || !*pwd)
+ pwd = getenv("FTP_PASSWORD");
+ if (!pwd || !*pwd) {
+ if ((logname = getlogin()) == 0)
+ logname = FTP_ANONYMOUS_USER;
+ len = snprintf(pbuf, MAXLOGNAME + 1, "%s@", logname);
+ gethostname(pbuf + len, sizeof pbuf - len);
+ pwd = pbuf;
+ }
+ e = _ftp_cmd(cd, "PASS %s", pwd);
+ }
+
+ return e;
+}
+
+/*
* Log on to FTP server
*/
static int
@@ -723,11 +766,6 @@ _ftp_connect(struct url *url, struct url *purl, const char *flags)
#else
int af = AF_INET;
#endif
- const char *logname;
- const char *user;
- const char *pwd;
- char localhost[MAXHOSTNAMELEN];
- char pbuf[MAXHOSTNAMELEN + MAXLOGNAME + 1];
direct = CHECK_FLAG('d');
verbose = CHECK_FLAG('v');
@@ -758,45 +796,11 @@ _ftp_connect(struct url *url, struct url *purl, const char *flags)
/* expect welcome message */
if ((e = _ftp_chkerr(cd)) != FTP_SERVICE_READY)
goto fouch;
-
- /* XXX FTP_AUTH, and maybe .netrc */
- /* send user name and password */
- user = url->user;
- if (!user || !*user)
- user = getenv("FTP_LOGIN");
- if (!user || !*user)
- user = FTP_ANONYMOUS_USER;
- if (purl && url->port == _fetch_default_port(url->scheme))
- e = _ftp_cmd(cd, "USER %s@%s", user, url->host);
- else if (purl)
- e = _ftp_cmd(cd, "USER %s@%s@%d", user, url->host, url->port);
- else
- e = _ftp_cmd(cd, "USER %s", user);
-
- /* did the server request a password? */
- if (e == FTP_NEED_PASSWORD) {
- pwd = url->pwd;
- if (!pwd || !*pwd)
- pwd = getenv("FTP_PASSWORD");
- if (!pwd || !*pwd) {
- if ((logname = getlogin()) == 0)
- logname = FTP_ANONYMOUS_USER;
- gethostname(localhost, sizeof localhost);
- snprintf(pbuf, sizeof pbuf, "%s@%s", logname, localhost);
- pwd = pbuf;
- }
- e = _ftp_cmd(cd, "PASS %s", pwd);
- }
-
- /* did the server request an account? */
- if (e == FTP_NEED_ACCOUNT)
+ /* authenticate */
+ if ((e = _ftp_authenticate(cd, url, purl)) != FTP_LOGGED_IN)
goto fouch;
- /* 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 ((e = _ftp_cmd(cd, "MODE S")) != FTP_OK) /* default is S */
OpenPOWER on IntegriCloud