aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-06-11 12:51:42 +0100
committerGitHub <noreply@github.com>2024-06-11 12:51:42 +0100
commit39b166edd3aefb3ae80e4ce4aab23f00bec6b06b (patch)
tree2e0a79dd253df7e53d765c6675a0e017b1fab95d
parenteaf1d882870ab38c296ae1d270c8bc1b70e30290 (diff)
parent0e6bcd0dbb8d5d979b2c7b772907d9576ed586ff (diff)
Merge pull request #3733 from Feoramund/ci-freebsd
Add FreeBSD to the CI
-rw-r--r--.github/workflows/ci.yml29
-rw-r--r--core/os/os_freebsd.odin61
-rw-r--r--core/path/filepath/path_unix.odin2
-rw-r--r--tests/core/net/test_core_net.odin2
4 files changed, 80 insertions, 14 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 66c848a8a..c9c453331 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -39,6 +39,35 @@ jobs:
./odin test tests/vendor -all-packages -define:ODIN_TEST_FANCY=false
./odin test tests/benchmark -all-packages -define:ODIN_TEST_FANCY=false
(cd tests/issues; ./run.sh)
+ build_freebsd:
+ name: FreeBSD Build, Check, and Test
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Build, Check, and Test
+ timeout-minutes: 15
+ uses: vmactions/freebsd-vm@v1
+ with:
+ usesh: true
+ copyback: false
+ prepare: |
+ pkg install -y gmake git bash python3 libxml2 llvm17
+ run: |
+ # `set -e` is needed for test failures to register. https://github.com/vmactions/freebsd-vm/issues/72
+ set -e -x
+ git config --global --add safe.directory $(pwd)
+ gmake release
+ ./odin version
+ ./odin report
+ gmake -C vendor/stb/src
+ gmake -C vendor/cgltf/src
+ gmake -C vendor/miniaudio/src
+ ./odin check examples/all -vet -strict-style -target:freebsd_amd64
+ ./odin test tests/core/normal.odin -file -all-packages -define:ODIN_TEST_FANCY=false
+ ./odin test tests/core/speed.odin -file -all-packages -o:speed -define:ODIN_TEST_FANCY=false
+ ./odin test tests/vendor -all-packages -define:ODIN_TEST_FANCY=false
+ ./odin test tests/benchmark -all-packages -define:ODIN_TEST_FANCY=false
+ (cd tests/issues; ./run.sh)
ci:
strategy:
fail-fast: false
diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin
index cdd44d301..8fe179478 100644
--- a/core/os/os_freebsd.odin
+++ b/core/os/os_freebsd.odin
@@ -112,15 +112,15 @@ EOWNERDEAD: Errno : 96
O_RDONLY :: 0x00000
O_WRONLY :: 0x00001
O_RDWR :: 0x00002
-O_CREATE :: 0x00040
-O_EXCL :: 0x00080
-O_NOCTTY :: 0x00100
-O_TRUNC :: 0x00200
-O_NONBLOCK :: 0x00800
-O_APPEND :: 0x00400
-O_SYNC :: 0x01000
-O_ASYNC :: 0x02000
-O_CLOEXEC :: 0x80000
+O_NONBLOCK :: 0x00004
+O_APPEND :: 0x00008
+O_ASYNC :: 0x00040
+O_SYNC :: 0x00080
+O_CREATE :: 0x00200
+O_TRUNC :: 0x00400
+O_EXCL :: 0x00800
+O_NOCTTY :: 0x08000
+O_CLOEXEC :: 0100000
SEEK_DATA :: 3
@@ -140,6 +140,8 @@ RTLD_NOLOAD :: 0x02000
MAX_PATH :: 1024
+KINFO_FILE_SIZE :: 1392
+
args := _alloc_command_line_arguments()
Unix_File_Time :: struct {
@@ -191,6 +193,21 @@ OS_Stat :: struct {
lspare: [10]u64,
}
+KInfo_File :: struct {
+ structsize: c.int,
+ type: c.int,
+ fd: c.int,
+ ref_count: c.int,
+ flags: c.int,
+ pad0: c.int,
+ offset: i64,
+
+ // NOTE(Feoramund): This field represents a complicated union that I am
+ // avoiding implementing for now. I only need the path data below.
+ _union: [336]byte,
+
+ path: [MAX_PATH]c.char,
+}
// since FreeBSD v12
Dirent :: struct {
@@ -254,6 +271,8 @@ X_OK :: 1 // Test for execute permission
W_OK :: 2 // Test for write permission
R_OK :: 4 // Test for read permission
+F_KINFO :: 22
+
foreign libc {
@(link_name="__error") __errno_location :: proc() -> ^c.int ---
@@ -274,6 +293,7 @@ foreign libc {
@(link_name="unlink") _unix_unlink :: proc(path: cstring) -> c.int ---
@(link_name="rmdir") _unix_rmdir :: proc(path: cstring) -> c.int ---
@(link_name="mkdir") _unix_mkdir :: proc(path: cstring, mode: mode_t) -> c.int ---
+ @(link_name="fcntl") _unix_fcntl :: proc(fd: Handle, cmd: c.int, arg: uintptr) -> c.int ---
@(link_name="fdopendir") _unix_fdopendir :: proc(fd: Handle) -> Dir ---
@(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int ---
@@ -365,7 +385,7 @@ seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Errno) {
}
file_size :: proc(fd: Handle) -> (i64, Errno) {
- s, err := fstat(fd)
+ s, err := _fstat(fd)
if err != ERROR_NONE {
return -1, err
}
@@ -591,9 +611,26 @@ _readlink :: proc(path: string) -> (string, Errno) {
return "", Errno{}
}
-// XXX FreeBSD
absolute_path_from_handle :: proc(fd: Handle) -> (string, Errno) {
- return "", Errno(ENOSYS)
+ // NOTE(Feoramund): The situation isn't ideal, but this was the best way I
+ // could find to implement this. There are a couple outstanding bug reports
+ // regarding the desire to retrieve an absolute path from a handle, but to
+ // my knowledge, there hasn't been any work done on it.
+ //
+ // https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=198570
+ //
+ // This may be unreliable, according to a comment from 2023.
+
+ kinfo: KInfo_File
+ kinfo.structsize = KINFO_FILE_SIZE
+
+ res := _unix_fcntl(fd, F_KINFO, cast(uintptr)&kinfo)
+ if res == -1 {
+ return "", Errno(get_last_error())
+ }
+
+ path := strings.clone_from_cstring_bounded(cast(cstring)&kinfo.path[0], len(kinfo.path))
+ return path, ERROR_NONE
}
absolute_path_from_relative :: proc(rel: string) -> (path: string, err: Errno) {
diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin
index a4b27b027..b44a6a344 100644
--- a/core/path/filepath/path_unix.odin
+++ b/core/path/filepath/path_unix.odin
@@ -56,7 +56,7 @@ foreign libc {
@(link_name="free") _unix_free :: proc(ptr: rawptr) ---
}
-when ODIN_OS == .Darwin {
+when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD {
@(private)
foreign libc {
@(link_name="__error") __error :: proc() -> ^i32 ---
diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin
index 6aada88a6..f806463e9 100644
--- a/tests/core/net/test_core_net.odin
+++ b/tests/core/net/test_core_net.odin
@@ -8,7 +8,7 @@
A test suite for `core:net`
*/
-//+build !netbsd
+//+build !netbsd !freebsd !openbsd
package test_core_net
import "core:testing"