Improved server example

This commit is contained in:
Eduard Urbach 2025-02-08 17:34:11 +01:00
parent 526385280a
commit d0d096bcd2
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
5 changed files with 37 additions and 10 deletions

View File

@ -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)

10
lib/net/net_linux.q Normal file
View File

@ -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
}

10
lib/net/net_mac.q Normal file
View File

@ -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
}

View File

@ -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)
}

View File

@ -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])