X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Ftest-bus-memfd.c;h=b9d6a250c36b17ac25b049e2e917d3134e24f0e5;hp=4b22ea9a689af28f857a3c8c9870313d66a3af40;hb=872c8faaf2009422a91d227ae0b5c6f04c9d2c69;hpb=a7c54c8c1fc4101e784c101e680975f2143381ce diff --git a/src/libsystemd-bus/test-bus-memfd.c b/src/libsystemd-bus/test-bus-memfd.c index 4b22ea9a6..b9d6a250c 100644 --- a/src/libsystemd-bus/test-bus-memfd.c +++ b/src/libsystemd-bus/test-bus-memfd.c @@ -20,6 +20,7 @@ ***/ #include +#include #include "log.h" #include "macro.h" @@ -33,6 +34,9 @@ int main(int argc, char *argv[]) { uint64_t sz; int r, fd; FILE *f; + char buf[3] = {}; + struct iovec iov[3] = {}; + char bufv[3][3] = {}; log_set_max_level(LOG_DEBUG); @@ -40,32 +44,30 @@ int main(int argc, char *argv[]) { if (r == -ENOENT) return EXIT_TEST_SKIP; - r = sd_memfd_map(m, 0, 6, (void**) &s); + r = sd_memfd_map(m, 0, 12, (void**) &s); assert_se(r >= 0); - strcpy(s, "hallo"); + strcpy(s, "----- world"); r = sd_memfd_set_sealed(m, 1); - assert_se(r == -EPERM); + assert_se(r == -ETXTBSY); assert_se(write(sd_memfd_get_fd(m), "he", 2) == 2); - assert_se(write(sd_memfd_get_fd(m), "HE", 2) == 2); + assert_se(write(sd_memfd_get_fd(m), "XXX", 3) == 3); + assert_se(streq(s, "heXXX world")); - log_error("lseek = %llu", (unsigned long long) lseek(sd_memfd_get_fd(m), 0, SEEK_CUR)); - - log_info("<%s>", s); - - access("HUHU", F_OK); + /* fix "hello" */ + assert_se(lseek(sd_memfd_get_fd(m), 2, SEEK_SET) == 2); + assert_se(write(sd_memfd_get_fd(m), "ll", 2) == 2); assert_se(sd_memfd_get_file(m, &f) >= 0); - fputc('L', f); + fputc('o', f); fflush(f); - access("HAHA", F_OK); - - log_info("<%s>", s); + /* check content */ + assert_se(streq(s, "hello world")); - assert_se(munmap(s, 6) == 0); + assert_se(munmap(s, 12) == 0); r = sd_memfd_get_sealed(m); assert_se(r == 0); @@ -74,9 +76,15 @@ int main(int argc, char *argv[]) { assert_se(r >= 0); assert_se(sz = page_size()); + /* truncate it */ r = sd_memfd_set_size(m, 6); assert_se(r >= 0); + /* get back new value */ + r = sd_memfd_get_size(m, &sz); + assert_se(r >= 0); + assert_se(sz == 6); + r = sd_memfd_set_sealed(m, 1); assert_se(r >= 0); @@ -88,29 +96,77 @@ int main(int argc, char *argv[]) { sd_memfd_free(m); + /* new sd_memfd, same underlying memfd */ r = sd_memfd_make(fd, &m); assert_se(r >= 0); + /* we did truncate it to 6 */ r = sd_memfd_get_size(m, &sz); - assert_se(r >= 0); - assert_se(sz = 6); + assert_se(r >= 0 && sz == 6); - r = sd_memfd_map(m, 0, 6, (void**) &s); + /* map it, check content */ + r = sd_memfd_map(m, 0, 12, (void **)&s); assert_se(r >= 0); + /* we only see the truncated size */ + assert_se(streq(s, "hello ")); + + /* it was already sealed */ r = sd_memfd_set_sealed(m, 1); assert_se(r == -EALREADY); + /* we cannot break the seal, it is mapped */ r = sd_memfd_set_sealed(m, 0); - assert_se(r == -EPERM); + assert_se(r == -ETXTBSY); + + /* unmap it; become the single owner */ + assert_se(munmap(s, 12) == 0); - log_info("<%s>", s); + /* now we can do flip the sealing */ + r = sd_memfd_set_sealed(m, 0); + assert_se(r == 0); + r = sd_memfd_get_sealed(m); + assert_se(r == 0); - assert_se(streq(s, "heLlo")); - assert_se(munmap(s, 6) == 0); + r = sd_memfd_set_sealed(m, 1); + assert_se(r == 0); + r = sd_memfd_get_sealed(m); + assert_se(r == 1); r = sd_memfd_set_sealed(m, 0); - assert_se(r >= 0); + assert_se(r == 0); + r = sd_memfd_get_sealed(m); + assert_se(r == 0); + + /* seek at 2, read() 2 bytes */ + assert_se(lseek(fd, 2, SEEK_SET) == 2); + assert_se(read(fd, buf, 2) == 2); + + /* check content */ + assert_se(memcmp(buf, "ll", 2) == 0); + + /* writev it out*/ + iov[0].iov_base = (char *)"ABC"; + iov[0].iov_len = 3; + iov[1].iov_base = (char *)"DEF"; + iov[1].iov_len = 3; + iov[2].iov_base = (char *)"GHI"; + iov[2].iov_len = 3; + assert_se(pwritev(fd, iov, 3, 0) == 9); + + /* readv it back */ + iov[0].iov_base = bufv[0]; + iov[0].iov_len = 3; + iov[1].iov_base = bufv[1]; + iov[1].iov_len = 3; + iov[2].iov_base = bufv[2]; + iov[2].iov_len = 3; + assert_se(preadv(fd, iov, 3, 0) == 9); + + /* check content */ + assert_se(memcmp(bufv[0], "ABC", 3) == 0); + assert_se(memcmp(bufv[1], "DEF", 3) == 0); + assert_se(memcmp(bufv[2], "GHI", 3) == 0); sd_memfd_free(m);