IPCd is working for aliases. No error management, WIP.

master
Philippe Pittoli 2023-01-04 11:34:49 +01:00
parent 1b19118701
commit d72aac1a50
2 changed files with 54 additions and 14 deletions

View File

@ -148,6 +148,15 @@ pub const Context = struct {
var reception_buffer: [1500]u8 = undefined;
var reception_size: usize = 0;
var newfd = try receive_fd (ipcdfd, &reception_buffer, &reception_size);
var response = reception_buffer[0..reception_size - 1];
if (response.len > 0) {
print ("receive_fd:message received: {s} (len: {}\n)\n", .{response, response.len});
}
const ok = "ok";
if (! std.mem.eql(u8, response[0..1], ok[0..1])) {
print("THIS IS NOT OKAY :O\n", .{}); // DEBUG TODO FIXME
return error.IPCdFailed;
}
var newcon = Connection.init(connection_type, null);
try self.add_ (newcon, newfd);
return newfd;
@ -169,6 +178,7 @@ pub const Context = struct {
if (self.pollfd.items[i].fd == fd) {
return i;
}
i += 1;
}
return error.IndexNotFound;
}
@ -461,6 +471,8 @@ pub const Context = struct {
return error.IndexOutOfBounds;
}
print("closing client/server at index {}\n", .{index});
// close the connection and remove it from the two structures
var con = self.connections.swapRemove(index);
// Remove service's UNIX socket file.
@ -471,6 +483,8 @@ pub const Context = struct {
var pollfd = self.pollfd.swapRemove(index);
std.os.close(pollfd.fd);
print("closing client at index {}\n", .{index});
// Remove all its non-sent messages.
var i: usize = 0;
while (true) {

View File

@ -72,11 +72,13 @@ fn create_service() !void {
var some_event: ipc.Event = undefined;
ctx.timer = 10000; // 10 seconds
var count: u32 = 0;
while(! S.should_quit) {
some_event = try ctx.wait_event();
switch (some_event.t) {
.TIMER => {
print("Timer!\n", .{});
print("\rTimer! ({})", .{count});
count += 1;
},
.CONNECTION => {
@ -116,22 +118,46 @@ fn create_service() !void {
print("Client asking for a service through ipcd.\n", .{});
if (some_event.m) |m| {
print("Message: {}\n", .{m});
// 1. split message
// TODO
print("payload is: {s}\n", .{m.payload});
var iterator = std.mem.split(u8, m.payload, ";");
var service_to_contact = iterator.first();
print("service to contact: {s}\n", .{service_to_contact});
var final_destination: ?[]const u8 = null;
// 2. find relevant part of the message
// TODO
// 3. connect whether asked to
// TODO
// 4. send_fd or send an error
// TODO
var response = try Message.init(some_event.origin
, Message.Type.ERROR
, allocator
, "currently not implemented");
try ctx.write(response);
response.deinit();
m.deinit();
while (iterator.next()) |next| {
print("next part: {s}\n", .{next});
var iterator2 = std.mem.split(u8, next, " ");
var sname = iterator2.first();
var target = iterator2.next();
if (target) |t| {
print ("sname: {s} - target: {s}\n", .{sname, t});
if (std.mem.eql(u8, service_to_contact, sname)) {
final_destination = t;
}
}
else {
print("ERROR: no target in: {s}\n", .{next});
}
}
// 3. connect whether asked to and send a message
// TODO: currently only switching with other UNIX sockets ^^'.
// Should include TCP connections in a near future.
if (final_destination) |dest| {
print("service IPCd should contact for the client: {s}, via {s}\n"
, .{service_to_contact, dest});
var newfd = try ctx.connect_service (dest);
send_fd (some_event.origin, "ok", newfd);
print("fd sent\n" , .{});
try ctx.close_fd (some_event.origin);
print("FD 1 removed\n" , .{});
try ctx.close_fd (newfd);
print("FDs removed\n" , .{});
}
}
else {
// There is a problem: ipcd was contacted without providing