From 753250b4e8b05a22ecd72d2cacf092faba15562b Mon Sep 17 00:00:00 2001 From: thunder2 Date: Tue, 21 Dec 2021 09:03:56 +0100 Subject: [PATCH] Added os specific RsFileUtil::rs_getline --- libretroshare/src/tor/TorProcess.cpp | 2 +- libretroshare/src/util/rsfile.cc | 56 ++++++++++++++++++++++++++++ libretroshare/src/util/rsfile.h | 3 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/libretroshare/src/tor/TorProcess.cpp b/libretroshare/src/tor/TorProcess.cpp index 04f62a12a..1836c4f4e 100644 --- a/libretroshare/src/tor/TorProcess.cpp +++ b/libretroshare/src/tor/TorProcess.cpp @@ -409,7 +409,7 @@ bool TorProcess::tryReadControlPort() char *line = nullptr; size_t tmp_buffsize = 0; - size_t size = getline(&line,&tmp_buffsize,file); + size_t size = RsFileUtil::rs_getline(&line,&tmp_buffsize,file); ByteArray data = ByteArray((unsigned char*)line,size).trimmed(); free(line); diff --git a/libretroshare/src/util/rsfile.cc b/libretroshare/src/util/rsfile.cc index fc9f12c21..6d3f7b1ab 100644 --- a/libretroshare/src/util/rsfile.cc +++ b/libretroshare/src/util/rsfile.cc @@ -26,6 +26,7 @@ #include #include #include +#include #else #include #endif @@ -49,3 +50,58 @@ int RsFileUtil::set_fd_nonblock(int fd) return ret; } + +ssize_t RsFileUtil::rs_getline(char **lineptr, size_t *n, FILE *stream) +{ +/******************* OS SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS + if (lineptr == nullptr || n == nullptr || stream == nullptr) { + errno = EINVAL; + return -1; + } + + if (*lineptr == nullptr || *n < 1) { + *n = BUFSIZ; + *lineptr = (char*) malloc(*n); + if (*lineptr == nullptr) { + *n = 0; + return -1; + } + } + + char *ptr = *lineptr; + while (true) { + int c = fgetc(stream); + if (c == -1) { + if (feof(stream)) { + *ptr = '\0'; + return (ssize_t) (ptr - *lineptr); + } + return -1; + } + + *ptr = c; + ++ptr; + + if (c == '\n') { + *ptr = '\0'; + return ptr - *lineptr; + } + if (ptr + 2 >= *lineptr + *n) { + size_t new_size = *n * 2; + ssize_t diff = ptr - *lineptr; + + char *new_lineptr = (char*) realloc(*lineptr, new_size); + if (new_lineptr == nullptr) { + return -1; + } + + *lineptr = new_lineptr; + *n = new_size; + ptr = new_lineptr + diff; + } + } +#else // ie UNIX + return getline(lineptr, n, stream); +#endif +} diff --git a/libretroshare/src/util/rsfile.h b/libretroshare/src/util/rsfile.h index 7569b5af5..9a23b6a4c 100644 --- a/libretroshare/src/util/rsfile.h +++ b/libretroshare/src/util/rsfile.h @@ -22,8 +22,11 @@ #pragma once +#include + namespace RsFileUtil { int set_fd_nonblock(int fd); +ssize_t rs_getline(char **lineptr, size_t *n, FILE *stream); }