diff --git a/src/errno.cr b/src/errno.cr index c519a8ab9fdb..343f2c8b95ab 100644 --- a/src/errno.cr +++ b/src/errno.cr @@ -1,23 +1,6 @@ require "c/errno" require "c/string" -lib LibC - {% if flag?(:netbsd) || flag?(:openbsd) || flag?(:android) %} - fun __errno : Int* - {% elsif flag?(:solaris) %} - fun ___errno : Int* - {% elsif flag?(:linux) || flag?(:dragonfly) %} - fun __errno_location : Int* - {% elsif flag?(:wasi) %} - $errno : Int - {% elsif flag?(:darwin) || flag?(:freebsd) %} - fun __error : Int* - {% elsif flag?(:win32) %} - fun _get_errno(value : Int*) : ErrnoT - fun _set_errno(value : Int) : ErrnoT - {% end %} -end - # Errno wraps and gives access to libc's errno. This is mostly useful when # dealing with C libraries. enum Errno @@ -63,36 +46,42 @@ enum Errno # returns the value of libc's errno. def self.value : self - {% if flag?(:netbsd) || flag?(:openbsd) || flag?(:android) %} + {% if LibC.has_method?(:__errno_location) %} + Errno.new LibC.__errno_location.value + {% elsif LibC.has_method?(:__errno) %} Errno.new LibC.__errno.value - {% elsif flag?(:solaris) %} + {% elsif LibC.has_method?(:__error) %} + Errno.new LibC.__error.value + {% elsif LibC.has_method?(:___errno) %} Errno.new LibC.___errno.value - {% elsif flag?(:linux) || flag?(:dragonfly) %} - Errno.new LibC.__errno_location.value {% elsif flag?(:wasi) %} Errno.new LibC.errno - {% elsif flag?(:darwin) || flag?(:freebsd) %} - Errno.new LibC.__error.value {% elsif flag?(:win32) %} ret = LibC._get_errno(out errno) raise RuntimeError.from_os_error("_get_errno", Errno.new(ret)) unless ret == 0 Errno.new errno + {% else %} + {% raise "ERROR: no errno definition for target" %} {% end %} end # Sets the value of libc's errno. def self.value=(errno : Errno) - {% if flag?(:netbsd) || flag?(:openbsd) || flag?(:android) %} - LibC.__errno.value = errno.value - {% elsif flag?(:solaris) %} - LibC.___errno.value = errno.value - {% elsif flag?(:linux) || flag?(:dragonfly) %} + {% if LibC.has_method?(:__errno_location) %} LibC.__errno_location.value = errno.value - {% elsif flag?(:darwin) || flag?(:freebsd) %} + {% elsif LibC.has_method?(:__errno) %} + LibC.__errno.value = errno.value + {% elsif LibC.has_method?(:__error) %} LibC.__error.value = errno.value + {% elsif LibC.has_method?(:___errno) %} + LibC.___errno.value = errno.value + {% elsif flag?(:wasi) %} + LibC.errno = errno.value {% elsif flag?(:win32) %} ret = LibC._set_errno(errno.value) raise RuntimeError.from_os_error("_set_errno", Errno.new(ret)) unless ret == 0 + {% else %} + {% raise "ERROR: no errno definition for target" %} {% end %} errno end diff --git a/src/lib_c/aarch64-android/c/errno.cr b/src/lib_c/aarch64-android/c/errno.cr index 245cb73c45cc..4105906ca546 100644 --- a/src/lib_c/aarch64-android/c/errno.cr +++ b/src/lib_c/aarch64-android/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/aarch64-darwin/c/errno.cr b/src/lib_c/aarch64-darwin/c/errno.cr index 2ab22eadab2f..6d2f6a2d2dc3 100644 --- a/src/lib_c/aarch64-darwin/c/errno.cr +++ b/src/lib_c/aarch64-darwin/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __error : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 48 diff --git a/src/lib_c/aarch64-linux-gnu/c/errno.cr b/src/lib_c/aarch64-linux-gnu/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/aarch64-linux-gnu/c/errno.cr +++ b/src/lib_c/aarch64-linux-gnu/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/aarch64-linux-musl/c/errno.cr b/src/lib_c/aarch64-linux-musl/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/aarch64-linux-musl/c/errno.cr +++ b/src/lib_c/aarch64-linux-musl/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/arm-linux-gnueabihf/c/errno.cr b/src/lib_c/arm-linux-gnueabihf/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/arm-linux-gnueabihf/c/errno.cr +++ b/src/lib_c/arm-linux-gnueabihf/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/i386-linux-gnu/c/errno.cr b/src/lib_c/i386-linux-gnu/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/i386-linux-gnu/c/errno.cr +++ b/src/lib_c/i386-linux-gnu/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/i386-linux-musl/c/errno.cr b/src/lib_c/i386-linux-musl/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/i386-linux-musl/c/errno.cr +++ b/src/lib_c/i386-linux-musl/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/wasm32-wasi/c/errno.cr b/src/lib_c/wasm32-wasi/c/errno.cr index 662c355ec1d3..91b208e95eed 100644 --- a/src/lib_c/wasm32-wasi/c/errno.cr +++ b/src/lib_c/wasm32-wasi/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + $errno : Int + E2BIG = 1_u16 EACCES = 2_u16 EADDRINUSE = 3_u16 diff --git a/src/lib_c/x86_64-darwin/c/errno.cr b/src/lib_c/x86_64-darwin/c/errno.cr index 2ab22eadab2f..6d2f6a2d2dc3 100644 --- a/src/lib_c/x86_64-darwin/c/errno.cr +++ b/src/lib_c/x86_64-darwin/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __error : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 48 diff --git a/src/lib_c/x86_64-dragonfly/c/errno.cr b/src/lib_c/x86_64-dragonfly/c/errno.cr index 8d2fa2503046..41bb62007811 100644 --- a/src/lib_c/x86_64-dragonfly/c/errno.cr +++ b/src/lib_c/x86_64-dragonfly/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 48 diff --git a/src/lib_c/x86_64-freebsd/c/errno.cr b/src/lib_c/x86_64-freebsd/c/errno.cr index 4af1a410da4d..2c06a9375d7f 100644 --- a/src/lib_c/x86_64-freebsd/c/errno.cr +++ b/src/lib_c/x86_64-freebsd/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __error : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 48 diff --git a/src/lib_c/x86_64-linux-gnu/c/errno.cr b/src/lib_c/x86_64-linux-gnu/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/x86_64-linux-gnu/c/errno.cr +++ b/src/lib_c/x86_64-linux-gnu/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/x86_64-linux-musl/c/errno.cr b/src/lib_c/x86_64-linux-musl/c/errno.cr index 8b528cc5bb71..87dffc19fe1a 100644 --- a/src/lib_c/x86_64-linux-musl/c/errno.cr +++ b/src/lib_c/x86_64-linux-musl/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno_location : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 98 diff --git a/src/lib_c/x86_64-netbsd/c/errno.cr b/src/lib_c/x86_64-netbsd/c/errno.cr index 43eaeed4f02c..177e69e55541 100644 --- a/src/lib_c/x86_64-netbsd/c/errno.cr +++ b/src/lib_c/x86_64-netbsd/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno : Int* + EPERM = 1 # Operation not permitted ENOENT = 2 # No such file or directory ESRCH = 3 # No such process diff --git a/src/lib_c/x86_64-openbsd/c/errno.cr b/src/lib_c/x86_64-openbsd/c/errno.cr index a7d57cc0d36a..7ed2a1e49eed 100644 --- a/src/lib_c/x86_64-openbsd/c/errno.cr +++ b/src/lib_c/x86_64-openbsd/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun __errno : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 48 diff --git a/src/lib_c/x86_64-solaris/c/errno.cr b/src/lib_c/x86_64-solaris/c/errno.cr index 32e239c7d1a8..a273497db214 100644 --- a/src/lib_c/x86_64-solaris/c/errno.cr +++ b/src/lib_c/x86_64-solaris/c/errno.cr @@ -1,4 +1,6 @@ lib LibC + fun ___errno : Int* + E2BIG = 7 EACCES = 13 EADDRINUSE = 125 diff --git a/src/lib_c/x86_64-windows-msvc/c/errno.cr b/src/lib_c/x86_64-windows-msvc/c/errno.cr index 691a04fac013..91c209da5f5e 100644 --- a/src/lib_c/x86_64-windows-msvc/c/errno.cr +++ b/src/lib_c/x86_64-windows-msvc/c/errno.cr @@ -1,4 +1,7 @@ lib LibC + fun _get_errno(value : Int*) : ErrnoT + fun _set_errno(value : Int) : ErrnoT + # source https://docs.microsoft.com/en-us/cpp/c-runtime-library/errno-doserrno-sys-errlist-and-sys-nerr EPERM = 1 ENOENT = 2