summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pop3d.h2
-rw-r--r--session.c32
2 files changed, 23 insertions, 11 deletions
diff --git a/pop3d.h b/pop3d.h
index 8032fdf..72f50e5 100644
--- a/pop3d.h
+++ b/pop3d.h
@@ -129,7 +129,7 @@ enum state {
struct session {
SPLAY_ENTRY(session) entry;
- struct imsgev iev_maildrop;
+ struct imsgev *iev_maildrop;
struct iobuf iobuf;
struct io io;
char user[ARGLEN];
diff --git a/session.c b/session.c
index a69b9b7..0db47de 100644
--- a/session.c
+++ b/session.c
@@ -94,7 +94,7 @@ static void session_write(struct session *, const char *, size_t);
static const char *strstate(enum state);
struct session_tree sessions;
-static int _pop3_debug = 1;
+static int _pop3_debug = 0;
void
session_init(struct listener *l, int fd)
@@ -147,7 +147,14 @@ session_close(struct session *s, int flush)
io_clear(&entry->io);
iobuf_clear(&entry->iobuf);
- imsgev_clear(&entry->iev_maildrop);
+ /*
+ * If the session hadn't made it to TRANSACTION
+ * iev_maildrop is not inited.
+ */
+ if (entry->iev_maildrop) {
+ imsgev_clear(entry->iev_maildrop);
+ entry->iev_maildrop->terminate = 1;
+ }
logit(LOG_INFO, "%u: session closed", entry->id);
free(entry);
}
@@ -373,7 +380,7 @@ trans_command(struct session *s, int cmd, char *args)
case CMD_RETR:
if (!get_index(s, args, &retr_req.idx))
break;
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_RETR,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_RETR,
s->id, 0, -1, &retr_req, sizeof(retr_req), "trans_command");
return;
case CMD_NOOP:
@@ -382,11 +389,11 @@ trans_command(struct session *s, int cmd, char *args)
case CMD_DELE:
if (!get_index(s, args, &idx))
break;
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_DELE,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_DELE,
s->id, 0, -1, &idx, sizeof(idx), "trans_command");
return;
case CMD_RSET:
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_RSET,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_RSET,
s->id, 0, -1, NULL, 0, "trans_command");
return;
case CMD_UIDL:
@@ -401,7 +408,7 @@ trans_command(struct session *s, int cmd, char *args)
get_list_all(s, uidl);
return;
case CMD_QUIT:
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_UPDATE,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_UPDATE,
s->id, 0, -1, NULL, 0, "trans_command");
session_set_state(s, UPDATE);
return;
@@ -418,7 +425,7 @@ get_list_all(struct session *s, int uidl)
{
io_pause(&s->io, IO_PAUSE_IN);
session_reply(s, "+OK");
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_LISTALL,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_LISTALL,
s->id, 0, -1, &uidl, sizeof(uidl), "list_all");
}
@@ -429,15 +436,17 @@ get_list(struct session *s, unsigned int i, int uidl)
req.idx = i;
req.uidl = uidl;
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_LIST,
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_LIST,
s->id, 0, -1, &req, sizeof(req), "list");
}
void
session_imsgev_init(struct session *s, int fd)
{
- imsgev_init(&s->iev_maildrop, fd, NULL, maildrop_imsgev, needfd);
- imsgev_xcompose(&s->iev_maildrop, IMSG_MAILDROP_INIT, s->id, 0,
+ s->iev_maildrop = xcalloc(1, sizeof(struct imsgev),
+ "session_imsgev_init");
+ imsgev_init(s->iev_maildrop, fd, NULL, maildrop_imsgev, needfd);
+ imsgev_xcompose(s->iev_maildrop, IMSG_MAILDROP_INIT, s->id, 0,
-1, s->user, sizeof(s->user), "session_imsgev_init");
}
@@ -488,6 +497,9 @@ maildrop_imsgev(struct imsgev *iev, int code, struct imsg *imsg)
case IMSGEV_EIMSG:
fatal("session: imsgev read/write error");
break;
+ case IMSGEV_DONE:
+ free(iev);
+ break;
}
}