Patches I've had lying around for several months:

* Add the 'h' ftp flag (allocate local port in high range)
 * Add the 'd' flag (use direct connection even if proxy is defined)
 * Make sure flags != NULL before calling strchr().
 * Minor changes to some comments.
This commit is contained in:
Dag-Erling Smørgrav 2000-01-07 10:59:12 +00:00
parent 04e8772051
commit f5f109a068
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=55544
4 changed files with 78 additions and 20 deletions

View File

@ -223,6 +223,20 @@ If the
(passive) flag is specified, a passive (rather than active) connection
will be attempted.
.Pp
If the
.Fa h
(high) flag is specified, data sockets will be allocated in the high
port range (see
.Xr ip 4 ).
.Pp
If the
.Fa d
(direct) flag is specified,
.Fn fetchGetFTP
and
.Fn fetchPutFTP
will use a direct connection even if a proxy server is defined.
.Pp
If no user name or password is given, the
.Nm fetch
library will attempt an anonymous login, with user name "ftp" and
@ -235,6 +249,14 @@ and
functions implement the HTTP/1.1 protocol. With a little luck, there's
even a chance that they comply with RFC2068.
.Pp
If the
.Fa d
(direct) flag is specified,
.Fn fetchGetHTTP
and
.Fn fetchPutHTTP
will use a direct connection even if a proxy server is defined.
.Pp
Since there seems to be no good way of implementing the HTTP PUT
method in a manner consistent with the rest of the
.Nm fetch
@ -314,7 +336,8 @@ to use for transferring files.
.Sh SEE ALSO
.Xr com_err 3 ,
.Xr fetch 1 ,
.Xr ftpio 3
.Xr ftpio 3 ,
.Xr ip 4 .
.Rs
.%A T. Berners-Lee, L. Masinter & M. McCahill
.%D December 1994
@ -401,6 +424,11 @@ system errors. For instance, error code 202 means "Command not
implemented, superfluous at this site" in an FTP context and
"Accepted" in an HTTP context.
.Pp
.Fn fetchStatFTP
does not check that the result of an MDTM command is a valid date.
.Pp
The HTTP code needs a complete rewrite, or at least a serious cleanup.
.Pp
The man page is poorly written and produces badly formatted text.
.Pp
Tons of other stuff.

View File

@ -55,7 +55,7 @@ fetchPutFile(struct url *u, char *flags)
{
FILE *f;
if (strchr(flags, 'a'))
if (flags && strchr(flags, 'a'))
f = fopen(u->doc, "a");
else
f = fopen(u->doc, "w");

View File

@ -151,16 +151,25 @@ _ftp_cmd(FILE *f, char *fmt, ...)
* Transfer file
*/
static FILE *
_ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
_ftp_transfer(FILE *cf, char *oper, char *file, char *mode, char *flags)
{
struct sockaddr_in sin;
int e, sd = -1, l;
int pasv, high, verbose;
int e, sd = -1;
socklen_t l;
char *s;
FILE *df;
/* check flags */
pasv = (flags && strchr(flags, 'p'));
high = (flags && strchr(flags, 'h'));
verbose = (flags && strchr(flags, 'v'));
/* change directory */
if (((s = strrchr(file, '/')) != NULL) && (s != file)) {
*s = 0;
if (verbose)
_fetch_info("changing directory to %s", file);
if ((e = _ftp_cmd(cf, "CWD %s" ENDL, file)) != FTP_FILE_ACTION_OK) {
*s = '/';
_ftp_seterr(e);
@ -168,6 +177,8 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
}
*s++ = '/';
} else {
if (verbose)
_fetch_info("changing directory to /");
if ((e = _ftp_cmd(cf, "CWD /" ENDL)) != FTP_FILE_ACTION_OK) {
_ftp_seterr(e);
return NULL;
@ -188,11 +199,15 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
int i;
/* send PASV command */
if (verbose)
_fetch_info("setting passive mode");
if ((e = _ftp_cmd(cf, "PASV" ENDL)) != FTP_PASSIVE_MODE)
goto ouch;
/* find address and port number. The reply to the PASV command
is IMHO the one and only weak point in the FTP protocol. */
/*
* Find address and port number. The reply to the PASV command
* is IMHO the one and only weak point in the FTP protocol.
*/
ln = _ftp_last_reply;
for (p = ln + 3; !isdigit(*p); p++)
/* nothing */ ;
@ -209,10 +224,14 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
bcopy(addr + 4, (char *)&sin.sin_port, 2);
/* connect to data port */
if (verbose)
_fetch_info("opening data connection");
if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
goto sysouch;
/* make the server initiate the transfer */
if (verbose)
_fetch_info("initiating transfer");
e = _ftp_cmd(cf, "%s %s" ENDL, oper, s);
if (e != FTP_OPEN_DATA_CONNECTION)
goto ouch;
@ -220,13 +239,19 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
} else {
u_int32_t a;
u_short p;
int d;
int arg, d;
/* find our own address, bind, and listen */
l = sizeof(sin);
if (getsockname(fileno(cf), (struct sockaddr *)&sin, &l) == -1)
goto sysouch;
sin.sin_port = 0;
arg = high ? IP_PORTRANGE_HIGH : IP_PORTRANGE_DEFAULT;
if (setsockopt(sd, IPPROTO_IP, IP_PORTRANGE,
(char *)&arg, sizeof(arg)) == -1)
goto sysouch;
if (verbose)
_fetch_info("binding data socket");
if (bind(sd, (struct sockaddr *)&sin, l) == -1)
goto sysouch;
if (listen(sd, 1) == -1)
@ -245,6 +270,8 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
goto ouch;
/* make the server initiate the transfer */
if (verbose)
_fetch_info("initiating transfer");
e = _ftp_cmd(cf, "%s %s" ENDL, oper, s);
if (e != FTP_OPEN_DATA_CONNECTION)
goto ouch;
@ -275,14 +302,17 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv)
* Log on to FTP server
*/
static FILE *
_ftp_connect(char *host, int port, char *user, char *pwd, int verbose)
_ftp_connect(char *host, int port, char *user, char *pwd, char *flags)
{
int sd, e, pp = FTP_DEFAULT_PORT;
int sd, e, pp = FTP_DEFAULT_PORT, direct, verbose;
char *p, *q;
FILE *f;
direct = (flags && strchr(flags, 'd'));
verbose = (flags && strchr(flags, 'v'));
/* check for proxy */
if ((p = getenv("FTP_PROXY")) != NULL) {
if (!direct && (p = getenv("FTP_PROXY")) != NULL) {
if ((q = strchr(p, ':')) != NULL) {
/* XXX check that it's a valid number */
pp = atoi(q+1);
@ -295,6 +325,7 @@ _ftp_connect(char *host, int port, char *user, char *pwd, int verbose)
} else {
/* no proxy, go straight to target */
sd = _fetch_connect(host, port, verbose);
p = NULL;
}
/* check connection */
@ -396,8 +427,7 @@ _ftp_cached_connect(struct url *url, char *flags)
/* connect to server */
if (!cf) {
cf = _ftp_connect(url->host, url->port, url->user, url->pwd,
(strchr(flags, 'v') != NULL));
cf = _ftp_connect(url->host, url->port, url->user, url->pwd, flags);
if (!cf)
return NULL;
if (cached_socket)
@ -422,8 +452,7 @@ fetchGetFTP(struct url *url, char *flags)
return NULL;
/* initiate the transfer */
return _ftp_transfer(cf, "RETR", url->doc, "r",
(flags && strchr(flags, 'p')));
return _ftp_transfer(cf, "RETR", url->doc, "r", flags);
}
/*
@ -440,7 +469,7 @@ fetchPutFTP(struct url *url, char *flags)
/* initiate the transfer */
return _ftp_transfer(cf, (flags && strchr(flags, 'a')) ? "APPE" : "STOR",
url->doc, "w", (flags && strchr(flags, 'p')));
url->doc, "w", flags);
}
/*

View File

@ -293,13 +293,14 @@ _http_auth(char *usr, char *pwd)
FILE *
fetchGetHTTP(struct url *URL, char *flags)
{
int sd = -1, e, i, enc = ENC_NONE, verbose;
int sd = -1, e, i, enc = ENC_NONE, direct, verbose;
struct cookie *c;
char *ln, *p, *px, *q;
FILE *f, *cf;
size_t len;
verbose = (strchr(flags, 'v') != NULL);
direct = (flags && strchr(flags, 'd'));
verbose = (flags && strchr(flags, 'v'));
/* allocate cookie */
if ((c = calloc(1, sizeof(struct cookie))) == NULL)
@ -310,14 +311,14 @@ fetchGetHTTP(struct url *URL, char *flags)
URL->port = 80; /* default HTTP port */
/* attempt to connect to proxy server */
if ((px = getenv("HTTP_PROXY")) != NULL) {
if (!direct && (px = getenv("HTTP_PROXY")) != NULL) {
char host[MAXHOSTNAMELEN];
int port = 3128; /* XXX I think 3128 is default... check? */
/* measure length */
len = strcspn(px, ":");
/* get port (atoi is a little too tolerant perhaps?) */
/* get port (XXX atoi is a little too tolerant perhaps?) */
if (px[len] == ':')
port = atoi(px+len+1);