e21280832ebcc46f6898dff96070a5d90b809ac3
[claws.git] / src / plugins / spamassassin / utils.c
1 /*
2  * This code is copyright 2001 by Craig Hughes
3  * Portions copyright 2002 by Brad Jorsch
4  * It is licensed for use with SpamAssassin according to the terms of the Perl Artistic License
5  * The text of this license is included in the SpamAssassin distribution in the file named "License"
6  */
7
8 #include <unistd.h>
9 #include <errno.h>
10
11 #include "utils.h"
12
13 /* Dec 13 2001 jm: added safe full-read and full-write functions.  These
14  * can cope with networks etc., where a write or read may not read all
15  * the data that's there, in one call.
16  */
17 /* Aug 14, 2002 bj: EINTR and EAGAIN aren't fatal, are they? */
18 /* Aug 14, 2002 bj: moved these to utils.c */
19 int
20 full_read (int fd, unsigned char *buf, int min, int len)
21 {
22   int total;
23   int thistime;
24
25   for (total = 0; total < min; ) {
26     thistime = read (fd, buf+total, len-total);
27
28     if (thistime < 0) {
29       if(EINTR == errno || EAGAIN == errno) continue;
30       return -1;
31     } else if (thistime == 0) {
32       /* EOF, but we didn't read the minimum.  return what we've read
33        * so far and next read (if there is one) will return 0. */
34       return total;
35     }
36
37     total += thistime;
38   }
39   return total;
40 }
41
42 int
43 full_write (int fd, const unsigned char *buf, int len)
44 {
45   int total;
46   int thistime;
47
48   for (total = 0; total < len; ) {
49     thistime = write (fd, buf+total, len-total);
50
51     if (thistime < 0) {
52       if(EINTR == errno || EAGAIN == errno) continue;
53       return thistime;        /* always an error for writes */
54     }
55     total += thistime;
56   }
57   return total;
58 }