blob: e21280832ebcc46f6898dff96070a5d90b809ac3 [file] [log] [blame]
/*
* This code is copyright 2001 by Craig Hughes
* Portions copyright 2002 by Brad Jorsch
* It is licensed for use with SpamAssassin according to the terms of the Perl Artistic License
* The text of this license is included in the SpamAssassin distribution in the file named "License"
*/
#include <unistd.h>
#include <errno.h>
#include "utils.h"
/* Dec 13 2001 jm: added safe full-read and full-write functions. These
* can cope with networks etc., where a write or read may not read all
* the data that's there, in one call.
*/
/* Aug 14, 2002 bj: EINTR and EAGAIN aren't fatal, are they? */
/* Aug 14, 2002 bj: moved these to utils.c */
int
full_read (int fd, unsigned char *buf, int min, int len)
{
int total;
int thistime;
for (total = 0; total < min; ) {
thistime = read (fd, buf+total, len-total);
if (thistime < 0) {
if(EINTR == errno || EAGAIN == errno) continue;
return -1;
} else if (thistime == 0) {
/* EOF, but we didn't read the minimum. return what we've read
* so far and next read (if there is one) will return 0. */
return total;
}
total += thistime;
}
return total;
}
int
full_write (int fd, const unsigned char *buf, int len)
{
int total;
int thistime;
for (total = 0; total < len; ) {
thistime = write (fd, buf+total, len-total);
if (thistime < 0) {
if(EINTR == errno || EAGAIN == errno) continue;
return thistime; /* always an error for writes */
}
total += thistime;
}
return total;
}