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;
}
Exemplo n.º 2
0
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;
}