diff --git a/.gitignore b/.gitignore index 6be3080..2d4ea2b 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ INIT.2010-07-01.tgz /ast-ksh.2012-08-01.tgz /INIT.2012-08-01.tgz /ast-ksh.2012-08-01b.tgz +/ksh-2020.0.0-alpha1.tar.gz diff --git a/ksh-20070328-builtins.patch b/ksh-20070328-builtins.patch deleted file mode 100644 index 061bf9a..0000000 --- a/ksh-20070328-builtins.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ksh-20080202/src/cmd/ksh93/data/builtins.c.builtins ksh-20080202/src/cmd/ksh93/data/builtins.c ---- ksh-20080202/src/cmd/ksh93/data/builtins.c.builtins 2008-10-01 09:24:46.000000000 +0200 -+++ ksh-20080202/src/cmd/ksh93/data/builtins.c 2008-10-01 09:24:58.000000000 +0200 -@@ -129,7 +129,6 @@ const struct shtable3 shtab_builtins[] = - CMDLIST(dirname) - CMDLIST(getconf) - CMDLIST(head) -- CMDLIST(mkdir) - CMDLIST(logname) - CMDLIST(cat) - CMDLIST(cmp) diff --git a/ksh-20080202-manfix.patch b/ksh-20080202-manfix.patch deleted file mode 100644 index 8fe4225..0000000 --- a/ksh-20080202-manfix.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh.1.manfix ksh-20120801/src/cmd/ksh93/sh.1 ---- ksh-20120801/src/cmd/ksh93/sh.1.manfix 2012-06-18 16:16:22.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh.1 2013-04-30 13:35:17.393909479 +0200 -@@ -39,7 +39,7 @@ ksh93, rksh93, pfksh93 \- KornShell, a s - .B ksh93 - .\} - [ --.B \(+-abcefhikmnoprstuvxBCDP -+.B \(+-abcefhiknoprstuvxBCDP - ] [ - .B \-R - file ] [ -@@ -47,25 +47,6 @@ file ] [ - option ] .\|.\|. [ - .B \- - ] [ arg .\|.\|. ] --.br --.if \nZ=0 \{\ --.B rsh --.\} --.if \nZ=1 \{\ --.B rksh --.\} --.if \nZ=2 \{\ --.B rksh93 --.\} --[ --.B \(+-abcefhikmnoprstuvxBCD --] [ --.B \-R --file ] [ --.B \(+-o --option ] .\|.\|. [ --.B \- --] [ arg .\|.\|. ] - .SH DESCRIPTION - .if \nZ=0 .I Sh\^ - .if \nZ=1 .I Ksh\^ -@@ -7963,6 +7944,8 @@ option is used - to generate a cross reference database - that can be used by a separate utility - to find definitions and references for variables and commands. -+The filename argument specifies the generated database. A script file must be -+provided on the command line as well. - .PP - The remaining options and arguments are described under the - .B set diff --git a/ksh-20100202-pathvar.patch b/ksh-20100202-pathvar.patch deleted file mode 100644 index 5086499..0000000 --- a/ksh-20100202-pathvar.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up ksh-20100202/src/cmd/ksh93/sh.1.pathvar ksh-20100202/src/cmd/ksh93/sh.1 ---- ksh-20100202/src/cmd/ksh93/sh.1.pathvar 2011-04-26 16:42:08.000000000 +0200 -+++ ksh-20100202/src/cmd/ksh93/sh.1 2011-04-27 09:09:00.315883280 +0200 -@@ -4025,13 +4025,9 @@ the directory containing the command. - Alternative directory names are separated by - a colon - .RB ( : ). --The default path is --.B /bin:/usr/bin: --(specifying --.BR /bin , --.BR /usr/bin , --and the current directory --in that order). -+The default path is equal to -+.BI getconf\ PATH -+output. - The current directory can be specified by - two or more adjacent colons, or by a colon - at the beginning or end of the path list. diff --git a/ksh-20100621-fdstatus.patch b/ksh-20100621-fdstatus.patch deleted file mode 100644 index 99abb55..0000000 --- a/ksh-20100621-fdstatus.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.fdstatus 2013-07-04 18:01:27.187516655 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2013-07-04 18:01:38.249607392 +0200 -@@ -1508,7 +1508,7 @@ int sh_redirect(Shell_t *shp,struct iono - fn = fd; - if(fd<10) - { -- if((fn=fcntl(fd,F_DUPFD,10)) < 0) -+ if((fn=sh_fcntl(fd,F_DUPFD,10)) < 0) - goto fail; - if(fn>=shp->gd->lim.open_max && !sh_iovalidfd(shp,fn)) - goto fail; -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.fdstatus 2012-07-17 23:54:21.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2013-07-04 17:56:20.342000310 +0200 -@@ -122,7 +122,7 @@ void sh_subtmpfile(Shell_t *shp) - register struct checkpt *pp = (struct checkpt*)shp->jmplist; - register struct subshell *sp = subshell_data->pipe; - /* save file descriptor 1 if open */ -- if((sp->tmpfd = fd = fcntl(1,F_DUPFD,10)) >= 0) -+ if((sp->tmpfd = fd = sh_fcntl(1,F_DUPFD,10)) >= 0) - { - fcntl(fd,F_SETFD,FD_CLOEXEC); - shp->fdstatus[fd] = shp->fdstatus[1]|IOCLEX; -@@ -554,7 +554,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - sp->pwdfd = n; - if(n<10) - { -- sp->pwdfd = fcntl(n,F_DUPFD,10); -+ sp->pwdfd = sh_fcntl(n,F_DUPFD,10); - close(n); - } - if(sp->pwdfd>0) -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.fdstatus 2012-07-23 16:49:32.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2013-07-04 17:57:47.153712116 +0200 -@@ -116,7 +116,7 @@ static int iousepipe(Shell_t *shp) - return(0); - usepipe++; - fcntl(subpipe[0],F_SETFD,FD_CLOEXEC); -- subpipe[2] = fcntl(1,F_DUPFD,10); -+ subpipe[2] = sh_fcntl(1,F_DUPFD,10); - fcntl(subpipe[2],F_SETFD,FD_CLOEXEC); - shp->fdstatus[subpipe[2]] = shp->fdstatus[1]; - close(1); -@@ -3622,7 +3622,7 @@ static void coproc_init(Shell_t *shp, in - sh_pipe(shp->cpipe); - if((outfd=shp->cpipe[1]) < 10) - { -- int fd=fcntl(shp->cpipe[1],F_DUPFD,10); -+ int fd=sh_fcntl(shp->cpipe[1],F_DUPFD,10); - if(fd>=10) - { - shp->fdstatus[fd] = (shp->fdstatus[outfd]&~IOCLEX); diff --git a/ksh-20100621-manfix3.patch b/ksh-20100621-manfix3.patch deleted file mode 100644 index bced575..0000000 --- a/ksh-20100621-manfix3.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20100621/src/cmd/ksh93/sh.1.manfix3 ksh-20100621/src/cmd/ksh93/sh.1 ---- ksh-20100621/src/cmd/ksh93/sh.1.manfix3 2013-05-02 13:07:51.180529762 +0200 -+++ ksh-20100621/src/cmd/ksh93/sh.1 2013-05-02 13:11:30.469327199 +0200 -@@ -7585,7 +7585,7 @@ file descriptor 2. - If the - .B \-i - option is present or --if the shell input and output are attached to a terminal (as told by -+if the shell input and error output are attached to a terminal (as told by - .IR tcgetattr (2)), - then this shell is - .IR interactive . diff --git a/ksh-20100826-fixregr.patch b/ksh-20100826-fixregr.patch deleted file mode 100644 index 87cb13c..0000000 --- a/ksh-20100826-fixregr.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/tests/builtins.sh.fixregr ksh-20120801/src/cmd/ksh93/tests/builtins.sh ---- ksh-20120801/src/cmd/ksh93/tests/builtins.sh.fixregr 2012-07-16 17:23:56.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/tests/builtins.sh 2012-08-08 12:29:00.733243019 +0200 -@@ -303,9 +303,9 @@ then err_exit "printf '%..*s' not workin - fi - [[ $(printf '%q\n') == '' ]] || err_exit 'printf "%q" with missing arguments' - # we won't get hit by the one second boundary twice, right? --[[ $(printf '%T\n' now) == "$(date)" ]] || --[[ $(printf '%T\n' now) == "$(date)" ]] || --err_exit 'printf "%T" now' -+[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] || -+[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] || -+err_exit 'printf "%T" now = '"$(printf '%T\n' now) != $(date)" - behead() - { - read line -diff -up ksh-20120801/src/cmd/ksh93/tests/locale.sh.fixregr ksh-20120801/src/cmd/ksh93/tests/locale.sh ---- ksh-20120801/src/cmd/ksh93/tests/locale.sh.fixregr 2012-06-26 21:57:46.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/tests/locale.sh 2012-08-08 12:29:20.039405240 +0200 -@@ -104,6 +104,7 @@ if (( $($SHELL -c $'export LC_ALL='$loca - then LC_ALL=$locale $SHELL -c b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"; [[ ${b1:4:1} == w ]]' || err_exit 'multibyte ${var:offset:len} not working correctly' - fi - -+locale=en_US.UTF-8 - #$SHELL -c 'export LANG='$locale'; printf "\u[20ac]\u[20ac]" > $tmp/two_euro_chars.txt' - printf $'\342\202\254\342\202\254' > $tmp/two_euro_chars.txt - exp="6 2 6" -@@ -111,11 +112,11 @@ set -- $($SHELL -c " - unset LC_CTYPE - export LANG=$locale - export LC_ALL=C -- command wc -C < $tmp/two_euro_chars.txt -+ command wc -m < $tmp/two_euro_chars.txt - unset LC_ALL -- command wc -C < $tmp/two_euro_chars.txt -+ command wc -m < $tmp/two_euro_chars.txt - export LC_ALL=C -- command wc -C < $tmp/two_euro_chars.txt -+ command wc -m < $tmp/two_euro_chars.txt - ") - got=$* - [[ $got == $exp ]] || err_exit "command wc LC_ALL default failed -- expected '$exp', got '$got'" -@@ -134,6 +135,8 @@ set -- $($SHELL -c " - got=$* - [[ $got == $exp ]] || err_exit "builtin wc LC_ALL default failed -- expected '$exp', got '$got'" - -+locale=C_EU.UTF-8 -+ - # multibyte char straddling buffer boundary - - { -@@ -190,6 +193,7 @@ do exp=$1 - done - - # setocale(LC_ALL,"") after setlocale() initialization -+locale=en_US.UTF-8 - - printf 'f1\357\274\240f2\n' > input1 - printf 't2\357\274\240f1\n' > input2 -@@ -336,7 +340,7 @@ then LC_ALL=en_US.UTF-8 - [[ $(print -r -- "$x") == $'hello\u[20ac]\xee world' ]] || err_exit '%q with unicode and non-unicode not working' - if [[ $(whence od) ]] - then got='68 65 6c 6c 6f e2 82 ac ee 20 77 6f 72 6c 64 0a' -- [[ $(print -r -- "$x" | od -An -tx1) == "$got" ]] || err_exit "incorrect string from printf %q" -+ [[ $(print -r -- "$x" | od -An -tx1) =~ $got ]] || err_exit "incorrect string from printf %q" - fi - - fi diff --git a/ksh-20120801-F_dupfd_cloexec.patch b/ksh-20120801-F_dupfd_cloexec.patch deleted file mode 100644 index 7a034b3..0000000 --- a/ksh-20120801-F_dupfd_cloexec.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.orig ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.orig 2015-08-12 11:35:36.882268954 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2015-08-12 11:44:06.324587019 -0300 -@@ -2580,10 +2580,18 @@ int sh_fcntl(register int fd, int op, .. - if(newfd>=0) switch(op) - { - case F_DUPFD: -+#if F_dupfd_cloexec != F_DUPFD -+ case F_dupfd_cloexec: -+#endif - if(shp->fdstatus[fd] == IOCLOSE) - shp->fdstatus[fd] = 0; - if(newfd>=shp->gd->lim.open_max) - sh_iovalidfd(shp,newfd); -+#if F_dupfd_cloexec != F_DUPFD -+ if(op==F_dupfd_cloexec) -+ shp->fdstatus[newfd] = (shp->fdstatus[fd]|IOCLEX); -+ else -+#endif - shp->fdstatus[newfd] = (shp->fdstatus[fd]&~IOCLEX); - if(fdnotify) - (*fdnotify)(fd,newfd); diff --git a/ksh-20120801-alarmifs.patch b/ksh-20120801-alarmifs.patch deleted file mode 100644 index 88b0ba9..0000000 --- a/ksh-20120801-alarmifs.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- ksh-20120801/src/cmd/ksh93/sh/init.c 2014-12-10 20:11:17.693446084 -0200 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2014-12-10 20:11:24.753442619 -0200 -@@ -576,6 +576,7 @@ static char* get_ifs(register Namval_t* - shp->ifstable[' '] = shp->ifstable['\t'] = S_SPACE; - shp->ifstable['\n'] = S_NL; - } -+ shp->ifstable[0] = S_EOF; - } - return(value); - } ---- ksh-20120801/src/cmd/ksh93/bltins/alarm.c 2014-12-18 12:03:39.198461933 -0200 -+++ ksh-20120801/src/cmd/ksh93/bltins/alarm.c 2014-12-18 12:04:32.464421268 -0200 -@@ -130,6 +130,7 @@ void sh_timetraps(Shell_t *shp) - { - register struct tevent *tp, *tpnext; - register struct tevent *tptop; -+ char ifstable[256]; - while(1) - { - shp->sigflag[SIGALRM] &= ~SH_SIGALRM; -@@ -141,7 +142,11 @@ void sh_timetraps(Shell_t *shp) - { - tp->flags &= ~L_FLAG; - if(tp->action) -+ { -+ memcpy(ifstable,shp->ifstable,sizeof(ifstable)); - sh_fun(tp->action,tp->node,(char**)0); -+ memcpy(shp->ifstable,ifstable,sizeof(ifstable)); -+ } - tp->flags &= ~L_FLAG; - if(!tp->flags) - { - diff --git a/ksh-20120801-argvfix.patch b/ksh-20120801-argvfix.patch deleted file mode 100644 index b0e1a78..0000000 --- a/ksh-20120801-argvfix.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.fixargs ksh-20120801/src/cmd/ksh93/sh/main.c ---- ksh-20120801/src/cmd/ksh93/sh/main.c.fixargs 2013-12-31 11:32:14.917874134 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/main.c 2013-12-31 11:32:58.028847126 +0100 -@@ -757,7 +757,7 @@ static void fixargs(char **argv, int mod - offset += size; - buff[offset++] = ' '; - } -- buff[offset-1] = 0; -+ memset(&buff[offset - 1], 0, command_len - offset + 1); - # ifdef PSTAT - un.pst_command = stakptr(0); - pstat(PSTAT_SETCMD,un,0,0,0); - diff --git a/ksh-20120801-assoc-unset-leak.patch b/ksh-20120801-assoc-unset-leak.patch deleted file mode 100644 index 1af7d16..0000000 --- a/ksh-20120801-assoc-unset-leak.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.orig ksh-20120801/src/cmd/ksh93/sh/name.c ---- ksh-20120801/src/cmd/ksh93/sh/name.c.orig 2015-02-10 17:15:37.180783550 -0200 -+++ ksh-20120801/src/cmd/ksh93/sh/name.c 2015-02-10 18:25:51.726228437 -0200 -@@ -1298,7 +1298,16 @@ void nv_delete(Namval_t* np, Dt_t *root, - if(dtdelete(root,np)) - { - if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np,flags&NV_TABLE))) -+ { -+ Namarr_t *ap; -+ if(nv_isarray(np) && np->nvfun && (ap=nv_arrayptr(np)) && array_assoc(ap)) { -+ while(nv_associative(np,0,NV_ANEXT)) -+ nv_associative(np, 0, NV_ADELETE); -+ nv_associative(np, 0, NV_AFREE); -+ free((void*)np->nvfun); -+ } - free((void*)np); -+ } - } - #if 0 - else diff --git a/ksh-20120801-badgcc.patch b/ksh-20120801-badgcc.patch deleted file mode 100644 index cd26316..0000000 --- a/ksh-20120801-badgcc.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -up ksh-20120801/src/lib/libast/string/strdup.c.badgcc ksh-20120801/src/lib/libast/string/strdup.c ---- ksh-20120801/src/lib/libast/string/strdup.c.badgcc 2012-05-21 15:04:46.000000000 +0200 -+++ ksh-20120801/src/lib/libast/string/strdup.c 2015-06-17 10:12:52.693922581 +0200 -@@ -50,11 +50,18 @@ __STDPP__directive pragma pp:nohide strd - #define extern __EXPORT__ - #endif - -+#pragma GCC push_options -+#pragma GCC optimize ("O0") -+ -+ - extern char* - strdup(register const char* s) - { - register char* t; - register int n; - - return (s && (t = oldof(0, char, n = strlen(s) + 1, 0))) ? (char*)memcpy(t, s, n) : (char*)0; - } -+ -+#pragma GCC pop_options -+ diff --git a/ksh-20120801-ccflags.patch b/ksh-20120801-ccflags.patch deleted file mode 100644 index b95db66..0000000 --- a/ksh-20120801-ccflags.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/src/cmd/ksh93/Mamfile b/src/cmd/ksh93/Mamfile ---- a/src/cmd/ksh93/Mamfile -+++ b/src/cmd/ksh93/Mamfile -@@ -1111,7 +1111,7 @@ prev include/defs.h implicit - done sh/trestore.c - meta trestore.o %.c>%.o sh/trestore.c trestore - prev sh/trestore.c --exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SHOPT_SYSRC+-DSHOPT_SYSRC=${SHOPT_SYSRC}} ${SHOPT_ACCT+-DSHOPT_ACCT=${SHOPT_ACCT}} ${SHOPT_SPAWN+-DSHOPT_SPAWN=${SHOPT_SPAWN}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -D_BLD_shell -DKSHELL -D_API_ast=20100309 -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c sh/trestore.c -+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SHOPT_SYSRC+-DSHOPT_SYSRC=${SHOPT_SYSRC}} ${SHOPT_ACCT+-DSHOPT_ACCT=${SHOPT_ACCT}} ${SHOPT_SPAWN+-DSHOPT_SPAWN=${SHOPT_SPAWN}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -D_BLD_shell -DKSHELL -D_API_ast=20100309 -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c sh/trestore.c - done trestore.o generated - make waitevent.o - make sh/waitevent.c -@@ -1199,7 +1199,7 @@ prev ${PACKAGE_ast_INCLUDE}/ast_standards.h implicit - done data/strdata.c - meta strdata.o %.c>%.o data/strdata.c strdata - prev data/strdata.c --exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/strdata.c -+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/strdata.c - done strdata.o generated - make testops.o - make data/testops.c diff --git a/ksh-20120801-cdfix.patch b/ksh-20120801-cdfix.patch deleted file mode 100644 index 59265dd..0000000 --- a/ksh-20120801-cdfix.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c ---- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix 2013-02-01 16:04:55.507150242 +0100 -+++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c 2013-02-01 16:06:39.361007641 +0100 -@@ -214,7 +214,10 @@ int b_cd(int argc, char *argv[],Shbltin_ - if(*++dp=='.' && (*++dp=='/' || *dp==0)) - n++; - else if(*dp && *dp!='/') -+ { -+ dp--; - break; -+ } - if(*dp==0) - break; - } diff --git a/ksh-20120801-cdfix2.patch b/ksh-20120801-cdfix2.patch deleted file mode 100644 index 84bb491..0000000 --- a/ksh-20120801-cdfix2.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix2 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c ---- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix2 2013-02-01 16:46:50.441771371 +0100 -+++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c 2013-02-01 16:57:43.241784024 +0100 -@@ -61,6 +61,7 @@ int sh_diropenat(Shell_t *shp, int dir, - { - int fd,shfd; - int savederrno=errno; -+ struct stat fs; - #ifndef AT_FDCWD - NOT_USED(dir); - #endif -@@ -133,6 +134,13 @@ int sh_diropenat(Shell_t *shp, int dir, - - if(fd < 0) - return fd; -+ -+ if (!fstat(fd, &fs) && !S_ISDIR(fs.st_mode)) -+ { -+ close(fd); -+ errno = ENOTDIR; -+ return -1; -+ } - - /* Move fd to a number > 10 and *register* the fd number with the shell */ - shfd = sh_fcntl(fd, F_dupfd_cloexec, 10); diff --git a/ksh-20120801-cdfix3.patch b/ksh-20120801-cdfix3.patch deleted file mode 100644 index 7e47f71..0000000 --- a/ksh-20120801-cdfix3.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix3 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c ---- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix3 2014-06-20 12:39:02.757407689 +0200 -+++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c 2014-06-20 12:40:19.530998070 +0200 -@@ -290,7 +290,7 @@ int b_cd(int argc, char *argv[],Shbltin_ - if(newdirfd >=0) - { - /* chdir for directories on HSM/tapeworms may take minutes */ -- if(fchdir(newdirfd) >= 0) -+ if((rval=fchdir(newdirfd)) >= 0) - { - if(shp->pwdfd >= 0) - sh_close(shp->pwdfd); diff --git a/ksh-20120801-cdfork.patch b/ksh-20120801-cdfork.patch deleted file mode 100644 index c82cb4c..0000000 --- a/ksh-20120801-cdfork.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- ksh-20120801/src/cmd/ksh93/sh/path.c 2014-09-01 15:08:06.738969962 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/path.c 2014-09-01 15:13:51.321459978 -0300 -@@ -229,13 +229,12 @@ static pid_t path_xargs(Shell_t *shp,con - /* - * make sure PWD is set up correctly - * Return the present working directory -- * Invokes getcwd() if flag==0 and if necessary -+ * Invokes getcwd() if necessary - * Sets the PWD variable to this value - */ - char *path_pwd(Shell_t *shp,int flag) - { - register char *cp; -- register char *dfault = (char*)e_dot; - register int count = 0; - if(shp->pwd) - return((char*)shp->pwd); -@@ -254,11 +253,6 @@ char *path_pwd(Shell_t *shp,int flag) - cp = "/"; - break; - case 3: -- cp = (char*)e_crondir; -- if(flag) /* skip next case when non-zero flag */ -- ++count; -- break; -- case 4: - { - if(cp=getcwd(NIL(char*),0)) - { -@@ -269,8 +263,8 @@ char *path_pwd(Shell_t *shp,int flag) - } - break; - } -- case 5: -+ case 4: -- return(dfault); -+ return((char*)e_dot); - } - if(cp && *cp=='/' && test_inode(cp,e_dot)) - break; diff --git a/ksh-20120801-covsfix.patch b/ksh-20120801-covsfix.patch deleted file mode 100644 index c64e2a7..0000000 --- a/ksh-20120801-covsfix.patch +++ /dev/null @@ -1,58 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.covsfix ksh-20120801/src/cmd/ksh93/sh/init.c ---- ksh-20120801/src/cmd/ksh93/sh/init.c.covsfix 2013-07-22 17:41:34.674054068 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2013-07-22 17:42:50.761361921 +0200 -@@ -1237,9 +1237,11 @@ static void put_mode(Namval_t* np, const - mode = *(double*)val; - } - else -+ { - mode = strperm(val, &last,0); -- if(*last) -- errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val); -+ if(*last) -+ errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val); -+ } - nv_putv(np,(char*)&mode,NV_INTEGER,nfp); - } - else -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.covsfix ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.covsfix 2013-07-22 17:06:30.282927080 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2013-07-22 17:08:49.645721280 +0200 -@@ -954,6 +954,7 @@ int sh_pipe(register int pv[]) - socklen_t slen; - if ((pv[out] = socket (AF_INET, SOCK_STREAM, 0)) < 0) - errormsg(SH_DICT,ERROR_system(1),e_pipe); -+ memset(&sin.sin_zero, 0, sizeof(sin.sin_zero)); - do - { - sin.sin_family = AF_INET; -diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.covsfix ksh-20120801/src/cmd/ksh93/sh/name.c ---- ksh-20120801/src/cmd/ksh93/sh/name.c.covsfix 2013-07-22 17:40:31.644635604 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/name.c 2013-07-22 17:41:15.828227073 +0200 -@@ -3094,6 +3094,7 @@ void nv_newattr (register Namval_t *np, - if(!mp) - nv_putval (np, cp, NV_RDONLY); - free(cp); -+ cp = NULL; - } - } - while(ap && nv_nextsub(np)); -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.covsfix ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.covsfix 2013-07-22 17:46:15.607533423 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2013-07-22 17:48:36.739290968 +0200 -@@ -205,7 +205,14 @@ void sh_subfork(void) - shp->comsub = 0; - SH_SUBSHELLNOD->nvalue.s = 0; - sp->subpid=0; -- shp->st.trapcom[0] = (comsub==2?NULL:trap); -+ if (comsub==2) -+ { -+ shp->st.trapcom[0] = NULL; -+ if(trap) -+ free((void*)trap); -+ } -+ else -+ shp->st.trapcom[0] = (comsub==2?NULL:trap); - shp->savesig = 0; - } - } diff --git a/ksh-20120801-crash.patch b/ksh-20120801-crash.patch deleted file mode 100644 index 37b7962..0000000 --- a/ksh-20120801-crash.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.crash ksh-20120801/src/cmd/ksh93/include/jobs.h ---- ksh-20120801/src/cmd/ksh93/include/jobs.h.crash 2014-07-22 11:48:57.205062905 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/jobs.h 2014-07-22 11:48:57.243062711 +0200 -@@ -118,6 +118,7 @@ struct jobs - char jobcontrol; /* turned on for real job control */ - char waitsafe; /* wait will not block */ - char waitall; /* wait for all jobs in pipe */ -+ char hack1_waitall; - char toclear; /* job table needs clearing */ - unsigned char *freejobs; /* free jobs numbers */ - #if SHOPT_COSHELL -diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.crash ksh-20120801/src/cmd/ksh93/sh/jobs.c ---- ksh-20120801/src/cmd/ksh93/sh/jobs.c.crash 2014-07-22 11:48:57.190062982 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/jobs.c 2014-07-22 11:48:57.243062711 +0200 -@@ -1957,6 +1957,7 @@ again: - { - count = bp->count; - jp = bp->list; -+ jpold = 0; - goto again; - } - if(jp) -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.crash ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.crash 2014-07-22 11:48:57.234062758 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2014-07-22 11:54:04.164491483 +0200 -@@ -492,6 +492,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - struct sh_scoped savst; - struct dolnod *argsav=0; - int argcnt; -+ int pipefail = 0; - memset((char*)sp, 0, sizeof(*sp)); - sfsync(shp->outpool); - sh_sigcheck(shp); -@@ -541,7 +542,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - sp->comsub = shp->comsub; - shp->subshare = comsub==2 || (comsub==1 && sh_isoption(SH_SUBSHARE)); - if(comsub) -+ { - shp->comsub = comsub; -+ job.hack1_waitall=(comsub==1); -+ } - sp->shpwdfd=-1; - if(!comsub || !shp->subshare) - { -@@ -648,6 +652,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - } - else - { -+ job.hack1_waitall=0; - if(comsub!=1 && shp->spid) - { - job_wait(shp->spid); -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.crash ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.crash 2014-07-22 11:48:57.228062787 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-07-22 11:48:57.245062700 +0200 -@@ -2125,7 +2125,7 @@ int sh_exec(register const Shnode_t *t, - memset(exitval,0,job.waitall*sizeof(int)); - } - else -- job.waitall |= !pipejob && sh_isstate(SH_MONITOR); -+ job.waitall |= job.hack1_waitall || !pipejob && sh_isstate(SH_MONITOR); - job_lock(); - nlock++; - do diff --git a/ksh-20120801-dotdoublefree.patch b/ksh-20120801-dotdoublefree.patch deleted file mode 100644 index bf29cb1..0000000 --- a/ksh-20120801-dotdoublefree.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c -index 1ba7347..ab745d4 100644 ---- a/src/cmd/ksh93/sh/xec.c -+++ b/src/cmd/ksh93/sh/xec.c -@@ -640,7 +640,11 @@ int sh_eval(register Sfio_t *iop, int mode) - if(lineno) - shp->inlineno = lineno; - if(io_save) -+ { - sfclose(io_save); -+ io_save = 0; -+ } -+ - sh_freeup(shp); - shp->st.staklist = saveslp; - shp->fn_reset = 0; --- -2.9.3 - diff --git a/ksh-20120801-emptyarrayinit.patch b/ksh-20120801-emptyarrayinit.patch deleted file mode 100644 index c888b31..0000000 --- a/ksh-20120801-emptyarrayinit.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ksh-20120801/src/cmd/ksh93/sh/array.c 2014-12-11 16:39:34.253860675 -0200 -+++ ksh-20120801/src/cmd/ksh93/sh/array.c 2014-12-11 16:39:40.794857083 -0200 -@@ -1003,7 +1003,7 @@ Namarr_t *nv_setarray(Namval_t *np, void - ap->nelem = nelem; - ap->fun = fun; - nv_onattr(np,NV_ARRAY); -- if(fp || value) -+ if(fp || (value && value != Empty)) - { - nv_putsub(np, "0", ARRAY_ADD); - if(value) diff --git a/ksh-20120801-fd2lost.patch b/ksh-20120801-fd2lost.patch deleted file mode 100644 index 0605f6e..0000000 --- a/ksh-20120801-fd2lost.patch +++ /dev/null @@ -1,72 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/macro.c ---- ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost 2014-01-22 16:23:21.211658984 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2014-01-22 16:23:21.243658703 +0100 -@@ -391,7 +391,7 @@ void sh_machere(Shell_t *shp,Sfio_t *inf - break; - } - case S_PAR: -- comsubst(mp,(Shnode_t*)0,1); -+ comsubst(mp,(Shnode_t*)0,3); - break; - case S_EOF: - if((c=fcfill()) > 0) -@@ -1165,7 +1165,7 @@ retry1: - case S_PAR: - if(type) - goto nosub; -- comsubst(mp,(Shnode_t*)0,1); -+ comsubst(mp,(Shnode_t*)0,3); - return(1); - case S_DIG: - var = 0; -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost 2014-01-22 16:23:21.222658887 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2014-01-22 16:23:21.243658703 +0100 -@@ -122,7 +122,8 @@ void sh_subtmpfile(Shell_t *shp) - else if(errno!=EBADF) - errormsg(SH_DICT,ERROR_system(1),e_toomany); - /* popping a discipline forces a /tmp file create */ -- sfdisc(sfstdout,SF_POPDISC); -+ if(shp->comsub != 1) -+ sfdisc(sfstdout,SF_POPDISC); - if((fd=sffileno(sfstdout))<0) - { - /* unable to create the /tmp file so use a pipe */ -@@ -635,6 +636,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - } - else - { -+ if(comsub!=1 && shp->spid) -+ { -+ job_wait(shp->spid); -+ if(shp->pipepid==shp->spid) -+ shp->spid = 0; -+ shp->pipepid = 0; -+ } - /* move tmp file to iop and restore sfstdout */ - iop = sfswap(sfstdout,NIL(Sfio_t*)); - if(!iop) -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost 2014-01-22 16:23:21.237658756 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-01-22 16:38:36.374666019 +0100 -@@ -1756,6 +1756,8 @@ int sh_exec(register const Shnode_t *t, - nlock--; - job_unlock(); - } -+ if(shp->subshell) -+ shp->spid = parent; - if(type&FPCL) - sh_close(shp->inpipe[0]); - if(type&(FCOOP|FAMP)) -@@ -1771,7 +1773,11 @@ int sh_exec(register const Shnode_t *t, - if(shp->pipepid) - shp->pipepid = parent; - else -+ { - job_wait(parent); -+ if(parent==shp->spid) -+ shp->spid = 0; -+ } - if(shp->topfd > topfd) - sh_iorestore(shp,topfd,0); - if(usepipe && tsetio && subdup && unpipe) diff --git a/ksh-20120801-filecomsubst.patch b/ksh-20120801-filecomsubst.patch deleted file mode 100644 index 676cc27..0000000 --- a/ksh-20120801-filecomsubst.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.tryfix01 ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.tryfix01 2014-02-26 16:15:52.355391420 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2014-02-26 16:23:55.588148801 +0100 -@@ -1326,6 +1326,7 @@ int sh_redirect(Shell_t *shp,struct iono - if(flag==SH_SHOWME) - goto traceit; - fd=sh_chkopen(fname); -+ fd=sh_iomovefd(fd); - } - else if(sh_isoption(SH_RESTRICTED)) - errormsg(SH_DICT,ERROR_exit(1),e_restricted,fname); diff --git a/ksh-20120801-forkbomb.patch b/ksh-20120801-forkbomb.patch deleted file mode 100644 index 7a1a5c1..0000000 --- a/ksh-20120801-forkbomb.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/fault.c.forkbomb ksh-20120801/src/cmd/ksh93/sh/fault.c ---- ksh-20120801/src/cmd/ksh93/sh/fault.c.forkbomb 2013-04-30 16:20:40.237490109 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/fault.c 2013-04-30 16:21:49.961068778 +0200 -@@ -519,7 +519,7 @@ void sh_exit(register int xno) - if(pp && pp->mode>1) - cursig = -1; - #ifdef SIGTSTP -- if(shp->trapnote&SH_SIGTSTP) -+ if((shp->trapnote&SH_SIGTSTP) && job.jobcontrol) - { - /* ^Z detected by the shell */ - shp->trapnote = 0; diff --git a/ksh-20120801-fununset.patch b/ksh-20120801-fununset.patch deleted file mode 100644 index 1f5cb17..0000000 --- a/ksh-20120801-fununset.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fununset ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.fununset 2014-06-16 14:21:09.293513844 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-06-16 14:21:09.309513760 +0200 -@@ -3570,7 +3570,7 @@ static void sh_funct(Shell_t *shp,Namval - #endif - nv_putval(SH_PATHNAMENOD,shp->st.filename,NV_NOFREE); - shp->pipepid = pipepid; -- np->nvalue.rp->running -= 2; -+ if (np->nvalue.rp) np->nvalue.rp->running -= 2; - } - - /* diff --git a/ksh-20120801-glibc-build-fix.patch b/ksh-20120801-glibc-build-fix.patch deleted file mode 100644 index 28be43b..0000000 --- a/ksh-20120801-glibc-build-fix.patch +++ /dev/null @@ -1,38 +0,0 @@ -diff --git a/src/lib/libast/features/stdio b/src/lib/libast/features/stdio ---- a/src/lib/libast/features/stdio -+++ b/src/lib/libast/features/stdio -@@ -6,6 +6,8 @@ cat{ - #define _FILE_DEFINED 1 - #define _FILE_defined 1 - #define _FILEDEFED 1 -+ #define __FILE_defined 1 -+ #define ____FILE_defined 1 - - #ifndef __FILE_TAG - #define __FILE_TAG _sfio_s -diff --git a/src/lib/libast/include/ast.h b/src/lib/libast/include/ast.h -index ebf82d7..f4bbe6d 100644 ---- a/src/lib/libast/include/ast.h -+++ b/src/lib/libast/include/ast.h -@@ -59,9 +59,21 @@ struct _sfio_s; - #ifndef __FILE_typedef - #define __FILE_typedef 1 - #endif -+#ifndef _FILE_DEFINED -+#define _FILE_DEFINED 1 -+#endif -+#ifndef _FILE_defined -+#define _FILE_defined 1 -+#endif - #ifndef _FILEDEFED - #define _FILEDEFED 1 - #endif -+#ifndef __FILE_defined -+#define __FILE_defined 1 -+#endif -+#ifndef ____FILE_defined -+#define ____FILE_defined 1 -+#endif - #endif - - /* diff --git a/ksh-20120801-heresub.patch b/ksh-20120801-heresub.patch deleted file mode 100644 index 880071c..0000000 --- a/ksh-20120801-heresub.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.heresub ksh-20120801/src/cmd/ksh93/sh/lex.c ---- ksh-20120801/src/cmd/ksh93/sh/lex.c.heresub 2014-05-21 16:48:42.635700984 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/lex.c 2014-05-21 16:48:42.678700772 +0200 -@@ -1557,6 +1557,7 @@ static int comsub(register Lex_t *lp, in - { - register int n,c,count=1; - register int line=lp->sh->inlineno; -+ struct ionod *inheredoc = lp->heredoc; - char *first,*cp=fcseek(0),word[5]; - int off, messages=0, assignok=lp->assignok, csub; - struct lexstate save; -@@ -1683,7 +1684,7 @@ done: - lp->lexd.dolparen--; - lp->lex = save; - lp->assignok = (endchar(lp)==RBRACT?assignok:0); -- if(lp->heredoc) -+ if(lp->heredoc && !inheredoc) - errormsg(SH_DICT,ERROR_exit(SYNBAD),e_lexsyntax5,lp->sh->inlineno,lp->heredoc->ioname); - return(messages); - } -diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.heresub ksh-20120801/src/cmd/ksh93/sh/macro.c ---- ksh-20120801/src/cmd/ksh93/sh/macro.c.heresub 2014-05-21 16:48:42.650700910 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2014-05-21 16:48:42.678700772 +0200 -@@ -2085,7 +2085,7 @@ static void comsubst(Mac_t *mp,register - } - sfputc(stkp,c); - } -- sfputc(stkp,' '); -+ sfputc(stkp,'\n'); - c = stktell(stkp); - str=stkfreeze(stkp,1); - /* disable verbose and don't save in history file */ diff --git a/ksh-20120801-iso8859.patch b/ksh-20120801-iso8859.patch deleted file mode 100644 index 8f3a355..0000000 --- a/ksh-20120801-iso8859.patch +++ /dev/null @@ -1,74 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/fcin.c b/src/cmd/ksh93/sh/fcin.c -index ea6ea6b..08c1f2a 100644 ---- a/src/cmd/ksh93/sh/fcin.c -+++ b/src/cmd/ksh93/sh/fcin.c -@@ -150,63 +150,19 @@ extern void fcrestore(Fcin_t *fp) - _Fcin = *fp; - } - --/* for testing purposes with small buffers */ --#if defined(IOBSIZE) && (IOBSIZE < 2*MB_LEN_MAX) --# undef MB_LEN_MAX --# define MB_LEN_MAX (IOBSIZE/2) --#endif -- --struct Extra --{ -- unsigned char buff[2*MB_LEN_MAX]; -- unsigned char *next; --}; -- - int _fcmbget(short *len) - { -- static struct Extra extra; -- register int i, c, n; -- if(_Fcin.fcleft) -- { -- if((c = mbsize(extra.next)) < 0) -- c = 1; -- if((_Fcin.fcleft -= c) <=0) -- { -- _Fcin.fcptr = (unsigned char*)fcfirst() - _Fcin.fcleft; -- _Fcin.fcleft = 0; -- } -- *len = c; -- if(c==1) -- c = *extra.next++; -- else if(c==0) -- _Fcin.fcleft = 0; -- else -- c = mbchar(extra.next); -- return(c); -- } -- switch(*len = mbsize(_Fcin.fcptr)) -+ register int c; -+ switch (*len = mbsize(_Fcin.fcptr)) - { -- case -1: -- if(_Fcin._fcfile && (n=(_Fcin.fclast-_Fcin.fcptr)) < MB_LEN_MAX) -- { -- memcpy(extra.buff, _Fcin.fcptr, n); -- _Fcin.fcptr = _Fcin.fclast; -- for(i=n; i < MB_LEN_MAX+n; i++) -- { -- if((extra.buff[i] = fcgetc(c))==0) -- break; -- } -- _Fcin.fcleft = n; -- extra.next = extra.buff; -- return(fcmbget(len)); -- } -+ case -1: - *len = 1; - /* fall through */ -- case 0: -- case 1: -+ case 0: -+ case 1: - c=fcget(); - break; -- default: -+ default: - c = mbchar(_Fcin.fcptr); - } - return(c); diff --git a/ksh-20120801-jobwait-sigstop.patch b/ksh-20120801-jobwait-sigstop.patch deleted file mode 100644 index 1749288..0000000 --- a/ksh-20120801-jobwait-sigstop.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/jobs.c b/src/cmd/ksh93/sh/jobs.c ---- a/src/cmd/ksh93/sh/jobs.c -+++ b/src/cmd/ksh93/sh/jobs.c -@@ -1579,6 +1579,7 @@ int job_wait(register pid_t pid) - if( pw->p_exit!=SIGTTIN && pw->p_exit!=SIGTTOU) - break; - -+ tcsetpgrp(JOBTTY,pw->p_pgrp); - killpg(pw->p_pgrp,SIGCONT); - } - else /* ignore stop when non-interactive */ diff --git a/ksh-20120801-kia.patch b/ksh-20120801-kia.patch deleted file mode 100644 index 9b4b972..0000000 --- a/ksh-20120801-kia.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/parse.c b/src/cmd/ksh93/sh/parse.c -index d139389..5a02af7 100644 ---- a/src/cmd/ksh93/sh/parse.c -+++ b/src/cmd/ksh93/sh/parse.c -@@ -2032,6 +2032,7 @@ unsigned long kiaentity(Lex_t *lexp,const char *name,int len,int type,int first, - else - sfputr(stkp,name,0); - } -+ sfputc(stkp,'\0'); - np = nv_search(stakptr(offset),lexp->entity_tree,NV_ADD); - stkseek(stkp,offset); - np->nvalue.i = pkind; diff --git a/ksh-20120801-kshmfix.patch b/ksh-20120801-kshmfix.patch deleted file mode 100644 index cc68406..0000000 --- a/ksh-20120801-kshmfix.patch +++ /dev/null @@ -1,66 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.monintoron ksh-20120801/src/cmd/ksh93/sh/main.c ---- ksh-20120801/src/cmd/ksh93/sh/main.c.monintoron 2013-05-31 10:15:02.738828102 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/main.c 2013-05-31 10:15:36.057095262 +0200 -@@ -406,10 +406,10 @@ static void exfile(register Shell_t *shp - { - buff.mode = SH_JMPEXIT; - sh_onoption(SH_TRACKALL); -- sh_offoption(SH_MONITOR); - } - sh_offstate(SH_INTERACTIVE); -- sh_offstate(SH_MONITOR); -+ if(sh_isoption(SH_MONITOR)) -+ sh_onstate(SH_MONITOR); - sh_offstate(SH_HISTORY); - sh_offoption(SH_HISTORY); - } -diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.orig ksh-20120801/src/cmd/ksh93/sh/jobs.c ---- ksh-20120801/src/cmd/ksh93/sh/jobs.c.orig 2013-05-31 10:12:28.358590452 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/jobs.c 2013-05-31 10:16:51.203697890 +0200 -@@ -548,7 +548,7 @@ int job_reap(register int sig) - { - px = job_byjid((int)pw->p_job); - for(; px && (px->p_flag&P_DONE); px=px->p_nxtproc); -- if(!px) -+ if(!px && sh_isoption(SH_INTERACTIVE)) - tcsetpgrp(JOBTTY,job.mypid); - } - #ifndef SHOPT_BGX -@@ -842,10 +842,11 @@ static void job_set(register struct proc - - static void job_reset(register struct process *pw) - { -+ Shell_t *shp = pw->p_shp; - /* save the terminal state for current job */ - #ifdef SIGTSTP - job_fgrp(pw,tcgetpgrp(job.fd)); -- if(tcsetpgrp(job.fd,job.mypid) !=0) -+ if(sh_isoption(SH_INTERACTIVE) && tcsetpgrp(job.fd,job.mypid) !=0) - return; - #endif /* SIGTSTP */ - /* force the following tty_get() to do a tcgetattr() unless fg */ -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig 2013-05-31 10:12:27.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2013-05-31 10:18:14.650367185 +0200 -@@ -2201,7 +2201,7 @@ int sh_exec(register const Shnode_t *t, - } - shp->exitval = n; - #ifdef SIGTSTP -- if(!pipejob && sh_isstate(SH_MONITOR)) -+ if(!pipejob && sh_isstate(SH_MONITOR) && sh_isoption(SH_INTERACTIVE)) - tcsetpgrp(JOBTTY,shp->gd->pid); - #endif /*SIGTSTP */ - job.curpgid = savepgid; -diff -up ksh-20120801/src/cmd/ksh93/edit/edit.c.kshmfix ksh-20120801/src/cmd/ksh93/edit/edit.c ---- ksh-20120801/src/cmd/ksh93/edit/edit.c.kshmfix 2013-09-23 10:46:57.007256192 +0200 -+++ ksh-20120801/src/cmd/ksh93/edit/edit.c 2013-09-23 10:47:43.988937610 +0200 -@@ -1050,7 +1050,7 @@ int ed_getchar(register Edit_t *ep,int m - { - if(mode<=0 && -c == ep->e_intr) - { -- sh_fault(SIGINT); -+ killpg(getpgrp(),SIGINT); - siglongjmp(ep->e_env, UINTR); - } - if(mode<=0 && ep->sh->st.trap[SH_KEYTRAP]) - diff --git a/ksh-20120801-lexfix.patch b/ksh-20120801-lexfix.patch deleted file mode 100644 index 9150da8..0000000 --- a/ksh-20120801-lexfix.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/edit/edit.c.trajfiks ksh-20120801/src/cmd/ksh93/edit/edit.c ---- ksh-20120801/src/cmd/ksh93/edit/edit.c.trajfiks 2012-08-02 00:18:19.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/edit/edit.c 2014-02-06 12:12:11.570942651 +0100 -@@ -53,6 +53,7 @@ - - static char CURSOR_UP[20] = { ESC, '[', 'A', 0 }; - static char KILL_LINE[20] = { ESC, '[', 'J', 0 }; -+static char *savelex; - - - -@@ -232,6 +233,8 @@ int tty_set(int fd, int action, struct t - void tty_cooked(register int fd) - { - register Edit_t *ep = (Edit_t*)(shgd->ed_context); -+ if(ep->sh->st.trap[SH_KEYTRAP] && savelex) -+ memcpy(ep->sh->lex_context,savelex,ep->sh->lexsize); - ep->e_keytrap = 0; - if(ep->e_raw==0) - return; -@@ -783,6 +786,13 @@ void ed_setup(register Edit_t *ep, int f - ep->e_lbuf[n] = *pp++; - ep->e_default = 0; - } -+ if(ep->sh->st.trap[SH_KEYTRAP]) -+ { -+ if(!savelex) -+ savelex = (char*)malloc(shp->lexsize); -+ if(savelex) -+ memcpy(savelex, ep->sh->lex_context, ep->sh->lexsize); -+ } - } - - static void ed_putstring(register Edit_t *ep, const char *str) -diff -up ksh-20120801/src/cmd/ksh93/include/defs.h.trajfiks ksh-20120801/src/cmd/ksh93/include/defs.h ---- ksh-20120801/src/cmd/ksh93/include/defs.h.trajfiks 2014-02-06 12:18:13.149091836 +0100 -+++ ksh-20120801/src/cmd/ksh93/include/defs.h 2014-02-06 12:18:13.175091784 +0100 -@@ -224,6 +224,7 @@ struct shared - int xargexit; \ - int nenv; \ - mode_t mask; \ -+ int lexsize; \ - Env_t *env; \ - void *init_context; \ - void *mac_context; \ -diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.trajfiks ksh-20120801/src/cmd/ksh93/sh/lex.c ---- ksh-20120801/src/cmd/ksh93/sh/lex.c.trajfiks 2014-02-06 12:19:13.587950320 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/lex.c 2014-02-06 12:19:13.623950219 +0100 -@@ -268,6 +268,7 @@ Lex_t *sh_lexopen(Lex_t *lp, Shell_t *sp - { - lp = (Lex_t*)newof(0,Lex_t,1,0); - lp->sh = sp; -+ sp->lexsize = sizeof(Lex_t); - } - fcnotify(lex_advance,lp); - lp->lex.intest = lp->lex.incase = lp->lex.skipword = lp->lexd.warn = 0; diff --git a/ksh-20120801-locking.patch b/ksh-20120801-locking.patch deleted file mode 100644 index 189d254..0000000 --- a/ksh-20120801-locking.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.locking ksh-20120801/src/cmd/ksh93/include/jobs.h ---- ksh-20120801/src/cmd/ksh93/include/jobs.h.locking 2014-06-27 15:51:07.144923719 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/jobs.h 2014-06-27 15:52:56.463272276 +0200 -@@ -149,15 +149,18 @@ extern struct jobs job; - #define vmbusy() 0 - #endif - --#define job_lock() (job.in_critical++) -+#define asoincint(p) __sync_fetch_and_add(p,1) -+#define asodecint(p) __sync_fetch_and_sub(p,1) -+ -+#define job_lock() asoincint(&job.in_critical) - #define job_unlock() \ - do { \ - int sig; \ -- if (!--job.in_critical && (sig = job.savesig)) \ -+ if (asodecint(&job.in_critical)==1 && (sig = job.savesig)) \ - { \ -- if (!job.in_critical++ && !vmbusy()) \ -+ if (!asoincint(&job.in_critical) && !vmbusy()) \ - job_reap(sig); \ -- job.in_critical--; \ -+ asodecint(&job.in_critical); \ - } \ - } while(0) - diff --git a/ksh-20120801-macro.patch b/ksh-20120801-macro.patch deleted file mode 100644 index 004a5eb..0000000 --- a/ksh-20120801-macro.patch +++ /dev/null @@ -1,178 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/io.h.macro ksh-20120801/src/cmd/ksh93/include/io.h ---- ksh-20120801/src/cmd/ksh93/include/io.h.macro 2012-07-18 16:12:38.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/io.h 2013-07-04 16:14:05.809595966 +0200 -@@ -81,6 +81,7 @@ extern void sh_iosave(Shell_t *, int,in - extern int sh_iovalidfd(Shell_t*, int); - extern int sh_inuse(Shell_t*, int); - extern void sh_iounsave(Shell_t*); -+extern void iounpipe(Shell_t*); - extern int sh_chkopen(const char*); - extern int sh_ioaccess(int,int); - extern int sh_devtofd(const char*); -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.macro ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.macro 2013-07-04 16:14:05.783595751 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2013-07-04 16:15:46.673432991 +0200 -@@ -171,7 +171,7 @@ void sh_subfork(void) - { - register struct subshell *sp = subshell_data; - Shell_t *shp = sp->shp; -- int curenv = shp->curenv; -+ int curenv = shp->curenv, comsub=shp->comsub; - pid_t pid; - char *trap = shp->st.trapcom[0]; - if(trap) -@@ -204,7 +204,7 @@ void sh_subfork(void) - shp->comsub = 0; - SH_SUBSHELLNOD->nvalue.s = 0; - sp->subpid=0; -- shp->st.trapcom[0] = trap; -+ shp->st.trapcom[0] = (comsub==2?NULL:trap); - shp->savesig = 0; - } - } -@@ -743,7 +743,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - fchdir(shp->pwdfd); - } - shp->subshare = sp->subshare; -- shp->comsub = sp->comsub; - shp->subdup = sp->subdup; - #if SHOPT_COSHELL - shp->coshell = sp->coshell; -@@ -773,7 +772,12 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - if(nsig>0) - kill(getpid(),nsig); - if(sp->subpid) -+ { - job_wait(sp->subpid); -+ if(comsub>1) -+ iounpipe(shp); -+ } -+ shp->comsub = sp->comsub; - if(comsub && iop && sp->pipefd<0) - sfseek(iop,(off_t)0,SEEK_SET); - if(shp->trapnote) -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.macro ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.macro 2013-07-04 16:14:05.800595891 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2013-07-04 16:14:05.810595975 +0200 -@@ -102,11 +102,11 @@ struct funenv - * temp file. - */ - static int subpipe[3],subdup,tsetio,usepipe; --static void iounpipe(Shell_t*); -+void iounpipe(Shell_t*); - --static int iousepipe(Shell_t *shp) -+int iousepipe(Shell_t *shp) - { -- int i; -+ int fd=sffileno(sfstdout),i,err=errno; - if(usepipe) - { - usepipe++; -@@ -115,13 +115,18 @@ static int iousepipe(Shell_t *shp) - if(sh_rpipe(subpipe) < 0) - return(0); - usepipe++; -- fcntl(subpipe[0],F_SETFD,FD_CLOEXEC); -- subpipe[2] = sh_fcntl(1,F_DUPFD,10); -- fcntl(subpipe[2],F_SETFD,FD_CLOEXEC); -+ if(shp->comsub!=1) -+ { -+ subpipe[2] = sh_fcntl(subpipe[1],F_DUPFD,10); -+ sh_close(subpipe[1]); -+ return(1); -+ } -+ subpipe[2] = sh_fcntl(fd,F_dupfd_cloexec,10); - shp->fdstatus[subpipe[2]] = shp->fdstatus[1]; -- close(1); -- fcntl(subpipe[1],F_DUPFD,1); -- shp->fdstatus[1] = shp->fdstatus[subpipe[1]]; -+ while(close(fd)<0 && errno==EINTR) -+ errno = err; -+ fcntl(subpipe[1],F_DUPFD,fd); -+ shp->fdstatus[1] = shp->fdstatus[subpipe[1]]&~IOCLEX; - sh_close(subpipe[1]); - if(subdup=shp->subdup) for(i=0; i < 10; i++) - { -@@ -135,14 +140,23 @@ static int iousepipe(Shell_t *shp) - return(1); - } - --static void iounpipe(Shell_t *shp) -+void iounpipe(Shell_t *shp) - { -- int n; -+ int fd=sffileno(sfstdout),n,err=errno; - char buff[SF_BUFSIZE]; -- close(1); -- fcntl(subpipe[2], F_DUPFD, 1); -- shp->fdstatus[1] = shp->fdstatus[subpipe[2]]; -+ if(!usepipe) -+ return; - --usepipe; -+ if(shp->comsub>1) -+ { -+ sh_close(subpipe[2]); -+ while(read(subpipe[0],buff,sizeof(buff))>0); -+ goto done; -+ } -+ while(close(fd)<0 && errno==EINTR) -+ errno = err; -+ fcntl(subpipe[2], F_DUPFD, fd); -+ shp->fdstatus[1] = shp->fdstatus[subpipe[2]]; - if(subdup) for(n=0; n < 10; n++) - { - if(subdup&(1<subshell) - { - sh_subtmpfile(shp); -- if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK)) -- unpipe=iousepipe(shp); - if((type&(FAMP|TFORK))==(FAMP|TFORK)) -- sh_subfork(); -+ { -+ if(shp->comsub && !(shp->fdstatus[1]&IONOSEEK)) -+ { -+ unpipe = iousepipe(shp); -+ sh_subfork(); -+ } -+ } - } - no_fork = !ntflag && !(type&(FAMP|FPOU)) && !shp->subshell && - !(shp->st.trapcom[SIGINT] && *shp->st.trapcom[SIGINT]) && -@@ -3495,8 +3514,7 @@ static void sh_funct(Shell_t *shp,Namval - struct funenv fun; - char *fname = nv_getval(SH_FUNNAMENOD); - struct Level *lp =(struct Level*)(SH_LEVELNOD->nvfun); -- int level, pipepid=shp->pipepid, comsub=shp->comsub; -- shp->comsub = 0; -+ int level, pipepid=shp->pipepid; - shp->pipepid = 0; - sh_stats(STAT_FUNCT); - if(!lp->hdr.disc) -@@ -3539,7 +3557,6 @@ static void sh_funct(Shell_t *shp,Namval - lp->maxlevel = level; - SH_LEVELNOD->nvalue.s = lp->maxlevel; - shp->last_root = nv_dict(DOTSHNOD); -- shp->comsub = comsub; - #if 0 - nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE); - #else diff --git a/ksh-20120801-manfix4.patch b/ksh-20120801-manfix4.patch deleted file mode 100644 index 6355445..0000000 --- a/ksh-20120801-manfix4.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh.1.manfix4 ksh-20120801/src/cmd/ksh93/sh.1 ---- ksh-20120801/src/cmd/ksh93/sh.1.manfix4 2014-05-22 12:04:51.593750721 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh.1 2014-05-22 12:05:32.561556452 +0200 -@@ -4147,7 +4147,7 @@ command are ignored if the command is fo - .B & - and the - .B monitor --option is not active. -+option is active. - Otherwise, signals have the values - inherited by the shell from its parent - (but see also diff --git a/ksh-20120801-mb-after-argvar.patch b/ksh-20120801-mb-after-argvar.patch deleted file mode 100644 index 1b71a57..0000000 --- a/ksh-20120801-mb-after-argvar.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.orig ksh-20120801/src/cmd/ksh93/sh/macro.c ---- ksh-20120801/src/cmd/ksh93/sh/macro.c.orig 2015-08-24 14:29:58.602967855 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2015-08-24 14:31:13.682850008 -0300 -@@ -1479,7 +1479,10 @@ retry1: - default: - goto nosub; - } -- c = fcmbget(&LEN); -+ if(type) -+ c = fcmbget(&LEN); -+ else -+ c = fcget(); - if(type>M_TREE) - { - if(c!=RBRACE) diff --git a/ksh-20120801-memlik.patch b/ksh-20120801-memlik.patch deleted file mode 100644 index 31f1eb9..0000000 --- a/ksh-20120801-memlik.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/array.c.memlik ksh-20120801/src/cmd/ksh93/sh/array.c ---- ksh-20120801/src/cmd/ksh93/sh/array.c.memlik 2012-06-07 00:00:42.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/array.c 2013-06-11 16:52:47.557123973 +0200 -@@ -1701,7 +1701,11 @@ void *nv_associative(register Namval_t * - ap->header.scope = 0; - } - else -- dtclose(ap->header.table); -+ { -+ if((ap->header.nelem&ARRAY_MASK)==0 && (ap->cur=nv_search("0",ap->header.table,0))) -+ nv_associative(np,(char*)0,NV_ADELETE); -+ dtclose(ap->header.table); -+ } - return((void*)ap); - case NV_ANEXT: - if(!ap->pos) -diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.memlik ksh-20120801/src/cmd/ksh93/sh/name.c ---- ksh-20120801/src/cmd/ksh93/sh/name.c.memlik 2012-07-23 18:21:57.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/name.c 2013-06-11 16:19:41.036648218 +0200 -@@ -2465,6 +2465,8 @@ static void table_unset(Shell_t *shp, re - } - } - npnext = (Namval_t*)dtnext(root,np); -+ if(nv_arrayptr(np)) -+ nv_putsub(np,NIL(char*),ARRAY_SCAN); - _nv_unset(np,flags); - nv_delete(np,root,0); - } -@@ -3326,7 +3328,7 @@ int nv_rename(register Namval_t *np, int - shp->last_root = last_root; - if(flags&NV_MOVE) - { -- if(arraynp && !nv_isattr(np,NV_MINIMAL) && (mp=(Namval_t*)np->nvenv) && (ap=nv_arrayptr(mp))) -+ if(arraynp && !nv_isattr(np,NV_MINIMAL) && (mp=(Namval_t*)np->nvenv) && (ap=nv_arrayptr(mp)) && !ap->fun) - ap->nelem++; - } - if((nv_arrayptr(nr) && !arraynr) || nv_isvtree(nr)) diff --git a/ksh-20120801-memlik3.patch b/ksh-20120801-memlik3.patch deleted file mode 100644 index 9df57d2..0000000 --- a/ksh-20120801-memlik3.patch +++ /dev/null @@ -1,76 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/name.h.memlik3 ksh-20120801/src/cmd/ksh93/include/name.h ---- ksh-20120801/src/cmd/ksh93/include/name.h.memlik3 2012-05-10 18:33:41.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/name.h 2014-01-22 14:14:32.774483776 +0100 -@@ -215,7 +215,7 @@ extern Namval_t *nv_mount(Namval_t*, co - extern Namval_t *nv_arraychild(Namval_t*, Namval_t*, int); - extern int nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*); - extern void nv_outnode(Namval_t*,Sfio_t*, int, int); --extern int nv_subsaved(Namval_t*); -+extern int nv_subsaved(Namval_t*,int); - extern void nv_typename(Namval_t*, Sfio_t*); - extern void nv_newtype(Namval_t*); - extern int nv_istable(Namval_t*); -diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.memlik3 ksh-20120801/src/cmd/ksh93/sh/name.c ---- ksh-20120801/src/cmd/ksh93/sh/name.c.memlik3 2014-01-22 14:14:32.751483987 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/name.c 2014-01-22 14:14:32.775483767 +0100 -@@ -1297,7 +1297,7 @@ void nv_delete(Namval_t* np, Dt_t *root, - { - if(dtdelete(root,np)) - { -- if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np))) -+ if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np,flags&NV_TABLE))) - free((void*)np); - } - #if 0 -@@ -2461,14 +2461,14 @@ static void table_unset(Shell_t *shp, re - { - _nv_unset(nq,flags); - npnext = (Namval_t*)dtnext(root,nq); -- nv_delete(nq,root,0); -+ nv_delete(nq,root,NV_TABLE); - } - } - npnext = (Namval_t*)dtnext(root,np); - if(nv_arrayptr(np)) - nv_putsub(np,NIL(char*),ARRAY_SCAN); - _nv_unset(np,flags); -- nv_delete(np,root,0); -+ nv_delete(np,root,NV_TABLE); - } - } - -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.memlik3 ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.memlik3 2014-01-22 14:14:32.768483831 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2014-01-22 14:20:50.810236676 +0100 -@@ -218,16 +218,28 @@ void sh_subfork(void) - } - } - --int nv_subsaved(register Namval_t *np) -+int nv_subsaved(register Namval_t *np,int table) - { - register struct subshell *sp; -- register struct Link *lp; -+ register struct Link *lp, *lpprev; - for(sp = (struct subshell*)subshell_data; sp; sp=sp->prev) - { -- for(lp=sp->svar; lp; lp = lp->next) -+ lpprev = 0; -+ for(lp=sp->svar; lp; lpprev=lp, lp=lp->next) - { - if(lp->node==np) -+ { -+ if(table&NV_TABLE) -+ { -+ if(lpprev) -+ lpprev->next = lp->next; -+ else -+ sp->svar = lp->next; -+ free((void*)np); -+ free((void*)lp); -+ } - return(1); -+ } - } - } - return(0); diff --git a/ksh-20120801-mlikfiks.patch b/ksh-20120801-mlikfiks.patch deleted file mode 100644 index fbf016a..0000000 --- a/ksh-20120801-mlikfiks.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.mlikfiks ksh-20120801/src/cmd/ksh93/sh/lex.c ---- ksh-20120801/src/cmd/ksh93/sh/lex.c.mlikfiks 2013-07-22 12:45:30.923170264 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/lex.c 2013-07-22 12:46:25.235556905 +0200 -@@ -2465,7 +2465,7 @@ static int alias_exceptf(Sfio_t *iop,int - if(dp!=handle) - sfdisc(iop,dp); - } -- else if(type==SF_FINAL) -+ else if(type==SF_DPOP || type==SF_FINAL) - free((void*)ap); - goto done; - } -diff -up ksh-20120801/src/cmd/ksh93/sh/path.c.mlikfiks ksh-20120801/src/cmd/ksh93/sh/path.c ---- ksh-20120801/src/cmd/ksh93/sh/path.c.mlikfiks 2013-07-22 12:47:23.149990016 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/path.c 2013-07-22 12:48:33.363283877 +0200 -@@ -613,6 +613,7 @@ static void funload(Shell_t *shp,int fno - } - while((rp=dtnext(shp->fpathdict,rp)) && strcmp(pname,rp->fname)==0); - sh_close(fno); -+ free((void*)pname); - return; - } - sh_onstate(SH_NOLOG); -diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.aliasfix ksh-20120801/src/cmd/ksh93/sh/macro.c ---- ksh-20120801/src/cmd/ksh93/sh/macro.c.aliasfix 2013-07-29 15:03:45.841680475 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2013-07-29 15:04:23.871336821 +0200 -@@ -2085,6 +2085,7 @@ static void comsubst(Mac_t *mp,register - } - sfputc(stkp,c); - } -+ sfputc(stkp,' '); - c = stktell(stkp); - str=stkfreeze(stkp,1); - /* disable verbose and don't save in history file */ diff --git a/ksh-20120801-mtty.patch b/ksh-20120801-mtty.patch deleted file mode 100644 index d992a88..0000000 --- a/ksh-20120801-mtty.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.mtty ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.mtty 2014-01-22 16:52:06.441608750 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-01-22 16:52:06.485608361 +0100 -@@ -3163,7 +3169,7 @@ pid_t _sh_fork(Shell_t *shp,register pid - * completed. Make parent the job group id. - */ - if(postid==0) -- job.curpgid = parent; -+ job.curpgid = job.jobcontrol?parent:getpid(); - if(job.jobcontrol || (flags&FAMP)) - { - if(setpgid(parent,job.curpgid)<0 && errno==EPERM) diff --git a/ksh-20120801-noexeccdfix.patch b/ksh-20120801-noexeccdfix.patch deleted file mode 100644 index 47128e0..0000000 --- a/ksh-20120801-noexeccdfix.patch +++ /dev/null @@ -1,40 +0,0 @@ -From b8260293a8ed7849a358291faae7b58f4a05dcc9 Mon Sep 17 00:00:00 2001 -From: Kamil Dudka -Date: Mon, 10 Nov 2014 18:23:34 +0100 -Subject: [PATCH] Resolves: #1160923 - handle failure of fchdir() - -... and chdir() ---- - src/cmd/ksh93/bltins/cd_pwd.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/cmd/ksh93/bltins/cd_pwd.c b/src/cmd/ksh93/bltins/cd_pwd.c -index a972da6..c20959c 100644 ---- a/src/cmd/ksh93/bltins/cd_pwd.c -+++ b/src/cmd/ksh93/bltins/cd_pwd.c -@@ -329,18 +329,20 @@ int b_cd(int argc, char *argv[],Shbltin_t *context) - if(newdirfd >=0) - { - /* chdir for directories on HSM/tapeworms may take minutes */ -- if(fchdir(newdirfd) >= 0) -+ if((rval=fchdir(newdirfd)) >= 0) - { - if(shp->pwdfd >= 0) - sh_close(shp->pwdfd); - shp->pwdfd=newdirfd; - goto success; - } -+ else -+ sh_close(newdirfd); - } - #ifndef O_SEARCH - else - { -- if(chdir(dir) >=0) -+ if((rval=chdir(dir)) >=0) - { - if(shp->pwdfd >= 0) - { --- -2.1.0 - diff --git a/ksh-20120801-nohupfork.patch b/ksh-20120801-nohupfork.patch deleted file mode 100644 index 20cdeb9..0000000 --- a/ksh-20120801-nohupfork.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.nohupfork ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.nohupfork 2015-08-27 14:25:38.925378019 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2015-08-27 14:30:42.267058087 +0200 -@@ -2067,6 +2067,7 @@ int sh_exec(register const Shnode_t *t, - { - sh_exec(t->par.partre,flags); - shp->st.trapcom[0]=0; -+ sh_offoption(SH_INTERACTIVE); - sh_done(shp,0); - } - } diff --git a/ksh-20120801-nomulti.patch b/ksh-20120801-nomulti.patch deleted file mode 100644 index 5d7e7a4..0000000 --- a/ksh-20120801-nomulti.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.nomulti ksh-20120801/src/cmd/ksh93/sh/init.c ---- ksh-20120801/src/cmd/ksh93/sh/init.c.nomulti 2013-10-08 20:46:46.202471042 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2013-10-08 20:46:57.912331483 +0200 -@@ -1446,7 +1446,6 @@ Shell_t *sh_init(register int argc,regis - #endif /* SHOPT_TIMEOUT */ - /* initialize jobs table */ - job_clear(); -- sh_onoption(SH_MULTILINE); - if(argc>0) - { - /* check for restricted shell */ diff --git a/ksh-20120801-nv_open-memcmp.patch b/ksh-20120801-nv_open-memcmp.patch deleted file mode 100644 index 93b7e15..0000000 --- a/ksh-20120801-nv_open-memcmp.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/name.c b/src/cmd/ksh93/sh/name.c ---- a/src/cmd/ksh93/sh/name.c -+++ b/src/cmd/ksh93/sh/name.c -@@ -1425,7 +1425,7 @@ Namval_t *nv_open(const char *name, Dt_t *root, int flags) - { - if(xp->root!=root) - continue; -- if(*name==*xp->name && xp->namespace==shp->namespace && (flags&(NV_ARRAY|NV_NOSCOPE))==xp->flags && memcmp(xp->name,name,xp->len)==0 && (name[xp->len]==0 || name[xp->len]=='=' || name[xp->len]=='+')) -+ if(*name==*xp->name && xp->namespace==shp->namespace && (flags&(NV_ARRAY|NV_NOSCOPE))==xp->flags && strncmp(xp->name,name,xp->len)==0 && (name[xp->len]==0 || name[xp->len]=='=' || name[xp->len]=='+')) - { - sh_stats(STAT_NVHITS); - np = xp->np; diff --git a/ksh-20120801-oldenvinit.patch b/ksh-20120801-oldenvinit.patch deleted file mode 100644 index 8ee0863..0000000 --- a/ksh-20120801-oldenvinit.patch +++ /dev/null @@ -1,95 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.fixset ksh-20120801/src/cmd/ksh93/sh/init.c ---- ksh-20120801/src/cmd/ksh93/sh/init.c.fixset 2014-11-03 15:45:36.510997271 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2014-11-03 16:20:44.398917280 +0100 -@@ -2003,8 +2003,91 @@ static Dt_t *inittree(Shell_t *shp,const - * skip over items that are not name-value pairs - */ - -+ - static void env_init(Shell_t *shp) - { -+ register char *cp; -+ register Namval_t *np; -+ register char **ep=environ; -+ register char *next=0; -+#ifdef _ENV_H -+ shp->env = env_open(environ,3); -+ env_delete(shp->env,"_"); -+#endif -+ if(ep) -+ { -+ while(cp= *ep++) -+ { -+ if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=') -+ next = cp+4; -+ else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL))) -+ { -+ nv_onattr(np,NV_IMPORT); -+ np->nvenv = cp; -+ nv_close(np); -+ } -+ else /* swap with front */ -+ { -+ ep[-1] = environ[shp->nenv]; -+ environ[shp->nenv++] = cp; -+ } -+ } -+ while(cp=next) -+ { -+ if(next = strchr(++cp,'=')) -+ *next = 0; -+ np = nv_search(cp+2,shp->var_tree,NV_ADD); -+ if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT)) -+ { -+ int flag = *(unsigned char*)cp-' '; -+ int size = *(unsigned char*)(cp+1)-' '; -+ if((flag&NV_INTEGER) && size==0) -+ { -+ /* check for floating*/ -+ char *ep,*val = nv_getval(np); -+ strtol(val,&ep,10); -+ if(*ep=='.' || *ep=='e' || *ep=='E') -+ { -+ char *lp; -+ flag |= NV_DOUBLE; -+ if(*ep=='.') -+ { -+ strtol(ep+1,&lp,10); -+ if(*lp) -+ ep = lp; -+ } -+ if(*ep && *ep!='.') -+ { -+ flag |= NV_EXPNOTE; -+ size = ep-val; -+ } -+ else -+ size = strlen(ep); -+ size--; -+ } -+ } -+ nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size); -+ } -+ else -+ cp += 2; -+ } -+ } -+#ifdef _ENV_H -+ env_delete(shp->env,e_envmarker); -+#endif -+ if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED)) -+ { -+ nv_offattr(PWDNOD,NV_TAGGED); -+ path_pwd(shp,0); -+ } -+ if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED)) -+ sh_onoption(SH_RESTRICTED); /* restricted shell */ -+ return; -+} -+ -+ -+static void env_init_backup(Shell_t *shp) -+{ - register char *cp; - register Namval_t *np,*mp; - register char **ep=environ; diff --git a/ksh-20120801-parserfix.patch b/ksh-20120801-parserfix.patch deleted file mode 100644 index 1dc7695..0000000 --- a/ksh-20120801-parserfix.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- ksh_20120801/src/cmd/ksh93/sh/lex.c 2012-06-12 21:05:18.000000000 +0200 -+++ ksh_20120801/src/cmd/ksh93/sh/lex.c 2015-08-18 17:42:06.138076565 +0200 -@@ -1603,7 +1603,14 @@ static int comsub(register Lex_t *lp, in - if(n==4) - break; - if(sh_lexstates[ST_NAME][c]) -+ { -+ if(c==' ' || c=='\t') -+ { -+ n = 0; -+ continue; -+ } - goto skip; -+ } - word[n++] = c; - } - if(sh_lexstates[ST_NAME][c]==S_BREAK) ---- ksh_20120801/src/cmd/ksh93/tests/subshell.sh 2012-07-25 23:40:29.000000000 +0200 -+++ ksh_20120801/src/cmd/ksh93/tests/subshell.sh 2015-08-18 17:42:06.143076553 +0200 -@@ -617,4 +617,6 @@ do if [[ -e $f ]] - fi - done - -+$SHELL > /dev/null -c 'echo $(for x in whatever; do case y in *) true;; esac; done)' || err_exit 'syntax error with case in command substitution' -+ - exit $((Errors<125?Errors:125)) diff --git a/ksh-20120801-posix-exit.patch b/ksh-20120801-posix-exit.patch deleted file mode 100644 index a4b44d0..0000000 --- a/ksh-20120801-posix-exit.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/fault.c b/src/cmd/ksh93/sh/fault.c ---- a/src/cmd/ksh93/sh/fault.c -+++ b/src/cmd/ksh93/sh/fault.c -@@ -643,7 +643,7 @@ void sh_done(void *ptr, register int sig) - sfsync((Sfio_t*)sfstdin); - sfsync((Sfio_t*)shp->outpool); - sfsync((Sfio_t*)sfstdout); -- if(savxit&SH_EXITSIG) -+ if((savxit&SH_EXITMASK) == shp->lastsig) - sig = savxit&SH_EXITMASK; - if(sig) - { -@@ -668,6 +668,12 @@ void sh_done(void *ptr, register int sig) - if(sh_isoption(SH_NOEXEC)) - kiaclose((Lex_t*)shp->lex_context); - #endif /* SHOPT_KIA */ -+ -+ /* Return POSIX exit code if last process exits due to signal */ -+ if (savxit & SH_EXITSIG) { -+ exit(128 + (savxit&SH_EXITMASK)); -+ } -+ - exit(savxit&SH_EXITMASK); - } diff --git a/ksh-20120801-retfix.patch b/ksh-20120801-retfix.patch deleted file mode 100644 index 5af1053..0000000 --- a/ksh-20120801-retfix.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix 2014-10-01 17:34:47.720532950 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2014-10-01 17:35:25.850350378 +0200 -@@ -655,7 +655,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - job.hack1_waitall=0; - if(comsub!=1 && shp->spid) - { -+ int c = shp->exitval; - job_wait(shp->spid); -+ shp->exitval = c; -+ exitset(); - if(shp->pipepid==shp->spid) - shp->spid = 0; - shp->pipepid = 0; diff --git a/ksh-20120801-rmdirfix.patch b/ksh-20120801-rmdirfix.patch deleted file mode 100644 index ae9dfd7..0000000 --- a/ksh-20120801-rmdirfix.patch +++ /dev/null @@ -1,505 +0,0 @@ -diff -up ksh20120801/src/cmd/ksh93/sh/subshell.c.orig ksh20120801/src/cmd/ksh93/sh/subshell.c ---- ksh20120801/src/cmd/ksh93/sh/subshell.c.orig 2012-07-17 23:54:21.000000000 +0200 -+++ ksh20120801/src/cmd/ksh93/sh/subshell.c 2012-10-24 15:03:44.436870792 +0200 -@@ -40,14 +40,6 @@ - # define PIPE_BUF 512 - #endif - --#ifndef O_SEARCH --# ifdef O_PATH --# define O_SEARCH O_PATH --# else --# define O_SEARCH 0 --# endif --#endif -- - /* - * Note that the following structure must be the same - * size as the Dtlink_t structure -@@ -84,7 +76,7 @@ static struct subshell - char *pwd; /* present working directory */ - const char *shpwd; /* saved pointer to sh.pwd */ - void *jobs; /* save job info */ -- int pwdfd; /* file descritor for pwd */ -+ int shpwdfd;/* fd for present working directory */ - mode_t mask; /* saved umask */ - short tmpfd; /* saved tmp file descriptor */ - short pipefd; /* read fd if pipe is created */ -@@ -101,7 +93,6 @@ static struct subshell - int subdup; - char subshare; - char comsub; -- char pwdclose; - #if SHOPT_COSHELL - void *coshell; - #endif /* SHOPT_COSHELL */ -@@ -518,7 +509,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - shp->pathinit = 0; - } - sp->pathlist = path_dup((Pathcomp_t*)shp->pathlist); -- sp->pwdfd = -1; - if(!shp->pwd) - path_pwd(shp,0); - sp->bckpid = shp->bckpid; -@@ -531,39 +521,14 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - shp->subshare = comsub==2 || (comsub==1 && sh_isoption(SH_SUBSHARE)); - if(comsub) - shp->comsub = comsub; -+ sp->shpwdfd=-1; - if(!comsub || !shp->subshare) - { -- struct subshell *xp; - sp->shpwd = shp->pwd; --#ifdef _lib_fchdir -- for(xp=sp->prev; xp; xp=xp->prev) -- { -- if(xp->pwdfd>0 && strcmp(xp->pwd,shp->pwd)==0) -- { -- sp->pwdfd = xp->pwdfd; -- break; -- } -- } -- if(sp->pwdfd<0) -- { -- int n = open(".",O_RDONLY); -- if(O_SEARCH && errno==EACCES) -- n = open(".",O_RDONLY); -- if(n>=0) -- { -- sp->pwdfd = n; -- if(n<10) -- { -- sp->pwdfd = sh_fcntl(n,F_DUPFD,10); -- close(n); -- } -- if(sp->pwdfd>0) -- { -- fcntl(sp->pwdfd,F_SETFD,FD_CLOEXEC); -- sp->pwdclose = 1; -- } -- } -- } -+ sp->shpwdfd=((shp->pwdfd >= 0))?sh_fcntl(shp->pwdfd, F_dupfd_cloexec, 10):-1; -+#ifdef O_SEARCH -+ if(sp->shpwdfd<0) -+ errormsg(SH_DICT,ERROR_system(1), "Can't obtain directory fd."); - #endif - sp->pwd = (shp->pwd?strdup(shp->pwd):0); - sp->mask = shp->mask; -@@ -741,14 +706,11 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - Namval_t *pwdnod = sh_scoped(shp,PWDNOD); - if(shp->pwd) - { -- if(sp->pwdfd >=0) -- { -- if(fchdir(sp->pwdfd)<0) -- chdir(sp->pwd); -- } -- else -- chdir(sp->pwd); - shp->pwd=sp->pwd; -+#ifndef O_SEARCH -+ if (sp->shpwdfd < 0) -+ chdir(shp->pwd); -+#endif - path_newdir(shp,shp->pathlist); - } - if(nv_isattr(pwdnod,NV_NOFREE)) -@@ -762,8 +724,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - } - else - free((void*)sp->pwd); -- if(sp->pwdclose) -- close(sp->pwdfd); - if(sp->mask!=shp->mask) - umask(shp->mask=sp->mask); - if(shp->coutpipe!=sp->coutpipe) -@@ -775,6 +735,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - shp->cpipe[1] = sp->cpipe; - shp->coutpipe = sp->coutpipe; - } -+ if(sp->shpwdfd >=0) -+ { -+ if(shp->pwdfd >=0) -+ sh_close(shp->pwdfd); -+ shp->pwdfd=sp->shpwdfd; -+ fchdir(shp->pwdfd); -+ } - shp->subshare = sp->subshare; - shp->comsub = sp->comsub; - shp->subdup = sp->subdup; -diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.orig ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c ---- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.orig 2012-08-02 16:50:40.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c 2012-10-24 15:37:46.814469045 +0200 -@@ -38,6 +38,10 @@ - #include "builtins.h" - #include - -+#ifndef EINTR_REPEAT -+# define EINTR_REPEAT(expr) while((expr) && (errno == EINTR)) errno=0; -+#endif -+ - /* - * Invalidate path name bindings to relative paths - */ -@@ -49,6 +53,95 @@ static void rehash(register Namval_t *np - _nv_unset(np,0); - } - -+/* -+ * Obtain a file handle to the directory "path" relative to directory -+ * "dir", or open a NFSv4 xattr directory handle for file dir/path. -+ */ -+int sh_diropenat(Shell_t *shp, int dir, const char *path, bool xattr) -+{ -+ int fd,shfd; -+ int savederrno=errno; -+#ifndef AT_FDCWD -+ NOT_USED(dir); -+#endif -+#ifndef O_XATTR -+ NOT_USED(xattr); -+#endif -+ -+#ifdef O_XATTR -+ if(xattr) -+ { -+ int apfd; /* attribute parent fd */ -+ /* open parent node... */ -+ EINTR_REPEAT((apfd = openat(dir, path, O_RDONLY|O_NONBLOCK|O_cloexec)) < 0); -+ if(apfd < 0) -+ return -1; -+ -+ /* ... and then open a fd to the attribute directory */ -+ EINTR_REPEAT((fd = openat(apfd, e_dot, O_XATTR|O_cloexec)) < 0); -+ -+ savederrno = errno; -+ EINTR_REPEAT(close(apfd) < 0); -+ errno = savederrno; -+ } -+ else -+#endif -+ { -+#ifdef AT_FDCWD -+ /* -+ * Open directory. First we try without |O_SEARCH| and -+ * if this fails with EACCESS we try with |O_SEARCH| -+ * again. -+ * This is required ... -+ * - ... because some platforms may require that it can -+ * only be used for directories while some filesystems -+ * (e.g. Reiser4 or HSM systems) allow a |fchdir()| into -+ * files, too) -+ * - ... to preserve the semantics of "cd", e.g. -+ * otherwise "cd" would return [No access] instead of -+ * [Not a directory] for files on filesystems which do -+ * not allow a "cd" into files. -+ * - ... to allow that a -+ * $ redirect {n} 10 and *register* the fd number with the shell */ -+ shfd = sh_fcntl(fd, F_dupfd_cloexec, 10); -+ savederrno=errno; -+ sh_close(fd); -+ errno=savederrno; -+ return(shfd); -+} -+ - int b_cd(int argc, char *argv[],Shbltin_t *context) - { - register char *dir; -@@ -56,18 +149,20 @@ int b_cd(int argc, char *argv[],Shbltin_ - register const char *dp; - register Shell_t *shp = context->shp; - int saverrno=0; -- int rval,flag=0; -+ int rval; -+ bool flag=false,xattr=false; - char *oldpwd; -+ int newdirfd; - Namval_t *opwdnod, *pwdnod; - if(sh_isoption(SH_RESTRICTED)) - errormsg(SH_DICT,ERROR_exit(1),e_restricted+4); - while((rval = optget(argv,sh_optcd))) switch(rval) - { - case 'L': -- flag = 0; -+ flag = false; - break; - case 'P': -- flag = 1; -+ flag = true; - break; - case ':': - errormsg(SH_DICT,2, "%s", opt_info.arg); -@@ -179,14 +274,72 @@ int b_cd(int argc, char *argv[],Shbltin_ - continue; - #endif /* SHOPT_FS_3D */ - } -+ rval = newdirfd = sh_diropenat(shp, shp->pwdfd, -+ path_relative(shp,stakptr(PATH_OFFSET)), xattr); -+ if(newdirfd >=0) -+ { -+ /* chdir for directories on HSM/tapeworms may take minutes */ -+ if(fchdir(newdirfd) >= 0) -+ { -+ if(shp->pwdfd >= 0) -+ sh_close(shp->pwdfd); -+ shp->pwdfd=newdirfd; -+ goto success; -+ } -+ } -+#ifndef O_SEARCH -+ else -+ { - if((rval=chdir(path_relative(shp,stakptr(PATH_OFFSET)))) >= 0) -- goto success; -- if(errno!=ENOENT && saverrno==0) -+ { -+ if(shp->pwdfd >= 0) -+ { -+ sh_close(shp->pwdfd); -+#ifdef AT_FDCWD -+ shp->pwdfd = AT_FDCWD; -+#else -+ shp->pwdfd = -1; -+#endif -+ } -+ } -+ } -+#endif -+ if(saverrno==0) - saverrno=errno; -+ if(newdirfd >=0) -+ sh_close(newdirfd); - } - while(cdpath); - if(rval<0 && *dir=='/' && *(path_relative(shp,stakptr(PATH_OFFSET)))!='/') -- rval = chdir(dir); -+ { -+ rval = newdirfd = sh_diropenat(shp, -+ shp->pwdfd, -+ dir, xattr); -+ if(newdirfd >=0) -+ { -+ /* chdir for directories on HSM/tapeworms may take minutes */ -+ if(fchdir(newdirfd) >= 0) -+ { -+ if(shp->pwdfd >= 0) -+ sh_close(shp->pwdfd); -+ shp->pwdfd=newdirfd; -+ goto success; -+ } -+ } -+#ifndef O_SEARCH -+ else -+ { -+ if(chdir(dir) >=0) -+ { -+ if(shp->pwdfd >= 0) -+ { -+ sh_close(shp->pwdfd); -+ shp->pwdfd=-1; -+ } -+ } -+ } -+#endif -+ } - /* use absolute chdir() if relative chdir() fails */ - if(rval<0) - { -@@ -213,7 +366,7 @@ success: - if(*dir != '/') - return(0); - nv_putval(opwdnod,oldpwd,NV_RDONLY); -- flag = strlen(dir); -+ flag = (strlen(dir)>0)?true:false; - /* delete trailing '/' */ - while(--flag>0 && dir[flag]=='/') - dir[flag] = 0; -diff -up ksh-20120801/src/cmd/ksh93/include/shell.h.orig ksh-20120801/src/cmd/ksh93/include/shell.h ---- ksh-20120801/src/cmd/ksh93/include/shell.h.orig 2012-07-17 22:07:40.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/shell.h 2012-10-24 15:42:10.756987230 +0200 -@@ -145,6 +145,7 @@ struct Shell_s - unsigned char trapnote; /* set when trap/signal is pending */ - char shcomp; /* set when runing shcomp */ - short subshell; /* set for virtual subshell */ -+ int pwdfd; /* file descriptor for pwd */ - #ifdef _SH_PRIVATE - _SH_PRIVATE - #endif /* _SH_PRIVATE */ -diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.orig ksh-20120801/src/cmd/ksh93/sh/init.c ---- ksh-20120801/src/cmd/ksh93/sh/init.c.orig 2012-05-11 19:19:10.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2012-10-24 15:31:59.659485151 +0200 -@@ -1365,6 +1365,18 @@ Shell_t *sh_init(register int argc,regis - } - } - sh_ioinit(shp); -+#ifdef AT_FDCWD -+ shp->pwdfd = sh_diropenat(shp, AT_FDCWD, e_dot, false); -+#else -+ /* Systems without AT_FDCWD/openat() do not use the |dir| argument */ -+ shp->pwdfd = sh_diropenat(shp, -1, e_dot, false); -+#endif -+#ifdef O_SEARCH -+ /* This should _never_ happen, guranteed by design and goat sacrifice */ -+ if(shp->pwdfd < 0) -+ errormsg(SH_DICT,ERROR_system(1), "Can't obtain directory fd."); -+#endif -+ - /* initialize signal handling */ - sh_siginit(shp); - stakinstall(NIL(Stak_t*),nospace); -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig 2012-07-23 16:49:32.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2012-10-24 15:35:02.209539671 +0200 -@@ -1348,8 +1348,12 @@ int sh_exec(register const Shnode_t *t, - { - if(!shp->pwd) - path_pwd(shp,0); -- if(shp->pwd) -- stat(".",&statb); -+#ifndef O_SEARCH -+ else if (shp->pwdfd>=0) -+ fstat(shp->pwdfd,&statb); -+ else if (shp->pwd) -+ stat(e_dot,&statb); -+#endif - sfsync(NULL); - share = sfset(sfstdin,SF_SHARE,0); - sh_onstate(SH_STOPOK); -@@ -1428,14 +1432,32 @@ int sh_exec(register const Shnode_t *t, - sh_offstate(SH_NOFORK); - if(!(nv_isattr(np,BLT_ENV))) - { -- if(shp->pwd) -+#ifdef O_SEARCH -+ while((fchdir(shp->pwdfd) < 0) && errno==EINTR) -+ errno = 0; -+#else -+ if(shp->pwd || (shp->pwdfd >= 0)) - { - struct stat stata; - stat(".",&stata); - /* restore directory changed */ - if(statb.st_ino!=stata.st_ino || statb.st_dev!=stata.st_dev) -- chdir(shp->pwd); -+ { -+ /* chdir for directories on HSM/tapeworms may take minutes */ -+ int err=errno; -+ if(shp->pwdfd >= 0) -+ { -+ while((fchdir(shp->pwdfd) < 0) && errno==EINTR) -+ errno = err; -+ } -+ else -+ { -+ while((chdir(shp->pwd) < 0) && errno==EINTR) -+ errno = err; -+ } -+ } - } -+#endif /* O_SEARCH */ - sh_offstate(SH_STOPOK); - if(share&SF_SHARE) - sfset(sfstdin,SF_PUBLIC|SF_SHARE,1); -diff -up ksh-20120801/src/lib/libast/features/common.orig ksh-20120801/src/lib/libast/features/common ---- ksh-20120801/src/lib/libast/features/common.orig 2011-12-12 20:55:33.000000000 +0100 -+++ ksh-20120801/src/lib/libast/features/common 2012-10-24 15:54:35.433885131 +0200 -@@ -463,6 +463,66 @@ typ uintptr_t stdint.h inttypes.h no{ - typedef unsigned _ast_int4_t uintptr_t; - #endif - }end -+typ _Bool = uint8_t -+cat{ -+ #if defined(_STDC_C99) || __STDC_VERSION__ >= 199901L -+ #include -+ #else -+ #define bool _Bool -+ #define false 0 -+ #define true 1 -+ #endif -+}end -+tst key __thread -lpthread note{ __thread keyword exists and works with -lpthread }end execute{ -+ #include -+ -+ #define INITIAL 1 -+ #define LOOP 100 -+ -+ static __thread int specific = INITIAL; -+ static int global = 0; -+ -+ static void* worker(void* arg) -+ { -+ int k; -+ int v; -+ v = (int)(arg - 0); -+ for (k = 0; k < LOOP; ++k) -+ { -+ specific += v; -+ usleep(1); -+ } -+ if (specific != (INITIAL + LOOP * v)) -+ global = 1; -+ return 0; -+ } -+ int main() -+ { -+ pthread_t th[2]; -+ -+ if (pthread_create(&th[0], 0, worker, (void*)0 + 5) || -+ pthread_create(&th[1], 0, worker, (void*)0 + 7)) -+ { -+ NOTE("pthread_create failed"); -+ return 1; -+ } -+ pthread_join(th[0], 0); -+ pthread_join(th[1], 0); -+ if (global) -+ { -+ NOTE("__thread variable not thread specific"); -+ return 1; -+ } -+ if (specific != INITIAL) -+ { -+ NOTE("main __thread variable changed by another thread"); -+ return 1; -+ } -+ return 0; -+ } -+}end no{ -+ #define __thread /* __thread keyword does not exist or does not work with -lpthread */ -+}end - - tst - -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{ - #if _STD_ && _hdr_stdarg diff --git a/ksh-20120801-roundit.patch b/ksh-20120801-roundit.patch deleted file mode 100644 index 015bc85..0000000 --- a/ksh-20120801-roundit.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/lib/libast/sfio/sfcvt.c.rounditgood ksh-20120801/src/lib/libast/sfio/sfcvt.c ---- ksh-20120801/src/lib/libast/sfio/sfcvt.c.rounditgood 2014-02-27 16:45:54.630161032 +0100 -+++ ksh-20120801/src/lib/libast/sfio/sfcvt.c 2014-02-27 16:45:54.658161205 +0100 -@@ -491,7 +491,7 @@ int format; /* conversion format */ - *decpt += 1; - if(!(format&SFFMT_EFORMAT)) - { /* add one more 0 for %f precision */ -- ep[-1] = '0'; -+ if(ep-sp>1) ep[-1] = '0'; - ep += 1; - } - } diff --git a/ksh-20120801-sh_iovalidfd.patch b/ksh-20120801-sh_iovalidfd.patch deleted file mode 100644 index bdd9154..0000000 --- a/ksh-20120801-sh_iovalidfd.patch +++ /dev/null @@ -1,79 +0,0 @@ -diff --git a/src/cmd/ksh93/include/io.h b/src/cmd/ksh93/include/io.h ---- a/src/cmd/ksh93/include/io.h -+++ b/src/cmd/ksh93/include/io.h -@@ -79,7 +79,7 @@ extern Sfio_t *sh_iostream(Shell_t*,int); - extern int sh_redirect(Shell_t*,struct ionod*,int); - extern void sh_iosave(Shell_t *, int,int,char*); - extern int safefdnumber(Shell_t* shp, int sfd); --extern int sh_iovalidfd(Shell_t*, int); -+extern bool sh_iovalidfd(Shell_t*, int); - extern int sh_inuse(Shell_t*, int); - extern void sh_iounsave(Shell_t*); - extern void iounpipe(Shell_t*); -diff --git a/src/cmd/ksh93/sh/io.c b/src/cmd/ksh93/sh/io.c ---- a/src/cmd/ksh93/sh/io.c -+++ b/src/cmd/ksh93/sh/io.c -@@ -403,38 +403,50 @@ static short filemapsize; - - /* ======== input output and file copying ======== */ - --int sh_iovalidfd(Shell_t *shp, int fd) -+bool sh_iovalidfd(Shell_t *shp, int fd) - { - Sfio_t **sftable = shp->sftable; - int max,n, **fdptrs = shp->fdptrs; - unsigned char *fdstatus = shp->fdstatus; - if(fd<0) -- return(0); -+ return(false); - if(fd < shp->gd->lim.open_max) -- return(1); -+ return(true); - max = strtol(astconf("OPEN_MAX",NiL,NiL),NiL,0); - if(fd >= max) - { - errno = EBADF; -- return(0); -+ return(false); - } - n = (fd+16)&~0xf; -- if(n > max) -- n = max; -+ if(n++ > max) -+ n = max+1; - max = shp->gd->lim.open_max; -- shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+1),1); -- if(max) -- memcpy(shp->sftable,sftable,max*sizeof(Sfio_t*)); -+ shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+sizeof(*fdstatus)),1); -+ -+ if(sftable) -+ { -+ --sftable; -+ if(max) -+ memcpy(shp->sftable,sftable,++max*sizeof(Sfio_t*)); -+ -+ } -+ - shp->fdptrs = (int**)(&shp->sftable[n]); - if(max) -- memcpy(shp->fdptrs,fdptrs,max*sizeof(int*)); -+ memcpy(shp->fdptrs,--fdptrs,max*sizeof(int*)); - shp->fdstatus = (unsigned char*)(&shp->fdptrs[n]); - if(max) -- memcpy(shp->fdstatus,fdstatus,max); -+ memcpy(shp->fdstatus,--fdstatus,max); -+ - if(sftable) - free((void*)sftable); -- shp->gd->lim.open_max = n; -- return(1); -+ -+ shp->sftable++; -+ shp->fdptrs++; -+ shp->fdstatus++; -+ shp->gd->lim.open_max = n-1; -+ return(true); - } - - int sh_inuse(Shell_t *shp, int fd) diff --git a/ksh-20120801-subshell-jobwait.patch b/ksh-20120801-subshell-jobwait.patch deleted file mode 100644 index 8dac4a1..0000000 --- a/ksh-20120801-subshell-jobwait.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c ---- a/src/cmd/ksh93/sh/xec.c -+++ b/src/cmd/ksh93/sh/xec.c -@@ -1647,8 +1647,9 @@ int sh_exec(register const Shnode_t *t, int flags) - { - if (!unpipe) - unpipe = iousepipe(shp); -- sh_subfork(); - } -+ -+ sh_subfork(); - } - } - no_fork = !ntflag && !(type&(FAMP|FPOU)) && !shp->subshell && diff --git a/ksh-20120801-subshell-leak.patch b/ksh-20120801-subshell-leak.patch deleted file mode 100644 index 24c7f6b..0000000 --- a/ksh-20120801-subshell-leak.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/path.c b/src/cmd/ksh93/sh/path.c -index d723987..9965bf5 100644 ---- a/src/cmd/ksh93/sh/path.c -+++ b/src/cmd/ksh93/sh/path.c -@@ -1791,8 +1791,12 @@ void path_alias(register Namval_t *np,register Pathcomp_t *pp) - { - struct stat statb; - char *sp; -+ Pathcomp_t *old = 0; - nv_offattr(np,NV_NOPRINT); - nv_stack(np,&talias_init); -+ old = (Pathcomp_t*)np->nvalue.cp; -+ if (old && (--old->refcount <= 0)) -+ free((void*)old); - np->nvalue.cp = (char*)pp; - pp->refcount++; - nv_setattr(np,NV_TAGGED|NV_NOFREE); --- -2.9.3 - diff --git a/ksh-20120801-sufix.patch b/ksh-20120801-sufix.patch deleted file mode 100644 index b820e1c..0000000 --- a/ksh-20120801-sufix.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.sufix ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.sufix 2014-04-08 14:30:14.412343555 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2014-04-08 14:31:18.403876587 +0200 -@@ -2144,6 +2144,7 @@ static int io_prompt(Shell_t *shp,Sfio_t - } - #endif /* TIOCLBIC */ - cp = sh_mactry(shp,nv_getval(sh_scoped(shp,PS1NOD))); -+ shp->exitval = 0; - for(;c= *cp;cp++) - { - if(c==HIST_CHAR) diff --git a/ksh-20120801-syntax-error.patch b/ksh-20120801-syntax-error.patch deleted file mode 100644 index aaeef77..0000000 --- a/ksh-20120801-syntax-error.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/parse.c b/src/cmd/ksh93/sh/parse.c ---- a/src/cmd/ksh93/sh/parse.c -+++ b/src/cmd/ksh93/sh/parse.c -@@ -742,7 +742,7 @@ static Shnode_t *funct(Lex_t *lexp) - register Shnode_t *t; - register int flag; - struct slnod *volatile slp=0; -- Stak_t *savstak; -+ Stak_t *volatile savstak=0; - Sfoff_t first, last; - struct functnod *volatile fp; - Sfio_t *iop; diff --git a/ksh-20120801-tabfix.patch b/ksh-20120801-tabfix.patch deleted file mode 100644 index 962763e..0000000 --- a/ksh-20120801-tabfix.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/edit/emacs.c.tabfix ksh-20120801/src/cmd/ksh93/edit/emacs.c ---- ksh-20120801/src/cmd/ksh93/edit/emacs.c.tabfix 2012-07-17 22:44:44.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/edit/emacs.c 2013-03-07 15:58:59.902161711 +0100 -@@ -1011,10 +1011,13 @@ static int escape(register Emacs_t* ep,r - ep->ed->e_tabcount=0; - else - { -+ int oldi = i; - i=ed_getchar(ep->ed,0); - ed_ungetchar(ep->ed,i); -- if(isdigit(i)) -+ if(isdigit(i) && oldi=='=') - ed_ungetchar(ep->ed,ESC); -+ else if (isdigit(i) || i=='\t') -+ ep->ed->e_tabcount=0; - } - } - else diff --git a/ksh-20120801-tpstl.patch b/ksh-20120801-tpstl.patch deleted file mode 100644 index 41e17c8..0000000 --- a/ksh-20120801-tpstl.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.tpstl ksh-20120801/src/cmd/ksh93/sh/init.c ---- ksh-20120801/src/cmd/ksh93/sh/init.c.tpstl 2014-04-03 11:21:25.395547276 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/init.c 2014-04-03 11:26:03.908867208 +0200 -@@ -332,7 +332,7 @@ static Namfun_t *clone_optindex(Namval_t - /* Trap for restricted variables FPATH, PATH, SHELL, ENV */ - static void put_restricted(register Namval_t* np,const char *val,int flags,Namfun_t *fp) - { -- Shell_t *shp = nv_shell(np); -+ Shell_t *shp = sh_getinterp(); - int path_scoped = 0, fpath_scoped=0; - Pathcomp_t *pp; - char *name = nv_name(np); diff --git a/ksh-20120801-trapcom.patch b/ksh-20120801-trapcom.patch deleted file mode 100644 index 91cb1a8..0000000 --- a/ksh-20120801-trapcom.patch +++ /dev/null @@ -1,98 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig 2015-08-13 15:20:14.022167794 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2015-08-13 15:21:43.263088168 -0300 -@@ -481,12 +481,12 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - { - struct subshell sub_data; - register struct subshell *sp = &sub_data; -- int jmpval,nsig=0,duped=0; -+ int jmpval,isig,nsig=0,duped=0; - long savecurenv = shp->curenv; - int savejobpgid = job.curpgid; - int *saveexitval = job.exitval; - int16_t subshell; -- char *savsig; -+ char **savsig; - Sfio_t *iop=0; - struct checkpt buff; - struct sh_scoped savst; -@@ -561,10 +561,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - /* save trap table */ - shp->st.otrapcom = 0; - shp->st.otrap = savst.trap; -- if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0]) -+ if((nsig=shp->st.trapmax)>0 || shp->st.trapcom[0]) - { -- nsig += sizeof(char*); -- memcpy(savsig=malloc(nsig),(char*)&shp->st.trapcom[0],nsig); -+ ++nsig; -+ savsig = malloc(nsig * sizeof(char*)); -+ /* contents of shp->st.trapcom may change */ -+ for (isig = 0; isig < nsig; ++isig) -+ savsig[isig] = shp->st.trapcom[isig] == Empty ? Empty : (shp->st.trapcom[isig] ? strdup(shp->st.trapcom[isig]) : NULL); - /* this nonsense needed for $(trap) */ - shp->st.otrapcom = (char**)savsig; - } -@@ -732,7 +735,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - shp->st.otrap = 0; - if(nsig) - { -- memcpy((char*)&shp->st.trapcom[0],savsig,nsig); -+ for (isig = 0; isig < nsig; ++isig) -+ if (shp->st.trapcom[isig] && shp->st.trapcom[isig]!=Empty) -+ free(shp->st.trapcom[isig]); -+ memcpy((char*)&shp->st.trapcom[0],savsig,nsig*sizeof(char*)); - free((void*)savsig); - } - shp->options = sp->options; -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig 2015-08-13 15:22:09.821062351 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2015-08-13 15:28:06.166662530 -0300 -@@ -3383,10 +3383,10 @@ int sh_funscope(int argn, char *argv[],i - struct dolnod *argsav=0,*saveargfor; - struct sh_scoped savst, *prevscope = shp->st.self; - struct argnod *envlist=0; -- int jmpval; -+ int isig,jmpval; - volatile int r = 0; - int n; -- char *savstak; -+ char **savsig; - struct funenv *fp = 0; - struct checkpt *buffp = (struct checkpt*)stkalloc(shp->stk,sizeof(struct checkpt)); - Namval_t *nspace = shp->namespace; -@@ -3435,10 +3435,13 @@ int sh_funscope(int argn, char *argv[],i - } - shp->st.cmdname = argv[0]; - /* save trap table */ -- if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0]) -+ if((nsig=shp->st.trapmax)>0 || shp->st.trapcom[0]) - { -- nsig += sizeof(char*); -- memcpy(savstak=stakalloc(nsig),(char*)&shp->st.trapcom[0],nsig); -+ ++nsig; -+ savsig = malloc(nsig * sizeof(char*)); -+ /* contents of shp->st.trapcom may change */ -+ for (isig = 0; isig < nsig; ++isig) -+ savsig[isig] = shp->st.trapcom[isig] == Empty ? Empty : (shp->st.trapcom[isig] ? strdup(shp->st.trapcom[isig]) : NULL); - } - sh_sigreset(0); - argsav = sh_argnew(shp,argv,&saveargfor); -@@ -3502,10 +3505,14 @@ int sh_funscope(int argn, char *argv[],i - shp->topscope = (Shscope_t*)prevscope; - nv_getval(sh_scoped(shp,IFSNOD)); - if(nsig) -- memcpy((char*)&shp->st.trapcom[0],savstak,nsig); -+ { -+ for (isig = 0; isig < nsig; ++isig) -+ if (shp->st.trapcom[isig] && shp->st.trapcom[isig]!=Empty) -+ free(shp->st.trapcom[isig]); -+ memcpy((char*)&shp->st.trapcom[0],savsig,nsig*sizeof(char*)); -+ free((void*)savsig); -+ } - shp->trapnote=0; -- if(nsig) -- stakset(savstak,0); - shp->options = options; - shp->last_root = last_root; - if(jmpval == SH_JMPSUB) diff --git a/ksh-20120801-typeset.patch b/ksh-20120801-typeset.patch deleted file mode 100644 index 03b56b8..0000000 --- a/ksh-20120801-typeset.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/src/cmd/ksh93/bltins/typeset.c b/src/cmd/ksh93/bltins/typeset.c -index 15fcd58..8939011 100644 ---- a/src/cmd/ksh93/bltins/typeset.c -+++ b/src/cmd/ksh93/bltins/typeset.c -@@ -1442,7 +1442,7 @@ static void print_scan(Sfio_t *file, int flag, Dt_t *root, int option,struct tda - tp->scanmask |= (NV_DOUBLE|NV_EXPNOTE); - if(flag==NV_LTOU || flag==NV_UTOL) - tp->scanmask |= NV_UTOL|NV_LTOU; -- namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag); -+ namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag&~NV_IARRAY); - argv = tp->argnam = (char**)stkalloc(tp->sh->stk,(namec+1)*sizeof(char*)); - namec = nv_scan(root, pushname, (void*)tp, tp->scanmask, flag&~NV_IARRAY); - if(mbcoll()) --- -2.9.3 - diff --git a/ksh-20120801-unset-param.patch b/ksh-20120801-unset-param.patch deleted file mode 100644 index 7777270..0000000 --- a/ksh-20120801-unset-param.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.bz1222025 ksh-20120801/src/cmd/ksh93/sh/macro.c ---- ksh-20120801/src/cmd/ksh93/sh/macro.c.bz1222025 2015-09-15 17:28:47.304722569 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2015-09-17 17:49:46.842891942 +0200 -@@ -1195,6 +1195,13 @@ retry1: - } - else - v = 0; -+ if(!v && sh_isoption(SH_NOUNSET)) -+ { -+ d=fcget(); -+ fcseek(-1); -+ if(!(d && strchr(":+-?=",d))) -+ errormsg(SH_DICT,ERROR_exit(1),e_notset,ltos(c)); -+ } - break; - case S_ALP: - if(c=='.' && type==0) diff --git a/ksh-20120801-validate-fd.patch b/ksh-20120801-validate-fd.patch deleted file mode 100644 index a0bc7d2..0000000 --- a/ksh-20120801-validate-fd.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c ---- a/src/cmd/ksh93/sh/xec.c -+++ b/src/cmd/ksh93/sh/xec.c -@@ -122,6 +122,7 @@ int iousepipe(Shell_t *shp) - return(1); - } - subpipe[2] = sh_fcntl(fd,F_dupfd_cloexec,10); -+ sh_iovalidfd(shp,subpipe[2]); - shp->fdstatus[subpipe[2]] = shp->fdstatus[1]; - while(close(fd)<0 && errno==EINTR) - errno = err; diff --git a/ksh-20120801-xufix.patch b/ksh-20120801-xufix.patch deleted file mode 100644 index 496e0bf..0000000 --- a/ksh-20120801-xufix.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/bltins/typeset.c.xufix ksh-20120801/src/cmd/ksh93/bltins/typeset.c ---- ksh-20120801/src/cmd/ksh93/bltins/typeset.c.xufix 2015-02-03 14:47:23.266022137 +0100 -+++ ksh-20120801/src/cmd/ksh93/bltins/typeset.c 2015-02-03 14:47:23.308022046 +0100 -@@ -93,6 +93,8 @@ int b_readonly(int argc,char *argv[], - memset((void*)&tdata,0,sizeof(tdata)); - tdata.sh = context->shp; - tdata.aflag = '-'; -+ /* do not change size */ -+ tdata.argnum = -1; - while((flag = optget(argv,*command=='e'?sh_optexport:sh_optreadonly))) switch(flag) - { - case 'p': -diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.xufix ksh-20120801/src/cmd/ksh93/sh/name.c ---- ksh-20120801/src/cmd/ksh93/sh/name.c.xufix 2015-02-03 14:47:23.281022105 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/name.c 2015-02-03 14:52:08.768404194 +0100 -@@ -3019,10 +3019,12 @@ void nv_newattr (register Namval_t *np, - nv_onattr(np,NV_EXPORT); - sh_envput(shp->env,np); - } -- if((n^newatts)==NV_EXPORT) -+ if((n^newatts)==NV_EXPORT && size==-1) - return; - } - oldsize = nv_size(np); -+ if (size == -1) -+ size = oldsize; - if((size==oldsize|| (n&NV_INTEGER)) && !trans && ((n^newatts)&~NV_NOCHANGE)==0) - { - if(size) diff --git a/ksh-20130214-fixkill.patch b/ksh-20130214-fixkill.patch deleted file mode 100644 index 0862880..0000000 --- a/ksh-20130214-fixkill.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -up ksh-20130214/src/cmd/ksh93/sh/jobs.c.fixkill ksh-20130214/src/cmd/ksh93/sh/jobs.c ---- ksh-20130214/src/cmd/ksh93/sh/jobs.c.fixkill 2012-09-26 17:43:04.000000000 +0200 -+++ ksh-20130214/src/cmd/ksh93/sh/jobs.c 2013-02-22 16:38:05.080161740 +0100 -@@ -1104,6 +1104,8 @@ static struct process *job_bystring(regi - - int job_kill(register struct process *pw,register int sig) - { -+ if(pw==0) -+ goto error; - Shell_t *shp = pw->p_shp; - register pid_t pid; - register int r; -@@ -1127,8 +1129,6 @@ int job_kill(register struct process *pw - #endif /* SIGTSTP */ - job_lock(); - errno = ECHILD; -- if(pw==0) -- goto error; - pid = pw->p_pid; - #if SHOPT_COSHELL - if(pw->p_cojob) diff --git a/ksh-20130613-cdfix4.patch b/ksh-20130613-cdfix4.patch deleted file mode 100644 index 5b29017..0000000 --- a/ksh-20130613-cdfix4.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix4 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c ---- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix4 2014-08-26 15:24:57.276953822 +0200 -+++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c 2014-08-26 15:25:34.738770361 +0200 -@@ -143,9 +143,9 @@ int sh_diropenat(Shell_t *shp, int dir, - } - - /* Move fd to a number > 10 and *register* the fd number with the shell */ -- shfd = sh_fcntl(fd, F_dupfd_cloexec, 10); -+ shfd = fcntl(fd, F_dupfd_cloexec, 10); - savederrno=errno; -- sh_close(fd); -+ close(fd); - errno=savederrno; - return(shfd); - } diff --git a/ksh-20130628-longer.patch b/ksh-20130628-longer.patch deleted file mode 100644 index 4761a34..0000000 --- a/ksh-20130628-longer.patch +++ /dev/null @@ -1,58 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/defs.h.longer ksh-20120801/src/cmd/ksh93/include/defs.h ---- ksh-20120801/src/cmd/ksh93/include/defs.h.longer 2012-06-25 20:47:47.000000000 +0200 -+++ ksh-20120801/src/cmd/ksh93/include/defs.h 2013-07-08 17:33:42.238534376 +0200 -@@ -162,8 +162,8 @@ struct shared - Namval_t *prev_table; /* previous table used in nv_open */ \ - Sfio_t *outpool; /* ouput stream pool */ \ - long timeout; /* read timeout */ \ -- short curenv; /* current subshell number */ \ -- short jobenv; /* subshell number for jobs */ \ -+ long curenv; /* current subshell number */ \ -+ long jobenv; /* subshell number for jobs */ \ - int infd; /* input file descriptor */ \ - short nextprompt; /* next prompt is PS */ \ - short poolfiles; \ -diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.longer ksh-20120801/src/cmd/ksh93/include/jobs.h ---- ksh-20120801/src/cmd/ksh93/include/jobs.h.longer 2011-12-19 13:36:37.000000000 +0100 -+++ ksh-20120801/src/cmd/ksh93/include/jobs.h 2013-07-08 17:32:52.881124147 +0200 -@@ -87,7 +87,7 @@ struct process - unsigned short p_exit; /* exit value or signal number */ - unsigned short p_exitmin; /* minimum exit value for xargs */ - unsigned short p_flag; /* flags - see below */ -- int p_env; /* subshell environment number */ -+ long p_env; /* subshell environment number */ - #ifdef JOBS - off_t p_name; /* history file offset for command */ - struct termios p_stty; /* terminal state for job */ -diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.longer ksh-20120801/src/cmd/ksh93/sh/jobs.c -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.longer ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.longer 2013-07-08 17:32:52.874124090 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2013-07-08 17:32:52.882124156 +0200 -@@ -98,7 +98,7 @@ static struct subshell - #endif /* SHOPT_COSHELL */ - } *subshell_data; - --static int subenv; -+static long subenv; - - - /* -@@ -171,7 +171,8 @@ void sh_subfork(void) - { - register struct subshell *sp = subshell_data; - Shell_t *shp = sp->shp; -- int curenv = shp->curenv, comsub=shp->comsub; -+ long curenv = shp->curenv; -+ int comsub=shp->comsub; - pid_t pid; - char *trap = shp->st.trapcom[0]; - if(trap) -@@ -461,7 +462,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - struct subshell sub_data; - register struct subshell *sp = &sub_data; - int jmpval,nsig=0,duped=0; -- int savecurenv = shp->curenv; -+ long savecurenv = shp->curenv; - int savejobpgid = job.curpgid; - int *saveexitval = job.exitval; - int16_t subshell; diff --git a/ksh-20140301-fikspand.patch b/ksh-20140301-fikspand.patch deleted file mode 100644 index 9899392..0000000 --- a/ksh-20140301-fikspand.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/expand.c.fikspand ksh-20120801/src/cmd/ksh93/sh/expand.c ---- ksh-20120801/src/cmd/ksh93/sh/expand.c.fikspand 2010-11-24 05:46:30.000000000 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/expand.c 2014-05-22 12:55:46.252717371 +0200 -@@ -278,6 +278,8 @@ int path_generate(Shell_t *shp,struct ar - char comma, range=0; - int first, last, incr, count = 0; - char tmp[32], end[1]; -+ if(!sh_isoption(SH_BRACEEXPAND)) -+ return path_expand(shp,todo->argval,arghead); - todo->argchn.ap = 0; - again: - apin = ap = todo; diff --git a/ksh-20140415-hokaido.patch b/ksh-20140415-hokaido.patch deleted file mode 100644 index 5ff6927..0000000 --- a/ksh-20140415-hokaido.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.hokaido ksh-20120801/src/cmd/ksh93/sh/xec.c ---- ksh-20120801/src/cmd/ksh93/sh/xec.c.hokaido 2014-09-18 14:41:57.696756230 +0200 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-09-18 14:43:55.439205247 +0200 -@@ -1633,12 +1633,20 @@ int sh_exec(register const Shnode_t *t, - #endif /* SHOPT_COSHELL */ - if(shp->subshell) - { -+ int comsubsave = shp->comsub; -+ if(comsubsave==1) -+ shp->comsub = 2; - sh_subtmpfile(shp); -+ shp->comsub = comsubsave; -+ if(shp->comsub==1 && (!(shp->fdstatus[1]&IONOSEEK))) -+ unpipe = iousepipe(shp); -+ - if((type&(FAMP|TFORK))==(FAMP|TFORK)) - { - if(shp->comsub && !(shp->fdstatus[1]&IONOSEEK)) - { -- unpipe = iousepipe(shp); -+ if (!unpipe) -+ unpipe = iousepipe(shp); - sh_subfork(); - } - } -@@ -2107,7 +2115,11 @@ int sh_exec(register const Shnode_t *t, - job.curjobid = 0; - if(shp->subshell) - { -+ int comsubsave = shp->comsub; -+ if(comsubsave==1) -+ shp->comsub = 2; - sh_subtmpfile(shp); -+ shp->comsub = comsubsave; - if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK)) - iousepipe(shp); - } diff --git a/ksh-20140801-arraylen.patch b/ksh-20140801-arraylen.patch deleted file mode 100644 index 34c9b6b..0000000 --- a/ksh-20140801-arraylen.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ksh-20120801/src/cmd/ksh93/sh/xec.c 2015-04-02 10:55:26.228017873 -0400 -+++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2015-04-02 10:56:04.099017700 -0400 -@@ -1234,7 +1234,7 @@ int sh_exec(register const Shnode_t *t, - if((io||argn)) - { - Shbltin_t *bp=0; -- static char *argv[1]; -+ static char *argv[2]; - int tflags = 1; - if(np && nv_isattr(np,BLT_DCL)) - tflags |= 2; diff --git a/ksh-20140801-diskfull.patch b/ksh-20140801-diskfull.patch deleted file mode 100644 index 7276363..0000000 --- a/ksh-20140801-diskfull.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.orig ksh-20120801/src/cmd/ksh93/sh/main.c ---- ksh-20120801/src/cmd/ksh93/sh/main.c.orig 2015-04-29 16:49:11.502958000 -0300 -+++ ksh-20120801/src/cmd/ksh93/sh/main.c 2015-05-08 18:19:55.688776922 -0300 -@@ -423,7 +423,7 @@ static void exfile(register Shell_t *shp - sfsync(shp->outpool); - shp->st.execbrk = shp->st.breakcnt = 0; - /* check for return from profile or env file */ -- if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT)) -+ if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT || jmpval==SH_JMPERREXIT)) - { - sh_setstate(states); - goto done; -@@ -598,7 +598,7 @@ done: - } - if(jmpval == SH_JMPSCRIPT) - siglongjmp(*shp->jmplist,jmpval); -- else if(jmpval == SH_JMPEXIT) -+ else if(jmpval == SH_JMPEXIT || jmpval == SH_JMPERREXIT) - sh_done(shp,0); - if(fno>0) - sh_close(fno); diff --git a/ksh-20140929-safefd.patch b/ksh-20140929-safefd.patch deleted file mode 100644 index 80db205..0000000 --- a/ksh-20140929-safefd.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -up ksh-20120801/src/cmd/ksh93/include/io.h.safefd ksh-20120801/src/cmd/ksh93/include/io.h ---- ksh-20120801/src/cmd/ksh93/include/io.h.safefd 2015-03-03 18:21:40.544732158 +0100 -+++ ksh-20120801/src/cmd/ksh93/include/io.h 2015-03-03 18:22:16.284447849 +0100 -@@ -78,6 +78,7 @@ extern void sh_iorestore(Shell_t*,int,i - extern Sfio_t *sh_iostream(Shell_t*,int); - extern int sh_redirect(Shell_t*,struct ionod*,int); - extern void sh_iosave(Shell_t *, int,int,char*); -+extern int safefdnumber(Shell_t* shp, int sfd); - extern int sh_iovalidfd(Shell_t*, int); - extern int sh_inuse(Shell_t*, int); - extern void sh_iounsave(Shell_t*); -diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.safefd ksh-20120801/src/cmd/ksh93/sh/io.c ---- ksh-20120801/src/cmd/ksh93/sh/io.c.safefd 2015-03-03 18:21:40.511732421 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2015-03-03 18:21:40.544732158 +0100 -@@ -1724,6 +1724,25 @@ void sh_iosave(Shell_t *shp, register in - } - } - -+int safefdnumber(Shell_t* shp, int sfd) -+{ -+ register int fd; -+ -+ while(1) -+ { -+ for(fd=0; fd < shp->topfd; fd++) -+ { -+ if (filemap[fd].save_fd==sfd || filemap[fd].orig_fd==sfd || (fcntl(sfd, F_GETFD) != -1 || errno != EBADF)) -+ { -+ sfd++; -+ continue; -+ } -+ } -+ break; -+ } -+ return sfd; -+} -+ - /* - * close all saved file descriptors - */ -diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd ksh-20120801/src/cmd/ksh93/sh/subshell.c ---- ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd 2015-03-03 18:21:40.531732261 +0100 -+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2015-03-03 18:21:40.544732158 +0100 -@@ -673,7 +673,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ - } - if(iop && sffileno(iop)==1) - { -- int fd=sfsetfd(iop,3); -+ int fd=sfsetfd(iop,safefdnumber(shp,3)); - if(fd<0) - { - shp->toomany = 1; diff --git a/ksh.spec b/ksh.spec index b591ee4..330bd81 100644 --- a/ksh.spec +++ b/ksh.spec @@ -1,321 +1,96 @@ -%global releasedate 20120801 -%global release_date %{lua:reldate=rpm.expand("%{releasedate}");print(("%s-%s-%s"):format(reldate:sub(0,4),reldate:sub(5,6),reldate:sub(7)))} - Name: ksh Summary: The Original ATT Korn Shell URL: http://www.kornshell.com/ License: EPL -Version: %{releasedate} -Release: 250%{?dist} -Source0: http://www.research.att.com/~gsf/download/tgz/ast-ksh.%{release_date}.tgz -Source1: http://www.research.att.com/~gsf/download/tgz/INIT.%{release_date}.tgz -Source2: kshcomp.conf -Source3: kshrc.rhs -Source4: dotkshrc - -# expected results of test suite -Source5: expectedresults.log - -# don't use not wanted/needed builtins - Fedora/RHEL specific -Patch1: ksh-20070328-builtins.patch - -# fix regression test suite to be usable during packagebuild - Fedora/RHEL specific -Patch2: ksh-20100826-fixregr.patch - -# fedora/rhel specific, rhbz#619692 -Patch6: ksh-20080202-manfix.patch - -# rhbz#702008 -Patch17: ksh-20100202-pathvar.patch - -# rhbz#924440 -Patch18: ksh-20100621-fdstatus.patch - -# fixes for regressions found in ksh-20120801 rebase -Patch19: ksh-20120801-rmdirfix.patch -Patch20: ksh-20120801-cdfix.patch -Patch21: ksh-20120801-cdfix2.patch -Patch22: ksh-20120801-tabfix.patch -Patch23: ksh-20130214-fixkill.patch - -# for ksh <= 2013-05-31, rhbz#960034 -Patch24: ksh-20120801-kshmfix.patch - -# for ksh <= 2016-06-28, rhbz#921455 -Patch25: ksh-20120801-memlik.patch - -# for ksh <= 2013-03-20, rhbz#922851 -Patch26: ksh-20120801-forkbomb.patch - -# for ksh <= 2013-04-19, rhbz#913110 -Patch27: ksh-20120801-macro.patch - -# not completely upstream yet, rhbz#858263 -Patch29: ksh-20130628-longer.patch - -# for ksh <= 2013-07-19, rhbz#982142 -Patch30: ksh-20120801-mlikfiks.patch - -# not yet upstream, related to 2012-08-01 rebase -Patch31: ksh-20120801-covsfix.patch - -# rhbz#1007816 -Patch32: ksh-20100621-manfix3.patch - -# rhbz#1016611 -Patch33: ksh-20120801-nomulti.patch - -# for ksh <= 2014-01-14, rhbz# -Patch34: ksh-20120801-mtty.patch - -# from upstream, rbzh#1048272 -Patch35: ksh-20120801-fd2lost.patch - -# sent upstream 2014-01, rhbz#1047507 -Patch36: ksh-20120801-argvfix.patch - -# for ksh <= 2014-01-14, rhbz#1048995 -Patch37: ksh-20120801-memlik3.patch - -# for ksh <= 2013-04-09, rhbz#960371 -Patch38: ksh-20120801-lexfix.patch - -# not yet upstream, for ksh <= 2014-02-26, rhbz#1070328 -Patch39: ksh-20120801-filecomsubst.patch - -# for ksh <= 2014-06-25, rhbz#825520,rhbz#1084406 -Patch40: ksh-20120801-crash.patch - -# for ksh < 2013-03-19, rhbz#1085385 -Patch41: ksh-20120801-sufix.patch - -# sent upstream, rhbz#1099935 -Patch42: ksh-20140301-fikspand.patch - -# for ksh < 2014-04-15, rhbz#1070871 -Patch43: ksh-20120801-roundit.patch - -# for ksh < 2014-04-15, rhbz#1111120 -Patch44: ksh-20120801-heresub.patch - -# not included upstream yet, rhbz#1077090 -Patch45: ksh-20140415-hokaido.patch - -# for ksh < 2012-10-04, rhbz#1121960 -Patch46: ksh-20120801-tpstl.patch - -# sent upstream, rhbz#1100215 -Patch47: ksh-20120801-manfix4.patch - -# not upstream yet, rhbz#1100215 -Patch48: ksh-20120801-fununset.patch - -# for ksh < 2014-06-25, rhbz#1109893 -Patch49: ksh-20120801-cdfix3.patch - -# sent upstream, rhbz#1116506 -Patch50: ksh-20120801-locking.patch - -# for ksh <= 2013-06-13, rhbz#1133585 -Patch51: ksh-20130613-cdfix4.patch - -Patch52: ksh-20120801-retfix.patch - -# sent upstream, for ksh <= 2014-09-30 -Patch53: ksh-20120801-cdfork.patch - -# not upstream yet, for ksh <= 2015-04-03, rhbz#1200534 -Patch54: ksh-20140801-arraylen.patch - -# sent upstream, for ksh <= 2014-09-29, rhbz#1212993 -Patch55: ksh-20140801-diskfull.patch - -# not upstream yet, rhbz#1192026 -Patch56: ksh-20120801-xufix.patch - -# sent upstream, for ksh <= 2014-12-18, rhbz#1192119 -Patch58: ksh-20120801-alarmifs.patch - -# not yet upstream, rhbz#1202439 -Patch59: ksh-20140929-safefd.patch - -# workaround, for ksh < 2013-05-24, rhbz#1211540 -Patch60: ksh-20120801-trapcom.patch - -# not yet upstream, rhbz#1217237 -Patch64: ksh-20120801-nohupfork.patch - -# from upstream, for ksh <= 20130409, rhbz#1241014 -Patch65: ksh-20120801-parserfix.patch +Version: 2020.0.0 +Release: 0.1%{?dist} +# We are upgrading from ksh-20120801-250, so set epoch. +Epoch: 1 +Source0: https://github.com/att/ast/releases/download/%{version}-alpha1/%{name}-%{version}-alpha1.tar.gz +Source1: kshcomp.conf +Source2: kshrc.rhs +Source3: dotkshrc -# not upstream yet, rhbz#1211538 -Patch66: ksh-20120801-oldenvinit.patch - -# from upsteam, for ksh < 2012-10-04, rhbz#1193557 -Patch67: ksh-20120801-emptyarrayinit.patch - -# not upstream yet, rhbz#1371630 -Patch68: ksh-20120801-typeset.patch - -# not upstream yet, rhbz#1321443 -Patch69: ksh-20120801-dotdoublefree.patch - -# not upstream yet, rhbz#1405784 -Patch70: ksh-20120801-subshell-leak.patch - -# rhbz#1189297 -Patch71: ksh-20120801-assoc-unset-leak.patch - -# rhbz#1222025 -Patch72: ksh-20120801-unset-param.patch - -# rhbz#1269088 -Patch73: ksh-20120801-badgcc.patch - -# rhbz#1299484 -Patch74: ksh-20120801-mb-after-argvar.patch -Patch75: ksh-20120801-F_dupfd_cloexec.patch - -# rhbz#1441142 -Patch76: ksh-20120801-kia.patch - -# rhbz#1417886 -Patch77: ksh-20120801-iso8859.patch - -# rhbz#1451057 -Patch78: ksh-20120801-syntax-error.patch - -# rhbz#1477082 -Patch79: ksh-20120801-glibc-build-fix.patch - -# rhbz#1459000 -Patch80: ksh-20120801-jobwait-sigstop.patch - -# rhbz#1462347 -Patch81: ksh-20120801-subshell-jobwait.patch - -# rhbz#1471874 -Patch82: ksh-20120801-posix-exit.patch - -# rhbz#1464409 -Patch83: ksh-20120801-sh_iovalidfd.patch - -# rhbz#1537053 -Patch84: ksh-20120801-validate-fd.patch - -# There were couple of places where CCFLAGS variable was not passed while -# compiling binaries. This patch fixes it. Loosely related to rhbz#1548549. -Patch85: ksh-20120801-ccflags.patch - -Patch86: ksh-20120801-nv_open-memcmp.patch +Provides: /bin/ksh -Conflicts: pdksh -Requires: coreutils, diffutils -BuildRequires: gcc -BuildRequires: bison -# regression test suite uses 'ps' from procps -BuildRequires: procps -Requires(post): grep, coreutils, systemd +BuildRequires: meson +BuildRequires: gcc +BuildRequires: glibc-devel +# This package is require by test cases +# It should be enabled when we start running test cases in package builds +# BuildRequires: glibc-langpack-zh +BuildRequires: ed +Conflicts: pdksh +Requires(post): grep, coreutils, systemd-units Requires(postun): sed -Provides: /bin/ksh +Provides: /bin/ksh %description -KSH-93 is the most recent version of the KornShell by David Korn of -AT&T Bell Laboratories. KornShell is a shell programming language, which is upward compatible with "sh" (the Bourne Shell). %prep -%setup -q -c -%setup -q -T -D -a 1 -%autopatch -p1 - -#/dev/fd test does not work because of mock -sed -i 's|ls /dev/fd|ls /proc/self/fd|' src/cmd/ksh93/features/options - -# sh/main.c was not using CCFLAGS -sed -i '/-c sh\/main.c/s|${mam_cc_FLAGS} |${mam_cc_FLAGS} ${CCFLAGS} |p' src/cmd/ksh93/Mamfile - -# disable register for debugging -sed -i 1i"#define register" src/lib/libast/include/ast.h +%autosetup -n %{name}-%{version}-alpha1 %build -XTRAFLAGS="" -for f in -Wno-unknown-pragmas -Wno-missing-braces -Wno-unused-result -Wno-return-type -Wno-int-to-pointer-cast -Wno-parentheses -Wno-unused -Wno-unused-but-set-variable -Wno-cpp -P -do - gcc $f -E - /dev/null 2>&1 && XTRAFLAGS="$XTRAFLAGS $f" -done -./bin/package -./bin/package make mamake ||: -./bin/package make mamake ||: -export CCFLAGS="$RPM_OPT_FLAGS $RPM_LD_FLAGS -fno-strict-aliasing $XTRAFLAGS" -export CC=gcc -./bin/package make -S - -#cp lib/package/LICENSES/epl LICENSE +%meson -Dbuild-api-tests=false +%meson_build %install -mkdir -p %{buildroot}{/bin,%{_bindir},%{_mandir}/man1} -install -p -m 755 arch/*/bin/ksh %{buildroot}%{_bindir}/ksh -install -p -m 755 arch/*/bin/shcomp %{buildroot}%{_bindir}/shcomp -install -p -m 644 arch/*/man/man1/sh.1 %{buildroot}%{_mandir}/man1/ksh.1 -mkdir -p %{buildroot}%{_sysconfdir}/skel -install -p -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/skel/.kshrc -install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/kshrc -install -p -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/binfmt.d/kshcomp.conf - -%check -[ -f ./skipcheck -o -f ./../skipcheck ] && exit 0 ||: -%if 0%{?rhel} > 6 -%ifarch s390 -exit 0 -%endif -%endif - -export SHELL=$(ls $(pwd)/arch/*/bin/ksh) -cd src/cmd/ksh93/tests/ -ulimit -c unlimited -if [ ! -e /dev/fd ] +%meson_install +# Allow switching between different ksh implementations (for e.g. mksh) through alternatives. +mv %{buildroot}/%{_bindir}/ksh %{buildroot}/%{_bindir}/ksh93 +mv %{buildroot}/%{_bindir}/shcomp %{buildroot}/%{_bindir}/shcomp93 +# http://mesonbuild.com/Release-notes-for-0-49-0.html#manpages-are-no-longer-compressed-implicitly +# meson 0.49 does not compress man pages +if [[ -e %{buildroot}/%{_mandir}/man1/ksh.1.gz ]] then - echo "ERROR: /dev/fd does not exist, regression tests skipped" - exit 0 -fi -$SHELL ./shtests 2>&1 | tee testresults.log -ls core.* 2>/dev/null ||: -exit 0 -sed -e '/begins at/d' -e '/ 0 error/d' -e 's/at [^\[]*\[/\[/' testresults.log -e '/tests skipped/d' >filteredresults.log -if ! cmp filteredresults.log %{SOURCE5} >/dev/null || ls core.* -then - echo "Regression tests failed" - diff -Naurp %{SOURCE5} filteredresults.log - exit -1 + mv %{buildroot}/%{_mandir}/man1/ksh.1.gz %{buildroot}/%{_mandir}/man1/ksh93.1.gz +else + mv %{buildroot}/%{_mandir}/man1/ksh.1 %{buildroot}/%{_mandir}/man1/ksh93.1 fi +install -p -D -m 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/binfmt.d/kshcomp.conf +install -p -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/kshrc +install -p -D -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/skel/.kshrc + %post -if [ ! -f /etc/shells ]; then - echo "/bin/ksh" > /etc/shells - echo "/usr/bin/ksh" >> /etc/shells -else - if ! grep -q '^/bin/ksh$' /etc/shells ; then - echo "/bin/ksh" >> /etc/shells - fi - if ! grep -q '^/usr/bin/ksh$' /etc/shells ; then - echo "/usr/bin/ksh" >> /etc/shells +for s in /bin/ksh /usr/bin/ksh +do + if [ ! -f /etc/shells ]; then + echo "$s" > /etc/shells + else + if ! grep -q '^'"$s"'$' /etc/shells ; then + echo "$s" >> /etc/shells fi -fi + fi +done /bin/systemctl try-restart systemd-binfmt.service >/dev/null 2>&1 || : -%postun -if [ ! -f /bin/ksh ]; then - sed -i '/^\/bin\/ksh$/ d' /etc/shells -fi -if [ ! -f /usr/bin/ksh ]; then - sed -i '/^\/usr\/bin\/ksh$/ d' /etc/shells +# Suppress any error encountered while upgrading from ksh-20120801-250 +%{_sbindir}/alternatives --install /bin/ksh ksh \ + /bin/ksh93 50 \ + --slave %{_mandir}/man1/ksh.1.gz ksh-man \ + %{_mandir}/man1/ksh93.1.gz \ + --slave /bin/shcomp shcomp93 \ + /bin/shcomp93 2>/dev/null + +%preun +# Do not remove ksh from alternatives on upgrades +if [ $1 -eq 0 ]; then + %{_sbindir}/alternatives --remove ksh /bin/ksh93 fi -%verifyscript +%postun +for s in /bin/ksh /usr/bin/ksh +do + if [ ! -f $s ]; then + sed -i '\|^'"$s"'$|d' /etc/shells + fi +done + echo -n "Looking for ksh in /etc/shells... " if ! grep '^/bin/ksh$' /etc/shells > /dev/null; then echo "missing" @@ -324,17 +99,26 @@ else echo "found" fi +# ksh-20120801-250 did not use alternatives, so while upgrading ensure that +# alternatives are set correctly +%triggerpostun -- ksh < 1:2020.0.0-0.1 +%{_sbindir}/alternatives --auto ksh + %files %doc src/cmd/ksh93/COMPATIBILITY src/cmd/ksh93/RELEASE src/cmd/ksh93/TYPES # LICENSE file is missing, temporarily? -%{_bindir}/ksh -%{_bindir}/shcomp +%{_bindir}/ksh93 +%{_bindir}/shcomp93 %{_mandir}/man1/* %config(noreplace) %{_sysconfdir}/skel/.kshrc %config(noreplace) %{_sysconfdir}/kshrc %config(noreplace) %{_sysconfdir}/binfmt.d/kshcomp.conf %changelog +* Wed Apr 17 2019 Siteshwar Vashisht - 2020.0.0-0.1 +- Rebase to 2020.0.0-alpha1 + Resolves: #1700777 + * Fri Feb 01 2019 Fedora Release Engineering - 20120801-250 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild diff --git a/sources b/sources index 935961b..9fd6ceb 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ -3a6e2d01b1b049bdef968dc5a24c1ea7 ast-ksh.2012-08-01.tgz -af699318bea7398f0f413b839bfcd762 INIT.2012-08-01.tgz +SHA512 (ksh-2020.0.0-alpha1.tar.gz) = 56c805bebe963dee7c27ba0357e26957fd8439f42c26f290ab32488ddde99f4b824e403c5dc097194eaf600e7379a010b1be4bf1e70bee76402e84909b38d981