[Midnightbsd-cvs] src [6459] U trunk/lib/libfetch: upgrade libfetch
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Tue Dec 3 22:45:16 EST 2013
Revision: 6459
http://svnweb.midnightbsd.org/src/?rev=6459
Author: laffer1
Date: 2013-12-03 22:45:15 -0500 (Tue, 03 Dec 2013)
Log Message:
-----------
upgrade libfetch
Modified Paths:
--------------
trunk/lib/libfetch/Makefile
trunk/lib/libfetch/common.c
trunk/lib/libfetch/common.h
trunk/lib/libfetch/fetch.3
trunk/lib/libfetch/fetch.c
trunk/lib/libfetch/fetch.h
trunk/lib/libfetch/file.c
trunk/lib/libfetch/ftp.c
trunk/lib/libfetch/http.c
Property Changed:
----------------
trunk/lib/libfetch/Makefile
trunk/lib/libfetch/common.c
trunk/lib/libfetch/common.h
trunk/lib/libfetch/fetch.3
trunk/lib/libfetch/fetch.c
trunk/lib/libfetch/fetch.h
trunk/lib/libfetch/file.c
trunk/lib/libfetch/ftp.c
trunk/lib/libfetch/ftp.errors
trunk/lib/libfetch/http.c
trunk/lib/libfetch/http.errors
Modified: trunk/lib/libfetch/Makefile
===================================================================
--- trunk/lib/libfetch/Makefile 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/Makefile 2013-12-04 03:45:15 UTC (rev 6459)
@@ -27,7 +27,7 @@
CSTD?= c99
-SHLIB_MAJOR= 5
+SHLIB_MAJOR= 6
ftperr.h: ftp.errors ${.CURDIR}/Makefile
@echo "static struct fetcherr ftp_errlist[] = {" > ${.TARGET}
Property changes on: trunk/lib/libfetch/Makefile
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.4
\ No newline at end of property
Modified: trunk/lib/libfetch/common.c
===================================================================
--- trunk/lib/libfetch/common.c 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/common.c 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2011 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2011 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -209,11 +209,13 @@
fetch_reopen(int sd)
{
conn_t *conn;
+ int opt = 1;
/* allocate and fill connection structure */
if ((conn = calloc(1, sizeof(*conn))) == NULL)
return (NULL);
fcntl(sd, F_SETFD, FD_CLOEXEC);
+ setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof opt);
conn->sd = sd;
++conn->ref;
return (conn);
@@ -404,6 +406,33 @@
}
#endif
+/*
+ * Cache some data that was read from a socket but cannot be immediately
+ * returned because of an interrupted system call.
+ */
+static int
+fetch_cache_data(conn_t *conn, char *src, size_t nbytes)
+{
+ char *tmp;
+
+ if (conn->cache.size < nbytes) {
+ tmp = realloc(conn->cache.buf, nbytes);
+ if (tmp == NULL) {
+ fetch_syserr();
+ return (-1);
+ }
+ conn->cache.buf = tmp;
+ conn->cache.size = nbytes;
+ }
+
+ memcpy(conn->cache.buf, src, nbytes);
+ conn->cache.len = nbytes;
+ conn->cache.pos = 0;
+
+ return (0);
+}
+
+
static ssize_t
fetch_socket_read(int sd, char *buf, size_t len)
{
@@ -428,15 +457,32 @@
struct timeval now, timeout, delta;
fd_set readfds;
ssize_t rlen, total;
- int r;
+ char *start;
- if (fetchTimeout) {
- FD_ZERO(&readfds);
+ if (fetchTimeout > 0) {
gettimeofday(&timeout, NULL);
timeout.tv_sec += fetchTimeout;
}
total = 0;
+ start = buf;
+
+ if (conn->cache.len > 0) {
+ /*
+ * The last invocation of fetch_read was interrupted by a
+ * signal after some data had been read from the socket. Copy
+ * the cached data into the supplied buffer before trying to
+ * read from the socket again.
+ */
+ total = (conn->cache.len < len) ? conn->cache.len : len;
+ memcpy(buf, conn->cache.buf, total);
+
+ conn->cache.len -= total;
+ conn->cache.pos += total;
+ len -= total;
+ buf += total;
+ }
+
while (len > 0) {
/*
* The socket is non-blocking. Instead of the canonical
@@ -472,28 +518,32 @@
total += rlen;
continue;
} else if (rlen == FETCH_READ_ERROR) {
+ if (errno == EINTR)
+ fetch_cache_data(conn, start, total);
return (-1);
}
// assert(rlen == FETCH_READ_WAIT);
- while (fetchTimeout && !FD_ISSET(conn->sd, &readfds)) {
+ FD_ZERO(&readfds);
+ while (!FD_ISSET(conn->sd, &readfds)) {
FD_SET(conn->sd, &readfds);
- gettimeofday(&now, NULL);
- delta.tv_sec = timeout.tv_sec - now.tv_sec;
- delta.tv_usec = timeout.tv_usec - now.tv_usec;
- if (delta.tv_usec < 0) {
- delta.tv_usec += 1000000;
- delta.tv_sec--;
+ if (fetchTimeout > 0) {
+ gettimeofday(&now, NULL);
+ if (!timercmp(&timeout, &now, >)) {
+ errno = ETIMEDOUT;
+ fetch_syserr();
+ return (-1);
+ }
+ timersub(&timeout, &now, &delta);
}
- if (delta.tv_sec < 0) {
- errno = ETIMEDOUT;
- fetch_syserr();
- return (-1);
- }
errno = 0;
- r = select(conn->sd + 1, &readfds, NULL, NULL, &delta);
- if (r == -1) {
- if (errno == EINTR && fetchRestartCalls)
- continue;
+ if (select(conn->sd + 1, &readfds, NULL, NULL,
+ fetchTimeout > 0 ? &delta : NULL) < 0) {
+ if (errno == EINTR) {
+ if (fetchRestartCalls)
+ continue;
+ /* Save anything that was read. */
+ fetch_cache_data(conn, start, total);
+ }
fetch_syserr();
return (-1);
}
@@ -677,6 +727,7 @@
if (--conn->ref > 0)
return (0);
ret = close(conn->sd);
+ free(conn->cache.buf);
free(conn->buf);
free(conn);
return (ret);
Property changes on: trunk/lib/libfetch/common.c
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/common.h
===================================================================
--- trunk/lib/libfetch/common.h 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/common.h 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2011 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2011 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -52,6 +52,13 @@
size_t bufsize; /* buffer size */
size_t buflen; /* length of buffer contents */
int err; /* last protocol reply code */
+ struct { /* data cached after an interrupted
+ read */
+ char *buf;
+ size_t size;
+ size_t pos;
+ size_t len;
+ } cache;
#ifdef WITH_SSL
SSL *ssl; /* SSL handle */
SSL_CTX *ssl_ctx; /* SSL context */
Property changes on: trunk/lib/libfetch/common.h
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/fetch.3
===================================================================
--- trunk/lib/libfetch/fetch.3 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/fetch.3 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
.\"-
-.\" Copyright (c) 1998-2011 Dag-Erling Sm\xF8rgrav
+.\" Copyright (c) 1998-2011 Dag-Erling Smørgrav
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -375,7 +375,7 @@
(if-modified-since) flag is specified, and
the
.Va ims_time
-field is set in
+field is set in
.Vt "struct url" ,
then
.Fn fetchXGetHTTP
Property changes on: trunk/lib/libfetch/fetch.3
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/lib/libfetch/fetch.c
===================================================================
--- trunk/lib/libfetch/fetch.c 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/fetch.c 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2004 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2004 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -289,6 +289,49 @@
}
/*
+ * Return value of the given hex digit.
+ */
+static int
+fetch_hexval(char ch)
+{
+
+ if (ch >= '0' && ch <= '9')
+ return (ch - '0');
+ else if (ch >= 'a' && ch <= 'f')
+ return (ch - 'a' + 10);
+ else if (ch >= 'A' && ch <= 'F')
+ return (ch - 'A' + 10);
+ return (-1);
+}
+
+/*
+ * Decode percent-encoded URL component from src into dst, stopping at end
+ * of string, or at @ or : separators. Returns a pointer to the unhandled
+ * part of the input string (null terminator, @, or :). No terminator is
+ * written to dst (it is the caller's responsibility).
+ */
+static const char *
+fetch_pctdecode(char *dst, const char *src, size_t dlen)
+{
+ int d1, d2;
+ char c;
+ const char *s;
+
+ for (s = src; *s != '\0' && *s != '@' && *s != ':'; s++) {
+ if (s[0] == '%' && (d1 = fetch_hexval(s[1])) >= 0 &&
+ (d2 = fetch_hexval(s[2])) >= 0 && (d1 > 0 || d2 > 0)) {
+ c = d1 << 4 | d2;
+ s += 2;
+ } else {
+ c = *s;
+ }
+ if (dlen-- > 0)
+ *dst++ = c;
+ }
+ return (s);
+}
+
+/*
* Split an URL into components. URL syntax is:
* [method:/][/[user[:pwd]@]host[:port]/][document]
* This almost, but not quite, RFC1738 URL syntax.
@@ -329,15 +372,11 @@
p = strpbrk(URL, "/@");
if (p && *p == '@') {
/* username */
- for (q = URL, i = 0; (*q != ':') && (*q != '@'); q++)
- if (i < URL_USERLEN)
- u->user[i++] = *q;
+ q = fetch_pctdecode(u->user, URL, URL_USERLEN);
/* password */
if (*q == ':')
- for (q++, i = 0; (*q != ':') && (*q != '@'); q++)
- if (i < URL_PWDLEN)
- u->pwd[i++] = *q;
+ q = fetch_pctdecode(u->pwd, ++q, URL_PWDLEN);
p++;
} else {
Property changes on: trunk/lib/libfetch/fetch.c
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/fetch.h
===================================================================
--- trunk/lib/libfetch/fetch.h 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/fetch.h 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2004 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2004 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Property changes on: trunk/lib/libfetch/fetch.h
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/file.c
===================================================================
--- trunk/lib/libfetch/file.c 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/file.c 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2011 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2011 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Property changes on: trunk/lib/libfetch/file.c
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/ftp.c
===================================================================
--- trunk/lib/libfetch/ftp.c 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/ftp.c 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2011 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 1998-2011 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,7 +41,7 @@
*
* Major Changelog:
*
- * Dag-Erling Co\xEFdan Sm\xF8rgrav
+ * Dag-Erling Smørgrav
* 9 Jun 1998
*
* Incorporated into libfetch
Property changes on: trunk/lib/libfetch/ftp.c
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.4
\ No newline at end of property
Index: trunk/lib/libfetch/ftp.errors
===================================================================
--- trunk/lib/libfetch/ftp.errors 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/ftp.errors 2013-12-04 03:45:15 UTC (rev 6459)
Property changes on: trunk/lib/libfetch/ftp.errors
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Modified: trunk/lib/libfetch/http.c
===================================================================
--- trunk/lib/libfetch/http.c 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/http.c 2013-12-04 03:45:15 UTC (rev 6459)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2000-2011 Dag-Erling Sm\xF8rgrav
+ * Copyright (c) 2000-2011 Dag-Erling Smørgrav
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -196,6 +196,8 @@
static int
http_fillbuf(struct httpio *io, size_t len)
{
+ ssize_t nbytes;
+
if (io->error)
return (-1);
if (io->eof)
@@ -204,10 +206,11 @@
if (io->chunked == 0) {
if (http_growbuf(io, len) == -1)
return (-1);
- if ((io->buflen = fetch_read(io->conn, io->buf, len)) == -1) {
- io->error = 1;
+ if ((nbytes = fetch_read(io->conn, io->buf, len)) == -1) {
+ io->error = errno;
return (-1);
}
+ io->buflen = nbytes;
io->bufpos = 0;
return (io->buflen);
}
@@ -227,10 +230,11 @@
len = io->chunksize;
if (http_growbuf(io, len) == -1)
return (-1);
- if ((io->buflen = fetch_read(io->conn, io->buf, len)) == -1) {
- io->error = 1;
+ if ((nbytes = fetch_read(io->conn, io->buf, len)) == -1) {
+ io->error = errno;
return (-1);
}
+ io->buflen = nbytes;
io->chunksize -= io->buflen;
if (io->chunksize == 0) {
@@ -272,8 +276,11 @@
io->bufpos += l;
}
- if (!pos && io->error)
+ if (!pos && io->error) {
+ if (io->error == EINTR)
+ io->error = 0;
return (-1);
+ }
return (pos);
}
@@ -1652,7 +1659,7 @@
if ((p = getenv("HTTP_USER_AGENT")) != NULL && *p != '\0')
http_cmd(conn, "User-Agent: %s", p);
else
- http_cmd(conn, "User-Agent: %s (MidnightBSD) " _LIBFETCH_VER, getprogname());
+ http_cmd(conn, "User-Agent: %s " _LIBFETCH_VER, getprogname());
if (url->offset > 0)
http_cmd(conn, "Range: bytes=%lld-", (long long)url->offset);
http_cmd(conn, "Connection: close");
@@ -1772,7 +1779,9 @@
DEBUG(fprintf(stderr, "failed to parse new URL\n"));
goto ouch;
}
- if (!*new->user && !*new->pwd) {
+
+ /* Only copy credentials if the host matches */
+ if (!strcmp(new->host, url->host) && !*new->user && !*new->pwd) {
strcpy(new->user, url->user);
strcpy(new->pwd, url->pwd);
}
Property changes on: trunk/lib/libfetch/http.c
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.4
\ No newline at end of property
Index: trunk/lib/libfetch/http.errors
===================================================================
--- trunk/lib/libfetch/http.errors 2013-12-04 03:37:56 UTC (rev 6458)
+++ trunk/lib/libfetch/http.errors 2013-12-04 03:45:15 UTC (rev 6459)
Property changes on: trunk/lib/libfetch/http.errors
___________________________________________________________________
Deleted: cvs2svn:cvs-rev
## -1 +0,0 ##
-1.3
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
More information about the Midnightbsd-cvs
mailing list