Re: [PATCH] Properly handle short writes in sigint handlers
authorTomi Ollila <tomi.ollila@iki.fi>
Wed, 11 Jan 2012 13:04:51 +0000 (15:04 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:41:54 +0000 (09:41 -0800)
97/8642d8ae9079f384a78d74a12774e55af7807a [new file with mode: 0644]

diff --git a/97/8642d8ae9079f384a78d74a12774e55af7807a b/97/8642d8ae9079f384a78d74a12774e55af7807a
new file mode 100644 (file)
index 0000000..84ccb51
--- /dev/null
@@ -0,0 +1,131 @@
+Return-Path: <tomi.ollila@nixu.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id E9723431FD0\r
+       for <notmuch@notmuchmail.org>; Wed, 11 Jan 2012 05:04:58 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
+       autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id wIU0p77f67uZ for <notmuch@notmuchmail.org>;\r
+       Wed, 11 Jan 2012 05:04:58 -0800 (PST)\r
+Received: from mail-gw3.nixu.fi (mail-gw3.nixu.fi [193.209.237.7])\r
+       (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id C8B43431FB6\r
+       for <notmuch@notmuchmail.org>; Wed, 11 Jan 2012 05:04:57 -0800 (PST)\r
+Received: from pps.filterd (mail-gw3 [127.0.0.1])\r
+       by mail-gw3.nixu.fi (8.14.4/8.14.4) with SMTP id q0BD0AAp025938;\r
+       Wed, 11 Jan 2012 15:04:53 +0200\r
+Received: from taco2.nixu.fi (taco2.nixu.fi [194.197.118.31])\r
+       by mail-gw3.nixu.fi with ESMTP id 114cs0yuq6-1\r
+       (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+       Wed, 11 Jan 2012 15:04:52 +0200\r
+Received: from taco2.nixu.fi (taco2.nixu.fi [194.197.118.31])\r
+       by taco2.nixu.fi (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id\r
+       q0BD4pCw010747; Wed, 11 Jan 2012 15:04:51 +0200\r
+From: Tomi Ollila <tomi.ollila@iki.fi>\r
+To: David Bremner <david@tethera.net>,\r
+       Dmitry Kurochkin <dmitry.kurochkin@gmail.com>,\r
+       Austin Clements <amdragon@MIT.EDU>, notmuch@notmuchmail.org\r
+Subject: Re: [PATCH] Properly handle short writes in sigint handlers\r
+In-Reply-To: <87sjjnkdxt.fsf@zancas.localnet>\r
+References: <20111222201553.GK10376@mit.edu>\r
+       <1324584948-8009-1-git-send-email-amdragon@mit.edu>\r
+       <87fwgbkst0.fsf@gmail.com> <87sjjnkdxt.fsf@zancas.localnet>\r
+User-Agent: Notmuch/0.10.2+176~g3f9d738 (http://notmuchmail.org) Emacs/23.3.1\r
+       (i686-pc-linux-gnu)\r
+X-Face: HhBM'cA~<r"^Xv\KRN0P{vn'Y"Kd;zg_y3S[4)KSN~s?O\"QPoL\r
+       $[Xv_BD:i/F$WiEWax}R(MPS`^UaptOGD`*/=@\1lKoVa9tnrg0TW?"r7aRtgk[F\r
+       !)g;OY^,BjTbr)Np:%c_o'jj,Z\r
+Date: Wed, 11 Jan 2012 15:04:51 +0200\r
+Message-ID: <yf6vcoi4cgc.fsf@taco2.nixu.fi>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=us-ascii\r
+X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.5.7110,\r
+ 1.0.211,      0.0.0000        definitions=2012-01-11_03:2012-01-11, 2012-01-11,\r
+       1970-01-01 signatures=0\r
+X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0\r
+       ipscore=0 suspectscore=0\r
+       phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0\r
+       reason=mlx\r
+       scancount=1 engine=6.0.2-1012030000 definitions=main-1201110075\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Wed, 11 Jan 2012 13:04:59 -0000\r
+\r
+On Tue, 10 Jan 2012 07:13:50 -0400, David Bremner <david@tethera.net> wrote:\r
+> On Fri, 23 Dec 2011 23:10:35 +0400, Dmitry Kurochkin <dmitry.kurochkin@gmail.com> wrote:\r
+> > Hi Austin.\r
+> > \r
+> > I think we should put the write loop into a separate function and reuse\r
+> > it.\r
+> \r
+> I could go either way on this, unless there is somewhere else the code\r
+> is actually needed at the moment.\r
+> \r
+> > \r
+> > Also, does it make sense to add a retry counter to prevent infinite loop\r
+> > if write keeps returning 0?\r
+> \r
+> I wonder about this too. Is this possibility ignorable Austin?\r
+\r
+In this particular case the consensus was to just ignore the short\r
+write (in rare cases that may happen)... And we could use the\r
+first patch: id:"1324503532-5799-1-git-send-email-dme@dme.org"\r
+\r
+For other cases we might try to find a good implementation of \r
+"writefully()". OpenSSH atomicio.[ch] looks like a good place to start...\r
+\r
+... writefully () from that code could look something like:\r
+\r
+/* 2-clause license ("Simplified BSD License" or "FreeBSD License") */\r
+size_t writefully(int fd, const void * data, size_t n)\r
+{\r
+       const char *s = (const char *)data;\r
+       size_t pos = 0;\r
+       ssize_t res;\r
+\r
+       while (n > pos) {\r
+               res = write(fd, s + pos, n - pos);\r
+               switch (res) {\r
+               case -1:\r
+                       if (errno == EINTR)\r
+                               continue;\r
+                       if (errno == EAGAIN || errno == EWOULDBLOCK) {\r
+                               struct pollfd pfd;\r
+                                pfd.fd = fd;\r
+                                pfd.events = POLLOUT;\r
+                               (void)poll(&pfd, 1, -1);\r
+                               continue;\r
+                       }\r
+                       return 0;\r
+               case 0:\r
+                       errno = EPIPE;\r
+                       return pos;\r
+               default:\r
+                       pos += (size_t)res;\r
+               }\r
+       }\r
+        return pos;\r
+}\r
+\r
+> \r
+> d\r
+\r
+Tomi\r