Integrate getdelim() and getline() support into Tor.

This commit is contained in:
Nick Mathewson 2018-07-10 10:23:29 -04:00
parent 1604c0fe0e
commit b04d719c10
5 changed files with 49 additions and 10 deletions

View File

@ -585,7 +585,9 @@ AC_CHECK_FUNCS(
ftime \ ftime \
get_current_dir_name \ get_current_dir_name \
getaddrinfo \ getaddrinfo \
getdelim \
getifaddrs \ getifaddrs \
getline \
getpass \ getpass \
getrlimit \ getrlimit \
gettimeofday \ gettimeofday \

View File

@ -30,21 +30,19 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <nbcompat.h> #ifndef BUFSIZ
#include <nbcompat/stdio.h> #define BUFSIZ 512
#include <nbcompat/stdlib.h> #endif
#if !HAVE_GETDELIM
ssize_t ssize_t
getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
{ {
char *ptr, *eptr; char *ptr, *eptr;
if (*buf == NULL || *bufsiz == 0) { if (*buf == NULL || *bufsiz == 0) {
*bufsiz = BUFSIZ; *bufsiz = BUFSIZ;
if ((*buf = malloc(*bufsiz)) == NULL) if ((*buf = raw_malloc(*bufsiz)) == NULL)
return -1; return -1;
} }
@ -69,7 +67,7 @@ getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
char *nbuf; char *nbuf;
size_t nbufsiz = *bufsiz * 2; size_t nbufsiz = *bufsiz * 2;
ssize_t d = ptr - *buf; ssize_t d = ptr - *buf;
if ((nbuf = realloc(*buf, nbufsiz)) == NULL) if ((nbuf = raw_realloc(*buf, nbufsiz)) == NULL)
return -1; return -1;
*buf = nbuf; *buf = nbuf;
*bufsiz = nbufsiz; *bufsiz = nbufsiz;
@ -78,5 +76,3 @@ getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
} }
} }
} }
#endif

View File

@ -1,4 +1,7 @@
orconfig.h orconfig.h
ext/getdelim.c
lib/cc/*.h lib/cc/*.h
lib/container/*.h lib/container/*.h
lib/encoding/*.h lib/encoding/*.h

View File

@ -715,3 +715,7 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out))
return string; return string;
} }
#if !defined(HAVE_GETDELIM) || defined(TOR_UNIT_TESTS)
#include "ext/getdelim.c"
#endif

View File

@ -103,4 +103,38 @@ char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read,
size_t *sz_out) size_t *sz_out)
ATTR_MALLOC; ATTR_MALLOC;
#if !defined(HAVE_GETDELIM) || defined(TOR_UNIT_TESTS)
ssize_t compat_getdelim_(char **lineptr, size_t *n, int delim, FILE *stream);
#endif
#ifdef HAVE_GETDELIM
/**
* Cross-platform wrapper for getdelim(): behaves as the POSIX-standard
* getdelim() function.
*
* Note that this function will use the libc memory allocator -- so any memory
* passed to this function must come from raw_malloc(), and must be freed by
* raw_free() -- don't use tor_malloc() and tor_free() with this.
*/
#define tor_getdelim(lineptr, n, delim, stream) \
getdelim((lineptr), (n), (delim), (stream))
#else
#define tor_getdelim(lineptr, n, delim, stream) \
compat_getdelim_((lineptr), (n), (delim), (stream))
#endif
#ifdef HAVE_GETLINE
/**
* Cross-platform wrapper for getline(): behaves as the POSIX-standard
* getline() function.
*
* See tor_getdelim() for usage notes.
*/
#define tor_getline(lineptr, n, stream) \
getline((lineptr), (n), (stream))
#else
#define tor_getline(lineptr, n, stream) \
tor_getdelim((lineptr), (n), '\n', (stream))
#endif
#endif #endif