+static int check_context(
+ struct afb_context *context,
+ void (*callback)(void *_closure, int _status),
+ void *closure
+) {
+ int r;
+ struct chkctx *cc;
+
+ if (context->validated)
+ r = 1;
+ else if (context->invalidated)
+ r = 0;
+ else {
+ if (context->super)
+ r = check_context(context->super, callback, closure);
+ else if (!callback)
+ r = afb_context_has_permission(context, afb_permission_token_valid);
+ else {
+ cc = malloc(sizeof *cc);
+ if (cc) {
+ cc->context = context;
+ cc->callback = callback;
+ cc->closure = closure;
+ afb_context_has_permission_async(context, afb_permission_token_valid, check_context_cb, cc);
+ return -1;
+ }
+ ERROR("out-of-memory");
+ r = 0;
+ }
+ if (r)
+ context->validated = 1;
+ else
+ context->invalidated = 1;
+ }
+ return r;
+}
+
+int afb_context_check(struct afb_context *context)