slurpn.c (562B)
1 /* ISC license. */ 2 3 #include <sys/types.h> 4 #include <errno.h> 5 6 #include <skalibs/allreadwrite.h> 7 #include <skalibs/stralloc.h> 8 #include <skalibs/djbunix.h> 9 10 #define N 4096 11 12 int slurpn (int fd, stralloc *sa, size_t max) 13 { 14 for (;;) 15 { 16 ssize_t r ; 17 size_t n = max && sa->len + N > max ? max - sa->len : N ; 18 if (!n) return (errno = ENOBUFS, 0) ; 19 if (!stralloc_readyplus(sa, n)) return 0 ; 20 r = fd_read(fd, sa->s + sa->len, n) ; 21 switch (r) 22 { 23 case -1 : return 0 ; 24 case 0 : return 1 ; 25 default : sa->len += r ; 26 } 27 } 28 }