+
/* Copyright 1998 by the Massachusetts Institute of Technology.
*
* Permission to use, copy, modify, and distribute this
* without express or implied warranty.
*/
-#include "setup.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "ares_setup.h"
+
#include "ares.h"
+#include "ares_nowarn.h"
#include "ares_private.h"
/* This is an internal function. Its contract is to read a line from
* appropriate. The initial value of *buf should be NULL. After the
* calling routine is done reading lines, it should free *buf.
*/
-int ares__read_line(FILE *fp, char **buf, int *bufsize)
+int ares__read_line(FILE *fp, char **buf, size_t *bufsize)
{
char *newbuf;
size_t offset = 0;
*bufsize = 128;
}
- while (1)
+ for (;;)
{
- if (!fgets(*buf + offset, *bufsize - (int)offset, fp))
+ int bytestoread = aresx_uztosi(*bufsize - offset);
+
+ if (!fgets(*buf + offset, bytestoread, fp))
return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
len = offset + strlen(*buf + offset);
if ((*buf)[len - 1] == '\n')
{
(*buf)[len - 1] = 0;
- return ARES_SUCCESS;
+ break;
}
offset = len;
+ if(len < *bufsize - 1)
+ continue;
/* Allocate more space. */
newbuf = realloc(*buf, *bufsize * 2);
*buf = newbuf;
*bufsize *= 2;
}
+ return ARES_SUCCESS;
}