libipc can now add new clients
parent
1f5ac951cb
commit
9f214180a7
|
@ -39,7 +39,7 @@ pub const Connection = struct {
|
||||||
|
|
||||||
pub fn deinit(self: *Self) void {
|
pub fn deinit(self: *Self) void {
|
||||||
if (self.server) |*s| { s.deinit(); }
|
if (self.server) |*s| { s.deinit(); }
|
||||||
// if (self.client) |*c| { c.deinit(); }
|
if (self.client) |*c| { c.deinit(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format(self: Self, comptime _: []const u8, _: fmt.FormatOptions, out_stream: anytype) !void {
|
pub fn format(self: Self, comptime _: []const u8, _: fmt.FormatOptions, out_stream: anytype) !void {
|
||||||
|
|
|
@ -117,15 +117,35 @@ pub const Context = struct {
|
||||||
// return newfd;
|
// return newfd;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// TODO: find better error name
|
||||||
|
pub fn accept_new_client(self: *Self, event: *Event, server_index: usize) !void {
|
||||||
|
// net.StreamServer
|
||||||
|
var server = self.connections.items[server_index].server orelse return error.SocketLOL; // TODO
|
||||||
|
var client = try server.accept(); // net.StreamServer.Connection
|
||||||
|
|
||||||
|
const newfd = client.stream.handle;
|
||||||
|
var newcon = Connection.init(Connection.Type.IPC, null);
|
||||||
|
newcon.client = client;
|
||||||
|
try self.connections.append(newcon);
|
||||||
|
try self.pollfd.append(.{ .fd = newfd
|
||||||
|
, .events = std.os.linux.POLL.IN
|
||||||
|
, .revents = 0 });
|
||||||
|
|
||||||
|
const sfd = server.sockfd orelse return error.SocketLOL; // TODO
|
||||||
|
// WARNING: imply every new item is last
|
||||||
|
event.set(Event.Type.CONNECTION, self.pollfd.items.len - 1, sfd, null);
|
||||||
|
}
|
||||||
|
|
||||||
// Create a unix socket.
|
// Create a unix socket.
|
||||||
// Store std lib structures in the context.
|
// Store std lib structures in the context.
|
||||||
|
// TODO: find better error name
|
||||||
pub fn server_init(self: *Self, path: [] const u8) !net.StreamServer {
|
pub fn server_init(self: *Self, path: [] const u8) !net.StreamServer {
|
||||||
// print("context server init {s}\n", .{path});
|
// print("context server init {s}\n", .{path});
|
||||||
var server = net.StreamServer.init(.{});
|
var server = net.StreamServer.init(.{});
|
||||||
var socket_addr = try net.Address.initUnix(path);
|
var socket_addr = try net.Address.initUnix(path);
|
||||||
try server.listen(socket_addr);
|
try server.listen(socket_addr);
|
||||||
|
|
||||||
const newfd = server.sockfd orelse return error.SocketLOL;
|
const newfd = server.sockfd orelse return error.SocketLOL; // TODO
|
||||||
var newcon = Connection.init(Connection.Type.SERVER, path);
|
var newcon = Connection.init(Connection.Type.SERVER, path);
|
||||||
newcon.server = server;
|
newcon.server = server;
|
||||||
try self.connections.append(newcon);
|
try self.connections.append(newcon);
|
||||||
|
@ -221,8 +241,7 @@ pub const Context = struct {
|
||||||
if(fd.revents & std.os.linux.POLL.IN > 0) {
|
if(fd.revents & std.os.linux.POLL.IN > 0) {
|
||||||
// SERVER = new connection
|
// SERVER = new connection
|
||||||
if (self.connections.items[i].t == .SERVER) {
|
if (self.connections.items[i].t == .SERVER) {
|
||||||
// TODO: ipc_accept_add
|
try self.accept_new_client(¤t_event, i);
|
||||||
current_event = Event.init(Event.Type.CONNECTION, i, fd.fd, null);
|
|
||||||
}
|
}
|
||||||
// SWITCHED = send message to the right dest (or drop the switch)
|
// SWITCHED = send message to the right dest (or drop the switch)
|
||||||
else if (self.connections.items[i].t == .SWITCHED) {
|
else if (self.connections.items[i].t == .SWITCHED) {
|
||||||
|
|
|
@ -59,7 +59,7 @@ fn create_service() !void {
|
||||||
some_event = try ctx.wait_event();
|
some_event = try ctx.wait_event();
|
||||||
switch (some_event.t) {
|
switch (some_event.t) {
|
||||||
.CONNECTION => {
|
.CONNECTION => {
|
||||||
print("New connection!\n", .{});
|
print("New connection: {}!\n", .{some_event});
|
||||||
break;
|
break;
|
||||||
},
|
},
|
||||||
.TIMER => {
|
.TIMER => {
|
||||||
|
|
Reference in New Issue