diff options
Diffstat (limited to 'images/basic/hostoverlaytest')
-rw-r--r-- | images/basic/hostoverlaytest/Dockerfile | 8 | ||||
-rw-r--r-- | images/basic/hostoverlaytest/copy_up_testfile.txt | 1 | ||||
-rw-r--r-- | images/basic/hostoverlaytest/test_copy_up.c | 88 | ||||
-rw-r--r-- | images/basic/hostoverlaytest/test_rewinddir.c | 78 |
4 files changed, 0 insertions, 175 deletions
diff --git a/images/basic/hostoverlaytest/Dockerfile b/images/basic/hostoverlaytest/Dockerfile deleted file mode 100644 index 6cef1a542..000000000 --- a/images/basic/hostoverlaytest/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ubuntu:bionic - -WORKDIR /root -COPY . . - -RUN apt-get update && apt-get install -y gcc -RUN gcc -O2 -o test_copy_up test_copy_up.c -RUN gcc -O2 -o test_rewinddir test_rewinddir.c diff --git a/images/basic/hostoverlaytest/copy_up_testfile.txt b/images/basic/hostoverlaytest/copy_up_testfile.txt deleted file mode 100644 index e4188c841..000000000 --- a/images/basic/hostoverlaytest/copy_up_testfile.txt +++ /dev/null @@ -1 +0,0 @@ -old data diff --git a/images/basic/hostoverlaytest/test_copy_up.c b/images/basic/hostoverlaytest/test_copy_up.c deleted file mode 100644 index 010b261dc..000000000 --- a/images/basic/hostoverlaytest/test_copy_up.c +++ /dev/null @@ -1,88 +0,0 @@ -#include <err.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <sys/mman.h> -#include <unistd.h> - -int main(int argc, char** argv) { - const char kTestFilePath[] = "copy_up_testfile.txt"; - const char kOldFileData[] = "old data\n"; - const char kNewFileData[] = "new data\n"; - const size_t kPageSize = sysconf(_SC_PAGE_SIZE); - - // Open a file that already exists in a host overlayfs lower layer. - const int fd_rdonly = open(kTestFilePath, O_RDONLY); - if (fd_rdonly < 0) { - err(1, "open(%s, O_RDONLY)", kTestFilePath); - } - - // Check that the file's initial contents are what we expect when read via - // syscall. - char oldbuf[sizeof(kOldFileData)] = {}; - ssize_t n = pread(fd_rdonly, oldbuf, sizeof(oldbuf), 0); - if (n < 0) { - err(1, "initial pread"); - } - if (n != strlen(kOldFileData)) { - errx(1, "short initial pread (%ld/%lu bytes)", n, strlen(kOldFileData)); - } - if (strcmp(oldbuf, kOldFileData) != 0) { - errx(1, "initial pread returned wrong data: %s", oldbuf); - } - - // Check that the file's initial contents are what we expect when read via - // memory mapping. - void* page = mmap(NULL, kPageSize, PROT_READ, MAP_SHARED, fd_rdonly, 0); - if (page == MAP_FAILED) { - err(1, "mmap"); - } - if (strcmp(page, kOldFileData) != 0) { - errx(1, "mapping contains wrong initial data: %s", (const char*)page); - } - - // Open the same file writably, causing host overlayfs to copy it up, and - // replace its contents. - const int fd_rdwr = open(kTestFilePath, O_RDWR); - if (fd_rdwr < 0) { - err(1, "open(%s, O_RDWR)", kTestFilePath); - } - n = write(fd_rdwr, kNewFileData, strlen(kNewFileData)); - if (n < 0) { - err(1, "write"); - } - if (n != strlen(kNewFileData)) { - errx(1, "short write (%ld/%lu bytes)", n, strlen(kNewFileData)); - } - if (ftruncate(fd_rdwr, strlen(kNewFileData)) < 0) { - err(1, "truncate"); - } - - int failed = 0; - - // Check that syscalls on the old FD return updated contents. (Before Linux - // 4.18, this requires that runsc use a post-copy-up FD to service the read.) - char newbuf[sizeof(kNewFileData)] = {}; - n = pread(fd_rdonly, newbuf, sizeof(newbuf), 0); - if (n < 0) { - err(1, "final pread"); - } - if (n != strlen(kNewFileData)) { - warnx("short final pread (%ld/%lu bytes)", n, strlen(kNewFileData)); - failed = 1; - } else if (strcmp(newbuf, kNewFileData) != 0) { - warnx("final pread returned wrong data: %s", newbuf); - failed = 1; - } - - // Check that the memory mapping of the old FD has been updated. (Linux - // overlayfs does not do this, so regardless of kernel version this requires - // that runsc replace existing memory mappings with mappings of a - // post-copy-up FD.) - if (strcmp(page, kNewFileData) != 0) { - warnx("mapping contains wrong final data: %s", (const char*)page); - failed = 1; - } - - return failed; -} diff --git a/images/basic/hostoverlaytest/test_rewinddir.c b/images/basic/hostoverlaytest/test_rewinddir.c deleted file mode 100644 index f1a4085e1..000000000 --- a/images/basic/hostoverlaytest/test_rewinddir.c +++ /dev/null @@ -1,78 +0,0 @@ -#include <dirent.h> -#include <err.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> - -int main(int argc, char** argv) { - const char kDirPath[] = "rewinddir_test_dir"; - const char kFileBasename[] = "rewinddir_test_file"; - - // Create the test directory. - if (mkdir(kDirPath, 0755) < 0) { - err(1, "mkdir(%s)", kDirPath); - } - - // The test directory should initially be empty. - DIR* dir = opendir(kDirPath); - if (!dir) { - err(1, "opendir(%s)", kDirPath); - } - int failed = 0; - while (1) { - errno = 0; - struct dirent* d = readdir(dir); - if (!d) { - if (errno != 0) { - err(1, "readdir"); - } - break; - } - if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) { - warnx("unexpected file %s in new directory", d->d_name); - failed = 1; - } - } - - // Create a file in the test directory. - char* file_path = malloc(strlen(kDirPath) + 1 + strlen(kFileBasename)); - if (!file_path) { - errx(1, "malloc"); - } - strcpy(file_path, kDirPath); - file_path[strlen(kDirPath)] = '/'; - strcpy(file_path + strlen(kDirPath) + 1, kFileBasename); - if (mknod(file_path, 0644, 0) < 0) { - err(1, "mknod(%s)", file_path); - } - - // After rewinddir(), re-reading the directory stream should yield the new - // file. - rewinddir(dir); - size_t found_file = 0; - while (1) { - errno = 0; - struct dirent* d = readdir(dir); - if (!d) { - if (errno != 0) { - err(1, "readdir"); - } - break; - } - if (strcmp(d->d_name, kFileBasename) == 0) { - found_file++; - } else if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) { - warnx("unexpected file %s in new directory", d->d_name); - failed = 1; - } - } - if (found_file != 1) { - warnx("readdir returned file %s %zu times, wanted 1", kFileBasename, - found_file); - failed = 1; - } - - return failed; -} |