Fix `pkg_add -r' by backing out revs 1.34-1.38.

Revs 1.37-8 produce a bus error in some environments.
Revs 1.34-6 do not bus error, but write corrupted files.
This commit is contained in:
David E. O'Brien 2002-10-29 12:17:43 +00:00
parent 8758ef9b41
commit b68fbebd5a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106137

View File

@ -347,6 +347,8 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
ssize_t rlen, total; ssize_t rlen, total;
int r; int r;
rlen = 0;
if (fetchTimeout) { if (fetchTimeout) {
FD_ZERO(&readfds); FD_ZERO(&readfds);
gettimeofday(&timeout, NULL); gettimeofday(&timeout, NULL);
@ -364,17 +366,13 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
wait.tv_usec += 1000000; wait.tv_usec += 1000000;
wait.tv_sec--; wait.tv_sec--;
} }
if (wait.tv_sec < 0) { if (wait.tv_sec < 0)
errno = ETIMEDOUT; return (rlen);
_fetch_syserr();
return (-1);
}
errno = 0; errno = 0;
r = select(conn->sd + 1, &readfds, NULL, NULL, &wait); r = select(conn->sd + 1, &readfds, NULL, NULL, &wait);
if (r == -1) { if (r == -1) {
if (errno == EINTR && fetchRestartCalls) if (errno == EINTR && fetchRestartCalls)
continue; continue;
_fetch_syserr();
return (-1); return (-1);
} }
} }
@ -395,12 +393,6 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
buf += rlen; buf += rlen;
total += rlen; total += rlen;
} }
if (total == 0 && len != 0) {
/* no data available at all */
errno = EPIPE;
_fetch_syserr();
return (-1);
}
return (total); return (total);
} }
@ -416,6 +408,7 @@ _fetch_getln(conn_t *conn)
char *tmp; char *tmp;
size_t tmpsize; size_t tmpsize;
char c; char c;
int error;
if (conn->buf == NULL) { if (conn->buf == NULL) {
if ((conn->buf = malloc(MIN_BUF_SIZE)) == NULL) { if ((conn->buf = malloc(MIN_BUF_SIZE)) == NULL) {
@ -429,8 +422,11 @@ _fetch_getln(conn_t *conn)
conn->buflen = 0; conn->buflen = 0;
do { do {
if (_fetch_read(conn, &c, 1) == -1) error = _fetch_read(conn, &c, 1);
if (error == -1)
return (-1); return (-1);
else if (error == 0)
break;
conn->buf[conn->buflen++] = c; conn->buf[conn->buflen++] = c;
if (conn->buflen == conn->bufsize) { if (conn->buflen == conn->bufsize) {
tmp = conn->buf; tmp = conn->buf;
@ -455,34 +451,21 @@ _fetch_getln(conn_t *conn)
*/ */
ssize_t ssize_t
_fetch_write(conn_t *conn, const char *buf, size_t len) _fetch_write(conn_t *conn, const char *buf, size_t len)
{
struct iovec iov;
iov.iov_base = __DECONST(char *, buf);
iov.iov_len = len;
return _fetch_writev(conn, &iov, 1);
}
/*
* Write a vector to a connection w/ timeout
* Note: can modify the iovec.
*/
ssize_t
_fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
{ {
struct timeval now, timeout, wait; struct timeval now, timeout, wait;
fd_set writefds; fd_set writefds;
ssize_t wlen, total; ssize_t wlen, total;
int r; int r;
total = 0;
if (fetchTimeout) { if (fetchTimeout) {
FD_ZERO(&writefds); FD_ZERO(&writefds);
gettimeofday(&timeout, NULL); gettimeofday(&timeout, NULL);
timeout.tv_sec += fetchTimeout; timeout.tv_sec += fetchTimeout;
} }
total = 0; while (len > 0) {
while (iovcnt > 0) {
while (fetchTimeout && !FD_ISSET(conn->sd, &writefds)) { while (fetchTimeout && !FD_ISSET(conn->sd, &writefds)) {
FD_SET(conn->sd, &writefds); FD_SET(conn->sd, &writefds);
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
@ -494,7 +477,6 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
} }
if (wait.tv_sec < 0) { if (wait.tv_sec < 0) {
errno = ETIMEDOUT; errno = ETIMEDOUT;
_fetch_syserr();
return (-1); return (-1);
} }
errno = 0; errno = 0;
@ -508,32 +490,21 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
errno = 0; errno = 0;
#ifdef WITH_SSL #ifdef WITH_SSL
if (conn->ssl != NULL) if (conn->ssl != NULL)
wlen = SSL_write(conn->ssl, wlen = SSL_write(conn->ssl, buf, len);
iov->iov_base, iov->iov_len);
else else
#endif #endif
wlen = writev(conn->sd, iov, iovcnt); wlen = write(conn->sd, buf, len);
if (wlen == 0) { if (wlen == 0)
/* we consider a short write a failure */ /* we consider a short write a failure */
errno = EPIPE;
_fetch_syserr();
return (-1); return (-1);
}
if (wlen < 0) { if (wlen < 0) {
if (errno == EINTR && fetchRestartCalls) if (errno == EINTR && fetchRestartCalls)
continue; continue;
return (-1); return (-1);
} }
len -= wlen;
buf += wlen;
total += wlen; total += wlen;
while (iovcnt > 0 && wlen >= (ssize_t)iov->iov_len) {
wlen -= iov->iov_len;
iov++;
iovcnt--;
}
if (iovcnt > 0) {
iov->iov_len -= wlen;
iov->iov_base = __DECONST(char *, iov->iov_base) + wlen;
}
} }
return (total); return (total);
} }
@ -545,14 +516,10 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
int int
_fetch_putln(conn_t *conn, const char *str, size_t len) _fetch_putln(conn_t *conn, const char *str, size_t len)
{ {
struct iovec iov[2];
DEBUG(fprintf(stderr, ">>> %s\n", str)); DEBUG(fprintf(stderr, ">>> %s\n", str));
iov[0].iov_base = __DECONST(char *, str); if (_fetch_write(conn, str, len) == -1 ||
iov[0].iov_len = len; _fetch_write(conn, ENDL, sizeof ENDL) == -1)
iov[1].iov_base = __DECONST(char *, ENDL);
iov[1].iov_len = sizeof ENDL;
if (_fetch_writev(conn, iov, 2) == -1)
return (-1); return (-1);
return (0); return (0);
} }