Switching: callbacks.

dev
Philippe PITTOLI 2024-06-17 00:15:44 +02:00
parent 0fe2712362
commit 1832065fa0
1 changed files with 42 additions and 20 deletions

View File

@ -27,37 +27,45 @@ const ipc = @cImport({
// // Switch functions (for "protocol" services, such as TCPd). // // Switch functions (for "protocol" services, such as TCPd).
// int ipc_add_external (void* ctx, int newfd); // int ipc_add_external (void* ctx, int newfd);
// //
// // Returned "char" is a cb_event_types enum.
// int ipc_set_switch_callbacks (void* ctx, int fd
// , char (*in (int orig, const char *payload, uint32_t *mlen))
// , char (*out(int dest, char *payload, uint32_t mlen)));
// TODO: noreturn error function: print a error message then crash. // TODO: noreturn error function: print a error message then crash.
// TODO: connection to the proxied service // TODO: connection to the proxied service
// TODO: handle connections and disconnections // TODO: handle connections and disconnections
// TODO: handle messages (proxy) // TODO: handle messages (proxy)
// TODO: find why "in" and "out" functions are detected as
// returning "[*c]u8" while they should be returning u8.
const stdout = std.io.getStdOut().writer(); const stdout = std.io.getStdOut().writer();
var context : ?*anyopaque = undefined; var context : ?*anyopaque = undefined;
//pub fn in(origin : i32, payload : [*]u8, mlen : *u32) callconv(.C) u8 // char (*in (int orig, const char *payload, uint32_t *mlen))
//{ pub fn in(origin : c_int, _ : [*c]const u8, _ : [*c]u32) callconv(.C) [*c]u8 // why this return type?!
//} {
// stdout.print("we are IN origin is {}\n", .{origin}) catch {};
//pub fn out(dest_fd : i32, , payload : [*]u8, mlen : u32) callconv(.C) u8 return 1;
//{ }
//}
// char (*out(int dest, char *payload, uint32_t mlen)));
pub fn out(dest_fd : c_int, _ : [*c]u8, _ : u32) callconv(.C) [*c]u8 // why this return type?!
{
stdout.print("we are OUT target is {}\n", .{dest_fd}) catch {};
return 1;
}
var proxy_name : [:0]const u8 = "proxy";
var proxied_service : [:0]const u8 = "pong";
pub fn connection_and_link(client_fd : i32) !void pub fn connection_and_link(client_fd : i32) !void
{ {
try stdout.print("Connection of a new user ({})\n", .{client_fd});
// Connection to the proxied service. // Connection to the proxied service.
const proxied_service = "pong";
var proxied_service_socket_fd : i32 = 0; var proxied_service_socket_fd : i32 = 0;
var ret = ipc.ipc_connect_service (context, &proxied_service_socket_fd, proxied_service, proxied_service.len); var ret = ipc.ipc_connect_service (context
, &proxied_service_socket_fd
, proxied_service
, @intCast(proxied_service.len));
if (ret != 0) { if (ret != 0) {
try stdout.print("Impossible to connect to the service {s}\n", .{proxied_service}); try stdout.print("Impossible to connect to the service {s}\n", .{proxied_service});
return error.CannotConnectToService; return error.CannotConnectToService;
@ -72,6 +80,14 @@ pub fn connection_and_link(client_fd : i32) !void
} }
errdefer _ = ipc.ipc_close_fd(context, client_fd); errdefer _ = ipc.ipc_close_fd(context, client_fd);
// Returned "char" is a cb_event_types enum.
try stdout.print("Hello we will put some callbacks\n", .{});
ret = ipc.ipc_set_switch_callbacks (context, client_fd, in, out);
if (ret != 0) {
try stdout.print("Impossible to set the callbacks {} -> {s}\n", .{client_fd, proxied_service});
return error.CannotAddCallbacks;
}
try stdout.print("Connection of a new user ({}): linked with '{s}' ({})\n", try stdout.print("Connection of a new user ({}): linked with '{s}' ({})\n",
.{client_fd, proxied_service, proxied_service_socket_fd}); .{client_fd, proxied_service, proxied_service_socket_fd});
} }
@ -94,11 +110,17 @@ pub fn message_tx(fd : i32) !void
} }
pub fn main() !void { pub fn main() !void {
var service_socket_fd : i32 = 0; const args = try std.process.argsAlloc(std.heap.page_allocator);
if (args.len != 3) {
try stdout.print("usage: {s} proxy-name target-service\n", .{args[0]});
try stdout.print("example: {s} mypongproxy pong\n", .{args[0]});
return;
}
// Initialization of the hashmap. proxy_name = args[1];
// hash = AutoArrayHashMap(i32, i32).init(std.heap.c_allocator); proxied_service = args[2];
// defer hash.deinit(); // Free the hashmap structure memory.
var service_socket_fd : i32 = 0;
// Initialization of the proxy. // Initialization of the proxy.
switch(ipc.ipc_context_init(&context)) { switch(ipc.ipc_context_init(&context)) {
@ -107,7 +129,7 @@ pub fn main() !void {
} }
defer { _ = ipc.ipc_context_deinit(&context); } // Free the context structure memory. defer { _ = ipc.ipc_context_deinit(&context); } // Free the context structure memory.
switch(ipc.ipc_service_init(context, &service_socket_fd, "proxy", 5)) { switch(ipc.ipc_service_init(context, &service_socket_fd, proxy_name, @intCast(proxy_name.len))) {
0 => try stdout.print("Service initialized\n", .{}), 0 => try stdout.print("Service initialized\n", .{}),
else => try stdout.print("Problem while initializing the service\n", .{}), else => try stdout.print("Problem while initializing the service\n", .{}),
} }