Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 18 additions & 29 deletions src/errno.cr
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/aarch64-android/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/aarch64-darwin/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __error : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 48
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/aarch64-linux-gnu/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/aarch64-linux-musl/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/arm-linux-gnueabihf/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/i386-linux-gnu/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/i386-linux-musl/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/wasm32-wasi/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
$errno : Int

E2BIG = 1_u16
EACCES = 2_u16
EADDRINUSE = 3_u16
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-darwin/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __error : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 48
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-dragonfly/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 48
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-freebsd/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __error : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 48
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-linux-gnu/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-linux-musl/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno_location : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 98
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-netbsd/c/errno.cr
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-openbsd/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun __errno : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 48
Expand Down
2 changes: 2 additions & 0 deletions src/lib_c/x86_64-solaris/c/errno.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
lib LibC
fun ___errno : Int*

E2BIG = 7
EACCES = 13
EADDRINUSE = 125
Expand Down
3 changes: 3 additions & 0 deletions src/lib_c/x86_64-windows-msvc/c/errno.cr
Original file line number Diff line number Diff line change
@@ -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
Expand Down