/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2009,
2010, 2011 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#if HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int
mu_is_proto (const char *p)
{
if (*p == '|')
return 1;
for (; *p && *p != '/'; p++)
if (*p == ':')
return 1;
return 0;
}
int
mu_mh_delim (const char *str)
{
if (str[0] == '-')
{
for (; *str == '-'; str++)
;
for (; *str == ' ' || *str == '\t'; str++)
;
}
return str[0] == '\n';
}
/* A locale-independent version of strftime */
size_t
mu_strftime (char *s, size_t max, const char *format, const struct tm *tm)
{
size_t size;
mu_set_locale ("C");
size = strftime (s, max, format, tm);
mu_restore_locale ();
return size;
}
static void
assoc_str_free (void *data)
{
free (data);
}
int
mutil_parse_field_map (const char *map, mu_assoc_t *passoc_tab, int *perr)
{
int rc;
int i;
struct mu_wordsplit ws;
mu_assoc_t assoc_tab = NULL;
ws.ws_delim = ":";
if (mu_wordsplit (map, &ws, MU_WRDSF_DEFFLAGS|MU_WRDSF_DELIM))
{
mu_error (_("cannot split line `%s': %s"), map,
mu_wordsplit_strerror (&ws));
return errno;
}
for (i = 0; i < ws.ws_wordc; i++)
{
char *tok = ws.ws_wordv[i];
char *p = strchr (tok, '=');
char *pptr;
if (!p)
{
rc = EINVAL;
break;
}
if (!assoc_tab)
{
rc = mu_assoc_create (&assoc_tab, sizeof(char*), 0);
if (rc)
break;
mu_assoc_set_free (assoc_tab, assoc_str_free);
*passoc_tab = assoc_tab;
}
*p++ = 0;
pptr = strdup (p);
if (!pptr)
{
rc = errno;
break;
}
rc = mu_assoc_install (assoc_tab, tok, &pptr);
if (rc)
{
free (p);
break;
}
}
mu_wordsplit_free (&ws);
if (rc && perr)
*perr = i;
return rc;
}
/* FIXME: should it be here? */
int
mu_sql_decode_password_type (const char *arg, enum mu_password_type *t)
{
if (strcmp (arg, "plain") == 0)
*t = password_plaintext;
else if (strcmp (arg, "hash") == 0)
*t = password_hash;
else if (strcmp (arg, "scrambled") == 0)
*t = password_scrambled;
else
return 1;
return 0;
}
int
mu_stream_flags_to_mode (int flags, int isdir)
{
int mode = 0;
if (flags & MU_STREAM_IRGRP)
mode |= S_IRGRP;
if (flags & MU_STREAM_IWGRP)
mode |= S_IWGRP;
if (flags & MU_STREAM_IROTH)
mode |= S_IROTH;
if (flags & MU_STREAM_IWOTH)
mode |= S_IWOTH;
if (isdir)
{
if (mode & (S_IRGRP|S_IWGRP))
mode |= S_IXGRP;
if (mode & (S_IROTH|S_IWOTH))
mode |= S_IXOTH;
}
return mode;
}