diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-03 14:31:51 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-03 14:31:51 +0300 |
commit | 5424cc32d47c5e98b9edfb2b342d9d98d97a1175 (patch) | |
tree | bd4a0d4418b71d0024f5d66d07de2cc24aded7ec /src/lmtp.c | |
parent | 3ff032cf72164dc9aa8575c0a631f7c7b0079f46 (diff) | |
download | rspamd-5424cc32d47c5e98b9edfb2b342d9d98d97a1175.tar.gz rspamd-5424cc32d47c5e98b9edfb2b342d9d98d97a1175.zip |
* Unify socket creation and accepting by using utility functions
* Check SO_ERROR on socket immideately after connect/bind to avoid resourses allocation for
unsuccessful connections
* Avoid descriptors leakage when we create sockets and have errors on them
* Set on all socket descriptors FD_CLOEXEC flag to avoid problems with executing LDA
Diffstat (limited to 'src/lmtp.c')
-rw-r--r-- | src/lmtp.c | 20 |
1 files changed, 5 insertions, 15 deletions
diff --git a/src/lmtp.c b/src/lmtp.c index aa5c034ff..276aad0cb 100644 --- a/src/lmtp.c +++ b/src/lmtp.c @@ -209,22 +209,12 @@ accept_socket (int fd, short what, void *arg) struct worker_task *new_task; struct rspamd_lmtp_proto *lmtp; socklen_t addrlen = sizeof(ss); - int nfd, on = 1; - struct linger linger; + int nfd; - if ((nfd = accept (fd, (struct sockaddr *)&ss, &addrlen)) == -1) { + if ((nfd = accept_from_socket (fd, (struct sockaddr *)&ss, &addrlen)) == -1) { + msg_warn ("accept_socket: accept failed: %s", strerror (errno)); return; } - if (event_make_socket_nonblocking(fd) < 0) { - return; - } - - /* Socket options */ - setsockopt (nfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on)); - setsockopt (nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)); - linger.l_onoff = 1; - linger.l_linger = 2; - setsockopt (nfd, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger)); lmtp = g_malloc (sizeof (struct rspamd_lmtp_proto)); new_task = g_malloc (sizeof (struct worker_task)); @@ -276,14 +266,14 @@ start_lmtp_worker (struct rspamd_worker *worker) /* Create listen socket */ if (worker->srv->cfg->lmtp_family == AF_INET) { - if ((listen_sock = make_socket (&worker->srv->cfg->lmtp_addr, worker->srv->cfg->lmtp_port)) == -1) { + if ((listen_sock = make_tcp_socket (&worker->srv->cfg->lmtp_addr, worker->srv->cfg->lmtp_port, TRUE)) == -1) { msg_err ("start_lmtp: cannot create tcp listen socket. %s", strerror (errno)); exit(-errno); } } else { un_addr = (struct sockaddr_un *) alloca (sizeof (struct sockaddr_un)); - if (!un_addr || (listen_sock = make_unix_socket (worker->srv->cfg->lmtp_host, un_addr)) == -1) { + if (!un_addr || (listen_sock = make_unix_socket (worker->srv->cfg->lmtp_host, un_addr, TRUE)) == -1) { msg_err ("start_lmtp: cannot create unix listen socket. %s", strerror (errno)); exit(-errno); } |