csm_service_list * csm_services_init(void) { csm_service_list *services = h_calloc(1, sizeof(csm_service_list)); CHECK_MEM(services); co_obj_t *csm_services = co_list16_create(); CHECK_MEM(csm_services); services->services = csm_services; hattach(services->services, services); co_obj_t *service_fields = co_list16_create(); CHECK_MEM(service_fields); services->service_fields = service_fields; hattach(services->service_fields, services); co_obj_t *update_handlers = co_list16_create(); CHECK_MEM(update_handlers); services->update_handlers = update_handlers; hattach(services->update_handlers, services); return services; error: return NULL; }
int co_init(void) { CHECK(_pool == NULL, "Commotion API already initialized."); _pool = h_calloc(1, sizeof(_pool)); _sockets = co_list16_create(); hattach(_sockets, _pool); DEBUG("Commotion API initialized."); return 1; error: return 0; }
int co_call(co_obj_t *connection, co_obj_t **response, const char *method, const size_t mlen, co_obj_t *request) { CHECK(method != NULL && mlen > 0 && mlen < UINT8_MAX, "Invalid method name."); CHECK(connection != NULL && IS_SOCK(connection), "Invalid connection."); co_obj_t *params = NULL, *rlist = NULL, *rtree = NULL; int retval = 0; size_t reqlen = 0, resplen = 0; char req[REQUEST_MAX]; char resp[RESPONSE_MAX]; if(request != NULL) { CHECK(IS_LIST(request), "Not a valid request."); params = request; } else { params = co_list16_create(); } co_obj_t *m = co_str8_create(method, mlen, 0); reqlen = co_request_alloc(req, sizeof(req), m, params); CHECK(((co_socket_t*)connection)->send((co_obj_t*)((co_socket_t*)connection)->fd, req, reqlen) != -1, "Send error!"); if((resplen = ((co_socket_t*)connection)->receive(connection, (co_obj_t*)((co_socket_t*)connection)->fd, resp, sizeof(resp))) > 0) { CHECK(co_list_import(&rlist, resp, resplen) > 0, "Failed to parse response."); rtree = co_list_element(rlist, 3); if(!IS_NIL(rtree)) { retval = 1; } else { rtree = co_list_element(rlist, 2); retval = 0; } if(rtree != NULL && IS_TREE(rtree)) { *response = rtree; hattach(*response, _pool); } else SENTINEL("Invalid response."); } else SENTINEL("Failed to receive data."); co_obj_free(m); if(params != request) co_obj_free(params); return retval; error: co_obj_free(m); if(params != request) co_obj_free(params); return retval; }
co_obj_t * co_request_create(void) { return co_list16_create(); }