From owner-freebsd-arch@FreeBSD.ORG Wed Aug 1 07:19:58 2012 Return-Path: Delivered-To: arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5FA44106564A; Wed, 1 Aug 2012 07:19:58 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.zoral.com.ua (mx0.zoral.com.ua [91.193.166.200]) by mx1.freebsd.org (Postfix) with ESMTP id D48648FC16; Wed, 1 Aug 2012 07:19:57 +0000 (UTC) Received: from skuns.kiev.zoral.com.ua (localhost [127.0.0.1]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id q717Jlmb060448; Wed, 1 Aug 2012 10:19:47 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5) with ESMTP id q717JZPD071754; Wed, 1 Aug 2012 10:19:35 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5/Submit) id q717JZqw071753; Wed, 1 Aug 2012 10:19:35 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Wed, 1 Aug 2012 10:19:34 +0300 From: Konstantin Belousov To: David Xu Message-ID: <20120801071934.GJ2676@deviant.kiev.zoral.com.ua> References: <5018992C.8000207@freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="7zuzT4v7lqAOytwt" Content-Disposition: inline In-Reply-To: <5018992C.8000207@freebsd.org> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.2 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.0 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua Cc: arch@freebsd.org Subject: Re: short read/write and error code X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Aug 2012 07:19:58 -0000 --7zuzT4v7lqAOytwt Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Aug 01, 2012 at 10:49:16AM +0800, David Xu wrote: > POSIX requires write() to return actually bytes written, same rule is > applied to read(). >=20 > http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html > >ETURN VALUE > > > >Upon successful completion, write() [XSI] and pwrite() shall > > return the number of bytes actually written to the file associated > >with fildes. This number shall never be greater than nbyte. > > Otherwise, -1 shall be returned and errno set to indicate the error. >=20 >=20 > http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html > >RETURN VALUE > > > >Upon successful completion, read() [XSI] and pread() shall return > > a non-negative integer indicating the number of bytes actually read. > > Otherwise, the functions shall return -1 and set errno to indicate > > the error. Note that the wording is only about successful return, not for the case when error occured. I do think that if fo_read() returned an error, and error is not of the kind 'interruption', then the error shall be returned as is. >=20 > I have following patch to fix our code to be compatible with POSIX: =2E.. > -current only resets error code to zero for short write when code is > ERESTART, EINTR or EWOULDBLOCK. > But this is incorrect, at least for pipe, when EPIPE is returned, > some bytes may have already been written. For a named pipe, I may don't > care a reader is disappeared or not, because for named pipe, a new > reader can come in and talk with writer again, so I need to know > how many bytes have been written, same is applied to reader, I don't > care writer is gone, it can come in again and talk with reader. So I > suggest to remove surplus code in -current's dofilewrite() and > dofileread(). Then fix the pipe code, and not introduce the behaviour change for all file types ? > For EPIPE, We still deliver SIGPIPE to current thread, but returns > actually bytes written. And this sounds wrong. I think that fixing the code for pipes would also semi-magically makes this correct. --7zuzT4v7lqAOytwt Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (FreeBSD) iEYEARECAAYFAlAY2IYACgkQC3+MBN1Mb4i/nACfeLJqzJODvs40AFHUWi2MFptZ Eq4An2ksw/y+tc6zSYw10+gHumPf5XP1 =bfiK -----END PGP SIGNATURE----- --7zuzT4v7lqAOytwt--