Mercurial > hg > mlmmj
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) {