static gboolean rspamd_milter_handle_session (
struct rspamd_milter_session *session,
struct rspamd_milter_private *priv);
+static inline void rspamd_milter_plan_io (struct rspamd_milter_session *session,
+ struct rspamd_milter_private *priv, gshort what);
static GQuark
rspamd_milter_quark (void)
rspamd_ev_watcher_stop (priv->event_loop, &priv->ev);
rspamd_milter_session_reset (session, RSPAMD_MILTER_RESET_ALL);
+ close (priv->fd);
if (priv->parser.buf) {
rspamd_fstring_free (priv->parser.buf);
REF_RETAIN (session);
priv->fin_cb (priv->fd, session, priv->ud);
REF_RELEASE (session);
-
- return FALSE;
}
break;
case RSPAMD_MILTER_CMD_RCPT:
{
struct rspamd_milter_session *session;
struct rspamd_milter_private *priv;
+ gint nfd = dup (fd);
+
+ if (nfd == -1) {
+ GError *err = g_error_new (rspamd_milter_quark (), errno,
+ "dup failed: %s", strerror (errno));
+ error_cb (fd, NULL, ud, err);
+
+ return FALSE;
+ }
g_assert (finish_cb != NULL);
g_assert (error_cb != NULL);
session = g_malloc0 (sizeof (*session));
priv = g_malloc0 (sizeof (*priv));
- priv->fd = fd;
+ priv->fd = nfd;
priv->ud = ud;
priv->fin_cb = finish_cb;
priv->err_cb = error_cb;
priv->quarantine_on_reject = milter_ctx->quarantine_on_reject;
priv->ev.timeout = timeout;
- rspamd_ev_watcher_init (&priv->ev, fd, EV_READ|EV_WRITE,
+ rspamd_ev_watcher_init (&priv->ev, priv->fd, EV_READ|EV_WRITE,
rspamd_milter_io_handler, session);
if (pool) {
static void
proxy_milter_error_handler (gint fd,
- struct rspamd_milter_session *rms,
+ struct rspamd_milter_session *rms, /* unused */
void *ud, GError *err)
{
struct rspamd_proxy_session *session = ud;
- msg_info_session ("abnormally closing milter connection from: %s, "
- "error: %e",
- rspamd_inet_address_to_string_pretty (session->client_addr),
- err);
- /* Terminate session immediately */
- proxy_backend_close_connection (session->master_conn);
- REF_RELEASE (session);
+ if (err && err->code != 0) {
+ msg_info_session ("abnormally closing milter connection from: %s, "
+ "error: %e",
+ rspamd_inet_address_to_string_pretty (session->client_addr),
+ err);
+ /* Terminate session immediately */
+ proxy_backend_close_connection (session->master_conn);
+ REF_RELEASE (session);
+ }
+ else {
+ msg_info_session ("normally closing milter connection from: %s, "
+ "%e",
+ rspamd_inet_address_to_string_pretty (session->client_addr),
+ err);
+ /* Terminate session immediately */
+ proxy_backend_close_connection (session->master_conn);
+ REF_RELEASE (session);
+ }
}
static void