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++) {
65 if (*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)
369 /* this is quite a common operation, so we want it to be
370 fast. We optimise for the ascii case, knowing that all our
371 supported multi-byte character sets are ascii-compatible
372 (ie. they match for the first 128 chars) */
374 for (p = (unsigned char *)s; *p; p++) {
375 if (*p & 0x80) /* mb string - slow path. */
384 /* Slow (mb) path. */
385 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
386 /* With compose characters we must restart from the beginning. JRA. */
389 push_ucs2(NULL, tmpbuf, p, sizeof(tmpbuf), STR_TERMINATE);
390 string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
391 pull_ucs2(NULL, p, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
395 Skip past some strings in a buffer.
398 char *skip_string(char *buf,size_t n)
401 buf += strlen(buf) + 1;
406 Count the number of characters in a string. Normally this will
407 be the same as the number of bytes in a string for single byte strings,
408 but will be different for multibyte.
411 size_t str_charnum(const char *s)
413 uint16 tmpbuf2[sizeof(pstring)];
414 push_ucs2(NULL, tmpbuf2,s, sizeof(tmpbuf2), STR_TERMINATE);
415 return strlen_w(tmpbuf2);
419 Count the number of characters in a string. Normally this will
420 be the same as the number of bytes in a string for single byte strings,
421 but will be different for multibyte.
424 size_t str_ascii_charnum(const char *s)
427 push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
428 return strlen(tmpbuf2);
431 BOOL trim_char(char *s,char cfront,char cback)
437 /* Ignore null or empty strings. */
438 if (!s || (s[0] == '\0'))
442 while (*fp && *fp == cfront)
445 /* We ate the string. */
453 ep = fp + strlen(fp) - 1;
455 /* Attempt ascii only. Bail for mb strings. */
456 while ((ep >= fp) && (*ep == cback)) {
458 if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
459 /* Could be mb... bail back to tim_string. */
467 return trim_string(s, cfront ? fs : NULL, bs);
473 /* We ate the string. */
480 memmove(s, fp, ep-fp+2);
485 Trim the specified elements off the front and back of a string.
488 BOOL trim_string(char *s,const char *front,const char *back)
495 /* Ignore null or empty strings. */
496 if (!s || (s[0] == '\0'))
499 front_len = front? strlen(front) : 0;
500 back_len = back? strlen(back) : 0;
505 while (len && strncmp(s, front, front_len)==0) {
506 /* Must use memmove here as src & dest can
507 * easily overlap. Found by valgrind. JRA. */
508 memmove(s, s+front_len, (len-front_len)+1);
515 while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
516 s[len-back_len]='\0';
525 Does a string have any uppercase chars in it?
528 BOOL strhasupper(const char *s)
531 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
532 for(ptr=tmpbuf;*ptr;ptr++)
539 Does a string have any lowercase chars in it?
542 BOOL strhaslower(const char *s)
545 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
546 for(ptr=tmpbuf;*ptr;ptr++)
553 Find the number of 'c' chars in a string
556 size_t count_chars(const char *s,char c)
560 smb_ucs2_t *alloc_tmpbuf = NULL;
562 if (push_ucs2_allocate(&alloc_tmpbuf, s) == (size_t)-1) {
566 for(count=0,ptr=alloc_tmpbuf;*ptr;ptr++)
567 if(*ptr==UCS2_CHAR(c))
570 SAFE_FREE(alloc_tmpbuf);
575 Safe string copy into a known length string. maxlength does not
576 include the terminating zero.
579 char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength)
584 DEBUG(0,("ERROR: NULL dest in safe_strcpy, called from [%s][%d]\n", fn, line));
589 clobber_region(fn,line,dest, maxlength+1);
597 len = strnlen(src, maxlength+1);
599 if (len > maxlength) {
600 DEBUG(0,("ERROR: string overflow by %lu (%lu - %lu) in safe_strcpy [%.50s]\n",
601 (unsigned long)(len-maxlength), (unsigned long)len,
602 (unsigned long)maxlength, src));
606 memmove(dest, src, len);
612 Safe string cat into a string. maxlength does not
613 include the terminating zero.
615 char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength)
617 size_t src_len, dest_len;
620 DEBUG(0,("ERROR: NULL dest in safe_strcat, called from [%s][%d]\n", fn, line));
627 src_len = strnlen(src, maxlength + 1);
628 dest_len = strnlen(dest, maxlength + 1);
631 clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
634 if (src_len + dest_len > maxlength) {
635 DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
636 (int)(src_len + dest_len - maxlength), src));
637 if (maxlength > dest_len) {
638 memcpy(&dest[dest_len], src, maxlength - dest_len);
644 memcpy(&dest[dest_len], src, src_len);
645 dest[dest_len + src_len] = 0;
650 Paranoid strcpy into a buffer of given length (includes terminating
651 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
652 and replaces with '_'. Deliberately does *NOT* check for multibyte
653 characters. Don't change it !
655 char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
660 clobber_region(fn, line, dest, maxlength);
664 DEBUG(0,("ERROR: NULL dest in alpha_strcpy, called from [%s][%d]\n", fn, line));
674 if (len >= maxlength)
677 if (!other_safe_chars)
678 other_safe_chars = "";
680 for(i = 0; i < len; i++) {
681 int val = (src[i] & 0xff);
682 if (isupper(val) || islower(val) || isdigit(val) || strchr_m(other_safe_chars, val))
694 Like strncpy but always null terminates. Make sure there is room!
695 The variable n should always be one less than the available size.
697 char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
702 clobber_region(fn, line, dest, n+1);
706 DEBUG(0,("ERROR: NULL dest in StrnCpy, called from [%s][%d]\n", fn, line));
715 while (n-- && (*d = *src)) {
726 Like strncpy but copies up to the character marker. always null terminates.
727 returns a pointer to the character marker in the source string (src).
730 static char *strncpyn(char *dest, const char *src, size_t n, char c)
736 clobber_region(dest, n+1);
738 p = strchr_m(src, c);
740 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
744 str_len = PTR_DIFF(p, src);
745 strncpy(dest, src, MIN(n, str_len));
746 dest[str_len] = '\0';
753 Routine to get hex characters and turn them into a 16 byte array.
754 the array can be variable length, and any non-hex-numeric
755 characters are skipped. "0xnn" or "0Xnn" is specially catered
758 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
762 size_t strhex_to_str(char *p, size_t len, const char *strhex)
765 size_t num_chars = 0;
766 unsigned char lonybble, hinybble;
767 const char *hexchars = "0123456789ABCDEF";
768 char *p1 = NULL, *p2 = NULL;
770 for (i = 0; i < len && strhex[i] != 0; i++) {
771 if (strnequal(hexchars, "0x", 2)) {
772 i++; /* skip two chars */
776 if (!(p1 = strchr_m(hexchars, toupper(strhex[i]))))
779 i++; /* next hex digit */
781 if (!(p2 = strchr_m(hexchars, toupper(strhex[i]))))
784 /* get the two nybbles */
785 hinybble = PTR_DIFF(p1, hexchars);
786 lonybble = PTR_DIFF(p2, hexchars);
788 p[num_chars] = (hinybble << 4) | lonybble;
797 DATA_BLOB strhex_to_data_blob(const char *strhex)
799 DATA_BLOB ret_blob = data_blob(NULL, strlen(strhex)/2+1);
801 ret_blob.length = strhex_to_str(ret_blob.data,
809 * Routine to print a buffer as HEX digits, into an allocated string.
812 void hex_encode(const unsigned char *buff_in, size_t len, char **out_hex_buffer)
817 *out_hex_buffer = smb_xmalloc((len*2)+1);
818 hex_buffer = *out_hex_buffer;
820 for (i = 0; i < len; i++)
821 slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);
825 Check if a string is part of a list.
828 BOOL in_list(char *s,char *list,BOOL casesensitive)
836 while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
838 if (strcmp(tok,s) == 0)
841 if (StrCaseCmp(tok,s) == 0)
848 /* this is used to prevent lots of mallocs of size 1 */
849 static char *null_string = NULL;
852 Set a string value, allocing the space for the string
855 static BOOL string_init(char **dest,const char *src)
865 if((null_string = (char *)malloc(1)) == NULL) {
866 DEBUG(0,("string_init: malloc fail for null_string.\n"));
873 (*dest) = strdup(src);
874 if ((*dest) == NULL) {
875 DEBUG(0,("Out of memory in string_init\n"));
886 void string_free(char **s)
890 if (*s == null_string)
896 Set a string value, deallocating any existing space, and allocing the space
900 BOOL string_set(char **dest,const char *src)
903 return(string_init(dest,src));
907 Substitute a string for a pattern in another string. Make sure there is
910 This routine looks for pattern in s and replaces it with
911 insert. It may do multiple replacements.
913 Any of " ; ' $ or ` in the insert string are replaced with _
914 if len==0 then the string cannot be extended. This is different from the old
915 use of len==0 which was for no length checks to be done.
918 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
923 if (!insert || !pattern || !*pattern || !s)
926 ls = (ssize_t)strlen(s);
927 lp = (ssize_t)strlen(pattern);
928 li = (ssize_t)strlen(insert);
931 len = ls + 1; /* len is number of *bytes* */
933 while (lp <= ls && (p = strstr_m(s,pattern))) {
934 if (ls + (li-lp) >= len) {
935 DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n",
936 (int)(ls + (li-lp) - len),
941 memmove(p+li,p+lp,strlen(p+lp)+1);
964 void fstring_sub(char *s,const char *pattern,const char *insert)
966 string_sub(s, pattern, insert, sizeof(fstring));
969 void pstring_sub(char *s,const char *pattern,const char *insert)
971 string_sub(s, pattern, insert, sizeof(pstring));
975 Similar to string_sub, but it will accept only allocated strings
976 and may realloc them so pay attention at what you pass on no
977 pointers inside strings, no pstrings or const may be passed
981 char *realloc_string_sub(char *string, const char *pattern, const char *insert)
985 ssize_t ls,lp,li,ld, i;
987 if (!insert || !pattern || !*pattern || !string || !*string)
994 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
997 ls = (ssize_t)strlen(s);
998 lp = (ssize_t)strlen(pattern);
999 li = (ssize_t)strlen(insert);
1001 for (i=0;i<li;i++) {
1018 while ((p = strstr_m(s,pattern))) {
1020 int offset = PTR_DIFF(s,string);
1021 char *t = Realloc(string, ls + ld + 1);
1023 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
1028 p = t + offset + (p - s);
1031 memmove(p+li,p+lp,strlen(p+lp)+1);
1042 Similar to string_sub() but allows for any character to be substituted.
1044 if len==0 then the string cannot be extended. This is different from the old
1045 use of len==0 which was for no length checks to be done.
1048 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
1053 if (!insert || !pattern || !s)
1056 ls = (ssize_t)strlen(s);
1057 lp = (ssize_t)strlen(pattern);
1058 li = (ssize_t)strlen(insert);
1064 len = ls + 1; /* len is number of *bytes* */
1066 while (lp <= ls && (p = strstr_m(s,pattern))) {
1067 if (ls + (li-lp) >= len) {
1068 DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n",
1069 (int)(ls + (li-lp) - len),
1070 pattern, (int)len));
1074 memmove(p+li,p+lp,strlen(p+lp)+1);
1076 memcpy(p, insert, li);
1083 Similar to all_string_sub but for unicode strings.
1084 Return a new allocated unicode string.
1085 similar to string_sub() but allows for any character to be substituted.
1089 static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
1090 const smb_ucs2_t *insert)
1093 const smb_ucs2_t *sp;
1094 size_t lr, lp, li, lt;
1096 if (!insert || !pattern || !*pattern || !s)
1099 lt = (size_t)strlen_w(s);
1100 lp = (size_t)strlen_w(pattern);
1101 li = (size_t)strlen_w(insert);
1104 const smb_ucs2_t *st = s;
1106 while ((sp = strstr_w(st, pattern))) {
1112 r = rp = (smb_ucs2_t *)malloc((lt + 1)*(sizeof(smb_ucs2_t)));
1114 DEBUG(0, ("all_string_sub_w: out of memory!\n"));
1118 while ((sp = strstr_w(s, pattern))) {
1119 memcpy(rp, s, (sp - s));
1120 rp += ((sp - s) / sizeof(smb_ucs2_t));
1121 memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
1125 lr = ((rp - r) / sizeof(smb_ucs2_t));
1127 memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
1135 smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
1140 if (!insert || !pattern || !s)
1142 push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
1143 push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
1144 return all_string_sub_w(s, p, i);
1149 Splits out the front and back at a separator.
1152 static void split_at_last_component(char *path, char *front, char sep, char *back)
1154 char *p = strrchr_m(path, sep);
1160 pstrcpy(front, path);
1174 Write an octal as a string.
1177 const char *octal_string(int i)
1179 static char ret[64];
1182 slprintf(ret, sizeof(ret)-1, "0%o", i);
1188 Truncate a string at a specified length.
1191 char *string_truncate(char *s, unsigned int length)
1193 if (s && strlen(s) > length)
1199 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1200 We convert via ucs2 for now.
1203 char *strchr_m(const char *src, char c)
1210 /* this is quite a common operation, so we want it to be
1211 fast. We optimise for the ascii case, knowing that all our
1212 supported multi-byte character sets are ascii-compatible
1213 (ie. they match for the first 128 chars) */
1215 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1223 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
1224 /* With compose characters we must restart from the beginning. JRA. */
1228 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1229 p = strchr_w(ws, UCS2_CHAR(c));
1233 pull_ucs2_pstring(s2, ws);
1234 return (char *)(s+strlen(s2));
1237 char *strrchr_m(const char *s, char c)
1239 /* this is quite a common operation, so we want it to be
1240 fast. We optimise for the ascii case, knowing that all our
1241 supported multi-byte character sets are ascii-compatible
1242 (ie. they match for the first 128 chars). Also, in Samba
1243 we only search for ascii characters in 'c' and that
1244 in all mb character sets with a compound character
1245 containing c, if 'c' is not a match at position
1246 p, then p[-1] > 0x7f. JRA. */
1249 size_t len = strlen(s);
1251 BOOL got_mb = False;
1258 /* Could be a match. Part of a multibyte ? */
1259 if ((cp > s) && (((unsigned char)cp[-1]) & 0x80)) {
1260 /* Yep - go slow :-( */
1264 /* No - we have a match ! */
1267 } while (cp-- != s);
1272 /* String contained a non-ascii char. Slow path. */
1278 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1279 p = strrchr_w(ws, UCS2_CHAR(c));
1283 pull_ucs2_pstring(s2, ws);
1284 return (char *)(s+strlen(s2));
1288 /***********************************************************************
1289 Return the equivalent of doing strrchr 'n' times - always going
1291 ***********************************************************************/
1293 char *strnrchr_m(const char *s, char c, unsigned int n)
1299 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1300 p = strnrchr_w(ws, UCS2_CHAR(c), n);
1304 pull_ucs2_pstring(s2, ws);
1305 return (char *)(s+strlen(s2));
1308 /***********************************************************************
1309 strstr_m - We convert via ucs2 for now.
1310 ***********************************************************************/
1312 char *strstr_m(const char *src, const char *findstr)
1315 smb_ucs2_t *src_w, *find_w;
1320 size_t findstr_len = 0;
1322 /* for correctness */
1327 /* Samba does single character findstr calls a *lot*. */
1328 if (findstr[1] == '\0')
1329 return strchr_m(src, *findstr);
1331 /* We optimise for the ascii case, knowing that all our
1332 supported multi-byte character sets are ascii-compatible
1333 (ie. they match for the first 128 chars) */
1335 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1336 if (*s == *findstr) {
1338 findstr_len = strlen(findstr);
1340 if (strncmp(s, findstr, findstr_len) == 0) {
1349 #if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
1350 /* 'make check' fails unless we do this */
1352 /* With compose characters we must restart from the beginning. JRA. */
1356 if (push_ucs2_allocate(&src_w, src) == (size_t)-1) {
1357 DEBUG(0,("strstr_m: src malloc fail\n"));
1361 if (push_ucs2_allocate(&find_w, findstr) == (size_t)-1) {
1363 DEBUG(0,("strstr_m: find malloc fail\n"));
1367 p = strstr_w(src_w, find_w);
1376 if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) {
1379 DEBUG(0,("strstr_m: dest malloc fail\n"));
1382 retp = (char *)(s+strlen(s2));
1390 Convert a string to lower case.
1393 void strlower_m(char *s)
1397 /* this is quite a common operation, so we want it to be
1398 fast. We optimise for the ascii case, knowing that all our
1399 supported multi-byte character sets are ascii-compatible
1400 (ie. they match for the first 128 chars) */
1402 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1403 *s = tolower((unsigned char)*s);
1410 /* I assume that lowercased string takes the same number of bytes
1411 * as source string even in UTF-8 encoding. (VIV) */
1412 len = strlen(s) + 1;
1414 unix_strlower(s,len,s,len);
1415 /* Catch mb conversion errors that may not terminate. */
1421 Convert a string to upper case.
1424 void strupper_m(char *s)
1428 /* this is quite a common operation, so we want it to be
1429 fast. We optimise for the ascii case, knowing that all our
1430 supported multi-byte character sets are ascii-compatible
1431 (ie. they match for the first 128 chars) */
1433 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1434 *s = toupper((unsigned char)*s);
1441 /* I assume that lowercased string takes the same number of bytes
1442 * as source string even in multibyte encoding. (VIV) */
1443 len = strlen(s) + 1;
1445 unix_strupper(s,len,s,len);
1446 /* Catch mb conversion errors that may not terminate. */
1452 Return a RFC2254 binary string representation of a buffer.
1453 Used in LDAP filters.
1457 char *binary_string(char *buf, int len)
1461 const char *hex = "0123456789ABCDEF";
1462 s = malloc(len * 3 + 1);
1465 for (j=i=0;i<len;i++) {
1467 s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1468 s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1476 Just a typesafety wrapper for snprintf into a pstring.
1479 int pstr_sprintf(pstring s, const char *fmt, ...)
1485 ret = vsnprintf(s, PSTRING_LEN, fmt, ap);
1492 Just a typesafety wrapper for snprintf into a fstring.
1495 int fstr_sprintf(fstring s, const char *fmt, ...)
1501 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1507 #ifndef HAVE_STRNDUP
1509 Some platforms don't have strndup.
1512 char *strndup(const char *s, size_t n)
1527 #ifndef HAVE_STRNLEN
1529 Some platforms don't have strnlen
1532 size_t strnlen(const char *s, size_t n)
1535 for (i=0; s[i] && i<n; i++)
1542 List of Strings manipulation functions
1545 #define S_LIST_ABS 16 /* List Allocation Block Size */
1547 char **str_list_make(const char *string, const char *sep)
1549 char **list, **rlist;
1555 if (!string || !*string)
1559 DEBUG(0,("str_list_make: Unable to allocate memory"));
1562 if (!sep) sep = LIST_SEP;
1568 while (next_token(&str, tok, sep, sizeof(tok))) {
1570 lsize += S_LIST_ABS;
1571 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1573 DEBUG(0,("str_list_make: Unable to allocate memory"));
1574 str_list_free(&list);
1579 memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
1582 list[num] = strdup(tok);
1584 DEBUG(0,("str_list_make: Unable to allocate memory"));
1585 str_list_free(&list);
1597 BOOL str_list_copy(char ***dest, const char **src)
1599 char **list, **rlist;
1611 lsize += S_LIST_ABS;
1612 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1614 DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
1615 str_list_free(&list);
1619 memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
1622 list[num] = strdup(src[num]);
1624 DEBUG(0,("str_list_copy: Unable to allocate memory"));
1625 str_list_free(&list);
1637 * Return true if all the elements of the list match exactly.
1639 BOOL str_list_compare(char **list1, char **list2)
1643 if (!list1 || !list2)
1644 return (list1 == list2);
1646 for (num = 0; list1[num]; num++) {
1649 if (!strcsequal(list1[num], list2[num]))
1653 return False; /* if list2 has more elements than list1 fail */
1658 void str_list_free(char ***list)
1662 if (!list || !*list)
1665 for(; *tlist; tlist++)
1670 /******************************************************************************
1671 version of standard_sub_basic() for string lists; uses alloc_sub_basic()
1673 *****************************************************************************/
1675 BOOL str_list_sub_basic( char **list, const char *smb_name )
1681 tmpstr = alloc_sub_basic(smb_name, s);
1683 DEBUG(0,("str_list_sub_basic: alloc_sub_basic() return NULL!\n"));
1695 /******************************************************************************
1696 substritute a specific pattern in a string list
1697 *****************************************************************************/
1699 BOOL str_list_substitute(char **list, const char *pattern, const char *insert)
1702 ssize_t ls, lp, li, ld, i, d;
1711 lp = (ssize_t)strlen(pattern);
1712 li = (ssize_t)strlen(insert);
1717 ls = (ssize_t)strlen(s);
1719 while ((p = strstr_m(s, pattern))) {
1723 t = (char *) malloc(ls +ld +1);
1725 DEBUG(0,("str_list_substitute: Unable to allocate memory"));
1728 memcpy(t, *list, d);
1729 memcpy(t +d +li, p +lp, ls -d -lp +1);
1736 for (i = 0; i < li; i++) {
1737 switch (insert[i]) {
1749 t[d +i] = insert[i];
1762 #define IPSTR_LIST_SEP ","
1763 #define IPSTR_LIST_CHAR ','
1766 * Add ip string representation to ipstr list. Used also
1767 * as part of @function ipstr_list_make
1769 * @param ipstr_list pointer to string containing ip list;
1770 * MUST BE already allocated and IS reallocated if necessary
1771 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1772 * as a result of reallocation)
1773 * @param ip IP address which is to be added to list
1774 * @return pointer to string appended with new ip and possibly
1775 * reallocated to new length
1778 char* ipstr_list_add(char** ipstr_list, const struct ip_service *service)
1780 char* new_ipstr = NULL;
1782 /* arguments checking */
1783 if (!ipstr_list || !service) return NULL;
1785 /* attempt to convert ip to a string and append colon separator to it */
1787 asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list, IPSTR_LIST_SEP,
1788 inet_ntoa(service->ip), service->port);
1789 SAFE_FREE(*ipstr_list);
1791 asprintf(&new_ipstr, "%s:%d", inet_ntoa(service->ip), service->port);
1793 *ipstr_list = new_ipstr;
1799 * Allocate and initialise an ipstr list using ip adresses
1800 * passed as arguments.
1802 * @param ipstr_list pointer to string meant to be allocated and set
1803 * @param ip_list array of ip addresses to place in the list
1804 * @param ip_count number of addresses stored in ip_list
1805 * @return pointer to allocated ip string
1808 char* ipstr_list_make(char** ipstr_list, const struct ip_service* ip_list, int ip_count)
1812 /* arguments checking */
1813 if (!ip_list && !ipstr_list) return 0;
1817 /* process ip addresses given as arguments */
1818 for (i = 0; i < ip_count; i++)
1819 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1821 return (*ipstr_list);
1826 * Parse given ip string list into array of ip addresses
1827 * (as ip_service structures)
1828 * e.g. 192.168.1.100:389,192.168.1.78, ...
1830 * @param ipstr ip string list to be parsed
1831 * @param ip_list pointer to array of ip addresses which is
1832 * allocated by this function and must be freed by caller
1833 * @return number of succesfully parsed addresses
1836 int ipstr_list_parse(const char* ipstr_list, struct ip_service **ip_list)
1842 if (!ipstr_list || !ip_list)
1845 count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
1846 if ( (*ip_list = (struct ip_service*)malloc(count * sizeof(struct ip_service))) == NULL ) {
1847 DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n", (unsigned long)count));
1852 next_token(&ipstr_list, token_str, IPSTR_LIST_SEP, FSTRING_LEN) && i<count;
1855 struct in_addr addr;
1857 char *p = strchr(token_str, ':');
1864 /* convert single token to ip address */
1865 if ( (addr.s_addr = inet_addr(token_str)) == INADDR_NONE )
1868 (*ip_list)[i].ip = addr;
1869 (*ip_list)[i].port = port;
1877 * Safely free ip string list
1879 * @param ipstr_list ip string list to be freed
1882 void ipstr_list_free(char* ipstr_list)
1884 SAFE_FREE(ipstr_list);
1889 Unescape a URL encoded string, in place.
1892 void rfc1738_unescape(char *buf)
1896 while (p && *p && (p=strchr_m(p,'%'))) {
1900 if (c1 >= '0' && c1 <= '9')
1902 else if (c1 >= 'A' && c1 <= 'F')
1904 else if (c1 >= 'a' && c1 <= 'f')
1906 else {p++; continue;}
1908 if (c2 >= '0' && c2 <= '9')
1910 else if (c2 >= 'A' && c2 <= 'F')
1912 else if (c2 >= 'a' && c2 <= 'f')
1914 else {p++; continue;}
1918 memmove(p+1, p+3, strlen(p+3)+1);
1923 static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1926 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
1928 DATA_BLOB base64_decode_data_blob(const char *s)
1930 int bit_offset, byte_offset, idx, i, n;
1931 DATA_BLOB decoded = data_blob(s, strlen(s)+1);
1932 unsigned char *d = decoded.data;
1937 while (*s && (p=strchr_m(b64,*s))) {
1938 idx = (int)(p - b64);
1939 byte_offset = (i*6)/8;
1940 bit_offset = (i*6)%8;
1941 d[byte_offset] &= ~((1<<(8-bit_offset))-1);
1942 if (bit_offset < 3) {
1943 d[byte_offset] |= (idx << (2-bit_offset));
1946 d[byte_offset] |= (idx >> (bit_offset-2));
1947 d[byte_offset+1] = 0;
1948 d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
1954 if (*s == '=') n -= 1;
1962 * Decode a base64 string in-place - wrapper for the above
1964 void base64_decode_inplace(char *s)
1966 DATA_BLOB decoded = base64_decode_data_blob(s);
1967 memcpy(s, decoded.data, decoded.length);
1968 /* null terminate */
1969 s[decoded.length] = '\0';
1971 data_blob_free(&decoded);
1975 * Encode a base64 string into a malloc()ed string caller to free.
1977 *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
1979 char * base64_encode_data_blob(DATA_BLOB data)
1984 size_t len = data.length;
1985 size_t output_len = data.length * 2;
1986 char *result = malloc(output_len); /* get us plenty of space */
1988 while (len-- && out_cnt < (data.length * 2) - 5) {
1989 int c = (unsigned char) *(data.data++);
1992 if (char_count == 3) {
1993 result[out_cnt++] = b64[bits >> 18];
1994 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1995 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1996 result[out_cnt++] = b64[bits & 0x3f];
2003 if (char_count != 0) {
2004 bits <<= 16 - (8 * char_count);
2005 result[out_cnt++] = b64[bits >> 18];
2006 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2007 if (char_count == 1) {
2008 result[out_cnt++] = '=';
2009 result[out_cnt++] = '=';
2011 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2012 result[out_cnt++] = '=';
2015 result[out_cnt] = '\0'; /* terminate */
2019 /* read a SMB_BIG_UINT from a string */
2020 SMB_BIG_UINT STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
2023 SMB_BIG_UINT val = -1;
2024 const char *p = nptr;
2026 while (p && *p && isspace(*p))
2028 #ifdef LARGE_SMB_OFF_T
2029 sscanf(p,"%llu",&val);
2030 #else /* LARGE_SMB_OFF_T */
2031 sscanf(p,"%lu",&val);
2032 #endif /* LARGE_SMB_OFF_T */
2034 while (p && *p && isdigit(*p))