# HG changeset patch # User Sunil Nimmagadda # Date 1409894630 -18030 # Node ID 0cb519e770baf65f6a7a5cebde1e7ab6cf1b210c # Parent a0c73de318edf1c6fe3ab87d86d28def97258820 The sockaddr_storage returned by accept(2) belongs to session and not the listener. Move it to a place where it belongs: struct session. diff -r a0c73de318ed -r 0cb519e770ba pop3d.h --- a/pop3d.h Fri Sep 05 08:13:18 2014 +0500 +++ b/pop3d.h Fri Sep 05 10:24:20 2014 +0500 @@ -114,7 +114,6 @@ }; struct listener { - struct sockaddr_storage ss; struct event ev; struct event pause; int flags; @@ -129,14 +128,15 @@ struct session { SPLAY_ENTRY(session) entry; - struct imsgev *iev_maildrop; struct iobuf iobuf; struct io io; + struct sockaddr_storage ss; char user[ARGLEN]; char pass[ARGLEN]; size_t m_sz; size_t nmsgs; struct listener *l; + struct imsgev *iev_maildrop; uint32_t id; int flags; enum state state; @@ -146,7 +146,7 @@ void pop3_main(int [2], struct passwd *); /* session.c */ -void session_init(struct listener *, int); +void session_init(struct listener *, int, const struct sockaddr_storage *); void session_close(struct session *, int); void session_reply(struct session *, char *, ...); void session_set_state(struct session *, enum state); diff -r a0c73de318ed -r 0cb519e770ba pop3e.c --- a/pop3e.c Fri Sep 05 08:13:18 2014 +0500 +++ b/pop3e.c Fri Sep 05 10:24:20 2014 +0500 @@ -176,8 +176,7 @@ } set_nonblocking(s); - l->ss = ss; - session_init(l, s); + session_init(l, s, &ss); } static void diff -r a0c73de318ed -r 0cb519e770ba session.c --- a/session.c Fri Sep 05 08:13:18 2014 +0500 +++ b/session.c Fri Sep 05 10:24:20 2014 +0500 @@ -97,7 +97,7 @@ static int _pop3_debug = 0; void -session_init(struct listener *l, int fd) +session_init(struct listener *l, int fd, const struct sockaddr_storage *ss) { struct session *s; void *ssl; @@ -105,6 +105,7 @@ s = xcalloc(1, sizeof(*s), "session_init"); s->l = l; + memmove(&s->ss, ss, sizeof(*ss)); if (iobuf_init(&s->iobuf, 0, 0) == -1) fatal("iobuf_init"); @@ -120,7 +121,7 @@ return; } - log_connect(s->id, &l->ss, l->ss.ss_len); + log_connect(s->id, &s->ss, s->ss.ss_len); SPLAY_INSERT(session_tree, &sessions, s); session_reply(s, "%s", "+OK pop3d ready"); io_set_write(&s->io); @@ -188,7 +189,7 @@ case IO_TLSREADY: /* greet only for pop3s, STLS already greeted */ if (s->flags & POP3S) { - log_connect(s->id, &s->l->ss, s->l->ss.ss_len); + log_connect(s->id, &s->ss, s->ss.ss_len); session_reply(s, "%s", "+OK pop3 ready"); io_set_write(&s->io); }