2024-06-19 20:00:25 +02:00
|
|
|
require "ipc"
|
2024-06-21 21:12:25 +02:00
|
|
|
require "hexa"
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
# TODO: Write documentation for `IPCd`
|
|
|
|
module IPCd
|
|
|
|
VERSION = "0.1.0"
|
2024-06-22 01:18:33 +02:00
|
|
|
@@proxy_name = "ipcd"
|
|
|
|
@@proxied_service = "pong"
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
def self.start
|
2024-06-22 01:18:33 +02:00
|
|
|
@@proxied_service = ARGV[0] if ARGV.size >= 1
|
|
|
|
@@proxy_name = ARGV[1] if ARGV.size >= 2
|
|
|
|
|
|
|
|
puts "proxy named #{@@proxy_name} for service #{@@proxied_service}"
|
|
|
|
|
2024-06-19 20:00:25 +02:00
|
|
|
ipcd = IPC.new()
|
2024-06-22 01:18:33 +02:00
|
|
|
ipcd.service_init @@proxy_name
|
2024-06-19 20:00:25 +02:00
|
|
|
ipcd.timer 10_000
|
2024-06-21 21:12:25 +02:00
|
|
|
timer = 0
|
2024-06-19 20:00:25 +02:00
|
|
|
ipcd.loop do |event|
|
|
|
|
begin
|
|
|
|
case event.type
|
|
|
|
when LibIPC::EventType::Timer
|
2024-06-21 21:12:25 +02:00
|
|
|
STDOUT.write "Timer #{timer}.\r".to_slice
|
|
|
|
STDOUT.flush
|
|
|
|
timer += 1
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
when LibIPC::EventType::Connection
|
2024-06-22 01:18:33 +02:00
|
|
|
fd = ipcd.connect @@proxied_service
|
2024-06-19 20:00:25 +02:00
|
|
|
ipcd.add_switch event.newfd, fd
|
|
|
|
input = -> fn_input( LibC::Int, LibC::Char*, LibC::UInt64T*)
|
|
|
|
output = -> fn_output(LibC::Int, LibC::Char*, LibC::UInt64T )
|
|
|
|
ipcd.switch_callbacks event.newfd, input, output
|
2024-06-22 01:18:33 +02:00
|
|
|
puts "New connection (#{event.newfd}) now automatically switched to '#{@@proxied_service}' (#{fd})!"
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
when LibIPC::EventType::Disconnection
|
|
|
|
puts "Disconnection from #{event.fd}."
|
|
|
|
|
|
|
|
when LibIPC::EventType::MessageTx
|
|
|
|
puts "Message sent to #{event.fd}."
|
|
|
|
|
|
|
|
when LibIPC::EventType::MessageRx
|
|
|
|
puts "Message received from #{event.fd}."
|
|
|
|
|
|
|
|
when LibIPC::EventType::SwitchRx
|
2024-06-21 21:12:25 +02:00
|
|
|
#puts "Switch message received from #{event.fd}."
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
when LibIPC::EventType::SwitchTx
|
2024-06-21 21:12:25 +02:00
|
|
|
#puts "Switch message sent to #{event.fd}."
|
2024-06-19 20:00:25 +02:00
|
|
|
|
|
|
|
when LibIPC::EventType::Error
|
|
|
|
puts "And error occured on fd #{event.fd}."
|
|
|
|
|
|
|
|
else
|
|
|
|
puts "Unhandled IPC event: #{event.class}."
|
|
|
|
if event.responds_to?(:fd)
|
|
|
|
puts "closing #{event.fd}"
|
|
|
|
ipcd.close event.fd
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
rescue exception
|
|
|
|
puts "exception: #{typeof(exception)} - #{exception.message}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def fn_input(fd : LibC::Int, buffer : LibC::Char*, buflen : LibC::UInt64T*) : LibC::Char
|
|
|
|
io = IO::FileDescriptor.new fd, close_on_finalize: false
|
|
|
|
slice = Bytes.new buffer, buflen.value
|
|
|
|
len = io.read slice
|
|
|
|
buflen.value = len.to_u64
|
|
|
|
return 2_u8 if (len == 0)
|
2024-06-21 21:12:25 +02:00
|
|
|
|
|
|
|
hexa = Hexa.new 50_000
|
|
|
|
bytes = Bytes.new buffer, buflen.value
|
|
|
|
puts hexa.dump "message received from #{fd}", bytes
|
|
|
|
|
2024-06-19 20:00:25 +02:00
|
|
|
0_u8
|
|
|
|
rescue e
|
|
|
|
puts "fn_input exception! #{e}"
|
|
|
|
1_u8
|
|
|
|
end
|
|
|
|
|
|
|
|
def fn_output(fd : LibC::Int, buffer : LibC::Char*, buflen : LibC::UInt64T) : LibC::Char
|
2024-06-21 21:12:25 +02:00
|
|
|
hexa = Hexa.new 50_000
|
|
|
|
bytes = Bytes.new buffer, buflen
|
|
|
|
puts hexa.dump "message to send to #{fd}", bytes
|
|
|
|
|
2024-06-19 20:00:25 +02:00
|
|
|
slice = Bytes.new buffer, buflen
|
|
|
|
io = IO::FileDescriptor.new fd, close_on_finalize: false
|
|
|
|
io.write slice
|
|
|
|
io.flush
|
|
|
|
0_u8
|
|
|
|
rescue e
|
|
|
|
puts "fn_output exception! #{e}"
|
|
|
|
1_u8
|
|
|
|
end
|
|
|
|
|
|
|
|
IPCd.start
|