gnunet.zig (2138B)
1 // Author: Martin Schanzenbach; License: AGPL3+ 2 3 const gnunet = @cImport({ 4 @cInclude("gnunet/gnunet_util_lib.h"); 5 @cInclude("gnunet/gnunet_identity_service.h"); 6 }); 7 8 const std = @import("std"); 9 const print = std.debug.print; 10 11 var id_svc: ?*gnunet.GNUNET_IDENTITY_Handle = undefined; 12 13 pub fn do_shutdown(cls: ?*anyopaque) callconv(.C) void { 14 _ = cls; 15 gnunet.GNUNET_IDENTITY_disconnect(id_svc); 16 } 17 18 pub fn id_cb(cls: ?*anyopaque, ego: ?*gnunet.GNUNET_IDENTITY_Ego, ctx: [*c]?*anyopaque, name: [*c]const u8) callconv(.C) void { 19 _ = ctx; 20 _ = cls; 21 if (ego == null and name != null) { 22 // Unreachable only in this demo, I think! 23 unreachable; 24 } 25 if (ego == null) { // last iteration 26 gnunet.GNUNET_SCHEDULER_shutdown(); 27 return; 28 } 29 // Remove to see fancy error 30 if (name == null) { 31 return; 32 } 33 var pk: gnunet.GNUNET_CRYPTO_PublicKey = .{}; 34 gnunet.GNUNET_IDENTITY_ego_get_public_key(ego, &pk); 35 const pk_str = gnunet.GNUNET_CRYPTO_public_key_to_string(&pk); 36 defer std.c.free(pk_str); 37 std.debug.print("{s} - {s}\n", .{ name, pk_str }); 38 } 39 40 pub fn run(cls: ?*anyopaque, args: [*c]const [*c]u8, cfgfile: [*c]const u8, cfg: ?*const gnunet.GNUNET_CONFIGURATION_Handle) callconv(.C) void { 41 // Explicit discard, C compiler usually only warns, zig errors out! 42 _ = cfgfile; 43 _ = args; 44 _ = cls; 45 // This does a lot of stuff internally, opening UDS, sending/receiving messages etc. 46 id_svc = gnunet.GNUNET_IDENTITY_connect(@constCast(cfg), id_cb, null); 47 _ = gnunet.GNUNET_SCHEDULER_add_shutdown(do_shutdown, null); 48 return; 49 } 50 51 pub fn main() !u8 { 52 const options: [*c]const gnunet.GNUNET_GETOPT_CommandLineOption = &.{}; 53 const argv = std.os.argv; 54 const c_ptr: [*c][*c]u8 = @ptrCast(argv.ptr); 55 56 // Start GNUnet shenanigans (including scheduler) 57 const ret = gnunet.GNUNET_PROGRAM_run(gnunet.GNUNET_OS_project_data_gnunet(), @intCast(std.os.argv.len), c_ptr, "gnunet-zig", "Gnunet zig demo", options, &run, null); 58 if (ret != gnunet.GNUNET_OK) 59 return 1; 60 return 0; 61 //try stdout.writeAll(res); 62 }