Improved server example
This commit is contained in:
parent
526385280a
commit
d0d096bcd2
@ -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
10
lib/net/net_linux.q
Normal 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
10
lib/net/net_mac.q
Normal 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
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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])
|
||||
|
Loading…
x
Reference in New Issue
Block a user