--: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")