changeset 153:1c3083e7acfa

mygetline EINTR handling and errno = 0
author mmj
date Thu, 03 Jun 2004 07:50:40 +1000
parents 2fb415c3738f
children 58e5a553a6a0
files src/mail-functions.c src/mygetline.c
diffstat 2 files changed, 25 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/mail-functions.c	Thu Jun 03 07:34:32 2004 +1000
+++ b/src/mail-functions.c	Thu Jun 03 07:50:40 2004 +1000
@@ -126,6 +126,7 @@
 			     * occurred */
 		if(!fgets(bufp, WRITE_BUFSIZE, infile)) {
 			if (errno == EINTR) {
+				errno = 0;
 				continue;
 			} else {
 				return errno;
--- a/src/mygetline.c	Thu Jun 03 07:34:32 2004 +1000
+++ b/src/mygetline.c	Thu Jun 03 07:50:40 2004 +1000
@@ -11,6 +11,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <errno.h>
 #include "mygetline.h"
 
 char *myfgetline(FILE *infile)
@@ -45,14 +46,34 @@
 
 	}
 }
+
 char *mygetline(int fd)
 {
-	size_t i = 0, buf_size = BUFSIZE;  /* initial buffer size */
+	size_t i = 0, res, buf_size = BUFSIZE;  /* initial buffer size */
 	char *buf = malloc(buf_size);
 	char ch;
 
 	buf[0] = '\0';
-	while(read(fd, &ch, 1) > 0) {	
+	while(1) {	
+		res = read(fd, &ch, 1);
+		if(res < 0) {
+			if(errno == EINTR)
+				continue;
+			else {
+				free(buf);
+				return NULL;
+			}
+		}
+		if(res == 0) {
+			if(buf[0]) {
+				buf[i] = '\0';
+				return buf;
+			} else {
+				free(buf);
+				return NULL;
+			}
+		}
+
 		if(i == buf_size - 1) {
 			buf_size *= 2;
 			buf = realloc(buf, buf_size);
@@ -63,15 +84,8 @@
 			return buf;
 		}
 	}
-
-	if(buf[0]) {
-		buf[i] = '\0';
-		return buf;
 	}
 
-	free(buf);
-	return NULL;
-}
 #if 0
 int main(int argc, char **argv)
 {