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
8 Copyright (C) James Peach 2006
9 Copyright (C) Jeremy Allison 1992-2007
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 const char toupper_ascii_fast_table[128] = {
28 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
29 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
30 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
31 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
32 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
33 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
34 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
35 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
39 * Case insensitive string compararison.
41 * iconv does not directly give us a way to compare strings in
42 * arbitrary unix character sets -- all we can is convert and then
43 * compare. This is expensive.
45 * As an optimization, we do a first pass that considers only the
46 * prefix of the strings that is entirely 7-bit. Within this, we
47 * check whether they have the same value.
49 * Hopefully this will often give the answer without needing to copy.
50 * In particular it should speed comparisons to literal ascii strings
51 * or comparisons of strings that are "obviously" different.
53 * If we find a non-ascii character we fall back to converting via
56 * This should never be slower than convering the whole thing, and
59 * A different optimization would be to compare for bitwise equality
60 * in the binary encoding. (It would be possible thought hairy to do
61 * both simultaneously.) But in that case if they turn out to be
62 * different, we'd need to restart the whole thing.
64 * Even better is to implement strcasecmp for each encoding and use a
67 int StrCaseCmp(const char *s, const char *t)
72 smb_ucs2_t *buffer_s, *buffer_t;
75 for (ps = s, pt = t; ; ps++, pt++) {
79 return 0; /* both ended */
81 return -1; /* s is a prefix */
83 return +1; /* t is a prefix */
84 else if ((*ps & 0x80) || (*pt & 0x80))
85 /* not ascii anymore, do it the hard way
89 us = toupper_ascii_fast(*ps);
90 ut = toupper_ascii_fast(*pt);
99 if (!push_ucs2_talloc(talloc_tos(), &buffer_s, ps, &size)) {
100 return strcmp(ps, pt);
101 /* Not quite the right answer, but finding the right one
102 under this failure case is expensive, and it's pretty
106 if (!push_ucs2_talloc(talloc_tos(), &buffer_t, pt, &size)) {
107 TALLOC_FREE(buffer_s);
108 return strcmp(ps, pt);
109 /* Not quite the right answer, but finding the right one
110 under this failure case is expensive, and it's pretty
114 ret = strcasecmp_w(buffer_s, buffer_t);
115 TALLOC_FREE(buffer_s);
116 TALLOC_FREE(buffer_t);
122 Case insensitive string compararison, length limited.
124 int StrnCaseCmp(const char *s, const char *t, size_t len)
129 smb_ucs2_t *buffer_s, *buffer_t;
132 for (ps = s, pt = t; n < len ; ps++, pt++, n++) {
136 return 0; /* both ended */
138 return -1; /* s is a prefix */
140 return +1; /* t is a prefix */
141 else if ((*ps & 0x80) || (*pt & 0x80))
142 /* not ascii anymore, do it the
143 * hard way from here on in */
146 us = toupper_ascii_fast(*ps);
147 ut = toupper_ascii_fast(*pt);
160 if (!push_ucs2_talloc(talloc_tos(), &buffer_s, ps, &size)) {
161 return strncmp(ps, pt, len-n);
162 /* Not quite the right answer, but finding the right one
163 under this failure case is expensive,
164 and it's pretty close */
167 if (!push_ucs2_talloc(talloc_tos(), &buffer_t, pt, &size)) {
168 TALLOC_FREE(buffer_s);
169 return strncmp(ps, pt, len-n);
170 /* Not quite the right answer, but finding the right one
171 under this failure case is expensive,
172 and it's pretty close */
175 ret = strncasecmp_w(buffer_s, buffer_t, len-n);
176 TALLOC_FREE(buffer_s);
177 TALLOC_FREE(buffer_t);
184 * @note The comparison is case-insensitive.
186 bool strequal(const char *s1, const char *s2)
193 return(StrCaseCmp(s1,s2)==0);
197 * Compare 2 strings up to and including the nth char.
199 * @note The comparison is case-insensitive.
201 bool strnequal(const char *s1,const char *s2,size_t n)
205 if (!s1 || !s2 || !n)
208 return(StrnCaseCmp(s1,s2,n)==0);
212 Convert a string to "normal" form.
215 void strnorm(char *s, int case_default)
217 if (case_default == CASE_UPPER)
224 * Skip past some strings in a buffer - old version - no checks.
227 char *push_skip_string(char *buf)
229 buf += strlen(buf) + 1;
234 Skip past a string in a buffer. Buffer may not be
235 null terminated. end_ptr points to the first byte after
236 then end of the buffer.
239 char *skip_string(const char *base, size_t len, char *buf)
241 const char *end_ptr = base + len;
243 if (end_ptr < base || !base || !buf || buf >= end_ptr) {
247 /* Skip the string */
250 if (buf >= end_ptr) {
260 Count the number of characters in a string. Normally this will
261 be the same as the number of bytes in a string for single byte strings,
262 but will be different for multibyte.
265 size_t str_charnum(const char *s)
267 size_t ret, converted_size;
268 smb_ucs2_t *tmpbuf2 = NULL;
269 if (!push_ucs2_talloc(talloc_tos(), &tmpbuf2, s, &converted_size)) {
272 ret = strlen_w(tmpbuf2);
273 TALLOC_FREE(tmpbuf2);
277 bool trim_char(char *s,char cfront,char cback)
283 /* Ignore null or empty strings. */
284 if (!s || (s[0] == '\0'))
288 while (*fp && *fp == cfront)
291 /* We ate the string. */
299 ep = fp + strlen(fp) - 1;
301 /* Attempt ascii only. Bail for mb strings. */
302 while ((ep >= fp) && (*ep == cback)) {
304 if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
305 /* Could be mb... bail back to tim_string. */
313 return trim_string(s, cfront ? fs : NULL, bs);
319 /* We ate the string. */
326 memmove(s, fp, ep-fp+2);
331 Safe string copy into a known length string. maxlength does not
332 include the terminating zero.
335 char *safe_strcpy_fn(char *dest,
342 smb_panic("ERROR: NULL dest in safe_strcpy");
350 len = strnlen(src, maxlength+1);
352 if (len > maxlength) {
353 DEBUG(0,("ERROR: string overflow by "
354 "%lu (%lu - %lu) in safe_strcpy [%.50s]\n",
355 (unsigned long)(len-maxlength), (unsigned long)len,
356 (unsigned long)maxlength, src));
360 memmove(dest, src, len);
366 Safe string cat into a string. maxlength does not
367 include the terminating zero.
369 char *safe_strcat_fn(char *dest,
373 size_t src_len, dest_len;
376 smb_panic("ERROR: NULL dest in safe_strcat");
382 src_len = strnlen(src, maxlength + 1);
383 dest_len = strnlen(dest, maxlength + 1);
385 if (src_len + dest_len > maxlength) {
386 DEBUG(0,("ERROR: string overflow by %d "
387 "in safe_strcat [%.50s]\n",
388 (int)(src_len + dest_len - maxlength), src));
389 if (maxlength > dest_len) {
390 memcpy(&dest[dest_len], src, maxlength - dest_len);
396 memcpy(&dest[dest_len], src, src_len);
397 dest[dest_len + src_len] = 0;
402 Paranoid strcpy into a buffer of given length (includes terminating
403 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
404 and replaces with '_'. Deliberately does *NOT* check for multibyte
405 characters. Treats src as an array of bytes, not as a multibyte
406 string. Any byte >0x7f is automatically converted to '_'.
407 other_safe_chars must also contain an ascii string (bytes<0x7f).
410 char *alpha_strcpy(char *dest,
412 const char *other_safe_chars,
418 smb_panic("ERROR: NULL dest in alpha_strcpy");
427 if (len >= maxlength)
430 if (!other_safe_chars)
431 other_safe_chars = "";
433 for(i = 0; i < len; i++) {
434 int val = (src[i] & 0xff);
439 if (isupper(val) || islower(val) ||
440 isdigit(val) || strchr(other_safe_chars, val))
452 Like strncpy but always null terminates. Make sure there is room!
453 The variable n should always be one less than the available size.
455 char *StrnCpy(char *dest,const char *src,size_t n)
460 smb_panic("ERROR: NULL dest in StrnCpy");
468 while (n-- && (*d = *src)) {
479 Like strncpy but copies up to the character marker. always null terminates.
480 returns a pointer to the character marker in the source string (src).
483 static char *strncpyn(char *dest, const char *src, size_t n, char c)
488 p = strchr_m(src, c);
490 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
494 str_len = PTR_DIFF(p, src);
495 strncpy(dest, src, MIN(n, str_len));
496 dest[str_len] = '\0';
503 Check if a string is part of a list.
506 bool in_list(const char *s, const char *list, bool casesensitive)
516 frame = talloc_stackframe();
517 while (next_token_talloc(frame, &list, &tok,LIST_SEP)) {
519 if (strcmp(tok,s) == 0) {
524 if (StrCaseCmp(tok,s) == 0) {
534 /* this is used to prevent lots of mallocs of size 1 */
535 static const char null_string[] = "";
538 Set a string value, allocing the space for the string
541 static bool string_init(char **dest,const char *src)
551 *dest = CONST_DISCARD(char*, null_string);
553 (*dest) = SMB_STRDUP(src);
554 if ((*dest) == NULL) {
555 DEBUG(0,("Out of memory in string_init\n"));
566 void string_free(char **s)
570 if (*s == null_string)
576 Set a string value, deallocating any existing space, and allocing the space
580 bool string_set(char **dest,const char *src)
583 return(string_init(dest,src));
587 Substitute a string for a pattern in another string. Make sure there is
590 This routine looks for pattern in s and replaces it with
591 insert. It may do multiple replacements or just one.
593 Any of " ; ' $ or ` in the insert string are replaced with _
594 if len==0 then the string cannot be extended. This is different from the old
595 use of len==0 which was for no length checks to be done.
598 void string_sub2(char *s,const char *pattern, const char *insert, size_t len,
599 bool remove_unsafe_characters, bool replace_once,
600 bool allow_trailing_dollar)
605 if (!insert || !pattern || !*pattern || !s)
608 ls = (ssize_t)strlen(s);
609 lp = (ssize_t)strlen(pattern);
610 li = (ssize_t)strlen(insert);
613 len = ls + 1; /* len is number of *bytes* */
615 while (lp <= ls && (p = strstr_m(s,pattern))) {
616 if (ls + (li-lp) >= len) {
617 DEBUG(0,("ERROR: string overflow by "
618 "%d in string_sub(%.50s, %d)\n",
619 (int)(ls + (li-lp) - len),
624 memmove(p+li,p+lp,strlen(p+lp)+1);
629 /* allow a trailing $
630 * (as in machine accounts) */
631 if (allow_trailing_dollar && (i == li - 1 )) {
642 if ( remove_unsafe_characters ) {
644 /* yes this break should be here
645 * since we want to fall throw if
646 * not replacing unsafe chars */
661 void string_sub_once(char *s, const char *pattern,
662 const char *insert, size_t len)
664 string_sub2( s, pattern, insert, len, true, true, false );
667 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
669 string_sub2( s, pattern, insert, len, true, false, false );
672 void fstring_sub(char *s,const char *pattern,const char *insert)
674 string_sub(s, pattern, insert, sizeof(fstring));
678 Similar to string_sub2, but it will accept only allocated strings
679 and may realloc them so pay attention at what you pass on no
680 pointers inside strings, no const may be passed
684 char *realloc_string_sub2(char *string,
687 bool remove_unsafe_characters,
688 bool allow_trailing_dollar)
692 ssize_t ls,lp,li,ld, i;
694 if (!insert || !pattern || !*pattern || !string || !*string)
699 in = SMB_STRDUP(insert);
701 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
704 ls = (ssize_t)strlen(s);
705 lp = (ssize_t)strlen(pattern);
706 li = (ssize_t)strlen(insert);
711 /* allow a trailing $
712 * (as in machine accounts) */
713 if (allow_trailing_dollar && (i == li - 1 )) {
723 if ( remove_unsafe_characters ) {
733 while ((p = strstr_m(s,pattern))) {
735 int offset = PTR_DIFF(s,string);
736 string = (char *)SMB_REALLOC(string, ls + ld + 1);
738 DEBUG(0, ("realloc_string_sub: "
739 "out of memory!\n"));
743 p = string + offset + (p - s);
746 memmove(p+li,p+lp,strlen(p+lp)+1);
756 char *realloc_string_sub(char *string,
760 return realloc_string_sub2(string, pattern, insert, true, false);
764 * Internal guts of talloc_string_sub and talloc_all_string_sub.
765 * talloc version of string_sub2.
768 char *talloc_string_sub2(TALLOC_CTX *mem_ctx, const char *src,
771 bool remove_unsafe_characters,
773 bool allow_trailing_dollar)
778 ssize_t ls,lp,li,ld, i;
780 if (!insert || !pattern || !*pattern || !src) {
784 string = talloc_strdup(mem_ctx, src);
785 if (string == NULL) {
786 DEBUG(0, ("talloc_string_sub2: "
787 "talloc_strdup failed\n"));
793 in = SMB_STRDUP(insert);
795 DEBUG(0, ("talloc_string_sub2: ENOMEM\n"));
798 ls = (ssize_t)strlen(s);
799 lp = (ssize_t)strlen(pattern);
800 li = (ssize_t)strlen(insert);
806 /* allow a trailing $
807 * (as in machine accounts) */
808 if (allow_trailing_dollar && (i == li - 1 )) {
818 if (remove_unsafe_characters) {
828 while ((p = strstr_m(s,pattern))) {
830 int offset = PTR_DIFF(s,string);
831 string = (char *)TALLOC_REALLOC(mem_ctx, string,
834 DEBUG(0, ("talloc_string_sub: out of "
839 p = string + offset + (p - s);
842 memmove(p+li,p+lp,strlen(p+lp)+1);
856 /* Same as string_sub, but returns a talloc'ed string */
858 char *talloc_string_sub(TALLOC_CTX *mem_ctx,
863 return talloc_string_sub2(mem_ctx, src, pattern, insert,
868 Similar to string_sub() but allows for any character to be substituted.
870 if len==0 then the string cannot be extended. This is different from the old
871 use of len==0 which was for no length checks to be done.
874 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
879 if (!insert || !pattern || !s)
882 ls = (ssize_t)strlen(s);
883 lp = (ssize_t)strlen(pattern);
884 li = (ssize_t)strlen(insert);
890 len = ls + 1; /* len is number of *bytes* */
892 while (lp <= ls && (p = strstr_m(s,pattern))) {
893 if (ls + (li-lp) >= len) {
894 DEBUG(0,("ERROR: string overflow by "
895 "%d in all_string_sub(%.50s, %d)\n",
896 (int)(ls + (li-lp) - len),
901 memmove(p+li,p+lp,strlen(p+lp)+1);
903 memcpy(p, insert, li);
909 char *talloc_all_string_sub(TALLOC_CTX *ctx,
914 return talloc_string_sub2(ctx, src, pattern, insert,
915 false, false, false);
919 Write an octal as a string.
922 char *octal_string(int i)
926 result = talloc_strdup(talloc_tos(), "-1");
929 result = talloc_asprintf(talloc_tos(), "0%o", i);
931 SMB_ASSERT(result != NULL);
937 Truncate a string at a specified length.
940 char *string_truncate(char *s, unsigned int length)
942 if (s && strlen(s) > length)
948 /***********************************************************************
949 Return the equivalent of doing strrchr 'n' times - always going
951 ***********************************************************************/
953 char *strnrchr_m(const char *s, char c, unsigned int n)
955 smb_ucs2_t *ws = NULL;
959 size_t converted_size;
961 if (!push_ucs2_talloc(talloc_tos(), &ws, s, &converted_size)) {
962 /* Too hard to try and get right. */
965 p = strnrchr_w(ws, UCS2_CHAR(c), n);
971 if (!pull_ucs2_talloc(talloc_tos(), &s2, ws, &converted_size)) {
973 /* Too hard to try and get right. */
976 ret = (char *)(s+strlen(s2));
982 /***********************************************************************
983 strstr_m - We convert via ucs2 for now.
984 ***********************************************************************/
986 char *strstr_m(const char *src, const char *findstr)
989 smb_ucs2_t *src_w, *find_w;
994 size_t converted_size, findstr_len = 0;
996 /* for correctness */
1001 /* Samba does single character findstr calls a *lot*. */
1002 if (findstr[1] == '\0')
1003 return strchr_m(src, *findstr);
1005 /* We optimise for the ascii case, knowing that all our
1006 supported multi-byte character sets are ascii-compatible
1007 (ie. they match for the first 128 chars) */
1009 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1010 if (*s == *findstr) {
1012 findstr_len = strlen(findstr);
1014 if (strncmp(s, findstr, findstr_len) == 0) {
1023 #if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
1024 /* 'make check' fails unless we do this */
1026 /* With compose characters we must restart from the beginning. JRA. */
1030 if (!push_ucs2_talloc(talloc_tos(), &src_w, src, &converted_size)) {
1031 DEBUG(0,("strstr_m: src malloc fail\n"));
1035 if (!push_ucs2_talloc(talloc_tos(), &find_w, findstr, &converted_size)) {
1037 DEBUG(0,("strstr_m: find malloc fail\n"));
1041 p = strstr_w(src_w, find_w);
1045 TALLOC_FREE(find_w);
1050 if (!pull_ucs2_talloc(talloc_tos(), &s2, src_w, &converted_size)) {
1052 TALLOC_FREE(find_w);
1053 DEBUG(0,("strstr_m: dest malloc fail\n"));
1056 retp = (char *)(s+strlen(s2));
1058 TALLOC_FREE(find_w);
1064 Convert a string to lower case.
1067 void strlower_m(char *s)
1072 /* this is quite a common operation, so we want it to be
1073 fast. We optimise for the ascii case, knowing that all our
1074 supported multi-byte character sets are ascii-compatible
1075 (ie. they match for the first 128 chars) */
1077 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1078 *s = tolower_ascii((unsigned char)*s);
1085 /* I assume that lowercased string takes the same number of bytes
1086 * as source string even in UTF-8 encoding. (VIV) */
1087 len = strlen(s) + 1;
1090 unix_strlower(s,len,s,len);
1091 /* Catch mb conversion errors that may not terminate. */
1098 Convert a string to upper case.
1101 void strupper_m(char *s)
1106 /* this is quite a common operation, so we want it to be
1107 fast. We optimise for the ascii case, knowing that all our
1108 supported multi-byte character sets are ascii-compatible
1109 (ie. they match for the first 128 chars) */
1111 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1112 *s = toupper_ascii_fast((unsigned char)*s);
1119 /* I assume that lowercased string takes the same number of bytes
1120 * as source string even in multibyte encoding. (VIV) */
1121 len = strlen(s) + 1;
1124 unix_strupper(s,len,s,len);
1125 /* Catch mb conversion errors that may not terminate. */
1132 Just a typesafety wrapper for snprintf into a fstring.
1135 int fstr_sprintf(fstring s, const char *fmt, ...)
1141 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1147 List of Strings manipulation functions
1150 #define S_LIST_ABS 16 /* List Allocation Block Size */
1152 /******************************************************************************
1153 version of standard_sub_basic() for string lists; uses talloc_sub_basic()
1155 *****************************************************************************/
1157 bool str_list_sub_basic( char **list, const char *smb_name,
1158 const char *domain_name )
1160 TALLOC_CTX *ctx = list;
1165 tmpstr = talloc_sub_basic(ctx, smb_name, domain_name, s);
1167 DEBUG(0,("str_list_sub_basic: "
1168 "alloc_sub_basic() return NULL!\n"));
1181 /******************************************************************************
1182 substitute a specific pattern in a string list
1183 *****************************************************************************/
1185 bool str_list_substitute(char **list, const char *pattern, const char *insert)
1187 TALLOC_CTX *ctx = list;
1189 ssize_t ls, lp, li, ld, i, d;
1198 lp = (ssize_t)strlen(pattern);
1199 li = (ssize_t)strlen(insert);
1204 ls = (ssize_t)strlen(s);
1206 while ((p = strstr_m(s, pattern))) {
1210 t = TALLOC_ARRAY(ctx, char, ls +ld +1);
1212 DEBUG(0,("str_list_substitute: "
1213 "Unable to allocate memory"));
1216 memcpy(t, *list, d);
1217 memcpy(t +d +li, p +lp, ls -d -lp +1);
1224 for (i = 0; i < li; i++) {
1225 switch (insert[i]) {
1237 t[d +i] = insert[i];
1249 #define IPSTR_LIST_SEP ","
1250 #define IPSTR_LIST_CHAR ','
1253 * Add ip string representation to ipstr list. Used also
1254 * as part of @function ipstr_list_make
1256 * @param ipstr_list pointer to string containing ip list;
1257 * MUST BE already allocated and IS reallocated if necessary
1258 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1259 * as a result of reallocation)
1260 * @param ip IP address which is to be added to list
1261 * @return pointer to string appended with new ip and possibly
1262 * reallocated to new length
1265 static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
1267 char *new_ipstr = NULL;
1268 char addr_buf[INET6_ADDRSTRLEN];
1271 /* arguments checking */
1272 if (!ipstr_list || !service) {
1276 print_sockaddr(addr_buf,
1280 /* attempt to convert ip to a string and append colon separator to it */
1282 if (service->ss.ss_family == AF_INET) {
1284 ret = asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list,
1285 IPSTR_LIST_SEP, addr_buf,
1289 ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
1290 IPSTR_LIST_SEP, addr_buf,
1293 SAFE_FREE(*ipstr_list);
1295 if (service->ss.ss_family == AF_INET) {
1297 ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
1301 ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
1308 *ipstr_list = new_ipstr;
1313 * Allocate and initialise an ipstr list using ip adresses
1314 * passed as arguments.
1316 * @param ipstr_list pointer to string meant to be allocated and set
1317 * @param ip_list array of ip addresses to place in the list
1318 * @param ip_count number of addresses stored in ip_list
1319 * @return pointer to allocated ip string
1322 char *ipstr_list_make(char **ipstr_list,
1323 const struct ip_service *ip_list,
1328 /* arguments checking */
1329 if (!ip_list || !ipstr_list) {
1335 /* process ip addresses given as arguments */
1336 for (i = 0; i < ip_count; i++) {
1337 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1340 return (*ipstr_list);
1345 * Parse given ip string list into array of ip addresses
1346 * (as ip_service structures)
1347 * e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
1349 * @param ipstr ip string list to be parsed
1350 * @param ip_list pointer to array of ip addresses which is
1351 * allocated by this function and must be freed by caller
1352 * @return number of successfully parsed addresses
1355 int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
1358 char *token_str = NULL;
1362 if (!ipstr_list || !ip_list)
1365 count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
1366 if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
1367 DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
1368 (unsigned long)count));
1372 frame = talloc_stackframe();
1373 for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
1374 IPSTR_LIST_SEP) && i<count; i++ ) {
1375 char *s = token_str;
1376 char *p = strrchr(token_str, ':');
1380 (*ip_list)[i].port = atoi(p+1);
1383 /* convert single token to ip address */
1384 if (token_str[0] == '[') {
1387 p = strchr(token_str, ']');
1393 if (!interpret_string_addr(&(*ip_list)[i].ss,
1404 * Safely free ip string list
1406 * @param ipstr_list ip string list to be freed
1409 void ipstr_list_free(char* ipstr_list)
1411 SAFE_FREE(ipstr_list);
1414 /* read a SMB_BIG_UINT from a string */
1415 uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
1418 uint64_t val = (uint64_t)-1;
1419 const char *p = nptr;
1428 while (*p && isspace(*p))
1431 sscanf(p,"%"PRIu64,&val);
1433 while (*p && isdigit(*p))
1441 /* Convert a size specification to a count of bytes. We accept the following
1443 * bytes if there is no suffix
1448 * pP whatever the ISO name for petabytes is
1450 * Returns 0 if the string can't be converted.
1452 SMB_OFF_T conv_str_size(const char * str)
1454 SMB_OFF_T lval_orig;
1458 if (str == NULL || *str == '\0') {
1462 #ifdef HAVE_STRTOULL
1463 if (sizeof(SMB_OFF_T) == 8) {
1464 lval = strtoull(str, &end, 10 /* base */);
1466 lval = strtoul(str, &end, 10 /* base */);
1469 lval = strtoul(str, &end, 10 /* base */);
1472 if (end == NULL || end == str) {
1482 if (strwicmp(end, "K") == 0) {
1483 lval *= (SMB_OFF_T)1024;
1484 } else if (strwicmp(end, "M") == 0) {
1485 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024);
1486 } else if (strwicmp(end, "G") == 0) {
1487 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
1489 } else if (strwicmp(end, "T") == 0) {
1490 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
1491 (SMB_OFF_T)1024 * (SMB_OFF_T)1024);
1492 } else if (strwicmp(end, "P") == 0) {
1493 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
1494 (SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
1501 * Primitive attempt to detect wrapping on platforms with
1502 * 4-byte SMB_OFF_T. It's better to let the caller handle a
1503 * failure than some random number.
1505 if (lval_orig <= lval) {
1512 void string_append(char **left, const char *right)
1514 int new_len = strlen(right) + 1;
1516 if (*left == NULL) {
1517 *left = (char *)SMB_MALLOC(new_len);
1518 if (*left == NULL) {
1523 new_len += strlen(*left);
1524 *left = (char *)SMB_REALLOC(*left, new_len);
1527 if (*left == NULL) {
1531 safe_strcat(*left, right, new_len-1);
1534 /* Append an sprintf'ed string. Double buffer size on demand. Usable without
1535 * error checking in between. The indiation that something weird happened is
1538 void sprintf_append(TALLOC_CTX *mem_ctx, char **string, ssize_t *len,
1539 size_t *bufsize, const char *fmt, ...)
1546 /* len<0 is an internal marker that something failed */
1550 if (*string == NULL) {
1554 *string = TALLOC_ARRAY(mem_ctx, char, *bufsize);
1555 if (*string == NULL)
1560 ret = vasprintf(&newstr, fmt, ap);
1568 while ((*len)+ret >= *bufsize) {
1571 if (*bufsize >= (1024*1024*256))
1576 *string = TALLOC_REALLOC_ARRAY(mem_ctx, *string, char,
1578 if (*string == NULL) {
1583 StrnCpy((*string)+(*len), newstr, ret);
1594 * asprintf into a string and strupper_m it after that.
1597 int asprintf_strupper_m(char **strp, const char *fmt, ...)
1604 ret = vasprintf(&result, fmt, ap);
1615 char *talloc_asprintf_strupper_m(TALLOC_CTX *t, const char *fmt, ...)
1621 ret = talloc_vasprintf(t, fmt, ap);
1631 char *talloc_asprintf_strlower_m(TALLOC_CTX *t, const char *fmt, ...)
1637 ret = talloc_vasprintf(t, fmt, ap);
1649 Returns the substring from src between the first occurrence of
1650 the char "front" and the first occurence of the char "back".
1651 Mallocs the return string which must be freed. Not for use
1652 with wide character strings.
1654 char *sstring_sub(const char *src, char front, char back)
1656 char *temp1, *temp2, *temp3;
1659 temp1 = strchr(src, front);
1660 if (temp1 == NULL) return NULL;
1661 temp2 = strchr(src, back);
1662 if (temp2 == NULL) return NULL;
1663 len = temp2 - temp1;
1664 if (len <= 0) return NULL;
1665 temp3 = (char*)SMB_MALLOC(len);
1666 if (temp3 == NULL) {
1667 DEBUG(1,("Malloc failure in sstring_sub\n"));
1670 memcpy(temp3, temp1+1, len-1);
1671 temp3[len-1] = '\0';
1675 /********************************************************************
1676 Check a string for any occurrences of a specified list of invalid
1678 ********************************************************************/
1680 bool validate_net_name( const char *name,
1681 const char *invalid_chars,
1690 for ( i=0; i<max_len && name[i]; i++ ) {
1691 /* fail if strchr_m() finds one of the invalid characters */
1692 if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
1701 /*******************************************************************
1702 Add a shell escape character '\' to any character not in a known list
1703 of characters. UNIX charset format.
1704 *******************************************************************/
1706 #define INCLUDE_LIST "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_/ \t.,"
1707 #define INSIDE_DQUOTE_LIST "$`\n\"\\"
1709 char *escape_shell_string(const char *src)
1711 size_t srclen = strlen(src);
1712 char *ret = SMB_MALLOC_ARRAY(char, (srclen * 2) + 1);
1714 bool in_s_quote = false;
1715 bool in_d_quote = false;
1716 bool next_escaped = false;
1724 codepoint_t c = next_codepoint(src, &c_size);
1726 if (c == INVALID_CODEPOINT) {
1732 memcpy(dest, src, c_size);
1735 next_escaped = false;
1740 * Deal with backslash escaped state.
1741 * This only lasts for one character.
1746 next_escaped = false;
1751 * Deal with single quote state. The
1752 * only thing we care about is exiting
1765 * Deal with double quote state. The most
1766 * complex state. We must cope with \, meaning
1767 * possibly escape next char (depending what it
1768 * is), ", meaning exit this state, and possibly
1769 * add an \ escape to any unprotected character
1770 * (listed in INSIDE_DQUOTE_LIST).
1776 * Next character might be escaped.
1777 * We have to peek. Inside double
1778 * quotes only INSIDE_DQUOTE_LIST
1779 * characters are escaped by a \.
1784 c = next_codepoint(&src[1], &c_size);
1785 if (c == INVALID_CODEPOINT) {
1791 * Don't escape the next char.
1800 if (nextchar && strchr(INSIDE_DQUOTE_LIST,
1802 next_escaped = true;
1809 /* Exit double quote state. */
1816 * We know the character isn't \ or ",
1817 * so escape it if it's any of the other
1818 * possible unprotected characters.
1821 if (strchr(INSIDE_DQUOTE_LIST, (int)*src)) {
1829 * From here to the end of the loop we're
1830 * not in the single or double quote state.
1834 /* Next character must be escaped. */
1835 next_escaped = true;
1841 /* Go into single quote state. */
1848 /* Go into double quote state. */
1854 /* Check if we need to escape the character. */
1856 if (!strchr(INCLUDE_LIST, (int)*src)) {
1865 /***************************************************
1866 str_list_make, v3 version. The v4 version does not
1867 look at quoted strings with embedded blanks, so
1868 do NOT merge this function please!
1869 ***************************************************/
1871 #define S_LIST_ABS 16 /* List Allocation Block Size */
1873 char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string,
1881 if (!string || !*string)
1884 list = TALLOC_ARRAY(mem_ctx, char *, S_LIST_ABS+1);
1890 s = talloc_strdup(list, string);
1892 DEBUG(0,("str_list_make: Unable to allocate memory"));
1896 if (!sep) sep = LIST_SEP;
1901 while (next_token_talloc(list, &str, &tok, sep)) {
1906 lsize += S_LIST_ABS;
1908 tmp = TALLOC_REALLOC_ARRAY(mem_ctx, list, char *,
1911 DEBUG(0,("str_list_make: "
1912 "Unable to allocate memory"));
1919 memset (&list[num], 0,
1920 ((sizeof(char**)) * (S_LIST_ABS +1)));
1933 char *sanitize_username(TALLOC_CTX *mem_ctx, const char *username)
1937 alpha_strcpy(tmp, username, ". _-$", sizeof(tmp));
1938 return talloc_strdup(mem_ctx, tmp);