Obsolete
/
ipc.cr-old
Archived
3
0
Fork 0
This repository has been archived on 2024-06-18. You can view files and clone it, but cannot push or open issues/pull-requests.
ipc.cr-old/src/ipc/lowlevel.cr

162 lines
4.9 KiB
Crystal
Raw Normal View History

2019-07-27 15:29:27 +02:00
@[Link("ipc")]
lib LibIPC
2020-07-03 19:11:10 +02:00
INFTIM = -1
2020-07-03 13:48:39 +02:00
enum ConnectionType
2020-07-08 16:49:09 +02:00
IPC # IO op. are handled by libipc.
External # IO op. are handled by the libipc user app.
Server # Should listen and accept new IPC users.
Switched # IO op. are handled by callbacks.
2020-07-03 13:48:39 +02:00
end
2019-07-27 15:29:27 +02:00
struct Connection
2020-07-03 13:48:39 +02:00
type : ConnectionType #
spath : LibC::Char* # [4096] # [PATH_MAX]
2019-07-27 15:29:27 +02:00
end
struct Pollfd
fd : LibC::Int
events : LibC::Short
revents : LibC::Short
end
2019-07-27 15:29:27 +02:00
struct Switching
origin : LibC::Int
dest : LibC::Int
2020-07-08 19:31:29 +02:00
orig_cb_in : (Int32, Pointer(Message)) -> ConnectionType
orig_cb_out : (Int32, Pointer(Message)) -> ConnectionType
dest_cb_in : (Int32, Pointer(Message)) -> ConnectionType
dest_cb_out : (Int32, Pointer(Message)) -> ConnectionType
2019-07-27 15:29:27 +02:00
end
struct Switchings
collection : Switching*
size : LibC::UInt
end
2020-07-09 01:46:22 +02:00
struct Ctx
cinfos : Connection*
pollfd : Pollfd*
size : LibC::UInt64T
tx : Messages
switchdb : Switchings
end
2019-07-27 15:29:27 +02:00
enum MessageType
ServerClose
Error
Data
LookUp
end
# Messages are stored in lists within the libipc before being sent.
struct Messages
messages : Message*
2020-07-02 22:29:35 +02:00
size : LibC::UInt64T
end
2019-07-27 15:29:27 +02:00
struct Message
type : UInt8 # Internal message type.
user_type : UInt8 # User-defined message type.
fd : LibC::Int # fd of the sender.
length : LibC::UInt # Payload length.
payload : LibC::Char* #
2019-07-27 15:29:27 +02:00
end
enum EventType
2020-07-02 21:13:54 +02:00
NotSet #
Error #
ExtraSocket # Message received from a non IPC socket.
Switch # Message to send to a corresponding fd.
Connection # New user.
Disconnection # User disconnected.
Message # New message.
LookUp # Client asking for a service through ipcd.
Timer # Timeout in the poll(2) function.
Tx # Message sent.
2019-07-27 15:29:27 +02:00
end
struct Event
type : EventType #
index : LibC::UInt # Index of the sender in the ipc_ctx structure.
origin : LibC::Int # fd of the sender.
message : Message* # Pointer to the reveiced message.
2019-07-27 15:29:27 +02:00
end
struct IPCError
# This is the size of an enumeration in C.
error_code : UInt32
error_message : LibC::Char[8192]
end
# Connection functions.
# Context is allocated, ipcd is requested and the connection/initialisation is performed.
fun ipc_server_init(ctx : Ctx*, sname : LibC::Char*) : IPCError
fun ipc_connection(Ctx*, LibC::Char*) : IPCError
2020-07-11 10:46:17 +02:00
fun ipc_connection_switched(Ctx*, LibC::Char*, LibC::Int, Pointer(LibC::Int)) : IPCError
# ipc_message_copy: pm, @fd, @mtype, @utype, @payload
fun ipc_message_copy(Message*, LibC::Int, UInt8, UInt8, LibC::Char*, Int32)
2019-07-27 15:29:27 +02:00
# Closing connections.
2020-07-02 22:29:35 +02:00
fun ipc_close(ctx : Ctx*, index : LibC::UInt64T) : IPCError
2020-07-11 10:46:17 +02:00
fun ipc_close_all(ctx : Ctx*) : IPCError
2019-07-27 15:29:27 +02:00
fun ipc_ctx_free(Ctx*) # Void
2019-07-27 15:29:27 +02:00
# Loop function.
2020-07-06 08:40:56 +02:00
fun ipc_wait_event(Ctx*, Event*, LibC::Int*) : IPCError
2019-07-27 15:29:27 +02:00
# Adding and removing file discriptors to read.
fun ipc_add(Ctx*, Connection*, Pollfd*) : IPCError
fun ipc_del(Ctx*, LibC::UInt) : IPCError
fun ipc_add_fd(Ctx*, LibC::Int) : IPCError
2020-07-08 16:49:09 +02:00
fun ipc_add_fd_switched(Ctx*, LibC::Int) : IPCError
fun ipc_del_fd(Ctx*, LibC::Int) : IPCError
2019-07-27 15:29:27 +02:00
# Sending a message (will wait the fd to become available for IO operations).
fun ipc_write(Ctx*, Message*) : IPCError
2019-07-27 15:29:27 +02:00
# This function let the user get the default error message based on the error code.
# The error message is contained in the IPCError structure, this function should not be used, in most cases.
2019-07-27 15:29:27 +02:00
fun ipc_errors_get (LibC::Int) : LibC::Char*
2020-07-03 13:42:19 +02:00
# Exchanging file descriptors (used with ipcd on connection).
fun ipc_receive_fd (sock : LibC::Int, fd : LibC::Int*) : IPCError
fun ipc_provide_fd (sock : LibC::Int, fd : LibC::Int ) : IPCError
2019-07-27 15:29:27 +02:00
2020-07-08 16:49:09 +02:00
# To change the type of a fd.
2020-07-09 09:33:34 +02:00
fun ipc_ctx_fd_type(Ctx*, LibC::Int, LibIPC::ConnectionType) : LibC::Int
2020-07-08 16:49:09 +02:00
enum IPCCB
NoError #
Closing #
Error #
ParsingError #
2020-07-10 14:58:41 +02:00
Ignore #
2020-07-08 16:49:09 +02:00
end
# Changing the callbacks for switched fd.
# ipc_switching_callbacks: ctx, fd
# , enum ipccb cb_in (fd, *ipc_message)
# , enum ipccb cb_out (fd, *ipc_message)
fun ipc_switching_callbacks(Ctx*, LibC::Int,
2020-07-10 14:58:41 +02:00
(LibC::Int, LibIPC::Message* -> LibIPC::IPCCB),
(LibC::Int, LibIPC::Message* -> LibIPC::IPCCB))
2020-07-08 16:49:09 +02:00
2020-07-10 14:58:41 +02:00
fun ipc_ctx_switching_add (ctx : Ctx*, fd1 : LibC::Int, fd2 : LibC::Int) # Void
fun ipc_switching_add (switch : Switchings*, fd1 : LibC::Int, fd2 : LibC::Int) # Void
fun ipc_switching_del (switch : Switchings*, fd : LibC::Int ) : LibC::Int
fun ipc_switching_get (switch : Switchings*, fd : LibC::Int ) : LibC::Int
fun ipc_switching_free (switch : Switchings* ) # Void
2019-07-27 15:29:27 +02:00
# non public functions
2020-07-02 21:48:17 +02:00
fun ipc_read(ctx : Ctx*, index : LibC::UInt, message : Message*) : IPCError
# for testing purposes
fun ipc_switching_print (switch : Switchings*) # Void
fun service_path (path : LibC::Char*, sname : LibC::Char*, index : Int32, version : Int32) : IPCError
2020-07-02 22:30:40 +02:00
fun ipc_ctx_print (Ctx*) # Void
2019-07-27 15:29:27 +02:00
end