blob: 78a8d6c6938f777498e962476d21bb996bd4ba17 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef DOMAIN_REGISTRY_DOMAIN_REGISTRY_H_
#define DOMAIN_REGISTRY_DOMAIN_REGISTRY_H_
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Call once at program startup to enable domain registry
* search. Calls to GetRegistryLength will crash if this is not
* called.
*/
void InitializeDomainRegistry(void);
/*
* Finds the length in bytes of the registrar portion of the host in
* the given hostname. Returns 0 if the hostname is invalid or has no
* host (e.g. a file: URL). Returns 0 if the hostname has multiple
* trailing dots. If no matching rule is found in the effective-TLD
* data, returns 0. Internationalized domain names (IDNs) must be
* converted to punycode first. Non-ASCII hostnames or hostnames
* longer than 127 bytes will return 0. It is an error to pass in an
* IP address (either IPv4 or IPv6) and the return value in this case
* is undefined.
*
* Examples:
* www.google.com -> 3 (com)
* WWW.gOoGlE.cOm -> 3 (com, case insensitive)
* ..google.com -> 3 (com)
* google.com. -> 4 (com)
* a.b.co.uk -> 5 (co.uk)
* a.b.co..uk -> 0 (multiple dots in registry)
* C: -> 0 (no host)
* google.com.. -> 0 (multiple trailing dots)
* bar -> 0 (no subcomponents)
* co.uk -> 5 (co.uk)
* foo.bar -> 0 (not a valid top-level registry)
* foo.臺灣 -> 0 (not converted to punycode)
* foo.xn--nnx388a -> 11 (punycode representation of 臺灣)
* 192.168.0.1 -> ? (IP address, retval undefined)
*/
size_t GetRegistryLength(const char* hostname);
/*
* Like GetRegistryLength, but allows unknown registries as well. If
* the hostname is part of a known registry, the return value will be
* identical to that of GetRegistryLength. If the hostname is not part
* of a known registry (e.g. foo.bar) then the return value will
* assume that the rootmost hostname-part is the registry. It is an
* error to pass in an IP address (either IPv4 or IPv6) and the return
* value in this case is undefined.
*
* Examples:
* foo.bar -> 3 (bar)
* bar -> 0 (host is a registry)
* www.google.com -> 3 (com)
* com -> 0 (host is a registry)
* co.uk -> 0 (host is a registry)
* foo.臺灣 -> 0 (not converted to punycode)
* foo.xn--nnx388a -> 11 (punycode representation of 臺灣)
* 192.168.0.1 -> ? (IP address, retval undefined)
*/
size_t GetRegistryLengthAllowUnknownRegistries(const char* hostname);
/*
* Override the assertion handler by providing a custom assert handler
* implementation. The assertion handler will be invoked when an
* internal assertion fails. This is usually indicative of a fatal
* error and execution should not be allowed to continue. The default
* implementation logs the assertion information to stderr and invokes
* abort(). The parameter "file" is the filename where the assertion
* was triggered. "line_number" is the line number in that
* file. "cond_str" is the string representation of the assertion that
* failed.
*/
typedef void (*DomainRegistryAssertHandler)(
const char* file, int line_number, const char* cond_str);
void SetDomainRegistryAssertHandler(DomainRegistryAssertHandler handler);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* DOMAIN_REGISTRY_DOMAIN_REGISTRY_H_ */