]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
serialize: add serialize_item_base64mem()
authorLuca Boccassi <bluca@debian.org>
Mon, 18 Sep 2023 20:15:25 +0000 (21:15 +0100)
committerLuca Boccassi <bluca@debian.org>
Thu, 12 Oct 2023 12:37:22 +0000 (13:37 +0100)
src/shared/serialize.c
src/shared/serialize.h
src/test/test-serialize.c

index dc282e398e1612948020d696b0601c4b70799ca7..6133aeb575ce2712ab87e795e16d23b2bd8257b7 100644 (file)
@@ -196,6 +196,29 @@ int serialize_item_hexmem(FILE *f, const char *key, const void *p, size_t l) {
         return 1;
 }
 
+int serialize_item_base64mem(FILE *f, const char *key, const void *p, size_t l) {
+        _cleanup_free_ char *encoded = NULL;
+        ssize_t len;
+        int r;
+
+        assert(f);
+        assert(key);
+        assert(p || l == 0);
+
+        if (l == 0)
+                return 0;
+
+        len = base64mem(p, l, &encoded);
+        if (len <= 0)
+                return log_oom_debug();
+
+        r = serialize_item(f, key, encoded);
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
 int deserialize_read_line(FILE *f, char **ret) {
         _cleanup_free_ char *line = NULL;
         int r;
index 17bc968c0466bcce3ea524e65ef047c838662c83..5eb9be25847a0341aef34e5c8b02b62350465d6e 100644 (file)
@@ -13,6 +13,7 @@ int serialize_item(FILE *f, const char *key, const char *value);
 int serialize_item_escaped(FILE *f, const char *key, const char *value);
 int serialize_item_format(FILE *f, const char *key, const char *value, ...) _printf_(3,4);
 int serialize_item_hexmem(FILE *f, const char *key, const void *p, size_t l);
+int serialize_item_base64mem(FILE *f, const char *key, const void *p, size_t l);
 int serialize_fd(FILE *f, FDSet *fds, const char *key, int fd);
 int serialize_usec(FILE *f, const char *key, usec_t usec);
 int serialize_dual_timestamp(FILE *f, const char *key, const dual_timestamp *t);
index 501f5c6f2e4d8dcf37aab9e2930cb9b4b22ae526..9e7047f4f0cb8b26e0a618beb46c555f6dae0f3d 100644 (file)
@@ -208,6 +208,23 @@ TEST(serialize_item_hexmem) {
 
 }
 
+TEST(serialize_item_base64mem) {
+        _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
+        _cleanup_fclose_ FILE *f = NULL;
+
+        assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
+        log_info("/* %s (%s) */", __func__, fn);
+
+        assert_se(serialize_item_base64mem(f, "a", NULL, 0) == 0);
+        assert_se(serialize_item_base64mem(f, "a", (uint8_t []){0xff, 0xff, 0xff}, sizeof(uint8_t) * 3) == 1);
+
+        rewind(f);
+
+        _cleanup_free_ char *line = NULL;
+        assert_se(read_line(f, LONG_LINE_MAX, &line) > 0);
+        assert_se(streq(line, "a=////"));
+}
+
 static int intro(void) {
         memset(long_string, 'x', sizeof(long_string)-1);
         char_array_0(long_string);