Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : 4 : Copyright (C) Andrew Tridgell 2005 5 : Copyright (C) Jelmer Vernooij 2005 6 : 7 : This program is free software; you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation; either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : This program is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with this program. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include "includes.h" 22 : #include "system/locale.h" 23 : #include "lib/util/tsort.h" 24 : 25 : #undef strcasecmp 26 : 27 : /** 28 : * @file 29 : * @brief String list manipulation v3 30 : */ 31 : 32 : /** 33 : * Needed for making an "unconst" list "const" 34 : */ 35 31369206 : _PUBLIC_ const char **const_str_list(char **list) 36 : { 37 31369206 : return discard_const_p(const char *, list); 38 : } 39 : 40 : /** 41 : * str_list_make, v3 version. The v4 version does not 42 : * look at quoted strings with embedded blanks, so 43 : * do NOT merge this function please! 44 : */ 45 : #define S_LIST_ABS 16 /* List Allocation Block Size */ 46 : 47 3714881 : char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string, 48 : const char *sep) 49 : { 50 18517 : char **list; 51 18517 : const char *str; 52 18517 : char *s, *tok; 53 18517 : int num, lsize; 54 : 55 3714881 : if (!string || !*string) 56 81867 : return NULL; 57 : 58 3632394 : list = talloc_array(mem_ctx, char *, S_LIST_ABS+1); 59 3632394 : if (list == NULL) { 60 0 : return NULL; 61 : } 62 3632394 : lsize = S_LIST_ABS; 63 : 64 3632394 : s = talloc_strdup(list, string); 65 3632394 : if (s == NULL) { 66 0 : DEBUG(0,("str_list_make: Unable to allocate memory\n")); 67 0 : TALLOC_FREE(list); 68 0 : return NULL; 69 : } 70 : 71 : /* 72 : * DON'T REPLACE THIS BY "LIST_SEP". The common version of 73 : * LIST_SEP does not contain the ;, which used to be accepted 74 : * by Samba 4.0 before param merges. It would be the far 75 : * better solution to split the _v3 version again to source3/ 76 : * where it belongs, see the _v3 in its name. 77 : * 78 : * Unfortunately it is referenced in /lib/param/loadparm.c, 79 : * which depends on the version that the AD-DC mandates, 80 : * namely without the ; as part of the list separator. I am 81 : * missing the waf fu to properly work around the wrong 82 : * include paths here for this defect. 83 : */ 84 3632394 : if (sep == NULL) { 85 3632390 : sep = " \t,;\n\r"; 86 : } 87 : 88 3632394 : num = 0; 89 3632394 : str = s; 90 : 91 13916429 : while (next_token_talloc(list, &str, &tok, sep)) { 92 : 93 10284035 : if (num == lsize) { 94 0 : char **tmp; 95 : 96 252 : lsize += S_LIST_ABS; 97 : 98 252 : tmp = talloc_realloc(mem_ctx, list, char *, 99 : lsize + 1); 100 252 : if (tmp == NULL) { 101 0 : DEBUG(0,("str_list_make: " 102 : "Unable to allocate memory\n")); 103 0 : TALLOC_FREE(list); 104 0 : return NULL; 105 : } 106 : 107 252 : list = tmp; 108 : 109 252 : memset (&list[num], 0, 110 : ((sizeof(char*)) * (S_LIST_ABS +1))); 111 : } 112 : 113 10284035 : list[num] = tok; 114 10284035 : num += 1; 115 : } 116 : 117 3632394 : list[num] = NULL; 118 : 119 3632394 : TALLOC_FREE(s); 120 3632394 : return list; 121 : } 122 : 123 1344571 : const char **str_list_make_v3_const(TALLOC_CTX *mem_ctx, 124 : const char *string, 125 : const char *sep) 126 : { 127 1344571 : return const_str_list(str_list_make_v3(mem_ctx, string, sep)); 128 : }