]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
serialize: add serialize_bool_elide() helper 28557/head
authorLuca Boccassi <bluca@debian.org>
Mon, 26 Jun 2023 15:13:49 +0000 (16:13 +0100)
committerLuca Boccassi <bluca@debian.org>
Sat, 29 Jul 2023 10:25:05 +0000 (11:25 +0100)
In many case we serialize into objects that have been zero-initialized.
To save some time and resources when there are a lot of booleans, add a
helper that serializes only when the boolean is true.

src/shared/serialize.h
src/test/test-serialize.c

index 8fdc6dc304ebff69a60bc2482bef0d4fb0773d6a..8b6e0999f1faca85443f16005b81f932d75f0e37 100644 (file)
@@ -19,6 +19,9 @@ int serialize_strv(FILE *f, const char *key, char **l);
 static inline int serialize_bool(FILE *f, const char *key, bool b) {
         return serialize_item(f, key, yes_no(b));
 }
+static inline int serialize_bool_elide(FILE *f, const char *key, bool b) {
+        return b ? serialize_item(f, key, yes_no(b)) : 0;
+}
 
 int deserialize_usec(const char *value, usec_t *timestamp);
 int deserialize_dual_timestamp(const char *value, dual_timestamp *t);
index a297e9515edb5f6effb685c1b71d20faf8a27664..36052b64859ba8b6a42883f526c9ab8615198c76 100644 (file)
@@ -22,19 +22,23 @@ TEST(serialize_item) {
         assert_se(serialize_item(f, "a", NULL) == 0);
         assert_se(serialize_item(f, "a", "bbb") == 1);
         assert_se(serialize_item(f, "a", "bbb") == 1);
+        assert_se(serialize_bool_elide(f, "c", true) == 1);
+        assert_se(serialize_bool_elide(f, "d", false) == 0);
         assert_se(serialize_item(f, "a", long_string) == -EINVAL);
         assert_se(serialize_item(f, long_string, "a") == -EINVAL);
         assert_se(serialize_item(f, long_string, long_string) == -EINVAL);
 
         rewind(f);
 
-        _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
+        _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL;
         assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
         assert_se(streq(line1, "a=bbb"));
         assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
         assert_se(streq(line2, "a=bbb"));
-        assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
-        assert_se(streq(line3, ""));
+        assert_se(read_line(f, LONG_LINE_MAX, &line3) > 0);
+        assert_se(streq(line3, "c=yes"));
+        assert_se(read_line(f, LONG_LINE_MAX, &line4) == 0);
+        assert_se(streq(line4, ""));
 }
 
 TEST(serialize_item_escaped) {