csm_service * csm_remove_service(csm_service_list *services, csm_service *s) { INFO("Removing service announcement: %s",s->uuid); /* Cancel expiration event */ if (s->timeout) avahi_simple_poll_get(simple_poll)->timeout_update(s->timeout,NULL); // find associated fields obj, dettach it from service_list's tree, and // reattach it to the original csm_service co_obj_t *fields = s->fields; if (fields && services && co_list_contains(services->service_fields, fields)) { co_list_delete(services->service_fields, fields); service_attach(s->fields, s); // remove service from service list co_obj_t *service_obj = (co_obj_t*)container_of(s, co_service_t, service); if (co_list_contains(services->services, service_obj)) co_list_delete(services->services, service_obj); // finalize removal by running update handlers csm_services_commit(services); return s; } return NULL; }
int co_disconnect(co_obj_t *connection) { CHECK_MEM(connection); CHECK_MEM(_sockets); CHECK(IS_SOCK(connection), "Specified object is not a Commotion socket."); co_list_delete(_sockets, connection); ((co_socket_t*)connection)->destroy(connection); return 1; error: return 0; }