gnunet-zig

GNUnet Bindings for Zig
Log | Files | Refs | README

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 }