29 |
#else |
#else |
30 |
# include <sys/fcntl.h> |
# include <sys/fcntl.h> |
31 |
#endif |
#endif |
32 |
|
#include <mu_asprintf.h> |
33 |
|
|
34 |
typedef struct _node { |
typedef struct _node { |
35 |
/* for the msglist expander */ |
/* for the msglist expander */ |
1116 |
address_destroy (&new_addr); |
address_destroy (&new_addr); |
1117 |
return rc; |
return rc; |
1118 |
} |
} |
1119 |
|
|
1120 |
|
static int |
1121 |
|
is_address_field (const char *name) |
1122 |
|
{ |
1123 |
|
static char *address_fields[] = { |
1124 |
|
MU_HEADER_TO, |
1125 |
|
MU_HEADER_CC, |
1126 |
|
MU_HEADER_BCC, |
1127 |
|
0 |
1128 |
|
}; |
1129 |
|
char **p; |
1130 |
|
|
1131 |
|
for (p = address_fields; *p; p++) |
1132 |
|
if (strcasecmp (*p, name) == 0) |
1133 |
|
return 1; |
1134 |
|
return 0; |
1135 |
|
} |
1136 |
|
|
1137 |
|
int |
1138 |
|
util_header_expand (header_t *phdr) |
1139 |
|
{ |
1140 |
|
size_t i, nfields = 0; |
1141 |
|
header_t hdr; |
1142 |
|
int errcnt = 0, rc; |
1143 |
|
|
1144 |
|
rc = header_create (&hdr, "", 0, NULL); |
1145 |
|
if (rc) |
1146 |
|
{ |
1147 |
|
util_error ("can't create temporary header: %s", mu_errstring (rc)); |
1148 |
|
return 1; |
1149 |
|
} |
1150 |
|
|
1151 |
|
header_get_field_count (*phdr, &nfields); |
1152 |
|
for (i = 1; i <= nfields; i++) |
1153 |
|
{ |
1154 |
|
char *name, *value; |
1155 |
|
|
1156 |
|
if (header_aget_field_name (*phdr, i, &name)) |
1157 |
|
continue; |
1158 |
|
|
1159 |
|
if (header_aget_field_value (*phdr, i, &value)) |
1160 |
|
{ |
1161 |
|
free (name); |
1162 |
|
continue; |
1163 |
|
} |
1164 |
|
|
1165 |
|
if (is_address_field (name)) |
1166 |
|
{ |
1167 |
|
char *p, *s, *exp; |
1168 |
|
address_t addr = NULL; |
1169 |
|
|
1170 |
|
if (header_aget_value (hdr, name, &exp) == 0) |
1171 |
|
{ |
1172 |
|
address_create (&addr, exp); |
1173 |
|
free (exp); |
1174 |
|
} |
1175 |
|
|
1176 |
|
for (p = strtok_r (value, ",", &s); p; p = strtok_r (NULL, ",", &s)) |
1177 |
|
{ |
1178 |
|
address_t new_addr; |
1179 |
|
|
1180 |
|
while (*p && isspace (*p)) |
1181 |
|
p++; |
1182 |
|
exp = alias_expand (p); |
1183 |
|
rc = address_create (&new_addr, exp ? exp : p); |
1184 |
|
if (rc) |
1185 |
|
{ |
1186 |
|
errcnt++; |
1187 |
|
if (exp) |
1188 |
|
util_error ("can't parse address `%s' (while expanding `%s'): %s", |
1189 |
|
exp, p, mu_errstring (rc)); |
1190 |
|
else |
1191 |
|
util_error ("can't parse address `%s': %s", |
1192 |
|
p, mu_errstring (rc)); |
1193 |
|
} |
1194 |
|
|
1195 |
|
free (exp); |
1196 |
|
address_union (&addr, new_addr); |
1197 |
|
address_destroy (&new_addr); |
1198 |
|
} |
1199 |
|
|
1200 |
|
if (addr) |
1201 |
|
{ |
1202 |
|
size_t n = 0; |
1203 |
|
|
1204 |
|
free (value); |
1205 |
|
address_to_string (addr, NULL, 0, &n); |
1206 |
|
value = xmalloc (n + 1); |
1207 |
|
address_to_string (addr, value, n + 1, NULL); |
1208 |
|
address_destroy (&addr); |
1209 |
|
header_set_value (hdr, name, value, 1); |
1210 |
|
} |
1211 |
|
} |
1212 |
|
else |
1213 |
|
header_set_value (hdr, name, value, 0); |
1214 |
|
|
1215 |
|
free (value); |
1216 |
|
free (name); |
1217 |
|
} |
1218 |
|
|
1219 |
|
if (errcnt == 0) |
1220 |
|
{ |
1221 |
|
header_destroy (phdr, NULL); |
1222 |
|
*phdr = hdr; |
1223 |
|
} |
1224 |
|
else |
1225 |
|
header_destroy (&hdr, NULL); |
1226 |
|
|
1227 |
|
return errcnt; |
1228 |
|
} |