/** * Load bogons data from the supplied FILE. * * @returns the amount of entries loaded. */ static G_GNUC_COLD int bogons_load(FILE *f) { char line[1024]; uint32 ip, netmask; int linenum = 0; int bits; iprange_err_t error; filestat_t buf; bogons_db = iprange_new(); if (-1 == fstat(fileno(f), &buf)) { g_warning("cannot stat %s: %m", bogons_file); } else { bogons_mtime = buf.st_mtime; } while (fgets(line, sizeof line, f)) { linenum++; /* * Remove all trailing spaces in string. * Otherwise, lines which contain only spaces would cause a warning. */ if (!file_line_chomp_tail(line, sizeof line, NULL)) { g_warning("%s, line %d: too long a line", bogons_file, linenum); break; } if (file_line_is_skipable(line)) continue; if (!string_to_ip_and_mask(line, &ip, &netmask)) { g_warning("%s, line %d: invalid IP or netmask \"%s\"", bogons_file, linenum, line); continue; } bits = netmask_to_cidr(netmask); error = iprange_add_cidr(bogons_db, ip, bits, 1); switch (error) { case IPR_ERR_OK: break; /* FALL THROUGH */ default: g_warning("%s, line %d: rejected entry \"%s\" (%s/%d): %s", bogons_file, linenum, line, ip_to_string(ip), bits, iprange_strerror(error)); continue; } } iprange_sync(bogons_db); if (GNET_PROPERTY(reload_debug)) { g_debug("loaded %u bogus IP ranges (%u hosts)", iprange_get_item_count(bogons_db), iprange_get_host_count4(bogons_db)); } return iprange_get_item_count(bogons_db); }
/** * Load geographic IP data from the supplied FILE. * * @return The amount of entries loaded. */ static G_GNUC_COLD uint gip_load(FILE *f, unsigned idx) { char line[1024]; int linenum = 0; filestat_t buf; g_assert(f != NULL); g_assert(uint_is_non_negative(idx)); g_assert(idx < G_N_ELEMENTS(gip_source)); switch (idx) { case GIP_IPV4: iprange_reset_ipv4(geo_db); break; case GIP_IPV6: iprange_reset_ipv6(geo_db); break; default: g_assert_not_reached(); } if (-1 == fstat(fileno(f), &buf)) { g_warning("cannot stat %s: %m", gip_source[idx].file); } else { gip_source[idx].mtime = buf.st_mtime; } while (fgets(line, sizeof line, f)) { linenum++; /* * Remove all trailing spaces in string. * Otherwise, lines which contain only spaces would cause a warning. */ if (!file_line_chomp_tail(line, sizeof line, NULL)) { g_warning("%s: line %d too long, aborting", gip_source[idx].file, linenum); break; } if (file_line_is_skipable(line)) continue; if (GIP_IPV4 == idx) gip_parse_ipv4(line, linenum); else gip_parse_ipv6(line, linenum); } iprange_sync(geo_db); if (GNET_PROPERTY(reload_debug)) { if (GIP_IPV4 == idx) { g_debug("loaded %u geographical IPv4 ranges (%u hosts)", iprange_get_item_count4(geo_db), iprange_get_host_count4(geo_db)); } else { g_debug("loaded %u geographical IPv6 ranges", iprange_get_item_count6(geo_db)); } } return GIP_IPV4 == idx ? iprange_get_item_count4(geo_db) : iprange_get_item_count6(geo_db); }