From owner-freebsd-hackers Thu Jun 7 15:21: 3 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from earth.backplane.com (earth-nat-cw.backplane.com [208.161.114.67]) by hub.freebsd.org (Postfix) with ESMTP id 766B637B401 for ; Thu, 7 Jun 2001 15:21:00 -0700 (PDT) (envelope-from dillon@earth.backplane.com) Received: (from dillon@localhost) by earth.backplane.com (8.11.3/8.11.2) id f57MKwv78170; Thu, 7 Jun 2001 15:20:58 -0700 (PDT) (envelope-from dillon) Date: Thu, 7 Jun 2001 15:20:58 -0700 (PDT) From: Matt Dillon Message-Id: <200106072220.f57MKwv78170@earth.backplane.com> To: Graham Barr Cc: freebsd-hackers@FreeBSD.ORG Subject: Re: read(2) and ETIMEDOUT References: <20010607171501.S50444@pobox.com> <200106071653.f57Grsn73369@earth.backplane.com> <20010607180011.U50444@pobox.com> <200106071733.f57HXov74249@earth.backplane.com> <20010607183535.X50444@pobox.com> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG : :On Thu, Jun 07, 2001 at 10:33:50AM -0700, Matt Dillon wrote: :> :> : :> :Thanks, I will try setting errno, but I don't think it is signals. :> :I have been running truss on the process. The relevant part is :> : :> :gettimeofday(0xbfbffa54,0x0) = 0 (0x0) :> :select(0x50,0x93f8c90,0x0,0x0,0xbfbffa74) = 3 (0x3) :> :read(0x16,0xa2da000,0x8000) ERR#60 'Operation timed out' :> : :> :In fact there are no signals in the whole truss output :> : :> :Graham. :> :> What type of descriptor is the read being performed on? A TCP :> connection or, say, a reading a file over NFS? : :It is a TCP/IP connection. : :Graham. You can get this if the TCP connection times out, either through a keepalive timeout or the protocol hits the maximum number of transmit retries. I'd have to delve into the cvs logs to see when it was added, but it seems reasonable. You should treat it simply as an EIO or something like that. Generally speaking you should handle return codes from system calls by handling the codes you know about and simply assuming that anything else is fatal to the particular connection. if (systemcall(...) < 0) { switch(errno) { case EINTR: case EAGAIN: ... deal with non-blocking situations ... . . . default: ... assume everything else is a fatal error on the socket ... ... close the descriptor and cleanup its state ... } } This gives you the maximum portability between platforms and between releases. -Matt To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message