libfetch: switch to external/bsd version
Change-Id: I7eb6fbf0ae6c008e399fe9bffdfc2b98dfed3432
This commit is contained in:
parent
319e7a6d07
commit
040ec64444
24 changed files with 944 additions and 869 deletions
|
@ -2122,6 +2122,10 @@
|
||||||
./usr/lib/libexpat.so.2 minix-sys
|
./usr/lib/libexpat.so.2 minix-sys
|
||||||
./usr/lib/libexpat.so.2.1 minix-sys
|
./usr/lib/libexpat.so.2.1 minix-sys
|
||||||
./usr/lib/libfetch.a minix-sys
|
./usr/lib/libfetch.a minix-sys
|
||||||
|
./usr/lib/libfetch_pic.a minix-sys
|
||||||
|
./usr/lib/libfetch.so minix-sys
|
||||||
|
./usr/lib/libfetch.so.3 minix-sys
|
||||||
|
./usr/lib/libfetch.so.3.0 minix-sys
|
||||||
./usr/lib/libfl.a minix-sys
|
./usr/lib/libfl.a minix-sys
|
||||||
./usr/lib/libform.a minix-sys
|
./usr/lib/libform.a minix-sys
|
||||||
./usr/lib/libform_pic.a minix-sys
|
./usr/lib/libform_pic.a minix-sys
|
||||||
|
@ -3474,6 +3478,7 @@
|
||||||
./usr/man/man3/fesetenv.3 minix-sys
|
./usr/man/man3/fesetenv.3 minix-sys
|
||||||
./usr/man/man3/fesetexceptflag.3 minix-sys
|
./usr/man/man3/fesetexceptflag.3 minix-sys
|
||||||
./usr/man/man3/fesetround.3 minix-sys
|
./usr/man/man3/fesetround.3 minix-sys
|
||||||
|
./usr/man/man3/fetch.3 minix-sys
|
||||||
./usr/man/man3/fetestexcept.3 minix-sys
|
./usr/man/man3/fetestexcept.3 minix-sys
|
||||||
./usr/man/man3/feupdateenv.3 minix-sys
|
./usr/man/man3/feupdateenv.3 minix-sys
|
||||||
./usr/man/man3/fflush.3 minix-sys
|
./usr/man/man3/fflush.3 minix-sys
|
||||||
|
|
2
external/bsd/Makefile
vendored
2
external/bsd/Makefile
vendored
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
SUBDIR= byacc file flex less \
|
SUBDIR= byacc fetch file flex less \
|
||||||
libarchive libevent mdocml \
|
libarchive libevent mdocml \
|
||||||
tmux
|
tmux
|
||||||
|
|
||||||
|
|
5
external/bsd/fetch/Makefile
vendored
Normal file
5
external/bsd/fetch/Makefile
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# $NetBSD: Makefile,v 1.1 2008/09/30 19:09:00 joerg Exp $
|
||||||
|
|
||||||
|
SUBDIR= lib
|
||||||
|
|
||||||
|
.include <bsd.subdir.mk>
|
9
external/bsd/fetch/Makefile.inc
vendored
Normal file
9
external/bsd/fetch/Makefile.inc
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# $NetBSD: Makefile.inc,v 1.1 2008/09/30 19:09:00 joerg Exp $
|
||||||
|
|
||||||
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
|
LIBFETCHDIR= ${NETBSDSRCDIR}/external/bsd/fetch/dist/libfetch
|
||||||
|
|
||||||
|
USE_FORT?= yes # complex string handling
|
||||||
|
|
||||||
|
WARNS?= 4
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: common.c,v 1.27 2010/06/13 21:38:09 joerg Exp $ */
|
/* $NetBSD: common.c,v 1.2 2011/06/25 20:27:01 christos Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* Copyright (c) 2008, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
* Copyright (c) 2008, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat.h>
|
#include <nbcompat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
#if defined(HAVE_INTTYPES_H) || defined(NETBSD)
|
#if defined(HAVE_INTTYPES_H) || defined(NETBSD)
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat/netdb.h>
|
#include <nbcompat/netdb.h>
|
||||||
#else
|
#else
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
@ -66,6 +66,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "fetch.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
/*** Local data **************************************************************/
|
/*** Local data **************************************************************/
|
||||||
|
@ -149,15 +150,11 @@ fetch_syserr(void)
|
||||||
case EADDRNOTAVAIL:
|
case EADDRNOTAVAIL:
|
||||||
case ENETDOWN:
|
case ENETDOWN:
|
||||||
case ENETUNREACH:
|
case ENETUNREACH:
|
||||||
#if defined(ENETRESET)
|
|
||||||
case ENETRESET:
|
case ENETRESET:
|
||||||
#endif
|
|
||||||
case EHOSTUNREACH:
|
case EHOSTUNREACH:
|
||||||
fetchLastErrCode = FETCH_NETWORK;
|
fetchLastErrCode = FETCH_NETWORK;
|
||||||
break;
|
break;
|
||||||
#if defined(ECONNABORTED)
|
|
||||||
case ECONNABORTED:
|
case ECONNABORTED:
|
||||||
#endif
|
|
||||||
case ECONNRESET:
|
case ECONNRESET:
|
||||||
fetchLastErrCode = FETCH_ABORT;
|
fetchLastErrCode = FETCH_ABORT;
|
||||||
break;
|
break;
|
||||||
|
@ -165,9 +162,7 @@ fetch_syserr(void)
|
||||||
fetchLastErrCode = FETCH_TIMEOUT;
|
fetchLastErrCode = FETCH_TIMEOUT;
|
||||||
break;
|
break;
|
||||||
case ECONNREFUSED:
|
case ECONNREFUSED:
|
||||||
#if defined(EHOSTDOWN)
|
|
||||||
case EHOSTDOWN:
|
case EHOSTDOWN:
|
||||||
#endif
|
|
||||||
fetchLastErrCode = FETCH_DOWN;
|
fetchLastErrCode = FETCH_DOWN;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -321,7 +316,6 @@ fetch_connect(struct url *url, int af, int verbose)
|
||||||
if ((conn = fetch_reopen(sd)) == NULL) {
|
if ((conn = fetch_reopen(sd)) == NULL) {
|
||||||
fetch_syserr();
|
fetch_syserr();
|
||||||
close(sd);
|
close(sd);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
conn->cache_url = fetchCopyURL(url);
|
conn->cache_url = fetchCopyURL(url);
|
||||||
conn->cache_af = af;
|
conn->cache_af = af;
|
||||||
|
@ -545,7 +539,7 @@ fetch_read(conn_t *conn, char *buf, size_t len)
|
||||||
}
|
}
|
||||||
#ifdef WITH_SSL
|
#ifdef WITH_SSL
|
||||||
if (conn->ssl != NULL)
|
if (conn->ssl != NULL)
|
||||||
rlen = SSL_read(conn->ssl, buf, len);
|
rlen = SSL_read(conn->ssl, buf, (int)len);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
rlen = read(conn->sd, buf, len);
|
rlen = read(conn->sd, buf, len);
|
||||||
|
@ -594,7 +588,7 @@ fetch_getln(conn_t *conn)
|
||||||
return (-1);
|
return (-1);
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
break;
|
break;
|
||||||
next = memchr(conn->buf + conn->buflen, '\n', len);
|
next = memchr(conn->buf + conn->buflen, '\n', (size_t)len);
|
||||||
conn->buflen += len;
|
conn->buflen += len;
|
||||||
if (conn->buflen == conn->bufsize && next == NULL) {
|
if (conn->buflen == conn->bufsize && next == NULL) {
|
||||||
tmp = conn->buf;
|
tmp = conn->buf;
|
||||||
|
@ -680,7 +674,7 @@ fetch_write(conn_t *conn, const void *buf, size_t len)
|
||||||
errno = 0;
|
errno = 0;
|
||||||
#ifdef WITH_SSL
|
#ifdef WITH_SSL
|
||||||
if (conn->ssl != NULL)
|
if (conn->ssl != NULL)
|
||||||
wlen = SSL_write(conn->ssl, buf, len);
|
wlen = SSL_write(conn->ssl, buf, (int)len);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifndef MSG_NOSIGNAL
|
#ifndef MSG_NOSIGNAL
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: common.h,v 1.16 2010/03/21 16:48:43 joerg Exp $ */
|
/* $NetBSD: common.h,v 1.1.1.7 2010/03/24 20:51:42 joerg Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -32,8 +32,6 @@
|
||||||
#ifndef _COMMON_H_INCLUDED
|
#ifndef _COMMON_H_INCLUDED
|
||||||
#define _COMMON_H_INCLUDED
|
#define _COMMON_H_INCLUDED
|
||||||
|
|
||||||
#include <fetch.h>
|
|
||||||
|
|
||||||
#define FTP_DEFAULT_PORT 21
|
#define FTP_DEFAULT_PORT 21
|
||||||
#define HTTP_DEFAULT_PORT 80
|
#define HTTP_DEFAULT_PORT 80
|
||||||
#define FTP_DEFAULT_PROXY_PORT 21
|
#define FTP_DEFAULT_PROXY_PORT 21
|
||||||
|
@ -49,7 +47,7 @@
|
||||||
|
|
||||||
#if !defined(__sun) && !defined(__hpux) && !defined(__INTERIX) && \
|
#if !defined(__sun) && !defined(__hpux) && !defined(__INTERIX) && \
|
||||||
!defined(__digital__) && !defined(__linux) && !defined(__MINT__) && \
|
!defined(__digital__) && !defined(__linux) && !defined(__MINT__) && \
|
||||||
!defined(__sgi) && !defined(__minix)
|
!defined(__sgi)
|
||||||
#define HAVE_SA_LEN
|
#define HAVE_SA_LEN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -92,8 +90,7 @@ struct fetcherr {
|
||||||
|
|
||||||
void fetch_seterr(struct fetcherr *, int);
|
void fetch_seterr(struct fetcherr *, int);
|
||||||
void fetch_syserr(void);
|
void fetch_syserr(void);
|
||||||
void fetch_info(const char *, ...)
|
void fetch_info(const char *, ...);
|
||||||
__attribute__((__format__(__printf__, 1, 2)));
|
|
||||||
int fetch_default_port(const char *);
|
int fetch_default_port(const char *);
|
||||||
int fetch_default_proxy_port(const char *);
|
int fetch_default_proxy_port(const char *);
|
||||||
int fetch_bind(int, int, const char *);
|
int fetch_bind(int, int, const char *);
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# $NetBSD: errlist.sh,v 1.2 2008/10/06 12:58:29 joerg Exp $
|
# $NetBSD: errlist.sh,v 1.1.1.4 2009/04/04 23:26:03 joerg Exp $
|
||||||
|
|
||||||
printf "static struct fetcherr $1[] = {\n"
|
printf "static struct fetcherr $1[] = {\n"
|
||||||
while read code type msg; do
|
while read code type msg; do
|
781
external/bsd/fetch/dist/libfetch/fetch.3
vendored
Normal file
781
external/bsd/fetch/dist/libfetch/fetch.3
vendored
Normal file
|
@ -0,0 +1,781 @@
|
||||||
|
.\"-
|
||||||
|
.\" Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
|
.\" Copyright (c) 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" 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.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||||
|
.\"
|
||||||
|
.\" $FreeBSD: fetch.3,v 1.64 2007/12/18 11:03:26 des Exp $
|
||||||
|
.\" $NetBSD: fetch.3,v 1.2 2013/07/20 21:40:04 wiz Exp $
|
||||||
|
.\"
|
||||||
|
.Dd January 22, 2010
|
||||||
|
.Dt FETCH 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm fetchMakeURL ,
|
||||||
|
.Nm fetchParseURL ,
|
||||||
|
.Nm fetchCopyURL ,
|
||||||
|
.Nm fetchFreeURL ,
|
||||||
|
.Nm fetchXGetURL ,
|
||||||
|
.Nm fetchGetURL ,
|
||||||
|
.Nm fetchPutURL ,
|
||||||
|
.Nm fetchStatURL ,
|
||||||
|
.Nm fetchListURL ,
|
||||||
|
.Nm fetchXGet ,
|
||||||
|
.Nm fetchGet ,
|
||||||
|
.Nm fetchPut ,
|
||||||
|
.Nm fetchStat ,
|
||||||
|
.Nm fetchList ,
|
||||||
|
.Nm fetchXGetFile ,
|
||||||
|
.Nm fetchGetFile ,
|
||||||
|
.Nm fetchPutFile ,
|
||||||
|
.Nm fetchStatFile ,
|
||||||
|
.Nm fetchListFile ,
|
||||||
|
.Nm fetchXGetHTTP ,
|
||||||
|
.Nm fetchGetHTTP ,
|
||||||
|
.Nm fetchPutHTTP ,
|
||||||
|
.Nm fetchStatHTTP ,
|
||||||
|
.Nm fetchListHTTP ,
|
||||||
|
.Nm fetchXGetFTP ,
|
||||||
|
.Nm fetchGetFTP ,
|
||||||
|
.Nm fetchPutFTP ,
|
||||||
|
.Nm fetchStatFTP ,
|
||||||
|
.Nm fetchListFTP
|
||||||
|
.Nm fetchInitURLList ,
|
||||||
|
.Nm fetchFreeURLList ,
|
||||||
|
.Nm fetchUnquotePath ,
|
||||||
|
.Nm fetchUnquoteFilename ,
|
||||||
|
.Nm fetchStringifyURL ,
|
||||||
|
.Nm fetchConnectionCacheInit ,
|
||||||
|
.Nm fetchConnectionCacheClose ,
|
||||||
|
.Nm fetch
|
||||||
|
.Nd file transfer functions
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libfetch
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In stdio.h
|
||||||
|
.In fetch.h
|
||||||
|
.Ft struct url *
|
||||||
|
.Fn fetchMakeURL "const char *scheme" "const char *host" "int port" "const char *doc" "const char *user" "const char *pwd"
|
||||||
|
.Ft struct url *
|
||||||
|
.Fn fetchParseURL "const char *URL"
|
||||||
|
.Ft struct url *
|
||||||
|
.Fn fetchCopyURL "const struct url *u"
|
||||||
|
.Ft void
|
||||||
|
.Fn fetchFreeURL "struct url *u"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchXGetURL "const char *URL" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchGetURL "const char *URL" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchPutURL "const char *URL" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchStatURL "const char *URL" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchListURL "struct url_list *list" "const char *URL" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchXGet "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchGet "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchPut "struct url *u" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchStat "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchList "struct url_list *list" "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchXGetFile "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchGetFile "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchPutFile "struct url *u" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchStatFile "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchListFile "struct url_list *list" "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchXGetHTTP "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchGetHTTP "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchPutHTTP "struct url *u" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchStatHTTP "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchListHTTP "struct url_list *list" "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchXGetFTP "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchGetFTP "struct url *u" "const char *flags"
|
||||||
|
.Ft fetchIO *
|
||||||
|
.Fn fetchPutFTP "struct url *u" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchStatFTP "struct url *u" "struct url_stat *us" "const char *flags"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchListFTP "struct url_list *list" "struct url *u" "const char *flags"
|
||||||
|
.Ft void
|
||||||
|
.Fn fetchInitURLList "struct url_list *ul"
|
||||||
|
.Ft int
|
||||||
|
.Fn fetchAppendURLList "struct url_list *dst" "const struct url_list *src"
|
||||||
|
.Ft void
|
||||||
|
.Fn fetchFreeURLList "struct url_list *ul"
|
||||||
|
.Ft char *
|
||||||
|
.Fn fetchUnquotePath "struct url *u"
|
||||||
|
.Ft char *
|
||||||
|
.Fn fetchUnquoteFilename "struct url *u"
|
||||||
|
.Ft char *
|
||||||
|
.Fn fetchStringifyURL "const struct url *u"
|
||||||
|
.Ft void
|
||||||
|
.Fn fetchConnectionCacheInit "int global" "int per_host"
|
||||||
|
.Ft void
|
||||||
|
.Fn fetchConnectionCacheClose "void"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
These functions implement a high-level library for retrieving and
|
||||||
|
uploading files using Uniform Resource Locators (URLs).
|
||||||
|
.Pp
|
||||||
|
.Fn fetchParseURL
|
||||||
|
takes a URL in the form of a null-terminated string and splits it into
|
||||||
|
its components function according to the Common Internet Scheme Syntax
|
||||||
|
detailed in RFC 1738.
|
||||||
|
A regular expression which produces this syntax is:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
\*[Lt]scheme\*[Gt]:(//(\*[Lt]user\*[Gt](:\*[Lt]pwd\*[Gt])?@)?\*[Lt]host\*[Gt](:\*[Lt]port\*[Gt])?)?/(\*[Lt]document\*[Gt])?
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
If the URL does not seem to begin with a scheme name, it is assumed to be a local path.
|
||||||
|
Only absolute path names are accepted.
|
||||||
|
.Pp
|
||||||
|
Note that some components of the URL are not necessarily relevant to
|
||||||
|
all URL schemes.
|
||||||
|
For instance, the file scheme only needs the
|
||||||
|
.Aq scheme
|
||||||
|
and
|
||||||
|
.Aq document
|
||||||
|
components.
|
||||||
|
.Fn fetchParseURL
|
||||||
|
quotes any unsafe character in the URL automatically.
|
||||||
|
This is not done by
|
||||||
|
.Fn fetchMakeURL .
|
||||||
|
.Fn fetchCopyURL
|
||||||
|
copies an existing
|
||||||
|
.Vt url
|
||||||
|
structure.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchMakeURL ,
|
||||||
|
.Fn fetchParseURL ,
|
||||||
|
and
|
||||||
|
.Fn fetchCopyURL
|
||||||
|
return a pointer to a
|
||||||
|
.Vt url
|
||||||
|
structure, which is defined as follows in
|
||||||
|
.In fetch.h :
|
||||||
|
.Bd -literal
|
||||||
|
#define URL_SCHEMELEN 16
|
||||||
|
#define URL_USERLEN 256
|
||||||
|
#define URL_PWDLEN 256
|
||||||
|
#define URL_HOSTLEN 255
|
||||||
|
|
||||||
|
struct url {
|
||||||
|
char scheme[URL_SCHEMELEN + 1];
|
||||||
|
char user[URL_USERLEN + 1];
|
||||||
|
char pwd[URL_PWDLEN + 1];
|
||||||
|
char host[URL_HOSTLEN + 1];
|
||||||
|
int port;
|
||||||
|
char *doc;
|
||||||
|
off_t offset;
|
||||||
|
size_t length;
|
||||||
|
time_t last_modified;
|
||||||
|
};
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
The pointer returned by
|
||||||
|
.Fn fetchMakeURL ,
|
||||||
|
.Fn fetchCopyURL ,
|
||||||
|
and
|
||||||
|
.Fn fetchParseURL
|
||||||
|
should be freed using
|
||||||
|
.Fn fetchFreeURL .
|
||||||
|
The size of
|
||||||
|
.Vt struct URL
|
||||||
|
is not part of the ABI.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchXGetURL ,
|
||||||
|
.Fn fetchGetURL ,
|
||||||
|
and
|
||||||
|
.Fn fetchPutURL
|
||||||
|
constitute the recommended interface to the
|
||||||
|
.Nm fetch
|
||||||
|
library.
|
||||||
|
They examine the URL passed to them to determine the transfer
|
||||||
|
method, and call the appropriate lower-level functions to perform the
|
||||||
|
actual transfer.
|
||||||
|
.Fn fetchXGetURL
|
||||||
|
also returns the remote document's metadata in the
|
||||||
|
.Vt url_stat
|
||||||
|
structure pointed to by the
|
||||||
|
.Fa us
|
||||||
|
argument.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fa flags
|
||||||
|
argument is a string of characters which specify transfer options.
|
||||||
|
The
|
||||||
|
meaning of the individual flags is scheme-dependent, and is detailed
|
||||||
|
in the appropriate section below.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchStatURL
|
||||||
|
attempts to obtain the requested document's metadata and fill in the
|
||||||
|
structure pointed to by its second argument.
|
||||||
|
The
|
||||||
|
.Vt url_stat
|
||||||
|
structure is defined as follows in
|
||||||
|
.In fetch.h :
|
||||||
|
.Bd -literal
|
||||||
|
struct url_stat {
|
||||||
|
off_t size;
|
||||||
|
time_t atime;
|
||||||
|
time_t mtime;
|
||||||
|
};
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
If the size could not be obtained from the server, the
|
||||||
|
.Fa size
|
||||||
|
field is set to \-1.
|
||||||
|
If the modification time could not be obtained from the server, the
|
||||||
|
.Fa mtime
|
||||||
|
field is set to the epoch.
|
||||||
|
If the access time could not be obtained from the server, the
|
||||||
|
.Fa atime
|
||||||
|
field is set to the modification time.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchListURL
|
||||||
|
attempts to list the contents of the directory pointed to by the URL provided.
|
||||||
|
The pattern can be a simple glob-like expression as hint.
|
||||||
|
Callers should not depend on the server to filter names.
|
||||||
|
If successful, it appends the list of entries to the
|
||||||
|
.Vt url_list
|
||||||
|
structure.
|
||||||
|
The
|
||||||
|
.Vt url_list
|
||||||
|
structure is defined as follows in
|
||||||
|
.In fetch.h :
|
||||||
|
.Bd -literal
|
||||||
|
struct url_list {
|
||||||
|
size_t length;
|
||||||
|
size_t alloc_size;
|
||||||
|
struct url *urls;
|
||||||
|
};
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
The list should be initialized by calling
|
||||||
|
.Fn fetchInitURLList
|
||||||
|
and the entries be freed by calling
|
||||||
|
.Fn fetchFreeURLList .
|
||||||
|
The function
|
||||||
|
.Fn fetchAppendURLList
|
||||||
|
can be used to append one URL lists to another.
|
||||||
|
If the
|
||||||
|
.Ql c
|
||||||
|
(cache result) flag is specified, the library is allowed to internally
|
||||||
|
cache the result.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchStringifyURL
|
||||||
|
returns the URL as string.
|
||||||
|
.Fn fetchUnquotePath
|
||||||
|
returns the path name part of the URL with any quoting undone.
|
||||||
|
Query arguments and fragment identifiers are not included.
|
||||||
|
.Fn fetchUnquoteFilename
|
||||||
|
returns the last component of the path name as returned by
|
||||||
|
.Fn fetchUnquotePath .
|
||||||
|
.Fn fetchStringifyURL ,
|
||||||
|
.Fn fetchUnquotePath ,
|
||||||
|
and
|
||||||
|
.Fn fetchUnquoteFilename
|
||||||
|
return a string that should be deallocated with
|
||||||
|
.Fn free
|
||||||
|
after use.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchConnectionCacheInit
|
||||||
|
enables the connection cache.
|
||||||
|
The first argument specifies the global limit on cached connections.
|
||||||
|
The second argument specifies the host limit.
|
||||||
|
Entries are considered to specify the same host, if the host name
|
||||||
|
from the URL is identical, indepent of the address or address family.
|
||||||
|
.Fn fetchConnectionCacheClose
|
||||||
|
flushed the connection cache and closes all cached connections.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchXGet ,
|
||||||
|
.Fn fetchGet ,
|
||||||
|
.Fn fetchPut ,
|
||||||
|
and
|
||||||
|
.Fn fetchStat
|
||||||
|
are similar to
|
||||||
|
.Fn fetchXGetURL ,
|
||||||
|
.Fn fetchGetURL ,
|
||||||
|
.Fn fetchPutURL ,
|
||||||
|
and
|
||||||
|
.Fn fetchStatURL ,
|
||||||
|
except that they expect a pre-parsed URL in the form of a pointer to
|
||||||
|
a
|
||||||
|
.Vt struct url
|
||||||
|
rather than a string.
|
||||||
|
.Pp
|
||||||
|
All of the
|
||||||
|
.Fn fetchXGetXXX ,
|
||||||
|
.Fn fetchGetXXX ,
|
||||||
|
and
|
||||||
|
.Fn fetchPutXXX
|
||||||
|
functions return a pointer to a stream which can be used to read or
|
||||||
|
write data from or to the requested document, respectively.
|
||||||
|
Note that
|
||||||
|
although the implementation details of the individual access methods
|
||||||
|
vary, it can generally be assumed that a stream returned by one of the
|
||||||
|
.Fn fetchXGetXXX
|
||||||
|
or
|
||||||
|
.Fn fetchGetXXX
|
||||||
|
functions is read-only, and that a stream returned by one of the
|
||||||
|
.Fn fetchPutXXX
|
||||||
|
functions is write-only.
|
||||||
|
.Sh PROTOCOL INDEPENDENT FLAGS
|
||||||
|
If the
|
||||||
|
.Ql i
|
||||||
|
(if-modified-since) flag is specified, the library will try to fetch
|
||||||
|
the content only if it is newer than
|
||||||
|
.Va last_modified .
|
||||||
|
For HTTP an
|
||||||
|
.Li If-Modified-Since
|
||||||
|
HTTP header is sent.
|
||||||
|
For FTP a
|
||||||
|
.Li MTDM
|
||||||
|
command is sent first and compared locally.
|
||||||
|
For FILE the source file is compared.
|
||||||
|
.Sh FILE SCHEME
|
||||||
|
.Fn fetchXGetFile ,
|
||||||
|
.Fn fetchGetFile ,
|
||||||
|
and
|
||||||
|
.Fn fetchPutFile
|
||||||
|
provide access to documents which are files in a locally mounted file
|
||||||
|
system.
|
||||||
|
Only the
|
||||||
|
.Aq document
|
||||||
|
component of the URL is used.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchXGetFile
|
||||||
|
and
|
||||||
|
.Fn fetchGetFile
|
||||||
|
do not accept any flags.
|
||||||
|
.Pp
|
||||||
|
.Fn fetchPutFile
|
||||||
|
accepts the
|
||||||
|
.Ql a
|
||||||
|
(append to file) flag.
|
||||||
|
If that flag is specified, the data written to
|
||||||
|
the stream returned by
|
||||||
|
.Fn fetchPutFile
|
||||||
|
will be appended to the previous contents of the file, instead of
|
||||||
|
replacing them.
|
||||||
|
.Sh FTP SCHEME
|
||||||
|
.Fn fetchXGetFTP ,
|
||||||
|
.Fn fetchGetFTP ,
|
||||||
|
and
|
||||||
|
.Fn fetchPutFTP
|
||||||
|
implement the FTP protocol as described in RFC 959.
|
||||||
|
.Pp
|
||||||
|
By default
|
||||||
|
.Nm libfetch
|
||||||
|
will attempt to use passive mode first and only fallback to active mode
|
||||||
|
if the server reports a syntax error.
|
||||||
|
If the
|
||||||
|
.Ql a
|
||||||
|
(active) flag is specified, a passive connection is not tried and active mode
|
||||||
|
is used directly.
|
||||||
|
.Pp
|
||||||
|
If the
|
||||||
|
.Ql l
|
||||||
|
(low) flag is specified, data sockets will be allocated in the low (or
|
||||||
|
default) port range instead of the high port range (see
|
||||||
|
.Xr ip 4 ) .
|
||||||
|
.Pp
|
||||||
|
If the
|
||||||
|
.Ql d
|
||||||
|
(direct) flag is specified,
|
||||||
|
.Fn fetchXGetFTP ,
|
||||||
|
.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 "anonymous"
|
||||||
|
and password "anonymous@\*[Lt]hostname\*[Gt]".
|
||||||
|
.Sh HTTP SCHEME
|
||||||
|
The
|
||||||
|
.Fn fetchXGetHTTP ,
|
||||||
|
.Fn fetchGetHTTP ,
|
||||||
|
and
|
||||||
|
.Fn fetchPutHTTP
|
||||||
|
functions implement the HTTP/1.1 protocol.
|
||||||
|
With a little luck, there is
|
||||||
|
even a chance that they comply with RFC 2616 and RFC 2617.
|
||||||
|
.Pp
|
||||||
|
If the
|
||||||
|
.Ql d
|
||||||
|
(direct) flag is specified,
|
||||||
|
.Fn fetchXGetHTTP ,
|
||||||
|
.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
|
||||||
|
library,
|
||||||
|
.Fn fetchPutHTTP
|
||||||
|
is currently unimplemented.
|
||||||
|
.Sh AUTHENTICATION
|
||||||
|
Apart from setting the appropriate environment variables and
|
||||||
|
specifying the user name and password in the URL or the
|
||||||
|
.Vt struct url ,
|
||||||
|
the calling program has the option of defining an authentication
|
||||||
|
function with the following prototype:
|
||||||
|
.Pp
|
||||||
|
.Ft int
|
||||||
|
.Fn myAuthMethod "struct url *u"
|
||||||
|
.Pp
|
||||||
|
The callback function should fill in the
|
||||||
|
.Fa user
|
||||||
|
and
|
||||||
|
.Fa pwd
|
||||||
|
fields in the provided
|
||||||
|
.Vt struct url
|
||||||
|
and return 0 on success, or any other value to indicate failure.
|
||||||
|
.Pp
|
||||||
|
To register the authentication callback, simply set
|
||||||
|
.Va fetchAuthMethod
|
||||||
|
to point at it.
|
||||||
|
The callback will be used whenever a site requires authentication and
|
||||||
|
the appropriate environment variables are not set.
|
||||||
|
.Pp
|
||||||
|
This interface is experimental and may be subject to change.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
.Fn fetchParseURL
|
||||||
|
returns a pointer to a
|
||||||
|
.Vt struct url
|
||||||
|
containing the individual components of the URL.
|
||||||
|
If it is
|
||||||
|
unable to allocate memory, or the URL is syntactically incorrect,
|
||||||
|
.Fn fetchParseURL
|
||||||
|
returns a
|
||||||
|
.Dv NULL
|
||||||
|
pointer.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fn fetchStat
|
||||||
|
functions return 0 on success and \-1 on failure.
|
||||||
|
.Pp
|
||||||
|
All other functions return a stream pointer which may be used to
|
||||||
|
access the requested document, or
|
||||||
|
.Dv NULL
|
||||||
|
if an error occurred.
|
||||||
|
.Pp
|
||||||
|
The following error codes are defined in
|
||||||
|
.In fetch.h :
|
||||||
|
.Bl -tag -width 18n
|
||||||
|
.It Bq Er FETCH_ABORT
|
||||||
|
Operation aborted
|
||||||
|
.It Bq Er FETCH_AUTH
|
||||||
|
Authentication failed
|
||||||
|
.It Bq Er FETCH_DOWN
|
||||||
|
Service unavailable
|
||||||
|
.It Bq Er FETCH_EXISTS
|
||||||
|
File exists
|
||||||
|
.It Bq Er FETCH_FULL
|
||||||
|
File system full
|
||||||
|
.It Bq Er FETCH_INFO
|
||||||
|
Informational response
|
||||||
|
.It Bq Er FETCH_MEMORY
|
||||||
|
Insufficient memory
|
||||||
|
.It Bq Er FETCH_MOVED
|
||||||
|
File has moved
|
||||||
|
.It Bq Er FETCH_NETWORK
|
||||||
|
Network error
|
||||||
|
.It Bq Er FETCH_OK
|
||||||
|
No error
|
||||||
|
.It Bq Er FETCH_PROTO
|
||||||
|
Protocol error
|
||||||
|
.It Bq Er FETCH_RESOLV
|
||||||
|
Resolver error
|
||||||
|
.It Bq Er FETCH_SERVER
|
||||||
|
Server error
|
||||||
|
.It Bq Er FETCH_TEMP
|
||||||
|
Temporary error
|
||||||
|
.It Bq Er FETCH_TIMEOUT
|
||||||
|
Operation timed out
|
||||||
|
.It Bq Er FETCH_UNAVAIL
|
||||||
|
File is not available
|
||||||
|
.It Bq Er FETCH_UNKNOWN
|
||||||
|
Unknown error
|
||||||
|
.It Bq Er FETCH_URL
|
||||||
|
Invalid URL
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The accompanying error message includes a protocol-specific error code
|
||||||
|
and message, e.g.\& "File is not available (404 Not Found)"
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Bl -tag -width ".Ev FETCH_BIND_ADDRESS"
|
||||||
|
.It Ev FETCH_BIND_ADDRESS
|
||||||
|
Specifies a host name or IP address to which sockets used for outgoing
|
||||||
|
connections will be bound.
|
||||||
|
.It Ev FTP_LOGIN
|
||||||
|
Default FTP login if none was provided in the URL.
|
||||||
|
.It Ev FTP_PASSIVE_MODE
|
||||||
|
If set to anything but
|
||||||
|
.Ql no ,
|
||||||
|
forces the FTP code to use passive mode.
|
||||||
|
.It Ev FTP_PASSWORD
|
||||||
|
Default FTP password if the remote server requests one and none was
|
||||||
|
provided in the URL.
|
||||||
|
.It Ev FTP_PROXY
|
||||||
|
URL of the proxy to use for FTP requests.
|
||||||
|
The document part is ignored.
|
||||||
|
FTP and HTTP proxies are supported; if no scheme is specified, FTP is
|
||||||
|
assumed.
|
||||||
|
If the proxy is an FTP proxy,
|
||||||
|
.Nm libfetch
|
||||||
|
will send
|
||||||
|
.Ql user@host
|
||||||
|
as user name to the proxy, where
|
||||||
|
.Ql user
|
||||||
|
is the real user name, and
|
||||||
|
.Ql host
|
||||||
|
is the name of the FTP server.
|
||||||
|
.Pp
|
||||||
|
If this variable is set to an empty string, no proxy will be used for
|
||||||
|
FTP requests, even if the
|
||||||
|
.Ev HTTP_PROXY
|
||||||
|
variable is set.
|
||||||
|
.It Ev ftp_proxy
|
||||||
|
Same as
|
||||||
|
.Ev FTP_PROXY ,
|
||||||
|
for compatibility.
|
||||||
|
.It Ev HTTP_AUTH
|
||||||
|
Specifies HTTP authorization parameters as a colon-separated list of
|
||||||
|
items.
|
||||||
|
The first and second item are the authorization scheme and realm
|
||||||
|
respectively; further items are scheme-dependent.
|
||||||
|
Currently, only basic authorization is supported.
|
||||||
|
.Pp
|
||||||
|
Basic authorization requires two parameters: the user name and
|
||||||
|
password, in that order.
|
||||||
|
.Pp
|
||||||
|
This variable is only used if the server requires authorization and
|
||||||
|
no user name or password was specified in the URL.
|
||||||
|
.It Ev HTTP_PROXY
|
||||||
|
URL of the proxy to use for HTTP requests.
|
||||||
|
The document part is ignored.
|
||||||
|
Only HTTP proxies are supported for HTTP requests.
|
||||||
|
If no port number is specified, the default is 3128.
|
||||||
|
.Pp
|
||||||
|
Note that this proxy will also be used for FTP documents, unless the
|
||||||
|
.Ev FTP_PROXY
|
||||||
|
variable is set.
|
||||||
|
.It Ev http_proxy
|
||||||
|
Same as
|
||||||
|
.Ev HTTP_PROXY ,
|
||||||
|
for compatibility.
|
||||||
|
.It Ev HTTP_PROXY_AUTH
|
||||||
|
Specifies authorization parameters for the HTTP proxy in the same
|
||||||
|
format as the
|
||||||
|
.Ev HTTP_AUTH
|
||||||
|
variable.
|
||||||
|
.Pp
|
||||||
|
This variable is used if and only if connected to an HTTP proxy, and
|
||||||
|
is ignored if a user and/or a password were specified in the proxy
|
||||||
|
URL.
|
||||||
|
.It Ev HTTP_REFERER
|
||||||
|
Specifies the referrer URL to use for HTTP requests.
|
||||||
|
If set to
|
||||||
|
.Dq auto ,
|
||||||
|
the document URL will be used as referrer URL.
|
||||||
|
.It Ev HTTP_USER_AGENT
|
||||||
|
Specifies the User-Agent string to use for HTTP requests.
|
||||||
|
This can be useful when working with HTTP origin or proxy servers that
|
||||||
|
differentiate between user agents.
|
||||||
|
.It Ev NETRC
|
||||||
|
Specifies a file to use instead of
|
||||||
|
.Pa ~/.netrc
|
||||||
|
to look up login names and passwords for FTP sites.
|
||||||
|
See
|
||||||
|
.Xr ftp 1
|
||||||
|
for a description of the file format.
|
||||||
|
This feature is experimental.
|
||||||
|
.It Ev NO_PROXY
|
||||||
|
Either a single asterisk, which disables the use of proxies
|
||||||
|
altogether, or a comma- or whitespace-separated list of hosts for
|
||||||
|
which proxies should not be used.
|
||||||
|
.It Ev no_proxy
|
||||||
|
Same as
|
||||||
|
.Ev NO_PROXY ,
|
||||||
|
for compatibility.
|
||||||
|
.El
|
||||||
|
.Sh EXAMPLES
|
||||||
|
To access a proxy server on
|
||||||
|
.Pa proxy.example.com
|
||||||
|
port 8080, set the
|
||||||
|
.Ev HTTP_PROXY
|
||||||
|
environment variable in a manner similar to this:
|
||||||
|
.Pp
|
||||||
|
.Dl HTTP_PROXY=http://proxy.example.com:8080
|
||||||
|
.Pp
|
||||||
|
If the proxy server requires authentication, there are
|
||||||
|
two options available for passing the authentication data.
|
||||||
|
The first method is by using the proxy URL:
|
||||||
|
.Pp
|
||||||
|
.Dl HTTP_PROXY=http://\*[Lt]user\*[Gt]:\*[Lt]pwd\*[Gt]@proxy.example.com:8080
|
||||||
|
.Pp
|
||||||
|
The second method is by using the
|
||||||
|
.Ev HTTP_PROXY_AUTH
|
||||||
|
environment variable:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
HTTP_PROXY=http://proxy.example.com:8080
|
||||||
|
HTTP_PROXY_AUTH=basic:*:\*[Lt]user\*[Gt]:\*[Lt]pwd\*[Gt]
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
To disable the use of a proxy for an HTTP server running on the local
|
||||||
|
host, define
|
||||||
|
.Ev NO_PROXY
|
||||||
|
as follows:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
NO_PROXY=localhost,127.0.0.1
|
||||||
|
.Ed
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.\" .Xr fetch 1 ,
|
||||||
|
.\" .Xr ftpio 3 ,
|
||||||
|
.Xr ftp 1 ,
|
||||||
|
.Xr ip 4
|
||||||
|
.Rs
|
||||||
|
.%A J. Postel
|
||||||
|
.%A J. K. Reynolds
|
||||||
|
.%D October 1985
|
||||||
|
.%B File Transfer Protocol
|
||||||
|
.%O RFC 959
|
||||||
|
.Re
|
||||||
|
.Rs
|
||||||
|
.%A P. Deutsch
|
||||||
|
.%A A. Emtage
|
||||||
|
.%A A. Marine
|
||||||
|
.%D May 1994
|
||||||
|
.%T How to Use Anonymous FTP
|
||||||
|
.%O RFC 1635
|
||||||
|
.Re
|
||||||
|
.Rs
|
||||||
|
.%A T. Berners-Lee
|
||||||
|
.%A L. Masinter
|
||||||
|
.%A M. McCahill
|
||||||
|
.%D December 1994
|
||||||
|
.%T Uniform Resource Locators (URL)
|
||||||
|
.%O RFC 1738
|
||||||
|
.Re
|
||||||
|
.Rs
|
||||||
|
.%A R. Fielding
|
||||||
|
.%A J. Gettys
|
||||||
|
.%A J. Mogul
|
||||||
|
.%A H. Frystyk
|
||||||
|
.%A L. Masinter
|
||||||
|
.%A P. Leach
|
||||||
|
.%A T. Berners-Lee
|
||||||
|
.%D January 1999
|
||||||
|
.%B Hypertext Transfer Protocol -- HTTP/1.1
|
||||||
|
.%O RFC 2616
|
||||||
|
.Re
|
||||||
|
.Rs
|
||||||
|
.%A J. Franks
|
||||||
|
.%A P. Hallam-Baker
|
||||||
|
.%A J. Hostetler
|
||||||
|
.%A S. Lawrence
|
||||||
|
.%A P. Leach
|
||||||
|
.%A A. Luotonen
|
||||||
|
.%A L. Stewart
|
||||||
|
.%D June 1999
|
||||||
|
.%B HTTP Authentication: Basic and Digest Access Authentication
|
||||||
|
.%O RFC 2617
|
||||||
|
.Re
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm fetch
|
||||||
|
library first appeared in
|
||||||
|
.Fx 3.0 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
.An -nosplit
|
||||||
|
The
|
||||||
|
.Nm fetch
|
||||||
|
library was mostly written by
|
||||||
|
.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org
|
||||||
|
with numerous suggestions from
|
||||||
|
.An Jordan K. Hubbard Aq Mt jkh@FreeBSD.org ,
|
||||||
|
.An Eugene Skepner Aq Mt eu@qub.com
|
||||||
|
and other
|
||||||
|
.Fx
|
||||||
|
developers.
|
||||||
|
It replaces the older
|
||||||
|
.Nm ftpio
|
||||||
|
library written by
|
||||||
|
.An Poul-Henning Kamp Aq Mt phk@FreeBSD.org
|
||||||
|
and
|
||||||
|
.An Jordan K. Hubbard Aq Mt jkh@FreeBSD.org .
|
||||||
|
.Pp
|
||||||
|
This manual page was written by
|
||||||
|
.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
|
||||||
|
.Sh BUGS
|
||||||
|
Some parts of the library are not yet implemented.
|
||||||
|
The most notable
|
||||||
|
examples of this are
|
||||||
|
.Fn fetchPutHTTP
|
||||||
|
and FTP proxy support.
|
||||||
|
.Pp
|
||||||
|
There is no way to select a proxy at run-time other than setting the
|
||||||
|
.Ev HTTP_PROXY
|
||||||
|
or
|
||||||
|
.Ev FTP_PROXY
|
||||||
|
environment variables as appropriate.
|
||||||
|
.Pp
|
||||||
|
.Nm libfetch
|
||||||
|
does not understand or obey 305 (Use Proxy) replies.
|
||||||
|
.Pp
|
||||||
|
Error numbers are unique only within a certain context; the error
|
||||||
|
codes used for FTP and HTTP overlap, as do those used for resolver and
|
||||||
|
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 man page is incomplete, poorly written and produces badly
|
||||||
|
formatted text.
|
||||||
|
.Pp
|
||||||
|
The error reporting mechanism is unsatisfactory.
|
||||||
|
.Pp
|
||||||
|
Some parts of the code are not fully reentrant.
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: fetch.c,v 1.19 2009/08/11 20:48:06 joerg Exp $ */
|
/* $NetBSD: fetch.c,v 1.1.1.8 2009/08/21 15:12:27 joerg Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* Copyright (c) 2008 Joerg Sonnenberger <joerg@NetBSD.org>
|
* Copyright (c) 2008 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat.h>
|
#include <nbcompat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fetch.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
auth_t fetchAuthMethod;
|
auth_t fetchAuthMethod;
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: fetch.h,v 1.16 2010/01/22 13:21:09 joerg Exp $ */
|
/* $NetBSD: fetch.h,v 1.1.1.7 2010/01/30 21:26:11 joerg Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* All rights reserved.
|
* All rights reserved.
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: file.c,v 1.15 2009/10/15 12:36:57 joerg Exp $ */
|
/* $NetBSD: file.c,v 1.2 2011/06/25 20:27:01 christos Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* Copyright (c) 2008, 2009 Joerg Sonnenberger <joerg@NetBSD.org>
|
* Copyright (c) 2008, 2009 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat.h>
|
#include <nbcompat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "fetch.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static int fetch_stat_file(int, struct url_stat *);
|
static int fetch_stat_file(int, struct url_stat *);
|
||||||
|
@ -203,7 +204,8 @@ fetch_stat_file(int fd, struct url_stat *us)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fetchStatFile(struct url *u, struct url_stat *us, const char *flags)
|
/*ARGSUSED*/
|
||||||
|
fetchStatFile(struct url *u, struct url_stat *us, const char *flags __unused)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
int fd, rv;
|
int fd, rv;
|
||||||
|
@ -228,7 +230,9 @@ fetchStatFile(struct url *u, struct url_stat *us, const char *flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fetchListFile(struct url_list *ue, struct url *u, const char *pattern, const char *flags)
|
/*ARGSUSED*/
|
||||||
|
fetchListFile(struct url_list *ue, struct url *u, const char *pattern,
|
||||||
|
const char *flags __unused)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
struct dirent *de;
|
struct dirent *de;
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: ftp.c,v 1.35 2010/03/21 16:48:43 joerg Exp $ */
|
/* $NetBSD: ftp.c,v 1.6 2013/10/19 22:58:40 mrg Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* Copyright (c) 2008, 2009, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
* Copyright (c) 2008, 2009, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat.h>
|
#include <nbcompat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#endif
|
#endif
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat/netdb.h>
|
#include <nbcompat/netdb.h>
|
||||||
#include <nbcompat/stdio.h>
|
#include <nbcompat/stdio.h>
|
||||||
#else
|
#else
|
||||||
|
@ -94,6 +94,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "fetch.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "ftperr.h"
|
#include "ftperr.h"
|
||||||
|
|
||||||
|
@ -130,9 +131,6 @@
|
||||||
isdigit((unsigned char)foo[2]) && \
|
isdigit((unsigned char)foo[2]) && \
|
||||||
foo[3] == '-')
|
foo[3] == '-')
|
||||||
|
|
||||||
#define MINBUFSIZE 4096
|
|
||||||
|
|
||||||
#ifdef INET6
|
|
||||||
/*
|
/*
|
||||||
* Translate IPv4 mapped IPv6 address to IPv4 address
|
* Translate IPv4 mapped IPv6 address to IPv4 address
|
||||||
*/
|
*/
|
||||||
|
@ -140,14 +138,16 @@ static void
|
||||||
unmappedaddr(struct sockaddr_in6 *sin6, socklen_t *len)
|
unmappedaddr(struct sockaddr_in6 *sin6, socklen_t *len)
|
||||||
{
|
{
|
||||||
struct sockaddr_in *sin4;
|
struct sockaddr_in *sin4;
|
||||||
|
void *addrp;
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
int port;
|
int port;
|
||||||
|
|
||||||
if (sin6->sin6_family != AF_INET6 ||
|
if (sin6->sin6_family != AF_INET6 ||
|
||||||
!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
|
!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
|
||||||
return;
|
return;
|
||||||
sin4 = (struct sockaddr_in *)sin6;
|
sin4 = (struct sockaddr_in *)(void *)sin6;
|
||||||
addr = *(uint32_t *)&sin6->sin6_addr.s6_addr[12];
|
addrp = &sin6->sin6_addr.s6_addr[12];
|
||||||
|
addr = *(uint32_t *)addrp;
|
||||||
port = sin6->sin6_port;
|
port = sin6->sin6_port;
|
||||||
memset(sin4, 0, sizeof(struct sockaddr_in));
|
memset(sin4, 0, sizeof(struct sockaddr_in));
|
||||||
sin4->sin_addr.s_addr = addr;
|
sin4->sin_addr.s_addr = addr;
|
||||||
|
@ -158,7 +158,6 @@ unmappedaddr(struct sockaddr_in6 *sin6, socklen_t *len)
|
||||||
sin4->sin_len = sizeof(struct sockaddr_in);
|
sin4->sin_len = sizeof(struct sockaddr_in);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get server response
|
* Get server response
|
||||||
|
@ -199,17 +198,13 @@ ftp_chkerr(conn_t *conn)
|
||||||
/*
|
/*
|
||||||
* Send a command and check reply
|
* Send a command and check reply
|
||||||
*/
|
*/
|
||||||
static int ftp_cmd(conn_t *conn, const char *fmt, ...)
|
|
||||||
__attribute__((__format__(__printf__, 2, 3)));
|
|
||||||
|
|
||||||
#ifndef __minix
|
|
||||||
static int
|
static int
|
||||||
ftp_cmd(conn_t *conn, const char *fmt, ...)
|
ftp_cmd(conn_t *conn, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *msg;
|
char *msg;
|
||||||
int r;
|
ssize_t r;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
len = vasprintf(&msg, fmt, ap);
|
len = vasprintf(&msg, fmt, ap);
|
||||||
|
@ -231,40 +226,12 @@ ftp_cmd(conn_t *conn, const char *fmt, ...)
|
||||||
|
|
||||||
return (ftp_chkerr(conn));
|
return (ftp_chkerr(conn));
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static int
|
|
||||||
ftp_cmd(conn_t *conn, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
size_t len;
|
|
||||||
char msg[MINBUFSIZE];
|
|
||||||
int r;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
len = vsnprintf(&msg[0], MINBUFSIZE, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
if (len >= MINBUFSIZE) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = fetch_write(conn, msg, len);
|
|
||||||
|
|
||||||
if (r == -1) {
|
|
||||||
fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ftp_chkerr(conn));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Return a pointer to the filename part of a path
|
* Return a pointer to the filename part of a path
|
||||||
*/
|
*/
|
||||||
static const char *
|
static const char *
|
||||||
ftp_filename(const char *file, int *len, int *type, int subdir)
|
ftp_filename(const char *file, size_t *len, int *type, int subdir)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
|
@ -291,6 +258,7 @@ ftp_pwd(conn_t *conn, char **pwd)
|
||||||
{
|
{
|
||||||
char *src, *dst, *end;
|
char *src, *dst, *end;
|
||||||
int q;
|
int q;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
if (conn->err != FTP_WORKING_DIRECTORY &&
|
if (conn->err != FTP_WORKING_DIRECTORY &&
|
||||||
conn->err != FTP_FILE_ACTION_OK)
|
conn->err != FTP_FILE_ACTION_OK)
|
||||||
|
@ -299,7 +267,8 @@ ftp_pwd(conn_t *conn, char **pwd)
|
||||||
src = conn->buf + 4;
|
src = conn->buf + 4;
|
||||||
if (src >= end || *src++ != '"')
|
if (src >= end || *src++ != '"')
|
||||||
return (FTP_PROTOCOL_ERROR);
|
return (FTP_PROTOCOL_ERROR);
|
||||||
*pwd = malloc(end - src + 1);
|
len = end - src + 1;
|
||||||
|
*pwd = malloc(len);
|
||||||
if (*pwd == NULL)
|
if (*pwd == NULL)
|
||||||
return (FTP_PROTOCOL_ERROR);
|
return (FTP_PROTOCOL_ERROR);
|
||||||
for (q = 0, dst = *pwd; src < end; ++src) {
|
for (q = 0, dst = *pwd; src < end; ++src) {
|
||||||
|
@ -330,7 +299,8 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
||||||
{
|
{
|
||||||
const char *beg, *end;
|
const char *beg, *end;
|
||||||
char *pwd, *dst;
|
char *pwd, *dst;
|
||||||
int e, i, len;
|
int e;
|
||||||
|
size_t i, len;
|
||||||
|
|
||||||
if (*path != '/') {
|
if (*path != '/') {
|
||||||
ftp_seterr(501);
|
ftp_seterr(501);
|
||||||
|
@ -360,18 +330,7 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
||||||
} else if (strcmp(conn->ftp_home, "/") == 0) {
|
} else if (strcmp(conn->ftp_home, "/") == 0) {
|
||||||
dst = strdup(path - 1);
|
dst = strdup(path - 1);
|
||||||
} else {
|
} else {
|
||||||
#ifndef __minix
|
|
||||||
asprintf(&dst, "%s/%s", conn->ftp_home, path);
|
asprintf(&dst, "%s/%s", conn->ftp_home, path);
|
||||||
#else
|
|
||||||
if((dst = malloc(sizeof(char)*MINBUFSIZE)) != NULL) {
|
|
||||||
len = snprintf(dst, MINBUFSIZE, "%s/%s", conn->ftp_home, path);
|
|
||||||
|
|
||||||
if(len >= MINBUFSIZE) {
|
|
||||||
free(dst);
|
|
||||||
dst = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (dst == NULL) {
|
if (dst == NULL) {
|
||||||
fetch_syserr();
|
fetch_syserr();
|
||||||
|
@ -388,7 +347,7 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
||||||
len = strlen(pwd);
|
len = strlen(pwd);
|
||||||
|
|
||||||
/* Look for a common prefix between PWD and dir to fetch. */
|
/* Look for a common prefix between PWD and dir to fetch. */
|
||||||
for (i = 0; i <= len && i <= end - dst; ++i)
|
for (i = 0; i <= len && i <= (size_t)(end - dst); ++i)
|
||||||
if (pwd[i] != dst[i])
|
if (pwd[i] != dst[i])
|
||||||
break;
|
break;
|
||||||
/* Keep going up a dir until we have a matching prefix. */
|
/* Keep going up a dir until we have a matching prefix. */
|
||||||
|
@ -455,6 +414,7 @@ ftp_mode_type(conn_t *conn, int mode, int type)
|
||||||
case 0:
|
case 0:
|
||||||
case 's':
|
case 's':
|
||||||
mode = 'S';
|
mode = 'S';
|
||||||
|
/*FALLTHROUGH*/
|
||||||
case 'S':
|
case 'S':
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -483,14 +443,17 @@ ftp_mode_type(conn_t *conn, int mode, int type)
|
||||||
case 0:
|
case 0:
|
||||||
case 'i':
|
case 'i':
|
||||||
type = 'I';
|
type = 'I';
|
||||||
|
/*FALLTHROUGH*/
|
||||||
case 'I':
|
case 'I':
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
type = 'A';
|
type = 'A';
|
||||||
|
/*FALLTHROUGH*/
|
||||||
case 'A':
|
case 'A':
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
type = 'D';
|
type = 'D';
|
||||||
|
/*FALLTHROUGH*/
|
||||||
case 'D':
|
case 'D':
|
||||||
/* can't handle yet */
|
/* can't handle yet */
|
||||||
default:
|
default:
|
||||||
|
@ -510,7 +473,8 @@ ftp_stat(conn_t *conn, const char *file, struct url_stat *us)
|
||||||
{
|
{
|
||||||
char *ln;
|
char *ln;
|
||||||
const char *filename;
|
const char *filename;
|
||||||
int filenamelen, type;
|
size_t filenamelen;
|
||||||
|
int type;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t;
|
time_t t;
|
||||||
int e;
|
int e;
|
||||||
|
@ -598,7 +562,7 @@ static ssize_t
|
||||||
ftp_readfn(void *v, void *buf, size_t len)
|
ftp_readfn(void *v, void *buf, size_t len)
|
||||||
{
|
{
|
||||||
struct ftpio *io;
|
struct ftpio *io;
|
||||||
int r;
|
ssize_t r;
|
||||||
|
|
||||||
io = (struct ftpio *)v;
|
io = (struct ftpio *)v;
|
||||||
if (io == NULL) {
|
if (io == NULL) {
|
||||||
|
@ -631,7 +595,7 @@ static ssize_t
|
||||||
ftp_writefn(void *v, const void *buf, size_t len)
|
ftp_writefn(void *v, const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
struct ftpio *io;
|
struct ftpio *io;
|
||||||
int w;
|
ssize_t w;
|
||||||
|
|
||||||
io = (struct ftpio *)v;
|
io = (struct ftpio *)v;
|
||||||
if (io == NULL) {
|
if (io == NULL) {
|
||||||
|
@ -665,7 +629,6 @@ static void
|
||||||
ftp_closefn(void *v)
|
ftp_closefn(void *v)
|
||||||
{
|
{
|
||||||
struct ftpio *io;
|
struct ftpio *io;
|
||||||
int r;
|
|
||||||
|
|
||||||
io = (struct ftpio *)v;
|
io = (struct ftpio *)v;
|
||||||
if (io == NULL) {
|
if (io == NULL) {
|
||||||
|
@ -681,7 +644,7 @@ ftp_closefn(void *v)
|
||||||
fetch_close(io->dconn);
|
fetch_close(io->dconn);
|
||||||
io->dconn = NULL;
|
io->dconn = NULL;
|
||||||
io->dir = -1;
|
io->dir = -1;
|
||||||
r = ftp_chkerr(io->cconn);
|
(void)ftp_chkerr(io->cconn);
|
||||||
fetch_cache_put(io->cconn, ftp_disconnect);
|
fetch_cache_put(io->cconn, ftp_disconnect);
|
||||||
free(io);
|
free(io);
|
||||||
return;
|
return;
|
||||||
|
@ -722,7 +685,8 @@ ftp_transfer(conn_t *conn, const char *oper, const char *file, const char *op_ar
|
||||||
} u;
|
} u;
|
||||||
const char *bindaddr;
|
const char *bindaddr;
|
||||||
const char *filename;
|
const char *filename;
|
||||||
int filenamelen, type;
|
size_t filenamelen;
|
||||||
|
int type;
|
||||||
int low, pasv, verbose;
|
int low, pasv, verbose;
|
||||||
int e, sd = -1;
|
int e, sd = -1;
|
||||||
socklen_t l;
|
socklen_t l;
|
||||||
|
@ -750,10 +714,8 @@ ftp_transfer(conn_t *conn, const char *oper, const char *file, const char *op_ar
|
||||||
l = sizeof(u.ss);
|
l = sizeof(u.ss);
|
||||||
if (getsockname(conn->sd, &u.sa, &l) == -1)
|
if (getsockname(conn->sd, &u.sa, &l) == -1)
|
||||||
goto sysouch;
|
goto sysouch;
|
||||||
#ifdef INET6
|
|
||||||
if (u.ss.ss_family == AF_INET6)
|
if (u.ss.ss_family == AF_INET6)
|
||||||
unmappedaddr(&u.sin6, &l);
|
unmappedaddr(&u.sin6, &l);
|
||||||
#endif
|
|
||||||
|
|
||||||
retry_mode:
|
retry_mode:
|
||||||
|
|
||||||
|
@ -777,7 +739,6 @@ retry_mode:
|
||||||
if ((e = ftp_cmd(conn, "PASV\r\n")) != FTP_PASSIVE_MODE)
|
if ((e = ftp_cmd(conn, "PASV\r\n")) != FTP_PASSIVE_MODE)
|
||||||
goto ouch;
|
goto ouch;
|
||||||
break;
|
break;
|
||||||
#ifdef INET6
|
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if ((e = ftp_cmd(conn, "EPSV\r\n")) != FTP_EPASSIVE_MODE) {
|
if ((e = ftp_cmd(conn, "EPSV\r\n")) != FTP_EPASSIVE_MODE) {
|
||||||
if (e == -1)
|
if (e == -1)
|
||||||
|
@ -787,7 +748,6 @@ retry_mode:
|
||||||
goto ouch;
|
goto ouch;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
default:
|
default:
|
||||||
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
|
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
|
||||||
goto ouch;
|
goto ouch;
|
||||||
|
@ -809,7 +769,7 @@ retry_mode:
|
||||||
}
|
}
|
||||||
l = (e == FTP_PASSIVE_MODE ? 6 : 21);
|
l = (e == FTP_PASSIVE_MODE ? 6 : 21);
|
||||||
for (i = 0; *p && i < l; i++, p++)
|
for (i = 0; *p && i < l; i++, p++)
|
||||||
addr[i] = strtol(p, &p, 10);
|
addr[i] = (unsigned char)strtol(p, &p, 10);
|
||||||
if (i < l) {
|
if (i < l) {
|
||||||
e = FTP_PROTOCOL_ERROR;
|
e = FTP_PROTOCOL_ERROR;
|
||||||
goto ouch;
|
goto ouch;
|
||||||
|
@ -850,12 +810,9 @@ retry_mode:
|
||||||
l = sizeof(u.ss);
|
l = sizeof(u.ss);
|
||||||
if (getpeername(conn->sd, &u.sa, &l) == -1)
|
if (getpeername(conn->sd, &u.sa, &l) == -1)
|
||||||
goto sysouch;
|
goto sysouch;
|
||||||
#ifdef INET6
|
|
||||||
if (u.ss.ss_family == AF_INET6)
|
if (u.ss.ss_family == AF_INET6)
|
||||||
unmappedaddr(&u.sin6, &l);
|
unmappedaddr(&u.sin6, &l);
|
||||||
#endif
|
|
||||||
switch (u.ss.ss_family) {
|
switch (u.ss.ss_family) {
|
||||||
#ifdef INET6
|
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (e == FTP_EPASSIVE_MODE)
|
if (e == FTP_EPASSIVE_MODE)
|
||||||
u.sin6.sin6_port = htons(port);
|
u.sin6.sin6_port = htons(port);
|
||||||
|
@ -864,7 +821,6 @@ retry_mode:
|
||||||
memcpy(&u.sin6.sin6_port, addr + 19, 2);
|
memcpy(&u.sin6.sin6_port, addr + 19, 2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
if (e == FTP_EPASSIVE_MODE)
|
if (e == FTP_EPASSIVE_MODE)
|
||||||
u.sin4.sin_port = htons(port);
|
u.sin4.sin_port = htons(port);
|
||||||
|
@ -906,29 +862,24 @@ retry_mode:
|
||||||
int arg;
|
int arg;
|
||||||
#endif
|
#endif
|
||||||
int d;
|
int d;
|
||||||
#ifdef INET6
|
|
||||||
char *ap;
|
|
||||||
char hname[INET6_ADDRSTRLEN];
|
char hname[INET6_ADDRSTRLEN];
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (u.ss.ss_family) {
|
switch (u.ss.ss_family) {
|
||||||
#ifdef INET6
|
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
u.sin6.sin6_port = 0;
|
u.sin6.sin6_port = 0;
|
||||||
#ifdef IPV6_PORTRANGE
|
#ifdef IPV6_PORTRANGE
|
||||||
arg = low ? IPV6_PORTRANGE_DEFAULT : IPV6_PORTRANGE_HIGH;
|
arg = low ? IPV6_PORTRANGE_DEFAULT : IPV6_PORTRANGE_HIGH;
|
||||||
if (setsockopt(sd, IPPROTO_IPV6, IPV6_PORTRANGE,
|
if (setsockopt(sd, IPPROTO_IPV6, IPV6_PORTRANGE,
|
||||||
(char *)&arg, sizeof(arg)) == -1)
|
&arg, (socklen_t)sizeof(arg)) == -1)
|
||||||
goto sysouch;
|
goto sysouch;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
u.sin4.sin_port = 0;
|
u.sin4.sin_port = 0;
|
||||||
#ifdef IP_PORTRANGE
|
#ifdef IP_PORTRANGE
|
||||||
arg = low ? IP_PORTRANGE_DEFAULT : IP_PORTRANGE_HIGH;
|
arg = low ? IP_PORTRANGE_DEFAULT : IP_PORTRANGE_HIGH;
|
||||||
if (setsockopt(sd, IPPROTO_IP, IP_PORTRANGE,
|
if (setsockopt(sd, IPPROTO_IP, IP_PORTRANGE,
|
||||||
(char *)&arg, sizeof(arg)) == -1)
|
&arg, (socklen_t)sizeof(arg)) == -1)
|
||||||
goto sysouch;
|
goto sysouch;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
@ -950,15 +901,13 @@ retry_mode:
|
||||||
e = ftp_cmd(conn, "PORT %d,%d,%d,%d,%d,%d\r\n",
|
e = ftp_cmd(conn, "PORT %d,%d,%d,%d,%d,%d\r\n",
|
||||||
(a >> 24) & 0xff, (a >> 16) & 0xff,
|
(a >> 24) & 0xff, (a >> 16) & 0xff,
|
||||||
(a >> 8) & 0xff, a & 0xff,
|
(a >> 8) & 0xff, a & 0xff,
|
||||||
(p >> 8) & 0xff, p & 0xff);
|
((unsigned int)p >> 8) & 0xff, p & 0xff);
|
||||||
break;
|
break;
|
||||||
#ifdef INET6
|
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
#define UC(b) (((int)b)&0xff)
|
|
||||||
e = -1;
|
e = -1;
|
||||||
u.sin6.sin6_scope_id = 0;
|
u.sin6.sin6_scope_id = 0;
|
||||||
if (getnameinfo(&u.sa, l,
|
if (getnameinfo(&u.sa, l,
|
||||||
hname, sizeof(hname),
|
hname, (socklen_t)sizeof(hname),
|
||||||
NULL, 0, NI_NUMERICHOST) == 0) {
|
NULL, 0, NI_NUMERICHOST) == 0) {
|
||||||
e = ftp_cmd(conn, "EPRT |%d|%s|%d|\r\n", 2, hname,
|
e = ftp_cmd(conn, "EPRT |%d|%s|%d|\r\n", 2, hname,
|
||||||
htons(u.sin6.sin6_port));
|
htons(u.sin6.sin6_port));
|
||||||
|
@ -966,20 +915,20 @@ retry_mode:
|
||||||
goto ouch;
|
goto ouch;
|
||||||
}
|
}
|
||||||
if (e != FTP_OK) {
|
if (e != FTP_OK) {
|
||||||
ap = (char *)&u.sin6.sin6_addr;
|
uint8_t aa[sizeof(u.sin6.sin6_addr)];
|
||||||
|
memcpy(aa, &u.sin6.sin6_addr, sizeof(aa));
|
||||||
|
p = ntohs(u.sin6.sin6_port);
|
||||||
e = ftp_cmd(conn,
|
e = ftp_cmd(conn,
|
||||||
"LPRT %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
|
"LPRT %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
|
||||||
6, 16,
|
6, 16,
|
||||||
UC(ap[0]), UC(ap[1]), UC(ap[2]), UC(ap[3]),
|
aa[ 0], aa[ 1], aa[ 2], aa[ 3],
|
||||||
UC(ap[4]), UC(ap[5]), UC(ap[6]), UC(ap[7]),
|
aa[ 4], aa[ 5], aa[ 6], aa[ 7],
|
||||||
UC(ap[8]), UC(ap[9]), UC(ap[10]), UC(ap[11]),
|
aa[ 8], aa[ 9], aa[10], aa[11],
|
||||||
UC(ap[12]), UC(ap[13]), UC(ap[14]), UC(ap[15]),
|
aa[12], aa[13], aa[14], aa[15],
|
||||||
2,
|
2,
|
||||||
(ntohs(u.sin6.sin6_port) >> 8) & 0xff,
|
((unsigned int)p >> 8) & 0xff, p & 0xff);
|
||||||
ntohs(u.sin6.sin6_port) & 0xff);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
default:
|
default:
|
||||||
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
|
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
|
||||||
goto ouch;
|
goto ouch;
|
||||||
|
@ -987,17 +936,10 @@ retry_mode:
|
||||||
if (e != FTP_OK)
|
if (e != FTP_OK)
|
||||||
goto ouch;
|
goto ouch;
|
||||||
|
|
||||||
#ifndef __minix
|
|
||||||
/* seek to required offset */
|
/* seek to required offset */
|
||||||
if (offset)
|
if (offset)
|
||||||
if (ftp_cmd(conn, "REST %llu\r\n", (unsigned long long)offset) != FTP_FILE_OK)
|
if (ftp_cmd(conn, "REST %llu\r\n", (unsigned long long)offset) != FTP_FILE_OK)
|
||||||
goto sysouch;
|
goto sysouch;
|
||||||
#else
|
|
||||||
/* seek to required offset */
|
|
||||||
if (offset)
|
|
||||||
if (ftp_cmd(conn, "REST %lu\r\n", (unsigned long)offset) != FTP_FILE_OK)
|
|
||||||
goto sysouch;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* make the server initiate the transfer */
|
/* make the server initiate the transfer */
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
@ -1103,10 +1045,9 @@ ftp_connect(struct url *url, struct url *purl, const char *flags)
|
||||||
verbose = CHECK_FLAG('v');
|
verbose = CHECK_FLAG('v');
|
||||||
if (CHECK_FLAG('4'))
|
if (CHECK_FLAG('4'))
|
||||||
af = AF_INET;
|
af = AF_INET;
|
||||||
#ifdef INET6
|
|
||||||
else if (CHECK_FLAG('6'))
|
else if (CHECK_FLAG('6'))
|
||||||
af = AF_INET6;
|
af = AF_INET6;
|
||||||
#endif
|
|
||||||
if (direct)
|
if (direct)
|
||||||
purl = NULL;
|
purl = NULL;
|
||||||
|
|
||||||
|
@ -1165,17 +1106,22 @@ static struct url *
|
||||||
ftp_get_proxy(struct url * url, const char *flags)
|
ftp_get_proxy(struct url * url, const char *flags)
|
||||||
{
|
{
|
||||||
struct url *purl;
|
struct url *purl;
|
||||||
char *p;
|
char *p, *fp, *FP, *hp, *HP;
|
||||||
|
|
||||||
if (flags != NULL && strchr(flags, 'd') != NULL)
|
if (flags != NULL && strchr(flags, 'd') != NULL)
|
||||||
return (NULL);
|
return NULL;
|
||||||
if (fetch_no_proxy_match(url->host))
|
if (fetch_no_proxy_match(url->host))
|
||||||
return (NULL);
|
return NULL;
|
||||||
if (((p = getenv("FTP_PROXY")) || (p = getenv("ftp_proxy")) ||
|
|
||||||
(p = getenv("HTTP_PROXY")) || (p = getenv("http_proxy"))) &&
|
FP = getenv("FTP_PROXY");
|
||||||
|
fp = getenv("ftp_proxy");
|
||||||
|
HP = getenv("HTTP_PROXY");
|
||||||
|
hp = getenv("http_proxy");
|
||||||
|
|
||||||
|
if ((((p = FP) || (p = fp) || (p = HP) || (p = hp))) &&
|
||||||
*p && (purl = fetchParseURL(p)) != NULL) {
|
*p && (purl = fetchParseURL(p)) != NULL) {
|
||||||
if (!*purl->scheme) {
|
if (!*purl->scheme) {
|
||||||
if (getenv("FTP_PROXY") || getenv("ftp_proxy"))
|
if (fp || FP)
|
||||||
strcpy(purl->scheme, SCHEME_FTP);
|
strcpy(purl->scheme, SCHEME_FTP);
|
||||||
else
|
else
|
||||||
strcpy(purl->scheme, SCHEME_HTTP);
|
strcpy(purl->scheme, SCHEME_HTTP);
|
||||||
|
@ -1184,10 +1130,10 @@ ftp_get_proxy(struct url * url, const char *flags)
|
||||||
purl->port = fetch_default_proxy_port(purl->scheme);
|
purl->port = fetch_default_proxy_port(purl->scheme);
|
||||||
if (strcasecmp(purl->scheme, SCHEME_FTP) == 0 ||
|
if (strcasecmp(purl->scheme, SCHEME_FTP) == 0 ||
|
||||||
strcasecmp(purl->scheme, SCHEME_HTTP) == 0)
|
strcasecmp(purl->scheme, SCHEME_HTTP) == 0)
|
||||||
return (purl);
|
return purl;
|
||||||
fetchFreeURL(purl);
|
fetchFreeURL(purl);
|
||||||
}
|
}
|
||||||
return (NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
|
@ -1,4 +1,4 @@
|
||||||
# $NetBSD: ftp.errors,v 1.2 2008/10/06 12:58:29 joerg Exp $
|
# $NetBSD: ftp.errors,v 1.1.1.4 2009/04/04 23:26:05 joerg Exp $
|
||||||
# $FreeBSD: ftp.errors,v 1.6 2002/10/30 06:06:16 des Exp $
|
# $FreeBSD: ftp.errors,v 1.6 2002/10/30 06:06:16 des Exp $
|
||||||
#
|
#
|
||||||
# This list is taken from RFC 959.
|
# This list is taken from RFC 959.
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: http.c,v 1.29 2010/01/24 19:10:35 joerg Exp $ */
|
/* $NetBSD: http.c,v 1.2 2011/06/25 20:27:01 christos Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2000-2004 Dag-Erling Coïdan Smørgrav
|
* Copyright (c) 2000-2004 Dag-Erling Coïdan Smørgrav
|
||||||
* Copyright (c) 2003 Thomas Klausner <wiz@NetBSD.org>
|
* Copyright (c) 2003 Thomas Klausner <wiz@NetBSD.org>
|
||||||
|
@ -68,15 +68,13 @@
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __minix
|
|
||||||
/* Needed for gmtime_r on Interix */
|
/* Needed for gmtime_r on Interix */
|
||||||
#define _REENTRANT
|
#define _REENTRANT
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat.h>
|
#include <nbcompat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -87,7 +85,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat/stdio.h>
|
#include <nbcompat/stdio.h>
|
||||||
#else
|
#else
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -100,7 +98,7 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
#if !defined(NETBSD) && !defined(__minix)
|
#ifndef NETBSD
|
||||||
#include <nbcompat/netdb.h>
|
#include <nbcompat/netdb.h>
|
||||||
#else
|
#else
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
@ -108,6 +106,7 @@
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "fetch.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "httperr.h"
|
#include "httperr.h"
|
||||||
|
|
||||||
|
@ -134,7 +133,6 @@
|
||||||
|
|
||||||
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
|
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
|
||||||
|
|
||||||
#define MINBUFSIZE 4096
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* I/O functions for decoding chunked streams
|
* I/O functions for decoding chunked streams
|
||||||
|
@ -148,7 +146,7 @@ struct httpio
|
||||||
char *buf; /* chunk buffer */
|
char *buf; /* chunk buffer */
|
||||||
size_t bufsize; /* size of chunk buffer */
|
size_t bufsize; /* size of chunk buffer */
|
||||||
ssize_t buflen; /* amount of data currently in buffer */
|
ssize_t buflen; /* amount of data currently in buffer */
|
||||||
int bufpos; /* current read offset in buffer */
|
size_t bufpos; /* current read offset in buffer */
|
||||||
int eof; /* end-of-file flag */
|
int eof; /* end-of-file flag */
|
||||||
int error; /* error flag */
|
int error; /* error flag */
|
||||||
size_t chunksize; /* remaining size of current chunk */
|
size_t chunksize; /* remaining size of current chunk */
|
||||||
|
@ -158,7 +156,7 @@ struct httpio
|
||||||
/*
|
/*
|
||||||
* Get next chunk header
|
* Get next chunk header
|
||||||
*/
|
*/
|
||||||
static int
|
static ssize_t
|
||||||
http_new_chunk(struct httpio *io)
|
http_new_chunk(struct httpio *io)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
@ -207,7 +205,7 @@ http_growbuf(struct httpio *io, size_t len)
|
||||||
/*
|
/*
|
||||||
* Fill the input buffer, do chunk decoding on the fly
|
* Fill the input buffer, do chunk decoding on the fly
|
||||||
*/
|
*/
|
||||||
static int
|
static ssize_t
|
||||||
http_fillbuf(struct httpio *io, size_t len)
|
http_fillbuf(struct httpio *io, size_t len)
|
||||||
{
|
{
|
||||||
if (io->error)
|
if (io->error)
|
||||||
|
@ -288,7 +286,7 @@ http_readfn(void *v, void *buf, size_t len)
|
||||||
|
|
||||||
for (pos = 0; len > 0; pos += l, len -= l) {
|
for (pos = 0; len > 0; pos += l, len -= l) {
|
||||||
/* empty buffer */
|
/* empty buffer */
|
||||||
if (!io->buf || io->bufpos == io->buflen)
|
if (!io->buf || (ssize_t)io->bufpos == io->buflen)
|
||||||
if (http_fillbuf(io, len) < 1)
|
if (http_fillbuf(io, len) < 1)
|
||||||
break;
|
break;
|
||||||
l = io->buflen - io->bufpos;
|
l = io->buflen - io->bufpos;
|
||||||
|
@ -327,7 +325,7 @@ http_closefn(void *v)
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
setsockopt(io->conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
|
setsockopt(io->conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
|
||||||
sizeof(val));
|
(socklen_t)sizeof(val));
|
||||||
fetch_cache_put(io->conn, fetch_close);
|
fetch_cache_put(io->conn, fetch_close);
|
||||||
#ifdef TCP_NOPUSH
|
#ifdef TCP_NOPUSH
|
||||||
val = 1;
|
val = 1;
|
||||||
|
@ -406,17 +404,13 @@ static struct {
|
||||||
/*
|
/*
|
||||||
* Send a formatted line; optionally echo to terminal
|
* Send a formatted line; optionally echo to terminal
|
||||||
*/
|
*/
|
||||||
static int http_cmd(conn_t *conn, const char *fmt, ...)
|
|
||||||
__attribute__((__format__(__printf__, 2, 3)));
|
|
||||||
|
|
||||||
#ifndef __minix
|
|
||||||
static int
|
static int
|
||||||
http_cmd(conn_t *conn, const char *fmt, ...)
|
http_cmd(conn_t *conn, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *msg;
|
char *msg;
|
||||||
int r;
|
ssize_t r;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
len = vasprintf(&msg, fmt, ap);
|
len = vasprintf(&msg, fmt, ap);
|
||||||
|
@ -438,35 +432,7 @@ http_cmd(conn_t *conn, const char *fmt, ...)
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static int
|
|
||||||
http_cmd(conn_t *conn, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
size_t len;
|
|
||||||
char msg[MINBUFSIZE];
|
|
||||||
int r;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
len = vsnprintf(&msg[0], MINBUFSIZE, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
if (len >= MINBUFSIZE) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = fetch_write(conn, &msg[0], len);
|
|
||||||
|
|
||||||
if (r == -1) {
|
|
||||||
fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Get and parse status line
|
* Get and parse status line
|
||||||
*/
|
*/
|
||||||
|
@ -638,7 +604,7 @@ http_base64(const char *src)
|
||||||
"0123456789+/";
|
"0123456789+/";
|
||||||
char *str, *dst;
|
char *str, *dst;
|
||||||
size_t l;
|
size_t l;
|
||||||
int t, r;
|
unsigned int t, r;
|
||||||
|
|
||||||
l = strlen(src);
|
l = strlen(src);
|
||||||
if ((str = malloc(((l + 2) / 3) * 4 + 1)) == NULL)
|
if ((str = malloc(((l + 2) / 3) * 4 + 1)) == NULL)
|
||||||
|
@ -685,7 +651,6 @@ http_base64(const char *src)
|
||||||
/*
|
/*
|
||||||
* Encode username and password
|
* Encode username and password
|
||||||
*/
|
*/
|
||||||
#ifndef __minix
|
|
||||||
static int
|
static int
|
||||||
http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
|
http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
|
||||||
{
|
{
|
||||||
|
@ -702,24 +667,7 @@ http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
|
||||||
free(auth);
|
free(auth);
|
||||||
return (r);
|
return (r);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static int
|
|
||||||
http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
|
|
||||||
{
|
|
||||||
char upw[MINBUFSIZE], *auth;
|
|
||||||
int len, r;
|
|
||||||
|
|
||||||
len = snprintf(&upw[0], MINBUFSIZE, "%s:%s", usr, pwd);
|
|
||||||
if (len >= MINBUFSIZE)
|
|
||||||
return -1;
|
|
||||||
auth = http_base64(&upw[0]);
|
|
||||||
if (auth == NULL)
|
|
||||||
return (-1);
|
|
||||||
r = http_cmd(conn, "%s: Basic %s\r\n", hdr, auth);
|
|
||||||
free(auth);
|
|
||||||
return (r);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Send an authorization header
|
* Send an authorization header
|
||||||
*/
|
*/
|
||||||
|
@ -996,13 +944,8 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
|
||||||
http_cmd(conn, "User-Agent: %s\r\n", p);
|
http_cmd(conn, "User-Agent: %s\r\n", p);
|
||||||
else
|
else
|
||||||
http_cmd(conn, "User-Agent: %s\r\n", _LIBFETCH_VER);
|
http_cmd(conn, "User-Agent: %s\r\n", _LIBFETCH_VER);
|
||||||
#ifndef __minix
|
|
||||||
if (url->offset > 0)
|
if (url->offset > 0)
|
||||||
http_cmd(conn, "Range: bytes=%lld-\r\n", (long long)url->offset);
|
http_cmd(conn, "Range: bytes=%lld-\r\n", (long long)url->offset);
|
||||||
#else
|
|
||||||
if (url->offset > 0)
|
|
||||||
http_cmd(conn, "Range: bytes=%ld-\r\n", (long)url->offset);
|
|
||||||
#endif
|
|
||||||
http_cmd(conn, "\r\n");
|
http_cmd(conn, "\r\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1019,7 +962,7 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
|
||||||
#endif
|
#endif
|
||||||
val = 1;
|
val = 1;
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
|
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
|
||||||
sizeof(val));
|
(socklen_t)sizeof(val));
|
||||||
|
|
||||||
/* get reply */
|
/* get reply */
|
||||||
switch (http_get_reply(conn)) {
|
switch (http_get_reply(conn)) {
|
||||||
|
@ -1295,7 +1238,8 @@ fetchGetHTTP(struct url *URL, const char *flags)
|
||||||
* Store a file by HTTP
|
* Store a file by HTTP
|
||||||
*/
|
*/
|
||||||
fetchIO *
|
fetchIO *
|
||||||
fetchPutHTTP(struct url *URL, const char *flags)
|
/*ARGSUSED*/
|
||||||
|
fetchPutHTTP(struct url *URL __unused, const char *flags __unused)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "fetchPutHTTP(): not implemented\n");
|
fprintf(stderr, "fetchPutHTTP(): not implemented\n");
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
@ -1487,7 +1431,8 @@ static struct http_index_cache *index_cache;
|
||||||
* List a directory
|
* List a directory
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fetchListHTTP(struct url_list *ue, struct url *url, const char *pattern, const char *flags)
|
/*ARGSUSED*/
|
||||||
|
fetchListHTTP(struct url_list *ue, struct url *url, const char *pattern __unused, const char *flags)
|
||||||
{
|
{
|
||||||
fetchIO *f;
|
fetchIO *f;
|
||||||
char buf[2 * PATH_MAX];
|
char buf[2 * PATH_MAX];
|
|
@ -1,5 +1,5 @@
|
||||||
# $FreeBSD: http.errors,v 1.5 2001/05/23 18:52:02 des Exp $
|
# $FreeBSD: http.errors,v 1.5 2001/05/23 18:52:02 des Exp $
|
||||||
# $NetBSD: http.errors,v 1.3 2009/02/05 16:59:45 joerg Exp $
|
# $NetBSD: http.errors,v 1.1.1.5 2009/04/04 23:26:06 joerg Exp $
|
||||||
#
|
#
|
||||||
# This list is taken from RFC 2068.
|
# This list is taken from RFC 2068.
|
||||||
#
|
#
|
39
external/bsd/fetch/lib/Makefile
vendored
Normal file
39
external/bsd/fetch/lib/Makefile
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# $NetBSD: Makefile,v 1.8 2011/08/17 09:20:14 christos Exp $
|
||||||
|
|
||||||
|
LIB= fetch
|
||||||
|
SRCS= fetch.c common.c ftp.c http.c file.c
|
||||||
|
DPSRCS= ftperr.h httperr.h
|
||||||
|
INCS= fetch.h
|
||||||
|
INCSDIR= /usr/include
|
||||||
|
MAN= fetch.3
|
||||||
|
CLEANFILES= ftperr.h httperr.h
|
||||||
|
|
||||||
|
.include <bsd.init.mk>
|
||||||
|
|
||||||
|
CPPFLAGS+= -I.
|
||||||
|
CPPFLAGS+= -DNETBSD
|
||||||
|
CPPFLAGS+= -DFTP_COMBINE_CWDS
|
||||||
|
CPPFLAGS+= -DINET6
|
||||||
|
|
||||||
|
.if (${MKCRYPTO} != "no")
|
||||||
|
CPPFLAGS+= -DWITH_SSL
|
||||||
|
|
||||||
|
LDADD= -lssl -lcrypto
|
||||||
|
|
||||||
|
LIBDPLIBS+= ssl ${NETBSDSRCDIR}/crypto/external/bsd/openssl/lib/libssl \
|
||||||
|
crypto ${NETBSDSRCDIR}/crypto/external/bsd/openssl/lib/libcrypto
|
||||||
|
.endif
|
||||||
|
|
||||||
|
CLEANFILES+= ftperr.h httperr.h
|
||||||
|
|
||||||
|
.PATH: ${LIBFETCHDIR}
|
||||||
|
|
||||||
|
ftperr.h: ${LIBFETCHDIR}/ftp.errors ${LIBFETCHDIR}/errlist.sh
|
||||||
|
${HOST_SH} ${LIBFETCHDIR}/errlist.sh ftp_errlist FTP \
|
||||||
|
${LIBFETCHDIR}/ftp.errors > ${.TARGET}
|
||||||
|
|
||||||
|
httperr.h: ${LIBFETCHDIR}/http.errors ${LIBFETCHDIR}/errlist.sh
|
||||||
|
${HOST_SH} ${LIBFETCHDIR}/errlist.sh http_errlist HTTP \
|
||||||
|
${LIBFETCHDIR}/http.errors > ${.TARGET}
|
||||||
|
|
||||||
|
.include <bsd.lib.mk>
|
6
external/bsd/fetch/lib/shlib_version
vendored
Normal file
6
external/bsd/fetch/lib/shlib_version
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# $NetBSD: shlib_version,v 1.3 2009/07/20 17:30:53 christos Exp $
|
||||||
|
# Remember to update distrib/sets/lists/base/shl.* when changing
|
||||||
|
#
|
||||||
|
|
||||||
|
major=3
|
||||||
|
minor=0
|
|
@ -40,7 +40,6 @@ SUBDIR+= ../minix/lib/libasyn \
|
||||||
../minix/lib/libddekit \
|
../minix/lib/libddekit \
|
||||||
../minix/lib/libdevman \
|
../minix/lib/libdevman \
|
||||||
../minix/lib/libexec \
|
../minix/lib/libexec \
|
||||||
../minix/lib/libfetch \
|
|
||||||
../minix/lib/libfsdriver \
|
../minix/lib/libfsdriver \
|
||||||
../minix/lib/libinputdriver \
|
../minix/lib/libinputdriver \
|
||||||
../minix/lib/libminc \
|
../minix/lib/libminc \
|
||||||
|
@ -248,7 +247,7 @@ SUBDIR+= ../crypto/external/bsd/netpgp/lib # depends on libcrypto, ...
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
SUBDIR+= ../external/bsd/libevent/lib # depends on libcrypto
|
SUBDIR+= ../external/bsd/libevent/lib # depends on libcrypto
|
||||||
#SUBDIR+= ../external/bsd/fetch/lib # depends on libssl
|
SUBDIR+= ../external/bsd/fetch/lib # depends on libssl
|
||||||
|
|
||||||
.if (${MKLDAP} != "no")
|
.if (${MKLDAP} != "no")
|
||||||
SUBDIR+= ../external/bsd/openldap/lib # depends on libcrypto, ...
|
SUBDIR+= ../external/bsd/openldap/lib # depends on libcrypto, ...
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
NOOBJ= # defined
|
NOOBJ= # defined
|
||||||
|
|
||||||
INCS+= env.h fetch.h lib.h libutil.h varargs.h configfile.h
|
INCS+= env.h lib.h libutil.h varargs.h configfile.h
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@ SUBDIR+= libchardriver
|
||||||
SUBDIR+= libddekit
|
SUBDIR+= libddekit
|
||||||
SUBDIR+= libdevman
|
SUBDIR+= libdevman
|
||||||
SUBDIR+= libexec
|
SUBDIR+= libexec
|
||||||
SUBDIR+= libfetch
|
|
||||||
SUBDIR+= libfsdriver
|
SUBDIR+= libfsdriver
|
||||||
SUBDIR+= libinputdriver
|
SUBDIR+= libinputdriver
|
||||||
SUBDIR+= libminc
|
SUBDIR+= libminc
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
# $NetBSD: Makefile,v 1.5 2010/02/24 22:00:51 joerg Exp $
|
|
||||||
|
|
||||||
LIB= fetch
|
|
||||||
SRCS= fetch.c common.c ftp.c http.c file.c
|
|
||||||
#DPSRCS= ftperr.h httperr.h
|
|
||||||
# CLEANFILES= ftperr.h httperr.h
|
|
||||||
MKLINT= no
|
|
||||||
MKPIC= no
|
|
||||||
MKPROFILE= no
|
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
|
||||||
|
|
||||||
CPPFLAGS+= -I.
|
|
||||||
CPPFLAGS+= -D_LARGEFILE_SOURCE -D_LARGE_FILES
|
|
||||||
|
|
||||||
FETCH_WITH_INET6?= no
|
|
||||||
FETCH_WITH_OPENSSL?= no
|
|
||||||
|
|
||||||
.if !empty(FETCH_WITH_INET6:M[yY][eE][sS])
|
|
||||||
CPPFLAGS+= -DINET6
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.if !empty(FETCH_WITH_OPENSSL:M[yY][eE][sS])
|
|
||||||
CPPFLAGS+= -DWITH_SSL
|
|
||||||
LDADD= -lssl -lcrypto
|
|
||||||
.endif
|
|
||||||
|
|
||||||
CPPFLAGS+= -DFTP_COMBINE_CWDS
|
|
||||||
|
|
||||||
# WARNS?= 4
|
|
||||||
|
|
||||||
#ftperr.h: ${.CURDIR}/ftp.errors ${.CURDIR}/Makefile ${.CURDIR}/errlist.sh
|
|
||||||
# ${.CURDIR}/errlist.sh ftp_errlist FTP \
|
|
||||||
# ${.CURDIR}/ftp.errors > ${.TARGET}
|
|
||||||
#
|
|
||||||
#httperr.h: ${.CURDIR}/http.errors ${.CURDIR}/Makefile ${.CURDIR}/errlist.sh
|
|
||||||
# ${.CURDIR}/errlist.sh http_errlist HTTP \
|
|
||||||
# ${.CURDIR}/http.errors > ${.TARGET}
|
|
||||||
|
|
||||||
.include <bsd.lib.mk>
|
|
|
@ -1,526 +0,0 @@
|
||||||
FETCH(3) NetBSD Library Functions Manual FETCH(3)
|
|
||||||
|
|
||||||
NNAAMMEE
|
|
||||||
ffeettcchhMMaakkeeUURRLL, ffeettcchhPPaarrsseeUURRLL, ffeettcchhCCooppyyUURRLL, ffeettcchhFFrreeeeUURRLL, ffeettcchhXXGGeettUURRLL,
|
|
||||||
ffeettcchhGGeettUURRLL, ffeettcchhPPuuttUURRLL, ffeettcchhSSttaattUURRLL, ffeettcchhLLiissttUURRLL, ffeettcchhXXGGeett,
|
|
||||||
ffeettcchhGGeett, ffeettcchhPPuutt, ffeettcchhSSttaatt, ffeettcchhLLiisstt, ffeettcchhXXGGeettFFiillee, ffeettcchhGGeettFFiillee,
|
|
||||||
ffeettcchhPPuuttFFiillee, ffeettcchhSSttaattFFiillee, ffeettcchhLLiissttFFiillee, ffeettcchhXXGGeettHHTTTTPP, ffeettcchhGGeettHHTTTTPP,
|
|
||||||
ffeettcchhPPuuttHHTTTTPP, ffeettcchhSSttaattHHTTTTPP, ffeettcchhLLiissttHHTTTTPP, ffeettcchhXXGGeettFFTTPP, ffeettcchhGGeettFFTTPP,
|
|
||||||
ffeettcchhPPuuttFFTTPP, ffeettcchhSSttaattFFTTPP, ffeettcchhLLiissttFFTTPP ffeettcchhIInniittUURRLLLLiisstt,
|
|
||||||
ffeettcchhFFrreeeeUURRLLLLiisstt, ffeettcchhUUnnqquuootteePPaatthh, ffeettcchhUUnnqquuootteeFFiilleennaammee,
|
|
||||||
ffeettcchhSSttrriinnggiiffyyUURRLL, ffeettcchhCCoonnnneeccttiioonnCCaacchheeIInniitt, ffeettcchhCCoonnnneeccttiioonnCCaacchheeCClloossee,
|
|
||||||
ffeettcchh -- file transfer functions
|
|
||||||
|
|
||||||
LLIIBBRRAARRYY
|
|
||||||
File Transfer Library for URLs (libfetch, -lfetch)
|
|
||||||
|
|
||||||
SSYYNNOOPPSSIISS
|
|
||||||
##iinncclluuddee <<ssttddiioo..hh>>
|
|
||||||
##iinncclluuddee <<ffeettcchh..hh>>
|
|
||||||
|
|
||||||
_s_t_r_u_c_t _u_r_l _*
|
|
||||||
ffeettcchhMMaakkeeUURRLL(_c_o_n_s_t _c_h_a_r _*_s_c_h_e_m_e, _c_o_n_s_t _c_h_a_r _*_h_o_s_t, _i_n_t _p_o_r_t,
|
|
||||||
_c_o_n_s_t _c_h_a_r _*_d_o_c, _c_o_n_s_t _c_h_a_r _*_u_s_e_r, _c_o_n_s_t _c_h_a_r _*_p_w_d);
|
|
||||||
|
|
||||||
_s_t_r_u_c_t _u_r_l _*
|
|
||||||
ffeettcchhPPaarrsseeUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L);
|
|
||||||
|
|
||||||
_s_t_r_u_c_t _u_r_l _*
|
|
||||||
ffeettcchhCCooppyyUURRLL(_c_o_n_s_t _s_t_r_u_c_t _u_r_l _*_u);
|
|
||||||
|
|
||||||
_v_o_i_d
|
|
||||||
ffeettcchhFFrreeeeUURRLL(_s_t_r_u_c_t _u_r_l _*_u);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhXXGGeettUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhGGeettUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhPPuuttUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhSSttaattUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhLLiissttUURRLL(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhXXGGeett(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhGGeett(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhPPuutt(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhSSttaatt(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhLLiisstt(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhXXGGeettFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhGGeettFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhPPuuttFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhSSttaattFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhLLiissttFFiillee(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhXXGGeettHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhGGeettHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhPPuuttHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhSSttaattHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhLLiissttHHTTTTPP(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhXXGGeettFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhGGeettFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_f_e_t_c_h_I_O _*
|
|
||||||
ffeettcchhPPuuttFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhSSttaattFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhLLiissttFFTTPP(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s);
|
|
||||||
|
|
||||||
_v_o_i_d
|
|
||||||
ffeettcchhIInniittUURRLLLLiisstt(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_u_l);
|
|
||||||
|
|
||||||
_i_n_t
|
|
||||||
ffeettcchhAAppppeennddUURRLLLLiisstt(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_d_s_t, _c_o_n_s_t _s_t_r_u_c_t _u_r_l___l_i_s_t _*_s_r_c);
|
|
||||||
|
|
||||||
_v_o_i_d
|
|
||||||
ffeettcchhFFrreeeeUURRLLLLiisstt(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_u_l);
|
|
||||||
|
|
||||||
_c_h_a_r _*
|
|
||||||
ffeettcchhUUnnqquuootteePPaatthh(_s_t_r_u_c_t _u_r_l _*_u);
|
|
||||||
|
|
||||||
_c_h_a_r _*
|
|
||||||
ffeettcchhUUnnqquuootteeFFiilleennaammee(_s_t_r_u_c_t _u_r_l _*_u);
|
|
||||||
|
|
||||||
_c_h_a_r _*
|
|
||||||
ffeettcchhSSttrriinnggiiffyyUURRLL(_c_o_n_s_t _s_t_r_u_c_t _u_r_l _*_u);
|
|
||||||
|
|
||||||
_v_o_i_d
|
|
||||||
ffeettcchhCCoonnnneeccttiioonnCCaacchheeIInniitt(_i_n_t _g_l_o_b_a_l, _i_n_t _p_e_r___h_o_s_t);
|
|
||||||
|
|
||||||
_v_o_i_d
|
|
||||||
ffeettcchhCCoonnnneeccttiioonnCCaacchheeCClloossee(_v_o_i_d);
|
|
||||||
|
|
||||||
DDEESSCCRRIIPPTTIIOONN
|
|
||||||
These functions implement a high-level library for retrieving and upload-
|
|
||||||
ing files using Uniform Resource Locators (URLs).
|
|
||||||
|
|
||||||
ffeettcchhPPaarrsseeUURRLL() takes a URL in the form of a null-terminated string and
|
|
||||||
splits it into its components function according to the Common Internet
|
|
||||||
Scheme Syntax detailed in RFC 1738. A regular expression which produces
|
|
||||||
this syntax is:
|
|
||||||
|
|
||||||
<scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)?/(<document>)?
|
|
||||||
|
|
||||||
If the URL does not seem to begin with a scheme name, it is assumed to be
|
|
||||||
a local path. Only absolute path names are accepted.
|
|
||||||
|
|
||||||
Note that some components of the URL are not necessarily relevant to all
|
|
||||||
URL schemes. For instance, the file scheme only needs the <scheme> and
|
|
||||||
<document> components. ffeettcchhPPaarrsseeUURRLL() quotes any unsafe character in
|
|
||||||
the URL automatically. This is not done by ffeettcchhMMaakkeeUURRLL().
|
|
||||||
ffeettcchhCCooppyyUURRLL() copies an existing _u_r_l structure.
|
|
||||||
|
|
||||||
ffeettcchhMMaakkeeUURRLL(), ffeettcchhPPaarrsseeUURRLL(), and ffeettcchhCCooppyyUURRLL() return a pointer to a
|
|
||||||
_u_r_l structure, which is defined as follows in <_f_e_t_c_h_._h>:
|
|
||||||
|
|
||||||
#define URL_SCHEMELEN 16
|
|
||||||
#define URL_USERLEN 256
|
|
||||||
#define URL_PWDLEN 256
|
|
||||||
#define URL_HOSTLEN 255
|
|
||||||
|
|
||||||
struct url {
|
|
||||||
char scheme[URL_SCHEMELEN + 1];
|
|
||||||
char user[URL_USERLEN + 1];
|
|
||||||
char pwd[URL_PWDLEN + 1];
|
|
||||||
char host[URL_HOSTLEN + 1];
|
|
||||||
int port;
|
|
||||||
char *doc;
|
|
||||||
off_t offset;
|
|
||||||
size_t length;
|
|
||||||
time_t last_modified;
|
|
||||||
};
|
|
||||||
|
|
||||||
The pointer returned by ffeettcchhMMaakkeeUURRLL(), ffeettcchhCCooppyyUURRLL(), and
|
|
||||||
ffeettcchhPPaarrsseeUURRLL() should be freed using ffeettcchhFFrreeeeUURRLL(). The size of _s_t_r_u_c_t
|
|
||||||
_U_R_L is not part of the ABI.
|
|
||||||
|
|
||||||
ffeettcchhXXGGeettUURRLL(), ffeettcchhGGeettUURRLL(), and ffeettcchhPPuuttUURRLL() constitute the recom-
|
|
||||||
mended interface to the ffeettcchh library. They examine the URL passed to
|
|
||||||
them to determine the transfer method, and call the appropriate lower-
|
|
||||||
level functions to perform the actual transfer. ffeettcchhXXGGeettUURRLL() also
|
|
||||||
returns the remote document's metadata in the _u_r_l___s_t_a_t structure pointed
|
|
||||||
to by the _u_s argument.
|
|
||||||
|
|
||||||
The _f_l_a_g_s argument is a string of characters which specify transfer
|
|
||||||
options. The meaning of the individual flags is scheme-dependent, and is
|
|
||||||
detailed in the appropriate section below.
|
|
||||||
|
|
||||||
ffeettcchhSSttaattUURRLL() attempts to obtain the requested document's metadata and
|
|
||||||
fill in the structure pointed to by its second argument. The _u_r_l___s_t_a_t
|
|
||||||
structure is defined as follows in <_f_e_t_c_h_._h>:
|
|
||||||
|
|
||||||
struct url_stat {
|
|
||||||
off_t size;
|
|
||||||
time_t atime;
|
|
||||||
time_t mtime;
|
|
||||||
};
|
|
||||||
|
|
||||||
If the size could not be obtained from the server, the _s_i_z_e field is set
|
|
||||||
to -1. If the modification time could not be obtained from the server,
|
|
||||||
the _m_t_i_m_e field is set to the epoch. If the access time could not be
|
|
||||||
obtained from the server, the _a_t_i_m_e field is set to the modification
|
|
||||||
time.
|
|
||||||
|
|
||||||
ffeettcchhLLiissttUURRLL() attempts to list the contents of the directory pointed to
|
|
||||||
by the URL provided. The pattern can be a simple glob-like expression as
|
|
||||||
hint. Callers should not depend on the server to filter names. If suc-
|
|
||||||
cessful, it appends the list of entries to the _u_r_l___l_i_s_t structure. The
|
|
||||||
_u_r_l___l_i_s_t structure is defined as follows in <_f_e_t_c_h_._h>:
|
|
||||||
|
|
||||||
struct url_list {
|
|
||||||
size_t length;
|
|
||||||
size_t alloc_size;
|
|
||||||
struct url *urls;
|
|
||||||
};
|
|
||||||
|
|
||||||
The list should be initialized by calling ffeettcchhIInniittUURRLLLLiisstt() and the
|
|
||||||
entries be freed by calling ffeettcchhFFrreeeeUURRLLLLiisstt(). The function
|
|
||||||
ffeettcchhAAppppeennddUURRLLLLiisstt() can be used to append one URL lists to another. If
|
|
||||||
the `c' (cache result) flag is specified, the library is allowed to
|
|
||||||
internally cache the result.
|
|
||||||
|
|
||||||
ffeettcchhSSttrriinnggiiffyyUURRLL() returns the URL as string. ffeettcchhUUnnqquuootteePPaatthh()
|
|
||||||
returns the path name part of the URL with any quoting undone. Query
|
|
||||||
arguments and fragment identifiers are not included.
|
|
||||||
ffeettcchhUUnnqquuootteeFFiilleennaammee() returns the last component of the path name as
|
|
||||||
returned by ffeettcchhUUnnqquuootteePPaatthh(). ffeettcchhSSttrriinnggiiffyyUURRLL(), ffeettcchhUUnnqquuootteePPaatthh(),
|
|
||||||
and ffeettcchhUUnnqquuootteeFFiilleennaammee() return a string that should be deallocated
|
|
||||||
with ffrreeee() after use.
|
|
||||||
|
|
||||||
ffeettcchhCCoonnnneeccttiioonnCCaacchheeIInniitt() enables the connection cache. The first argu-
|
|
||||||
ment specifies the global limit on cached connections. The second argu-
|
|
||||||
ment specifies the host limit. Entries are considered to specify the
|
|
||||||
same host, if the host name from the URL is identical, indepent of the
|
|
||||||
address or address family. ffeettcchhCCoonnnneeccttiioonnCCaacchheeCClloossee() flushed the con-
|
|
||||||
nection cache and closes all cached connections.
|
|
||||||
|
|
||||||
ffeettcchhXXGGeett(), ffeettcchhGGeett(), ffeettcchhPPuutt(), and ffeettcchhSSttaatt() are similar to
|
|
||||||
ffeettcchhXXGGeettUURRLL(), ffeettcchhGGeettUURRLL(), ffeettcchhPPuuttUURRLL(), and ffeettcchhSSttaattUURRLL(), except
|
|
||||||
that they expect a pre-parsed URL in the form of a pointer to a _s_t_r_u_c_t
|
|
||||||
_u_r_l rather than a string.
|
|
||||||
|
|
||||||
All of the ffeettcchhXXGGeettXXXXXX(), ffeettcchhGGeettXXXXXX(), and ffeettcchhPPuuttXXXXXX() functions
|
|
||||||
return a pointer to a stream which can be used to read or write data from
|
|
||||||
or to the requested document, respectively. Note that although the
|
|
||||||
implementation details of the individual access methods vary, it can gen-
|
|
||||||
erally be assumed that a stream returned by one of the ffeettcchhXXGGeettXXXXXX() or
|
|
||||||
ffeettcchhGGeettXXXXXX() functions is read-only, and that a stream returned by one
|
|
||||||
of the ffeettcchhPPuuttXXXXXX() functions is write-only.
|
|
||||||
|
|
||||||
PPRROOTTOOCCOOLL IINNDDEEPPEENNDDEENNTT FFLLAAGGSS
|
|
||||||
If the `i' (if-modified-since) flag is specified, the library will try to
|
|
||||||
fetch the content only if it is newer than _l_a_s_t___m_o_d_i_f_i_e_d. For HTTP an
|
|
||||||
If-Modified-Since HTTP header is sent. For FTP a MTDM command is sent
|
|
||||||
first and compared locally. For FILE the source file is compared.
|
|
||||||
|
|
||||||
FFIILLEE SSCCHHEEMMEE
|
|
||||||
ffeettcchhXXGGeettFFiillee(), ffeettcchhGGeettFFiillee(), and ffeettcchhPPuuttFFiillee() provide access to
|
|
||||||
documents which are files in a locally mounted file system. Only the
|
|
||||||
<document> component of the URL is used.
|
|
||||||
|
|
||||||
ffeettcchhXXGGeettFFiillee() and ffeettcchhGGeettFFiillee() do not accept any flags.
|
|
||||||
|
|
||||||
ffeettcchhPPuuttFFiillee() accepts the `a' (append to file) flag. If that flag is
|
|
||||||
specified, the data written to the stream returned by ffeettcchhPPuuttFFiillee() will
|
|
||||||
be appended to the previous contents of the file, instead of replacing
|
|
||||||
them.
|
|
||||||
|
|
||||||
FFTTPP SSCCHHEEMMEE
|
|
||||||
ffeettcchhXXGGeettFFTTPP(), ffeettcchhGGeettFFTTPP(), and ffeettcchhPPuuttFFTTPP() implement the FTP proto-
|
|
||||||
col as described in RFC 959.
|
|
||||||
|
|
||||||
By default lliibbffeettcchh will attempt to use passive mode first and only fall-
|
|
||||||
back to active mode if the server reports a syntax error. If the `a'
|
|
||||||
(active) flag is specified, a passive connection is not tried and active
|
|
||||||
mode is used directly.
|
|
||||||
|
|
||||||
If the `l' (low) flag is specified, data sockets will be allocated in the
|
|
||||||
low (or default) port range instead of the high port range (see ip(4)).
|
|
||||||
|
|
||||||
If the `d' (direct) flag is specified, ffeettcchhXXGGeettFFTTPP(), ffeettcchhGGeettFFTTPP(), and
|
|
||||||
ffeettcchhPPuuttFFTTPP() will use a direct connection even if a proxy server is
|
|
||||||
defined.
|
|
||||||
|
|
||||||
If no user name or password is given, the ffeettcchh library will attempt an
|
|
||||||
anonymous login, with user name "anonymous" and password "anony-
|
|
||||||
mous@<hostname>".
|
|
||||||
|
|
||||||
HHTTTTPP SSCCHHEEMMEE
|
|
||||||
The ffeettcchhXXGGeettHHTTTTPP(), ffeettcchhGGeettHHTTTTPP(), and ffeettcchhPPuuttHHTTTTPP() functions imple-
|
|
||||||
ment the HTTP/1.1 protocol. With a little luck, there is even a chance
|
|
||||||
that they comply with RFC 2616 and RFC 2617.
|
|
||||||
|
|
||||||
If the `d' (direct) flag is specified, ffeettcchhXXGGeettHHTTTTPP(), ffeettcchhGGeettHHTTTTPP(),
|
|
||||||
and ffeettcchhPPuuttHHTTTTPP() will use a direct connection even if a proxy server is
|
|
||||||
defined.
|
|
||||||
|
|
||||||
Since there seems to be no good way of implementing the HTTP PUT method
|
|
||||||
in a manner consistent with the rest of the ffeettcchh library, ffeettcchhPPuuttHHTTTTPP()
|
|
||||||
is currently unimplemented.
|
|
||||||
|
|
||||||
AAUUTTHHEENNTTIICCAATTIIOONN
|
|
||||||
Apart from setting the appropriate environment variables and specifying
|
|
||||||
the user name and password in the URL or the _s_t_r_u_c_t _u_r_l, the calling pro-
|
|
||||||
gram has the option of defining an authentication function with the fol-
|
|
||||||
lowing prototype:
|
|
||||||
|
|
||||||
_i_n_t mmyyAAuutthhMMeetthhoodd(_s_t_r_u_c_t _u_r_l _*_u)
|
|
||||||
|
|
||||||
The callback function should fill in the _u_s_e_r and _p_w_d fields in the pro-
|
|
||||||
vided _s_t_r_u_c_t _u_r_l and return 0 on success, or any other value to indicate
|
|
||||||
failure.
|
|
||||||
|
|
||||||
To register the authentication callback, simply set _f_e_t_c_h_A_u_t_h_M_e_t_h_o_d to
|
|
||||||
point at it. The callback will be used whenever a site requires authen-
|
|
||||||
tication and the appropriate environment variables are not set.
|
|
||||||
|
|
||||||
This interface is experimental and may be subject to change.
|
|
||||||
|
|
||||||
RREETTUURRNN VVAALLUUEESS
|
|
||||||
ffeettcchhPPaarrsseeUURRLL() returns a pointer to a _s_t_r_u_c_t _u_r_l containing the individ-
|
|
||||||
ual components of the URL. If it is unable to allocate memory, or the
|
|
||||||
URL is syntactically incorrect, ffeettcchhPPaarrsseeUURRLL() returns a NULL pointer.
|
|
||||||
|
|
||||||
The ffeettcchhSSttaatt() functions return 0 on success and -1 on failure.
|
|
||||||
|
|
||||||
All other functions return a stream pointer which may be used to access
|
|
||||||
the requested document, or NULL if an error occurred.
|
|
||||||
|
|
||||||
The following error codes are defined in <_f_e_t_c_h_._h>:
|
|
||||||
|
|
||||||
[FETCH_ABORT] Operation aborted
|
|
||||||
|
|
||||||
[FETCH_AUTH] Authentication failed
|
|
||||||
|
|
||||||
[FETCH_DOWN] Service unavailable
|
|
||||||
|
|
||||||
[FETCH_EXISTS] File exists
|
|
||||||
|
|
||||||
[FETCH_FULL] File system full
|
|
||||||
|
|
||||||
[FETCH_INFO] Informational response
|
|
||||||
|
|
||||||
[FETCH_MEMORY] Insufficient memory
|
|
||||||
|
|
||||||
[FETCH_MOVED] File has moved
|
|
||||||
|
|
||||||
[FETCH_NETWORK] Network error
|
|
||||||
|
|
||||||
[FETCH_OK] No error
|
|
||||||
|
|
||||||
[FETCH_PROTO] Protocol error
|
|
||||||
|
|
||||||
[FETCH_RESOLV] Resolver error
|
|
||||||
|
|
||||||
[FETCH_SERVER] Server error
|
|
||||||
|
|
||||||
[FETCH_TEMP] Temporary error
|
|
||||||
|
|
||||||
[FETCH_TIMEOUT] Operation timed out
|
|
||||||
|
|
||||||
[FETCH_UNAVAIL] File is not available
|
|
||||||
|
|
||||||
[FETCH_UNKNOWN] Unknown error
|
|
||||||
|
|
||||||
[FETCH_URL] Invalid URL
|
|
||||||
|
|
||||||
The accompanying error message includes a protocol-specific error code
|
|
||||||
and message, e.g. "File is not available (404 Not Found)"
|
|
||||||
|
|
||||||
EENNVVIIRROONNMMEENNTT
|
|
||||||
FETCH_BIND_ADDRESS Specifies a host name or IP address to which sockets
|
|
||||||
used for outgoing connections will be bound.
|
|
||||||
|
|
||||||
FTP_LOGIN Default FTP login if none was provided in the URL.
|
|
||||||
|
|
||||||
FTP_PASSIVE_MODE If set to anything but `no', forces the FTP code to
|
|
||||||
use passive mode.
|
|
||||||
|
|
||||||
FTP_PASSWORD Default FTP password if the remote server requests
|
|
||||||
one and none was provided in the URL.
|
|
||||||
|
|
||||||
FTP_PROXY URL of the proxy to use for FTP requests. The docu-
|
|
||||||
ment part is ignored. FTP and HTTP proxies are sup-
|
|
||||||
ported; if no scheme is specified, FTP is assumed.
|
|
||||||
If the proxy is an FTP proxy, lliibbffeettcchh will send
|
|
||||||
`user@host' as user name to the proxy, where `user'
|
|
||||||
is the real user name, and `host' is the name of the
|
|
||||||
FTP server.
|
|
||||||
|
|
||||||
If this variable is set to an empty string, no proxy
|
|
||||||
will be used for FTP requests, even if the HTTP_PROXY
|
|
||||||
variable is set.
|
|
||||||
|
|
||||||
ftp_proxy Same as FTP_PROXY, for compatibility.
|
|
||||||
|
|
||||||
HTTP_AUTH Specifies HTTP authorization parameters as a colon-
|
|
||||||
separated list of items. The first and second item
|
|
||||||
are the authorization scheme and realm respectively;
|
|
||||||
further items are scheme-dependent. Currently, only
|
|
||||||
basic authorization is supported.
|
|
||||||
|
|
||||||
Basic authorization requires two parameters: the user
|
|
||||||
name and password, in that order.
|
|
||||||
|
|
||||||
This variable is only used if the server requires
|
|
||||||
authorization and no user name or password was speci-
|
|
||||||
fied in the URL.
|
|
||||||
|
|
||||||
HTTP_PROXY URL of the proxy to use for HTTP requests. The docu-
|
|
||||||
ment part is ignored. Only HTTP proxies are sup-
|
|
||||||
ported for HTTP requests. If no port number is spec-
|
|
||||||
ified, the default is 3128.
|
|
||||||
|
|
||||||
Note that this proxy will also be used for FTP docu-
|
|
||||||
ments, unless the FTP_PROXY variable is set.
|
|
||||||
|
|
||||||
http_proxy Same as HTTP_PROXY, for compatibility.
|
|
||||||
|
|
||||||
HTTP_PROXY_AUTH Specifies authorization parameters for the HTTP proxy
|
|
||||||
in the same format as the HTTP_AUTH variable.
|
|
||||||
|
|
||||||
This variable is used if and only if connected to an
|
|
||||||
HTTP proxy, and is ignored if a user and/or a pass-
|
|
||||||
word were specified in the proxy URL.
|
|
||||||
|
|
||||||
HTTP_REFERER Specifies the referrer URL to use for HTTP requests.
|
|
||||||
If set to ``auto'', the document URL will be used as
|
|
||||||
referrer URL.
|
|
||||||
|
|
||||||
HTTP_USER_AGENT Specifies the User-Agent string to use for HTTP
|
|
||||||
requests. This can be useful when working with HTTP
|
|
||||||
origin or proxy servers that differentiate between
|
|
||||||
user agents.
|
|
||||||
|
|
||||||
NETRC Specifies a file to use instead of _~_/_._n_e_t_r_c to look
|
|
||||||
up login names and passwords for FTP sites. See
|
|
||||||
ftp(1) for a description of the file format. This
|
|
||||||
feature is experimental.
|
|
||||||
|
|
||||||
NO_PROXY Either a single asterisk, which disables the use of
|
|
||||||
proxies altogether, or a comma- or whitespace-sepa-
|
|
||||||
rated list of hosts for which proxies should not be
|
|
||||||
used.
|
|
||||||
|
|
||||||
no_proxy Same as NO_PROXY, for compatibility.
|
|
||||||
|
|
||||||
EEXXAAMMPPLLEESS
|
|
||||||
To access a proxy server on _p_r_o_x_y_._e_x_a_m_p_l_e_._c_o_m port 8080, set the
|
|
||||||
HTTP_PROXY environment variable in a manner similar to this:
|
|
||||||
|
|
||||||
HTTP_PROXY=http://proxy.example.com:8080
|
|
||||||
|
|
||||||
If the proxy server requires authentication, there are two options avail-
|
|
||||||
able for passing the authentication data. The first method is by using
|
|
||||||
the proxy URL:
|
|
||||||
|
|
||||||
HTTP_PROXY=http://<user>:<pwd>@proxy.example.com:8080
|
|
||||||
|
|
||||||
The second method is by using the HTTP_PROXY_AUTH environment variable:
|
|
||||||
|
|
||||||
HTTP_PROXY=http://proxy.example.com:8080
|
|
||||||
HTTP_PROXY_AUTH=basic:*:<user>:<pwd>
|
|
||||||
|
|
||||||
To disable the use of a proxy for an HTTP server running on the local
|
|
||||||
host, define NO_PROXY as follows:
|
|
||||||
|
|
||||||
NO_PROXY=localhost,127.0.0.1
|
|
||||||
|
|
||||||
SSEEEE AALLSSOO
|
|
||||||
ftp(1), ip(4)
|
|
||||||
|
|
||||||
J. Postel and J. K. Reynolds, _F_i_l_e _T_r_a_n_s_f_e_r _P_r_o_t_o_c_o_l, October 1985, RFC
|
|
||||||
959.
|
|
||||||
|
|
||||||
P. Deutsch, A. Emtage, and A. Marine, _H_o_w _t_o _U_s_e _A_n_o_n_y_m_o_u_s _F_T_P, May 1994,
|
|
||||||
RFC 1635.
|
|
||||||
|
|
||||||
T. Berners-Lee, L. Masinter, and M. McCahill, _U_n_i_f_o_r_m _R_e_s_o_u_r_c_e _L_o_c_a_t_o_r_s
|
|
||||||
_(_U_R_L_), December 1994, RFC 1738.
|
|
||||||
|
|
||||||
R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and
|
|
||||||
T. Berners-Lee, _H_y_p_e_r_t_e_x_t _T_r_a_n_s_f_e_r _P_r_o_t_o_c_o_l _-_- _H_T_T_P_/_1_._1, January 1999,
|
|
||||||
RFC 2616.
|
|
||||||
|
|
||||||
J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. Leach, A.
|
|
||||||
Luotonen, and L. Stewart, _H_T_T_P _A_u_t_h_e_n_t_i_c_a_t_i_o_n_: _B_a_s_i_c _a_n_d _D_i_g_e_s_t _A_c_c_e_s_s
|
|
||||||
_A_u_t_h_e_n_t_i_c_a_t_i_o_n, June 1999, RFC 2617.
|
|
||||||
|
|
||||||
HHIISSTTOORRYY
|
|
||||||
The ffeettcchh library first appeared in FreeBSD 3.0.
|
|
||||||
|
|
||||||
AAUUTTHHOORRSS
|
|
||||||
The ffeettcchh library was mostly written by Dag-Erling Smørgrav
|
|
||||||
<des@FreeBSD.org> with numerous suggestions from Jordan K. Hubbard
|
|
||||||
<jkh@FreeBSD.org>, Eugene Skepner <eu@qub.com> and other FreeBSD develop-
|
|
||||||
ers. It replaces the older ffttppiioo library written by Poul-Henning Kamp
|
|
||||||
<phk@FreeBSD.org> and Jordan K. Hubbard <jkh@FreeBSD.org>.
|
|
||||||
|
|
||||||
This manual page was written by Dag-Erling Smørgrav <des@FreeBSD.org>.
|
|
||||||
|
|
||||||
BBUUGGSS
|
|
||||||
Some parts of the library are not yet implemented. The most notable
|
|
||||||
examples of this are ffeettcchhPPuuttHHTTTTPP() and FTP proxy support.
|
|
||||||
|
|
||||||
There is no way to select a proxy at run-time other than setting the
|
|
||||||
HTTP_PROXY or FTP_PROXY environment variables as appropriate.
|
|
||||||
|
|
||||||
lliibbffeettcchh does not understand or obey 305 (Use Proxy) replies.
|
|
||||||
|
|
||||||
Error numbers are unique only within a certain context; the error codes
|
|
||||||
used for FTP and HTTP overlap, as do those used for resolver and 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.
|
|
||||||
|
|
||||||
ffeettcchhSSttaattFFTTPP() does not check that the result of an MDTM command is a
|
|
||||||
valid date.
|
|
||||||
|
|
||||||
The man page is incomplete, poorly written and produces badly formatted
|
|
||||||
text.
|
|
||||||
|
|
||||||
The error reporting mechanism is unsatisfactory.
|
|
||||||
|
|
||||||
Some parts of the code are not fully reentrant.
|
|
||||||
|
|
||||||
NetBSD 5.0 January 22, 2010 NetBSD 5.0
|
|
|
@ -1,45 +0,0 @@
|
||||||
static struct fetcherr ftp_errlist[] = {
|
|
||||||
{ 110, FETCH_OK, "Restart marker reply" },
|
|
||||||
{ 120, FETCH_TEMP, "Service ready in a few minutes" },
|
|
||||||
{ 125, FETCH_OK, "Data connection already open; transfer starting" },
|
|
||||||
{ 150, FETCH_OK, "File status okay; about to open data connection" },
|
|
||||||
{ 200, FETCH_OK, "Command okay" },
|
|
||||||
{ 202, FETCH_PROTO, "Command not implemented, superfluous at this site" },
|
|
||||||
{ 211, FETCH_INFO, "System status, or system help reply" },
|
|
||||||
{ 212, FETCH_INFO, "Directory status" },
|
|
||||||
{ 213, FETCH_INFO, "File status" },
|
|
||||||
{ 214, FETCH_INFO, "Help message" },
|
|
||||||
{ 215, FETCH_INFO, "Set system type" },
|
|
||||||
{ 220, FETCH_OK, "Service ready for new user" },
|
|
||||||
{ 221, FETCH_OK, "Service closing control connection" },
|
|
||||||
{ 225, FETCH_OK, "Data connection open; no transfer in progress" },
|
|
||||||
{ 226, FETCH_OK, "Requested file action successful" },
|
|
||||||
{ 227, FETCH_OK, "Entering Passive Mode" },
|
|
||||||
{ 229, FETCH_OK, "Entering Extended Passive Mode" },
|
|
||||||
{ 230, FETCH_OK, "User logged in, proceed" },
|
|
||||||
{ 250, FETCH_OK, "Requested file action okay, completed" },
|
|
||||||
{ 257, FETCH_OK, "File/directory created" },
|
|
||||||
{ 331, FETCH_AUTH, "User name okay, need password" },
|
|
||||||
{ 332, FETCH_AUTH, "Need account for login" },
|
|
||||||
{ 350, FETCH_OK, "Requested file action pending further information" },
|
|
||||||
{ 421, FETCH_DOWN, "Service not available, closing control connection" },
|
|
||||||
{ 425, FETCH_NETWORK, "Can't open data connection" },
|
|
||||||
{ 426, FETCH_ABORT, "Connection closed; transfer aborted" },
|
|
||||||
{ 450, FETCH_UNAVAIL, "File unavailable (e.g., file busy)" },
|
|
||||||
{ 451, FETCH_SERVER, "Requested action aborted: local error in processing" },
|
|
||||||
{ 452, FETCH_FULL, "Insufficient storage space in system" },
|
|
||||||
{ 500, FETCH_PROTO, "Syntax error, command unrecognized" },
|
|
||||||
{ 501, FETCH_PROTO, "Syntax error in parameters or arguments" },
|
|
||||||
{ 502, FETCH_PROTO, "Command not implemented" },
|
|
||||||
{ 503, FETCH_PROTO, "Bad sequence of commands" },
|
|
||||||
{ 504, FETCH_PROTO, "Command not implemented for that parameter" },
|
|
||||||
{ 530, FETCH_AUTH, "Not logged in" },
|
|
||||||
{ 532, FETCH_AUTH, "Need account for storing files" },
|
|
||||||
{ 535, FETCH_PROTO, "Bug in MediaHawk Video Kernel FTP server" },
|
|
||||||
{ 550, FETCH_UNAVAIL, "File unavailable (e.g., file not found, no access)" },
|
|
||||||
{ 551, FETCH_PROTO, "Requested action aborted. Page type unknown" },
|
|
||||||
{ 552, FETCH_FULL, "Exceeded storage allocation" },
|
|
||||||
{ 553, FETCH_EXISTS, "File name not allowed" },
|
|
||||||
{ 999, FETCH_PROTO, "Protocol error" },
|
|
||||||
{ -1, FETCH_UNKNOWN, "Unknown FTP error" }
|
|
||||||
};
|
|
|
@ -1,44 +0,0 @@
|
||||||
static struct fetcherr http_errlist[] = {
|
|
||||||
{ 100, FETCH_OK, "Continue" },
|
|
||||||
{ 101, FETCH_OK, "Switching Protocols" },
|
|
||||||
{ 200, FETCH_OK, "OK" },
|
|
||||||
{ 201, FETCH_OK, "Created" },
|
|
||||||
{ 202, FETCH_OK, "Accepted" },
|
|
||||||
{ 203, FETCH_INFO, "Non-Authoritative Information" },
|
|
||||||
{ 204, FETCH_OK, "No Content" },
|
|
||||||
{ 205, FETCH_OK, "Reset Content" },
|
|
||||||
{ 206, FETCH_OK, "Partial Content" },
|
|
||||||
{ 300, FETCH_MOVED, "Multiple Choices" },
|
|
||||||
{ 301, FETCH_MOVED, "Moved Permanently" },
|
|
||||||
{ 302, FETCH_MOVED, "Moved Temporarily" },
|
|
||||||
{ 303, FETCH_MOVED, "See Other" },
|
|
||||||
{ 304, FETCH_UNCHANGED, "Not Modified" },
|
|
||||||
{ 305, FETCH_INFO, "Use Proxy" },
|
|
||||||
{ 307, FETCH_MOVED, "Temporary Redirect" },
|
|
||||||
{ 400, FETCH_PROTO, "Bad Request" },
|
|
||||||
{ 401, FETCH_AUTH, "Unauthorized" },
|
|
||||||
{ 402, FETCH_AUTH, "Payment Required" },
|
|
||||||
{ 403, FETCH_AUTH, "Forbidden" },
|
|
||||||
{ 404, FETCH_UNAVAIL, "Not Found" },
|
|
||||||
{ 405, FETCH_PROTO, "Method Not Allowed" },
|
|
||||||
{ 406, FETCH_PROTO, "Not Acceptable" },
|
|
||||||
{ 407, FETCH_AUTH, "Proxy Authentication Required" },
|
|
||||||
{ 408, FETCH_TIMEOUT, "Request Time-out" },
|
|
||||||
{ 409, FETCH_EXISTS, "Conflict" },
|
|
||||||
{ 410, FETCH_UNAVAIL, "Gone" },
|
|
||||||
{ 411, FETCH_PROTO, "Length Required" },
|
|
||||||
{ 412, FETCH_SERVER, "Precondition Failed" },
|
|
||||||
{ 413, FETCH_PROTO, "Request Entity Too Large" },
|
|
||||||
{ 414, FETCH_PROTO, "Request-URI Too Large" },
|
|
||||||
{ 415, FETCH_PROTO, "Unsupported Media Type" },
|
|
||||||
{ 416, FETCH_UNAVAIL, "Requested Range Not Satisfiable" },
|
|
||||||
{ 417, FETCH_SERVER, "Expectation Failed" },
|
|
||||||
{ 500, FETCH_SERVER, "Internal Server Error" },
|
|
||||||
{ 501, FETCH_PROTO, "Not Implemented" },
|
|
||||||
{ 502, FETCH_SERVER, "Bad Gateway" },
|
|
||||||
{ 503, FETCH_TEMP, "Service Unavailable" },
|
|
||||||
{ 504, FETCH_TIMEOUT, "Gateway Time-out" },
|
|
||||||
{ 505, FETCH_PROTO, "HTTP Version not supported" },
|
|
||||||
{ 999, FETCH_PROTO, "Protocol error" },
|
|
||||||
{ -1, FETCH_UNKNOWN, "Unknown HTTP error" }
|
|
||||||
};
|
|
Loading…
Reference in a new issue