}
/**
- * Get from the 'set' the API of 'name' in 'api'
+ * Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
* @param set the set of API
* @param name the name of the API to get
* @param api the structure where to store data about the API of name
* @return 0 in case of success or -1 in case of error
*/
-int afb_apiset_lookup(struct afb_apiset *set, const char *name, struct afb_api *api)
+static struct api_desc *lookup(struct afb_apiset *set, const char *name, int rec)
{
- const struct api_desc *i;
-
- i = search(set, name);
- if (i) {
- *api = i->api;
- return 0;
- }
-
- errno = ENOENT;
- return -1;
-}
-
-/**
- * Check whether the 'set' has the API of 'name'
- * @param set the set of API
- * @param name the name of the API to get
- * @return 1 if the api exist or 0 otherwise
- */
-int afb_apiset_has(struct afb_apiset *set, const char *name)
-{
- return !!search(set, name);
+ struct api_desc *i = search(set, name);
+ return i || !rec || !set->subset ? i : lookup(set->subset, name, rec);
}
/**
- * Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
+ * Get from the 'set' the API of 'name' in 'api'
* @param set the set of API
* @param name the name of the API to get
- * @param api the structure where to store data about the API of name
+ * @param rec if not zero look also recursively in subsets
* @return 0 in case of success or -1 in case of error
*/
-static struct api_desc *get_api(struct afb_apiset *set, const char *name)
+const struct afb_api *afb_apiset_lookup(struct afb_apiset *set, const char *name, int rec)
{
- struct api_desc *i = search(set, name);
- return i || !set->subset ? i : get_api(set->subset, name);
+ struct api_desc *i;
+
+ i = lookup(set, name, rec);
+ if (i)
+ return &i->api;
+ errno = ENOENT;
+ return NULL;
}
/**
- * Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
+ * Check whether the 'set' has the API of 'name'
* @param set the set of API
* @param name the name of the API to get
- * @param api the structure where to store data about the API of name
- * @return 0 in case of success or -1 in case of error
+ * @param rec if not zero look also recursively in subsets
+ * @return 1 if the api exist or 0 otherwise
*/
-int afb_apiset_get(struct afb_apiset *set, const char *name, struct afb_api *api)
+int afb_apiset_has(struct afb_apiset *set, const char *name, int rec)
{
- const struct api_desc *i;
-
- i = get_api(set, name);
- if (!i) {
- errno = ENOENT;
- return -1;
- }
- *api = i->api;
- return 0;
+ return !!afb_apiset_lookup(set, name, rec);
}
/**
}
/**
- * Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
+ * Get from the 'set' the API of 'name' in 'api'
* @param set the set of API
* @param name the name of the API to get
- * @param api the structure where to store data about the API of name
+ * @param rec if not zero look also recursively in subsets
* @return 0 in case of success or -1 in case of error
*/
-int afb_apiset_get_started(struct afb_apiset *set, const char *name, struct afb_api *api)
+const struct afb_api *afb_apiset_lookup_started(struct afb_apiset *set, const char *name, int rec)
{
struct api_desc *i;
- i = get_api(set, name);
- if (!i) {
- errno = ENOENT;
- return -1;
- }
- *api = i->api;
- return i->status ? start_api(set, i, 1, 1) : 0;
+ i = lookup(set, name, rec);
+ if (i)
+ return i->status && start_api(set, i, 1, 1) ? NULL : &i->api;
+ errno = ENOENT;
+ return NULL;
}
/**
extern struct afb_apiset *afb_apiset_subset_get(struct afb_apiset *set);
extern int afb_apiset_add(struct afb_apiset *set, const char *name, struct afb_api api);
extern int afb_apiset_del(struct afb_apiset *set, const char *name);
-extern int afb_apiset_has(struct afb_apiset *set, const char *name);
-extern int afb_apiset_lookup(struct afb_apiset *set, const char *name, struct afb_api *api);
-extern int afb_apiset_get(struct afb_apiset *set, const char *name, struct afb_api *api);
-extern int afb_apiset_get_started(struct afb_apiset *set, const char *name, struct afb_api *api);
+extern int afb_apiset_has(struct afb_apiset *set, const char *name, int rec);
+extern const struct afb_api *afb_apiset_lookup(struct afb_apiset *set, const char *name, int rec);
+extern const struct afb_api *afb_apiset_lookup_started(struct afb_apiset *set, const char *name, int rec);
extern int afb_apiset_start_service(struct afb_apiset *set, const char *name, int share_session, int onneed);
extern int afb_apiset_start_all_services(struct afb_apiset *set, int share_session);
extern void afb_apiset_update_hooks(struct afb_apiset *set, const char *name);
static void process_sync(struct afb_xreq *xreq)
{
- struct afb_api api;
+ const struct afb_api *api;
/* init hooking */
afb_hook_init_xreq(xreq);
afb_hook_xreq_begin(xreq);
/* search the api */
- if (afb_apiset_get_started(xreq->apiset, xreq->api, &api) < 0) {
+ api = afb_apiset_lookup_started(xreq->apiset, xreq->api, 1);
+ if (!api) {
if (errno == ENOENT)
afb_xreq_fail_f(xreq, "unknown-api", "api %s not found", xreq->api);
else
afb_xreq_fail_f(xreq, "bad-api-state", "api %s not started correctly: %m", xreq->api);
} else {
- xreq->context.api_key = api.closure;
- api.itf->call(api.closure, xreq);
+ xreq->context.api_key = api->closure;
+ api->itf->call(api->closure, xreq);
}
}