summaryrefslogtreecommitdiff
path: root/imap4d/fetch.c
diff options
context:
space:
mode:
Diffstat (limited to 'imap4d/fetch.c')
-rw-r--r--imap4d/fetch.c106
1 files changed, 65 insertions, 41 deletions
diff --git a/imap4d/fetch.c b/imap4d/fetch.c
index d0475cf79..7f38e2980 100644
--- a/imap4d/fetch.c
+++ b/imap4d/fetch.c
@@ -162,12 +162,21 @@ fetch_send_header_address (mu_header_t header, const char *name,
fetch_send_address (defval);
}
+static void
+imap4d_ws_alloc_die (struct mu_wordsplit *wsp)
+{
+ imap4d_bye (ERR_NO_MEM);
+}
+
+#define IMAP4D_WS_FLAGS \
+ (MU_WRDSF_DEFFLAGS | MU_WRDSF_DELIM | \
+ MU_WRDSF_ENOMEMABRT | MU_WRDSF_ALLOC_DIE)
+
/* Send parameter list for the bodystructure. */
static void
send_parameter_list (const char *buffer)
{
- int argc = 0;
- char **argv;
+ struct mu_wordsplit ws;
if (!buffer)
{
@@ -175,9 +184,16 @@ send_parameter_list (const char *buffer)
return;
}
- mu_argcv_get (buffer, " \t\r\n;=", NULL, &argc, &argv);
+ ws.ws_delim = " \t\r\n;=";
+ ws.ws_alloc_die = imap4d_ws_alloc_die;
+ if (mu_wordsplit (buffer, &ws, IMAP4D_WS_FLAGS))
+ {
+ mu_error (_("%s failed: %s"), "mu_wordsplit",
+ mu_wordsplit_strerror (&ws));
+ return; /* FIXME: a better error handling, maybe? */
+ }
- if (argc == 0)
+ if (ws.ws_wordc == 0)
io_sendf ("NIL");
else
{
@@ -185,16 +201,16 @@ send_parameter_list (const char *buffer)
io_sendf ("(");
- p = argv[0];
+ p = ws.ws_wordv[0];
io_send_qstring (p);
- if (argc > 1)
+ if (ws.ws_wordc > 1)
{
int i, space = 0;
char *lvalue = NULL;
io_sendf ("(");
- for (i = 1; i < argc; i++)
+ for (i = 1; i < ws.ws_wordc; i++)
{
if (lvalue)
{
@@ -205,22 +221,21 @@ send_parameter_list (const char *buffer)
space = 1;
}
- switch (argv[i][0])
+ switch (ws.ws_wordv[i][0])
{
case ';':
continue;
case '=':
- if (++i < argc)
+ if (++i < ws.ws_wordc)
{
- char *p = argv[i];
io_sendf (" ");
- io_send_qstring (p);
+ io_send_qstring (ws.ws_wordv[i]);
}
break;
default:
- lvalue = argv[i];
+ lvalue = ws.ws_wordv[i];
}
}
if (lvalue)
@@ -235,7 +250,7 @@ send_parameter_list (const char *buffer)
io_sendf (" NIL");
io_sendf (")");
}
- mu_argcv_free (argc, argv);
+ mu_wordsplit_free (&ws);
}
static void
@@ -352,27 +367,33 @@ bodystructure (mu_message_t msg, int extension)
if (mu_header_aget_value (header, MU_HEADER_CONTENT_TYPE, &buffer) == 0)
{
- int argc = 0;
- char **argv;
+ struct mu_wordsplit ws;
char *s, *p;
- mu_argcv_get (buffer, " \t\r\n;=", NULL, &argc, &argv);
+ ws.ws_delim = " \t\r\n;=";
+ ws.ws_alloc_die = imap4d_ws_alloc_die;
+ if (mu_wordsplit (buffer, &ws, IMAP4D_WS_FLAGS))
+ {
+ mu_error (_("%s failed: %s"), "mu_wordsplit",
+ mu_wordsplit_strerror (&ws));
+ return RESP_BAD; /* FIXME: a better error handling, maybe? */
+ }
- if (mu_c_strcasecmp (argv[0], "MESSAGE/RFC822") == 0)
+ if (mu_c_strcasecmp (ws.ws_wordv[0], "MESSAGE/RFC822") == 0)
message_rfc822 = 1;
- else if (mu_c_strcasecmp (argv[0], "TEXT/PLAIN") == 0)
+ else if (mu_c_strcasecmp (ws.ws_wordv[0], "TEXT/PLAIN") == 0)
text_plain = 1;
- s = strchr (argv[0], '/');
+ s = strchr (ws.ws_wordv[0], '/');
if (s)
*s++ = 0;
- p = argv[0];
+ p = ws.ws_wordv[0];
io_send_qstring (p);
io_sendf (" ");
io_send_qstring (s);
/* body parameter parenthesized list: Content-type attributes */
- if (argc > 1 || text_plain)
+ if (ws.ws_wordc > 1 || text_plain)
{
int space = 0;
char *lvalue = NULL;
@@ -380,7 +401,7 @@ bodystructure (mu_message_t msg, int extension)
int i;
io_sendf (" (");
- for (i = 1; i < argc; i++)
+ for (i = 1; i < ws.ws_wordc; i++)
{
/* body parameter parenthesized list:
Content-type parameter list. */
@@ -393,25 +414,23 @@ bodystructure (mu_message_t msg, int extension)
space = 1;
}
- switch (argv[i][0])
+ switch (ws.ws_wordv[i][0])
{
case ';':
continue;
case '=':
- if (++i < argc)
+ if (++i < ws.ws_wordc)
{
- char *p = argv[i];
io_sendf (" ");
- io_send_qstring (p);
+ io_send_qstring (ws.ws_wordv[i]);
}
break;
default:
- lvalue = argv[i];
+ lvalue = ws.ws_wordv[i];
if (mu_c_strcasecmp (lvalue, "charset") == 0)
have_charset = 1;
-
}
}
@@ -432,7 +451,7 @@ bodystructure (mu_message_t msg, int extension)
}
else
io_sendf (" NIL");
- mu_argcv_free (argc, argv);
+ mu_wordsplit_free (&ws);
free (buffer);
}
else
@@ -553,13 +572,19 @@ fetch_bodystructure0 (mu_message_t message, int extension)
/* The subtype. */
if (mu_header_aget_value (header, MU_HEADER_CONTENT_TYPE, &buffer) == 0)
{
- int argc = 0;
- char **argv;
+ struct mu_wordsplit ws;
char *s;
-
- mu_argcv_get (buffer, " \t\r\n;=", NULL, &argc, &argv);
- s = strchr (argv[0], '/');
+ ws.ws_delim = " \t\r\n;=";
+ ws.ws_alloc_die = imap4d_ws_alloc_die;
+ if (mu_wordsplit (buffer, &ws, IMAP4D_WS_FLAGS))
+ {
+ mu_error (_("%s failed: %s"), "mu_wordsplit",
+ mu_wordsplit_strerror (&ws));
+ return RESP_BAD; /* FIXME: a better error handling, maybe? */
+ }
+
+ s = strchr (ws.ws_wordv[0], '/');
if (s)
s++;
io_sendf (" ");
@@ -572,7 +597,7 @@ fetch_bodystructure0 (mu_message_t message, int extension)
char *lvalue = NULL;
io_sendf (" (");
- for (i = 1; i < argc; i++)
+ for (i = 1; i < ws.ws_wordc; i++)
{
/* body parameter parenthesized list:
Content-type parameter list. */
@@ -585,22 +610,21 @@ fetch_bodystructure0 (mu_message_t message, int extension)
space = 1;
}
- switch (argv[i][0])
+ switch (ws.ws_wordv[i][0])
{
case ';':
continue;
case '=':
- if (++i < argc)
+ if (++i < ws.ws_wordc)
{
- char *p = argv[i];
io_sendf (" ");
- io_send_qstring (p);
+ io_send_qstring (ws.ws_wordv[i]);
}
break;
default:
- lvalue = argv[i];
+ lvalue = ws.ws_wordv[i];
}
}
if (lvalue)
@@ -613,7 +637,7 @@ fetch_bodystructure0 (mu_message_t message, int extension)
}
else
io_sendf (" NIL");
- mu_argcv_free (argc, argv);
+ mu_wordsplit_free (&ws);
free (buffer);
}
else

Return to:

Send suggestions and report system problems to the System administrator.