gnunet-service-zig.zig (1832B)
1 const gnunet = @cImport({ 2 @cInclude("gnunet/gnunet_util_lib.h"); 3 }); 4 5 const std = @import("std"); 6 const print = std.debug.print; 7 8 var id_svc: ?*gnunet.GNUNET_IDENTITY_Handle = undefined; 9 10 pub fn do_shutdown(cls: ?*anyopaque) callconv(.C) void { 11 _ = cls; 12 std.debug.print("Shutting down!\n", .{}); 13 } 14 15 pub fn client_conn(cls: ?*anyopaque, c: ?*gnunet.GNUNET_SERVICE_Client, mq: ?*gnunet.GNUNET_MQ_Handle) callconv(.C) ?*anyopaque { 16 _ = cls; 17 _ = c; 18 _ = mq; 19 return null; 20 } 21 22 pub fn client_disco(cls: ?*anyopaque, c: ?*gnunet.GNUNET_SERVICE_Client, internal_cls: ?*anyopaque) callconv(.C) void { 23 _ = cls; 24 _ = c; 25 _ = internal_cls; 26 } 27 28 pub fn run(cls: ?*anyopaque, cfg: ?*const gnunet.GNUNET_CONFIGURATION_Handle, svc: ?*gnunet.GNUNET_SERVICE_Handle) callconv(.C) void { 29 // Explicit discard, C compiler usually only warns, zig errors out! 30 _ = svc; 31 _ = cfg; 32 // Recover closure from anonymous anyopaque 33 const hi: [*:0]u8 = @as([*:0]u8, @ptrCast(cls)); 34 std.debug.print("{s}\n", .{hi}); 35 // This does a lot of stuff internally, opening UDS, sending/receiving messages etc. 36 _ = gnunet.GNUNET_SCHEDULER_add_shutdown(do_shutdown, null); 37 return; 38 } 39 40 pub fn main() !u8 { 41 // you are an anonymous empty object 42 const argv = std.os.argv; 43 const c_ptr: [*c][*c]u8 = @ptrCast(argv.ptr); 44 const hi = "hihihi"; 45 46 const mh: *const gnunet.GNUNET_MQ_MessageHandler = &.{}; 47 const ret = gnunet.GNUNET_SERVICE_run_(gnunet.GNUNET_OS_project_data_gnunet(), @intCast(std.os.argv.len), c_ptr, "zig-example", gnunet.GNUNET_SERVICE_OPTION_NONE, &run, &client_conn, &client_disco, @constCast(hi), mh); 48 if (ret != 0) { 49 std.debug.print("Return val: {d}, expected: {d}\n", .{ ret, gnunet.GNUNET_OK }); 50 } 51 return @intCast(ret); 52 //try stdout.writeAll(res); 53 }