DnsServer* dns_server_free(DnsServer *s)  {
        if (!s)
                return NULL;

        if (s->manager) {
                if (s->type == DNS_SERVER_LINK)
                        LIST_REMOVE(servers, s->link->dns_servers, s);
                else if (s->type == DNS_SERVER_SYSTEM)
                        LIST_REMOVE(servers, s->manager->dns_servers, s);
                else if (s->type == DNS_SERVER_FALLBACK)
                        LIST_REMOVE(servers, s->manager->fallback_dns_servers, s);
                else
                        assert_not_reached("Unknown server type");

                if (s->manager->current_dns_server == s)
                        manager_set_dns_server(s->manager, NULL);
        }

        if (s->link && s->link->current_dns_server == s)
                link_set_dns_server(s->link, NULL);

        free(s);

        return NULL;
}
static DnsServer* dns_server_free(DnsServer *s)  {
        if (!s)
                return NULL;

        if (s->link && s->link->current_dns_server == s)
                link_set_dns_server(s->link, NULL);

        if (s->manager && s->manager->current_dns_server == s)
                manager_set_dns_server(s->manager, NULL);

        free(s);

        return NULL;
}
Exemple #3
0
void dns_server_unlink(DnsServer *s) {
        assert(s);
        assert(s->manager);

        /* This removes the specified server from the linked list of
         * servers, but any server might still stay around if it has
         * refs, for example from an ongoing transaction. */

        if (!s->linked)
                return;

        switch (s->type) {

        case DNS_SERVER_LINK:
                assert(s->link);
                assert(s->link->n_dns_servers > 0);
                LIST_REMOVE(servers, s->link->dns_servers, s);
                s->link->n_dns_servers--;
                break;

        case DNS_SERVER_SYSTEM:
                assert(s->manager->n_dns_servers > 0);
                LIST_REMOVE(servers, s->manager->dns_servers, s);
                s->manager->n_dns_servers--;
                break;

        case DNS_SERVER_FALLBACK:
                assert(s->manager->n_dns_servers > 0);
                LIST_REMOVE(servers, s->manager->fallback_dns_servers, s);
                s->manager->n_dns_servers--;
                break;
        }

        s->linked = false;

        if (s->link && s->link->current_dns_server == s)
                link_set_dns_server(s->link, NULL);

        if (s->manager->current_dns_server == s)
                manager_set_dns_server(s->manager, NULL);

        dns_server_unref(s);
}