From d0d096bcd2385793e337d742331b19707cccee85 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sat, 8 Feb 2025 17:34:11 +0100 Subject: [PATCH] Improved server example --- examples/server/server.q | 11 ++--------- lib/net/net_linux.q | 10 ++++++++++ lib/net/net_mac.q | 10 ++++++++++ lib/sys/net_mac.q | 10 +++++++++- src/core/CompileDelete.go | 6 ++++++ 5 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 lib/net/net_linux.q create mode 100644 lib/net/net_mac.q diff --git a/examples/server/server.q b/examples/server/server.q index e9146c7..17252a3 100644 --- a/examples/server/server.q +++ b/examples/server/server.q @@ -1,6 +1,7 @@ // Open server and client in 2 terminals: // [1] q run examples/server // [2] curl http://127.0.0.1:8080 +import net import sys main() { @@ -11,19 +12,11 @@ main() { sys.exit(1) } - addr := new(sys.sockaddr_in) - addr.sin_family = 2 - addr.sin_port = 0x901F - addr.sin_addr = 0 - addr.sin_zero = 0 - - if sys.bind(socket, addr, 20) != 0 { + if net.bind(socket, 0x901F) != 0 { sys.write(1, "bind error\n", 11) sys.exit(1) } - delete(addr) - if sys.listen(socket, 128) != 0 { sys.write(1, "listen error\n", 13) sys.exit(1) diff --git a/lib/net/net_linux.q b/lib/net/net_linux.q new file mode 100644 index 0000000..1692469 --- /dev/null +++ b/lib/net/net_linux.q @@ -0,0 +1,10 @@ +import sys + +bind(socket Int, port Int) -> Int { + addr := new(sys.sockaddr_in) + addr.sin_family = 2 + addr.sin_port = port + err := sys.bind(socket, addr, 20) + delete(addr) + return err +} \ No newline at end of file diff --git a/lib/net/net_mac.q b/lib/net/net_mac.q new file mode 100644 index 0000000..78a32f5 --- /dev/null +++ b/lib/net/net_mac.q @@ -0,0 +1,10 @@ +import sys + +bind(socket Int, port Int) -> Int { + addr := new(sys.sockaddr_in_bsd) + addr.sin_family = 2 + addr.sin_port = port + err := sys.bind(socket, addr, 20) + delete(addr) + return err +} \ No newline at end of file diff --git a/lib/sys/net_mac.q b/lib/sys/net_mac.q index 667c9ac..9a98067 100644 --- a/lib/sys/net_mac.q +++ b/lib/sys/net_mac.q @@ -1,3 +1,11 @@ +struct sockaddr_in_bsd { + sin_len Int8 + sin_family Int8 + sin_port Int16 + sin_addr Int64 + sin_zero Int64 +} + socket(family Int, type Int, protocol Int) -> Int { return syscall(0x2000061, family, type, protocol) } @@ -6,7 +14,7 @@ accept(fd Int, address Pointer, length Int) -> Int { return syscall(0x200001E, fd, address, length) } -bind(fd Int, address Pointer, length Int) -> Int { +bind(fd Int, address *sockaddr_in_bsd, length Int) -> Int { return syscall(0x2000068, fd, address, length) } diff --git a/src/core/CompileDelete.go b/src/core/CompileDelete.go index 3d144f8..6eae244 100644 --- a/src/core/CompileDelete.go +++ b/src/core/CompileDelete.go @@ -2,6 +2,7 @@ package core import ( "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/expression" "git.akyoto.dev/cli/q/src/types" ) @@ -11,6 +12,11 @@ func (f *Function) CompileDelete(root *expression.Expression) error { parameters := root.Children[1:] variableName := parameters[0].Token.Text(f.File.Bytes) variable := f.VariableByName(variableName) + + if variable == nil { + return errors.New(&errors.UnknownIdentifier{Name: variableName}, f.File, parameters[0].Token.Position) + } + defer f.UseVariable(variable) f.SaveRegister(f.CPU.Input[0]) f.SaveRegister(f.CPU.Input[1])