summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libfetch/Makefile38
-rw-r--r--lib/libfetch/common.c13
-rw-r--r--lib/libfetch/common.h20
-rw-r--r--lib/libfetch/ftp.c58
-rw-r--r--lib/libfetch/http.c42
5 files changed, 101 insertions, 70 deletions
diff --git a/lib/libfetch/Makefile b/lib/libfetch/Makefile
index f717bb0..0039819 100644
--- a/lib/libfetch/Makefile
+++ b/lib/libfetch/Makefile
@@ -2,7 +2,8 @@
MAINTAINER= des@freebsd.org
LIB= fetch
-CFLAGS+= -I. -Wall -pedantic
+WARNS?= 2
+CFLAGS+= -I.
CFLAGS+= -DINET6
.if !defined(DEBUG)
CFLAGS+= -DNDEBUG
@@ -38,12 +39,33 @@ httperr.h: http.errors
@echo " { -1, FETCH_UNKNOWN, \"Unknown HTTP error\" }" >> ${.TARGET}
@echo "};" >> ${.TARGET}
-.for MP in fetchFreeURL fetchGet fetchGetFTP fetchGetFile fetchGetHTTP \
-fetchGetURL fetchList fetchListFTP fetchListFile fetchListHTTP fetchListURL \
-fetchMakeURL fetchParseURL fetchPut fetchPutFTP fetchPutFile fetchPutHTTP \
-fetchPutURL fetchStat fetchStatFTP fetchStatFile fetchStatHTTP fetchStatURL \
-fetchXGet fetchXGetFTP fetchXGetFile fetchXGetHTTP fetchXGetURL
-MLINKS+= fetch.3 ${MP}.3
-.endfor
+MLINKS+= fetch.3 fetchFreeURL.3
+MLINKS+= fetch.3 fetchGet.3
+MLINKS+= fetch.3 fetchGetFTP.3
+MLINKS+= fetch.3 fetchGetFile.3
+MLINKS+= fetch.3 fetchGetHTTP.3
+MLINKS+= fetch.3 fetchGetURL.3
+MLINKS+= fetch.3 fetchList.3
+MLINKS+= fetch.3 fetchListFTP.3
+MLINKS+= fetch.3 fetchListFile.3
+MLINKS+= fetch.3 fetchListHTTP.3
+MLINKS+= fetch.3 fetchListURL.3
+MLINKS+= fetch.3 fetchMakeURL.3
+MLINKS+= fetch.3 fetchParseURL.3
+MLINKS+= fetch.3 fetchPut.3
+MLINKS+= fetch.3 fetchPutFTP.3
+MLINKS+= fetch.3 fetchPutFile.3
+MLINKS+= fetch.3 fetchPutHTTP.3
+MLINKS+= fetch.3 fetchPutURL.3
+MLINKS+= fetch.3 fetchStat.3
+MLINKS+= fetch.3 fetchStatFTP.3
+MLINKS+= fetch.3 fetchStatFile.3
+MLINKS+= fetch.3 fetchStatHTTP.3
+MLINKS+= fetch.3 fetchStatURL.3
+MLINKS+= fetch.3 fetchXGet.3
+MLINKS+= fetch.3 fetchXGetFTP.3
+MLINKS+= fetch.3 fetchXGetFile.3
+MLINKS+= fetch.3 fetchXGetHTTP.3
+MLINKS+= fetch.3 fetchXGetURL.3
.include <bsd.lib.mk>
diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c
index d42db19..c502e1c 100644
--- a/lib/libfetch/common.c
+++ b/lib/libfetch/common.c
@@ -340,13 +340,16 @@ _fetch_putln(int fd, const char *str, size_t len)
ssize_t wlen;
/* XXX should enforce timeout */
- iov[0].iov_base = (char *)str;
+ (const char *)iov[0].iov_base = str; /* XXX */
iov[0].iov_len = len;
- iov[1].iov_base = (char *)ENDL;
+ (const char *)iov[1].iov_base = ENDL; /* XXX */
iov[1].iov_len = sizeof ENDL;
+ len += sizeof ENDL;
wlen = writev(fd, iov, 2);
+ if (wlen < 0 || (size_t)wlen != len)
+ return -1;
DEBUG(fprintf(stderr, "\033[1m>>> %s\n\033[m", str));
- return (wlen != len);
+ return 0;
}
@@ -354,7 +357,7 @@ _fetch_putln(int fd, const char *str, size_t len)
int
_fetch_add_entry(struct url_ent **p, int *size, int *len,
- const char *name, struct url_stat *stat)
+ const char *name, struct url_stat *us)
{
struct url_ent *tmp;
@@ -383,7 +386,7 @@ _fetch_add_entry(struct url_ent **p, int *size, int *len,
tmp = *p + *len;
snprintf(tmp->name, PATH_MAX, "%s", name);
- bcopy(stat, &tmp->stat, sizeof *stat);
+ bcopy(us, &tmp->stat, sizeof *us);
(*len)++;
(++tmp)->name[0] = 0;
diff --git a/lib/libfetch/common.h b/lib/libfetch/common.h
index 0c67b28..f869eb8 100644
--- a/lib/libfetch/common.h
+++ b/lib/libfetch/common.h
@@ -42,16 +42,16 @@ struct fetcherr {
const char *string;
};
-void _fetch_seterr(struct fetcherr *p, int e);
+void _fetch_seterr(struct fetcherr *, int);
void _fetch_syserr(void);
-void _fetch_info(const char *fmt, ...);
+void _fetch_info(const char *, ...);
int _fetch_default_port(const char *);
int _fetch_default_proxy_port(const char *);
-int _fetch_connect(const char *host, int port, int af, int verbose);
-int _fetch_getln(int fd, char **buf, size_t *size, size_t *len);
-int _fetch_putln(int fd, const char *str, size_t len);
-int _fetch_add_entry(struct url_ent **p, int *size, int *len,
- const char *name, struct url_stat *stat);
+int _fetch_connect(const char *, int, int, int);
+int _fetch_getln(int, char **, size_t *, size_t *);
+int _fetch_putln(int, const char *, size_t);
+int _fetch_add_entry(struct url_ent **, int *, int *,
+ const char *, struct url_stat *);
#define _ftp_seterr(n) _fetch_seterr(_ftp_errlist, n)
#define _http_seterr(n) _fetch_seterr(_http_errlist, n)
@@ -72,9 +72,9 @@ int _fetch_add_entry(struct url_ent **p, int *size, int *len,
* Note that _http_request() frees purl, which is way ugly but saves us a
* whole lot of trouble.
*/
-FILE *_http_request(struct url *URL, const char *op,
- struct url_stat *us, struct url *purl,
- const char *flags);
+FILE *_http_request(struct url *, const char *,
+ struct url_stat *, struct url *,
+ const char *);
/*
* Check whether a particular flag is set
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
index ac3128e..5ba9a27 100644
--- a/lib/libfetch/ftp.c
+++ b/lib/libfetch/ftp.c
@@ -267,7 +267,7 @@ _ftp_stat(int cd, const char *file, struct url_stat *us)
}
if (us->size == 0)
us->size = -1;
- DEBUG(fprintf(stderr, "size: [\033[1m%lld\033[m]\n", us->size));
+ DEBUG(fprintf(stderr, "size: [\033[1m%lld\033[m]\n", (long long)us->size));
if ((e = _ftp_cmd(cd, "MDTM %s", s)) != FTP_FILE_STATUS) {
_ftp_seterr(e);
@@ -385,7 +385,7 @@ _ftp_writefn(void *v, const char *buf, int len)
}
static fpos_t
-_ftp_seekfn(void *v, fpos_t pos, int whence)
+_ftp_seekfn(void *v, fpos_t pos __unused, int whence __unused)
{
struct ftpio *io;
@@ -450,7 +450,7 @@ static FILE *
_ftp_transfer(int cd, const char *oper, const char *file,
int mode, off_t offset, const char *flags)
{
- struct sockaddr_storage sin;
+ struct sockaddr_storage sa;
struct sockaddr_in6 *sin6;
struct sockaddr_in *sin4;
int low, pasv, verbose;
@@ -470,14 +470,14 @@ _ftp_transfer(int cd, const char *oper, const char *file,
strncasecmp(s, "no", 2) != 0);
/* find our own address, bind, and listen */
- l = sizeof sin;
- if (getsockname(cd, (struct sockaddr *)&sin, &l) == -1)
+ l = sizeof sa;
+ if (getsockname(cd, (struct sockaddr *)&sa, &l) == -1)
goto sysouch;
- if (sin.ss_family == AF_INET6)
- unmappedaddr((struct sockaddr_in6 *)&sin);
+ if (sa.ss_family == AF_INET6)
+ unmappedaddr((struct sockaddr_in6 *)&sa);
/* open data socket */
- if ((sd = socket(sin.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
+ if ((sd = socket(sa.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
_fetch_syserr();
return NULL;
}
@@ -485,13 +485,13 @@ _ftp_transfer(int cd, const char *oper, const char *file,
if (pasv) {
u_char addr[64];
char *ln, *p;
- int i;
+ unsigned int i;
int port;
/* send PASV command */
if (verbose)
_fetch_info("setting passive mode");
- switch (sin.ss_family) {
+ switch (sa.ss_family) {
case AF_INET:
if ((e = _ftp_cmd(cd, "PASV")) != FTP_PASSIVE_MODE)
goto ouch;
@@ -555,14 +555,14 @@ _ftp_transfer(int cd, const char *oper, const char *file,
goto sysouch;
/* construct sockaddr for data socket */
- l = sizeof sin;
- if (getpeername(cd, (struct sockaddr *)&sin, &l) == -1)
+ l = sizeof sa;
+ if (getpeername(cd, (struct sockaddr *)&sa, &l) == -1)
goto sysouch;
- if (sin.ss_family == AF_INET6)
- unmappedaddr((struct sockaddr_in6 *)&sin);
- switch (sin.ss_family) {
+ if (sa.ss_family == AF_INET6)
+ unmappedaddr((struct sockaddr_in6 *)&sa);
+ switch (sa.ss_family) {
case AF_INET6:
- sin6 = (struct sockaddr_in6 *)&sin;
+ sin6 = (struct sockaddr_in6 *)&sa;
if (e == FTP_EPASSIVE_MODE)
sin6->sin6_port = htons(port);
else {
@@ -571,7 +571,7 @@ _ftp_transfer(int cd, const char *oper, const char *file,
}
break;
case AF_INET:
- sin4 = (struct sockaddr_in *)&sin;
+ sin4 = (struct sockaddr_in *)&sa;
if (e == FTP_EPASSIVE_MODE)
sin4->sin_port = htons(port);
else {
@@ -587,7 +587,7 @@ _ftp_transfer(int cd, const char *oper, const char *file,
/* connect to data port */
if (verbose)
_fetch_info("opening data connection");
- if (connect(sd, (struct sockaddr *)&sin, sin.ss_len) == -1)
+ if (connect(sd, (struct sockaddr *)&sa, sa.ss_len) == -1)
goto sysouch;
/* make the server initiate the transfer */
@@ -604,9 +604,9 @@ _ftp_transfer(int cd, const char *oper, const char *file,
char *ap;
char hname[INET6_ADDRSTRLEN];
- switch (sin.ss_family) {
+ switch (sa.ss_family) {
case AF_INET6:
- ((struct sockaddr_in6 *)&sin)->sin6_port = 0;
+ ((struct sockaddr_in6 *)&sa)->sin6_port = 0;
#ifdef IPV6_PORTRANGE
arg = low ? IPV6_PORTRANGE_DEFAULT : IPV6_PORTRANGE_HIGH;
if (setsockopt(sd, IPPROTO_IPV6, IPV6_PORTRANGE,
@@ -615,7 +615,7 @@ _ftp_transfer(int cd, const char *oper, const char *file,
#endif
break;
case AF_INET:
- ((struct sockaddr_in *)&sin)->sin_port = 0;
+ ((struct sockaddr_in *)&sa)->sin_port = 0;
arg = low ? IP_PORTRANGE_DEFAULT : IP_PORTRANGE_HIGH;
if (setsockopt(sd, IPPROTO_IP, IP_PORTRANGE,
(char *)&arg, sizeof arg) == -1)
@@ -624,17 +624,17 @@ _ftp_transfer(int cd, const char *oper, const char *file,
}
if (verbose)
_fetch_info("binding data socket");
- if (bind(sd, (struct sockaddr *)&sin, sin.ss_len) == -1)
+ if (bind(sd, (struct sockaddr *)&sa, sa.ss_len) == -1)
goto sysouch;
if (listen(sd, 1) == -1)
goto sysouch;
/* find what port we're on and tell the server */
- if (getsockname(sd, (struct sockaddr *)&sin, &l) == -1)
+ if (getsockname(sd, (struct sockaddr *)&sa, &l) == -1)
goto sysouch;
- switch (sin.ss_family) {
+ switch (sa.ss_family) {
case AF_INET:
- sin4 = (struct sockaddr_in *)&sin;
+ sin4 = (struct sockaddr_in *)&sa;
a = ntohl(sin4->sin_addr.s_addr);
p = ntohs(sin4->sin_port);
e = _ftp_cmd(cd, "PORT %d,%d,%d,%d,%d,%d",
@@ -645,8 +645,8 @@ _ftp_transfer(int cd, const char *oper, const char *file,
case AF_INET6:
#define UC(b) (((int)b)&0xff)
e = -1;
- sin6 = (struct sockaddr_in6 *)&sin;
- if (getnameinfo((struct sockaddr *)&sin, sin.ss_len,
+ sin6 = (struct sockaddr_in6 *)&sa;
+ if (getnameinfo((struct sockaddr *)&sa, sa.ss_len,
hname, sizeof(hname),
NULL, 0, NI_NUMERICHOST) == 0) {
e = _ftp_cmd(cd, "EPRT |%d|%s|%d|", 2, hname,
@@ -718,7 +718,7 @@ ouch:
static int
_ftp_authenticate(int cd, struct url *url, struct url *purl)
{
- char *user, *pwd, *logname;
+ const char *user, *pwd, *logname;
char pbuf[MAXHOSTNAMELEN + MAXLOGNAME + 1];
int e, len;
@@ -1028,7 +1028,7 @@ fetchStatFTP(struct url *url, struct url_stat *us, const char *flags)
* List a directory
*/
struct url_ent *
-fetchListFTP(struct url *url, const char *flags)
+fetchListFTP(struct url *url __unused, const char *flags __unused)
{
warnx("fetchListFTP(): not implemented");
return NULL;
diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c
index cb37906..ba0bdf8 100644
--- a/lib/libfetch/http.c
+++ b/lib/libfetch/http.c
@@ -110,13 +110,13 @@ struct cookie
int fd;
char *buf;
size_t b_size;
- size_t b_len;
+ ssize_t b_len;
int b_pos;
int eof;
int error;
- long chunksize;
+ size_t chunksize;
#ifndef NDEBUG
- long total;
+ size_t total;
#endif
};
@@ -149,7 +149,8 @@ _http_new_chunk(struct cookie *c)
"end of last chunk\033[m\n");
else
fprintf(stderr, "\033[1m_http_fillbuf(): "
- "new chunk: %ld (%ld)\033[m\n", c->chunksize, c->total);
+ "new chunk: %lu (%lu)\033[m\n",
+ (unsigned long)c->chunksize, (unsigned long)c->total);
#endif
return c->chunksize;
@@ -297,11 +298,11 @@ typedef enum {
hdr_location,
hdr_transfer_encoding,
hdr_www_authenticate
-} hdr;
+} hdr_t;
/* Names of interesting headers */
static struct {
- hdr num;
+ hdr_t num;
const char *name;
} hdr_names[] = {
{ hdr_content_length, "Content-Length" },
@@ -404,7 +405,7 @@ _http_match(const char *str, const char *hdr)
/*
* Get the next header and return the appropriate symbolic code.
*/
-static hdr
+static hdr_t
_http_next_header(int fd, const char **p)
{
int i;
@@ -462,7 +463,10 @@ _http_parse_length(const char *p, off_t *length)
for (len = 0; *p && isdigit(*p); ++p)
len = len * 10 + (*p - '0');
- DEBUG(fprintf(stderr, "content length: [\033[1m%lld\033[m]\n", len));
+ if (*p)
+ return -1;
+ DEBUG(fprintf(stderr, "content length: [\033[1m%lld\033[m]\n",
+ (long long)len));
*length = len;
return 0;
}
@@ -473,7 +477,7 @@ _http_parse_length(const char *p, off_t *length)
static int
_http_parse_range(const char *p, off_t *offset, off_t *length, off_t *size)
{
- int first, last, len;
+ off_t first, last, len;
if (strncasecmp(p, "bytes ", 6) != 0)
return -1;
@@ -487,10 +491,10 @@ _http_parse_range(const char *p, off_t *offset, off_t *length, off_t *size)
return -1;
for (len = 0, ++p; *p && isdigit(*p); ++p)
len = len * 10 + *p - '0';
- if (len < last - first + 1)
+ if (*p || len < last - first + 1)
return -1;
- DEBUG(fprintf(stderr, "content range: [\033[1m%d-%d/%d\033[m]\n",
- first, last, len));
+ DEBUG(fprintf(stderr, "content range: [\033[1m%lld-%lld/%lld\033[m]\n",
+ (long long)first, (long long)last, (long long)len));
*offset = first;
*length = last - first + 1;
*size = len;
@@ -688,7 +692,7 @@ _http_request(struct url *URL, const char *op, struct url_stat *us,
time_t mtime;
const char *p;
FILE *f;
- hdr h;
+ hdr_t h;
char *host;
#ifdef INET6
char hbuf[MAXHOSTNAMELEN + 1];
@@ -783,7 +787,7 @@ _http_request(struct url *URL, const char *op, struct url_stat *us,
else
_http_cmd(fd, "User-Agent: %s " _LIBFETCH_VER, __progname);
if (url->offset)
- _http_cmd(fd, "Range: bytes=%lld-", url->offset);
+ _http_cmd(fd, "Range: bytes=%lld-", (long long)url->offset);
_http_cmd(fd, "Connection: close");
_http_cmd(fd, "");
@@ -921,8 +925,10 @@ _http_request(struct url *URL, const char *op, struct url_stat *us,
goto ouch;
}
- DEBUG(fprintf(stderr, "offset %lld, length %lld, size %lld, clength %lld\n",
- offset, length, size, clength));
+ DEBUG(fprintf(stderr, "offset %lld, length %lld,"
+ " size %lld, clength %lld\n",
+ (long long)offset, (long long)length,
+ (long long)size, (long long)clength));
/* check for inconsistencies */
if (clength != -1 && length != -1 && clength != length) {
@@ -1006,7 +1012,7 @@ fetchGetHTTP(struct url *URL, const char *flags)
* Store a file by HTTP
*/
FILE *
-fetchPutHTTP(struct url *URL, const char *flags)
+fetchPutHTTP(struct url *URL __unused, const char *flags __unused)
{
warnx("fetchPutHTTP(): not implemented");
return NULL;
@@ -1030,7 +1036,7 @@ fetchStatHTTP(struct url *URL, struct url_stat *us, const char *flags)
* List a directory
*/
struct url_ent *
-fetchListHTTP(struct url *url, const char *flags)
+fetchListHTTP(struct url *url __unused, const char *flags __unused)
{
warnx("fetchListHTTP(): not implemented");
return NULL;
OpenPOWER on IntegriCloud