From owner-freebsd-current@FreeBSD.ORG Mon Nov 5 05:01:23 2007 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 76B8E16A417 for ; Mon, 5 Nov 2007 05:01:23 +0000 (UTC) (envelope-from ianf@clue.co.za) Received: from munchkin.clue.co.za (munchkin.clue.co.za [66.219.59.160]) by mx1.freebsd.org (Postfix) with ESMTP id 4673313C48A for ; Mon, 5 Nov 2007 05:01:23 +0000 (UTC) (envelope-from ianf@clue.co.za) DomainKey-Signature: a=rsa-sha1; q=dns; c=simple; s=20070313; d=clue.co.za; h=Received:Received:Received:To:cc:From:Subject:In-Reply-To:X-Attribution:Date:Message-Id; b=oeaPMiSoko6iKd8CQmKxRtHnIWFxiV06z+7mONJ5Aqaa6AFBtlnzMitk0OCn+3jT0U6aaRg7GK6IvSMGPLbeYUKDru75HKge+AsqmvauzQhLGbn4q/AHBCoOMRYjxJgt35X4p9xpFU+pRj7uIwOJzZqLyjXHSzspUv4PaxMwz6H02gOq1clKfZWo6lcZ2aDbUj9eTIxXYLkcXGQI7ZoE1szAKuTQASthdmDuz2SpkpWlIIgEtsiVAlRoIrcSNYAW; Received: from uucp by munchkin.clue.co.za with local-rmail (Exim 4.67) (envelope-from ) id 1Iou5G-00045H-Pt; Mon, 05 Nov 2007 05:01:10 +0000 Received: from ianf.clue.co.za ([10.0.0.6] helo=clue.co.za) by urchin.clue.co.za with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.66) (envelope-from ) id 1Iou4E-0007oV-PD; Mon, 05 Nov 2007 05:00:07 +0000 Received: from localhost ([127.0.0.1] helo=clue.co.za) by clue.co.za with esmtp (Exim 4.68 (FreeBSD)) (envelope-from ) id 1Iou4E-0000U2-66; Mon, 05 Nov 2007 07:00:06 +0200 To: Andre Oppermann From: Ian FREISLICH In-Reply-To: Message from Andre Oppermann of "Fri, 02 Nov 2007 19:36:20 +0100." <472B6E24.20200@freebsd.org> X-Attribution: BOFH Date: Mon, 05 Nov 2007 07:00:06 +0200 Message-Id: Cc: current@freebsd.org Subject: Re: sendfile() not detecting closed connections. X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Nov 2007 05:01:23 -0000 Andre Oppermann wrote: > Ian FREISLICH wrote: > > Hi > > > > System is 8.0-CURRENT. I have the following piece of code: > > > > rename(path, data); > > stat(data, &sb); > > len = snprintf(buffer, MAXBUFLEN, "BYTES %lld\r\n", sb.st_size); > > write(connection, buffer, len); > > sleep(10); > > if ((sendfile(fd, connection, 0, sb.st_size, NULL, > > &sbytes, 0)) == -1 || sbytes != sb.st_size) { > > syslog(facility, "Problem writing data: %s, wrote %lld", > > strerror(errno), sbytes); > > respool(fd, path); > > unlink(data) > > close(fd); > > return(-1); > > } > > else > > syslog(facility, "Download successful %ld", sbytes); > > close(fd); > > unlink(data); > > > > If, during the sleep, I terminate the connection so that netstat > > reports: > > > > tcp4 0 0 127.0.0.1.666 127.0.0.1.58239 CLOSE_WA IT > > tcp4 0 0 127.0.0.1.58239 127.0.0.1.666 FIN_WAIT _2 > > > > sendfile() reports success for files less than about 64k in size, > > but I haven't been able to figure out where the threshold is. It > > erroneously reports that 41000 of the 64k were sent, but will say > > the whole file was transferred up to about 64k. The connection > > filedescriptor is blocking. > > > > Any ideas? > > sendfile() reports the bytes written into the send socket buffer. If > there is a connection error it doesn't (and never did) look at how > much data was still in the socket buffer. The sendfile(2) man page > says: "[sbytes] If non-NULL, the system will write the total number > of bytes sent on the socket to the variable pointed to by sbytes." > This could be changed to subtract the remaining data in the socket > buffer before reporting back. One has to be careful though about > other writes so that the number never goes negative. There may be > more data remaining in the socket buffer than from this write attempt > alone. The connection was closed about 6 seconds before I called sendfile(). Would sendfile() write to the socket buffer of a socket closed that long ago? Ian -- Ian Freislich