static void newInterface2(struct Context* ctx, struct Sockaddr* addr, String* txid, struct Allocator* requestAlloc) { struct Allocator* const alloc = Allocator_child(ctx->alloc); struct UDPAddrIface* udpIf = NULL; struct Jmp jmp; Jmp_try(jmp) { udpIf = UDPAddrIface_new(ctx->eventBase, addr, alloc, &jmp.handler, ctx->logger); } Jmp_catch { String* errStr = String_CONST(jmp.message); Dict out = Dict_CONST(String_CONST("error"), String_OBJ(errStr), NULL); Admin_sendMessage(&out, txid, ctx->admin); Allocator_free(alloc); return; } struct AddrIface* ai = ctx->udpIf = &udpIf->generic; struct InterfaceController_Iface* ici = InterfaceController_newIface(ctx->ic, String_CONST("UDP"), alloc); Iface_plumb(&ici->addrIf, &ai->iface); Dict* out = Dict_new(requestAlloc); Dict_putString(out, String_CONST("error"), String_CONST("none"), requestAlloc); Dict_putInt(out, String_CONST("interfaceNumber"), ici->ifNum, requestAlloc); char* printedAddr = Sockaddr_print(ai->addr, requestAlloc); Dict_putString(out, String_CONST("bindAddress"), String_CONST(printedAddr), requestAlloc); Admin_sendMessage(out, txid, ctx->admin); }
static struct AddrIface* setupUDP2(struct EventBase* base, struct Sockaddr* bindAddr, struct Allocator* allocator, struct Log* logger) { struct Jmp jmp; Jmp_try(jmp) { struct UDPAddrIface* ua = UDPAddrIface_new(base, bindAddr, allocator, &jmp.handler, logger); return &ua->generic; } Jmp_catch { sleep(1); return NULL; } }
void Configurator_config(Dict* config, struct Sockaddr* sockAddr, String* adminPassword, struct EventBase* eventBase, struct Log* logger, struct Allocator* alloc) { struct Allocator* tempAlloc = Allocator_child(alloc); struct UDPAddrIface* udp = UDPAddrIface_new(eventBase, NULL, alloc, NULL, logger); struct AdminClient* client = AdminClient_new(&udp->generic, sockAddr, adminPassword, eventBase, logger, tempAlloc); struct Context ctx = { .logger = logger, .alloc = tempAlloc, .client = client, .base = eventBase, }; waitUntilPong(&ctx); List* authedPasswords = Dict_getList(config, String_CONST("authorizedPasswords")); if (authedPasswords) { authorizedPasswords(authedPasswords, &ctx); } Dict* ifaces = Dict_getDict(config, String_CONST("interfaces")); udpInterface(ifaces, &ctx); if (Defined(HAS_ETH_INTERFACE)) { ethInterface(ifaces, &ctx); } Dict* routerConf = Dict_getDict(config, String_CONST("router")); routerConfig(routerConf, tempAlloc, &ctx); List* secList = Dict_getList(config, String_CONST("security")); security(tempAlloc, secList, logger, &ctx); Log_debug(logger, "Cjdns started in the background"); Allocator_free(tempAlloc); }