From: Baptiste Daroussin Date: Wed, 12 Apr 2023 13:10:20 +0000 (+0200) Subject: ctrlvalues: add a function to only check if an entry is contained X-Git-Tag: RELEASE_1_4_0b1~50 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=11194eca90b48b3a8a24410409806bd52fef2268;p=thirdparty%2Fmlmmj.git ctrlvalues: add a function to only check if an entry is contained this allows to reduce memory usage and simplify code --- diff --git a/include/ctrlvalues.h b/include/ctrlvalues.h index 207896c1..08d16f5a 100644 --- a/include/ctrlvalues.h +++ b/include/ctrlvalues.h @@ -21,11 +21,10 @@ * IN THE SOFTWARE. */ -#ifndef CTRLVALUES_H -#define CTRLVALUES_H +#pragma once #include "mlmmj.h" +#include strlist *ctrlvalues(int ctrlfd, const char *ctrlstr); - -#endif /* CTRLVALUES_H */ +bool ctrlvalues_contains(int ctrlfd, const char *ctrlstr, const char *pattern, bool sensitivity); diff --git a/src/ctrlvalues.c b/src/ctrlvalues.c index f68b4ead..cdb6aa6a 100644 --- a/src/ctrlvalues.c +++ b/src/ctrlvalues.c @@ -28,6 +28,9 @@ #include "chomp.h" #include "mlmmj.h" + +typedef int (cmpf)(const char *s1, const char *s2); + strlist *ctrlvalues(int ctrlfd, const char *ctrlstr) { char *line = NULL; @@ -53,3 +56,33 @@ strlist *ctrlvalues(int ctrlfd, const char *ctrlstr) return ret; } + +bool +ctrlvalues_contains(int ctrlfd, const char *ctrlstr, const char *comp, bool casesensitive) +{ + char *line = NULL; + size_t linecap = 0; + FILE *f; + int fd; + cmpf *cmp; + + cmp = casesensitive ? strcmp : strcasecmp; + + fd = openat(ctrlfd, ctrlstr, O_RDONLY|O_CLOEXEC); + if (fd == -1 || (f = fdopen(fd, "r")) == NULL) + return (false); + while (getline(&line, &linecap, f) > 0) { + chomp(line); + if (*line == '\0') + continue; + if (cmp(comp, line) == 0) { + free(line); + fclose(f); + return (true); + } + } + + free(line); + fclose(f); + return (false); +} diff --git a/tests/mlmmj.c b/tests/mlmmj.c index 8d44c8a2..1825cc28 100644 --- a/tests/mlmmj.c +++ b/tests/mlmmj.c @@ -1335,6 +1335,10 @@ ATF_TC_BODY(controls, tc) ATF_REQUIRE_EQ(ctrlcontent(-1, "plop"), NULL); ATF_REQUIRE_EQ(ctrlcontent(ctrlfd, "plop"), NULL); ATF_REQUIRE_EQ(ctrlvalues(ctrlfd, "plop"), NULL); + ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "plop", "nope", false)); + ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "listaddress", "test@test", false)); + ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "listaddress", "tesT@test", true)); + ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "listaddress", "tesT@test", false)); ATF_REQUIRE_STREQ(ctrlcontent(ctrlfd, "listaddress"), "test@test\n"); ATF_REQUIRE_EQ(ctrltimet(ctrlfd, "listaddress", 0), 0); ATF_REQUIRE_EQ(ctrltimet(ctrlfd, "plop", 0), 0); @@ -1361,6 +1365,10 @@ ATF_TC_BODY(controls, tc) ATF_REQUIRE_EQ(textcontent(ctrlfd, "text"), NULL); atf_utils_create_file("control/text/text", "this is a test"); ATF_REQUIRE_STREQ(textcontent(ctrlfd, "text"), "this is a test"); + + ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "val", "line2", true)); + ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "val", "Line2", true)); + ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "val", "Line2", false)); } ATF_TC_BODY(incindexfile, tc)