commands.c revision baca4c450997038255854aae5a1ce051e7a1f00d
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2009-2014 Dovecot authors, see the included COPYING file */
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen#define ERRSTR_TEMP_MAILBOX_FAIL "451 4.3.0 <%s> Temporary internal error"
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen#define ERRSTR_TEMP_USERDB_FAIL_PREFIX "451 4.3.0 <%s> "
fddec1bf093b45eaedcece13c649b811208e0547Timo Sirainen ERRSTR_TEMP_USERDB_FAIL_PREFIX "Temporary user lookup failure"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define LMTP_PROXY_DEFAULT_TIMEOUT_MSECS (1000*30)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint cmd_lhlo(struct client *client, const char *args)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *p;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen client_send_line(client, "501 Missing hostname");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* domain / address-literal */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen rfc822_parser_init(&parser, (const unsigned char *)args, strlen(args),
18398a5d21c88cbb34c601c6b6c1f9dea502e1caTimo Sirainen client_send_line(client, "250-%s", client->my_domain);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen client_send_line(client, "250-XCLIENT ADDR PORT TTL TIMEOUT");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen client_send_line(client, "250-ENHANCEDSTATUSCODES");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int parse_address(const char *str, const char **address_r,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **rest_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* "quoted-string"@domain */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint cmd_mail(struct client *client, const char *args)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen client_send_line(client, "503 5.5.1 MAIL already given");
if (p == NULL) {
if (!port_set)
return FALSE;
return FALSE;
return proxying;
return FALSE;
return FALSE;
return FALSE;
return TRUE;
const char *detail)
const char *domain;
int ret;
if (ret <= 0) {
if (ret < 0) {
return TRUE;
return FALSE;
return FALSE;
return TRUE;
username);
username);
return TRUE;
address);
return TRUE;
return TRUE;
return name;
return name;
return name;
return name;
return name;
const char *p, *domain;
unsigned int len;
if (p == NULL)
if (p == NULL)
if (p == NULL)
const char *errstr;
int ret;
if (ret < 0)
if (ret < 0) {
return ret;
int ret = 0;
if (ret < 0) {
username);
if (ret == 0) {
address);
if (ret == 0) {
void **sets;
int ret;
i_unreached();
ret = 0;
return ret;
unsigned int count;
int ret;
if (ret == 0)
return TRUE;
return FALSE;
FALSE);
return cinput;
static const char *wanted_headers[] = {
&box) < 0) {
if (seteuid(0) < 0)
if (old_uid == 0) {
if (seteuid(0) < 0)
return ret;
int fd;
const unsigned char *data;
if (ret == 0)
const char *const *tmp;
if (!args_ok) {
if (remote_port != 0)