diff --git a/examples/shell/const.q b/examples/shell/const.q index 20c1bfa..960cff6 100644 --- a/examples/shell/const.q +++ b/examples/shell/const.q @@ -3,6 +3,10 @@ const { pid 1 } + sig { + chld 17 + } + state { exited 0x4 } diff --git a/examples/shell/shell.q b/examples/shell/shell.q index c866aa4..5a2b017 100644 --- a/examples/shell/shell.q +++ b/examples/shell/shell.q @@ -8,14 +8,14 @@ main() { loop { io.write("λ ") - n := io.in(command) + n := io.read(command) if n <= 0 { return } command[n-1] = 0 - pid := sys.fork() + pid := sys.clone(sig.chld, 0, 0, 0, 0) if pid == 0 { sys.execve(command, 0, 0) diff --git a/lib/sys/struct_linux.q b/lib/sys/struct_linux.q index adbea0d..e07b9dd 100644 --- a/lib/sys/struct_linux.q +++ b/lib/sys/struct_linux.q @@ -1,6 +1,6 @@ sockaddr_in { sin_family int16 - sin_port int16 + sin_port uint16 sin_addr int64 sin_zero int64 } diff --git a/lib/sys/struct_mac.q b/lib/sys/struct_mac.q index 9172114..e64ddc7 100644 --- a/lib/sys/struct_mac.q +++ b/lib/sys/struct_mac.q @@ -1,7 +1,7 @@ sockaddr_in_bsd { sin_len int8 sin_family int8 - sin_port int16 + sin_port uint16 sin_addr int64 sin_zero int64 } \ No newline at end of file diff --git a/lib/sys/sys_linux.q b/lib/sys/sys_linux.q new file mode 100644 index 0000000..3c89ebf --- /dev/null +++ b/lib/sys/sys_linux.q @@ -0,0 +1,87 @@ +read(fd int, buffer *byte, length int) -> int { + return syscall(n.read, fd, buffer, length) +} + +write(fd int, buffer *byte, length int) -> int { + return syscall(n.write, fd, buffer, length) +} + +mmap(address int, length uint, protection int, flags int) -> *any { + return syscall(n.mmap, address, length, protection, flags) +} + +munmap(address *any, length uint) -> int { + return syscall(n.munmap, address, length) +} + +open(path *any, flags int, mode int) -> int { + return syscall(n.openat, -100, path, flags, mode) +} + +close(fd int) -> int { + return syscall(n.close, fd) +} + +clone(flags uint, stack *any, parent *int, child *int, tls uint) -> int { + return syscall(n.clone, flags, stack, parent, child, tls) +} + +execve(path *any, argv *any, envp *any) -> int { + return syscall(n.execve, path, argv, envp) +} + +exit(status int) { + syscall(n.exit, status) +} + +waitid(type int, id int, info *any, options int) -> int { + return syscall(n.waitid, type, id, info, options) +} + +socket(family int, type int, protocol int) -> int { + return syscall(n.socket, family, type, protocol) +} + +accept(fd int, address *any, length int) -> int { + return syscall(n.accept, fd, address, length) +} + +bind(fd int, address *sockaddr_in, length int) -> int { + return syscall(n.bind, fd, address, length) +} + +listen(fd int, backlog int) -> int { + return syscall(n.listen, fd, backlog) +} + +setsockopt(fd int, level int, optname int, optval *any, optlen int) -> int { + return syscall(n.setsockopt, fd, level, optname, optval, optlen) +} + +getcwd(buffer *any, length int) -> int { + return syscall(n.getcwd, buffer, length) +} + +chdir(path *any) -> int { + return syscall(n.chdir, path) +} + +rename(old *any, new *any) -> int { + return syscall(n.renameat, -100, old, -100, new) +} + +mkdir(path *any, mode int) -> int { + return syscall(n.mkdirat, -100, path, mode) +} + +rmdir(path *any) -> int { + return syscall(n.unlinkat, -100, path, 0x200) +} + +unlink(file *any) -> int { + return syscall(n.unlinkat, -100, file, 0) +} + +nanosleep(duration *timespec) -> int { + return syscall(n.nanosleep, duration, 0) +} \ No newline at end of file diff --git a/lib/sys/sys_linux_arm.q b/lib/sys/sys_linux_arm.q index cfc351e..b8c8e39 100644 --- a/lib/sys/sys_linux_arm.q +++ b/lib/sys/sys_linux_arm.q @@ -1,15 +1,25 @@ -read(fd int, buffer *byte, length int) -> int { - return syscall(63, fd, buffer, length) -} - -write(fd int, buffer *byte, length int) -> int { - return syscall(64, fd, buffer, length) -} - -mmap(address int, length uint, protection int, flags int) -> *any { - return syscall(222, address, length, protection, flags) -} - -munmap(address *any, length uint) -> int { - return syscall(215, address, length) +const { + n { + read 63 + write 64 + mmap 222 + munmap 215 + openat 56 + close 57 + clone 220 + execve 221 + exit 93 + waitid 95 + socket 198 + accept 202 + bind 200 + listen 201 + setsockopt 208 + getcwd 17 + chdir 49 + mkdirat 34 + unlinkat 35 + renameat 38 + nanosleep 101 + } } \ No newline at end of file diff --git a/lib/sys/sys_linux_x86.q b/lib/sys/sys_linux_x86.q index 4d82732..02266a7 100644 --- a/lib/sys/sys_linux_x86.q +++ b/lib/sys/sys_linux_x86.q @@ -1,91 +1,26 @@ -read(fd int, buffer *byte, length int) -> int { - return syscall(0, fd, buffer, length) +const { + n { + read 0 + write 1 + mmap 9 + munmap 11 + openat 257 + close 3 + clone 56 + execve 59 + exit 60 + waitid 247 + socket 41 + accept 43 + bind 49 + listen 50 + setsockopt 54 + getcwd 79 + chdir 80 + mkdirat 258 + unlinkat 263 + renameat 264 + nanosleep 35 + } } -write(fd int, buffer *byte, length int) -> int { - return syscall(1, fd, buffer, length) -} - -open(path *any, flags int, mode int) -> int { - return syscall(2, path, flags, mode) -} - -close(fd int) -> int { - return syscall(3, fd) -} - -mmap(address int, length uint, protection int, flags int) -> *any { - return syscall(9, address, length, protection, flags) -} - -munmap(address *any, length uint) -> int { - return syscall(11, address, length) -} - -clone(flags uint, stack *any, parent *int, child *int, tls uint) -> int { - return syscall(56, flags, stack, parent, child, tls) -} - -fork() -> int { - return syscall(57) -} - -execve(path *any, argv *any, envp *any) -> int { - return syscall(59, path, argv, envp) -} - -exit(status int) { - syscall(60, status) -} - -waitid(type int, id int, info *any, options int) -> int { - return syscall(247, type, id, info, options) -} - -socket(family int, type int, protocol int) -> int { - return syscall(41, family, type, protocol) -} - -accept(fd int, address *any, length int) -> int { - return syscall(43, fd, address, length) -} - -bind(fd int, address *sockaddr_in, length int) -> int { - return syscall(49, fd, address, length) -} - -listen(fd int, backlog int) -> int { - return syscall(50, fd, backlog) -} - -setsockopt(fd int, level int, optname int, optval *any, optlen int) -> int { - return syscall(54, fd, level, optname, optval, optlen) -} - -getcwd(buffer *any, length int) -> int { - return syscall(79, buffer, length) -} - -chdir(path *any) -> int { - return syscall(80, path) -} - -rename(old *any, new *any) -> int { - return syscall(82, old, new) -} - -mkdir(path *any, mode int) -> int { - return syscall(83, path, mode) -} - -rmdir(path *any) -> int { - return syscall(84, path) -} - -unlink(file *any) -> int { - return syscall(87, file) -} - -nanosleep(duration *timespec) -> int { - return syscall(35, duration, 0) -} \ No newline at end of file