r13622: Allow to rename machine accounts in a Samba Domain. This still uses the
[jra/samba/.git] / source / lib / util_str.c
index 85b5cfc90a7bec7523614e3cc0dd4ab16e8e36ad..e799556cd1ebb6ad87208561b429f38979331b7b 100644 (file)
@@ -923,7 +923,7 @@ BOOL string_set(char **dest,const char *src)
 **/
 
 void string_sub2(char *s,const char *pattern, const char *insert, size_t len, 
-                BOOL remove_unsafe_characters, BOOL replace_once)
+                BOOL remove_unsafe_characters, BOOL replace_once, BOOL allow_trailing_dollar)
 {
        char *p;
        ssize_t ls,lp,li, i;
@@ -955,6 +955,11 @@ void string_sub2(char *s,const char *pattern, const char *insert, size_t len,
                        case '\'':
                        case ';':
                        case '$':
+                               /* allow a trailing $ (as in machine accounts) */
+                               if (allow_trailing_dollar && (i == li - 1 )) {
+                                       p[i] = insert[i];
+                                       break;
+                               }
                        case '%':
                        case '\r':
                        case '\n':
@@ -978,12 +983,12 @@ void string_sub2(char *s,const char *pattern, const char *insert, size_t len,
 
 void string_sub_once(char *s, const char *pattern, const char *insert, size_t len)
 {
-       string_sub2( s, pattern, insert, len, True, True );
+       string_sub2( s, pattern, insert, len, True, True, False );
 }
 
 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
 {
-       string_sub2( s, pattern, insert, len, True, False );
+       string_sub2( s, pattern, insert, len, True, False, False );
 }
 
 void fstring_sub(char *s,const char *pattern,const char *insert)
@@ -1704,7 +1709,7 @@ static char **str_list_make_internal(TALLOC_CTX *mem_ctx, const char *string, co
                                DEBUG(0,("str_list_make: Unable to allocate memory"));
                                str_list_free(&list);
                                if (mem_ctx) {
-                                       talloc_free(s);
+                                       TALLOC_FREE(s);
                                } else {
                                        SAFE_FREE(s);
                                }
@@ -1724,7 +1729,7 @@ static char **str_list_make_internal(TALLOC_CTX *mem_ctx, const char *string, co
                        DEBUG(0,("str_list_make: Unable to allocate memory"));
                        str_list_free(&list);
                        if (mem_ctx) {
-                               talloc_free(s);
+                               TALLOC_FREE(s);
                        } else {
                                SAFE_FREE(s);
                        }
@@ -1735,7 +1740,7 @@ static char **str_list_make_internal(TALLOC_CTX *mem_ctx, const char *string, co
        }
 
        if (mem_ctx) {
-               talloc_free(s);
+               TALLOC_FREE(s);
        } else {
                SAFE_FREE(s);
        }
@@ -1823,13 +1828,13 @@ static void str_list_free_internal(TALLOC_CTX *mem_ctx, char ***list)
        tlist = *list;
        for(; *tlist; tlist++) {
                if (mem_ctx) {
-                       talloc_free(*tlist);
+                       TALLOC_FREE(*tlist);
                } else {
                        SAFE_FREE(*tlist);
                }
        }
        if (mem_ctx) {
-               talloc_free(*tlist);
+               TALLOC_FREE(*tlist);
        } else {
                SAFE_FREE(*list);
        }
@@ -1852,6 +1857,9 @@ int str_list_count( const char **list )
 {
        int i = 0;
 
+       if ( ! list )
+               return 0;
+
        /* count the number of list members */
        
        for ( i=0; *list; i++, list++ );