/
syscall.cr
32 lines (30 loc) · 1.19 KB
/
syscall.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# This module is only available on Linux. It provides a way to make direct system calls into the operating system.
# You most likely doesn't need this, unless you know what you are doing.
#
# For more details about Linux system calls, refer to
# [https://man7.org/linux/man-pages/man2/syscalls.2.html](https://man7.org/linux/man-pages/man2/syscalls.2.html).
#
@[Experimental]
module Syscall
# To define system calls open a module and use the `def_syscall` macro. Pass in the system call name,
# the return type and its arguments. For example:
#
# ```
# module YourSyscalls
# Syscall.def_syscall pipe2, Int32, pipefd : Int32[2]*, flags : Int32
# Syscall.def_syscall write, Int32, fd : Int32, buf : UInt8*, count : LibC::SizeT
# Syscall.def_syscall read, Int32, fd : Int32, buf : UInt8*, count : LibC::SizeT
# Syscall.def_syscall close, Int32, fd : Int32
# end
# ```
#
# They can then be called as methods from the `Syscall` module:
#
# ```
# YourSyscalls.write(1, "Hello!\n".to_unsafe, 7)
# ```
macro def_syscall(name, return_type, *args)
{% raise "The Syscall module is not supported on this target. It's only available for Linux." %}
end
end
require "./syscall/*"