void xfrd_del_notify(xfrd_state_t* xfrd, const dname_type* dname) { /* find it */ struct notify_zone_t* not = (struct notify_zone_t*)rbtree_delete( xfrd->notify_zones, dname); if(!not) return; /* waiting list */ if(not->is_waiting) { if(not->waiting_prev) not->waiting_prev->waiting_next = not->waiting_next; else xfrd->notify_waiting_first = not->waiting_next; if(not->waiting_next) not->waiting_next->waiting_prev = not->waiting_prev; else xfrd->notify_waiting_last = not->waiting_prev; not->is_waiting = 0; } /* event */ if(not->notify_send_enable) { notify_disable(not); } /* del tsig */ tsig_delete_record(¬->notify_tsig, NULL); /* free it */ region_recycle(xfrd->region, not->current_soa, sizeof(xfrd_soa_t)); /* the apex is recycled when the zone_options.node.key is removed */ region_recycle(xfrd->region, not, sizeof(*not)); }
void xfrd_send_notify(rbtree_t* tree, const dname_type* apex, struct xfrd_soa* new_soa) { /* lookup the zone */ struct notify_zone_t* zone = (struct notify_zone_t*) rbtree_search(tree, apex); assert(zone); if(zone->notify_send_enable) notify_disable(zone); notify_enable(zone, new_soa); }
static void xfrd_notify_next(struct notify_zone_t* zone) { /* advance to next in acl */ zone->notify_current = zone->notify_current->next; zone->notify_retry = 0; if(zone->notify_current == 0) { DEBUG(DEBUG_XFRD,1, (LOG_INFO, "xfrd: zone %s: no more notify-send acls. stop notify.", zone->apex_str)); notify_disable(zone); return; } }
void notify_handle_master_zone_soainfo(rbtree_t* tree, const dname_type* apex, struct xfrd_soa* new_soa) { /* lookup the zone */ struct notify_zone_t* zone = (struct notify_zone_t*) rbtree_search(tree, apex); if(!zone) return; /* got SOAINFO but zone was deleted meanwhile */ /* check if SOA changed */ if( (new_soa == NULL && zone->current_soa->serial == 0) || (new_soa && new_soa->serial == zone->current_soa->serial)) return; if(zone->notify_send_enable) notify_disable(zone); notify_enable(zone, new_soa); }
/** * Next secondary. * */ static void notify_next(notify_type* notify) { if (!notify || !notify->secondary) { return; } notify->secondary = notify->secondary->next; notify->retry = 0; if (!notify->secondary) { zone_type* zone = (zone_type*) notify->zone; ods_log_assert(zone); ods_log_assert(zone->name); ods_log_debug("[%s] zone %s no more secondaries, disable notify", notify_str, zone->name); notify_disable(notify); } return; }