void api_register_all ( const api_hook_t *hooks ) { while (hooks->ah_subsystem) { api_register(hooks); hooks++; } }
/* * Dispatch a register message to API-register function * * @param params register arguments saved in `array` * @param api_error `struct api_error` error object-instance * @return 0 if success, -1 otherwise */ int handle_register(uint64_t con_id, struct message_request *request, char *pluginkey, struct api_error *error) { array *meta = NULL; array functions; string name, description, author, license; if (!error || !request) return (-1); /* check params size */ if (request->params.size != 2) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. Invalid params size"); return (-1); } if (request->params.obj[0].type == OBJECT_TYPE_ARRAY) meta = &request->params.obj[0].data.params; else { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. meta params has wrong type"); return (-1); } /* * meta params: * [name, description, author, license] */ if (!meta) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. meta params is NULL"); return (-1); } if (meta->size != 4) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. Invalid meta params size"); return (-1); } /* extract meta information */ if ((meta->obj[0].type != OBJECT_TYPE_STR) || (meta->obj[1].type != OBJECT_TYPE_STR) || (meta->obj[2].type != OBJECT_TYPE_STR) || (meta->obj[3].type != OBJECT_TYPE_STR)) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. meta element has wrong type"); return (-1); } if (!meta->obj[0].data.string.str || !meta->obj[1].data.string.str || !meta->obj[2].data.string.str || !meta->obj[3].data.string.str) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. Invalid meta params size"); return (-1); } name = meta->obj[0].data.string; description = meta->obj[1].data.string; author = meta->obj[2].data.string; license = meta->obj[3].data.string; if (request->params.obj[1].type != OBJECT_TYPE_ARRAY) { error_set(error, API_ERROR_TYPE_VALIDATION, "Error dispatching register API request. functions has wrong type"); return (-1); } functions = request->params.obj[1].data.params; if (api_register(name, description, author, license, functions, con_id, request->msgid, pluginkey, error) == -1) { if (!error->isset) error_set(error, API_ERROR_TYPE_VALIDATION, "Error running register API request."); return (-1); } return (0); }