struct cmd_append_context *ctx = cmd->context;
struct imap_msgpart_open_result mpresult;
uoff_t newsize;
- const char *error;
+ const char *client_error;
int ret;
/* catenate URL */
- ret = imap_msgpart_url_read_part(mpurl, &mpresult, &error);
+ ret = imap_msgpart_url_read_part(mpurl, &mpresult, &client_error);
if (ret < 0) {
client_send_box_error(cmd, ctx->box);
return -1;
if (ret == 0) {
/* invalid url, abort */
client_send_tagline(cmd,
- t_strdup_printf("NO [BADURL %s] %s.", caturl, error));
+ t_strdup_printf("NO [BADURL %s] %s.",
+ caturl, client_error));
return -1;
}
if (mpresult.size == 0) {
{
struct cmd_append_context *ctx = cmd->context;
struct imap_msgpart_url *mpurl;
- const char *error;
+ const char *client_error;
int ret;
if (ctx->failed)
return -1;
ret = imap_msgpart_url_parse(cmd->client->user, cmd->client->mailbox,
- caturl, &mpurl, &error);
+ caturl, &mpurl, &client_error);
if (ret < 0) {
client_send_box_error(cmd, ctx->box);
return -1;
if (ret == 0) {
/* invalid url, abort */
client_send_tagline(cmd,
- t_strdup_printf("NO [BADURL %s] %s.", caturl, error));
+ t_strdup_printf("NO [BADURL %s] %s.",
+ caturl, client_error));
return -1;
}
ret = cmd_append_catenate_mpurl(cmd, caturl, mpurl);
struct client *client = cmd->client;
struct cmd_append_context *ctx = cmd->context;
const struct imap_arg *args;
- const char *msg;
+ const char *client_error;
enum imap_parser_error parse_error;
bool nonsync = FALSE;
int ret;
IMAP_PARSE_FLAG_INSIDE_LIST, &args);
} while (ret > 0 && !catenate_args_can_stop(ctx, args));
if (ret == -1) {
- msg = imap_parser_get_error(ctx->save_parser, &parse_error);
+ client_error = imap_parser_get_error(ctx->save_parser,
+ &parse_error);
switch (parse_error) {
case IMAP_PARSE_ERROR_NONE:
i_unreached();
case IMAP_PARSE_ERROR_LITERAL_TOO_BIG:
client_send_line(client, t_strconcat("* BYE ",
(client->set->imap_literal_minus ? "[TOOBIG] " : ""),
- msg, NULL));
- client_disconnect(client, msg);
+ client_error, NULL));
+ client_disconnect(client, client_error);
break;
default:
if (!ctx->failed)
- client_send_command_error(cmd, msg);
+ client_send_command_error(cmd, client_error);
}
client->input_skip_line = TRUE;
cmd_append_finish(ctx);
struct client *client = cmd->client;
struct cmd_append_context *ctx = cmd->context;
const struct imap_arg *args;
- const char *msg;
+ const char *client_error;
enum imap_parser_error parse_error;
unsigned int arg_min_count;
bool nonsync, last_literal;
!cmd_append_args_can_stop(ctx, args, &last_literal));
if (ret == -1) {
if (!ctx->failed) {
- msg = imap_parser_get_error(ctx->save_parser, &parse_error);
+ client_error = imap_parser_get_error(ctx->save_parser, &parse_error);
switch (parse_error) {
case IMAP_PARSE_ERROR_NONE:
i_unreached();
case IMAP_PARSE_ERROR_LITERAL_TOO_BIG:
client_send_line(client, t_strconcat("* BYE ",
(client->set->imap_literal_minus ? "[TOOBIG] " : ""),
- msg, NULL));
- client_disconnect(client, msg);
+ client_error, NULL));
+ client_disconnect(client, client_error);
break;
default:
- client_send_command_error(cmd, msg);
+ client_send_command_error(cmd, client_error);
}
}
cmd_append_finish(ctx);
struct client *client = cmd->client;
struct mail_namespace *ns;
struct mailbox *box;
- const char *name, *errstr;
+ const char *name, *client_error;
enum mail_error error;
bool disconnect = FALSE;
if (mailbox_delete(box) == 0)
client_send_tagline(cmd, "OK Delete completed.");
else {
- errstr = mailbox_get_last_error(box, &error);
+ client_error = mailbox_get_last_error(box, &error);
if (error != MAIL_ERROR_EXISTS)
client_send_box_error(cmd, box);
else {
/* mailbox has children */
- client_send_tagline(cmd, t_strdup_printf("NO %s", errstr));
+ client_send_tagline(cmd, t_strdup_printf("NO %s",
+ client_error));
}
}
mailbox_free(&box);
}
if (imap_fetch_end(ctx) < 0) {
- const char *errstr;
+ const char *client_error;
if (cmd->client->output->closed) {
/* If we're canceling we need to finish this command
}
if (ctx->error == MAIL_ERROR_NONE)
- errstr = mailbox_get_last_error(cmd->client->mailbox, &error);
+ client_error = mailbox_get_last_error(cmd->client->mailbox, &error);
else {
- errstr = ctx->errstr;
+ client_error = ctx->errstr;
error = ctx->error;
}
if (error == MAIL_ERROR_CONVERSION) {
/* BINARY found unsupported Content-Transfer-Encoding */
tagged_reply = t_strdup_printf(
- "NO ["IMAP_RESP_CODE_UNKNOWN_CTE"] %s", errstr);
+ "NO ["IMAP_RESP_CODE_UNKNOWN_CTE"] %s", client_error);
} else if (error == MAIL_ERROR_INVALIDDATA) {
/* Content was invalid */
tagged_reply = t_strdup_printf(
- "NO ["IMAP_RESP_CODE_PARSE"] %s", errstr);
+ "NO ["IMAP_RESP_CODE_PARSE"] %s", client_error);
} else if (cmd->client->set->parsed_fetch_failure != IMAP_CLIENT_FETCH_FAILURE_NO_AFTER ||
imap_fetch_is_failed_retry(ctx)) {
/* By default we never want to reply NO to FETCH
about what they should on NO. A disconnection causes
less confusion. */
client_disconnect_with_error(cmd->client,
- t_strconcat("FETCH failed: ", errstr, NULL));
+ t_strconcat("FETCH failed: ", client_error, NULL));
imap_fetch_free(&ctx);
return TRUE;
} else {
we avoid infinitely retries from client.) */
imap_fetch_add_failed_uids(ctx);
tagged_reply = t_strdup_printf(
- "NO ["IMAP_RESP_CODE_SERVERBUG"] %s", errstr);
+ "NO ["IMAP_RESP_CODE_SERVERBUG"] %s", client_error);
}
}
imap_fetch_free(&ctx);
response = t_str_new(1024);
str_append(response, "* GENURLAUTH");
for (;;) {
- const char *url_rump, *mechanism, *url, *error;
+ const char *url_rump, *mechanism, *url, *client_error;
if (IMAP_ARG_IS_EOL(args))
break;
}
ret = imap_urlauth_generate(cmd->client->urlauth_ctx,
- mechanism, url_rump, &url, &error);
+ mechanism, url_rump, &url,
+ &client_error);
if (ret <= 0) {
if (ret < 0)
client_send_internal_error(cmd);
else
- client_send_command_error(cmd, error);
+ client_send_command_error(cmd, client_error);
return TRUE;
}
imap_metadata_parse_entry_names(struct imap_getmetadata_context *ctx,
const struct imap_arg *entries)
{
- const char *value, *error;
+ const char *value, *client_error;
p_array_init(&ctx->entries, ctx->cmd->pool, 4);
for (; !IMAP_ARG_IS_EOL(entries); entries++) {
client_send_command_error(ctx->cmd, "Entry isn't astring");
return FALSE;
}
- if (!imap_metadata_verify_entry_name(value, &error)) {
- client_send_command_error(ctx->cmd, error);
+ if (!imap_metadata_verify_entry_name(value, &client_error)) {
+ client_send_command_error(ctx->cmd, client_error);
return FALSE;
}
}
if ((ctx->global_used_events & UNSUPPORTED_EVENTS) != 0) {
- string_t *str = t_str_new(128);
+ string_t *client_error = t_str_new(128);
unsigned int i;
- str_append(str, "NO [BADEVENT");
+ str_append(client_error, "NO [BADEVENT");
for (i = 0; i < N_ELEMENTS(imap_notify_event_names); i++) {
if ((ctx->global_used_events & (1 << i)) != 0 &&
((1 << i) & UNSUPPORTED_EVENTS) != 0) {
- str_append_c(str, ' ');
- str_append(str, imap_notify_event_names[i]);
+ str_append_c(client_error, ' ');
+ str_append(client_error, imap_notify_event_names[i]);
}
}
- str_append(str, "] Unsupported NOTIFY events.");
- client_send_tagline(cmd, str_c(str));
+ str_append(client_error, "] Unsupported NOTIFY events.");
+ client_send_tagline(cmd, str_c(client_error));
pool_unref(&pool);
return TRUE;
}
struct client *client = cmd->client;
struct imap_select_context *ctx;
const struct imap_arg *args, *list_args;
- const char *mailbox, *error;
+ const char *mailbox, *client_error;
int ret;
/* <mailbox> [(optional parameters)] */
ctx = p_new(cmd->pool, struct imap_select_context, 1);
ctx->cmd = cmd;
- ctx->ns = client_find_namespace_full(cmd->client, &mailbox, &error);
+ ctx->ns = client_find_namespace_full(cmd->client, &mailbox, &client_error);
if (ctx->ns == NULL) {
/* send * OK [CLOSED] before the tagged reply */
close_selected_mailbox(client);
- client_send_tagline(cmd, error);
+ client_send_tagline(cmd, client_error);
return TRUE;
}
if (imap_arg_get_list(&args[1], &list_args)) {
- if (!select_parse_options(ctx, list_args, &error)) {
+ if (!select_parse_options(ctx, list_args, &client_error)) {
select_context_free(ctx);
/* send * OK [CLOSED] before the tagged reply */
close_selected_mailbox(client);
- client_send_command_error(ctx->cmd, error);
+ client_send_command_error(ctx->cmd, client_error);
return TRUE;
}
}
const struct imap_arg **value_r)
{
const struct imap_arg *args;
- const char *name, *error;
+ const char *name, *client_error;
enum imap_parser_error parse_error;
int ret;
if (ret < 0) {
if (ret == -2)
return 0;
- error = imap_parser_get_error(ctx->parser, &parse_error);
+ client_error = imap_parser_get_error(ctx->parser, &parse_error);
switch (parse_error) {
case IMAP_PARSE_ERROR_NONE:
i_unreached();
case IMAP_PARSE_ERROR_LITERAL_TOO_BIG:
- client_disconnect_with_error(ctx->cmd->client, error);
+ client_disconnect_with_error(ctx->cmd->client,
+ client_error);
break;
default:
- client_send_command_error(ctx->cmd, error);
+ client_send_command_error(ctx->cmd, client_error);
break;
}
return -1;
return -1;
}
if (!ctx->cmd_error_sent &&
- !imap_metadata_verify_entry_name(name, &error)) {
- client_send_command_error(ctx->cmd, error);
+ !imap_metadata_verify_entry_name(name, &client_error)) {
+ client_send_command_error(ctx->cmd, client_error);
ctx->cmd_error_sent = TRUE;
}
if (ctx->cmd_error_sent) {
static bool cmd_setmetadata_continue(struct client_command_context *cmd)
{
struct imap_setmetadata_context *ctx = cmd->context;
- const char *entry, *error_string;
+ const char *entry, *client_error;
enum mail_error error;
const struct imap_arg *value;
int ret;
} else if (ctx->storage_failure) {
if (ctx->box == NULL)
client_disconnect_if_inconsistent(cmd->client);
- error_string = imap_metadata_transaction_get_last_error
+ client_error = imap_metadata_transaction_get_last_error
(ctx->trans, &error);
client_send_tagline(cmd,
- imap_get_error_string(cmd, error_string, error));
+ imap_get_error_string(cmd, client_error, error));
} else if (imap_metadata_transaction_commit(&ctx->trans,
- &error, &error_string) < 0) {
+ &error, &client_error) < 0) {
if (ctx->box == NULL)
client_disconnect_if_inconsistent(cmd->client);
client_send_tagline(cmd,
- imap_get_error_string(cmd, error_string, error));
+ imap_get_error_string(cmd, client_error, error));
} else {
client_send_tagline(cmd, "OK Setmetadata completed.");
}
client->to_idle = timeout_add(0, client_destroy_timeout, client);
}
-void client_disconnect_with_error(struct client *client, const char *msg)
+void client_disconnect_with_error(struct client *client,
+ const char *client_error)
{
- client_send_line(client, t_strconcat("* BYE ", msg, NULL));
- client_disconnect(client, msg);
+ client_send_line(client, t_strconcat("* BYE ", client_error, NULL));
+ client_disconnect(client, client_error);
}
void client_add_capability(struct client *client, const char *capability)
}
void client_send_command_error(struct client_command_context *cmd,
- const char *msg)
+ const char *client_error)
{
struct client *client = cmd->client;
const char *error, *cmd_name;
enum imap_parser_error parse_error;
- if (msg == NULL) {
- msg = imap_parser_get_error(cmd->parser, &parse_error);
+ if (client_error == NULL) {
+ client_error = imap_parser_get_error(cmd->parser, &parse_error);
switch (parse_error) {
case IMAP_PARSE_ERROR_NONE:
i_unreached();
case IMAP_PARSE_ERROR_LITERAL_TOO_BIG:
- client_disconnect_with_error(client, msg);
+ client_disconnect_with_error(client, client_error);
return;
default:
break;
}
if (cmd->tag == NULL)
- error = t_strconcat("BAD Error in IMAP tag: ", msg, NULL);
+ error = t_strconcat("BAD Error in IMAP tag: ", client_error, NULL);
else if (cmd->name == NULL)
- error = t_strconcat("BAD Error in IMAP command: ", msg, NULL);
+ error = t_strconcat("BAD Error in IMAP command: ", client_error, NULL);
else {
cmd_name = t_str_ucase(cmd->name);
error = t_strconcat("BAD Error in IMAP command ",
- cmd_name, ": ", msg, NULL);
+ cmd_name, ": ", client_error, NULL);
}
client_send_tagline(cmd, error);
/* Disconnect client connection */
void client_disconnect(struct client *client, const char *reason);
-void client_disconnect_with_error(struct client *client, const char *msg);
+void client_disconnect_with_error(struct client *client,
+ const char *client_error);
/* Add the given capability to the CAPABILITY reply. If imap_capability setting
has an explicit capability, nothing is changed. */
void client_send_tagline(struct client_command_context *cmd, const char *data);
/* Send a BAD command reply to client via client_send_tagline(). If there have
- been too many command errors, the client is disconnected. msg may be NULL,
- in which case the error is looked up from imap_parser. */
+ been too many command errors, the client is disconnected. client_error may
+ be NULL, in which case the error is looked up from imap_parser. */
void client_send_command_error(struct client_command_context *cmd,
- const char *msg);
+ const char *client_error);
/* Send a NO command reply with the default internal error message to client
via client_send_tagline(). */
struct mail_namespace *
client_find_namespace_full(struct client *client,
- const char **mailbox, const char **error_r)
+ const char **mailbox, const char **client_error_r)
{
struct mail_namespace *namespaces = client->user->namespaces;
struct mail_namespace *ns;
utf8_name = t_str_new(64);
if (imap_utf7_to_utf8(*mailbox, utf8_name) < 0) {
- *error_r = "NO Mailbox name is not valid mUTF-7";
+ *client_error_r = "NO Mailbox name is not valid mUTF-7";
return NULL;
}
ns->prefix_len == 0) {
/* this matched only the autocreated prefix="" namespace.
give a nice human-readable error message */
- *error_r = t_strdup_printf(
+ *client_error_r = t_strdup_printf(
"NO Client tried to access nonexistent namespace. "
"(Mailbox name should probably be prefixed with: %s)",
mail_namespace_find_inbox(namespaces)->prefix);
client_find_namespace(struct client_command_context *cmd, const char **mailbox)
{
struct mail_namespace *ns;
- const char *error;
+ const char *client_error;
- ns = client_find_namespace_full(cmd->client, mailbox, &error);
+ ns = client_find_namespace_full(cmd->client, mailbox, &client_error);
if (ns == NULL)
- client_send_tagline(cmd, error);
+ client_send_tagline(cmd, client_error);
return ns;
}
client_find_namespace(struct client_command_context *cmd, const char **mailbox);
struct mail_namespace *
client_find_namespace_full(struct client *client,
- const char **mailbox, const char **error_r);
+ const char **mailbox, const char **client_error_r);
/* Returns TRUE if mailbox is selected. If not, sends "No mailbox selected"
error message to client. */
int imap_fetch_att_list_parse(struct client *client, pool_t pool,
const struct imap_arg *list,
struct imap_fetch_context **fetch_ctx_r,
- const char **error_r)
+ const char **client_error_r)
{
struct imap_fetch_init_context init_ctx;
const char *str;
init_ctx.name = t_str_ucase(str);
init_ctx.args++;
if (!imap_fetch_init_handler(&init_ctx)) {
- *error_r = t_strconcat("Invalid fetch-att list: ",
- init_ctx.error, NULL);
+ *client_error_r = t_strconcat("Invalid fetch-att list: ",
+ init_ctx.error, NULL);
imap_fetch_free(&init_ctx.fetch_ctx);
return -1;
}
}
if (!IMAP_ARG_IS_EOL(init_ctx.args)) {
- *error_r = "fetch-att list contains non-atoms.";
+ *client_error_r = "fetch-att list contains non-atoms.";
imap_fetch_free(&init_ctx.fetch_ctx);
return -1;
}
int imap_fetch_att_list_parse(struct client *client, pool_t pool,
const struct imap_arg *list,
struct imap_fetch_context **fetch_ctx_r,
- const char **error_r);
+ const char **client_error_r);
struct imap_fetch_context *
imap_fetch_alloc(struct client *client, pool_t pool, const char *reason);
{
struct mail_search_parser *parser;
struct mail_search_args *sargs;
- const char *error;
+ const char *client_error;
int ret;
if (IMAP_ARG_IS_EOL(args)) {
parser = mail_search_parser_init_imap(args);
ret = mail_search_build(mail_search_register_get_imap(),
- parser, &charset, &sargs, &error);
+ parser, &charset, &sargs, &client_error);
mail_search_parser_deinit(&parser);
if (ret < 0) {
if (charset == NULL) {
client_send_tagline(cmd, t_strconcat(
- "BAD [BADCHARSET] ", error, NULL));
+ "BAD [BADCHARSET] ", client_error, NULL));
} else {
- client_send_command_error(cmd, error);
+ client_send_command_error(cmd, client_error);
}
return -1;
}
const char *set, bool uid,
struct mail_search_args **search_args_r)
{
- const char *error = NULL;
+ const char *client_error = NULL;
int ret;
if (strcmp(set, "$") == 0) {
}
if (!uid) {
ret = imap_search_get_msgset_arg(cmd, set, search_args_r,
- &error);
+ &client_error);
} else {
- ret = imap_search_get_uidset_arg(set, search_args_r, &error);
+ ret = imap_search_get_uidset_arg(set, search_args_r,
+ &client_error);
}
if (ret < 0) {
- client_send_command_error(cmd, error);
+ client_send_command_error(cmd, client_error);
return -1;
}
return 1;
search_parse_fetch_att(struct imap_search_context *ctx,
const struct imap_arg *update_args)
{
- const char *error;
+ const char *client_error;
ctx->fetch_pool = pool_alloconly_create("search update fetch", 512);
if (imap_fetch_att_list_parse(ctx->cmd->client, ctx->fetch_pool,
- update_args, &ctx->fetch_ctx, &error) < 0) {
+ update_args, &ctx->fetch_ctx,
+ &client_error) < 0) {
client_send_command_error(ctx->cmd, t_strconcat(
- "SEARCH UPDATE fetch-att: ", error, NULL));
+ "SEARCH UPDATE fetch-att: ", client_error, NULL));
pool_unref(&ctx->fetch_pool);
return FALSE;
}
int mail_search_build(struct mail_search_register *reg,
struct mail_search_parser *parser, const char **charset,
- struct mail_search_args **args_r, const char **error_r)
+ struct mail_search_args **args_r,
+ const char **client_error_r)
{
struct mail_search_build_context ctx;
struct mail_search_args *args;
int ret;
*args_r = NULL;
- *error_r = NULL;
+ *client_error_r = NULL;
i_zero(&ctx);
ctx.args = args = mail_search_build_init();
ret = mail_search_build_get_utf8(&ctx, "", &str);
}
if (ret < 0) {
- *error_r = ctx._error != NULL ? t_strdup(ctx._error) :
+ *client_error_r = ctx._error != NULL ? t_strdup(ctx._error) :
t_strdup(mail_search_parser_get_error(parser));
if (ctx.unknown_charset)
*charset = NULL;
If charset is unknown, it's changed to NULL. */
int mail_search_build(struct mail_search_register *reg,
struct mail_search_parser *parser, const char **charset,
- struct mail_search_args **args_r, const char **error_r);
+ struct mail_search_args **args_r,
+ const char **client_error_r);
/* Add new search arg with given type. */
struct mail_search_arg *