1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/* tld.h --- Declarations for TLD restriction checking.
* Copyright (C) 2004, 2005, 2006, 2007 Simon Josefsson.
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* Author: Thomas Jacob, Internet24.de
*
* This file is part of GNU Libidn.
*
* GNU Libidn is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* GNU Libidn is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with GNU Libidn; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
#ifndef _TLD_H
#define _TLD_H
#ifdef __cplusplus
extern "C"
{
#endif
/* Get size_t. */
#include <stdlib.h>
/* Get uint32_t. */
#include "idn-int.h"
/* Interval of valid code points in the TLD. */
struct Tld_table_element
{
uint32_t start; /* Start of range. */
uint32_t end; /* End of range, end == start if single. */
};
typedef struct Tld_table_element Tld_table_element;
/* List valid code points in a TLD. */
struct Tld_table
{
const char *name; /* TLD name, e.g., "no". */
const char *version; /* Version string from TLD file. */
size_t nvalid; /* Number of entries in data. */
const Tld_table_element *valid; /* Sorted array of valid code points. */
};
typedef struct Tld_table Tld_table;
/* Error codes. */
typedef enum
{
TLD_SUCCESS = 0,
TLD_INVALID = 1, /* Invalid character found. */
TLD_NODATA = 2, /* Char, domain or inlen = 0. */
TLD_MALLOC_ERROR = 3,
TLD_ICONV_ERROR = 4,
TLD_NO_TLD = 5,
/* Workaround typo in earlier versions. */
TLD_NOTLD = TLD_NO_TLD
} Tld_rc;
extern const char *tld_strerror (Tld_rc rc);
/* Extract TLD, as ASCII string, of UCS4 domain name into "out". */
int tld_get_4 (const uint32_t * in, size_t inlen, char **out);
int tld_get_4z (const uint32_t * in, char **out);
int tld_get_z (const char *in, char **out);
/* Return structure corresponding to the named TLD from specified
* list of TLD tables, or return NULL if no matching TLD can be
* found. */
const Tld_table *tld_get_table (const char *tld, const Tld_table ** tables);
/* Return structure corresponding to the named TLD, first looking
* thru overrides then thru built-in list, or return NULL if no
* matching TLD can be found. */
const Tld_table *tld_default_table (const char *tld,
const Tld_table ** overrides);
/* Check NAMEPREPPED domain name for valid characters as defined by
* the relevant registering body (plus [a-z0-9.-]). If error is
* TLD_INVALID, set errpos to position of offending character. */
int tld_check_4t (const uint32_t * in, size_t inlen, size_t * errpos,
const Tld_table * tld);
int tld_check_4tz (const uint32_t * in, size_t * errpos,
const Tld_table * tld);
/* Utility interfaces that uses tld_get_4* to find TLD of string,
then tld_default_table (with overrides) to find proper TLD table
for the string, and then hands over to tld_check_4t*. */
int tld_check_4 (const uint32_t * in, size_t inlen, size_t * errpos,
const Tld_table ** overrides);
int tld_check_4z (const uint32_t * in, size_t * errpos,
const Tld_table ** overrides);
int tld_check_8z (const char *in, size_t * errpos,
const Tld_table ** overrides);
int tld_check_lz (const char *in, size_t * errpos,
const Tld_table ** overrides);
#ifdef __cplusplus
}
#endif
#endif /* _TLD_H */
|