]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
utils: add a function to grab a line or the entire file from a fd
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 5 Jul 2023 12:20:29 +0000 (14:20 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 5 Jul 2023 12:20:56 +0000 (14:20 +0200)
include/utils.h
src/ctrlvalue.c
src/utils.c
tests/mlmmj.c

index 9430efa7fbc165f222bf002436bd618cc9182653..5b81c9773d08ccf2016ae154811cdd0195bd7641 100644 (file)
@@ -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);
index 825a3a23ff8c3ca7d520acf08d7b9eaa714b52ff..54920bad68bbb369b01b3944dc0cf5af6f4276a9 100644 (file)
@@ -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 *
index a602369904e9d28d75004135715e7fd80e5f4253..9b206021d8241fa70dc87c782431bdd8f66a9115 100644 (file)
@@ -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);
+}
index ddf2520e51dc8e9ffd937490a326901b4f7fa910..c2b4a697d0ce84eada71a17a5fea388024a008f3 100644 (file)
@@ -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());
 }