Blame

Date:
Fri Feb 12 12:47:20 2021 UTC
Message:
fix various compilation errors Include gmid.h as first header in every file, as it then includes config.h (that defines _GNU_SOURCE for instance). Fix also a warning about unsigned vs signed const char pointers in openssl.

001
2021-01-27
op
/*
002
2021-01-27
op
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
003
2021-01-27
op
*
004
2021-01-27
op
* Permission to use, copy, modify, and distribute this software for any
005
2021-01-27
op
* purpose with or without fee is hereby granted, provided that the above
006
2021-01-27
op
* copyright notice and this permission notice appear in all copies.
007
2021-01-27
op
*
008
2021-01-27
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2021-01-27
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2021-01-27
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2021-01-27
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2021-01-27
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2021-01-27
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2021-01-27
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2021-01-27
op
*/
016
2021-02-12
op
017
2021-02-12
op
#include "gmid.h"
018
2021-01-27
op
019
2021-01-27
op
#include <stddef.h>
020
2021-01-27
op
#include <stdint.h>
021
2021-01-27
op
#include <string.h>
022
2021-01-27
op
023
2021-01-27
op
#define BASE 36
024
2021-01-27
op
#define TMIN 1
025
2021-01-27
op
#define TMAX 26
026
2021-01-27
op
#define SKEW 38
027
2021-01-27
op
#define DAMP 700
028
2021-01-27
op
#define IBIAS 72
029
2021-01-27
op
#define IN 128
030
2021-01-27
op
031
2021-01-27
op
static int
032
2021-01-27
op
adapt(int delta, int numpoints, int firsttime)
033
2021-01-27
op
{
034
2021-01-27
op
int k;
035
2021-01-27
op
036
2021-01-27
op
if (firsttime)
037
2021-01-27
op
delta = delta / DAMP;
038
2021-01-27
op
else
039
2021-01-27
op
delta = delta / 2;
040
2021-01-27
op
041
2021-01-27
op
delta += (delta / numpoints);
042
2021-01-27
op
043
2021-01-27
op
k = 0;
044
2021-01-27
op
while (delta > ((BASE - TMIN) * TMAX) / 2) {
045
2021-01-27
op
delta = delta / (BASE - TMIN);
046
2021-01-27
op
k += BASE;
047
2021-01-27
op
}
048
2021-01-27
op
return k + (((BASE - TMIN + 1) * delta) / (delta + SKEW));
049
2021-01-27
op
}
050
2021-01-27
op
051
2021-01-27
op
static const char *
052
2021-01-28
op
copy_label(const char *s, char *out, size_t len)
053
2021-01-27
op
{
054
2021-01-27
op
char *end, *t;
055
2021-01-27
op
size_t l;
056
2021-01-27
op
057
2021-01-27
op
end = strchr(s, '\0');
058
2021-01-27
op
l = end - s;
059
2021-01-27
op
if (l > len)
060
2021-01-27
op
return NULL;
061
2021-01-27
op
062
2021-01-27
op
for (t = end; t >= s; --t)
063
2021-01-27
op
if (*t == '-')
064
2021-01-27
op
break;
065
2021-01-27
op
066
2021-01-27
op
if (t < s)
067
2021-01-27
op
t = end;
068
2021-01-27
op
069
2021-01-27
op
for (; s < t; ++s, ++out) {
070
2021-01-27
op
if (*s > 'z')
071
2021-01-27
op
return NULL;
072
2021-01-27
op
*out = *s;
073
2021-01-27
op
}
074
2021-01-27
op
075
2021-01-27
op
return s;
076
2021-01-27
op
}
077
2021-01-27
op
078
2021-01-27
op
static unsigned int
079
2021-01-27
op
digit_value(char c)
080
2021-01-27
op
{
081
2021-01-27
op
if ('A' <= c && c <= 'Z')
082
2021-01-27
op
return c - 'A';
083
2021-01-27
op
084
2021-01-27
op
if ('a' <= c && c <= 'z')
085
2021-01-27
op
return c - 'a';
086
2021-01-27
op
087
2021-01-27
op
if ('0' <= c && c <= '9')
088
2021-01-27
op
return 26 + c - '0';
089
2021-01-27
op
090
2021-01-27
op
return c;
091
2021-01-27
op
}
092
2021-01-27
op
093
2021-01-27
op
static int
094
2021-01-29
op
insert(char *out, size_t len, int codepoint, size_t i, const char **err)
095
2021-01-27
op
{
096
2021-01-27
op
int l;
097
2021-01-27
op
char *t;
098
2021-01-27
op
099
2021-01-29
op
if (codepoint <= 0x7F) {
100
2021-01-29
op
*err = "puny: invalid decoded character (ASCII range)";
101
2021-01-27
op
return 0;
102
2021-01-29
op
} else if (codepoint <= 0x7FF) {
103
2021-01-27
op
l = 2;
104
2021-01-29
op
} else if (codepoint <= 0xFFFF) {
105
2021-01-27
op
l = 3;
106
2021-01-29
op
} else if (codepoint <= 0x10FFFF) {
107
2021-01-27
op
l = 4;
108
2021-01-29
op
} else {
109
2021-01-29
op
*err = "puny: invalid decoded character";
110
2021-01-27
op
return 0;
111
2021-01-29
op
}
112
2021-01-27
op
113
2021-01-29
op
if ((t = utf8_nth(out, i)) == NULL) {
114
2021-01-29
op
*err = "puny: invalid insert position";
115
2021-01-27
op
return 0;
116
2021-01-29
op
}
117
2021-01-29
op
118
2021-01-29
op
if (t + l >= out + len) {
119
2021-01-29
op
*err = "puny: insert would overflow";
120
2021-01-27
op
return 0;
121
2021-01-29
op
}
122
2021-01-27
op
123
2021-01-27
op
memmove(t + l, t, strlen(t));
124
2021-01-27
op
125
2021-01-27
op
switch (l) {
126
2021-01-27
op
case 2:
127
2021-01-27
op
t[1] = ( codepoint & 0x3F) + 0x80;
128
2021-01-28
op
t[0] = ((codepoint >> 6) & 0x1F) + 0xC0;
129
2021-01-27
op
break;
130
2021-01-27
op
case 3:
131
2021-01-27
op
t[2] = ( codepoint & 0x3F) + 0x80;
132
2021-01-28
op
t[1] = ((codepoint >> 6) & 0x3F) + 0x80;
133
2021-01-27
op
t[0] = ((codepoint >> 12) & 0x0F) + 0xE0;
134
2021-01-27
op
break;
135
2021-01-27
op
case 4:
136
2021-01-27
op
t[3] = ( codepoint & 0x3F) + 0x80;
137
2021-01-28
op
t[2] = ((codepoint >> 6) & 0x3F) + 0x80;
138
2021-01-27
op
t[1] = ((codepoint >> 12) & 0x3F) + 0x80;
139
2021-01-27
op
t[0] = ((codepoint >> 18) & 0x07) + 0xF0;
140
2021-01-27
op
break;
141
2021-01-27
op
}
142
2021-01-27
op
return 1;
143
2021-01-27
op
}
144
2021-01-27
op
145
2021-01-27
op
static int
146
2021-01-29
op
decode(const char *str, char *out, size_t len, const char **err)
147
2021-01-27
op
{
148
2021-01-27
op
size_t i;
149
2021-01-27
op
uint32_t n;
150
2021-01-27
op
unsigned int oldi, bias, w, k, digit, t;
151
2021-01-27
op
unsigned int numpoints;
152
2021-01-27
op
const char *s;
153
2021-01-27
op
154
2021-01-27
op
if (!starts_with(str, "xn--")) {
155
2021-01-27
op
strncpy(out, str, len);
156
2021-01-27
op
return 1;
157
2021-01-27
op
}
158
2021-01-27
op
159
2021-01-27
op
/* skip the xn-- */
160
2021-01-27
op
str += 4;
161
2021-01-27
op
162
2021-01-27
op
if (strchr(str, '-') != NULL) {
163
2021-01-29
op
if ((s = copy_label(str, out, len)) == NULL) {
164
2021-01-29
op
*err = "puny: invalid label";
165
2021-01-27
op
return 0;
166
2021-01-29
op
}
167
2021-01-27
op
if (*s == '-')
168
2021-01-27
op
s++;
169
2021-01-27
op
} else
170
2021-01-27
op
s = str;
171
2021-01-27
op
172
2021-01-27
op
numpoints = strlen(out);
173
2021-01-27
op
174
2021-01-27
op
n = IN;
175
2021-01-27
op
i = 0;
176
2021-01-27
op
bias = IBIAS;
177
2021-01-27
op
178
2021-01-27
op
while (*s != '\0') {
179
2021-01-27
op
oldi = i;
180
2021-01-27
op
w = 1;
181
2021-01-27
op
182
2021-01-27
op
for (k = BASE; ; k += BASE) {
183
2021-01-29
op
if (*s == '\0') {
184
2021-01-29
op
*err = "puny: label truncated?";
185
2021-01-27
op
return 0;
186
2021-01-29
op
}
187
2021-01-27
op
/* fail eventually? */
188
2021-01-27
op
digit = digit_value(*s);
189
2021-01-27
op
s++;
190
2021-01-27
op
191
2021-01-27
op
/* fail on overflow */
192
2021-01-27
op
i += digit * w;
193
2021-01-27
op
194
2021-01-27
op
if (k <= bias)
195
2021-01-27
op
t = TMIN;
196
2021-01-27
op
else if (k >= bias + TMAX)
197
2021-01-27
op
t = TMAX;
198
2021-01-27
op
else
199
2021-01-27
op
t = k - bias;
200
2021-01-27
op
201
2021-01-27
op
if (digit < t)
202
2021-01-27
op
break;
203
2021-01-27
op
w *= (BASE - t);
204
2021-01-27
op
}
205
2021-01-27
op
206
2021-01-27
op
bias = adapt(i - oldi, numpoints+1, oldi == 0);
207
2021-01-27
op
n += i / (numpoints+1); /* fail on overflow */
208
2021-01-27
op
i = i % (numpoints+1);
209
2021-01-27
op
210
2021-01-29
op
if (!insert(out, len, n, i, err))
211
2021-01-27
op
return 0;
212
2021-01-27
op
numpoints++;
213
2021-01-27
op
++i;
214
2021-01-27
op
}
215
2021-01-27
op
216
2021-01-27
op
return 1;
217
2021-01-27
op
}
218
2021-01-27
op
219
2021-01-27
op
static const char *
220
2021-01-28
op
end_of_label(const char *hostname)
221
2021-01-27
op
{
222
2021-01-27
op
for (; *hostname != '\0' && *hostname != '.'; ++hostname)
223
2021-01-27
op
; /* nop */
224
2021-01-27
op
return hostname;
225
2021-01-27
op
}
226
2021-01-27
op
227
2021-01-27
op
int
228
2021-01-29
op
puny_decode(const char *hostname, char *out, size_t len, const char **err)
229
2021-01-27
op
{
230
2021-01-28
op
char label[LABEL_LEN];
231
2021-01-27
op
const char *s, *end;
232
2021-01-27
op
size_t l;
233
2021-01-27
op
234
2021-01-27
op
memset(out, 0, len);
235
2021-01-27
op
if (hostname == NULL)
236
2021-01-27
op
return 1;
237
2021-01-27
op
238
2021-01-27
op
s = hostname;
239
2021-01-27
op
for (;;) {
240
2021-01-28
op
end = end_of_label(s);
241
2021-01-27
op
l = end - s;
242
2021-01-29
op
if (l >= sizeof(label)) {
243
2021-01-29
op
*err = "label too long";
244
2021-01-27
op
return 0;
245
2021-01-29
op
}
246
2021-01-27
op
247
2021-01-28
op
memcpy(label, s, l);
248
2021-01-28
op
label[l] = '\0';
249
2021-01-27
op
250
2021-01-29
op
if (!decode(label, out, len, err))
251
2021-01-27
op
return 0;
252
2021-01-27
op
253
2021-01-27
op
if (*end == '\0')
254
2021-01-27
op
return 1;
255
2021-01-27
op
256
2021-01-29
op
if (strlcat(out, ".", len) >= len) {
257
2021-01-29
op
*err = "domain name too long";
258
2021-01-27
op
return 0;
259
2021-01-29
op
}
260
2021-01-27
op
261
2021-01-27
op
l = strlen(out);
262
2021-01-29
op
if (l >= len) {
263
2021-01-29
op
*err = "domain name too long";
264
2021-01-27
op
return 0;
265
2021-01-29
op
}
266
2021-01-27
op
out += l;
267
2021-01-27
op
len -= l;
268
2021-01-27
op
269
2021-01-27
op
s = end+1;
270
2021-01-27
op
}
271
2021-01-27
op
}