From: Timo TerĂs plugin_geoip: allow datacenters to be omitted from auto_dc_coords sometimes we might need a datacenter to be accessible only via overrides of map (via specific territory) or via nets (only specific nets). this makes those datacenters to be sorted always last. http://code.google.com/p/gdnsd/issues/detail?id=17 diff --git a/plugins/meta/libgdmaps/gdmaps.c b/plugins/meta/libgdmaps/gdmaps.c index b49bfa5..9d20351 100644 --- a/plugins/meta/libgdmaps/gdmaps.c +++ b/plugins/meta/libgdmaps/gdmaps.c @@ -180,13 +180,13 @@ static dcinfo_t* dcinfo_new(const vscf_data_t* dc_cfg, const vscf_data_t* dc_aut if(!vscf_is_hash(dc_auto_cfg)) log_fatal("plugin_geoip: map '%s': auto_dc_coords must be a key-value hash", map_name); const unsigned num_auto = vscf_hash_get_len(dc_auto_cfg); - if(num_auto != num_dcs) - log_fatal("plugin_geoip: map '%s': auto_dc_coords hash must contain one entry for each datacenter in 'datacenters'", map_name); - info->coords = malloc(num_auto * 2 * sizeof(double)); + info->coords = malloc(num_dcs * 2 * sizeof(double)); + for(unsigned i = 0; i < 2*num_dcs; i++) + info->coords[i] = NAN; for(unsigned i = 0; i < num_auto; i++) { const char* dcname = vscf_hash_get_key_byindex(dc_auto_cfg, i, NULL); unsigned dcidx; - for(dcidx = 0; dcidx < info->num_dcs; dcidx++) { + for(dcidx = 0; dcidx < num_dcs; dcidx++) { if(!strcmp(dcname, info->names[dcidx])) break; } @@ -438,7 +438,10 @@ static unsigned dclists_city_auto_map(dclists_t* lists, const char* map_name, co double dists[store_len]; for(unsigned i = 0; i < num_dcs; i++) { const unsigned c_offs = i * 2; - dists[i + 1] = haversine(lat_rad, lon_rad, coords[c_offs], coords[c_offs + 1]); + if (coords[c_offs] != NAN) + dists[i + 1] = haversine(lat_rad, lon_rad, coords[c_offs], coords[c_offs + 1]); + else + dists[i + 1] = +INFINITY; } // Given the relatively small num_dcs of most configs,