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, int case_default)
339 if (case_default == CASE_UPPER)
346 Check if a string is in "normal" case.
349 BOOL strisnormal(const char *s, int case_default)
351 if (case_default == CASE_UPPER)
352 return(!strhaslower(s));
354 return(!strhasupper(s));
360 NOTE: oldc and newc must be 7 bit characters
363 void string_replace(pstring s,char oldc,char newc)
367 /* this is quite a common operation, so we want it to be
368 fast. We optimise for the ascii case, knowing that all our
369 supported multi-byte character sets are ascii-compatible
370 (ie. they match for the first 128 chars) */
372 for (p = (unsigned char *)s; *p; p++) {
373 if (*p & 0x80) /* mb string - slow path. */
382 /* Slow (mb) path. */
383 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
384 /* With compose characters we must restart from the beginning. JRA. */
387 push_ucs2(NULL, tmpbuf, p, sizeof(tmpbuf), STR_TERMINATE);
388 string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
389 pull_ucs2(NULL, p, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
393 Skip past some strings in a buffer.
396 char *skip_string(char *buf,size_t n)
399 buf += strlen(buf) + 1;
404 Count the number of characters in a string. Normally this will
405 be the same as the number of bytes in a string for single byte strings,
406 but will be different for multibyte.
409 size_t str_charnum(const char *s)
411 uint16 tmpbuf2[sizeof(pstring)];
412 push_ucs2(NULL, tmpbuf2,s, sizeof(tmpbuf2), STR_TERMINATE);
413 return strlen_w(tmpbuf2);
417 Count the number of characters in a string. Normally this will
418 be the same as the number of bytes in a string for single byte strings,
419 but will be different for multibyte.
422 size_t str_ascii_charnum(const char *s)
425 push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
426 return strlen(tmpbuf2);
429 BOOL trim_char(char *s,char cfront,char cback)
435 /* Ignore null or empty strings. */
436 if (!s || (s[0] == '\0'))
440 while (*fp && *fp == cfront)
443 /* We ate the string. */
451 ep = fp + strlen(fp) - 1;
453 /* Attempt ascii only. Bail for mb strings. */
454 while ((ep >= fp) && (*ep == cback)) {
456 if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
457 /* Could be mb... bail back to tim_string. */
465 return trim_string(s, cfront ? fs : NULL, bs);
471 /* We ate the string. */
478 memmove(s, fp, ep-fp+2);
483 Trim the specified elements off the front and back of a string.
486 BOOL trim_string(char *s,const char *front,const char *back)
493 /* Ignore null or empty strings. */
494 if (!s || (s[0] == '\0'))
497 front_len = front? strlen(front) : 0;
498 back_len = back? strlen(back) : 0;
503 while (len && strncmp(s, front, front_len)==0) {
504 /* Must use memmove here as src & dest can
505 * easily overlap. Found by valgrind. JRA. */
506 memmove(s, s+front_len, (len-front_len)+1);
513 while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
514 s[len-back_len]='\0';
523 Does a string have any uppercase chars in it?
526 BOOL strhasupper(const char *s)
529 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
530 for(ptr=tmpbuf;*ptr;ptr++)
537 Does a string have any lowercase chars in it?
540 BOOL strhaslower(const char *s)
543 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
544 for(ptr=tmpbuf;*ptr;ptr++)
551 Find the number of 'c' chars in a string
554 size_t count_chars(const char *s,char c)
558 smb_ucs2_t *alloc_tmpbuf = NULL;
560 if (push_ucs2_allocate(&alloc_tmpbuf, s) == (size_t)-1) {
564 for(count=0,ptr=alloc_tmpbuf;*ptr;ptr++)
565 if(*ptr==UCS2_CHAR(c))
568 SAFE_FREE(alloc_tmpbuf);
573 Safe string copy into a known length string. maxlength does not
574 include the terminating zero.
577 char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength)
582 DEBUG(0,("ERROR: NULL dest in safe_strcpy, called from [%s][%d]\n", fn, line));
587 clobber_region(fn,line,dest, maxlength+1);
595 len = strnlen(src, maxlength+1);
597 if (len > maxlength) {
598 DEBUG(0,("ERROR: string overflow by %lu (%lu - %lu) in safe_strcpy [%.50s]\n",
599 (unsigned long)(len-maxlength), (unsigned long)len,
600 (unsigned long)maxlength, src));
604 memmove(dest, src, len);
610 Safe string cat into a string. maxlength does not
611 include the terminating zero.
613 char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength)
615 size_t src_len, dest_len;
618 DEBUG(0,("ERROR: NULL dest in safe_strcat, called from [%s][%d]\n", fn, line));
625 src_len = strnlen(src, maxlength + 1);
626 dest_len = strnlen(dest, maxlength + 1);
629 clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
632 if (src_len + dest_len > maxlength) {
633 DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
634 (int)(src_len + dest_len - maxlength), src));
635 if (maxlength > dest_len) {
636 memcpy(&dest[dest_len], src, maxlength - dest_len);
642 memcpy(&dest[dest_len], src, src_len);
643 dest[dest_len + src_len] = 0;
648 Paranoid strcpy into a buffer of given length (includes terminating
649 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
650 and replaces with '_'. Deliberately does *NOT* check for multibyte
651 characters. Don't change it !
653 char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
658 clobber_region(fn, line, dest, maxlength);
662 DEBUG(0,("ERROR: NULL dest in alpha_strcpy, called from [%s][%d]\n", fn, line));
672 if (len >= maxlength)
675 if (!other_safe_chars)
676 other_safe_chars = "";
678 for(i = 0; i < len; i++) {
679 int val = (src[i] & 0xff);
680 if (isupper(val) || islower(val) || isdigit(val) || strchr_m(other_safe_chars, val))
692 Like strncpy but always null terminates. Make sure there is room!
693 The variable n should always be one less than the available size.
695 char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
700 clobber_region(fn, line, dest, n+1);
704 DEBUG(0,("ERROR: NULL dest in StrnCpy, called from [%s][%d]\n", fn, line));
713 while (n-- && (*d = *src)) {
724 Like strncpy but copies up to the character marker. always null terminates.
725 returns a pointer to the character marker in the source string (src).
728 static char *strncpyn(char *dest, const char *src, size_t n, char c)
734 clobber_region(dest, n+1);
736 p = strchr_m(src, c);
738 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
742 str_len = PTR_DIFF(p, src);
743 strncpy(dest, src, MIN(n, str_len));
744 dest[str_len] = '\0';
751 Routine to get hex characters and turn them into a 16 byte array.
752 the array can be variable length, and any non-hex-numeric
753 characters are skipped. "0xnn" or "0Xnn" is specially catered
756 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
760 size_t strhex_to_str(char *p, size_t len, const char *strhex)
763 size_t num_chars = 0;
764 unsigned char lonybble, hinybble;
765 const char *hexchars = "0123456789ABCDEF";
766 char *p1 = NULL, *p2 = NULL;
768 for (i = 0; i < len && strhex[i] != 0; i++) {
769 if (strnequal(hexchars, "0x", 2)) {
770 i++; /* skip two chars */
774 if (!(p1 = strchr_m(hexchars, toupper(strhex[i]))))
777 i++; /* next hex digit */
779 if (!(p2 = strchr_m(hexchars, toupper(strhex[i]))))
782 /* get the two nybbles */
783 hinybble = PTR_DIFF(p1, hexchars);
784 lonybble = PTR_DIFF(p2, hexchars);
786 p[num_chars] = (hinybble << 4) | lonybble;
795 DATA_BLOB strhex_to_data_blob(const char *strhex)
797 DATA_BLOB ret_blob = data_blob(NULL, strlen(strhex)/2+1);
799 ret_blob.length = strhex_to_str(ret_blob.data,
807 * Routine to print a buffer as HEX digits, into an allocated string.
810 void hex_encode(const unsigned char *buff_in, size_t len, char **out_hex_buffer)
815 *out_hex_buffer = smb_xmalloc((len*2)+1);
816 hex_buffer = *out_hex_buffer;
818 for (i = 0; i < len; i++)
819 slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);
823 Check if a string is part of a list.
826 BOOL in_list(char *s,char *list,BOOL casesensitive)
834 while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
836 if (strcmp(tok,s) == 0)
839 if (StrCaseCmp(tok,s) == 0)
846 /* this is used to prevent lots of mallocs of size 1 */
847 static char *null_string = NULL;
850 Set a string value, allocing the space for the string
853 static BOOL string_init(char **dest,const char *src)
863 if((null_string = (char *)malloc(1)) == NULL) {
864 DEBUG(0,("string_init: malloc fail for null_string.\n"));
871 (*dest) = strdup(src);
872 if ((*dest) == NULL) {
873 DEBUG(0,("Out of memory in string_init\n"));
884 void string_free(char **s)
888 if (*s == null_string)
894 Set a string value, deallocating any existing space, and allocing the space
898 BOOL string_set(char **dest,const char *src)
901 return(string_init(dest,src));
905 Substitute a string for a pattern in another string. Make sure there is
908 This routine looks for pattern in s and replaces it with
909 insert. It may do multiple replacements.
911 Any of " ; ' $ or ` in the insert string are replaced with _
912 if len==0 then the string cannot be extended. This is different from the old
913 use of len==0 which was for no length checks to be done.
916 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
921 if (!insert || !pattern || !*pattern || !s)
924 ls = (ssize_t)strlen(s);
925 lp = (ssize_t)strlen(pattern);
926 li = (ssize_t)strlen(insert);
929 len = ls + 1; /* len is number of *bytes* */
931 while (lp <= ls && (p = strstr_m(s,pattern))) {
932 if (ls + (li-lp) >= len) {
933 DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n",
934 (int)(ls + (li-lp) - len),
939 memmove(p+li,p+lp,strlen(p+lp)+1);
962 void fstring_sub(char *s,const char *pattern,const char *insert)
964 string_sub(s, pattern, insert, sizeof(fstring));
967 void pstring_sub(char *s,const char *pattern,const char *insert)
969 string_sub(s, pattern, insert, sizeof(pstring));
973 Similar to string_sub, but it will accept only allocated strings
974 and may realloc them so pay attention at what you pass on no
975 pointers inside strings, no pstrings or const may be passed
979 char *realloc_string_sub(char *string, const char *pattern, const char *insert)
983 ssize_t ls,lp,li,ld, i;
985 if (!insert || !pattern || !*pattern || !string || !*string)
992 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
995 ls = (ssize_t)strlen(s);
996 lp = (ssize_t)strlen(pattern);
997 li = (ssize_t)strlen(insert);
1016 while ((p = strstr_m(s,pattern))) {
1018 int offset = PTR_DIFF(s,string);
1019 char *t = Realloc(string, ls + ld + 1);
1021 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
1026 p = t + offset + (p - s);
1029 memmove(p+li,p+lp,strlen(p+lp)+1);
1040 Similar to string_sub() but allows for any character to be substituted.
1042 if len==0 then the string cannot be extended. This is different from the old
1043 use of len==0 which was for no length checks to be done.
1046 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
1051 if (!insert || !pattern || !s)
1054 ls = (ssize_t)strlen(s);
1055 lp = (ssize_t)strlen(pattern);
1056 li = (ssize_t)strlen(insert);
1062 len = ls + 1; /* len is number of *bytes* */
1064 while (lp <= ls && (p = strstr_m(s,pattern))) {
1065 if (ls + (li-lp) >= len) {
1066 DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n",
1067 (int)(ls + (li-lp) - len),
1068 pattern, (int)len));
1072 memmove(p+li,p+lp,strlen(p+lp)+1);
1074 memcpy(p, insert, li);
1081 Similar to all_string_sub but for unicode strings.
1082 Return a new allocated unicode string.
1083 similar to string_sub() but allows for any character to be substituted.
1087 static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
1088 const smb_ucs2_t *insert)
1091 const smb_ucs2_t *sp;
1092 size_t lr, lp, li, lt;
1094 if (!insert || !pattern || !*pattern || !s)
1097 lt = (size_t)strlen_w(s);
1098 lp = (size_t)strlen_w(pattern);
1099 li = (size_t)strlen_w(insert);
1102 const smb_ucs2_t *st = s;
1104 while ((sp = strstr_w(st, pattern))) {
1110 r = rp = (smb_ucs2_t *)malloc((lt + 1)*(sizeof(smb_ucs2_t)));
1112 DEBUG(0, ("all_string_sub_w: out of memory!\n"));
1116 while ((sp = strstr_w(s, pattern))) {
1117 memcpy(rp, s, (sp - s));
1118 rp += ((sp - s) / sizeof(smb_ucs2_t));
1119 memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
1123 lr = ((rp - r) / sizeof(smb_ucs2_t));
1125 memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
1133 smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
1138 if (!insert || !pattern || !s)
1140 push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
1141 push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
1142 return all_string_sub_w(s, p, i);
1147 Splits out the front and back at a separator.
1150 static void split_at_last_component(char *path, char *front, char sep, char *back)
1152 char *p = strrchr_m(path, sep);
1158 pstrcpy(front, path);
1172 Write an octal as a string.
1175 const char *octal_string(int i)
1177 static char ret[64];
1180 slprintf(ret, sizeof(ret)-1, "0%o", i);
1186 Truncate a string at a specified length.
1189 char *string_truncate(char *s, unsigned int length)
1191 if (s && strlen(s) > length)
1197 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1198 We convert via ucs2 for now.
1201 char *strchr_m(const char *src, char c)
1208 /* this is quite a common operation, so we want it to be
1209 fast. We optimise for the ascii case, knowing that all our
1210 supported multi-byte character sets are ascii-compatible
1211 (ie. they match for the first 128 chars) */
1213 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1221 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
1222 /* With compose characters we must restart from the beginning. JRA. */
1226 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1227 p = strchr_w(ws, UCS2_CHAR(c));
1231 pull_ucs2_pstring(s2, ws);
1232 return (char *)(s+strlen(s2));
1235 char *strrchr_m(const char *s, char c)
1237 /* this is quite a common operation, so we want it to be
1238 fast. We optimise for the ascii case, knowing that all our
1239 supported multi-byte character sets are ascii-compatible
1240 (ie. they match for the first 128 chars). Also, in Samba
1241 we only search for ascii characters in 'c' and that
1242 in all mb character sets with a compound character
1243 containing c, if 'c' is not a match at position
1244 p, then p[-1] > 0x7f. JRA. */
1247 size_t len = strlen(s);
1249 BOOL got_mb = False;
1256 /* Could be a match. Part of a multibyte ? */
1257 if ((cp > s) && (((unsigned char)cp[-1]) & 0x80)) {
1258 /* Yep - go slow :-( */
1262 /* No - we have a match ! */
1265 } while (cp-- != s);
1270 /* String contained a non-ascii char. Slow path. */
1276 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1277 p = strrchr_w(ws, UCS2_CHAR(c));
1281 pull_ucs2_pstring(s2, ws);
1282 return (char *)(s+strlen(s2));
1286 /***********************************************************************
1287 Return the equivalent of doing strrchr 'n' times - always going
1289 ***********************************************************************/
1291 char *strnrchr_m(const char *s, char c, unsigned int n)
1297 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1298 p = strnrchr_w(ws, UCS2_CHAR(c), n);
1302 pull_ucs2_pstring(s2, ws);
1303 return (char *)(s+strlen(s2));
1306 /***********************************************************************
1307 strstr_m - We convert via ucs2 for now.
1308 ***********************************************************************/
1310 char *strstr_m(const char *src, const char *findstr)
1313 smb_ucs2_t *src_w, *find_w;
1318 size_t findstr_len = 0;
1320 /* for correctness */
1325 /* Samba does single character findstr calls a *lot*. */
1326 if (findstr[1] == '\0')
1327 return strchr_m(src, *findstr);
1329 /* We optimise for the ascii case, knowing that all our
1330 supported multi-byte character sets are ascii-compatible
1331 (ie. they match for the first 128 chars) */
1333 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1334 if (*s == *findstr) {
1336 findstr_len = strlen(findstr);
1338 if (strncmp(s, findstr, findstr_len) == 0) {
1347 #if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
1348 /* 'make check' fails unless we do this */
1350 /* With compose characters we must restart from the beginning. JRA. */
1354 if (push_ucs2_allocate(&src_w, src) == (size_t)-1) {
1355 DEBUG(0,("strstr_m: src malloc fail\n"));
1359 if (push_ucs2_allocate(&find_w, findstr) == (size_t)-1) {
1361 DEBUG(0,("strstr_m: find malloc fail\n"));
1365 p = strstr_w(src_w, find_w);
1374 if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) {
1377 DEBUG(0,("strstr_m: dest malloc fail\n"));
1380 retp = (char *)(s+strlen(s2));
1388 Convert a string to lower case.
1391 void strlower_m(char *s)
1396 /* this is quite a common operation, so we want it to be
1397 fast. We optimise for the ascii case, knowing that all our
1398 supported multi-byte character sets are ascii-compatible
1399 (ie. they match for the first 128 chars) */
1401 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1402 *s = tolower((unsigned char)*s);
1409 /* I assume that lowercased string takes the same number of bytes
1410 * as source string even in UTF-8 encoding. (VIV) */
1411 len = strlen(s) + 1;
1414 unix_strlower(s,len,s,len);
1415 /* Catch mb conversion errors that may not terminate. */
1422 Convert a string to upper case.
1425 void strupper_m(char *s)
1430 /* this is quite a common operation, so we want it to be
1431 fast. We optimise for the ascii case, knowing that all our
1432 supported multi-byte character sets are ascii-compatible
1433 (ie. they match for the first 128 chars) */
1435 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1436 *s = toupper((unsigned char)*s);
1443 /* I assume that lowercased string takes the same number of bytes
1444 * as source string even in multibyte encoding. (VIV) */
1445 len = strlen(s) + 1;
1448 unix_strupper(s,len,s,len);
1449 /* Catch mb conversion errors that may not terminate. */
1456 Return a RFC2254 binary string representation of a buffer.
1457 Used in LDAP filters.
1461 char *binary_string(char *buf, int len)
1465 const char *hex = "0123456789ABCDEF";
1466 s = malloc(len * 3 + 1);
1469 for (j=i=0;i<len;i++) {
1471 s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1472 s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1480 Just a typesafety wrapper for snprintf into a pstring.
1483 int pstr_sprintf(pstring s, const char *fmt, ...)
1489 ret = vsnprintf(s, PSTRING_LEN, fmt, ap);
1496 Just a typesafety wrapper for snprintf into a fstring.
1499 int fstr_sprintf(fstring s, const char *fmt, ...)
1505 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1511 #if !defined(HAVE_STRNDUP) || defined(BROKEN_STRNDUP)
1513 Some platforms don't have strndup.
1516 char *strndup(const char *s, size_t n)
1531 #if !defined(HAVE_STRNLEN) || defined(BROKEN_STRNLEN)
1533 Some platforms don't have strnlen
1536 size_t strnlen(const char *s, size_t n)
1539 for (i=0; s[i] && i<n; i++)
1546 List of Strings manipulation functions
1549 #define S_LIST_ABS 16 /* List Allocation Block Size */
1551 char **str_list_make(const char *string, const char *sep)
1553 char **list, **rlist;
1559 if (!string || !*string)
1563 DEBUG(0,("str_list_make: Unable to allocate memory"));
1566 if (!sep) sep = LIST_SEP;
1572 while (next_token(&str, tok, sep, sizeof(tok))) {
1574 lsize += S_LIST_ABS;
1575 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1577 DEBUG(0,("str_list_make: Unable to allocate memory"));
1578 str_list_free(&list);
1583 memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
1586 list[num] = strdup(tok);
1588 DEBUG(0,("str_list_make: Unable to allocate memory"));
1589 str_list_free(&list);
1601 BOOL str_list_copy(char ***dest, const char **src)
1603 char **list, **rlist;
1615 lsize += S_LIST_ABS;
1616 rlist = (char **)Realloc(list, ((sizeof(char **)) * (lsize +1)));
1618 DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
1619 str_list_free(&list);
1623 memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
1626 list[num] = strdup(src[num]);
1628 DEBUG(0,("str_list_copy: Unable to allocate memory"));
1629 str_list_free(&list);
1641 * Return true if all the elements of the list match exactly.
1643 BOOL str_list_compare(char **list1, char **list2)
1647 if (!list1 || !list2)
1648 return (list1 == list2);
1650 for (num = 0; list1[num]; num++) {
1653 if (!strcsequal(list1[num], list2[num]))
1657 return False; /* if list2 has more elements than list1 fail */
1662 void str_list_free(char ***list)
1666 if (!list || !*list)
1669 for(; *tlist; tlist++)
1674 /******************************************************************************
1675 version of standard_sub_basic() for string lists; uses alloc_sub_basic()
1677 *****************************************************************************/
1679 BOOL str_list_sub_basic( char **list, const char *smb_name )
1685 tmpstr = alloc_sub_basic(smb_name, s);
1687 DEBUG(0,("str_list_sub_basic: alloc_sub_basic() return NULL!\n"));
1700 /******************************************************************************
1701 substritute a specific pattern in a string list
1702 *****************************************************************************/
1704 BOOL str_list_substitute(char **list, const char *pattern, const char *insert)
1707 ssize_t ls, lp, li, ld, i, d;
1716 lp = (ssize_t)strlen(pattern);
1717 li = (ssize_t)strlen(insert);
1722 ls = (ssize_t)strlen(s);
1724 while ((p = strstr_m(s, pattern))) {
1728 t = (char *) malloc(ls +ld +1);
1730 DEBUG(0,("str_list_substitute: Unable to allocate memory"));
1733 memcpy(t, *list, d);
1734 memcpy(t +d +li, p +lp, ls -d -lp +1);
1741 for (i = 0; i < li; i++) {
1742 switch (insert[i]) {
1754 t[d +i] = insert[i];
1767 #define IPSTR_LIST_SEP ","
1768 #define IPSTR_LIST_CHAR ','
1771 * Add ip string representation to ipstr list. Used also
1772 * as part of @function ipstr_list_make
1774 * @param ipstr_list pointer to string containing ip list;
1775 * MUST BE already allocated and IS reallocated if necessary
1776 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1777 * as a result of reallocation)
1778 * @param ip IP address which is to be added to list
1779 * @return pointer to string appended with new ip and possibly
1780 * reallocated to new length
1783 char* ipstr_list_add(char** ipstr_list, const struct ip_service *service)
1785 char* new_ipstr = NULL;
1787 /* arguments checking */
1788 if (!ipstr_list || !service) return NULL;
1790 /* attempt to convert ip to a string and append colon separator to it */
1792 asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list, IPSTR_LIST_SEP,
1793 inet_ntoa(service->ip), service->port);
1794 SAFE_FREE(*ipstr_list);
1796 asprintf(&new_ipstr, "%s:%d", inet_ntoa(service->ip), service->port);
1798 *ipstr_list = new_ipstr;
1804 * Allocate and initialise an ipstr list using ip adresses
1805 * passed as arguments.
1807 * @param ipstr_list pointer to string meant to be allocated and set
1808 * @param ip_list array of ip addresses to place in the list
1809 * @param ip_count number of addresses stored in ip_list
1810 * @return pointer to allocated ip string
1813 char* ipstr_list_make(char** ipstr_list, const struct ip_service* ip_list, int ip_count)
1817 /* arguments checking */
1818 if (!ip_list && !ipstr_list) return 0;
1822 /* process ip addresses given as arguments */
1823 for (i = 0; i < ip_count; i++)
1824 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1826 return (*ipstr_list);
1831 * Parse given ip string list into array of ip addresses
1832 * (as ip_service structures)
1833 * e.g. 192.168.1.100:389,192.168.1.78, ...
1835 * @param ipstr ip string list to be parsed
1836 * @param ip_list pointer to array of ip addresses which is
1837 * allocated by this function and must be freed by caller
1838 * @return number of succesfully parsed addresses
1841 int ipstr_list_parse(const char* ipstr_list, struct ip_service **ip_list)
1847 if (!ipstr_list || !ip_list)
1850 count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
1851 if ( (*ip_list = (struct ip_service*)malloc(count * sizeof(struct ip_service))) == NULL ) {
1852 DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n", (unsigned long)count));
1857 next_token(&ipstr_list, token_str, IPSTR_LIST_SEP, FSTRING_LEN) && i<count;
1860 struct in_addr addr;
1862 char *p = strchr(token_str, ':');
1869 /* convert single token to ip address */
1870 if ( (addr.s_addr = inet_addr(token_str)) == INADDR_NONE )
1873 (*ip_list)[i].ip = addr;
1874 (*ip_list)[i].port = port;
1882 * Safely free ip string list
1884 * @param ipstr_list ip string list to be freed
1887 void ipstr_list_free(char* ipstr_list)
1889 SAFE_FREE(ipstr_list);
1894 Unescape a URL encoded string, in place.
1897 void rfc1738_unescape(char *buf)
1901 while (p && *p && (p=strchr_m(p,'%'))) {
1905 if (c1 >= '0' && c1 <= '9')
1907 else if (c1 >= 'A' && c1 <= 'F')
1909 else if (c1 >= 'a' && c1 <= 'f')
1911 else {p++; continue;}
1913 if (c2 >= '0' && c2 <= '9')
1915 else if (c2 >= 'A' && c2 <= 'F')
1917 else if (c2 >= 'a' && c2 <= 'f')
1919 else {p++; continue;}
1923 memmove(p+1, p+3, strlen(p+3)+1);
1928 static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1931 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
1933 DATA_BLOB base64_decode_data_blob(const char *s)
1935 int bit_offset, byte_offset, idx, i, n;
1936 DATA_BLOB decoded = data_blob(s, strlen(s)+1);
1937 unsigned char *d = decoded.data;
1942 while (*s && (p=strchr_m(b64,*s))) {
1943 idx = (int)(p - b64);
1944 byte_offset = (i*6)/8;
1945 bit_offset = (i*6)%8;
1946 d[byte_offset] &= ~((1<<(8-bit_offset))-1);
1947 if (bit_offset < 3) {
1948 d[byte_offset] |= (idx << (2-bit_offset));
1951 d[byte_offset] |= (idx >> (bit_offset-2));
1952 d[byte_offset+1] = 0;
1953 d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
1959 if ((n > 0) && (*s == '=')) {
1969 * Decode a base64 string in-place - wrapper for the above
1971 void base64_decode_inplace(char *s)
1973 DATA_BLOB decoded = base64_decode_data_blob(s);
1975 if ( decoded.length != 0 ) {
1976 memcpy(s, decoded.data, decoded.length);
1978 /* null terminate */
1979 s[decoded.length] = '\0';
1984 data_blob_free(&decoded);
1988 * Encode a base64 string into a malloc()ed string caller to free.
1990 *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
1992 char * base64_encode_data_blob(DATA_BLOB data)
1997 size_t len = data.length;
1998 size_t output_len = data.length * 2;
1999 char *result = malloc(output_len); /* get us plenty of space */
2001 while (len-- && out_cnt < (data.length * 2) - 5) {
2002 int c = (unsigned char) *(data.data++);
2005 if (char_count == 3) {
2006 result[out_cnt++] = b64[bits >> 18];
2007 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2008 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2009 result[out_cnt++] = b64[bits & 0x3f];
2016 if (char_count != 0) {
2017 bits <<= 16 - (8 * char_count);
2018 result[out_cnt++] = b64[bits >> 18];
2019 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2020 if (char_count == 1) {
2021 result[out_cnt++] = '=';
2022 result[out_cnt++] = '=';
2024 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2025 result[out_cnt++] = '=';
2028 result[out_cnt] = '\0'; /* terminate */
2032 /* read a SMB_BIG_UINT from a string */
2033 SMB_BIG_UINT STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
2036 SMB_BIG_UINT val = -1;
2037 const char *p = nptr;
2039 while (p && *p && isspace(*p))
2041 #ifdef LARGE_SMB_OFF_T
2042 sscanf(p,"%llu",&val);
2043 #else /* LARGE_SMB_OFF_T */
2044 sscanf(p,"%lu",&val);
2045 #endif /* LARGE_SMB_OFF_T */
2047 while (p && *p && isdigit(*p))
2055 void string_append(char **left, const char *right)
2057 int new_len = strlen(right) + 1;
2059 if (*left == NULL) {
2060 *left = malloc(new_len);
2063 new_len += strlen(*left);
2064 *left = Realloc(*left, new_len);
2070 safe_strcat(*left, right, new_len-1);