diff --git a/text.h b/text.h
index ac867ae..250120a 100644
--- a/text.h
+++ b/text.h
@@ -8,5 +8,5 @@ struct linebuf {
 #define EMPTY_LINEBUF {NULL, 0, 0,}
 void getlines(FILE *, struct linebuf *);
 
-char *afgets(char **, size_t *, FILE *);
+size_t afgets(char **, size_t *, FILE *);
 void concat(FILE *, const char *, FILE *, const char *);
diff --git a/util/afgets.c b/util/afgets.c
index e1d719d..a01e3ed 100644
--- a/util/afgets.c
+++ b/util/afgets.c
@@ -6,7 +6,7 @@
 #include "../text.h"
 #include "../util.h"
 
-char *
+size_t
 afgets(char **p, size_t *size, FILE *fp)
 {
 	char buf[BUFSIZ];
@@ -14,7 +14,7 @@ afgets(char **p, size_t *size, FILE *fp)
 
 	while(fgets(buf, sizeof buf, fp)) {
 		len += (n = strlen(buf));
-		if(len+1 > *size && !(*p = realloc(*p, len+1)))
+		if(len+1 > *size && !(*p = realloc(*p, *size = len+1)))
 			eprintf("realloc:");
 
 		strcpy(&(*p)[len-n], buf);
@@ -23,5 +23,5 @@ afgets(char **p, size_t *size, FILE *fp)
 			break;
 	}
 
-	return (len > 0) ? *p : NULL;
+	return len;
 }
