[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] Integrate getdelim() and getline() support into Tor.
commit b04d719c1067dd1cf9b48295f1d0e7ed5adb7255
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Tue Jul 10 10:23:29 2018 -0400
Integrate getdelim() and getline() support into Tor.
---
configure.ac | 2 ++
src/ext/getdelim.c | 16 ++++++----------
src/lib/fs/.may_include | 3 +++
src/lib/fs/files.c | 4 ++++
src/lib/fs/files.h | 34 ++++++++++++++++++++++++++++++++++
5 files changed, 49 insertions(+), 10 deletions(-)
diff --git a/configure.ac b/configure.ac
index 296591f02..ff03cf10e 100644
--- 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
index 60df7e1b6..8254103ff 100644
--- 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
index 6c9ce6ca0..b1e49fc89 100644
--- 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
index 4e0a398ba..e93d36d86 100644
--- 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
index 5a12eb821..d219e3cf0 100644
--- 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
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits