Improved server example
This commit is contained in:
parent
526385280a
commit
d0d096bcd2
@ -1,6 +1,7 @@
|
|||||||
// Open server and client in 2 terminals:
|
// Open server and client in 2 terminals:
|
||||||
// [1] q run examples/server
|
// [1] q run examples/server
|
||||||
// [2] curl http://127.0.0.1:8080
|
// [2] curl http://127.0.0.1:8080
|
||||||
|
import net
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
@ -11,19 +12,11 @@ main() {
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
addr := new(sys.sockaddr_in)
|
if net.bind(socket, 0x901F) != 0 {
|
||||||
addr.sin_family = 2
|
|
||||||
addr.sin_port = 0x901F
|
|
||||||
addr.sin_addr = 0
|
|
||||||
addr.sin_zero = 0
|
|
||||||
|
|
||||||
if sys.bind(socket, addr, 20) != 0 {
|
|
||||||
sys.write(1, "bind error\n", 11)
|
sys.write(1, "bind error\n", 11)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(addr)
|
|
||||||
|
|
||||||
if sys.listen(socket, 128) != 0 {
|
if sys.listen(socket, 128) != 0 {
|
||||||
sys.write(1, "listen error\n", 13)
|
sys.write(1, "listen error\n", 13)
|
||||||
sys.exit(1)
|
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 {
|
socket(family Int, type Int, protocol Int) -> Int {
|
||||||
return syscall(0x2000061, family, type, protocol)
|
return syscall(0x2000061, family, type, protocol)
|
||||||
}
|
}
|
||||||
@ -6,7 +14,7 @@ accept(fd Int, address Pointer, length Int) -> Int {
|
|||||||
return syscall(0x200001E, fd, address, length)
|
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)
|
return syscall(0x2000068, fd, address, length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package core
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"git.akyoto.dev/cli/q/src/asm"
|
"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/expression"
|
||||||
"git.akyoto.dev/cli/q/src/types"
|
"git.akyoto.dev/cli/q/src/types"
|
||||||
)
|
)
|
||||||
@ -11,6 +12,11 @@ func (f *Function) CompileDelete(root *expression.Expression) error {
|
|||||||
parameters := root.Children[1:]
|
parameters := root.Children[1:]
|
||||||
variableName := parameters[0].Token.Text(f.File.Bytes)
|
variableName := parameters[0].Token.Text(f.File.Bytes)
|
||||||
variable := f.VariableByName(variableName)
|
variable := f.VariableByName(variableName)
|
||||||
|
|
||||||
|
if variable == nil {
|
||||||
|
return errors.New(&errors.UnknownIdentifier{Name: variableName}, f.File, parameters[0].Token.Position)
|
||||||
|
}
|
||||||
|
|
||||||
defer f.UseVariable(variable)
|
defer f.UseVariable(variable)
|
||||||
f.SaveRegister(f.CPU.Input[0])
|
f.SaveRegister(f.CPU.Input[0])
|
||||||
f.SaveRegister(f.CPU.Input[1])
|
f.SaveRegister(f.CPU.Input[1])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user