2 Unix SMB/CIFS implementation.
3 Samba utility functions
5 Copyright (C) Andrew Tridgell 1992-2001
6 Copyright (C) Simo Sorce 2001-2002
7 Copyright (C) Martin Pool 2003
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 * @brief String utilities.
32 * Get the next token from a string, return False if none found.
33 * Handles double-quotes.
35 * Based on a routine by GJC@VILLAGE.COM.
36 * Extensively modified by Andrew.Tridgell@anu.edu.au
38 BOOL next_token(const char **ptr,char *buff, const char *sep, size_t bufsize)
50 /* default to simple separators */
54 /* find the first non sep char */
55 while (*s && strchr_m(sep,*s))
62 /* copy over the token */
64 for (quoted = False; len < bufsize && *s && (quoted || !strchr_m(sep,*s)); s++) {
73 *ptr = (*s) ? s+1 : s;
80 This is like next_token but is not re-entrant and "remembers" the first
81 parameter so you can pass NULL. This is useful for user interface code
82 but beware the fact that it is not re-entrant!
85 static const char *last_ptr=NULL;
87 BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
93 ret = next_token(ptr, buff, sep, bufsize);
98 static uint16 tmpbuf[sizeof(pstring)];
100 void set_first_token(char *ptr)
106 Convert list of tokens to array; dependent on above routine.
107 Uses last_ptr from above - bit of a hack.
110 char **toktocliplist(int *ctok, const char *sep)
112 char *s=(char *)last_ptr;
119 while(*s && strchr_m(sep,*s))
128 while(*s && (!strchr_m(sep,*s)))
130 while(*s && strchr_m(sep,*s))
137 if (!(ret=iret=malloc(ictok*sizeof(char *))))
152 * Case insensitive string compararison.
154 * iconv does not directly give us a way to compare strings in
155 * arbitrary unix character sets -- all we can is convert and then
156 * compare. This is expensive.
158 * As an optimization, we do a first pass that considers only the
159 * prefix of the strings that is entirely 7-bit. Within this, we
160 * check whether they have the same value.
162 * Hopefully this will often give the answer without needing to copy.
163 * In particular it should speed comparisons to literal ascii strings
164 * or comparisons of strings that are "obviously" different.
166 * If we find a non-ascii character we fall back to converting via
169 * This should never be slower than convering the whole thing, and
172 * A different optimization would be to compare for bitwise equality
173 * in the binary encoding. (It would be possible thought hairy to do
174 * both simultaneously.) But in that case if they turn out to be
175 * different, we'd need to restart the whole thing.
177 * Even better is to implement strcasecmp for each encoding and use a
180 int StrCaseCmp(const char *s, const char *t)
183 const char * ps, * pt;
185 smb_ucs2_t *buffer_s, *buffer_t;
188 for (ps = s, pt = t; ; ps++, pt++) {
192 return 0; /* both ended */
194 return -1; /* s is a prefix */
196 return +1; /* t is a prefix */
197 else if ((*ps & 0x80) || (*pt & 0x80))
198 /* not ascii anymore, do it the hard way from here on in */
211 size = push_ucs2_allocate(&buffer_s, s);
212 if (size == (size_t)-1) {
214 /* Not quite the right answer, but finding the right one
215 under this failure case is expensive, and it's pretty close */
218 size = push_ucs2_allocate(&buffer_t, t);
219 if (size == (size_t)-1) {
222 /* Not quite the right answer, but finding the right one
223 under this failure case is expensive, and it's pretty close */
226 ret = strcasecmp_w(buffer_s, buffer_t);
234 Case insensitive string compararison, length limited.
236 int StrnCaseCmp(const char *s, const char *t, size_t n)
239 unix_strupper(s, strlen(s)+1, buf1, sizeof(buf1));
240 unix_strupper(t, strlen(t)+1, buf2, sizeof(buf2));
241 return strncmp(buf1,buf2,n);
247 * @note The comparison is case-insensitive.
249 BOOL strequal(const char *s1, const char *s2)
256 return(StrCaseCmp(s1,s2)==0);
260 * Compare 2 strings up to and including the nth char.
262 * @note The comparison is case-insensitive.
264 BOOL strnequal(const char *s1,const char *s2,size_t n)
268 if (!s1 || !s2 || !n)
271 return(StrnCaseCmp(s1,s2,n)==0);
275 Compare 2 strings (case sensitive).
278 BOOL strcsequal(const char *s1,const char *s2)
285 return(strcmp(s1,s2)==0);
289 Do a case-insensitive, whitespace-ignoring string compare.
292 int strwicmp(const char *psz1, const char *psz2)
294 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
295 /* appropriate value. */
298 else if (psz1 == NULL)
300 else if (psz2 == NULL)
303 /* sync the strings on first non-whitespace */
305 while (isspace((int)*psz1))
307 while (isspace((int)*psz2))
309 if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0'
315 return (*psz1 - *psz2);
320 Convert a string to upper case, but don't modify it.
323 char *strupper_static(const char *s)
334 Convert a string to "normal" form.
337 void strnorm(char *s)
339 extern int case_default;
340 if (case_default == CASE_UPPER)
347 Check if a string is in "normal" case.
350 BOOL strisnormal(const char *s)
352 extern int case_default;
353 if (case_default == CASE_UPPER)
354 return(!strhaslower(s));
356 return(!strhasupper(s));
362 NOTE: oldc and newc must be 7 bit characters
365 void string_replace(pstring s,char oldc,char newc)
367 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
368 string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
369 pull_ucs2(NULL, s, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
373 Skip past some strings in a buffer.
376 char *skip_string(char *buf,size_t n)
379 buf += strlen(buf) + 1;
384 Count the number of characters in a string. Normally this will
385 be the same as the number of bytes in a string for single byte strings,
386 but will be different for multibyte.
389 size_t str_charnum(const char *s)
391 uint16 tmpbuf2[sizeof(pstring)];
392 push_ucs2(NULL, tmpbuf2,s, sizeof(tmpbuf2), STR_TERMINATE);
393 return strlen_w(tmpbuf2);
397 Count the number of characters in a string. Normally this will
398 be the same as the number of bytes in a string for single byte strings,
399 but will be different for multibyte.
402 size_t str_ascii_charnum(const char *s)
405 push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
406 return strlen(tmpbuf2);
410 Trim the specified elements off the front and back of a string.
413 BOOL trim_string(char *s,const char *front,const char *back)
420 /* Ignore null or empty strings. */
421 if (!s || (s[0] == '\0'))
424 front_len = front? strlen(front) : 0;
425 back_len = back? strlen(back) : 0;
430 while (len && strncmp(s, front, front_len)==0) {
431 /* Must use memmove here as src & dest can
432 * easily overlap. Found by valgrind. JRA. */
433 memmove(s, s+front_len, (len-front_len)+1);
440 while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
441 s[len-back_len]='\0';
450 Does a string have any uppercase chars in it?
453 BOOL strhasupper(const char *s)
456 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
457 for(ptr=tmpbuf;*ptr;ptr++)
464 Does a string have any lowercase chars in it?
467 BOOL strhaslower(const char *s)
470 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
471 for(ptr=tmpbuf;*ptr;ptr++)
478 Find the number of 'c' chars in a string
481 size_t count_chars(const char *s,char c)
485 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
486 for(count=0,ptr=tmpbuf;*ptr;ptr++)
487 if(*ptr==UCS2_CHAR(c))
493 Safe string copy into a known length string. maxlength does not
494 include the terminating zero.
497 char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength)
502 DEBUG(0,("ERROR: NULL dest in safe_strcpy\n"));
506 clobber_region(fn,line,dest, maxlength+1);
513 len = strnlen(src, maxlength+1);
515 if (len > maxlength) {
516 DEBUG(0,("ERROR: string overflow by %u (%u - %u) in safe_strcpy [%.50s]\n",
517 (unsigned int)(len-maxlength), len, maxlength, src));
521 memmove(dest, src, len);
527 Safe string cat into a string. maxlength does not
528 include the terminating zero.
530 char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength)
532 size_t src_len, dest_len;
535 DEBUG(0,("ERROR: NULL dest in safe_strcat\n"));
542 src_len = strnlen(src, maxlength + 1);
543 dest_len = strnlen(dest, maxlength + 1);
545 clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
547 if (src_len + dest_len > maxlength) {
548 DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
549 (int)(src_len + dest_len - maxlength), src));
550 if (maxlength > dest_len) {
551 memcpy(&dest[dest_len], src, maxlength - dest_len);
557 memcpy(&dest[dest_len], src, src_len);
558 dest[dest_len + src_len] = 0;
563 Paranoid strcpy into a buffer of given length (includes terminating
564 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
565 and replaces with '_'. Deliberately does *NOT* check for multibyte
566 characters. Don't change it !
568 char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
572 clobber_region(fn, line, dest, maxlength);
575 DEBUG(0,("ERROR: NULL dest in alpha_strcpy\n"));
585 if (len >= maxlength)
588 if (!other_safe_chars)
589 other_safe_chars = "";
591 for(i = 0; i < len; i++) {
592 int val = (src[i] & 0xff);
593 if (isupper(val) || islower(val) || isdigit(val) || strchr_m(other_safe_chars, val))
605 Like strncpy but always null terminates. Make sure there is room!
606 The variable n should always be one less than the available size.
608 char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
612 clobber_region(fn, line, dest, n+1);
622 while (n-- && (*d = *src)) {
633 Like strncpy but copies up to the character marker. always null terminates.
634 returns a pointer to the character marker in the source string (src).
637 static char *strncpyn(char *dest, const char *src, size_t n, char c)
642 clobber_region(dest, n+1);
644 p = strchr_m(src, c);
646 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
650 str_len = PTR_DIFF(p, src);
651 strncpy(dest, src, MIN(n, str_len));
652 dest[str_len] = '\0';
659 Routine to get hex characters and turn them into a 16 byte array.
660 the array can be variable length, and any non-hex-numeric
661 characters are skipped. "0xnn" or "0Xnn" is specially catered
664 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
668 size_t strhex_to_str(char *p, size_t len, const char *strhex)
671 size_t num_chars = 0;
672 unsigned char lonybble, hinybble;
673 const char *hexchars = "0123456789ABCDEF";
674 char *p1 = NULL, *p2 = NULL;
676 for (i = 0; i < len && strhex[i] != 0; i++) {
677 if (strnequal(hexchars, "0x", 2)) {
678 i++; /* skip two chars */
682 if (!(p1 = strchr_m(hexchars, toupper(strhex[i]))))
685 i++; /* next hex digit */
687 if (!(p2 = strchr_m(hexchars, toupper(strhex[i]))))
690 /* get the two nybbles */
691 hinybble = PTR_DIFF(p1, hexchars);
692 lonybble = PTR_DIFF(p2, hexchars);
694 p[num_chars] = (hinybble << 4) | lonybble;
704 * Routine to print a buffer as HEX digits, into an allocated string.
707 void hex_encode(const unsigned char *buff_in, size_t len, char **out_hex_buffer)
712 *out_hex_buffer = smb_xmalloc((len*2)+1);
713 hex_buffer = *out_hex_buffer;
715 for (i = 0; i < len; i++)
716 slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);
720 Check if a string is part of a list.
723 BOOL in_list(char *s,char *list,BOOL casesensitive)
731 while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
733 if (strcmp(tok,s) == 0)
736 if (StrCaseCmp(tok,s) == 0)
743 /* this is used to prevent lots of mallocs of size 1 */
744 static char *null_string = NULL;
747 Set a string value, allocing the space for the string
750 static BOOL string_init(char **dest,const char *src)
760 if((null_string = (char *)malloc(1)) == NULL) {
761 DEBUG(0,("string_init: malloc fail for null_string.\n"));
768 (*dest) = strdup(src);
769 if ((*dest) == NULL) {
770 DEBUG(0,("Out of memory in string_init\n"));
781 void string_free(char **s)
785 if (*s == null_string)
791 Set a string value, deallocating any existing space, and allocing the space
795 BOOL string_set(char **dest,const char *src)
798 return(string_init(dest,src));
802 Substitute a string for a pattern in another string. Make sure there is
805 This routine looks for pattern in s and replaces it with
806 insert. It may do multiple replacements.
808 Any of " ; ' $ or ` in the insert string are replaced with _
809 if len==0 then the string cannot be extended. This is different from the old
810 use of len==0 which was for no length checks to be done.
813 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
818 if (!insert || !pattern || !*pattern || !s)
821 ls = (ssize_t)strlen(s);
822 lp = (ssize_t)strlen(pattern);
823 li = (ssize_t)strlen(insert);
826 len = ls + 1; /* len is number of *bytes* */
828 while (lp <= ls && (p = strstr(s,pattern))) {
829 if (ls + (li-lp) >= len) {
830 DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n",
831 (int)(ls + (li-lp) - len),
836 memmove(p+li,p+lp,strlen(p+lp)+1);
859 void fstring_sub(char *s,const char *pattern,const char *insert)
861 string_sub(s, pattern, insert, sizeof(fstring));
864 void pstring_sub(char *s,const char *pattern,const char *insert)
866 string_sub(s, pattern, insert, sizeof(pstring));
870 Similar to string_sub, but it will accept only allocated strings
871 and may realloc them so pay attention at what you pass on no
872 pointers inside strings, no pstrings or const may be passed
876 char *realloc_string_sub(char *string, const char *pattern, const char *insert)
880 ssize_t ls,lp,li,ld, i;
882 if (!insert || !pattern || !*pattern || !string || !*string)
889 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
892 ls = (ssize_t)strlen(s);
893 lp = (ssize_t)strlen(pattern);
894 li = (ssize_t)strlen(insert);
913 while ((p = strstr(s,pattern))) {
915 int offset = PTR_DIFF(s,string);
916 char *t = Realloc(string, ls + ld + 1);
918 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
923 p = t + offset + (p - s);
926 memmove(p+li,p+lp,strlen(p+lp)+1);
937 Similar to string_sub() but allows for any character to be substituted.
939 if len==0 then the string cannot be extended. This is different from the old
940 use of len==0 which was for no length checks to be done.
943 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
948 if (!insert || !pattern || !s)
951 ls = (ssize_t)strlen(s);
952 lp = (ssize_t)strlen(pattern);
953 li = (ssize_t)strlen(insert);
959 len = ls + 1; /* len is number of *bytes* */
961 while (lp <= ls && (p = strstr(s,pattern))) {
962 if (ls + (li-lp) >= len) {
963 DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n",
964 (int)(ls + (li-lp) - len),
969 memmove(p+li,p+lp,strlen(p+lp)+1);
971 memcpy(p, insert, li);
978 Similar to all_string_sub but for unicode strings.
979 Return a new allocated unicode string.
980 similar to string_sub() but allows for any character to be substituted.
984 static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
985 const smb_ucs2_t *insert)
988 const smb_ucs2_t *sp;
989 size_t lr, lp, li, lt;
991 if (!insert || !pattern || !*pattern || !s)
994 lt = (size_t)strlen_w(s);
995 lp = (size_t)strlen_w(pattern);
996 li = (size_t)strlen_w(insert);
999 const smb_ucs2_t *st = s;
1001 while ((sp = strstr_w(st, pattern))) {
1007 r = rp = (smb_ucs2_t *)malloc((lt + 1)*(sizeof(smb_ucs2_t)));
1009 DEBUG(0, ("all_string_sub_w: out of memory!\n"));
1013 while ((sp = strstr_w(s, pattern))) {
1014 memcpy(rp, s, (sp - s));
1015 rp += ((sp - s) / sizeof(smb_ucs2_t));
1016 memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
1020 lr = ((rp - r) / sizeof(smb_ucs2_t));
1022 memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
1030 smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
1035 if (!insert || !pattern || !s)
1037 push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
1038 push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
1039 return all_string_sub_w(s, p, i);
1044 Splits out the front and back at a separator.
1047 static void split_at_last_component(char *path, char *front, char sep, char *back)
1049 char *p = strrchr_m(path, sep);
1055 pstrcpy(front, path);
1069 Write an octal as a string.
1072 const char *octal_string(int i)
1074 static char ret[64];
1077 slprintf(ret, sizeof(ret)-1, "0%o", i);
1083 Truncate a string at a specified length.
1086 char *string_truncate(char *s, unsigned int length)
1088 if (s && strlen(s) > length)
1094 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1095 We convert via ucs2 for now.
1098 char *strchr_m(const char *s, char c)
1104 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1105 p = strchr_w(ws, UCS2_CHAR(c));
1109 pull_ucs2_pstring(s2, ws);
1110 return (char *)(s+strlen(s2));
1113 char *strrchr_m(const char *s, char c)
1119 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1120 p = strrchr_w(ws, UCS2_CHAR(c));
1124 pull_ucs2_pstring(s2, ws);
1125 return (char *)(s+strlen(s2));
1128 /***********************************************************************
1129 Return the equivalent of doing strrchr 'n' times - always going
1131 ***********************************************************************/
1133 char *strnrchr_m(const char *s, char c, unsigned int n)
1139 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1140 p = strnrchr_w(ws, UCS2_CHAR(c), n);
1144 pull_ucs2_pstring(s2, ws);
1145 return (char *)(s+strlen(s2));
1149 Convert a string to lower case.
1152 void strlower_m(char *s)
1154 /* this is quite a common operation, so we want it to be
1155 fast. We optimise for the ascii case, knowing that all our
1156 supported multi-byte character sets are ascii-compatible
1157 (ie. they match for the first 128 chars) */
1159 while (*s && !(((unsigned char)s[0]) & 0x7F)) {
1160 *s = tolower((unsigned char)*s);
1167 /* I assume that lowercased string takes the same number of bytes
1168 * as source string even in UTF-8 encoding. (VIV) */
1169 unix_strlower(s,strlen(s)+1,s,strlen(s)+1);
1173 Convert a string to upper case.
1176 void strupper_m(char *s)
1178 /* this is quite a common operation, so we want it to be
1179 fast. We optimise for the ascii case, knowing that all our
1180 supported multi-byte character sets are ascii-compatible
1181 (ie. they match for the first 128 chars) */
1183 while (*s && !(((unsigned char)s[0]) & 0x7F)) {
1184 *s = toupper((unsigned char)*s);
1191 /* I assume that lowercased string takes the same number of bytes
1192 * as source string even in multibyte encoding. (VIV) */
1193 unix_strupper(s,strlen(s)+1,s,strlen(s)+1);
1197 Return a RFC2254 binary string representation of a buffer.
1198 Used in LDAP filters.
1202 char *binary_string(char *buf, int len)
1206 const char *hex = "0123456789ABCDEF";
1207 s = malloc(len * 3 + 1);
1210 for (j=i=0;i<len;i++) {
1212 s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1213 s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1221 Just a typesafety wrapper for snprintf into a pstring.
1224 int pstr_sprintf(pstring s, const char *fmt, ...)
1230 ret = vsnprintf(s, PSTRING_LEN, fmt, ap);
1237 Just a typesafety wrapper for snprintf into a fstring.
1240 int fstr_sprintf(fstring s, const char *fmt, ...)
1246 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1252 #ifndef HAVE_STRNDUP
1254 Some platforms don't have strndup.
1257 char *strndup(const char *s, size_t n)
1272 #ifndef HAVE_STRNLEN
1274 Some platforms don't have strnlen
1277 size_t strnlen(const char *s, size_t n)
1280 for (i=0; s[i] && i<n; i++)
1287 List of Strings manipulation functions
1290 #define S_LIST_ABS 16 /* List Allocation Block Size */
1292 char **str_list_make(const char *string, const char *sep)
1294 char **list, **rlist;
1300 if (!string || !*string)
1304 DEBUG(0,("str_list_make: Unable to allocate memory"));
1307 if (!sep) sep = LIST_SEP;
1313 while (next_token(&str, tok, sep, sizeof(tok))) {
1315 lsize += S_LIST_ABS;
1316 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1318 DEBUG(0,("str_list_make: Unable to allocate memory"));
1319 str_list_free(&list);
1324 memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
1327 list[num] = strdup(tok);
1329 DEBUG(0,("str_list_make: Unable to allocate memory"));
1330 str_list_free(&list);
1342 BOOL str_list_copy(char ***dest, const char **src)
1344 char **list, **rlist;
1356 lsize += S_LIST_ABS;
1357 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1359 DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
1360 str_list_free(&list);
1364 memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
1367 list[num] = strdup(src[num]);
1369 DEBUG(0,("str_list_copy: Unable to allocate memory"));
1370 str_list_free(&list);
1382 * Return true if all the elements of the list match exactly.
1384 BOOL str_list_compare(char **list1, char **list2)
1388 if (!list1 || !list2)
1389 return (list1 == list2);
1391 for (num = 0; list1[num]; num++) {
1394 if (!strcsequal(list1[num], list2[num]))
1398 return False; /* if list2 has more elements than list1 fail */
1403 void str_list_free(char ***list)
1407 if (!list || !*list)
1410 for(; *tlist; tlist++)
1415 BOOL str_list_substitute(char **list, const char *pattern, const char *insert)
1418 ssize_t ls, lp, li, ld, i, d;
1427 lp = (ssize_t)strlen(pattern);
1428 li = (ssize_t)strlen(insert);
1433 ls = (ssize_t)strlen(s);
1435 while ((p = strstr(s, pattern))) {
1439 t = (char *) malloc(ls +ld +1);
1441 DEBUG(0,("str_list_substitute: Unable to allocate memory"));
1444 memcpy(t, *list, d);
1445 memcpy(t +d +li, p +lp, ls -d -lp +1);
1452 for (i = 0; i < li; i++) {
1453 switch (insert[i]) {
1465 t[d +i] = insert[i];
1477 #define IPSTR_LIST_SEP ","
1478 #define IPSTR_LIST_CHAR ','
1481 * Add ip string representation to ipstr list. Used also
1482 * as part of @function ipstr_list_make
1484 * @param ipstr_list pointer to string containing ip list;
1485 * MUST BE already allocated and IS reallocated if necessary
1486 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1487 * as a result of reallocation)
1488 * @param ip IP address which is to be added to list
1489 * @return pointer to string appended with new ip and possibly
1490 * reallocated to new length
1493 char* ipstr_list_add(char** ipstr_list, const struct ip_service *service)
1495 char* new_ipstr = NULL;
1497 /* arguments checking */
1498 if (!ipstr_list || !service) return NULL;
1500 /* attempt to convert ip to a string and append colon separator to it */
1502 asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list, IPSTR_LIST_SEP,
1503 inet_ntoa(service->ip), service->port);
1504 SAFE_FREE(*ipstr_list);
1506 asprintf(&new_ipstr, "%s:%d", inet_ntoa(service->ip), service->port);
1508 *ipstr_list = new_ipstr;
1514 * Allocate and initialise an ipstr list using ip adresses
1515 * passed as arguments.
1517 * @param ipstr_list pointer to string meant to be allocated and set
1518 * @param ip_list array of ip addresses to place in the list
1519 * @param ip_count number of addresses stored in ip_list
1520 * @return pointer to allocated ip string
1523 char* ipstr_list_make(char** ipstr_list, const struct ip_service* ip_list, int ip_count)
1527 /* arguments checking */
1528 if (!ip_list && !ipstr_list) return 0;
1532 /* process ip addresses given as arguments */
1533 for (i = 0; i < ip_count; i++)
1534 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1536 return (*ipstr_list);
1541 * Parse given ip string list into array of ip addresses
1542 * (as ip_service structures)
1543 * e.g. 192.168.1.100:389,192.168.1.78, ...
1545 * @param ipstr ip string list to be parsed
1546 * @param ip_list pointer to array of ip addresses which is
1547 * allocated by this function and must be freed by caller
1548 * @return number of succesfully parsed addresses
1551 int ipstr_list_parse(const char* ipstr_list, struct ip_service **ip_list)
1557 if (!ipstr_list || !ip_list)
1560 count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
1561 if ( (*ip_list = (struct ip_service*)malloc(count * sizeof(struct ip_service))) == NULL ) {
1562 DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n", (unsigned long)count));
1567 next_token(&ipstr_list, token_str, IPSTR_LIST_SEP, FSTRING_LEN) && i<count;
1570 struct in_addr addr;
1572 char *p = strchr(token_str, ':');
1579 /* convert single token to ip address */
1580 if ( (addr.s_addr = inet_addr(token_str)) == INADDR_NONE )
1583 (*ip_list)[i].ip = addr;
1584 (*ip_list)[i].port = port;
1592 * Safely free ip string list
1594 * @param ipstr_list ip string list to be freed
1597 void ipstr_list_free(char* ipstr_list)
1599 SAFE_FREE(ipstr_list);
1604 Unescape a URL encoded string, in place.
1607 void rfc1738_unescape(char *buf)
1611 while ((p=strchr_m(p,'+')))
1616 while (p && *p && (p=strchr_m(p,'%'))) {
1620 if (c1 >= '0' && c1 <= '9')
1622 else if (c1 >= 'A' && c1 <= 'F')
1624 else if (c1 >= 'a' && c1 <= 'f')
1626 else {p++; continue;}
1628 if (c2 >= '0' && c2 <= '9')
1630 else if (c2 >= 'A' && c2 <= 'F')
1632 else if (c2 >= 'a' && c2 <= 'f')
1634 else {p++; continue;}
1638 memmove(p+1, p+3, strlen(p+3)+1);
1643 static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1646 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
1648 DATA_BLOB base64_decode_data_blob(const char *s)
1650 int bit_offset, byte_offset, idx, i, n;
1651 DATA_BLOB decoded = data_blob(s, strlen(s)+1);
1652 unsigned char *d = decoded.data;
1657 while (*s && (p=strchr_m(b64,*s))) {
1658 idx = (int)(p - b64);
1659 byte_offset = (i*6)/8;
1660 bit_offset = (i*6)%8;
1661 d[byte_offset] &= ~((1<<(8-bit_offset))-1);
1662 if (bit_offset < 3) {
1663 d[byte_offset] |= (idx << (2-bit_offset));
1666 d[byte_offset] |= (idx >> (bit_offset-2));
1667 d[byte_offset+1] = 0;
1668 d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
1680 * Decode a base64 string in-place - wrapper for the above
1682 void base64_decode_inplace(char *s)
1684 DATA_BLOB decoded = base64_decode_data_blob(s);
1685 memcpy(s, decoded.data, decoded.length);
1686 /* null terminate */
1687 s[decoded.length] = '\0';
1689 data_blob_free(&decoded);
1693 * Encode a base64 string into a malloc()ed string caller to free.
1695 *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
1697 char * base64_encode_data_blob(DATA_BLOB data)
1702 size_t len = data.length;
1703 size_t output_len = data.length * 2;
1704 char *result = malloc(output_len); /* get us plenty of space */
1706 while (len-- && out_cnt < (data.length * 2) - 5) {
1707 int c = (unsigned char) *(data.data++);
1710 if (char_count == 3) {
1711 result[out_cnt++] = b64[bits >> 18];
1712 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1713 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1714 result[out_cnt++] = b64[bits & 0x3f];
1721 if (char_count != 0) {
1722 bits <<= 16 - (8 * char_count);
1723 result[out_cnt++] = b64[bits >> 18];
1724 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1725 if (char_count == 1) {
1726 result[out_cnt++] = '=';
1727 result[out_cnt++] = '=';
1729 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1730 result[out_cnt++] = '=';
1733 result[out_cnt] = '\0'; /* terminate */
1737 /* read a SMB_BIG_UINT from a string */
1738 SMB_BIG_UINT STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
1741 SMB_BIG_UINT val = -1;
1742 const char *p = nptr;
1744 while (p && *p && isspace(*p))
1746 #ifdef LARGE_SMB_OFF_T
1747 sscanf(p,"%llu",&val);
1748 #else /* LARGE_SMB_OFF_T */
1749 sscanf(p,"%lu",&val);
1750 #endif /* LARGE_SMB_OFF_T */
1752 while (p && *p && isdigit(*p))