commit - c3e8d2568710c9e580b7772942d7a8137ceed077
commit + 0a1c0aa333ea4415f00eea875bc6dfe967e2cfda
blob - 42ea7886024833958ca16a5344e7c82178f0163a
blob + 87884c2751b47f99d2b50af444e1b2246d4f3ff7
--- opensmtpd.c
+++ opensmtpd.c
#define NITEMS(x) (sizeof(x) / sizeof(*x))
-enum disconnect {
- DISCONNECT_FALSE = 0,
- DISCONNECT_SERVERERROR,
- DISCONNECT_SEND
+enum osmtpd_session_status {
+ SESSION_OK = 0,
+ SESSION_ERROR,
+ SESSION_DISCONNECTED
};
struct osmtpd_session {
struct osmtpd_ctx ctx; /* Must remain first element */
- enum disconnect disconnect;
+ enum osmtpd_session_status status;
RB_ENTRY(osmtpd_session) entry;
};
if (oncreatecb_session != NULL)
if ((ctx->ctx.local_session =
oncreatecb_session(&ctx->ctx)) == NULL)
- ctx->disconnect = DISCONNECT_SERVERERROR;
+ ctx->status = SESSION_ERROR;
}
ctx->ctx.type = type;
ctx->ctx.phase = phase;
osmtpd_errx(1, "Invalid line received: invalid "
"token: %s", linedup);
line = end + 1;
- if (ctx->disconnect == DISCONNECT_SERVERERROR)
+ if (ctx->status == SESSION_ERROR)
osmtpd_filter_disconnect(&ctx->ctx,
"internal server error");
}
{
void (*f)(struct osmtpd_ctx *);
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx);
}
{
void (*f)(struct osmtpd_ctx *, const char *);
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, line);
}
osmtpd_addrtoss(address, &ss, 0, linedup);
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, hostname, &ss);
}
osmtpd_err(1, "strdup");
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, identity);
}
memcpy(&session->ctx.src, &src, sizeof(session->ctx.src));
memcpy(&session->ctx.dst, &dst, sizeof(session->ctx.dst));
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, rdns, fcrdns, &src, &dst);
}
void (*f)(struct osmtpd_ctx *);
size_t i;
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx);
RB_REMOVE(osmtpd_sessions, &osmtpd_sessions, session);
osmtpd_err(1, NULL);
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, identity);
}
osmtpd_err(1, NULL);
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, identity);
}
osmtpd_err(1, NULL);
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, ciphers);
}
osmtpd_err(1, NULL);
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, username, s);
}
if (oncreatecb_message != NULL) {
session->ctx.local_message = oncreatecb_message(&session->ctx);
if (session->ctx.local_message == NULL)
- session->disconnect = DISCONNECT_SERVERERROR;
+ session->status = SESSION_ERROR;
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, imsgid);
}
osmtpd_err(1, NULL);
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid, mailfrom, status);
}
session->ctx.rcptto[i + 1] = NULL;
}
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid, rcptto, status);
}
if (cb->storereport)
session->ctx.evpid = evpid;
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid, evpid);
}
linedup);
params = end + 1;
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid, osmtpd_strtostatus(params, linedup));
}
osmtpd_errx(1, "Invalid line received: invalid msg size: %s",
linedup);
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid, msgsz);
if (ondeletecb_message != NULL && session->ctx.local_message != NULL) {
osmtpd_errx(1, "Invalid line received: invalid msgid: %s",
linedup);
- if ((f = cb->cb) != NULL && session->disconnect == DISCONNECT_FALSE)
+ if ((f = cb->cb) != NULL && session->status == SESSION_OK)
f(&session->ctx, msgid);
if (ondeletecb_message != NULL && session->ctx.local_message != NULL) {
{
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (ctx->version_major == 0 && ctx->version_minor < 5)
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (code < 200 || code > 599)
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (code < 200 || code > 599)
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (ctx->version_major == 0 && ctx->version_minor < 5)
io_vprintf(io_stdout, reason, ap);
va_end(ap);
io_printf(io_stdout, "\n");
- session->disconnect = DISCONNECT_SEND;
+ session->status = SESSION_DISCONNECTED;
}
void
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (class <= 2 || class >= 5)
io_vprintf(io_stdout, reason, ap);
va_end(ap);
io_printf(io_stdout, "\n");
- session->disconnect = DISCONNECT_SEND;
+ session->status = SESSION_DISCONNECTED;
}
void
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (ctx->version_major == 0 && ctx->version_minor < 5)
struct osmtpd_session *session = (struct osmtpd_session *)ctx;
va_list ap;
- if (session->disconnect == DISCONNECT_SEND)
+ if (session->status == SESSION_DISCONNECTED)
return;
if (ctx->version_major == 0 && ctx->version_minor < 5)