gnunet-zig

GNUnet Bindings for Zig
Log | Files | Refs | README

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 }