tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit b04d719c1067dd1cf9b48295f1d0e7ed5adb7255
parent 1604c0fe0e5ce74538555c19a307ad38d0fca358
Author: Nick Mathewson <nickm@torproject.org>
Date:   Tue, 10 Jul 2018 10:23:29 -0400

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

Diffstat:
Mconfigure.ac | 2++
Msrc/ext/getdelim.c | 16++++++----------
Msrc/lib/fs/.may_include | 3+++
Msrc/lib/fs/files.c | 4++++
Msrc/lib/fs/files.h | 34++++++++++++++++++++++++++++++++++
5 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/configure.ac b/configure.ac @@ -585,7 +585,9 @@ AC_CHECK_FUNCS( ftime \ get_current_dir_name \ getaddrinfo \ + getdelim \ getifaddrs \ + getline \ getpass \ getrlimit \ gettimeofday \ diff --git a/src/ext/getdelim.c b/src/ext/getdelim.c @@ -30,21 +30,19 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <nbcompat.h> -#include <nbcompat/stdio.h> -#include <nbcompat/stdlib.h> - -#if !HAVE_GETDELIM +#ifndef BUFSIZ +#define BUFSIZ 512 +#endif 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; if (*buf == NULL || *bufsiz == 0) { *bufsiz = BUFSIZ; - if ((*buf = malloc(*bufsiz)) == NULL) + if ((*buf = raw_malloc(*bufsiz)) == NULL) return -1; } @@ -69,7 +67,7 @@ getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) char *nbuf; size_t nbufsiz = *bufsiz * 2; ssize_t d = ptr - *buf; - if ((nbuf = realloc(*buf, nbufsiz)) == NULL) + if ((nbuf = raw_realloc(*buf, nbufsiz)) == NULL) return -1; *buf = nbuf; *bufsiz = nbufsiz; @@ -78,5 +76,3 @@ getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) } } } - -#endif diff --git a/src/lib/fs/.may_include b/src/lib/fs/.may_include @@ -1,4 +1,7 @@ orconfig.h + +ext/getdelim.c + lib/cc/*.h lib/container/*.h lib/encoding/*.h diff --git a/src/lib/fs/files.c b/src/lib/fs/files.c @@ -715,3 +715,7 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out)) return string; } + +#if !defined(HAVE_GETDELIM) || defined(TOR_UNIT_TESTS) +#include "ext/getdelim.c" +#endif diff --git a/src/lib/fs/files.h b/src/lib/fs/files.h @@ -103,4 +103,38 @@ char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) 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