On Mon, 2 Apr 2007, Jack Bailey wrote:

> I took a look at this awhile back and it's possible to detect far end 
> disconnections by setting the socket to async IO.  The idea is arrange 
> for Unix to send the process a signal when IO is pending on the socket, 
> but it also works for disconnects.  It goes something like this:
> 
> flag = 1;
> ioctl(sockfd, FIOASYNC, &flag);
> flag = getpid();
> setpgid(0, 0);
> ioctl(sockfd, SIOCSPGRP, &flag);
> 
> I tested a hack similar to this with exim-4.66 on Solaris 10 and CentOS 
> 4.4.  Works great.

I took a look at that, and indeed, it is a way of detecting "something 
has happened on this socket", where the something might be "it's gone 
away" or it might be "there's some input waiting to be read". I was 
wondering how to distinguish the two, when the lightbulb went on over 
my head...

As this is happening at the point where Exim is about to issue a 250 
"OK, I've got your message" response, *both* those situations are 
errors. What should be the case is that the connection is still present, 
but there is no input waiting - the client should be waiting for the 
response.

In fact, the two cases can be distinguished by trying to read the next
character (and since an error is going to be generated and nothing more
accepted on the socket, the character can be ignored).

Then it struck me that there is no need to mess with signals. A simple 
call to select() can also detect this situation. I have therefore 
implemented code to do this (with some extra features for the "input 
sent too soon" case, because of buffering), and my tests seem to show 
that it works nicely, with and without TLS. 

For the "socket gone away" case, Exim just discards the message and logs 
the event. For the "input sent too soon" case, Exim sends a 550 
response, then discards the message and closes the socket.

I have committed this code to CVS, so is should be in tonight's 
snapshot. It would be good if a few people could run this code, even if 
just for testing. It is approximately what I'm intending to release as 
4.67 just as soon as I get all the documentation sorted out and various 
tests run.

Philip

-- 
Philip Hazel, University of Cambridge Computing Service.

-- 
## List details at http://www.exim.org/mailman/listinfo/exim-users 
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://www.exim.org/eximwiki/

Reply via email to