2 Unix SMB/CIFS implementation.
3 Samba utility functions
4 Copyright (C) Andrew Tridgell 1992-2001
5 Copyright (C) Simo Sorce 2001-2002
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 * Get the next token from a string, return False if none found.
26 * Handles double-quotes.
28 * Based on a routine by GJC@VILLAGE.COM.
29 * Extensively modified by Andrew.Tridgell@anu.edu.au
31 BOOL next_token(const char **ptr,char *buff, const char *sep, size_t bufsize)
42 /* default to simple separators */
46 /* find the first non sep char */
47 while (*s && strchr_m(sep,*s))
54 /* copy over the token */
55 for (quoted = False; len < bufsize && *s && (quoted || !strchr_m(sep,*s)); s++) {
64 *ptr = (*s) ? s+1 : s;
71 This is like next_token but is not re-entrant and "remembers" the first
72 parameter so you can pass NULL. This is useful for user interface code
73 but beware the fact that it is not re-entrant!
76 static char *last_ptr=NULL;
78 BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
82 ptr = (const char **)&last_ptr;
84 ret = next_token(ptr, buff, sep, bufsize);
89 static uint16 tmpbuf[sizeof(pstring)];
91 void set_first_token(char *ptr)
97 Convert list of tokens to array; dependent on above routine.
98 Uses last_ptr from above - bit of a hack.
101 char **toktocliplist(int *ctok, const char *sep)
110 while(*s && strchr_m(sep,*s))
119 while(*s && (!strchr_m(sep,*s)))
121 while(*s && strchr_m(sep,*s))
128 if (!(ret=iret=malloc(ictok*sizeof(char *))))
143 Case insensitive string compararison.
146 int StrCaseCmp(const char *s, const char *t)
149 unix_strupper(s, strlen(s)+1, buf1, sizeof(buf1));
150 unix_strupper(t, strlen(t)+1, buf2, sizeof(buf2));
151 return strcmp(buf1,buf2);
155 Case insensitive string compararison, length limited.
158 int StrnCaseCmp(const char *s, const char *t, size_t n)
161 unix_strupper(s, strlen(s)+1, buf1, sizeof(buf1));
162 unix_strupper(t, strlen(t)+1, buf2, sizeof(buf2));
163 return strncmp(buf1,buf2,n);
169 * @note The comparison is case-insensitive.
171 BOOL strequal(const char *s1, const char *s2)
178 return(StrCaseCmp(s1,s2)==0);
182 * Compare 2 strings up to and including the nth char.
184 * @note The comparison is case-insensitive.
186 BOOL strnequal(const char *s1,const char *s2,size_t n)
190 if (!s1 || !s2 || !n)
193 return(StrnCaseCmp(s1,s2,n)==0);
197 Compare 2 strings (case sensitive).
200 BOOL strcsequal(const char *s1,const char *s2)
207 return(strcmp(s1,s2)==0);
211 Do a case-insensitive, whitespace-ignoring string compare.
214 int strwicmp(const char *psz1, const char *psz2)
216 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
217 /* appropriate value. */
220 else if (psz1 == NULL)
222 else if (psz2 == NULL)
225 /* sync the strings on first non-whitespace */
227 while (isspace((int)*psz1))
229 while (isspace((int)*psz2))
231 if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0'
237 return (*psz1 - *psz2);
242 Convert a string to upper case, but don't modify it.
245 char *strupper_static(const char *s)
256 Convert a string to "normal" form.
259 void strnorm(char *s)
261 extern int case_default;
262 if (case_default == CASE_UPPER)
269 Check if a string is in "normal" case.
272 BOOL strisnormal(const char *s)
274 extern int case_default;
275 if (case_default == CASE_UPPER)
276 return(!strhaslower(s));
278 return(!strhasupper(s));
284 NOTE: oldc and newc must be 7 bit characters
287 void string_replace(char *s,char oldc,char newc)
289 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
290 string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
291 pull_ucs2(NULL, s, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
295 Skip past some strings in a buffer.
298 char *skip_string(char *buf,size_t n)
301 buf += strlen(buf) + 1;
306 Count the number of characters in a string. Normally this will
307 be the same as the number of bytes in a string for single byte strings,
308 but will be different for multibyte.
311 size_t str_charnum(const char *s)
313 uint16 tmpbuf2[sizeof(pstring)];
314 push_ucs2(NULL, tmpbuf2,s, sizeof(tmpbuf2), STR_TERMINATE);
315 return strlen_w(tmpbuf2);
319 Count the number of characters in a string. Normally this will
320 be the same as the number of bytes in a string for single byte strings,
321 but will be different for multibyte.
324 size_t str_ascii_charnum(const char *s)
327 push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
328 return strlen(tmpbuf2);
332 Trim the specified elements off the front and back of a string.
335 BOOL trim_string(char *s,const char *front,const char *back)
342 /* Ignore null or empty strings. */
343 if (!s || (s[0] == '\0'))
346 front_len = front? strlen(front) : 0;
347 back_len = back? strlen(back) : 0;
352 while (len && strncmp(s, front, front_len)==0) {
353 memcpy(s, s+front_len, (len-front_len)+1);
360 while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
361 s[len-back_len]='\0';
370 Does a string have any uppercase chars in it?
373 BOOL strhasupper(const char *s)
376 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
377 for(ptr=tmpbuf;*ptr;ptr++)
384 Does a string have any lowercase chars in it?
387 BOOL strhaslower(const char *s)
390 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
391 for(ptr=tmpbuf;*ptr;ptr++)
398 Find the number of 'c' chars in a string
401 size_t count_chars(const char *s,char c)
405 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
406 for(count=0,ptr=tmpbuf;*ptr;ptr++)
407 if(*ptr==UCS2_CHAR(c))
413 Return True if a string consists only of one particular character.
416 BOOL str_is_all(const char *s,char c)
425 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
426 for(ptr=tmpbuf;*ptr;ptr++)
427 if(*ptr!=UCS2_CHAR(c))
434 Safe string copy into a known length string. maxlength does not
435 include the terminating zero.
438 char *safe_strcpy(char *dest,const char *src, size_t maxlength)
443 DEBUG(0,("ERROR: NULL dest in safe_strcpy\n"));
448 /* We intentionally write out at the extremity of the destination
449 * string. If the destination is too short (e.g. pstrcpy into mallocd
450 * or fstring) then this should cause an error under a memory
452 dest[maxlength] = '\0';
462 if (len > maxlength) {
463 DEBUG(0,("ERROR: string overflow by %u (%u - %u) in safe_strcpy [%.50s]\n",
464 (unsigned int)(len-maxlength), len, maxlength, src));
468 memmove(dest, src, len);
474 Safe string cat into a string. maxlength does not
475 include the terminating zero.
478 char *safe_strcat(char *dest, const char *src, size_t maxlength)
480 size_t src_len, dest_len;
483 DEBUG(0,("ERROR: NULL dest in safe_strcat\n"));
490 src_len = strlen(src);
491 dest_len = strlen(dest);
493 if (src_len + dest_len > maxlength) {
494 DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
495 (int)(src_len + dest_len - maxlength), src));
496 if (maxlength > dest_len) {
497 memcpy(&dest[dest_len], src, maxlength - dest_len);
503 memcpy(&dest[dest_len], src, src_len);
504 dest[dest_len + src_len] = 0;
509 Paranoid strcpy into a buffer of given length (includes terminating
510 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
511 and replaces with '_'. Deliberately does *NOT* check for multibyte
512 characters. Don't change it !
515 char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
520 DEBUG(0,("ERROR: NULL dest in alpha_strcpy\n"));
530 if (len >= maxlength)
533 if (!other_safe_chars)
534 other_safe_chars = "";
536 for(i = 0; i < len; i++) {
537 int val = (src[i] & 0xff);
538 if (isupper(val) || islower(val) || isdigit(val) || strchr_m(other_safe_chars, val))
550 Like strncpy but always null terminates. Make sure there is room!
551 The variable n should always be one less than the available size.
554 char *StrnCpy(char *dest,const char *src,size_t n)
563 while (n-- && (*d++ = *src++))
570 Like strncpy but copies up to the character marker. always null terminates.
571 returns a pointer to the character marker in the source string (src).
574 char *strncpyn(char *dest, const char *src, size_t n, char c)
579 p = strchr_m(src, c);
581 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
585 str_len = PTR_DIFF(p, src);
586 strncpy(dest, src, MIN(n, str_len));
587 dest[str_len] = '\0';
593 Routine to get hex characters and turn them into a 16 byte array.
594 the array can be variable length, and any non-hex-numeric
595 characters are skipped. "0xnn" or "0Xnn" is specially catered
598 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
602 size_t strhex_to_str(char *p, size_t len, const char *strhex)
605 size_t num_chars = 0;
606 unsigned char lonybble, hinybble;
607 const char *hexchars = "0123456789ABCDEF";
608 char *p1 = NULL, *p2 = NULL;
610 for (i = 0; i < len && strhex[i] != 0; i++) {
611 if (strnequal(hexchars, "0x", 2)) {
612 i++; /* skip two chars */
616 if (!(p1 = strchr_m(hexchars, toupper(strhex[i]))))
619 i++; /* next hex digit */
621 if (!(p2 = strchr_m(hexchars, toupper(strhex[i]))))
624 /* get the two nybbles */
625 hinybble = PTR_DIFF(p1, hexchars);
626 lonybble = PTR_DIFF(p2, hexchars);
628 p[num_chars] = (hinybble << 4) | lonybble;
638 Check if a string is part of a list.
641 BOOL in_list(char *s,char *list,BOOL casesensitive)
649 while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
651 if (strcmp(tok,s) == 0)
654 if (StrCaseCmp(tok,s) == 0)
661 /* this is used to prevent lots of mallocs of size 1 */
662 static char *null_string = NULL;
665 Set a string value, allocing the space for the string
668 static BOOL string_init(char **dest,const char *src)
678 if((null_string = (char *)malloc(1)) == NULL) {
679 DEBUG(0,("string_init: malloc fail for null_string.\n"));
686 (*dest) = strdup(src);
687 if ((*dest) == NULL) {
688 DEBUG(0,("Out of memory in string_init\n"));
699 void string_free(char **s)
703 if (*s == null_string)
709 Set a string value, deallocating any existing space, and allocing the space
713 BOOL string_set(char **dest,const char *src)
716 return(string_init(dest,src));
720 Substitute a string for a pattern in another string. Make sure there is
723 This routine looks for pattern in s and replaces it with
724 insert. It may do multiple replacements.
726 Any of " ; ' $ or ` in the insert string are replaced with _
727 if len==0 then the string cannot be extended. This is different from the old
728 use of len==0 which was for no length checks to be done.
731 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
736 if (!insert || !pattern || !*pattern || !s)
739 ls = (ssize_t)strlen(s);
740 lp = (ssize_t)strlen(pattern);
741 li = (ssize_t)strlen(insert);
744 len = ls + 1; /* len is number of *bytes* */
746 while (lp <= ls && (p = strstr(s,pattern))) {
747 if (ls + (li-lp) >= len) {
748 DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n",
749 (int)(ls + (li-lp) - len),
754 memmove(p+li,p+lp,strlen(p+lp)+1);
777 void fstring_sub(char *s,const char *pattern,const char *insert)
779 string_sub(s, pattern, insert, sizeof(fstring));
782 void pstring_sub(char *s,const char *pattern,const char *insert)
784 string_sub(s, pattern, insert, sizeof(pstring));
788 Similar to string_sub, but it will accept only allocated strings
789 and may realloc them so pay attention at what you pass on no
790 pointers inside strings, no pstrings or const may be passed
794 char *realloc_string_sub(char *string, const char *pattern, const char *insert)
798 ssize_t ls,lp,li,ld, i;
800 if (!insert || !pattern || !*pattern || !string || !*string)
807 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
810 ls = (ssize_t)strlen(s);
811 lp = (ssize_t)strlen(pattern);
812 li = (ssize_t)strlen(insert);
831 while ((p = strstr(s,pattern))) {
833 char *t = Realloc(string, ls + ld + 1);
835 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
843 memmove(p+li,p+lp,strlen(p+lp)+1);
854 Similar to string_sub() but allows for any character to be substituted.
856 if len==0 then the string cannot be extended. This is different from the old
857 use of len==0 which was for no length checks to be done.
860 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
865 if (!insert || !pattern || !s)
868 ls = (ssize_t)strlen(s);
869 lp = (ssize_t)strlen(pattern);
870 li = (ssize_t)strlen(insert);
876 len = ls + 1; /* len is number of *bytes* */
878 while (lp <= ls && (p = strstr(s,pattern))) {
879 if (ls + (li-lp) >= len) {
880 DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n",
881 (int)(ls + (li-lp) - len),
886 memmove(p+li,p+lp,strlen(p+lp)+1);
888 memcpy(p, insert, li);
895 Similar to all_string_sub but for unicode strings.
896 Return a new allocated unicode string.
897 similar to string_sub() but allows for any character to be substituted.
901 smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
902 const smb_ucs2_t *insert)
905 const smb_ucs2_t *sp;
906 size_t lr, lp, li, lt;
908 if (!insert || !pattern || !*pattern || !s)
911 lt = (size_t)strlen_w(s);
912 lp = (size_t)strlen_w(pattern);
913 li = (size_t)strlen_w(insert);
916 const smb_ucs2_t *st = s;
918 while ((sp = strstr_w(st, pattern))) {
924 r = rp = (smb_ucs2_t *)malloc((lt + 1)*(sizeof(smb_ucs2_t)));
926 DEBUG(0, ("all_string_sub_w: out of memory!\n"));
930 while ((sp = strstr_w(s, pattern))) {
931 memcpy(rp, s, (sp - s));
932 rp += ((sp - s) / sizeof(smb_ucs2_t));
933 memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
937 lr = ((rp - r) / sizeof(smb_ucs2_t));
939 memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
947 smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
952 if (!insert || !pattern || !s)
954 push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
955 push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
956 return all_string_sub_w(s, p, i);
960 Splits out the front and back at a separator.
963 void split_at_last_component(char *path, char *front, char sep, char *back)
965 char *p = strrchr_m(path, sep);
971 pstrcpy(front, path);
984 Write an octal as a string.
987 const char *octal_string(int i)
992 slprintf(ret, sizeof(ret)-1, "0%o", i);
998 Truncate a string at a specified length.
1001 char *string_truncate(char *s, int length)
1003 if (s && strlen(s) > length)
1009 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1010 We convert via ucs2 for now.
1013 char *strchr_m(const char *s, char c)
1019 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1020 p = strchr_w(ws, UCS2_CHAR(c));
1024 pull_ucs2_pstring(s2, ws);
1025 return (char *)(s+strlen(s2));
1028 char *strrchr_m(const char *s, char c)
1034 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1035 p = strrchr_w(ws, UCS2_CHAR(c));
1039 pull_ucs2_pstring(s2, ws);
1040 return (char *)(s+strlen(s2));
1044 Convert a string to lower case.
1047 void strlower_m(char *s)
1049 /* this is quite a common operation, so we want it to be
1050 fast. We optimise for the ascii case, knowing that all our
1051 supported multi-byte character sets are ascii-compatible
1052 (ie. they match for the first 128 chars) */
1054 while (*s && !(((unsigned char)s[0]) & 0x7F)) {
1055 *s = tolower((unsigned char)*s);
1062 /* I assume that lowercased string takes the same number of bytes
1063 * as source string even in UTF-8 encoding. (VIV) */
1064 unix_strlower(s,strlen(s)+1,s,strlen(s)+1);
1068 Duplicate convert a string to lower case.
1071 char *strdup_lower(const char *s)
1073 char *t = strdup(s);
1075 DEBUG(0, ("strdup_lower: Out of memory!\n"));
1083 Convert a string to upper case.
1086 void strupper_m(char *s)
1088 /* this is quite a common operation, so we want it to be
1089 fast. We optimise for the ascii case, knowing that all our
1090 supported multi-byte character sets are ascii-compatible
1091 (ie. they match for the first 128 chars) */
1093 while (*s && !(((unsigned char)s[0]) & 0x7F)) {
1094 *s = toupper((unsigned char)*s);
1101 /* I assume that lowercased string takes the same number of bytes
1102 * as source string even in multibyte encoding. (VIV) */
1103 unix_strupper(s,strlen(s)+1,s,strlen(s)+1);
1107 Convert a string to upper case.
1110 char *strdup_upper(const char *s)
1112 char *t = strdup(s);
1114 DEBUG(0, ("strdup_upper: Out of memory!\n"));
1122 Return a RFC2254 binary string representation of a buffer.
1123 Used in LDAP filters.
1127 char *binary_string(char *buf, int len)
1131 const char *hex = "0123456789ABCDEF";
1132 s = malloc(len * 3 + 1);
1135 for (j=i=0;i<len;i++) {
1137 s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1138 s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1146 Just a typesafety wrapper for snprintf into a pstring.
1149 int pstr_sprintf(pstring s, const char *fmt, ...)
1155 ret = vsnprintf(s, PSTRING_LEN, fmt, ap);
1161 Just a typesafety wrapper for snprintf into a fstring.
1164 int fstr_sprintf(fstring s, const char *fmt, ...)
1170 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1175 #ifndef HAVE_STRNDUP
1177 Some platforms don't have strndup.
1180 char *strndup(const char *s, size_t n)
1195 #ifndef HAVE_STRNLEN
1197 Some platforms don't have strnlen
1200 size_t strnlen(const char *s, size_t n)
1203 for (i=0; s[i] && i<n; i++)
1210 List of Strings manipulation functions
1213 #define S_LIST_ABS 16 /* List Allocation Block Size */
1215 char **str_list_make(const char *string, const char *sep)
1217 char **list, **rlist;
1223 if (!string || !*string)
1227 DEBUG(0,("str_list_make: Unable to allocate memory"));
1230 if (!sep) sep = LIST_SEP;
1236 while (next_token(&str, tok, sep, sizeof(tok))) {
1238 lsize += S_LIST_ABS;
1239 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1241 DEBUG(0,("str_list_make: Unable to allocate memory"));
1242 str_list_free(&list);
1247 memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
1250 list[num] = strdup(tok);
1252 DEBUG(0,("str_list_make: Unable to allocate memory"));
1253 str_list_free(&list);
1265 BOOL str_list_copy(char ***dest, const char **src)
1267 char **list, **rlist;
1279 lsize += S_LIST_ABS;
1280 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1282 DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
1283 str_list_free(&list);
1287 memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
1290 list[num] = strdup(src[num]);
1292 DEBUG(0,("str_list_copy: Unable to allocate memory"));
1293 str_list_free(&list);
1305 * Return true if all the elements of the list match exactly.
1307 BOOL str_list_compare(char **list1, char **list2)
1311 if (!list1 || !list2)
1312 return (list1 == list2);
1314 for (num = 0; list1[num]; num++) {
1317 if (!strcsequal(list1[num], list2[num]))
1321 return False; /* if list2 has more elements than list1 fail */
1326 void str_list_free(char ***list)
1330 if (!list || !*list)
1333 for(; *tlist; tlist++)
1338 BOOL str_list_substitute(char **list, const char *pattern, const char *insert)
1341 ssize_t ls, lp, li, ld, i, d;
1350 lp = (ssize_t)strlen(pattern);
1351 li = (ssize_t)strlen(insert);
1356 ls = (ssize_t)strlen(s);
1358 while ((p = strstr(s, pattern))) {
1362 t = (char *) malloc(ls +ld +1);
1364 DEBUG(0,("str_list_substitute: Unable to allocate memory"));
1367 memcpy(t, *list, d);
1368 memcpy(t +d +li, p +lp, ls -d -lp +1);
1375 for (i = 0; i < li; i++) {
1376 switch (insert[i]) {
1388 t[d +i] = insert[i];
1400 #define IPSTR_LIST_SEP ","
1403 * Add ip string representation to ipstr list. Used also
1404 * as part of @function ipstr_list_make
1406 * @param ipstr_list pointer to string containing ip list;
1407 * MUST BE already allocated and IS reallocated if necessary
1408 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1409 * as a result of reallocation)
1410 * @param ip IP address which is to be added to list
1411 * @return pointer to string appended with new ip and possibly
1412 * reallocated to new length
1415 char* ipstr_list_add(char** ipstr_list, const struct in_addr *ip)
1417 char* new_ipstr = NULL;
1419 /* arguments checking */
1420 if (!ipstr_list || !ip) return NULL;
1422 /* attempt to convert ip to a string and append colon separator to it */
1424 asprintf(&new_ipstr, "%s%s%s", *ipstr_list, IPSTR_LIST_SEP,inet_ntoa(*ip));
1425 SAFE_FREE(*ipstr_list);
1427 asprintf(&new_ipstr, "%s", inet_ntoa(*ip));
1429 *ipstr_list = new_ipstr;
1435 * Allocate and initialise an ipstr list using ip adresses
1436 * passed as arguments.
1438 * @param ipstr_list pointer to string meant to be allocated and set
1439 * @param ip_list array of ip addresses to place in the list
1440 * @param ip_count number of addresses stored in ip_list
1441 * @return pointer to allocated ip string
1444 char* ipstr_list_make(char** ipstr_list, const struct in_addr* ip_list, int ip_count)
1448 /* arguments checking */
1449 if (!ip_list && !ipstr_list) return 0;
1453 /* process ip addresses given as arguments */
1454 for (i = 0; i < ip_count; i++)
1455 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1457 return (*ipstr_list);
1462 * Parse given ip string list into array of ip addresses
1463 * (as in_addr structures)
1465 * @param ipstr ip string list to be parsed
1466 * @param ip_list pointer to array of ip addresses which is
1467 * allocated by this function and must be freed by caller
1468 * @return number of succesfully parsed addresses
1471 int ipstr_list_parse(const char* ipstr_list, struct in_addr** ip_list)
1476 if (!ipstr_list || !ip_list) return 0;
1478 for (*ip_list = NULL, count = 0;
1479 next_token(&ipstr_list, token_str, IPSTR_LIST_SEP, FSTRING_LEN);
1482 struct in_addr addr;
1484 /* convert single token to ip address */
1485 if ( (addr.s_addr = inet_addr(token_str)) == INADDR_NONE )
1488 /* prepare place for another in_addr structure */
1489 *ip_list = Realloc(*ip_list, (count + 1) * sizeof(struct in_addr));
1490 if (!*ip_list) return -1;
1492 (*ip_list)[count] = addr;
1500 * Safely free ip string list
1502 * @param ipstr_list ip string list to be freed
1505 void ipstr_list_free(char* ipstr_list)
1507 SAFE_FREE(ipstr_list);
1512 Unescape a URL encoded string, in place.
1515 void rfc1738_unescape(char *buf)
1519 while ((p=strchr_m(p,'+')))
1524 while (p && *p && (p=strchr_m(p,'%'))) {
1528 if (c1 >= '0' && c1 <= '9')
1530 else if (c1 >= 'A' && c1 <= 'F')
1532 else if (c1 >= 'a' && c1 <= 'f')
1534 else {p++; continue;}
1536 if (c2 >= '0' && c2 <= '9')
1538 else if (c2 >= 'A' && c2 <= 'F')
1540 else if (c2 >= 'a' && c2 <= 'f')
1542 else {p++; continue;}
1546 memmove(p+1, p+3, strlen(p+3)+1);
1551 static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1554 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
1556 DATA_BLOB base64_decode_data_blob(const char *s)
1558 int bit_offset, byte_offset, idx, i, n;
1559 DATA_BLOB decoded = data_blob(s, strlen(s)+1);
1560 unsigned char *d = decoded.data;
1565 while (*s && (p=strchr_m(b64,*s))) {
1566 idx = (int)(p - b64);
1567 byte_offset = (i*6)/8;
1568 bit_offset = (i*6)%8;
1569 d[byte_offset] &= ~((1<<(8-bit_offset))-1);
1570 if (bit_offset < 3) {
1571 d[byte_offset] |= (idx << (2-bit_offset));
1574 d[byte_offset] |= (idx >> (bit_offset-2));
1575 d[byte_offset+1] = 0;
1576 d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
1588 * Decode a base64 string in-place - wrapper for the above
1590 void base64_decode_inplace(char *s)
1592 DATA_BLOB decoded = base64_decode_data_blob(s);
1593 memcpy(s, decoded.data, decoded.length);
1594 data_blob_free(&decoded);
1596 /* null terminate */
1597 s[decoded.length] = '\0';
1601 * Encode a base64 string into a malloc()ed string caller to free.
1603 *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
1605 char * base64_encode_data_blob(DATA_BLOB data)
1610 size_t len = data.length;
1611 size_t output_len = data.length * 2;
1612 char *result = malloc(output_len); /* get us plenty of space */
1614 while (len-- && out_cnt < (data.length * 2) - 5) {
1615 int c = (unsigned char) *(data.data++);
1618 if (char_count == 3) {
1619 result[out_cnt++] = b64[bits >> 18];
1620 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1621 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1622 result[out_cnt++] = b64[bits & 0x3f];
1629 if (char_count != 0) {
1630 bits <<= 16 - (8 * char_count);
1631 result[out_cnt++] = b64[bits >> 18];
1632 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1633 if (char_count == 1) {
1634 result[out_cnt++] = '=';
1635 result[out_cnt++] = '=';
1637 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1638 result[out_cnt++] = '=';
1641 result[out_cnt] = '\0'; /* terminate */
1646 size_t valgrind_strlen(const char *s)
1649 for(count = 0; *s++; count++)