blob: d9b585ea15e9e9d5117dec26ba847c15d7d266a3 [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 * General purpose functions.
3 *
Willy Tarreau348238b2010-01-18 15:05:57 +01004 * Copyright 2000-2010 Willy Tarreau <w@1wt.eu>
Willy Tarreaubaaee002006-06-26 02:48:02 +02005 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 *
11 */
12
Willy Tarreau2e74c3f2007-12-02 18:45:09 +010013#include <ctype.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020014#include <netdb.h>
15#include <stdlib.h>
16#include <string.h>
Willy Tarreau127f9662007-12-06 00:53:51 +010017#include <sys/socket.h>
18#include <sys/un.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020019#include <netinet/in.h>
20#include <arpa/inet.h>
21
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020022#include <common/config.h>
Willy Tarreau2dd0d472006-06-29 17:53:05 +020023#include <common/standard.h>
Willy Tarreau45cb4fb2009-10-26 21:10:04 +010024#include <eb32tree.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020025
Willy Tarreau72d759c2007-10-25 12:14:10 +020026/* enough to store 10 integers of :
27 * 2^64-1 = 18446744073709551615 or
28 * -2^63 = -9223372036854775808
Willy Tarreaue7239b52009-03-29 13:41:58 +020029 *
30 * The HTML version needs room for adding the 25 characters
31 * '<span class="rls"></span>' around digits at positions 3N+1 in order
32 * to add spacing at up to 6 positions : 18 446 744 073 709 551 615
Willy Tarreau72d759c2007-10-25 12:14:10 +020033 */
Willy Tarreaue7239b52009-03-29 13:41:58 +020034char itoa_str[10][171];
Willy Tarreaubaaee002006-06-26 02:48:02 +020035
36/*
William Lallemande7340ec2012-01-24 11:15:39 +010037 * unsigned long long ASCII representation
38 *
39 * return the last char '\0' or NULL if no enough
40 * space in dst
41 */
42char *ulltoa(unsigned long long n, char *dst, size_t size)
43{
44 int i = 0;
45 char *res;
46
47 switch(n) {
48 case 1ULL ... 9ULL:
49 i = 0;
50 break;
51
52 case 10ULL ... 99ULL:
53 i = 1;
54 break;
55
56 case 100ULL ... 999ULL:
57 i = 2;
58 break;
59
60 case 1000ULL ... 9999ULL:
61 i = 3;
62 break;
63
64 case 10000ULL ... 99999ULL:
65 i = 4;
66 break;
67
68 case 100000ULL ... 999999ULL:
69 i = 5;
70 break;
71
72 case 1000000ULL ... 9999999ULL:
73 i = 6;
74 break;
75
76 case 10000000ULL ... 99999999ULL:
77 i = 7;
78 break;
79
80 case 100000000ULL ... 999999999ULL:
81 i = 8;
82 break;
83
84 case 1000000000ULL ... 9999999999ULL:
85 i = 9;
86 break;
87
88 case 10000000000ULL ... 99999999999ULL:
89 i = 10;
90 break;
91
92 case 100000000000ULL ... 999999999999ULL:
93 i = 11;
94 break;
95
96 case 1000000000000ULL ... 9999999999999ULL:
97 i = 12;
98 break;
99
100 case 10000000000000ULL ... 99999999999999ULL:
101 i = 13;
102 break;
103
104 case 100000000000000ULL ... 999999999999999ULL:
105 i = 14;
106 break;
107
108 case 1000000000000000ULL ... 9999999999999999ULL:
109 i = 15;
110 break;
111
112 case 10000000000000000ULL ... 99999999999999999ULL:
113 i = 16;
114 break;
115
116 case 100000000000000000ULL ... 999999999999999999ULL:
117 i = 17;
118 break;
119
120 case 1000000000000000000ULL ... 9999999999999999999ULL:
121 i = 18;
122 break;
123
124 case 10000000000000000000ULL ... ULLONG_MAX:
125 i = 19;
126 break;
127 }
128 if (i + 2 > size) // (i + 1) + '\0'
129 return NULL; // too long
130 res = dst + i + 1;
131 *res = '\0';
132 for (; i >= 0; i--) {
133 dst[i] = n % 10ULL + '0';
134 n /= 10ULL;
135 }
136 return res;
137}
138
139/*
140 * unsigned long ASCII representation
141 *
142 * return the last char '\0' or NULL if no enough
143 * space in dst
144 */
145char *ultoa_o(unsigned long n, char *dst, size_t size)
146{
147 int i = 0;
148 char *res;
149
150 switch (n) {
151 case 0U ... 9UL:
152 i = 0;
153 break;
154
155 case 10U ... 99UL:
156 i = 1;
157 break;
158
159 case 100U ... 999UL:
160 i = 2;
161 break;
162
163 case 1000U ... 9999UL:
164 i = 3;
165 break;
166
167 case 10000U ... 99999UL:
168 i = 4;
169 break;
170
171 case 100000U ... 999999UL:
172 i = 5;
173 break;
174
175 case 1000000U ... 9999999UL:
176 i = 6;
177 break;
178
179 case 10000000U ... 99999999UL:
180 i = 7;
181 break;
182
183 case 100000000U ... 999999999UL:
184 i = 8;
185 break;
186#if __WORDSIZE == 32
187
188 case 1000000000ULL ... ULONG_MAX:
189 i = 9;
190 break;
191
192#elif __WORDSIZE == 64
193
194 case 1000000000ULL ... 9999999999UL:
195 i = 9;
196 break;
197
198 case 10000000000ULL ... 99999999999UL:
199 i = 10;
200 break;
201
202 case 100000000000ULL ... 999999999999UL:
203 i = 11;
204 break;
205
206 case 1000000000000ULL ... 9999999999999UL:
207 i = 12;
208 break;
209
210 case 10000000000000ULL ... 99999999999999UL:
211 i = 13;
212 break;
213
214 case 100000000000000ULL ... 999999999999999UL:
215 i = 14;
216 break;
217
218 case 1000000000000000ULL ... 9999999999999999UL:
219 i = 15;
220 break;
221
222 case 10000000000000000ULL ... 99999999999999999UL:
223 i = 16;
224 break;
225
226 case 100000000000000000ULL ... 999999999999999999UL:
227 i = 17;
228 break;
229
230 case 1000000000000000000ULL ... 9999999999999999999UL:
231 i = 18;
232 break;
233
234 case 10000000000000000000ULL ... ULONG_MAX:
235 i = 19;
236 break;
237
238#endif
239 }
240 if (i + 2 > size) // (i + 1) + '\0'
241 return NULL; // too long
242 res = dst + i + 1;
243 *res = '\0';
244 for (; i >= 0; i--) {
245 dst[i] = n % 10U + '0';
246 n /= 10U;
247 }
248 return res;
249}
250
251/*
252 * signed long ASCII representation
253 *
254 * return the last char '\0' or NULL if no enough
255 * space in dst
256 */
257char *ltoa_o(long int n, char *dst, size_t size)
258{
259 char *pos = dst;
260
261 if (n < 0) {
262 if (size < 3)
263 return NULL; // min size is '-' + digit + '\0' but another test in ultoa
264 *pos = '-';
265 pos++;
266 dst = ultoa_o(-n, pos, size - 1);
267 } else {
268 dst = ultoa_o(n, dst, size);
269 }
270 return dst;
271}
272
273/*
274 * signed long long ASCII representation
275 *
276 * return the last char '\0' or NULL if no enough
277 * space in dst
278 */
279char *lltoa(long long n, char *dst, size_t size)
280{
281 char *pos = dst;
282
283 if (n < 0) {
284 if (size < 3)
285 return NULL; // min size is '-' + digit + '\0' but another test in ulltoa
286 *pos = '-';
287 pos++;
288 dst = ulltoa(-n, pos, size - 1);
289 } else {
290 dst = ulltoa(n, dst, size);
291 }
292 return dst;
293}
294
295/*
296 * write a ascii representation of a unsigned into dst,
297 * return a pointer to the last character
298 * Pad the ascii representation with '0', using size.
299 */
300char *utoa_pad(unsigned int n, char *dst, size_t size)
301{
302 int i = 0;
303 char *ret;
304
305 switch(n) {
306 case 0U ... 9U:
307 i = 0;
308 break;
309
310 case 10U ... 99U:
311 i = 1;
312 break;
313
314 case 100U ... 999U:
315 i = 2;
316 break;
317
318 case 1000U ... 9999U:
319 i = 3;
320 break;
321
322 case 10000U ... 99999U:
323 i = 4;
324 break;
325
326 case 100000U ... 999999U:
327 i = 5;
328 break;
329
330 case 1000000U ... 9999999U:
331 i = 6;
332 break;
333
334 case 10000000U ... 99999999U:
335 i = 7;
336 break;
337
338 case 100000000U ... 999999999U:
339 i = 8;
340 break;
341
342 case 1000000000U ... 4294967295U:
343 i = 9;
344 break;
345 }
346 if (i + 2 > size) // (i + 1) + '\0'
347 return NULL; // too long
348 if (i < size)
349 i = size - 2; // padding - '\0'
350
351 ret = dst + i + 1;
352 *ret = '\0';
353 for (; i >= 0; i--) {
354 dst[i] = n % 10U + '0';
355 n /= 10U;
356 }
357 return ret;
358}
359
360/*
Willy Tarreaubaaee002006-06-26 02:48:02 +0200361 * copies at most <size-1> chars from <src> to <dst>. Last char is always
362 * set to 0, unless <size> is 0. The number of chars copied is returned
363 * (excluding the terminating zero).
364 * This code has been optimized for size and speed : on x86, it's 45 bytes
365 * long, uses only registers, and consumes only 4 cycles per char.
366 */
367int strlcpy2(char *dst, const char *src, int size)
368{
369 char *orig = dst;
370 if (size) {
371 while (--size && (*dst = *src)) {
372 src++; dst++;
373 }
374 *dst = 0;
375 }
376 return dst - orig;
377}
378
379/*
Willy Tarreau72d759c2007-10-25 12:14:10 +0200380 * This function simply returns a locally allocated string containing
Willy Tarreaubaaee002006-06-26 02:48:02 +0200381 * the ascii representation for number 'n' in decimal.
382 */
Emeric Brun3a7fce52010-01-04 14:54:38 +0100383char *ultoa_r(unsigned long n, char *buffer, int size)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200384{
385 char *pos;
386
Willy Tarreau72d759c2007-10-25 12:14:10 +0200387 pos = buffer + size - 1;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200388 *pos-- = '\0';
389
390 do {
391 *pos-- = '0' + n % 10;
392 n /= 10;
Willy Tarreau72d759c2007-10-25 12:14:10 +0200393 } while (n && pos >= buffer);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200394 return pos + 1;
395}
396
Willy Tarreau91092e52007-10-25 16:58:42 +0200397/*
Willy Tarreaue7239b52009-03-29 13:41:58 +0200398 * This function simply returns a locally allocated string containing
399 * the ascii representation for number 'n' in decimal, formatted for
400 * HTML output with tags to create visual grouping by 3 digits. The
401 * output needs to support at least 171 characters.
402 */
403const char *ulltoh_r(unsigned long long n, char *buffer, int size)
404{
405 char *start;
406 int digit = 0;
407
408 start = buffer + size;
409 *--start = '\0';
410
411 do {
412 if (digit == 3 && start >= buffer + 7)
413 memcpy(start -= 7, "</span>", 7);
414
415 if (start >= buffer + 1) {
416 *--start = '0' + n % 10;
417 n /= 10;
418 }
419
420 if (digit == 3 && start >= buffer + 18)
421 memcpy(start -= 18, "<span class=\"rls\">", 18);
422
423 if (digit++ == 3)
424 digit = 1;
425 } while (n && start > buffer);
426 return start;
427}
428
429/*
Willy Tarreau91092e52007-10-25 16:58:42 +0200430 * This function simply returns a locally allocated string containing the ascii
431 * representation for number 'n' in decimal, unless n is 0 in which case it
432 * returns the alternate string (or an empty string if the alternate string is
433 * NULL). It use is intended for limits reported in reports, where it's
434 * desirable not to display anything if there is no limit. Warning! it shares
435 * the same vector as ultoa_r().
436 */
437const char *limit_r(unsigned long n, char *buffer, int size, const char *alt)
438{
439 return (n) ? ultoa_r(n, buffer, size) : (alt ? alt : "");
440}
441
Robert Tsai81ae1952007-12-05 10:47:29 +0100442/*
443 * converts <str> to a struct sockaddr_un* which is locally allocated.
444 * The format is "/path", where "/path" is a path to a UNIX domain socket.
Willy Tarreaud5191e72010-02-09 20:50:45 +0100445 * NULL is returned if the socket path is invalid (too long).
Robert Tsai81ae1952007-12-05 10:47:29 +0100446 */
Willy Tarreaucaf720d2008-03-07 10:07:04 +0100447struct sockaddr_un *str2sun(const char *str)
Robert Tsai81ae1952007-12-05 10:47:29 +0100448{
Willy Tarreau127f9662007-12-06 00:53:51 +0100449 static struct sockaddr_un su;
Robert Tsai81ae1952007-12-05 10:47:29 +0100450 int strsz; /* length included null */
451
Willy Tarreau127f9662007-12-06 00:53:51 +0100452 memset(&su, 0, sizeof(su));
Robert Tsai81ae1952007-12-05 10:47:29 +0100453 strsz = strlen(str) + 1;
Willy Tarreau127f9662007-12-06 00:53:51 +0100454 if (strsz > sizeof(su.sun_path)) {
Willy Tarreaud5191e72010-02-09 20:50:45 +0100455 return NULL;
Willy Tarreaucaf720d2008-03-07 10:07:04 +0100456 } else {
457 su.sun_family = AF_UNIX;
458 memcpy(su.sun_path, str, strsz);
Robert Tsai81ae1952007-12-05 10:47:29 +0100459 }
Willy Tarreau127f9662007-12-06 00:53:51 +0100460 return &su;
Robert Tsai81ae1952007-12-05 10:47:29 +0100461}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200462
463/*
464 * Returns non-zero if character <s> is a hex digit (0-9, a-f, A-F), else zero.
465 *
466 * It looks like this one would be a good candidate for inlining, but this is
467 * not interesting because it around 35 bytes long and often called multiple
468 * times within the same function.
469 */
470int ishex(char s)
471{
472 s -= '0';
473 if ((unsigned char)s <= 9)
474 return 1;
475 s -= 'A' - '0';
476 if ((unsigned char)s <= 5)
477 return 1;
478 s -= 'a' - 'A';
479 if ((unsigned char)s <= 5)
480 return 1;
481 return 0;
482}
483
Willy Tarreau2e74c3f2007-12-02 18:45:09 +0100484/*
Willy Tarreauda3b7c32009-11-02 20:12:52 +0100485 * Return integer equivalent of character <c> for a hex digit (0-9, a-f, A-F),
486 * otherwise -1. This compact form helps gcc produce efficient code.
487 */
488int hex2i(int c)
489{
490 if ((unsigned char)(c -= '0') > 9) {
491 if ((unsigned char)(c -= 'A' - '0') > 5 &&
492 (unsigned char)(c -= 'a' - 'A') > 5)
493 c = -11;
494 c += 10;
495 }
496 return c;
497}
498
499/*
Willy Tarreau2e74c3f2007-12-02 18:45:09 +0100500 * Checks <name> for invalid characters. Valid chars are [A-Za-z0-9_:.-]. If an
501 * invalid character is found, a pointer to it is returned. If everything is
502 * fine, NULL is returned.
503 */
504const char *invalid_char(const char *name)
505{
506 if (!*name)
507 return name;
508
509 while (*name) {
Willy Tarreau88e05812010-03-03 00:16:00 +0100510 if (!isalnum((int)(unsigned char)*name) && *name != '.' && *name != ':' &&
Willy Tarreau2e74c3f2007-12-02 18:45:09 +0100511 *name != '_' && *name != '-')
512 return name;
513 name++;
514 }
515 return NULL;
516}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200517
518/*
Krzysztof Piotr Oledzkiefe3b6f2008-05-23 23:49:32 +0200519 * Checks <domainname> for invalid characters. Valid chars are [A-Za-z0-9_.-].
520 * If an invalid character is found, a pointer to it is returned.
521 * If everything is fine, NULL is returned.
522 */
523const char *invalid_domainchar(const char *name) {
524
525 if (!*name)
526 return name;
527
528 while (*name) {
Willy Tarreau88e05812010-03-03 00:16:00 +0100529 if (!isalnum((int)(unsigned char)*name) && *name != '.' &&
Krzysztof Piotr Oledzkiefe3b6f2008-05-23 23:49:32 +0200530 *name != '_' && *name != '-')
531 return name;
532
533 name++;
534 }
535
536 return NULL;
537}
538
539/*
Willy Tarreaufab5a432011-03-04 15:31:53 +0100540 * converts <str> to a struct sockaddr_storage* which is locally allocated. The
541 * string is assumed to contain only an address, no port. The address can be a
542 * dotted IPv4 address, an IPv6 address, a host name, or empty or "*" to
543 * indicate INADDR_ANY. NULL is returned if the host part cannot be resolved.
544 * The return address will only have the address family and the address set,
545 * all other fields remain zero. The string is not supposed to be modified.
546 * The IPv6 '::' address is IN6ADDR_ANY.
Willy Tarreaubaaee002006-06-26 02:48:02 +0200547 */
Willy Tarreaufab5a432011-03-04 15:31:53 +0100548struct sockaddr_storage *str2ip(const char *str)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200549{
David du Colombier6f5ccb12011-03-10 22:26:24 +0100550 static struct sockaddr_storage sa;
Willy Tarreaufab5a432011-03-04 15:31:53 +0100551 struct hostent *he;
552
553 memset(&sa, 0, sizeof(sa));
554
555 /* Any IPv6 address */
556 if (str[0] == ':' && str[1] == ':' && !str[2]) {
557 sa.ss_family = AF_INET6;
558 return &sa;
559 }
560
561 /* Any IPv4 address */
562 if (!str[0] || (str[0] == '*' && !str[1])) {
563 sa.ss_family = AF_INET;
564 return &sa;
565 }
566
567 /* check for IPv6 first */
568 if (inet_pton(AF_INET6, str, &((struct sockaddr_in6 *)&sa)->sin6_addr)) {
569 sa.ss_family = AF_INET6;
570 return &sa;
571 }
572
573 /* then check for IPv4 */
574 if (inet_pton(AF_INET, str, &((struct sockaddr_in *)&sa)->sin_addr)) {
575 sa.ss_family = AF_INET;
576 return &sa;
577 }
578
579 /* try to resolve an IPv4/IPv6 hostname */
580 he = gethostbyname(str);
581 if (he) {
582 sa.ss_family = he->h_addrtype;
583 switch (sa.ss_family) {
584 case AF_INET:
585 ((struct sockaddr_in *)&sa)->sin_addr = *(struct in_addr *) *(he->h_addr_list);
586 return &sa;
587 case AF_INET6:
588 ((struct sockaddr_in6 *)&sa)->sin6_addr = *(struct in6_addr *) *(he->h_addr_list);
589 return &sa;
590 }
David du Colombierd5f43282011-03-17 10:40:16 +0100591 }
592#ifdef USE_GETADDRINFO
593 else {
594 struct addrinfo hints, *result;
595
596 memset(&result, 0, sizeof(result));
597 memset(&hints, 0, sizeof(hints));
598 hints.ai_family = AF_UNSPEC;
599 hints.ai_socktype = SOCK_DGRAM;
600 hints.ai_flags = AI_PASSIVE;
601 hints.ai_protocol = 0;
602
603 if (getaddrinfo(str, NULL, &hints, &result) == 0) {
604 sa.ss_family = result->ai_family;
605 switch (result->ai_family) {
606 case AF_INET:
607 memcpy((struct sockaddr_in *)&sa, result->ai_addr, result->ai_addrlen);
608 return &sa;
609 case AF_INET6:
610 memcpy((struct sockaddr_in6 *)&sa, result->ai_addr, result->ai_addrlen);
611 return &sa;
612 }
613 }
614
615 freeaddrinfo(result);
Willy Tarreaufab5a432011-03-04 15:31:53 +0100616 }
David du Colombierd5f43282011-03-17 10:40:16 +0100617#endif
618 /* unsupported address family */
Willy Tarreaufab5a432011-03-04 15:31:53 +0100619
620 return NULL;
621}
622
623/*
624 * converts <str> to a locally allocated struct sockaddr_storage *.
625 * The format is "addr[:[port]]", where "addr" can be a dotted IPv4 address, an
626 * IPv6 address, a host name, or empty or "*" to indicate INADDR_ANY. If an IPv6
627 * address wants to ignore port, it must be terminated by a trailing colon (':').
628 * The IPv6 '::' address is IN6ADDR_ANY, so in order to bind to a given port on
629 * IPv6, use ":::port". NULL is returned if the host part cannot be resolved.
630 */
631struct sockaddr_storage *str2sa(const char *str)
632{
David du Colombier6f5ccb12011-03-10 22:26:24 +0100633 struct sockaddr_storage *ret = NULL;
Willy Tarreaufab5a432011-03-04 15:31:53 +0100634 char *str2;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200635 char *c;
636 int port;
637
Willy Tarreaufab5a432011-03-04 15:31:53 +0100638 str2 = strdup(str);
639 if (str2 == NULL)
Willy Tarreaud5191e72010-02-09 20:50:45 +0100640 goto out;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200641
Willy Tarreaufab5a432011-03-04 15:31:53 +0100642 if ((c = strrchr(str2, ':')) != NULL) { /* Port */
Willy Tarreaubaaee002006-06-26 02:48:02 +0200643 *c++ = '\0';
644 port = atol(c);
645 }
646 else
647 port = 0;
648
Willy Tarreaufab5a432011-03-04 15:31:53 +0100649 ret = str2ip(str2);
650 if (!ret)
651 goto out;
652
Willy Tarreau86ad42c2011-08-27 12:29:07 +0200653 set_host_port(ret, port);
Willy Tarreaud5191e72010-02-09 20:50:45 +0100654 out:
Willy Tarreaufab5a432011-03-04 15:31:53 +0100655 free(str2);
Willy Tarreaud5191e72010-02-09 20:50:45 +0100656 return ret;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200657}
658
659/*
Willy Tarreaufab5a432011-03-04 15:31:53 +0100660 * converts <str> to a locally allocated struct sockaddr_storage *, and a
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200661 * port range consisting in two integers. The low and high end are always set
662 * even if the port is unspecified, in which case (0,0) is returned. The low
Willy Tarreaufab5a432011-03-04 15:31:53 +0100663 * port is set in the sockaddr. Thus, it is enough to check the size of the
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200664 * returned range to know if an array must be allocated or not. The format is
Willy Tarreaufab5a432011-03-04 15:31:53 +0100665 * "addr[:[port[-port]]]", where "addr" can be a dotted IPv4 address, an IPv6
666 * address, a host name, or empty or "*" to indicate INADDR_ANY. If an IPv6
667 * address wants to ignore port, it must be terminated by a trailing colon (':').
668 * The IPv6 '::' address is IN6ADDR_ANY, so in order to bind to a given port on
669 * IPv6, use ":::port". NULL is returned if the host part cannot be resolved.
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200670 */
Willy Tarreaufab5a432011-03-04 15:31:53 +0100671struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high)
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200672{
David du Colombier6f5ccb12011-03-10 22:26:24 +0100673 struct sockaddr_storage *ret = NULL;
Willy Tarreaufab5a432011-03-04 15:31:53 +0100674 char *str2;
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200675 char *c;
676 int portl, porth;
677
Willy Tarreaufab5a432011-03-04 15:31:53 +0100678 str2 = strdup(str);
679 if (str2 == NULL)
Willy Tarreaud5191e72010-02-09 20:50:45 +0100680 goto out;
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200681
Willy Tarreaufab5a432011-03-04 15:31:53 +0100682 if ((c = strrchr(str2,':')) != NULL) { /* Port */
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200683 char *sep;
684 *c++ = '\0';
685 sep = strchr(c, '-');
686 if (sep)
687 *sep++ = '\0';
688 else
689 sep = c;
690 portl = atol(c);
691 porth = atol(sep);
692 }
693 else {
694 portl = 0;
695 porth = 0;
696 }
697
Willy Tarreaufab5a432011-03-04 15:31:53 +0100698 ret = str2ip(str2);
699 if (!ret)
700 goto out;
701
Willy Tarreau86ad42c2011-08-27 12:29:07 +0200702 set_host_port(ret, portl);
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200703
704 *low = portl;
705 *high = porth;
Willy Tarreaud5191e72010-02-09 20:50:45 +0100706 out:
Willy Tarreaufab5a432011-03-04 15:31:53 +0100707 free(str2);
Willy Tarreaud5191e72010-02-09 20:50:45 +0100708 return ret;
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200709}
710
Willy Tarreau2937c0d2010-01-26 17:36:17 +0100711/* converts <str> to a struct in_addr containing a network mask. It can be
712 * passed in dotted form (255.255.255.0) or in CIDR form (24). It returns 1
713 * if the conversion succeeds otherwise non-zero.
714 */
715int str2mask(const char *str, struct in_addr *mask)
716{
717 if (strchr(str, '.') != NULL) { /* dotted notation */
718 if (!inet_pton(AF_INET, str, mask))
719 return 0;
720 }
721 else { /* mask length */
722 char *err;
723 unsigned long len = strtol(str, &err, 10);
724
725 if (!*str || (err && *err) || (unsigned)len > 32)
726 return 0;
727 if (len)
728 mask->s_addr = htonl(~0UL << (32 - len));
729 else
730 mask->s_addr = 0;
731 }
732 return 1;
733}
734
Willy Tarreauc6f4ce82009-06-10 11:09:37 +0200735/*
Willy Tarreaud077a8e2007-05-08 18:28:09 +0200736 * converts <str> to two struct in_addr* which must be pre-allocated.
Willy Tarreaubaaee002006-06-26 02:48:02 +0200737 * The format is "addr[/mask]", where "addr" cannot be empty, and mask
738 * is optionnal and either in the dotted or CIDR notation.
739 * Note: "addr" can also be a hostname. Returns 1 if OK, 0 if error.
740 */
Willy Tarreaud077a8e2007-05-08 18:28:09 +0200741int str2net(const char *str, struct in_addr *addr, struct in_addr *mask)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200742{
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200743 __label__ out_free, out_err;
744 char *c, *s;
745 int ret_val;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200746
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200747 s = strdup(str);
748 if (!s)
749 return 0;
750
Willy Tarreaubaaee002006-06-26 02:48:02 +0200751 memset(mask, 0, sizeof(*mask));
752 memset(addr, 0, sizeof(*addr));
Willy Tarreaubaaee002006-06-26 02:48:02 +0200753
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200754 if ((c = strrchr(s, '/')) != NULL) {
Willy Tarreaubaaee002006-06-26 02:48:02 +0200755 *c++ = '\0';
756 /* c points to the mask */
Willy Tarreau2937c0d2010-01-26 17:36:17 +0100757 if (!str2mask(c, mask))
758 goto out_err;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200759 }
760 else {
Willy Tarreauebd61602006-12-30 11:54:15 +0100761 mask->s_addr = ~0U;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200762 }
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200763 if (!inet_pton(AF_INET, s, addr)) {
Willy Tarreaubaaee002006-06-26 02:48:02 +0200764 struct hostent *he;
765
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200766 if ((he = gethostbyname(s)) == NULL) {
767 goto out_err;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200768 }
769 else
770 *addr = *(struct in_addr *) *(he->h_addr_list);
771 }
Willy Tarreau8aeae4a2007-06-17 11:42:08 +0200772
773 ret_val = 1;
774 out_free:
775 free(s);
776 return ret_val;
777 out_err:
778 ret_val = 0;
779 goto out_free;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200780}
781
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100782
783/*
David du Colombier6f5ccb12011-03-10 22:26:24 +0100784 * Parse IPv4 address found in url.
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100785 */
David du Colombier6f5ccb12011-03-10 22:26:24 +0100786int url2ipv4(const char *addr, struct in_addr *dst)
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100787{
788 int saw_digit, octets, ch;
789 u_char tmp[4], *tp;
790 const char *cp = addr;
791
792 saw_digit = 0;
793 octets = 0;
794 *(tp = tmp) = 0;
795
796 while (*addr) {
797 unsigned char digit = (ch = *addr++) - '0';
798 if (digit > 9 && ch != '.')
799 break;
800 if (digit <= 9) {
801 u_int new = *tp * 10 + digit;
802 if (new > 255)
803 return 0;
804 *tp = new;
805 if (!saw_digit) {
806 if (++octets > 4)
807 return 0;
808 saw_digit = 1;
809 }
810 } else if (ch == '.' && saw_digit) {
811 if (octets == 4)
812 return 0;
813 *++tp = 0;
814 saw_digit = 0;
815 } else
816 return 0;
817 }
818
819 if (octets < 4)
820 return 0;
821
822 memcpy(&dst->s_addr, tmp, 4);
823 return addr-cp-1;
824}
825
826/*
David du Colombier6f5ccb12011-03-10 22:26:24 +0100827 * Resolve destination server from URL. Convert <str> to a sockaddr_storage*.
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100828 */
David du Colombier6f5ccb12011-03-10 22:26:24 +0100829int url2sa(const char *url, int ulen, struct sockaddr_storage *addr)
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100830{
831 const char *curr = url, *cp = url;
832 int ret, url_code = 0;
833 unsigned int http_code = 0;
834
835 /* Cleanup the room */
David du Colombier6f5ccb12011-03-10 22:26:24 +0100836
837 /* FIXME: assume IPv4 only for now */
838 ((struct sockaddr_in *)addr)->sin_family = AF_INET;
839 ((struct sockaddr_in *)addr)->sin_addr.s_addr = 0;
840 ((struct sockaddr_in *)addr)->sin_port = 0;
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100841
842 /* Firstly, try to find :// pattern */
843 while (curr < url+ulen && url_code != 0x3a2f2f) {
844 url_code = ((url_code & 0xffff) << 8);
845 url_code += (unsigned char)*curr++;
846 }
847
848 /* Secondly, if :// pattern is found, verify parsed stuff
849 * before pattern is matching our http pattern.
850 * If so parse ip address and port in uri.
851 *
852 * WARNING: Current code doesn't support dynamic async dns resolver.
853 */
854 if (url_code == 0x3a2f2f) {
855 while (cp < curr - 3)
856 http_code = (http_code << 8) + *cp++;
857 http_code |= 0x20202020; /* Turn everything to lower case */
858
859 /* HTTP url matching */
860 if (http_code == 0x68747470) {
861 /* We are looking for IP address. If you want to parse and
862 * resolve hostname found in url, you can use str2sa(), but
863 * be warned this can slow down global daemon performances
864 * while handling lagging dns responses.
865 */
David du Colombier6f5ccb12011-03-10 22:26:24 +0100866 ret = url2ipv4(curr, &((struct sockaddr_in *)&addr)->sin_addr);
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100867 if (!ret)
868 return -1;
869 curr += ret;
David du Colombier6f5ccb12011-03-10 22:26:24 +0100870 ((struct sockaddr_in *)addr)->sin_port = (*curr == ':') ? str2uic(++curr) : 80;
871 ((struct sockaddr_in *)addr)->sin_port = htons(((struct sockaddr_in *)&addr)->sin_port);
Alexandre Cassen5eb1a902007-11-29 15:43:32 +0100872 }
873 return 0;
874 }
875
876 return -1;
877}
878
Willy Tarreau631f01c2011-09-05 00:36:48 +0200879/* Tries to convert a sockaddr_storage address to text form. Upon success, the
880 * address family is returned so that it's easy for the caller to adapt to the
881 * output format. Zero is returned if the address family is not supported. -1
882 * is returned upon error, with errno set. AF_INET, AF_INET6 and AF_UNIX are
883 * supported.
884 */
885int addr_to_str(struct sockaddr_storage *addr, char *str, int size)
886{
887
888 void *ptr;
889
890 if (size < 5)
891 return 0;
892 *str = '\0';
893
894 switch (addr->ss_family) {
895 case AF_INET:
896 ptr = &((struct sockaddr_in *)addr)->sin_addr;
897 break;
898 case AF_INET6:
899 ptr = &((struct sockaddr_in6 *)addr)->sin6_addr;
900 break;
901 case AF_UNIX:
902 memcpy(str, "unix", 5);
903 return addr->ss_family;
904 default:
905 return 0;
906 }
907
908 if (inet_ntop(addr->ss_family, ptr, str, size))
909 return addr->ss_family;
910
911 /* failed */
912 return -1;
913}
914
Willy Tarreaubaaee002006-06-26 02:48:02 +0200915/* will try to encode the string <string> replacing all characters tagged in
916 * <map> with the hexadecimal representation of their ASCII-code (2 digits)
917 * prefixed by <escape>, and will store the result between <start> (included)
918 * and <stop> (excluded), and will always terminate the string with a '\0'
919 * before <stop>. The position of the '\0' is returned if the conversion
920 * completes. If bytes are missing between <start> and <stop>, then the
921 * conversion will be incomplete and truncated. If <stop> <= <start>, the '\0'
922 * cannot even be stored so we return <start> without writing the 0.
923 * The input string must also be zero-terminated.
924 */
925const char hextab[16] = "0123456789ABCDEF";
926char *encode_string(char *start, char *stop,
927 const char escape, const fd_set *map,
928 const char *string)
929{
930 if (start < stop) {
931 stop--; /* reserve one byte for the final '\0' */
932 while (start < stop && *string != '\0') {
933 if (!FD_ISSET((unsigned char)(*string), map))
934 *start++ = *string;
935 else {
936 if (start + 3 >= stop)
937 break;
938 *start++ = escape;
939 *start++ = hextab[(*string >> 4) & 15];
940 *start++ = hextab[*string & 15];
941 }
942 string++;
943 }
944 *start = '\0';
945 }
946 return start;
947}
948
Willy Tarreaubf9c2fc2011-05-31 18:06:18 +0200949/* Decode an URL-encoded string in-place. The resulting string might
950 * be shorter. If some forbidden characters are found, the conversion is
951 * aborted, the string is truncated before the issue and non-zero is returned,
952 * otherwise the operation returns non-zero indicating success.
953 */
954int url_decode(char *string)
955{
956 char *in, *out;
957 int ret = 0;
958
959 in = string;
960 out = string;
961 while (*in) {
962 switch (*in) {
963 case '+' :
964 *out++ = ' ';
965 break;
966 case '%' :
967 if (!ishex(in[1]) || !ishex(in[2]))
968 goto end;
969 *out++ = (hex2i(in[1]) << 4) + hex2i(in[2]);
970 in += 2;
971 break;
972 default:
973 *out++ = *in;
974 break;
975 }
976 in++;
977 }
978 ret = 1; /* success */
979 end:
980 *out = 0;
981 return ret;
982}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200983
Willy Tarreau6911fa42007-03-04 18:06:08 +0100984unsigned int str2ui(const char *s)
985{
986 return __str2ui(s);
987}
988
989unsigned int str2uic(const char *s)
990{
991 return __str2uic(s);
992}
993
994unsigned int strl2ui(const char *s, int len)
995{
996 return __strl2ui(s, len);
997}
998
999unsigned int strl2uic(const char *s, int len)
1000{
1001 return __strl2uic(s, len);
1002}
1003
Willy Tarreau4ec83cd2010-10-15 23:19:55 +02001004unsigned int read_uint(const char **s, const char *end)
1005{
1006 return __read_uint(s, end);
1007}
1008
Willy Tarreau6911fa42007-03-04 18:06:08 +01001009/* This one is 7 times faster than strtol() on athlon with checks.
1010 * It returns the value of the number composed of all valid digits read,
1011 * and can process negative numbers too.
1012 */
1013int strl2ic(const char *s, int len)
1014{
1015 int i = 0;
Willy Tarreau3f0c9762007-10-25 09:42:24 +02001016 int j, k;
Willy Tarreau6911fa42007-03-04 18:06:08 +01001017
1018 if (len > 0) {
1019 if (*s != '-') {
1020 /* positive number */
1021 while (len-- > 0) {
1022 j = (*s++) - '0';
Willy Tarreau3f0c9762007-10-25 09:42:24 +02001023 k = i * 10;
Willy Tarreau6911fa42007-03-04 18:06:08 +01001024 if (j > 9)
1025 break;
Willy Tarreau3f0c9762007-10-25 09:42:24 +02001026 i = k + j;
Willy Tarreau6911fa42007-03-04 18:06:08 +01001027 }
1028 } else {
1029 /* negative number */
1030 s++;
1031 while (--len > 0) {
1032 j = (*s++) - '0';
Willy Tarreau3f0c9762007-10-25 09:42:24 +02001033 k = i * 10;
Willy Tarreau6911fa42007-03-04 18:06:08 +01001034 if (j > 9)
1035 break;
Willy Tarreau3f0c9762007-10-25 09:42:24 +02001036 i = k - j;
Willy Tarreau6911fa42007-03-04 18:06:08 +01001037 }
1038 }
1039 }
1040 return i;
1041}
1042
1043
1044/* This function reads exactly <len> chars from <s> and converts them to a
1045 * signed integer which it stores into <ret>. It accurately detects any error
1046 * (truncated string, invalid chars, overflows). It is meant to be used in
1047 * applications designed for hostile environments. It returns zero when the
1048 * number has successfully been converted, non-zero otherwise. When an error
1049 * is returned, the <ret> value is left untouched. It is yet 5 to 40 times
1050 * faster than strtol().
1051 */
1052int strl2irc(const char *s, int len, int *ret)
1053{
1054 int i = 0;
1055 int j;
1056
1057 if (!len)
1058 return 1;
1059
1060 if (*s != '-') {
1061 /* positive number */
1062 while (len-- > 0) {
1063 j = (*s++) - '0';
1064 if (j > 9) return 1; /* invalid char */
1065 if (i > INT_MAX / 10) return 1; /* check for multiply overflow */
1066 i = i * 10;
1067 if (i + j < i) return 1; /* check for addition overflow */
1068 i = i + j;
1069 }
1070 } else {
1071 /* negative number */
1072 s++;
1073 while (--len > 0) {
1074 j = (*s++) - '0';
1075 if (j > 9) return 1; /* invalid char */
1076 if (i < INT_MIN / 10) return 1; /* check for multiply overflow */
1077 i = i * 10;
1078 if (i - j > i) return 1; /* check for subtract overflow */
1079 i = i - j;
1080 }
1081 }
1082 *ret = i;
1083 return 0;
1084}
1085
1086
1087/* This function reads exactly <len> chars from <s> and converts them to a
1088 * signed integer which it stores into <ret>. It accurately detects any error
1089 * (truncated string, invalid chars, overflows). It is meant to be used in
1090 * applications designed for hostile environments. It returns zero when the
1091 * number has successfully been converted, non-zero otherwise. When an error
1092 * is returned, the <ret> value is left untouched. It is about 3 times slower
1093 * than str2irc().
1094 */
Willy Tarreau6911fa42007-03-04 18:06:08 +01001095
1096int strl2llrc(const char *s, int len, long long *ret)
1097{
1098 long long i = 0;
1099 int j;
1100
1101 if (!len)
1102 return 1;
1103
1104 if (*s != '-') {
1105 /* positive number */
1106 while (len-- > 0) {
1107 j = (*s++) - '0';
1108 if (j > 9) return 1; /* invalid char */
1109 if (i > LLONG_MAX / 10LL) return 1; /* check for multiply overflow */
1110 i = i * 10LL;
1111 if (i + j < i) return 1; /* check for addition overflow */
1112 i = i + j;
1113 }
1114 } else {
1115 /* negative number */
1116 s++;
1117 while (--len > 0) {
1118 j = (*s++) - '0';
1119 if (j > 9) return 1; /* invalid char */
1120 if (i < LLONG_MIN / 10LL) return 1; /* check for multiply overflow */
1121 i = i * 10LL;
1122 if (i - j > i) return 1; /* check for subtract overflow */
1123 i = i - j;
1124 }
1125 }
1126 *ret = i;
1127 return 0;
1128}
1129
Willy Tarreaua0d37b62007-12-02 22:00:35 +01001130/* This function parses a time value optionally followed by a unit suffix among
1131 * "d", "h", "m", "s", "ms" or "us". It converts the value into the unit
1132 * expected by the caller. The computation does its best to avoid overflows.
1133 * The value is returned in <ret> if everything is fine, and a NULL is returned
1134 * by the function. In case of error, a pointer to the error is returned and
1135 * <ret> is left untouched. Values are automatically rounded up when needed.
1136 */
1137const char *parse_time_err(const char *text, unsigned *ret, unsigned unit_flags)
1138{
1139 unsigned imult, idiv;
1140 unsigned omult, odiv;
1141 unsigned value;
1142
1143 omult = odiv = 1;
1144
1145 switch (unit_flags & TIME_UNIT_MASK) {
1146 case TIME_UNIT_US: omult = 1000000; break;
1147 case TIME_UNIT_MS: omult = 1000; break;
1148 case TIME_UNIT_S: break;
1149 case TIME_UNIT_MIN: odiv = 60; break;
1150 case TIME_UNIT_HOUR: odiv = 3600; break;
1151 case TIME_UNIT_DAY: odiv = 86400; break;
1152 default: break;
1153 }
1154
1155 value = 0;
1156
1157 while (1) {
1158 unsigned int j;
1159
1160 j = *text - '0';
1161 if (j > 9)
1162 break;
1163 text++;
1164 value *= 10;
1165 value += j;
1166 }
1167
1168 imult = idiv = 1;
1169 switch (*text) {
1170 case '\0': /* no unit = default unit */
1171 imult = omult = idiv = odiv = 1;
1172 break;
1173 case 's': /* second = unscaled unit */
1174 break;
1175 case 'u': /* microsecond : "us" */
1176 if (text[1] == 's') {
1177 idiv = 1000000;
1178 text++;
1179 }
1180 break;
1181 case 'm': /* millisecond : "ms" or minute: "m" */
1182 if (text[1] == 's') {
1183 idiv = 1000;
1184 text++;
1185 } else
1186 imult = 60;
1187 break;
1188 case 'h': /* hour : "h" */
1189 imult = 3600;
1190 break;
1191 case 'd': /* day : "d" */
1192 imult = 86400;
1193 break;
1194 default:
1195 return text;
1196 break;
1197 }
1198
1199 if (omult % idiv == 0) { omult /= idiv; idiv = 1; }
1200 if (idiv % omult == 0) { idiv /= omult; omult = 1; }
1201 if (imult % odiv == 0) { imult /= odiv; odiv = 1; }
1202 if (odiv % imult == 0) { odiv /= imult; imult = 1; }
1203
1204 value = (value * (imult * omult) + (idiv * odiv - 1)) / (idiv * odiv);
1205 *ret = value;
1206 return NULL;
1207}
Willy Tarreau6911fa42007-03-04 18:06:08 +01001208
Emeric Brun39132b22010-01-04 14:57:24 +01001209/* this function converts the string starting at <text> to an unsigned int
1210 * stored in <ret>. If an error is detected, the pointer to the unexpected
1211 * character is returned. If the conversio is succesful, NULL is returned.
1212 */
1213const char *parse_size_err(const char *text, unsigned *ret) {
1214 unsigned value = 0;
1215
1216 while (1) {
1217 unsigned int j;
1218
1219 j = *text - '0';
1220 if (j > 9)
1221 break;
1222 if (value > ~0U / 10)
1223 return text;
1224 value *= 10;
1225 if (value > (value + j))
1226 return text;
1227 value += j;
1228 text++;
1229 }
1230
1231 switch (*text) {
1232 case '\0':
1233 break;
1234 case 'K':
1235 case 'k':
1236 if (value > ~0U >> 10)
1237 return text;
1238 value = value << 10;
1239 break;
1240 case 'M':
1241 case 'm':
1242 if (value > ~0U >> 20)
1243 return text;
1244 value = value << 20;
1245 break;
1246 case 'G':
1247 case 'g':
1248 if (value > ~0U >> 30)
1249 return text;
1250 value = value << 30;
1251 break;
1252 default:
1253 return text;
1254 }
1255
1256 *ret = value;
1257 return NULL;
1258}
1259
Willy Tarreau946ba592009-05-10 15:41:18 +02001260/* copies at most <n> characters from <src> and always terminates with '\0' */
1261char *my_strndup(const char *src, int n)
1262{
1263 int len = 0;
1264 char *ret;
1265
1266 while (len < n && src[len])
1267 len++;
1268
1269 ret = (char *)malloc(len + 1);
1270 if (!ret)
1271 return ret;
1272 memcpy(ret, src, len);
1273 ret[len] = '\0';
1274 return ret;
1275}
1276
Willy Tarreau482b00d2009-10-04 22:48:42 +02001277/* This function returns the first unused key greater than or equal to <key> in
1278 * ID tree <root>. Zero is returned if no place is found.
1279 */
1280unsigned int get_next_id(struct eb_root *root, unsigned int key)
1281{
1282 struct eb32_node *used;
1283
1284 do {
1285 used = eb32_lookup_ge(root, key);
1286 if (!used || used->key > key)
1287 return key; /* key is available */
1288 key++;
1289 } while (key);
1290 return key;
1291}
1292
Willy Tarreau348238b2010-01-18 15:05:57 +01001293/* This function compares a sample word possibly followed by blanks to another
1294 * clean word. The compare is case-insensitive. 1 is returned if both are equal,
1295 * otherwise zero. This intends to be used when checking HTTP headers for some
1296 * values. Note that it validates a word followed only by blanks but does not
1297 * validate a word followed by blanks then other chars.
1298 */
1299int word_match(const char *sample, int slen, const char *word, int wlen)
1300{
1301 if (slen < wlen)
1302 return 0;
1303
1304 while (wlen) {
1305 char c = *sample ^ *word;
1306 if (c && c != ('A' ^ 'a'))
1307 return 0;
1308 sample++;
1309 word++;
1310 slen--;
1311 wlen--;
1312 }
1313
1314 while (slen) {
1315 if (*sample != ' ' && *sample != '\t')
1316 return 0;
1317 sample++;
1318 slen--;
1319 }
1320 return 1;
1321}
Willy Tarreau482b00d2009-10-04 22:48:42 +02001322
Willy Tarreaud54bbdc2009-09-07 11:00:31 +02001323/* Converts any text-formatted IPv4 address to a host-order IPv4 address. It
1324 * is particularly fast because it avoids expensive operations such as
1325 * multiplies, which are optimized away at the end. It requires a properly
1326 * formated address though (3 points).
1327 */
1328unsigned int inetaddr_host(const char *text)
1329{
1330 const unsigned int ascii_zero = ('0' << 24) | ('0' << 16) | ('0' << 8) | '0';
1331 register unsigned int dig100, dig10, dig1;
1332 int s;
1333 const char *p, *d;
1334
1335 dig1 = dig10 = dig100 = ascii_zero;
1336 s = 24;
1337
1338 p = text;
1339 while (1) {
1340 if (((unsigned)(*p - '0')) <= 9) {
1341 p++;
1342 continue;
1343 }
1344
1345 /* here, we have a complete byte between <text> and <p> (exclusive) */
1346 if (p == text)
1347 goto end;
1348
1349 d = p - 1;
1350 dig1 |= (unsigned int)(*d << s);
1351 if (d == text)
1352 goto end;
1353
1354 d--;
1355 dig10 |= (unsigned int)(*d << s);
1356 if (d == text)
1357 goto end;
1358
1359 d--;
1360 dig100 |= (unsigned int)(*d << s);
1361 end:
1362 if (!s || *p != '.')
1363 break;
1364
1365 s -= 8;
1366 text = ++p;
1367 }
1368
1369 dig100 -= ascii_zero;
1370 dig10 -= ascii_zero;
1371 dig1 -= ascii_zero;
1372 return ((dig100 * 10) + dig10) * 10 + dig1;
1373}
1374
1375/*
1376 * Idem except the first unparsed character has to be passed in <stop>.
1377 */
1378unsigned int inetaddr_host_lim(const char *text, const char *stop)
1379{
1380 const unsigned int ascii_zero = ('0' << 24) | ('0' << 16) | ('0' << 8) | '0';
1381 register unsigned int dig100, dig10, dig1;
1382 int s;
1383 const char *p, *d;
1384
1385 dig1 = dig10 = dig100 = ascii_zero;
1386 s = 24;
1387
1388 p = text;
1389 while (1) {
1390 if (((unsigned)(*p - '0')) <= 9 && p < stop) {
1391 p++;
1392 continue;
1393 }
1394
1395 /* here, we have a complete byte between <text> and <p> (exclusive) */
1396 if (p == text)
1397 goto end;
1398
1399 d = p - 1;
1400 dig1 |= (unsigned int)(*d << s);
1401 if (d == text)
1402 goto end;
1403
1404 d--;
1405 dig10 |= (unsigned int)(*d << s);
1406 if (d == text)
1407 goto end;
1408
1409 d--;
1410 dig100 |= (unsigned int)(*d << s);
1411 end:
1412 if (!s || p == stop || *p != '.')
1413 break;
1414
1415 s -= 8;
1416 text = ++p;
1417 }
1418
1419 dig100 -= ascii_zero;
1420 dig10 -= ascii_zero;
1421 dig1 -= ascii_zero;
1422 return ((dig100 * 10) + dig10) * 10 + dig1;
1423}
1424
1425/*
1426 * Idem except the pointer to first unparsed byte is returned into <ret> which
1427 * must not be NULL.
1428 */
Willy Tarreau74172752010-10-15 23:21:42 +02001429unsigned int inetaddr_host_lim_ret(char *text, char *stop, char **ret)
Willy Tarreaud54bbdc2009-09-07 11:00:31 +02001430{
1431 const unsigned int ascii_zero = ('0' << 24) | ('0' << 16) | ('0' << 8) | '0';
1432 register unsigned int dig100, dig10, dig1;
1433 int s;
Willy Tarreau74172752010-10-15 23:21:42 +02001434 char *p, *d;
Willy Tarreaud54bbdc2009-09-07 11:00:31 +02001435
1436 dig1 = dig10 = dig100 = ascii_zero;
1437 s = 24;
1438
1439 p = text;
1440 while (1) {
1441 if (((unsigned)(*p - '0')) <= 9 && p < stop) {
1442 p++;
1443 continue;
1444 }
1445
1446 /* here, we have a complete byte between <text> and <p> (exclusive) */
1447 if (p == text)
1448 goto end;
1449
1450 d = p - 1;
1451 dig1 |= (unsigned int)(*d << s);
1452 if (d == text)
1453 goto end;
1454
1455 d--;
1456 dig10 |= (unsigned int)(*d << s);
1457 if (d == text)
1458 goto end;
1459
1460 d--;
1461 dig100 |= (unsigned int)(*d << s);
1462 end:
1463 if (!s || p == stop || *p != '.')
1464 break;
1465
1466 s -= 8;
1467 text = ++p;
1468 }
1469
1470 *ret = p;
1471 dig100 -= ascii_zero;
1472 dig10 -= ascii_zero;
1473 dig1 -= ascii_zero;
1474 return ((dig100 * 10) + dig10) * 10 + dig1;
1475}
1476
Willy Tarreauf0b38bf2010-06-06 13:22:23 +02001477/* Convert a fixed-length string to an IP address. Returns 0 in case of error,
1478 * or the number of chars read in case of success. Maybe this could be replaced
1479 * by one of the functions above. Also, apparently this function does not support
1480 * hosts above 255 and requires exactly 4 octets.
1481 */
1482int buf2ip(const char *buf, size_t len, struct in_addr *dst)
1483{
1484 const char *addr;
1485 int saw_digit, octets, ch;
1486 u_char tmp[4], *tp;
1487 const char *cp = buf;
1488
1489 saw_digit = 0;
1490 octets = 0;
1491 *(tp = tmp) = 0;
1492
1493 for (addr = buf; addr - buf < len; addr++) {
1494 unsigned char digit = (ch = *addr) - '0';
1495
1496 if (digit > 9 && ch != '.')
1497 break;
1498
1499 if (digit <= 9) {
1500 u_int new = *tp * 10 + digit;
1501
1502 if (new > 255)
1503 return 0;
1504
1505 *tp = new;
1506
1507 if (!saw_digit) {
1508 if (++octets > 4)
1509 return 0;
1510 saw_digit = 1;
1511 }
1512 } else if (ch == '.' && saw_digit) {
1513 if (octets == 4)
1514 return 0;
1515
1516 *++tp = 0;
1517 saw_digit = 0;
1518 } else
1519 return 0;
1520 }
1521
1522 if (octets < 4)
1523 return 0;
1524
1525 memcpy(&dst->s_addr, tmp, 4);
1526 return addr - cp;
1527}
1528
Willy Tarreauacf95772010-06-14 19:09:21 +02001529/* To be used to quote config arg positions. Returns the short string at <ptr>
1530 * surrounded by simple quotes if <ptr> is valid and non-empty, or "end of line"
1531 * if ptr is NULL or empty. The string is locally allocated.
1532 */
1533const char *quote_arg(const char *ptr)
1534{
1535 static char val[32];
1536 int i;
1537
1538 if (!ptr || !*ptr)
1539 return "end of line";
1540 val[0] = '\'';
1541 for (i = 1; i < sizeof(val) - 1 && *ptr; i++)
1542 val[i] = *ptr++;
1543 val[i++] = '\'';
1544 val[i] = '\0';
1545 return val;
1546}
1547
Willy Tarreau5b180202010-07-18 10:40:48 +02001548/* returns an operator among STD_OP_* for string <str> or < 0 if unknown */
1549int get_std_op(const char *str)
1550{
1551 int ret = -1;
1552
1553 if (*str == 'e' && str[1] == 'q')
1554 ret = STD_OP_EQ;
1555 else if (*str == 'n' && str[1] == 'e')
1556 ret = STD_OP_NE;
1557 else if (*str == 'l') {
1558 if (str[1] == 'e') ret = STD_OP_LE;
1559 else if (str[1] == 't') ret = STD_OP_LT;
1560 }
1561 else if (*str == 'g') {
1562 if (str[1] == 'e') ret = STD_OP_GE;
1563 else if (str[1] == 't') ret = STD_OP_GT;
1564 }
1565
1566 if (ret == -1 || str[2] != '\0')
1567 return -1;
1568 return ret;
1569}
1570
Willy Tarreau4c14eaa2010-11-24 14:01:45 +01001571/* hash a 32-bit integer to another 32-bit integer */
1572unsigned int full_hash(unsigned int a)
1573{
1574 return __full_hash(a);
1575}
1576
David du Colombier4f92d322011-03-24 11:09:31 +01001577/* Return non-zero if IPv4 address is part of the network,
1578 * otherwise zero.
1579 */
1580int in_net_ipv4(struct in_addr *addr, struct in_addr *mask, struct in_addr *net)
1581{
1582 return((addr->s_addr & mask->s_addr) == (net->s_addr & mask->s_addr));
1583}
1584
1585/* Return non-zero if IPv6 address is part of the network,
1586 * otherwise zero.
1587 */
1588int in_net_ipv6(struct in6_addr *addr, struct in6_addr *mask, struct in6_addr *net)
1589{
1590 int i;
1591
1592 for (i = 0; i < sizeof(struct in6_addr) / sizeof(int); i++)
1593 if (((((int *)addr)[i] & ((int *)mask)[i])) !=
1594 (((int *)net)[i] & ((int *)mask)[i]))
1595 return 0;
1596 return 1;
1597}
1598
1599/* RFC 4291 prefix */
1600const char rfc4291_pfx[] = { 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x00, 0x00,
1602 0x00, 0x00, 0xFF, 0xFF };
1603
1604/* Map IPv4 adress on IPv6 address, as specified in RFC 3513. */
1605void v4tov6(struct in6_addr *sin6_addr, struct in_addr *sin_addr)
1606{
1607 memcpy(sin6_addr->s6_addr, rfc4291_pfx, sizeof(rfc4291_pfx));
1608 memcpy(sin6_addr->s6_addr+12, &sin_addr->s_addr, 4);
1609}
1610
1611/* Map IPv6 adress on IPv4 address, as specified in RFC 3513.
1612 * Return true if conversion is possible and false otherwise.
1613 */
1614int v6tov4(struct in_addr *sin_addr, struct in6_addr *sin6_addr)
1615{
1616 if (memcmp(sin6_addr->s6_addr, rfc4291_pfx, sizeof(rfc4291_pfx)) == 0) {
1617 memcpy(&(sin_addr->s_addr), &(sin6_addr->s6_addr[12]),
1618 sizeof(struct in_addr));
1619 return 1;
1620 }
1621
1622 return 0;
1623}
1624
William Lallemand421f5b52012-02-06 18:15:57 +01001625char *human_time(int t, short hz_div) {
1626 static char rv[sizeof("24855d23h")+1]; // longest of "23h59m" and "59m59s"
1627 char *p = rv;
1628 int cnt=2; // print two numbers
1629
1630 if (unlikely(t < 0 || hz_div <= 0)) {
1631 sprintf(p, "?");
1632 return rv;
1633 }
1634
1635 if (unlikely(hz_div > 1))
1636 t /= hz_div;
1637
1638 if (t >= DAY) {
1639 p += sprintf(p, "%dd", t / DAY);
1640 cnt--;
1641 }
1642
1643 if (cnt && t % DAY / HOUR) {
1644 p += sprintf(p, "%dh", t % DAY / HOUR);
1645 cnt--;
1646 }
1647
1648 if (cnt && t % HOUR / MINUTE) {
1649 p += sprintf(p, "%dm", t % HOUR / MINUTE);
1650 cnt--;
1651 }
1652
1653 if ((cnt && t % MINUTE) || !t) // also display '0s'
1654 p += sprintf(p, "%ds", t % MINUTE / SEC);
1655
1656 return rv;
1657}
1658
1659const char *monthname[12] = {
1660 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1661 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
1662};
1663
1664/* date2str_log: write a date in the format :
1665 * sprintf(str, "%02d/%s/%04d:%02d:%02d:%02d.%03d",
1666 * tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900,
1667 * tm.tm_hour, tm.tm_min, tm.tm_sec, (int)date.tv_usec/1000);
1668 *
1669 * without using sprintf. return a pointer to the last char written (\0) or
1670 * NULL if there isn't enough space.
1671 */
1672char *date2str_log(char *dst, struct tm *tm, struct timeval *date, size_t size)
1673{
1674
1675 if (size < 25) /* the size is fixed: 24 chars + \0 */
1676 return NULL;
1677
1678 dst = utoa_pad((unsigned int)tm->tm_mday, dst, 3); // day
1679 *dst++ = '/';
1680 memcpy(dst, monthname[tm->tm_mon], 3); // month
1681 dst += 3;
1682 *dst++ = '/';
1683 dst = utoa_pad((unsigned int)tm->tm_year+1900, dst, 5); // year
1684 *dst++ = ':';
1685 dst = utoa_pad((unsigned int)tm->tm_hour, dst, 3); // hour
1686 *dst++ = ':';
1687 dst = utoa_pad((unsigned int)tm->tm_min, dst, 3); // minutes
1688 *dst++ = ':';
1689 dst = utoa_pad((unsigned int)tm->tm_sec, dst, 3); // secondes
1690 *dst++ = '.';
1691 utoa_pad((unsigned int)(date->tv_usec/1000), dst, 4); // millisecondes
1692 dst += 3; // only the 3 first digits
1693 *dst = '\0';
1694
1695 return dst;
1696}
1697
1698/* gmt2str_log: write a date in the format :
1699 * "%02d/%s/%04d:%02d:%02d:%02d +0000" without using snprintf
1700 * return a pointer to the last char written (\0) or
1701 * NULL if there isn't enough space.
1702 */
1703char *gmt2str_log(char *dst, struct tm *tm, size_t size)
1704{
1705 if (size < 27) /* the size is fixed: 24 chars + \0 */
1706 return NULL;
1707
1708 dst = utoa_pad((unsigned int)tm->tm_mday, dst, 3); // day
1709 *dst++ = '/';
1710 memcpy(dst, monthname[tm->tm_mon], 3); // month
1711 dst += 3;
1712 *dst++ = '/';
1713 dst = utoa_pad((unsigned int)tm->tm_year+1900, dst, 5); // year
1714 *dst++ = ':';
1715 dst = utoa_pad((unsigned int)tm->tm_hour, dst, 3); // hour
1716 *dst++ = ':';
1717 dst = utoa_pad((unsigned int)tm->tm_min, dst, 3); // minutes
1718 *dst++ = ':';
1719 dst = utoa_pad((unsigned int)tm->tm_sec, dst, 3); // secondes
1720 *dst++ = ' ';
1721 *dst++ = '+';
1722 *dst++ = '0';
1723 *dst++ = '0';
1724 *dst++ = '0';
1725 *dst++ = '0';
1726 *dst = '\0';
1727
1728 return dst;
1729}
1730
1731
Willy Tarreaubaaee002006-06-26 02:48:02 +02001732/*
1733 * Local variables:
1734 * c-indent-level: 8
1735 * c-basic-offset: 8
1736 * End:
1737 */