diff options
Diffstat (limited to 'src/lib-smtp/smtp-server-cmd-noop.c')
-rw-r--r-- | src/lib-smtp/smtp-server-cmd-noop.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib-smtp/smtp-server-cmd-noop.c b/src/lib-smtp/smtp-server-cmd-noop.c new file mode 100644 index 0000000..86e426f --- /dev/null +++ b/src/lib-smtp/smtp-server-cmd-noop.c @@ -0,0 +1,52 @@ +/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "smtp-syntax.h" + +#include "smtp-server-private.h" + +/* NOOP command */ + +void smtp_server_cmd_noop(struct smtp_server_cmd_ctx *cmd, + const char *params) +{ + struct smtp_server_connection *conn = cmd->conn; + struct smtp_server_command *command = cmd->cmd; + const struct smtp_server_callbacks *callbacks = conn->callbacks; + const char *param, *error; + int ret; + + /* "NOOP" [ SP String ] CRLF */ + ret = smtp_string_parse(params, ¶m, &error); + if (ret < 0) { + smtp_server_reply(cmd, 501, "5.5.4", + "Invalid string parameter: %s", + error); + return; + } + + smtp_server_command_input_lock(cmd); + + smtp_server_command_ref(command); + if (callbacks != NULL && callbacks->conn_cmd_noop != NULL) { + /* specific implementation of NOOP command */ + ret = callbacks->conn_cmd_noop(conn->context, cmd); + if (ret <= 0) { + i_assert(ret == 0 || + smtp_server_command_is_replied(command)); + /* command is waiting for external event or it failed */ + smtp_server_command_unref(&command); + return; + } + } + if (!smtp_server_command_is_replied(command)) + smtp_server_cmd_noop_reply_success(cmd); + smtp_server_command_unref(&command); +} + +void smtp_server_cmd_noop_reply_success(struct smtp_server_cmd_ctx *cmd) +{ + i_assert(cmd->cmd->reg->func == smtp_server_cmd_noop); + + smtp_server_reply(cmd, 250, "2.0.0", "OK"); +} |