forked from Hyperion/HyperionOS
59 lines
1.8 KiB
Plaintext
59 lines
1.8 KiB
Plaintext
--:Minify:--
|
|
-- Supports:
|
|
-- AF_UNIX - local IPC via /var/run/*.sock paths
|
|
-- AF_INET - network sockets with three backends:
|
|
-- Implemented by drivers but expect http:// and https://
|
|
--
|
|
-- Socket lifecycle:
|
|
-- fd = syscall.socket(domain, socktype) -- "unix"/"inet", "stream"/"dgram"
|
|
-- syscall.bind(fd, address) -- server: claim address
|
|
-- syscall.listen(fd, backlog) -- server: mark as listening
|
|
-- cfd = syscall.accept(fd) -- server: get connected client fd (blocking poll)
|
|
-- syscall.connect(fd, address) -- client: connect to server
|
|
-- syscall.send(fd, data) -- send bytes
|
|
-- syscall.recv(fd, len) -- receive bytes (blocking poll, returns "" on nothing)
|
|
-- syscall.sockshutdown(fd) -- half-close send side
|
|
-- -- normal vfs.close(fd) closes the socket
|
|
|
|
local kernel=...
|
|
local socket={}
|
|
socket.handlers={}
|
|
kernel.socket=socket
|
|
|
|
function socket.registerProtocal(protocal, handler)
|
|
socket.handlers[protocal] = handler
|
|
end
|
|
|
|
function socket.socket()
|
|
local P=kernel.vfs.P
|
|
local data=kernel.newFifo()
|
|
local isClosed=false
|
|
kernel.vfs.newfd({
|
|
handle={
|
|
read=function() if isClosed then error("ECCON") end return data.read() end,
|
|
write=function() if isClosed then error("ECCON") end return data.write() end,
|
|
close=function() isClosed = true end
|
|
},
|
|
type="socket",
|
|
refcount=1,
|
|
|
|
meta={
|
|
owner=kernel.currentTask.uid,
|
|
group=kernel.currentTask.uid,
|
|
etype=2,
|
|
perms=P.OWNER_R+P.OWNER_W+P.GROUP_R+P.GROUP_W
|
|
},
|
|
isvirt=true
|
|
})
|
|
end
|
|
|
|
function socket.connect(fd, address)
|
|
|
|
end
|
|
|
|
function socket.listen(fd, backlog)
|
|
|
|
end
|
|
|
|
kernel.log("Loaded socket module")
|