static void addRemoveSomething(Dict* args, void* vcontext, String* txid, struct Allocator* requestAlloc, enum addRemoveSomething_What what) { struct RouteGen_admin_Ctx* ctx = Identity_check((struct RouteGen_admin_Ctx*) vcontext); String* route = Dict_getString(args, String_CONST("route")); char* error = NULL; struct Sockaddr_storage ss; if (route->len > 63) { error = "parse_failed"; } if (!error) { if (Sockaddr_parse(route->bytes, &ss)) { error = "parse_failed"; } else { int family = Sockaddr_getFamily(&ss.addr); if (family != Sockaddr_AF_INET && family != Sockaddr_AF_INET6) { error = "unexpected_af"; } } } int retVal = -1; Dict* out = Dict_new(requestAlloc); if (!error) { switch (what) { case addRemoveSomething_What_ADD_EXCEPTION: RouteGen_addException(ctx->rg, &ss.addr); break; case addRemoveSomething_What_ADD_PREFIX: RouteGen_addPrefix(ctx->rg, &ss.addr); break; case addRemoveSomething_What_ADD_LOCALPREFIX: RouteGen_addLocalPrefix(ctx->rg, &ss.addr); break; case addRemoveSomething_What_RM_EXCEPTION: retVal = RouteGen_removeException(ctx->rg, &ss.addr); break; case addRemoveSomething_What_RM_PREFIX: retVal = RouteGen_removePrefix(ctx->rg, &ss.addr); break; case addRemoveSomething_What_RM_LOCALPREFIX: retVal = RouteGen_removeLocalPrefix(ctx->rg, &ss.addr); break; default: Assert_failure("invalid op"); } if (!retVal) { error = "no_such_route"; } else { error = "none"; } } Dict_putString(out, String_new("error", requestAlloc), String_new(error, requestAlloc), requestAlloc); Admin_sendMessage(out, txid, ctx->admin); }
static void runTest0(char** prefixes, char** exceptions4, char** exceptions6, char** expectedOut4, char** expectedOut6, struct Allocator* alloc, struct Log* log) { struct RouteGen* rg = RouteGen_new(alloc, log); for (int i = 0; prefixes[i]; i++) { RouteGen_addPrefix(rg, mkSockaddr(prefixes[i], alloc)); } for (int i = 0; exceptions4 && exceptions4[i]; i++) { RouteGen_addException(rg, mkSockaddr(exceptions4[i], alloc)); } for (int i = 0; exceptions6 && exceptions6[i]; i++) { RouteGen_addException(rg, mkSockaddr(exceptions6[i], alloc)); } Dict* routes = RouteGen_getGeneratedRoutes(rg, alloc); List* routes4 = Dict_getList(routes, String_CONST("ipv4")); List* routes6 = Dict_getList(routes, String_CONST("ipv6")); if (expectedOut4) { for (int i = 0; expectedOut4[i]; i++) { Log_debug(log, "%s\n", expectedOut4[i]); } for (int i = 0; i < List_size(routes4); i++) { Log_debug(log, "%s\n", List_getString(routes4, i)->bytes); } Assert_true(!expectedOut4[List_size(routes4)]); for (int i = 0; i < List_size(routes4); i++) { String* str = List_getString(routes4, i); Assert_true(str); Assert_true(expectedOut4[i]); if (CString_strncmp(expectedOut4[i], str->bytes, str->len)) { Log_error(log, "Fail\nexpected: %s\nGot: %s\n", expectedOut4[i], str->bytes); Assert_failure("fail"); } } } else { Assert_true(!List_size(routes4)); } if (expectedOut6) { for (int i = 0; expectedOut6[i]; i++) { Log_debug(log, "%s\n", expectedOut6[i]); } for (int i = 0; i < List_size(routes6); i++) { Log_debug(log, "%s\n", List_getString(routes6, i)->bytes); } Assert_true(!expectedOut6[List_size(routes6)]); for (int i = 0; i < List_size(routes6); i++) { String* str = List_getString(routes6, i); Assert_true(str); Assert_true(expectedOut6[i]); if (CString_strncmp(expectedOut6[i], str->bytes, str->len)) { Log_error(log, "Fail\nexpected: %s\nGot: %s\n", expectedOut6[i], str->bytes); Assert_failure("fail"); } } } else { Assert_true(!List_size(routes6)); } }