diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index efbcd79..aef4e42 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,26 +9,60 @@ on: jobs: Linux: + strategy: + fail-fast: false + matrix: + volume: + - /tmp + - . + - / + asroot: + - name: '' + sudo: '' + - name: ' as root' + sudo: 'sudo ' + + name: Linux ${{ matrix.volume }}${{ matrix.asroot.name }} runs-on: ubuntu-22.04 + steps: - uses: actions/checkout@v3 - run: sudo apt-get install -y libparted-dev libudev-dev - run: make all extra + - if: matrix.volume == '/' + run: sudo chmod a+w / + - run: ./f3write -V - run: ./f3write --help - - run: ./f3write -s 2 -e 4 -w 50000 /tmp + - run: ${{ matrix.asroot.sudo }}./f3write -s 2 -e 4 -w 50000 ${{ matrix.volume }} - - run: stat /tmp/2.h2w - - run: stat /tmp/3.h2w - - run: stat /tmp/4.h2w + - run: stat ${{ matrix.volume }}/2.h2w + - run: stat ${{ matrix.volume }}/3.h2w + - run: stat ${{ matrix.volume }}/4.h2w - run: ./f3read -V - run: ./f3read --help - - run: ./f3read -s 2 -e 4 -r 50000 /tmp + - run: ${{ matrix.asroot.sudo }}./f3read -s 2 -e 4 -r 50000 ${{ matrix.volume }} MacOS: + strategy: + fail-fast: false + matrix: + volume: + - /tmp + - . + # MacOS denies `sudo chmod a+w /` + #- / + asroot: + - name: '' + sudo: '' + - name: ' as root' + sudo: 'sudo ' + + name: MacOS ${{ matrix.volume }}${{ matrix.asroot.name }} runs-on: macos-12 + steps: - uses: actions/checkout@v3 - run: brew install argp-standalone @@ -36,18 +70,31 @@ jobs: - run: ./f3write -V - run: ./f3write --help - - run: ./f3write -s 2 -e 4 -w 50000 /tmp + - run: ${{ matrix.asroot.sudo }}./f3write -s 2 -e 4 -w 50000 ${{ matrix.volume }} - - run: stat /tmp/2.h2w - - run: stat /tmp/3.h2w - - run: stat /tmp/4.h2w + - run: stat ${{ matrix.volume }}/2.h2w + - run: stat ${{ matrix.volume }}/3.h2w + - run: stat ${{ matrix.volume }}/4.h2w - run: ./f3read -V - run: ./f3read --help - - run: ./f3read -s 2 -e 4 -r 50000 /tmp + - run: ${{ matrix.asroot.sudo }}./f3read -s 2 -e 4 -r 50000 ${{ matrix.volume }} Cygwin: + strategy: + fail-fast: false + matrix: + volume: + - cygwin: /cygdrive/c + windows: 'C:' + - cygwin: . + windows: . + - cygwin: / + windows: 'C:\cygwin' + + name: Cygwin ${{ matrix.volume.cygwin }} runs-on: windows-2022 + steps: - uses: actions/checkout@v3 @@ -59,12 +106,12 @@ jobs: - run: '& .\f3write.exe -V' - run: '& .\f3write.exe --help' - - run: '& .\f3write.exe -s 2 -e 4 -w 50000 /cygdrive/c' + - run: '& .\f3write.exe -s 2 -e 4 -w 50000 ${{ matrix.volume.cygwin }}' - - run: 'Get-Item C:\2.h2w' - - run: 'Get-Item C:\3.h2w' - - run: 'Get-Item C:\4.h2w' + - run: 'Get-Item ${{ matrix.volume.windows }}\2.h2w' + - run: 'Get-Item ${{ matrix.volume.windows }}\3.h2w' + - run: 'Get-Item ${{ matrix.volume.windows }}\4.h2w' - run: '& .\f3read.exe -V' - run: '& .\f3read.exe --help' - - run: '& .\f3read.exe -s 2 -e 4 -r 50000 /cygdrive/c' + - run: '& .\f3read.exe -s 2 -e 4 -r 50000 ${{ matrix.volume.cygwin }}' diff --git a/f3read.c b/f3read.c index 12686f9..c52ef9a 100644 --- a/f3read.c +++ b/f3read.c @@ -438,6 +438,8 @@ int main(int argc, char **argv) argp_parse(&argp, argc, argv, 0, NULL, &args); print_header(stdout, "read"); + adjust_dev_path(&args.dev_path); + files = ls_my_files(args.dev_path, args.start_at, args.end_at); iterate_files(args.dev_path, files, args.start_at, args.end_at, diff --git a/f3write.c b/f3write.c index 112e7c6..c3cabed 100644 --- a/f3write.c +++ b/f3write.c @@ -372,6 +372,8 @@ int main(int argc, char **argv) argp_parse(&argp, argc, argv, 0, NULL, &args); print_header(stdout, "write"); + adjust_dev_path(&args.dev_path); + unlink_old_files(args.dev_path, args.start_at, args.end_at); return fill_fs(args.dev_path, args.start_at, args.end_at, diff --git a/utils.c b/utils.c index d32bcd7..3313ee8 100644 --- a/utils.c +++ b/utils.c @@ -18,10 +18,26 @@ #include #include #include +#include #include "version.h" #include "utils.h" +void adjust_dev_path(const char **dev_path) +{ + if (chdir(*dev_path)) { + err(errno, "Can't change working directory to %s at %s()", *dev_path, __func__); + } + + if (!chroot(*dev_path)) { + assert(!chdir("/")); + } else if (errno != EPERM) { + err(errno, "Can't change root directory to %s at %s()", *dev_path, __func__); + } + + *dev_path = "."; +} + const char *adjust_unit(double *ptr_bytes) { const char *units[] = { "Byte", "KB", "MB", "GB", "TB", "PB", "EB" }; @@ -216,8 +232,6 @@ int posix_fadvise(int fd, off_t offset, off_t len, int advice) #if (__APPLE__ && __MACH__) || defined(__OpenBSD__) -#include /* For usleep(). */ - void msleep(double wait_ms) { assert(!usleep(wait_ms * 1000)); diff --git a/utils.h b/utils.h index ecbd0df..03031e2 100644 --- a/utils.h +++ b/utils.h @@ -9,6 +9,8 @@ #define SECTOR_SIZE (512) #define GIGABYTES (1024 * 1024 * 1024) +void adjust_dev_path(const char **dev_path); + const char *adjust_unit(double *ptr_bytes); /* Return true if @filename matches the regex /^[0-9]+\.h2w$/ */