int StringUtils::asciidigitvalue(char chr) { if (!isasciidigit(chr)) return -1; return chr - '0'; }
char *queryformat(const char *server, const char *flags, const char *query) { char *buf; int i, isripe = 0; /* +2 for \r\n; +1 for NULL */ buf = malloc(strlen(flags) + strlen(query) + strlen(client_tag) + 4 + 2 + 1); *buf = '\0'; for (i = 0; ripe_servers[i]; i++) if (strcmp(server, ripe_servers[i]) == 0) { strcat(buf, "-V "); strcat(buf, client_tag); strcat(buf, " "); isripe = 1; break; } if (!isripe) for (i = 0; ripe_servers_old[i]; i++) if (strcmp(server, ripe_servers_old[i]) == 0) { strcat(buf, "-V"); strcat(buf, client_tag); strcat(buf, " "); isripe = 1; break; } if (*flags) { if (!isripe && strcmp(server, "whois.corenic.net") != 0) puts(_("Warning: RIPE flags used with a traditional server.")); strcat(buf, flags); } /* FIXME: /e is not applied to .JP ASN */ if (!isripe && (strcmp(server, "whois.nic.mil") == 0 || strcmp(server, "whois.nic.ad.jp") == 0) && strncasecmp(query, "AS", 2) == 0 && isasciidigit(query[2])) sprintf(buf, "AS %s", query + 2); /* fix query for DDN */ else if (!isripe && strcmp(server, "whois.nic.ad.jp") == 0) { char *lang = getenv("LANG"); /* not a perfect check, but... */ if (!lang || (strncmp(lang, "ja", 2) != 0)) sprintf(buf, "%s/e", query); /* ask for english text */ else strcat(buf, query); } else strcat(buf, query); return buf; }
const char *whichwhois(const char *s) { unsigned long ip; unsigned int i; /* IPv6 address */ if (strchr(s, ':')) { if (strncmp(s, "2001:", 5) == 0) { unsigned long v6net = strtol(s + 5, NULL, 16); v6net = v6net & 0xfe00; /* we care about the first 7 bits */ for (i = 0; ip6_assign[i].serv; i++) if (v6net == ip6_assign[i].net) return ip6_assign[i].serv; return "\x06"; /* unknown allocation */ } else if (strncasecmp(s, "3ffe:", 5) == 0) return "whois.6bone.net"; /* RPSL hierarchical object like AS8627:fltr-TRANSIT-OUT */ else if (strncasecmp(s, "as", 2) == 0 && isasciidigit(s[2])) return whereas(atoi(s + 2)); else return "\x05"; } /* email address */ if (strchr(s, '@')) return "\x05"; /* no dot and no hyphen means it's a NSI NIC handle or ASN (?) */ if (!strpbrk(s, ".-")) { const char *p; for (p = s; *p; p++); /* go to the end of s */ if (strncasecmp(s, "as", 2) == 0 && /* it's an AS */ (isasciidigit(s[2]) || s[2] == ' ')) return whereas(atoi(s + 2)); else if (strncasecmp(p - 2, "jp", 2) == 0) /* JP NIC handle */ return "whois.nic.ad.jp"; if (*s == '!') /* NSI NIC handle */ return "whois.networksolutions.com"; else return "\x05"; /* probably a unknown kind of nic handle */ } /* smells like an IP? */ if ((ip = myinet_aton(s))) { for (i = 0; ip_assign[i].serv; i++) if ((ip & ip_assign[i].mask) == ip_assign[i].net) return ip_assign[i].serv; return "\x05"; /* not in the unicast IPv4 space */ } /* check the TLDs list */ for (i = 0; tld_serv[i]; i += 2) if (domcmp(s, tld_serv[i])) return tld_serv[i + 1]; /* no dot but hyphen */ if (!strchr(s, '.')) { /* search for strings at the start of the word */ for (i = 0; nic_handles[i]; i += 2) if (strncasecmp(s, nic_handles[i], strlen(nic_handles[i])) == 0) return nic_handles[i + 1]; /* it's probably a network name */ return ""; } /* has dot and maybe a hyphen and it's not in tld_serv[], WTF is it? */ /* either a TLD or a NIC handle we don't know about yet */ return "\x05"; }