1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
From f86082e548082ec2c3cac8920cd39dd2da0b70c4 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Mon, 28 Jul 2014 14:47:33 +0200
Subject: [PATCH] implement variable tcsh_posix_status
This patch partially reverts the dist-git commit e0b2d458fda4
because we _don't_ really want drop upstream-supported 'anyerror'
variable. And we can not drop tcsh_posix_status neither, as we
already support that in RHEL5+ downstream.
So from now, if "!defined(anyerror) ||
defined(tcsh_posix_status)", tcsh behaves, with regards to
pipelines, same way as POSIX-like shells.
Related: #759132
---
sh.c | 2 ++
sh.h | 1 +
sh.proc.c | 2 +-
sh.set.c | 5 +++++
tc.const.c | 2 ++
5 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/sh.c b/sh.c
index 518d610..3d627b1 100644
--- a/sh.c
+++ b/sh.c
@@ -353,6 +353,8 @@ main(int argc, char **argv)
anyerror = 1; /* for compatibility */
setcopy(STRanyerror, STRNULL, VAR_READWRITE);
+ tcsh_posix_status = 0;
+
/* Default history size to 100 */
setcopy(STRhistory, str2short("100"), VAR_READWRITE);
sethistory(100);
diff --git a/sh.h b/sh.h
index 503da25..6281260 100644
--- a/sh.h
+++ b/sh.h
@@ -563,6 +563,7 @@ EXTERN int editing IZERO; /* doing filename expansion and line editing */
EXTERN int noediting IZERO; /* initial $term defaulted to noedit */
EXTERN int bslash_quote IZERO;/* PWP: tcsh-style quoting? (in sh.c) */
EXTERN int anyerror IZERO; /* propagate errors from pipelines/backq */
+EXTERN int tcsh_posix_status IZERO; /* negation for anyerror */
EXTERN int compat_expr IZERO;/* csh-style expressions? */
EXTERN int isoutatty IZERO; /* is SHOUT a tty */
EXTERN int isdiagatty IZERO;/* is SHDIAG a tty */
diff --git a/sh.proc.c b/sh.proc.c
index afcf0b9..3c565f2 100644
--- a/sh.proc.c
+++ b/sh.proc.c
@@ -561,7 +561,7 @@ pjwait(struct process *pp)
do {
/* In case of pipelines only the result of the last
* command should be taken in account */
- if (!anyerror && !(fp->p_flags & PBRACE)
+ if ((!anyerror || tcsh_posix_status) && !(fp->p_flags & PBRACE)
&& ((fp->p_flags & PPOU) || (fp->p_flags & PBACKQ)))
continue;
if (fp->p_reason)
diff --git a/sh.set.c b/sh.set.c
index b2c44b1..ceff8cf 100644
--- a/sh.set.c
+++ b/sh.set.c
@@ -109,6 +109,9 @@ update_vars(Char *vp)
else if (eq(vp, STRanyerror)) {
anyerror = 1;
}
+ else if (eq(vp, STRtcsh_posix_status)) {
+ tcsh_posix_status = 1;
+ }
else if (eq(vp, STRsymlinks)) {
Char *pn = varval(vp);
@@ -771,6 +774,8 @@ unset(Char **v, struct command *c)
loginsh = 0;
if (adrof(STRanyerror) == 0)
anyerror = 0;
+ if (adrof(STRtcsh_posix_status) == 0)
+ tcsh_posix_status = 0;
if (adrof(STRwordchars) == 0)
word_chars = STR_WORD_CHARS;
if (adrof(STRedit) == 0)
diff --git a/tc.const.c b/tc.const.c
index e49f05a..88b1d69 100644
--- a/tc.const.c
+++ b/tc.const.c
@@ -44,6 +44,8 @@ Char STRrootdefautologout[] = { '1', '5', '\0' };
Char STRautomatic[] = { 'a', 'u', 't', 'o', 'm', 'a', 't', 'i', 'c',
'\0' };
Char STRanyerror[] = { 'a', 'n', 'y', 'e', 'r', 'r', 'o', 'r', '\0' };
+Char STRtcsh_posix_status[] = {'t', 'c', 's', 'h', '_', 'p', 'o', 's', 'i', 'x',
+ '_', 's', 't', 'a', 't', 'u', 's', '\0' };
Char STRhangup[] = { 'h', 'a', 'n', 'g', 'u', 'p', '\0' };
Char STRaout[] = { 'a', '.', 'o', 'u', 't', '\0' };
Char STRtty[] = { 't', 't', 'y', '\0' };
--
1.9.3
|