diff options
Diffstat (limited to 'system/pdksh/patches/045_Debian-job-control.patch')
-rw-r--r-- | system/pdksh/patches/045_Debian-job-control.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/system/pdksh/patches/045_Debian-job-control.patch b/system/pdksh/patches/045_Debian-job-control.patch new file mode 100644 index 0000000000..4e1696265a --- /dev/null +++ b/system/pdksh/patches/045_Debian-job-control.patch @@ -0,0 +1,130 @@ + * Fix job control bug in non-interactive scripts (closes: #296446) + Many thanks to Paul Stroud <pstroud@gmail.com> for the patch. + * lex.c: Don't expand aliases if there's an opening bracket just after + the token. Fixes unreported problem with pdksh reporting syntax error + on the init scripts that define function named `stop' (clashing + with an built-in alias.) +Index: pdksh-5.2.14/jobs.c +=================================================================== +--- pdksh-5.2.14.orig/jobs.c 2009-07-18 15:20:19.000000000 +0200 ++++ pdksh-5.2.14/jobs.c 2009-07-18 15:20:27.000000000 +0200 +@@ -340,12 +340,17 @@ + int i; + + if (Flag(FMONITOR)) { +- /* Don't call get_tty() 'til we own the tty process group */ +- tty_init(FALSE); ++ int use_tty; ++ if (Flag(FTALKING)) { ++ /* Don't call get_tty() 'til we own the tty process group */ ++ use_tty = 1; ++ tty_init(FALSE); ++ } else ++ use_tty = 0; + + # ifdef TTY_PGRP + /* no controlling tty, no SIGT* */ +- ttypgrp_ok = tty_fd >= 0 && tty_devtty; ++ ttypgrp_ok = use_tty && tty_fd >= 0 && tty_devtty; + + if (ttypgrp_ok && (our_pgrp = getpgID()) < 0) { + warningf(FALSE, "j_init: getpgrp() failed: %s", +@@ -401,8 +406,10 @@ + strerror(errno)); + } + # endif /* NTTYDISC && TIOCSETD */ +- if (!ttypgrp_ok) +- warningf(FALSE, "warning: won't have full job control"); ++ if (Flag(FTALKING)) { ++ if (!ttypgrp_ok) ++ warningf(FALSE, "warning: won't have full job control"); ++ } + # endif /* TTY_PGRP */ + if (tty_fd >= 0) + get_tty(tty_fd, &tty_state); +Index: pdksh-5.2.14/lex.c +=================================================================== +--- pdksh-5.2.14.orig/lex.c 2009-07-18 15:20:19.000000000 +0200 ++++ pdksh-5.2.14/lex.c 2009-07-18 15:20:27.000000000 +0200 +@@ -723,7 +723,15 @@ + #endif /* KSH */ + ) /* ONEWORD? */ + return LWORD; +- ungetsc(c); /* unget terminator */ ++ ++ /* unget terminator */ ++ ungetsc(c); ++ ++ /* ++ * note: the alias-vs-function code below depends on several ++ * interna: starting from here, source->str is not modified; ++ * the way getsc() and ungetsc() operate; etc. ++ */ + + /* copy word to unprefixed string ident */ + for (sp = yylval.cp, dp = ident; dp < ident+IDENT && (c = *sp++) == CHAR; ) +@@ -747,6 +755,33 @@ + if ((cf & ALIAS) && (p = tsearch(&aliases, ident, h)) + && (p->flag & ISSET)) + { ++ /* ++ * this still points to the same character as the ++ * ungetsc'd terminator from above ++ */ ++ const char *cp = source->str; ++ ++ /* prefer POSIX but not Korn functions over aliases */ ++ while (*cp == ' ' || *cp == '\t') ++ /* ++ * this is like getsc() without skipping ++ * over Source boundaries (including not ++ * parsing ungetsc'd characters that got ++ * pushed into an SREREAD) which is what ++ * we want here anyway: find out whether ++ * the alias name is followed by a POSIX ++ * function definition (only the opening ++ * parenthesis is checked though) ++ */ ++ ++cp; ++ /* prefer functions over aliases */ ++ if (*cp == '(' /*)*/) { ++ /* ++ * delete alias upon encountering function ++ * definition ++ */ ++ tdelete(p); ++ } else { + register Source *s; + + for (s = source; s->type == SALIAS; s = s->next) +@@ -760,6 +795,7 @@ + source = s; + afree(yylval.cp, ATEMP); + goto Again; ++ } + } + } + +Index: pdksh-5.2.14/ksh.Man +=================================================================== +--- pdksh-5.2.14.orig/ksh.Man 2009-07-18 15:20:07.000000000 +0200 ++++ pdksh-5.2.14/ksh.Man 2009-07-18 15:21:11.000000000 +0200 +@@ -390,6 +390,7 @@ + .IP "\fIname\fP \fB()\fP \fIcommand\fP" + Mostly the same as \fBfunction\fP. + See Functions below. ++Whitespace (space or tab) after \fIname\fP will be ignored most of the time. + .\"}}} + .\"{{{ time [-p] [ pipeline ] + .IP "\fBtime\fP [ \fB-p\fP ] [ \fIpipeline\fP ]" +@@ -1457,6 +1458,10 @@ + so \fBgetopts\fP can be used properly both inside and outside the function + (Bourne-style functions leave \fBOPTIND\fP untouched, so using \fBgetopts\fP + inside a function interferes with using \fBgetopts\fP outside the function). ++.br ++Bourne-style function definitions take precedence over alias dereferences ++and remove alias definitions upon encounter, while aliases take precedence ++over Korn-style functions. + .nr PD \n(P2 + In the future, the following differences will also be added: + .nr P2 \n(PD |