#include "afb-xreq.h"
#include "jobs.h"
-#include <afb/afb-req-itf.h>
-
#define INCR 8 /* CAUTION: must be a power of 2 */
/**
apis->name = name;
set->count++;
- NOTICE("API %s added", name);
+ INFO("API %s added", name);
return 0;
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);
+}
+
/**
* Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
* @param set the set of API
*/
static int start_api(struct afb_apiset *set, struct api_desc *api, int share_session, int onneed)
{
+ int rc;
+
if (api->status == 0)
return 0;
else if (api->status > 0) {
return -1;
}
+ INFO("API %s starting...", api->name);
if (api->api.itf->service_start) {
api->status = EBUSY;
- if (api->api.itf->service_start(api->api.closure, share_session, onneed, set) >= 0)
- api->status = 0;
- else if (errno)
+ rc = api->api.itf->service_start(api->api.closure, share_session, onneed, set);
+ if (rc < 0) {
api->status = errno ?: ECANCELED;
- } else {
- if (onneed)
- api->status = 0;
- else {
- /* already started: it is an error */
- ERROR("The api %s is not a startable service", api->name);
- api->status = EINVAL;
+ ERROR("The api %s failed to start (%d)", api->name, rc);
+ return -1;
}
+ } else if (!onneed) {
+ /* already started: it is an error */
+ ERROR("The api %s is not a startable service", api->name);
+ api->status = EINVAL;
+ return -1;
}
- return -!!api->status;
+ NOTICE("API %s started", api->name);
+ api->status = 0;
+ return 0;
}
/**
}
/**
- * Set the verbosity level of the 'api'
+ * Get the verbosity level of the 'api'
* @param set the api set
- * @param name the api to set (NULL set all)
+ * @param name the api to get
+ * @return the verbosity level or -1 in case of error
*/
int afb_apiset_get_verbosity(struct afb_apiset *set, const char *name)
{
errno = ENOENT;
return -1;
}
+
if (!i->api.itf->get_verbosity)
return verbosity;
return i->api.itf->get_verbosity(i->api.closure);
}
+/**
+ * Get the description of the API of 'name'
+ * @param set the api set
+ * @param name the api whose description is required
+ * @return the description or NULL
+ */
+struct json_object *afb_apiset_describe(struct afb_apiset *set, const char *name)
+{
+ const struct api_desc *i;
+
+ i = name ? search(set, name) : NULL;
+ return i && i->api.itf->describe ? i->api.itf->describe(i->api.closure) : NULL;
+}
+
/**
* Get the list of api names
* @param set the api set