-static void add_update_server(union mysockaddr *addr,
- union mysockaddr *source_addr,
- const char *interface,
- const char *domain)
-{
- struct server *serv;
-
- /* See if there is a suitable candidate, and unmark */
- for (serv = daemon->servers; serv; serv = serv->next)
- if ((serv->flags & SERV_FROM_DBUS) &&
- (serv->flags & SERV_MARK))
- {
- if (domain)
- {
- if (!(serv->flags & SERV_HAS_DOMAIN) || !hostname_isequal(domain, serv->domain))
- continue;
- }
- else
- {
- if (serv->flags & SERV_HAS_DOMAIN)
- continue;
- }
-
- serv->flags &= ~SERV_MARK;
-
- break;
- }
-
- if (!serv && (serv = whine_malloc(sizeof (struct server))))
- {
- /* Not found, create a new one. */
- memset(serv, 0, sizeof(struct server));
-
- if (domain && !(serv->domain = whine_malloc(strlen(domain)+1)))
- {
- free(serv);
- serv = NULL;
- }
- else
- {
- serv->next = daemon->servers;
- daemon->servers = serv;
- serv->flags = SERV_FROM_DBUS;
- if (domain)
- {
- strcpy(serv->domain, domain);
- serv->flags |= SERV_HAS_DOMAIN;
- }
- }
- }
-
- if (serv)
- {
- if (interface)
- strcpy(serv->interface, interface);
- else
- serv->interface[0] = 0;
-
- if (source_addr->in.sin_family == AF_INET &&
- addr->in.sin_addr.s_addr == 0 &&
- serv->domain)
- serv->flags |= SERV_NO_ADDR;
- else
- {
- serv->flags &= ~SERV_NO_ADDR;
- serv->addr = *addr;
- serv->source_addr = *source_addr;
- }
- }
-}
-
-static void mark_dbus(void)
-{
- struct server *serv;
-
- /* mark everything from DBUS */
- for (serv = daemon->servers; serv; serv = serv->next)
- if (serv->flags & SERV_FROM_DBUS)
- serv->flags |= SERV_MARK;
-}
-
-static void cleanup_dbus()
-{
- struct server *serv, *tmp, **up;
-
- /* unlink and free anything still marked. */
- for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp)
- {
- tmp = serv->next;
- if (serv->flags & SERV_MARK)
- {
- server_gone(serv);
- *up = serv->next;
- if (serv->domain)
- free(serv->domain);
- free(serv);
- }
- else
- up = &serv->next;
- }
-}
-