IPCd: first commit. Basic switch.

master
Philippe PITTOLI 2024-06-19 20:00:25 +02:00
commit f7c67698c6
4 changed files with 133 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
/docs/
/lib/
/bin/
/.shards/
*.dwarf
shard.lock

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# ipcd
TODO: Write a description here
## Installation
TODO: Write installation instructions here
## Usage
TODO: Write usage instructions here
## Development
TODO: Write development instructions here
## Contributing
1. Fork it (<https://github.com/your-github-user/ipcd/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## Contributors
- [Philippe PITTOLI](https://github.com/your-github-user) - creator and maintainer

17
shard.yml Normal file
View File

@ -0,0 +1,17 @@
name: ipcd
version: 0.1.0
authors:
- Philippe PITTOLI <karchnu@karchnu.fr>
targets:
ipcd:
main: src/ipcd.cr
dependencies:
ipc:
git: https://git.baguette.netlib.re/Baguette/ipc.cr
crystal: '>= 1.12.2'
license: ISC

83
src/ipcd.cr Normal file
View File

@ -0,0 +1,83 @@
require "ipc"
# TODO: Write documentation for `IPCd`
module IPCd
VERSION = "0.1.0"
def self.start
ipcd = IPC.new()
ipcd.service_init "hello"
ipcd.timer 10_000
ipcd.loop do |event|
begin
case event.type
when LibIPC::EventType::Timer
puts "Timer."
when LibIPC::EventType::Connection
fd = ipcd.connect "pong"
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
puts "New connection (#{event.newfd}) now automatically switched to 'pong' (#{fd})!"
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
puts "Switch message received from #{event.fd}."
when LibIPC::EventType::SwitchTx
puts "Switch message sent to #{event.fd}."
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
puts "switch input: #{fd}"
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)
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
puts "switch output: #{fd}"
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