}
DLLIST_REMOVE(&imap_clients, client);
- imap_parser_destroy(&client->parser);
+ imap_parser_unref(&client->parser);
io_remove(&client->io);
i_stream_unref(&client->input);
o_stream_unref(&client->output);
struct imap_client *imap_client = (struct imap_client *)client;
i_free_and_null(imap_client->proxy_backend_capability);
- imap_parser_destroy(&imap_client->parser);
+ imap_parser_unref(&imap_client->parser);
}
static void imap_client_send_greeting(struct client *client)
{
struct imap_client *imap_client = (struct imap_client *)client;
- imap_parser_destroy(&imap_client->parser);
+ imap_parser_unref(&imap_client->parser);
imap_client->parser =
imap_parser_create(imap_client->common.input,
imap_client->common.output, MAX_IMAP_LINE);
static void cmd_append_finish(struct cmd_append_context *ctx)
{
- imap_parser_destroy(&ctx->save_parser);
+ imap_parser_unref(&ctx->save_parser);
i_assert(ctx->client->input_lock == ctx->cmd);
net_set_nonblock(fd_in, TRUE);
net_set_nonblock(fd_out, TRUE);
- pool = pool_alloconly_create("imap client", 1024);
+ pool = pool_alloconly_create("imap client", 2048);
client = p_new(pool, struct client, 1);
client->pool = pool;
client->set = set;
mail_user_unref(&client->user);
if (client->free_parser != NULL)
- imap_parser_destroy(&client->free_parser);
+ imap_parser_unref(&client->free_parser);
if (client->io != NULL)
io_remove(&client->io);
if (client->to_idle_output != NULL)
client->mailbox_change_lock = NULL;
if (client->free_parser != NULL)
- imap_parser_destroy(&cmd->parser);
+ imap_parser_unref(&cmd->parser);
else {
imap_parser_reset(cmd->parser);
client->free_parser = cmd->parser;
timeout_remove(&conn->to);
if (conn->to_output != NULL)
timeout_remove(&conn->to_output);
- imap_parser_destroy(&conn->parser);
+ imap_parser_unref(&conn->parser);
io_remove(&conn->io);
if (conn->ssl_iostream != NULL)
ssl_iostream_unref(&conn->ssl_iostream);
if (!ret)
i_error("Error parsing IMAP bodystructure: %s", bodystructure);
- imap_parser_destroy(&parser);
+ imap_parser_unref(&parser);
i_stream_destroy(&input);
return ret;
}
ret = FALSE;
}
- imap_parser_destroy(&parser);
+ imap_parser_unref(&parser);
i_stream_destroy(&input);
return ret;
}
else
ret = imap_id_reply_generate_from_imap_args(args);
- imap_parser_destroy(&parser);
+ imap_parser_unref(&parser);
i_stream_destroy(&input);
return ret;
}
struct imap_parser {
/* permanent */
+ int refcount;
pool_t pool;
struct istream *input;
struct ostream *output;
struct imap_parser *parser;
parser = i_new(struct imap_parser, 1);
+ parser->refcount = 1;
parser->pool = pool_alloconly_create(MEMPOOL_GROWING"IMAP parser",
1024*10);
parser->input = input;
return parser;
}
-void imap_parser_destroy(struct imap_parser **parser)
+void imap_parser_ref(struct imap_parser *parser)
{
+ i_assert(parser->refcount > 0);
+
+ parser->refcount++;
+}
+
+void imap_parser_unref(struct imap_parser **parser)
+{
+ i_assert((*parser)->refcount > 0);
+
+ if (--(*parser)->refcount > 0)
+ return;
+
pool_unref(&(*parser)->pool);
i_free(*parser);
*parser = NULL;
struct imap_parser *
imap_parser_create(struct istream *input, struct ostream *output,
size_t max_line_size);
-void imap_parser_destroy(struct imap_parser **parser);
+void imap_parser_ref(struct imap_parser *parser);
+void imap_parser_unref(struct imap_parser **parser);
/* Reset the parser to initial state. */
void imap_parser_reset(struct imap_parser *parser);
test_assert(imap_parser_read_args(parser, 0, 0, &args) == -1);
test_assert(strcmp(imap_parser_get_error(parser, &fatal), "CR sent without LF") == 0 && !fatal);
- imap_parser_destroy(&parser);
+ imap_parser_unref(&parser);
i_stream_destroy(&input);
test_end();
}
mail_search_parser_deinit(&parser);
}
- imap_parser_destroy(&imap_parser);
+ imap_parser_unref(&imap_parser);
i_stream_destroy(&input);
return sargs;
}