1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/* This file is part of Pies.
Copyright (C) 2007, 2008, 2009 Sergey Poznyakoff
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <libpies.h>
char **
config_array_to_argv (mu_config_value_t *val, mu_debug_t debug)
{
int i, j;
int argc;
char **argv;
argc = val->v.arg.c;
argv = xcalloc (argc + 1, sizeof (argv[0]));
for (i = j = 0; i < argc; i++)
{
if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING,
debug) == 0)
argv[j++] = xstrdup (val->v.arg.v[i].v.string);
}
argv[j] = NULL;
return argv;
}
char *
config_array_to_string (mu_config_value_t *val, mu_debug_t debug)
{
size_t len = 0;
int i;
char *str, *p;
for (i = 0; i < val->v.arg.c; i++)
{
if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING, debug))
return NULL;
len += strlen (val->v.arg.v[i].v.string) + 1;
}
str = xmalloc (len);
p = str;
for (i = 0; i < val->v.arg.c; i++)
{
size_t n = strlen (val->v.arg.v[i].v.string);
memcpy (p, val->v.arg.v[i].v.string, n);
p += n;
*p++ = ' ';
}
str[len-1] = 0;
return str;
}
int
config_cb_timeout (struct timeval *pt, mu_debug_t debug,
mu_config_value_t *val)
{
int rc;
const char *endp;
time_t t;
const char *str;
char *alloc_str = NULL;
switch (val->type)
{
case MU_CFG_STRING:
str = val->v.string;
break;
case MU_CFG_ARRAY:
str = alloc_str = config_array_to_string (val, debug);
if (!str)
return 1;
break;
case MU_CFG_LIST:
mu_cfg_format_error (debug, MU_DEBUG_ERROR,
_("unexpected list"));
return 1;
}
rc = parse_time_interval (str, &t, &endp);
if (rc)
mu_cfg_format_error (debug, MU_DEBUG_ERROR,
_("unrecognized time format (near `%s')"),
endp);
else
{
pt->tv_usec = 0;
pt->tv_sec = t;
}
free (alloc_str);
return 0;
}
|