if (env == NULL || *env == '\0')
i_fatal("MECHANISMS environment is unset");
- mechanisms = t_strsplit(env, " ");
+ mechanisms = t_strsplit_spaces(env, " ");
while (*mechanisms != NULL) {
if (strcasecmp(*mechanisms, "PLAIN") == 0)
mech_register_module(&mech_plain);
env = getenv("REALMS");
if (env == NULL)
env = "";
- auth_realms = t_strsplit(env, " ");
+ auth_realms = t_strsplit_spaces(env, " ");
default_realm = getenv("DEFAULT_REALM");
if (default_realm != NULL && *default_realm == '\0')
static_gid = 0;
static_home_template = NULL;
- for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) {
- if (**tmp == '\0')
- continue;
-
+ for (tmp = t_strsplit_spaces(args, " "); *tmp != NULL; tmp++) {
if (strncasecmp(*tmp, "uid=", 4) == 0)
static_uid = atoi(*tmp + 4);
else if (strncasecmp(*tmp, "gid=", 4) == 0)
if (*fields == '(')
fields++;
- field_list = t_strsplit(fields, " )");
+ field_list = t_strsplit_spaces(fields, " )");
/* array ends at ")" element */
for (field = dest = field_list; *field != NULL; field++) {
if (strcmp(*field, ")") == 0)
break;
- if (**field != '\0') {
- *dest = *field;
- dest++;
- }
+
+ *dest = *field;
+ dest++;
}
*dest = NULL;
str = getenv("MBOX_LOCKS");
if (str == NULL) str = DEFAULT_LOCK_METHODS;
- for (lock = t_strsplit(str, " "); *lock != NULL; lock++) {
+ for (lock = t_strsplit_spaces(str, " "); *lock != NULL; lock++) {
if (strcasecmp(*lock, "dotlock") == 0)
use_dotlock = TRUE;
else if (strcasecmp(*lock, "fcntl") == 0) {
return 0;
ret = 0;
- for (arr = t_strsplit(fields, " ,"); *arr != NULL; arr++) {
- if (*arr == '\0')
- continue;
-
+ for (arr = t_strsplit_spaces(fields, " ,"); *arr != NULL; arr++) {
for (i = 0; field_names[i] != NULL; i++) {
if (strcasecmp(field_names[i], *arr) == 0) {
ret |= field_masks[i];
if (env == NULL)
return;
- for (str = t_strsplit(env, " "); *str != NULL; str++) {
- if (**str == '\0')
- continue;
-
+ for (str = t_strsplit_spaces(env, " "); *str != NULL; str++) {
list = client_workaround_list;
for (; list->name != NULL; list++) {
if (strcasecmp(*str, list->name) == 0) {
const char *_vstrconcat(const char *str1, va_list args, size_t *ret_len)
{
const char *str;
- char *temp, *temp_end, *p;
- size_t bufsize, pos;
+ char *temp;
+ size_t bufsize, i, len;
if (str1 == NULL)
return NULL;
bufsize = STRCONCAT_BUFSIZE;
temp = t_buffer_get(bufsize);
- pos = 0;
+ i = 0;
do {
- temp_end = temp + bufsize - 1; /* leave 1 for \0 */
+ len = strlen(str);
- p = temp + pos;
- while (*str != '\0' && p != temp_end)
- *p++ = *str++;
- pos = (size_t)(p - temp);
-
- if (p == temp_end) {
+ if (i + len >= bufsize) {
/* need more memory */
- bufsize = nearest_power(bufsize+1);
+ bufsize = nearest_power(i + len + 1);
temp = t_buffer_reget(temp, bufsize);
- } else {
- /* next string */
- str = va_arg(args, const char *);
}
+
+ memcpy(temp + i, str, len);
+
+ /* next string */
+ str = va_arg(args, const char *);
} while (str != NULL);
- i_assert(pos < bufsize);
+ i_assert(i < bufsize);
- temp[pos] = '\0';
- *ret_len = pos+1;
+ temp[i++] = '\0';
+ *ret_len = i;
return temp;
}
return 0;
}
-const char **t_strsplit(const char *data, const char *separators)
+static const char **_strsplit(const char *data, const char *separators,
+ int spaces)
{
const char **array;
char *str;
alloc_len);
}
- *str = '\0';
+ if (*str != ' ' || !spaces)
+ *str = '\0';
+ else {
+ *str = '\0';
+ while (str[1] == ' ') str++;
+ }
+
array[len++] = str+1;
}
return array;
}
+const char **t_strsplit(const char *data, const char *separators)
+{
+ return _strsplit(data, separators, FALSE);
+}
+
+const char **t_strsplit_spaces(const char *data, const char *separators)
+{
+ return _strsplit(data, separators, TRUE);
+}
+
const char *dec2str(uintmax_t number)
{
char *buffer;
/* seprators is an array of separator characters, not a separator string. */
const char **t_strsplit(const char *data, const char *separators);
+/* like t_strsplit(), but treats multiple spaces as a single separator. */
+const char **t_strsplit_spaces(const char *data, const char *separators);
const char *dec2str(uintmax_t number);
ssl_ip = normal_ip;
/* register wanted protocols */
- for (proto = t_strsplit(set->protocols, " "); *proto != NULL; proto++) {
+ proto = t_strsplit_spaces(set->protocols, " ");
+ for (; *proto != NULL; proto++) {
fd = NULL; ip = NULL; port = 0;
if (strcasecmp(*proto, "imap") == 0) {
if (set->protocol == MAIL_PROTOCOL_IMAP) {
}
dotlock_got = fcntl_got = flock_got = FALSE;
- for (str = t_strsplit(set->mbox_locks, " "); *str != NULL; str++) {
+ str = t_strsplit_spaces(set->mbox_locks, " ");
+ for (; *str != NULL; str++) {
if (strcasecmp(*str, "dotlock") == 0)
dotlock_got = TRUE;
else if (strcasecmp(*str, "fcntl") == 0)