From: Baptiste Daroussin Date: Wed, 5 Jul 2023 12:20:29 +0000 (+0200) Subject: utils: add a function to grab a line or the entire file from a fd X-Git-Tag: RELEASE_1_4_0rc1~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91d5f480237d7139e730e0ed3eebc5e5f63aa1bb;p=thirdparty%2Fmlmmj.git utils: add a function to grab a line or the entire file from a fd --- diff --git a/include/utils.h b/include/utils.h index 9430efa7..5b81c977 100644 --- a/include/utils.h +++ b/include/utils.h @@ -40,3 +40,4 @@ int exec_and_wait(const char *arg, ...); time_t strtotimet(const char *np, const char **errpp); bool lock(int fd, bool write); bool find_email(strlist *list, strlist *matches, const char *delim, char **recipextra); +char *readlf(int fd, bool online); diff --git a/src/ctrlvalue.c b/src/ctrlvalue.c index 825a3a23..54920bad 100644 --- a/src/ctrlvalue.c +++ b/src/ctrlvalue.c @@ -36,10 +36,6 @@ static char * ctrlval(int ctrlfd, const char *ctrlstr, int oneline) { int fd; - FILE *fp; - size_t bufcap = 0; - ssize_t buflen; - char *buf = NULL; if(ctrlfd < 0) return NULL; @@ -48,26 +44,7 @@ ctrlval(int ctrlfd, const char *ctrlstr, int oneline) if (fd == -1) return (NULL); - fp = fdopen(fd, "r"); - if (fp == NULL) { - close(ctrlfd); - return (NULL); - } - - if (oneline) { - buflen = getline(&buf, &bufcap, fp); - if (buflen > 0) - chomp(buf); - } else { - buflen = getdelim(&buf, &bufcap, EOF, fp); - } - fclose(fp); - if (buflen < 0) { - free(buf); - buf = NULL; - } - - return (buf); + return (readlf(fd, oneline)); } char * diff --git a/src/utils.c b/src/utils.c index a6023699..9b206021 100644 --- a/src/utils.c +++ b/src/utils.c @@ -35,6 +35,7 @@ #include "xmalloc.h" #include "utils.h" #include "getlistdelim.h" +#include "chomp.h" extern char **environ; @@ -308,3 +309,31 @@ find_email(strlist *list, strlist *matches, const char *delim, char **recipextra return false; } +char * +readlf(int fd, bool oneline) +{ + FILE *fp; + size_t bufcap = 0; + ssize_t buflen; + char *buf = NULL; + + fp = fdopen(fd, "r"); + if (fp == NULL) { + close(fd); + return (NULL); + } + + if (oneline) { + buflen = getline(&buf, &bufcap, fp); + if (buflen > 0) + chomp(buf); + } else { + buflen = getdelim(&buf, &bufcap, EOF, fp); + } + fclose(fp); + if (buflen < 0) { + free(buf); + buf = NULL; + } + return (buf); +} diff --git a/tests/mlmmj.c b/tests/mlmmj.c index ddf2520e..c2b4a697 100644 --- a/tests/mlmmj.c +++ b/tests/mlmmj.c @@ -149,6 +149,7 @@ ATF_TC_WITHOUT_HEAD(listcontrol); ATF_TC_WITHOUT_HEAD(send_help); ATF_TC_WITHOUT_HEAD(requeuemail); ATF_TC_WITHOUT_HEAD(gethdrline); +ATF_TC_WITHOUT_HEAD(readlf); ATF_TC_BODY(random_int, tc) { @@ -2595,6 +2596,11 @@ ATF_TC_BODY(gethdrline, tc) fclose(f); } +ATF_TC_BODY(readlf, tc) +{ + ATF_REQUIRE(readlf(-1, true) == NULL); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, random_int); @@ -2678,6 +2684,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, send_help); ATF_TP_ADD_TC(tp, requeuemail); ATF_TP_ADD_TC(tp, gethdrline); + ATF_TP_ADD_TC(tp, readlf); return (atf_no_error()); }