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.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
|
||||
|
@ -3474,6 +3478,7 @@
|
|||
./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
|
||||
|
|
2
external/bsd/Makefile
vendored
2
external/bsd/Makefile
vendored
|
@ -2,7 +2,7 @@
|
|||
|
||||
.include <bsd.own.mk>
|
||||
|
||||
SUBDIR= byacc file flex less \
|
||||
SUBDIR= byacc fetch file flex less \
|
||||
libarchive libevent mdocml \
|
||||
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) 2008, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||
|
@ -33,7 +33,7 @@
|
|||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat.h>
|
||||
#endif
|
||||
|
||||
|
@ -50,7 +50,7 @@
|
|||
#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>
|
||||
|
@ -66,6 +66,7 @@
|
|||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
#include "fetch.h"
|
||||
#include "common.h"
|
||||
|
||||
/*** Local data **************************************************************/
|
||||
|
@ -149,15 +150,11 @@ fetch_syserr(void)
|
|||
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;
|
||||
|
@ -165,9 +162,7 @@ fetch_syserr(void)
|
|||
fetchLastErrCode = FETCH_TIMEOUT;
|
||||
break;
|
||||
case ECONNREFUSED:
|
||||
#if defined(EHOSTDOWN)
|
||||
case EHOSTDOWN:
|
||||
#endif
|
||||
fetchLastErrCode = FETCH_DOWN;
|
||||
break;
|
||||
default:
|
||||
|
@ -321,7 +316,6 @@ fetch_connect(struct url *url, int af, int verbose)
|
|||
if ((conn = fetch_reopen(sd)) == NULL) {
|
||||
fetch_syserr();
|
||||
close(sd);
|
||||
return (NULL);
|
||||
}
|
||||
conn->cache_url = fetchCopyURL(url);
|
||||
conn->cache_af = af;
|
||||
|
@ -545,7 +539,7 @@ fetch_read(conn_t *conn, char *buf, size_t len)
|
|||
}
|
||||
#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);
|
||||
|
@ -594,7 +588,7 @@ fetch_getln(conn_t *conn)
|
|||
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;
|
||||
|
@ -680,7 +674,7 @@ fetch_write(conn_t *conn, const void *buf, size_t len)
|
|||
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
|
|
@ -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
|
||||
* All rights reserved.
|
||||
|
@ -32,8 +32,6 @@
|
|||
#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
|
||||
|
@ -49,7 +47,7 @@
|
|||
|
||||
#if !defined(__sun) && !defined(__hpux) && !defined(__INTERIX) && \
|
||||
!defined(__digital__) && !defined(__linux) && !defined(__MINT__) && \
|
||||
!defined(__sgi) && !defined(__minix)
|
||||
!defined(__sgi)
|
||||
#define HAVE_SA_LEN
|
||||
#endif
|
||||
|
||||
|
@ -92,8 +90,7 @@ struct fetcherr {
|
|||
|
||||
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 *);
|
|
@ -1,5 +1,5 @@
|
|||
#!/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
|
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) 2008 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||
|
@ -33,7 +33,7 @@
|
|||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat.h>
|
||||
#endif
|
||||
|
||||
|
@ -43,6 +43,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "fetch.h"
|
||||
#include "common.h"
|
||||
|
||||
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
|
||||
* 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) 2008, 2009 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||
|
@ -33,7 +33,7 @@
|
|||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat.h>
|
||||
#endif
|
||||
|
||||
|
@ -47,6 +47,7 @@
|
|||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "fetch.h"
|
||||
#include "common.h"
|
||||
|
||||
static int fetch_stat_file(int, struct url_stat *);
|
||||
|
@ -203,7 +204,8 @@ fetch_stat_file(int fd, struct url_stat *us)
|
|||
}
|
||||
|
||||
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;
|
||||
|
@ -228,7 +230,9 @@ fetchStatFile(struct url *u, struct url_stat *us, const char *flags)
|
|||
}
|
||||
|
||||
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;
|
|
@ -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) 2008, 2009, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
|
||||
|
@ -65,7 +65,7 @@
|
|||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat.h>
|
||||
#endif
|
||||
|
||||
|
@ -82,7 +82,7 @@
|
|||
#include <inttypes.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat/netdb.h>
|
||||
#include <nbcompat/stdio.h>
|
||||
#else
|
||||
|
@ -94,6 +94,7 @@
|
|||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "fetch.h"
|
||||
#include "common.h"
|
||||
#include "ftperr.h"
|
||||
|
||||
|
@ -130,9 +131,6 @@
|
|||
isdigit((unsigned char)foo[2]) && \
|
||||
foo[3] == '-')
|
||||
|
||||
#define MINBUFSIZE 4096
|
||||
|
||||
#ifdef INET6
|
||||
/*
|
||||
* Translate IPv4 mapped IPv6 address to IPv4 address
|
||||
*/
|
||||
|
@ -140,14 +138,16 @@ static void
|
|||
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;
|
||||
|
@ -158,7 +158,6 @@ unmappedaddr(struct sockaddr_in6 *sin6, socklen_t *len)
|
|||
sin4->sin_len = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Get server response
|
||||
|
@ -199,17 +198,13 @@ ftp_chkerr(conn_t *conn)
|
|||
/*
|
||||
* 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);
|
||||
|
@ -231,40 +226,12 @@ ftp_cmd(conn_t *conn, const char *fmt, ...)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -291,6 +258,7 @@ ftp_pwd(conn_t *conn, char **pwd)
|
|||
{
|
||||
char *src, *dst, *end;
|
||||
int q;
|
||||
size_t len;
|
||||
|
||||
if (conn->err != FTP_WORKING_DIRECTORY &&
|
||||
conn->err != FTP_FILE_ACTION_OK)
|
||||
|
@ -299,7 +267,8 @@ ftp_pwd(conn_t *conn, char **pwd)
|
|||
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) {
|
||||
|
@ -330,7 +299,8 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
|||
{
|
||||
const char *beg, *end;
|
||||
char *pwd, *dst;
|
||||
int e, i, len;
|
||||
int e;
|
||||
size_t i, len;
|
||||
|
||||
if (*path != '/') {
|
||||
ftp_seterr(501);
|
||||
|
@ -360,18 +330,7 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
|||
} 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();
|
||||
|
@ -388,7 +347,7 @@ ftp_cwd(conn_t *conn, const char *path, int subdir)
|
|||
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. */
|
||||
|
@ -455,6 +414,7 @@ ftp_mode_type(conn_t *conn, int mode, int type)
|
|||
case 0:
|
||||
case 's':
|
||||
mode = 'S';
|
||||
/*FALLTHROUGH*/
|
||||
case 'S':
|
||||
break;
|
||||
default:
|
||||
|
@ -483,14 +443,17 @@ ftp_mode_type(conn_t *conn, int mode, int type)
|
|||
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:
|
||||
|
@ -510,7 +473,8 @@ ftp_stat(conn_t *conn, const char *file, struct url_stat *us)
|
|||
{
|
||||
char *ln;
|
||||
const char *filename;
|
||||
int filenamelen, type;
|
||||
size_t filenamelen;
|
||||
int type;
|
||||
struct tm tm;
|
||||
time_t t;
|
||||
int e;
|
||||
|
@ -598,7 +562,7 @@ static ssize_t
|
|||
ftp_readfn(void *v, void *buf, size_t len)
|
||||
{
|
||||
struct ftpio *io;
|
||||
int r;
|
||||
ssize_t r;
|
||||
|
||||
io = (struct ftpio *)v;
|
||||
if (io == NULL) {
|
||||
|
@ -631,7 +595,7 @@ static ssize_t
|
|||
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) {
|
||||
|
@ -665,7 +629,6 @@ static void
|
|||
ftp_closefn(void *v)
|
||||
{
|
||||
struct ftpio *io;
|
||||
int r;
|
||||
|
||||
io = (struct ftpio *)v;
|
||||
if (io == NULL) {
|
||||
|
@ -681,7 +644,7 @@ ftp_closefn(void *v)
|
|||
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;
|
||||
|
@ -722,7 +685,8 @@ ftp_transfer(conn_t *conn, const char *oper, const char *file, const char *op_ar
|
|||
} 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;
|
||||
|
@ -750,10 +714,8 @@ ftp_transfer(conn_t *conn, const char *oper, const char *file, const char *op_ar
|
|||
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:
|
||||
|
||||
|
@ -777,7 +739,6 @@ 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)
|
||||
|
@ -787,7 +748,6 @@ retry_mode:
|
|||
goto ouch;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
e = FTP_PROTOCOL_ERROR; /* XXX: error code should be prepared */
|
||||
goto ouch;
|
||||
|
@ -809,7 +769,7 @@ retry_mode:
|
|||
}
|
||||
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;
|
||||
|
@ -850,12 +810,9 @@ retry_mode:
|
|||
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);
|
||||
|
@ -864,7 +821,6 @@ retry_mode:
|
|||
memcpy(&u.sin6.sin6_port, addr + 19, 2);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case AF_INET:
|
||||
if (e == FTP_EPASSIVE_MODE)
|
||||
u.sin4.sin_port = htons(port);
|
||||
|
@ -906,29 +862,24 @@ retry_mode:
|
|||
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;
|
||||
|
@ -950,15 +901,13 @@ retry_mode:
|
|||
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));
|
||||
|
@ -966,20 +915,20 @@ retry_mode:
|
|||
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;
|
||||
|
@ -987,17 +936,10 @@ retry_mode:
|
|||
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)
|
||||
|
@ -1103,10 +1045,9 @@ ftp_connect(struct url *url, struct url *purl, const char *flags)
|
|||
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;
|
||||
|
||||
|
@ -1165,17 +1106,22 @@ static struct url *
|
|||
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);
|
||||
|
@ -1184,10 +1130,10 @@ ftp_get_proxy(struct url * url, const char *flags)
|
|||
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;
|
||||
}
|
||||
|
||||
/*
|
|
@ -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 $
|
||||
#
|
||||
# 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) 2003 Thomas Klausner <wiz@NetBSD.org>
|
||||
|
@ -68,15 +68,13 @@
|
|||
#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
|
||||
|
||||
|
@ -87,7 +85,7 @@
|
|||
#include <errno.h>
|
||||
#include <locale.h>
|
||||
#include <stdarg.h>
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat/stdio.h>
|
||||
#else
|
||||
#include <stdio.h>
|
||||
|
@ -100,7 +98,7 @@
|
|||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
#if !defined(NETBSD) && !defined(__minix)
|
||||
#ifndef NETBSD
|
||||
#include <nbcompat/netdb.h>
|
||||
#else
|
||||
#include <netdb.h>
|
||||
|
@ -108,6 +106,7 @@
|
|||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "fetch.h"
|
||||
#include "common.h"
|
||||
#include "httperr.h"
|
||||
|
||||
|
@ -134,7 +133,6 @@
|
|||
|
||||
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
|
||||
|
||||
#define MINBUFSIZE 4096
|
||||
|
||||
/*****************************************************************************
|
||||
* I/O functions for decoding chunked streams
|
||||
|
@ -148,7 +146,7 @@ struct httpio
|
|||
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 */
|
||||
|
@ -158,7 +156,7 @@ struct httpio
|
|||
/*
|
||||
* Get next chunk header
|
||||
*/
|
||||
static int
|
||||
static ssize_t
|
||||
http_new_chunk(struct httpio *io)
|
||||
{
|
||||
char *p;
|
||||
|
@ -207,7 +205,7 @@ http_growbuf(struct httpio *io, size_t len)
|
|||
/*
|
||||
* 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)
|
||||
|
@ -288,7 +286,7 @@ http_readfn(void *v, void *buf, size_t len)
|
|||
|
||||
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;
|
||||
|
@ -327,7 +325,7 @@ http_closefn(void *v)
|
|||
|
||||
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;
|
||||
|
@ -406,17 +404,13 @@ static struct {
|
|||
/*
|
||||
* 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);
|
||||
|
@ -438,35 +432,7 @@ http_cmd(conn_t *conn, const char *fmt, ...)
|
|||
|
||||
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
|
||||
*/
|
||||
|
@ -638,7 +604,7 @@ http_base64(const char *src)
|
|||
"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)
|
||||
|
@ -685,7 +651,6 @@ http_base64(const char *src)
|
|||
/*
|
||||
* Encode username and password
|
||||
*/
|
||||
#ifndef __minix
|
||||
static int
|
||||
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);
|
||||
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
|
||||
*/
|
||||
|
@ -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);
|
||||
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");
|
||||
|
||||
/*
|
||||
|
@ -1019,7 +962,7 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
|
|||
#endif
|
||||
val = 1;
|
||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val,
|
||||
sizeof(val));
|
||||
(socklen_t)sizeof(val));
|
||||
|
||||
/* get reply */
|
||||
switch (http_get_reply(conn)) {
|
||||
|
@ -1295,7 +1238,8 @@ fetchGetHTTP(struct url *URL, const char *flags)
|
|||
* 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);
|
||||
|
@ -1487,7 +1431,8 @@ static struct http_index_cache *index_cache;
|
|||
* 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];
|
|
@ -1,5 +1,5 @@
|
|||
# $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.
|
||||
#
|
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/libdevman \
|
||||
../minix/lib/libexec \
|
||||
../minix/lib/libfetch \
|
||||
../minix/lib/libfsdriver \
|
||||
../minix/lib/libinputdriver \
|
||||
../minix/lib/libminc \
|
||||
|
@ -248,7 +247,7 @@ SUBDIR+= ../crypto/external/bsd/netpgp/lib # depends on libcrypto, ...
|
|||
.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, ...
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
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>
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@ SUBDIR+= libchardriver
|
|||
SUBDIR+= libddekit
|
||||
SUBDIR+= libdevman
|
||||
SUBDIR+= libexec
|
||||
SUBDIR+= libfetch
|
||||
SUBDIR+= libfsdriver
|
||||
SUBDIR+= libinputdriver
|
||||
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