diff --git a/core/ipc.cr b/core/ipc.cr new file mode 100644 index 0000000..413a9db --- /dev/null +++ b/core/ipc.cr @@ -0,0 +1,86 @@ + +@[Link("ipc")] +lib LibIPC + struct Service + version : LibC::UInt + index : LibC::UInt + spath : LibC::Char[4096] # [PATH_MAX] + fd : LibC::Int + end + + struct Client + version : LibC::UInt + index : LibC::UInt + fd : LibC::Int + end + + struct Message + type : LibC::Char + length : LibC::UShort + payload : LibC::Char* + end + + struct ClientArray + clients : Client** + size : LibC::Int + end + + # FIXME: IPC.initialize: + # - throw exceptions on error. + # - Make most arguments optional. + fun ipc_server_init(argc : LibC::Int, argv : LibC::Char**, env : LibC::Char**, service : Service*, sname : LibC::Char*) : LibC::Int + # FIXME: IPC.(destroy?) + fun ipc_server_close(Service*) : LibC::Int + fun ipc_server_close_client(Client*) : LibC::Int + + fun ipc_server_accept(Service*, Client*) : LibC::Int + fun ipc_server_read(Client*, Message*) : LibC::Int + fun ipc_server_write(Client*, Message*) : LibC::Int + + fun ipc_server_select(ClientArray*, Service*, ClientArray*) : LibC::Int + + fun ipc_application_connection(LibC::Int, LibC::Char**, LibC::Char**, Service*, LibC::Char*, LibC::Char*, LibC::UInt) + fun ipc_application_close(Service*) + fun ipc_application_read(Service*, Message*) + fun ipc_application_write(Service*, Message*) +end + +class IPC::Service + # FIXME: getter only as long as proper bindings are unfinished + getter service = LibIPC::Service.new + + def initialize(name : String) + if LibIPC.ipc_server_init(ARGV.size, ARGV.map(&.to_unsafe).to_unsafe, LibC.environ, pointerof(@service), name) < 0 + # FIXME: throw exception. + puts "error: ipc_server_init < 0" + exit 1 + end + end + + def finalize + # FIXME: throw exception + if LibIPC.ipc_server_close(pointerof(@service)) < 0 + puts "error: ipc_server_close < 0" + exit 1 + end + end +end + +args = ["lala", "--oh-noes"].map &.bytes.to_unsafe + +service = IPC::Service.new "pongd" + +client = LibIPC::Client.new + + +client_array = LibIPC::ClientArray.new + +pp! client +struct_service = service.service +if LibIPC.ipc_server_accept(pointerof(struct_service), pointerof(client)) + puts "error: ipc_server_accept < 0" +end +pp! client + +p LibIPC.ipc_server_close_client pointerof(client) +