./usr/lib/libexpat.so.2 minix-sys
./usr/lib/libexpat.so.2.1 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/libform.a minix-sys
./usr/lib/libform_pic.a minix-sys
./usr/man/man3/fesetenv.3 minix-sys
./usr/man/man3/fesetexceptflag.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/feupdateenv.3 minix-sys
./usr/man/man3/fflush.3 minix-sys
.include <bsd.own.mk>
-SUBDIR= byacc file flex less \
+SUBDIR= byacc fetch file flex less \
libarchive libevent mdocml \
tmux
--- /dev/null
+# $NetBSD: Makefile,v 1.1 2008/09/30 19:09:00 joerg Exp $
+
+SUBDIR= lib
+
+.include <bsd.subdir.mk>
--- /dev/null
+# $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
-/* $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) 2008, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
#if HAVE_CONFIG_H
#include "config.h"
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat.h>
#endif
#if defined(HAVE_INTTYPES_H) || defined(NETBSD)
#include <inttypes.h>
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat/netdb.h>
#else
#include <netdb.h>
#include <signal.h>
#endif
+#include "fetch.h"
#include "common.h"
/*** Local data **************************************************************/
case EADDRNOTAVAIL:
case ENETDOWN:
case ENETUNREACH:
-#if defined(ENETRESET)
case ENETRESET:
-#endif
case EHOSTUNREACH:
fetchLastErrCode = FETCH_NETWORK;
break;
-#if defined(ECONNABORTED)
case ECONNABORTED:
-#endif
case ECONNRESET:
fetchLastErrCode = FETCH_ABORT;
break;
fetchLastErrCode = FETCH_TIMEOUT;
break;
case ECONNREFUSED:
-#if defined(EHOSTDOWN)
case EHOSTDOWN:
-#endif
fetchLastErrCode = FETCH_DOWN;
break;
default:
if ((conn = fetch_reopen(sd)) == NULL) {
fetch_syserr();
close(sd);
- return (NULL);
}
conn->cache_url = fetchCopyURL(url);
conn->cache_af = af;
}
#ifdef WITH_SSL
if (conn->ssl != NULL)
- rlen = SSL_read(conn->ssl, buf, len);
+ rlen = SSL_read(conn->ssl, buf, (int)len);
else
#endif
rlen = read(conn->sd, buf, len);
return (-1);
if (len == 0)
break;
- next = memchr(conn->buf + conn->buflen, '\n', len);
+ next = memchr(conn->buf + conn->buflen, '\n', (size_t)len);
conn->buflen += len;
if (conn->buflen == conn->bufsize && next == NULL) {
tmp = conn->buf;
errno = 0;
#ifdef WITH_SSL
if (conn->ssl != NULL)
- wlen = SSL_write(conn->ssl, buf, len);
+ wlen = SSL_write(conn->ssl, buf, (int)len);
else
#endif
#ifndef MSG_NOSIGNAL
-/* $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
* All rights reserved.
#ifndef _COMMON_H_INCLUDED
#define _COMMON_H_INCLUDED
-#include <fetch.h>
-
#define FTP_DEFAULT_PORT 21
#define HTTP_DEFAULT_PORT 80
#define FTP_DEFAULT_PROXY_PORT 21
#if !defined(__sun) && !defined(__hpux) && !defined(__INTERIX) && \
!defined(__digital__) && !defined(__linux) && !defined(__MINT__) && \
- !defined(__sgi) && !defined(__minix)
+ !defined(__sgi)
#define HAVE_SA_LEN
#endif
void fetch_seterr(struct fetcherr *, int);
void fetch_syserr(void);
-void fetch_info(const char *, ...)
- __attribute__((__format__(__printf__, 1, 2)));
+void fetch_info(const char *, ...);
int fetch_default_port(const char *);
int fetch_default_proxy_port(const char *);
int fetch_bind(int, int, const char *);
#!/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"
while read code type msg; do
--- /dev/null
+.\"-
+.\" 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.
-/* $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) 2008 Joerg Sonnenberger <joerg@NetBSD.org>
#if HAVE_CONFIG_H
#include "config.h"
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat.h>
#endif
#include <stdlib.h>
#include <string.h>
+#include "fetch.h"
#include "common.h"
auth_t fetchAuthMethod;
-/* $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
* All rights reserved.
-/* $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) 2008, 2009 Joerg Sonnenberger <joerg@NetBSD.org>
#if HAVE_CONFIG_H
#include "config.h"
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat.h>
#endif
#include <string.h>
#include <unistd.h>
+#include "fetch.h"
#include "common.h"
static int fetch_stat_file(int, struct url_stat *);
}
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;
int fd, rv;
}
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;
struct dirent *de;
-/* $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) 2008, 2009, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
#if HAVE_CONFIG_H
#include "config.h"
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat.h>
#endif
#include <inttypes.h>
#endif
#include <stdarg.h>
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat/netdb.h>
#include <nbcompat/stdio.h>
#else
#include <time.h>
#include <unistd.h>
+#include "fetch.h"
#include "common.h"
#include "ftperr.h"
isdigit((unsigned char)foo[2]) && \
foo[3] == '-')
-#define MINBUFSIZE 4096
-
-#ifdef INET6
/*
* Translate IPv4 mapped IPv6 address to IPv4 address
*/
unmappedaddr(struct sockaddr_in6 *sin6, socklen_t *len)
{
struct sockaddr_in *sin4;
+ void *addrp;
uint32_t addr;
int port;
if (sin6->sin6_family != AF_INET6 ||
!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
return;
- sin4 = (struct sockaddr_in *)sin6;
- addr = *(uint32_t *)&sin6->sin6_addr.s6_addr[12];
+ sin4 = (struct sockaddr_in *)(void *)sin6;
+ addrp = &sin6->sin6_addr.s6_addr[12];
+ addr = *(uint32_t *)addrp;
port = sin6->sin6_port;
memset(sin4, 0, sizeof(struct sockaddr_in));
sin4->sin_addr.s_addr = addr;
sin4->sin_len = sizeof(struct sockaddr_in);
#endif
}
-#endif
/*
* Get server response
/*
* 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
ftp_cmd(conn_t *conn, const char *fmt, ...)
{
va_list ap;
size_t len;
char *msg;
- int r;
+ ssize_t r;
va_start(ap, fmt);
len = vasprintf(&msg, fmt, ap);
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
*/
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;
{
char *src, *dst, *end;
int q;
+ size_t len;
if (conn->err != FTP_WORKING_DIRECTORY &&
conn->err != FTP_FILE_ACTION_OK)
src = conn->buf + 4;
if (src >= end || *src++ != '"')
return (FTP_PROTOCOL_ERROR);
- *pwd = malloc(end - src + 1);
+ len = end - src + 1;
+ *pwd = malloc(len);
if (*pwd == NULL)
return (FTP_PROTOCOL_ERROR);
for (q = 0, dst = *pwd; src < end; ++src) {
{
const char *beg, *end;
char *pwd, *dst;
- int e, i, len;
+ int e;
+ size_t i, len;
if (*path != '/') {
ftp_seterr(501);
} else if (strcmp(conn->ftp_home, "/") == 0) {
dst = strdup(path - 1);
} else {
-#ifndef __minix
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) {
fetch_syserr();
len = strlen(pwd);
/* 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])
break;
/* Keep going up a dir until we have a matching prefix. */
case 0:
case 's':
mode = 'S';
+ /*FALLTHROUGH*/
case 'S':
break;
default:
case 0:
case 'i':
type = 'I';
+ /*FALLTHROUGH*/
case 'I':
break;
case 'a':
type = 'A';
+ /*FALLTHROUGH*/
case 'A':
break;
case 'd':
type = 'D';
+ /*FALLTHROUGH*/
case 'D':
/* can't handle yet */
default:
{
char *ln;
const char *filename;
- int filenamelen, type;
+ size_t filenamelen;
+ int type;
struct tm tm;
time_t t;
int e;
ftp_readfn(void *v, void *buf, size_t len)
{
struct ftpio *io;
- int r;
+ ssize_t r;
io = (struct ftpio *)v;
if (io == NULL) {
ftp_writefn(void *v, const void *buf, size_t len)
{
struct ftpio *io;
- int w;
+ ssize_t w;
io = (struct ftpio *)v;
if (io == NULL) {
ftp_closefn(void *v)
{
struct ftpio *io;
- int r;
io = (struct ftpio *)v;
if (io == NULL) {
fetch_close(io->dconn);
io->dconn = NULL;
io->dir = -1;
- r = ftp_chkerr(io->cconn);
+ (void)ftp_chkerr(io->cconn);
fetch_cache_put(io->cconn, ftp_disconnect);
free(io);
return;
} u;
const char *bindaddr;
const char *filename;
- int filenamelen, type;
+ size_t filenamelen;
+ int type;
int low, pasv, verbose;
int e, sd = -1;
socklen_t l;
l = sizeof(u.ss);
if (getsockname(conn->sd, &u.sa, &l) == -1)
goto sysouch;
-#ifdef INET6
if (u.ss.ss_family == AF_INET6)
unmappedaddr(&u.sin6, &l);
-#endif
retry_mode:
if ((e = ftp_cmd(conn, "PASV\r\n")) != FTP_PASSIVE_MODE)
goto ouch;
break;
-#ifdef INET6
case AF_INET6:
if ((e = ftp_cmd(conn, "EPSV\r\n")) != FTP_EPASSIVE_MODE) {
if (e == -1)
goto ouch;
}
break;
-#endif
default:
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
goto ouch;
}
l = (e == FTP_PASSIVE_MODE ? 6 : 21);
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) {
e = FTP_PROTOCOL_ERROR;
goto ouch;
l = sizeof(u.ss);
if (getpeername(conn->sd, &u.sa, &l) == -1)
goto sysouch;
-#ifdef INET6
if (u.ss.ss_family == AF_INET6)
unmappedaddr(&u.sin6, &l);
-#endif
switch (u.ss.ss_family) {
-#ifdef INET6
case AF_INET6:
if (e == FTP_EPASSIVE_MODE)
u.sin6.sin6_port = htons(port);
memcpy(&u.sin6.sin6_port, addr + 19, 2);
}
break;
-#endif
case AF_INET:
if (e == FTP_EPASSIVE_MODE)
u.sin4.sin_port = htons(port);
int arg;
#endif
int d;
-#ifdef INET6
- char *ap;
char hname[INET6_ADDRSTRLEN];
-#endif
switch (u.ss.ss_family) {
-#ifdef INET6
case AF_INET6:
u.sin6.sin6_port = 0;
#ifdef IPV6_PORTRANGE
arg = low ? IPV6_PORTRANGE_DEFAULT : IPV6_PORTRANGE_HIGH;
if (setsockopt(sd, IPPROTO_IPV6, IPV6_PORTRANGE,
- (char *)&arg, sizeof(arg)) == -1)
+ &arg, (socklen_t)sizeof(arg)) == -1)
goto sysouch;
#endif
break;
-#endif
case AF_INET:
u.sin4.sin_port = 0;
#ifdef IP_PORTRANGE
arg = low ? IP_PORTRANGE_DEFAULT : IP_PORTRANGE_HIGH;
if (setsockopt(sd, IPPROTO_IP, IP_PORTRANGE,
- (char *)&arg, sizeof(arg)) == -1)
+ &arg, (socklen_t)sizeof(arg)) == -1)
goto sysouch;
#endif
break;
e = ftp_cmd(conn, "PORT %d,%d,%d,%d,%d,%d\r\n",
(a >> 24) & 0xff, (a >> 16) & 0xff,
(a >> 8) & 0xff, a & 0xff,
- (p >> 8) & 0xff, p & 0xff);
+ ((unsigned int)p >> 8) & 0xff, p & 0xff);
break;
-#ifdef INET6
case AF_INET6:
-#define UC(b) (((int)b)&0xff)
e = -1;
u.sin6.sin6_scope_id = 0;
if (getnameinfo(&u.sa, l,
- hname, sizeof(hname),
+ hname, (socklen_t)sizeof(hname),
NULL, 0, NI_NUMERICHOST) == 0) {
e = ftp_cmd(conn, "EPRT |%d|%s|%d|\r\n", 2, hname,
htons(u.sin6.sin6_port));
goto ouch;
}
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,
"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,
- UC(ap[0]), UC(ap[1]), UC(ap[2]), UC(ap[3]),
- UC(ap[4]), UC(ap[5]), UC(ap[6]), UC(ap[7]),
- UC(ap[8]), UC(ap[9]), UC(ap[10]), UC(ap[11]),
- UC(ap[12]), UC(ap[13]), UC(ap[14]), UC(ap[15]),
+ aa[ 0], aa[ 1], aa[ 2], aa[ 3],
+ aa[ 4], aa[ 5], aa[ 6], aa[ 7],
+ aa[ 8], aa[ 9], aa[10], aa[11],
+ aa[12], aa[13], aa[14], aa[15],
2,
- (ntohs(u.sin6.sin6_port) >> 8) & 0xff,
- ntohs(u.sin6.sin6_port) & 0xff);
+ ((unsigned int)p >> 8) & 0xff, p & 0xff);
}
break;
-#endif
default:
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
goto ouch;
if (e != FTP_OK)
goto ouch;
-#ifndef __minix
/* seek to required offset */
if (offset)
if (ftp_cmd(conn, "REST %llu\r\n", (unsigned long long)offset) != FTP_FILE_OK)
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 */
if (verbose)
verbose = CHECK_FLAG('v');
if (CHECK_FLAG('4'))
af = AF_INET;
-#ifdef INET6
else if (CHECK_FLAG('6'))
af = AF_INET6;
-#endif
+
if (direct)
purl = NULL;
ftp_get_proxy(struct url * url, const char *flags)
{
struct url *purl;
- char *p;
+ char *p, *fp, *FP, *hp, *HP;
if (flags != NULL && strchr(flags, 'd') != NULL)
- return (NULL);
+ return NULL;
if (fetch_no_proxy_match(url->host))
- return (NULL);
- if (((p = getenv("FTP_PROXY")) || (p = getenv("ftp_proxy")) ||
- (p = getenv("HTTP_PROXY")) || (p = getenv("http_proxy"))) &&
+ return NULL;
+
+ 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) {
if (!*purl->scheme) {
- if (getenv("FTP_PROXY") || getenv("ftp_proxy"))
+ if (fp || FP)
strcpy(purl->scheme, SCHEME_FTP);
else
strcpy(purl->scheme, SCHEME_HTTP);
purl->port = fetch_default_proxy_port(purl->scheme);
if (strcasecmp(purl->scheme, SCHEME_FTP) == 0 ||
strcasecmp(purl->scheme, SCHEME_HTTP) == 0)
- return (purl);
+ return purl;
fetchFreeURL(purl);
}
- return (NULL);
+ return NULL;
}
/*
-# $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 $
#
# This list is taken from RFC 959.
-/* $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) 2003 Thomas Klausner <wiz@NetBSD.org>
#define _GNU_SOURCE
#endif
-#ifndef __minix
/* Needed for gmtime_r on Interix */
#define _REENTRANT
-#endif
#if HAVE_CONFIG_H
#include "config.h"
#endif
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat.h>
#endif
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat/stdio.h>
#else
#include <stdio.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
-#if !defined(NETBSD) && !defined(__minix)
+#ifndef NETBSD
#include <nbcompat/netdb.h>
#else
#include <netdb.h>
#include <arpa/inet.h>
+#include "fetch.h"
#include "common.h"
#include "httperr.h"
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
-#define MINBUFSIZE 4096
/*****************************************************************************
* I/O functions for decoding chunked streams
char *buf; /* chunk buffer */
size_t bufsize; /* size of chunk 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 error; /* error flag */
size_t chunksize; /* remaining size of current chunk */
/*
* Get next chunk header
*/
-static int
+static ssize_t
http_new_chunk(struct httpio *io)
{
char *p;
/*
* Fill the input buffer, do chunk decoding on the fly
*/
-static int
+static ssize_t
http_fillbuf(struct httpio *io, size_t len)
{
if (io->error)
for (pos = 0; len > 0; pos += l, len -= l) {
/* empty buffer */
- if (!io->buf || io->bufpos == io->buflen)
+ if (!io->buf || (ssize_t)io->bufpos == io->buflen)
if (http_fillbuf(io, len) < 1)
break;
l = io->buflen - io->bufpos;
val = 0;
setsockopt(io->conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
- sizeof(val));
+ (socklen_t)sizeof(val));
fetch_cache_put(io->conn, fetch_close);
#ifdef TCP_NOPUSH
val = 1;
/*
* 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
http_cmd(conn_t *conn, const char *fmt, ...)
{
va_list ap;
size_t len;
char *msg;
- int r;
+ ssize_t r;
va_start(ap, fmt);
len = vasprintf(&msg, fmt, ap);
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
*/
"0123456789+/";
char *str, *dst;
size_t l;
- int t, r;
+ unsigned int t, r;
l = strlen(src);
if ((str = malloc(((l + 2) / 3) * 4 + 1)) == NULL)
/*
* Encode username and password
*/
-#ifndef __minix
static int
http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
{
free(auth);
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
*/
http_cmd(conn, "User-Agent: %s\r\n", p);
else
http_cmd(conn, "User-Agent: %s\r\n", _LIBFETCH_VER);
-#ifndef __minix
if (url->offset > 0)
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");
/*
#endif
val = 1;
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
- sizeof(val));
+ (socklen_t)sizeof(val));
/* get reply */
switch (http_get_reply(conn)) {
* Store a file by HTTP
*/
fetchIO *
-fetchPutHTTP(struct url *URL, const char *flags)
+/*ARGSUSED*/
+fetchPutHTTP(struct url *URL __unused, const char *flags __unused)
{
fprintf(stderr, "fetchPutHTTP(): not implemented\n");
return (NULL);
* List a directory
*/
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;
char buf[2 * PATH_MAX];
# $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.
#
--- /dev/null
+# $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>
--- /dev/null
+# $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
../minix/lib/libddekit \
../minix/lib/libdevman \
../minix/lib/libexec \
- ../minix/lib/libfetch \
../minix/lib/libfsdriver \
../minix/lib/libinputdriver \
../minix/lib/libminc \
.endif
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")
SUBDIR+= ../external/bsd/openldap/lib # depends on libcrypto, ...
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>
SUBDIR+= libddekit
SUBDIR+= libdevman
SUBDIR+= libexec
-SUBDIR+= libfetch
SUBDIR+= libfsdriver
SUBDIR+= libinputdriver
SUBDIR+= libminc
+++ /dev/null
-# $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>
+++ /dev/null
-FETCH(3) NetBSD Library Functions Manual FETCH(3)
-
-N\bNA\bAM\bME\bE
- f\bfe\bet\btc\bch\bhM\bMa\bak\bke\beU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhC\bCo\bop\bpy\byU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btU\bUR\bRL\bL,
- f\bfe\bet\btc\bch\bhG\bGe\bet\btU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhP\bPu\but\btU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\bt,
- f\bfe\bet\btc\bch\bhG\bGe\bet\bt, f\bfe\bet\btc\bch\bhP\bPu\but\bt, f\bfe\bet\btc\bch\bhS\bSt\bta\bat\bt, f\bfe\bet\btc\bch\bhL\bLi\bis\bst\bt, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFi\bil\ble\be, f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFi\bil\ble\be,
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFi\bil\ble\be, f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btF\bFi\bil\ble\be, f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btF\bFi\bil\ble\be, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btH\bHT\bTT\bTP\bP, f\bfe\bet\btc\bch\bhG\bGe\bet\btH\bHT\bTT\bTP\bP,
- f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP, f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btH\bHT\bTT\bTP\bP, f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btH\bHT\bTT\bTP\bP, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFT\bTP\bP, f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFT\bTP\bP,
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFT\bTP\bP, f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btF\bFT\bTP\bP, f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btF\bFT\bTP\bP f\bfe\bet\btc\bch\bhI\bIn\bni\bit\btU\bUR\bRL\bLL\bLi\bis\bst\bt,
- f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bLL\bLi\bis\bst\bt, f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beP\bPa\bat\bth\bh, f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beF\bFi\bil\ble\ben\bna\bam\bme\be,
- f\bfe\bet\btc\bch\bhS\bSt\btr\bri\bin\bng\bgi\bif\bfy\byU\bUR\bRL\bL, f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beI\bIn\bni\bit\bt, f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beC\bCl\blo\bos\bse\be,
- f\bfe\bet\btc\bch\bh -- file transfer functions
-
-L\bLI\bIB\bBR\bRA\bAR\bRY\bY
- File Transfer Library for URLs (libfetch, -lfetch)
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
- #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<s\bst\btd\bdi\bio\bo.\b.h\bh>\b>
- #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<f\bfe\bet\btc\bch\bh.\b.h\bh>\b>
-
- _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*
- f\bfe\bet\btc\bch\bhM\bMa\bak\bke\beU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bc_\bh_\be_\bm_\be, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bh_\bo_\bs_\bt, _\bi_\bn_\bt _\bp_\bo_\br_\bt,
- _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bd_\bo_\bc, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bu_\bs_\be_\br, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bp_\bw_\bd);
-
- _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*
- f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL);
-
- _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*
- f\bfe\bet\btc\bch\bhC\bCo\bop\bpy\byU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu);
-
- _\bv_\bo_\bi_\bd
- f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bL(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhG\bGe\bet\btU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhP\bPu\but\btU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btU\bUR\bRL\bL(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bl_\bi_\bs_\bt, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bU_\bR_\bL, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhG\bGe\bet\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhP\bPu\but\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bl_\bi_\bs_\bt, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFi\bil\ble\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFi\bil\ble\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFi\bil\ble\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btF\bFi\bil\ble\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btF\bFi\bil\ble\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bl_\bi_\bs_\bt, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btH\bHT\bTT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhG\bGe\bet\btH\bHT\bTT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btH\bHT\bTT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btH\bHT\bTT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bl_\bi_\bs_\bt, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bf_\be_\bt_\bc_\bh_\bI_\bO _\b*
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btF\bFT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt _\b*_\bu_\bs, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btF\bFT\bTP\bP(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bl_\bi_\bs_\bt, _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bl_\ba_\bg_\bs);
-
- _\bv_\bo_\bi_\bd
- f\bfe\bet\btc\bch\bhI\bIn\bni\bit\btU\bUR\bRL\bLL\bLi\bis\bst\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bu_\bl);
-
- _\bi_\bn_\bt
- f\bfe\bet\btc\bch\bhA\bAp\bpp\bpe\ben\bnd\bdU\bUR\bRL\bLL\bLi\bis\bst\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bd_\bs_\bt, _\bc_\bo_\bn_\bs_\bt _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bs_\br_\bc);
-
- _\bv_\bo_\bi_\bd
- f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bLL\bLi\bis\bst\bt(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt _\b*_\bu_\bl);
-
- _\bc_\bh_\ba_\br _\b*
- f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beP\bPa\bat\bth\bh(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu);
-
- _\bc_\bh_\ba_\br _\b*
- f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beF\bFi\bil\ble\ben\bna\bam\bme\be(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu);
-
- _\bc_\bh_\ba_\br _\b*
- f\bfe\bet\btc\bch\bhS\bSt\btr\bri\bin\bng\bgi\bif\bfy\byU\bUR\bRL\bL(_\bc_\bo_\bn_\bs_\bt _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu);
-
- _\bv_\bo_\bi_\bd
- f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beI\bIn\bni\bit\bt(_\bi_\bn_\bt _\bg_\bl_\bo_\bb_\ba_\bl, _\bi_\bn_\bt _\bp_\be_\br_\b__\bh_\bo_\bs_\bt);
-
- _\bv_\bo_\bi_\bd
- f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beC\bCl\blo\bos\bse\be(_\bv_\bo_\bi_\bd);
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
- These functions implement a high-level library for retrieving and upload-
- ing files using Uniform Resource Locators (URLs).
-
- f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL() 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. f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL() quotes any unsafe character in
- the URL automatically. This is not done by f\bfe\bet\btc\bch\bhM\bMa\bak\bke\beU\bUR\bRL\bL().
- f\bfe\bet\btc\bch\bhC\bCo\bop\bpy\byU\bUR\bRL\bL() copies an existing _\bu_\br_\bl structure.
-
- f\bfe\bet\btc\bch\bhM\bMa\bak\bke\beU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL(), and f\bfe\bet\btc\bch\bhC\bCo\bop\bpy\byU\bUR\bRL\bL() return a pointer to a
- _\bu_\br_\bl structure, which is defined as follows in <_\bf_\be_\bt_\bc_\bh_\b._\bh>:
-
- #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 f\bfe\bet\btc\bch\bhM\bMa\bak\bke\beU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhC\bCo\bop\bpy\byU\bUR\bRL\bL(), and
- f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL() should be freed using f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bL(). The size of _\bs_\bt_\br_\bu_\bc_\bt
- _\bU_\bR_\bL is not part of the ABI.
-
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhG\bGe\bet\btU\bUR\bRL\bL(), and f\bfe\bet\btc\bch\bhP\bPu\but\btU\bUR\bRL\bL() constitute the recom-
- mended interface to the f\bfe\bet\btc\bch\bh 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. f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btU\bUR\bRL\bL() also
- returns the remote document's metadata in the _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt structure pointed
- to by the _\bu_\bs argument.
-
- The _\bf_\bl_\ba_\bg_\bs 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.
-
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btU\bUR\bRL\bL() attempts to obtain the requested document's metadata and
- fill in the structure pointed to by its second argument. The _\bu_\br_\bl_\b__\bs_\bt_\ba_\bt
- structure is defined as follows in <_\bf_\be_\bt_\bc_\bh_\b._\bh>:
-
- struct url_stat {
- off_t size;
- time_t atime;
- time_t mtime;
- };
-
- If the size could not be obtained from the server, the _\bs_\bi_\bz_\be field is set
- to -1. If the modification time could not be obtained from the server,
- the _\bm_\bt_\bi_\bm_\be field is set to the epoch. If the access time could not be
- obtained from the server, the _\ba_\bt_\bi_\bm_\be field is set to the modification
- time.
-
- f\bfe\bet\btc\bch\bhL\bLi\bis\bst\btU\bUR\bRL\bL() 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 _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt structure. The
- _\bu_\br_\bl_\b__\bl_\bi_\bs_\bt structure is defined as follows in <_\bf_\be_\bt_\bc_\bh_\b._\bh>:
-
- struct url_list {
- size_t length;
- size_t alloc_size;
- struct url *urls;
- };
-
- The list should be initialized by calling f\bfe\bet\btc\bch\bhI\bIn\bni\bit\btU\bUR\bRL\bLL\bLi\bis\bst\bt() and the
- entries be freed by calling f\bfe\bet\btc\bch\bhF\bFr\bre\bee\beU\bUR\bRL\bLL\bLi\bis\bst\bt(). The function
- f\bfe\bet\btc\bch\bhA\bAp\bpp\bpe\ben\bnd\bdU\bUR\bRL\bLL\bLi\bis\bst\bt() 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.
-
- f\bfe\bet\btc\bch\bhS\bSt\btr\bri\bin\bng\bgi\bif\bfy\byU\bUR\bRL\bL() returns the URL as string. f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beP\bPa\bat\bth\bh()
- returns the path name part of the URL with any quoting undone. Query
- arguments and fragment identifiers are not included.
- f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beF\bFi\bil\ble\ben\bna\bam\bme\be() returns the last component of the path name as
- returned by f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beP\bPa\bat\bth\bh(). f\bfe\bet\btc\bch\bhS\bSt\btr\bri\bin\bng\bgi\bif\bfy\byU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beP\bPa\bat\bth\bh(),
- and f\bfe\bet\btc\bch\bhU\bUn\bnq\bqu\buo\bot\bte\beF\bFi\bil\ble\ben\bna\bam\bme\be() return a string that should be deallocated
- with f\bfr\bre\bee\be() after use.
-
- f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beI\bIn\bni\bit\bt() 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. f\bfe\bet\btc\bch\bhC\bCo\bon\bnn\bne\bec\bct\bti\bio\bon\bnC\bCa\bac\bch\bhe\beC\bCl\blo\bos\bse\be() flushed the con-
- nection cache and closes all cached connections.
-
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\bt(), f\bfe\bet\btc\bch\bhG\bGe\bet\bt(), f\bfe\bet\btc\bch\bhP\bPu\but\bt(), and f\bfe\bet\btc\bch\bhS\bSt\bta\bat\bt() are similar to
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhG\bGe\bet\btU\bUR\bRL\bL(), f\bfe\bet\btc\bch\bhP\bPu\but\btU\bUR\bRL\bL(), and f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btU\bUR\bRL\bL(), except
- that they expect a pre-parsed URL in the form of a pointer to a _\bs_\bt_\br_\bu_\bc_\bt
- _\bu_\br_\bl rather than a string.
-
- All of the f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btX\bXX\bXX\bX(), f\bfe\bet\btc\bch\bhG\bGe\bet\btX\bXX\bXX\bX(), and f\bfe\bet\btc\bch\bhP\bPu\but\btX\bXX\bXX\bX() 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 f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btX\bXX\bXX\bX() or
- f\bfe\bet\btc\bch\bhG\bGe\bet\btX\bXX\bXX\bX() functions is read-only, and that a stream returned by one
- of the f\bfe\bet\btc\bch\bhP\bPu\but\btX\bXX\bXX\bX() functions is write-only.
-
-P\bPR\bRO\bOT\bTO\bOC\bCO\bOL\bL I\bIN\bND\bDE\bEP\bPE\bEN\bND\bDE\bEN\bNT\bT F\bFL\bLA\bAG\bGS\bS
- If the `i' (if-modified-since) flag is specified, the library will try to
- fetch the content only if it is newer than _\bl_\ba_\bs_\bt_\b__\bm_\bo_\bd_\bi_\bf_\bi_\be_\bd. 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.
-
-F\bFI\bIL\bLE\bE S\bSC\bCH\bHE\bEM\bME\bE
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFi\bil\ble\be(), f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFi\bil\ble\be(), and f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFi\bil\ble\be() provide access to
- documents which are files in a locally mounted file system. Only the
- <document> component of the URL is used.
-
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFi\bil\ble\be() and f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFi\bil\ble\be() do not accept any flags.
-
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFi\bil\ble\be() accepts the `a' (append to file) flag. If that flag is
- specified, the data written to the stream returned by f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFi\bil\ble\be() will
- be appended to the previous contents of the file, instead of replacing
- them.
-
-F\bFT\bTP\bP S\bSC\bCH\bHE\bEM\bME\bE
- f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFT\bTP\bP(), f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFT\bTP\bP(), and f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFT\bTP\bP() implement the FTP proto-
- col as described in RFC 959.
-
- By default l\bli\bib\bbf\bfe\bet\btc\bch\bh 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, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btF\bFT\bTP\bP(), f\bfe\bet\btc\bch\bhG\bGe\bet\btF\bFT\bTP\bP(), and
- f\bfe\bet\btc\bch\bhP\bPu\but\btF\bFT\bTP\bP() will use a direct connection even if a proxy server is
- defined.
-
- If no user name or password is given, the f\bfe\bet\btc\bch\bh library will attempt an
- anonymous login, with user name "anonymous" and password "anony-
- mous@<hostname>".
-
-H\bHT\bTT\bTP\bP S\bSC\bCH\bHE\bEM\bME\bE
- The f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btH\bHT\bTT\bTP\bP(), f\bfe\bet\btc\bch\bhG\bGe\bet\btH\bHT\bTT\bTP\bP(), and f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP() 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, f\bfe\bet\btc\bch\bhX\bXG\bGe\bet\btH\bHT\bTT\bTP\bP(), f\bfe\bet\btc\bch\bhG\bGe\bet\btH\bHT\bTT\bTP\bP(),
- and f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP() 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 f\bfe\bet\btc\bch\bh library, f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP()
- is currently unimplemented.
-
-A\bAU\bUT\bTH\bHE\bEN\bNT\bTI\bIC\bCA\bAT\bTI\bIO\bON\bN
- Apart from setting the appropriate environment variables and specifying
- the user name and password in the URL or the _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl, the calling pro-
- gram has the option of defining an authentication function with the fol-
- lowing prototype:
-
- _\bi_\bn_\bt m\bmy\byA\bAu\but\bth\bhM\bMe\bet\bth\bho\bod\bd(_\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl _\b*_\bu)
-
- The callback function should fill in the _\bu_\bs_\be_\br and _\bp_\bw_\bd fields in the pro-
- vided _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl and return 0 on success, or any other value to indicate
- failure.
-
- To register the authentication callback, simply set _\bf_\be_\bt_\bc_\bh_\bA_\bu_\bt_\bh_\bM_\be_\bt_\bh_\bo_\bd 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.
-
-R\bRE\bET\bTU\bUR\bRN\bN V\bVA\bAL\bLU\bUE\bES\bS
- f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL() returns a pointer to a _\bs_\bt_\br_\bu_\bc_\bt _\bu_\br_\bl containing the individ-
- ual components of the URL. If it is unable to allocate memory, or the
- URL is syntactically incorrect, f\bfe\bet\btc\bch\bhP\bPa\bar\brs\bse\beU\bUR\bRL\bL() returns a NULL pointer.
-
- The f\bfe\bet\btc\bch\bhS\bSt\bta\bat\bt() 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 <_\bf_\be_\bt_\bc_\bh_\b._\bh>:
-
- [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)"
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
- 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, l\bli\bib\bbf\bfe\bet\btc\bch\bh 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 _\b~_\b/_\b._\bn_\be_\bt_\br_\bc 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.
-
-E\bEX\bXA\bAM\bMP\bPL\bLE\bES\bS
- To access a proxy server on _\bp_\br_\bo_\bx_\by_\b._\be_\bx_\ba_\bm_\bp_\bl_\be_\b._\bc_\bo_\bm 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
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
- ftp(1), ip(4)
-
- J. Postel and J. K. Reynolds, _\bF_\bi_\bl_\be _\bT_\br_\ba_\bn_\bs_\bf_\be_\br _\bP_\br_\bo_\bt_\bo_\bc_\bo_\bl, October 1985, RFC
- 959.
-
- P. Deutsch, A. Emtage, and A. Marine, _\bH_\bo_\bw _\bt_\bo _\bU_\bs_\be _\bA_\bn_\bo_\bn_\by_\bm_\bo_\bu_\bs _\bF_\bT_\bP, May 1994,
- RFC 1635.
-
- T. Berners-Lee, L. Masinter, and M. McCahill, _\bU_\bn_\bi_\bf_\bo_\br_\bm _\bR_\be_\bs_\bo_\bu_\br_\bc_\be _\bL_\bo_\bc_\ba_\bt_\bo_\br_\bs
- _\b(_\bU_\bR_\bL_\b), December 1994, RFC 1738.
-
- R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and
- T. Berners-Lee, _\bH_\by_\bp_\be_\br_\bt_\be_\bx_\bt _\bT_\br_\ba_\bn_\bs_\bf_\be_\br _\bP_\br_\bo_\bt_\bo_\bc_\bo_\bl _\b-_\b- _\bH_\bT_\bT_\bP_\b/_\b1_\b._\b1, January 1999,
- RFC 2616.
-
- J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. Leach, A.
- Luotonen, and L. Stewart, _\bH_\bT_\bT_\bP _\bA_\bu_\bt_\bh_\be_\bn_\bt_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b: _\bB_\ba_\bs_\bi_\bc _\ba_\bn_\bd _\bD_\bi_\bg_\be_\bs_\bt _\bA_\bc_\bc_\be_\bs_\bs
- _\bA_\bu_\bt_\bh_\be_\bn_\bt_\bi_\bc_\ba_\bt_\bi_\bo_\bn, June 1999, RFC 2617.
-
-H\bHI\bIS\bST\bTO\bOR\bRY\bY
- The f\bfe\bet\btc\bch\bh library first appeared in FreeBSD 3.0.
-
-A\bAU\bUT\bTH\bHO\bOR\bRS\bS
- The f\bfe\bet\btc\bch\bh 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 f\bft\btp\bpi\bio\bo 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>.
-
-B\bBU\bUG\bGS\bS
- Some parts of the library are not yet implemented. The most notable
- examples of this are f\bfe\bet\btc\bch\bhP\bPu\but\btH\bHT\bTT\bTP\bP() 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.
-
- l\bli\bib\bbf\bfe\bet\btc\bch\bh 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.
-
- f\bfe\bet\btc\bch\bhS\bSt\bta\bat\btF\bFT\bTP\bP() 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
+++ /dev/null
-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" }
-};
+++ /dev/null
-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" }
-};