From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17651 invoked by alias); 15 Mar 2018 07:12:10 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 42465 Received: (qmail 22895 invoked by uid 1010); 15 Mar 2018 07:12:10 -0000 X-Qmail-Scanner-Diagnostics: from mail-wm0-f53.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(74.125.82.53):SA:0(-1.9/5.0):. Processed in 0.549135 secs); 15 Mar 2018 07:12:10 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS, T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: stephane.chazelas@gmail.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-disposition:in-reply-to:user-agent; bh=780H0UwMW8G9owv5spe5EhKsR+CXJwlB1QZMQMvgdks=; b=QdSxU8VKvJUu5bTwtJIQrqH9pbxn6Ef0Ff808ttQ4UBRKjh2lOLkWT9iDLNZogt8Qa bX/EiGIAEeS6akcizblqHPuI0rF4M49xhHCWUIJX8Yv8VxHAr0ewUb3ZGw4mnzqtMqTz f+3H37FKZPVKC53IlVTA38TNBkS2kt9+HUpOr+fsWZ1hVXUhlsQDkVQHCOpk6bWWTXmo 8CKgRSXxE5P4VqJeLvyz6owk4rqlRWGDaxzFVSepSKwQKcgHDjRlj/5MWSMvq3Mt8eRu gXq+yUkHK2dPY1mcBkdkG9WWy9akYDe5f0RXUhft8SnpaFW4M/BfH8iu8pLZ/LRc5Dle 1rmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=780H0UwMW8G9owv5spe5EhKsR+CXJwlB1QZMQMvgdks=; b=m2+5JGdgB94B99MA8N3bAG8Q0w8IpXbE64hm79WPIdes3HGnBoOCPwgw+/rky0+kSY BUjiJPdyULLGF91kQj9y7F3OaPEABFO6kgBjA5rftNaS92IgUbebA6aOF09PIgV3yCy6 NJRrlJPCW3VflYqdsOVWWGJCAcCEV4l3+a/GSQfGRqJkVaUXCoAVHrwnmpYz+TIjP1xq +dnj61DPjW5vQoBdxhR5sY8vpFM5CGOyprusuxq9iU1v+Sk8O7OD3t1a/GfYnyNn4ZuF ZGRiPp3RumbIye0POB9b4Sk2w9jW/zRsMqrTTAutvnp+0/E0Rguow8fyltsGtBrNj6nY n2Jg== X-Gm-Message-State: AElRT7FhaQiCKuIPW8/vxzL6v7KyMJsj6ldUAIdMDgemmFYw1QFpZIrz jSzJm8LL7m8s2n8m/+YEK70= X-Google-Smtp-Source: AG47ELsSrWQ2CrLeYhe4NmHcS5+NIe0AMC1jwYHKPPC0Vv3klK4jZH0lEknBrTEEB9zEniZ9DEsy7Q== X-Received: by 10.28.157.68 with SMTP id g65mr367964wme.31.1521097926071; Thu, 15 Mar 2018 00:12:06 -0700 (PDT) Date: Thu, 15 Mar 2018 07:12:04 +0000 From: Stephane Chazelas To: Peter Stephenson Cc: Zsh hackers list Subject: Re: $( Mail-Followup-To: Peter Stephenson , Zsh hackers list References: <20180314103254.GA10404@chaz.gmail.com> <20180314105442.28c5554a@camnpupstephen> <20180314144248.GC10404@chaz.gmail.com> <20180314145004.6e4b971b@camnpupstephen> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180314145004.6e4b971b@camnpupstephen> User-Agent: Mutt/1.5.24 (2015-08-30) 2018-03-14 14:50:04 +0000, Peter Stephenson: > On Wed, 14 Mar 2018 14:42:48 +0000 > Stephane Chazelas wrote: > > Would it be worth doing some: > > > > ret = readoutput(stream, qt); > > if (errno) { > > zwarn("%e: %s", errno, s); > > lastval = cmdoutval = 1; > > } > > return ret; > > > > there (or something cleaner to avoid relying on errno)? > > The return value is the linked list as we're in the context of > substitution, not command execution, which isn't easy to change without > a complete rewrite. [...] Why not just pass the error as a return argument like in the patch below? Then: $ ./Src/zsh -c 'ERRNO=0; v=$(= 0) { LinkList ll; + int readerror; - if ((ll = readoutput(fd, 1))) + if ((ll = readoutput(fd, 1, 0))) val = peekfirst(ll); } #endif /* USE_MMAP */ diff --git a/Src/exec.c b/Src/exec.c index e5c6455..32be683 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -4507,6 +4507,8 @@ getoutput(char *cmd, int qt) if ((s = simple_redir_name(prog, REDIR_READ))) { /* $(< word) */ int stream; + LinkList retval; + int readerror; singsub(&s); if (errflag) @@ -4514,9 +4516,15 @@ getoutput(char *cmd, int qt) untokenize(s); if ((stream = open(unmeta(s), O_RDONLY | O_NOCTTY)) == -1) { zwarn("%e: %s", errno, s); + lastval = cmdoutval = 1; return newlinklist(); } - return readoutput(stream, qt); + retval = readoutput(stream, qt, &readerror); + if (readerror) { + zwarn("error when reading %s: %e", s, readerror); + lastval = cmdoutval = 1; + } + return retval; } if (mpipe(pipes) < 0) { errflag |= ERRFLAG_ERROR; @@ -4537,7 +4545,7 @@ getoutput(char *cmd, int qt) LinkList retval; zclose(pipes[1]); - retval = readoutput(pipes[0], qt); + retval = readoutput(pipes[0], qt, 0); fdtable[pipes[0]] = FDT_UNUSED; waitforpid(pid, 0); /* unblocks */ lastval = cmdoutval; @@ -4562,7 +4570,7 @@ getoutput(char *cmd, int qt) /**/ mod_export LinkList -readoutput(int in, int qt) +readoutput(int in, int qt, int *readerror) { LinkList ret; char *buf, *ptr; @@ -4591,6 +4599,8 @@ readoutput(int in, int qt) } *ptr++ = c; } + if (readerror && ferror(fin)) + *readerror = errno; fclose(fin); while (cnt && ptr[-1] == '\n') ptr--, cnt--;