Accepting request 74013 from shells
- Fix off by one error which should make timetype.sh work now - Update the array fix as well as the pipe fix - This also fixes bnc#677790 - Avoid redirection in subshell if an eval was used (bnc#697394) - Extend Shift.JIS patch to avoid breakage of the parsers above - Avoid mounting 3D file system as this does not exist on linux OBS-URL: https://build.opensuse.org/request/show/74013 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/ksh?expand=0&rev=62
This commit is contained in:
commit
5bf5bb85a9
18
ksh.changes
18
ksh.changes
@ -1,3 +1,21 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jun 14 11:36:28 UTC 2011 - werner@suse.de
|
||||||
|
|
||||||
|
- Fix off by one error which should make timetype.sh work now
|
||||||
|
- Update the array fix as well as the pipe fix
|
||||||
|
- This also fixes bnc#677790
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Jun 10 19:11:07 CEST 2011 - werner@suse.de
|
||||||
|
|
||||||
|
- Avoid redirection in subshell if an eval was used (bnc#697394)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Jun 8 15:14:46 CEST 2011 - werner@suse.de
|
||||||
|
|
||||||
|
- Extend Shift.JIS patch to avoid breakage of the parsers above
|
||||||
|
- Avoid mounting 3D file system as this does not exist on linux
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Jun 1 11:23:03 CEST 2011 - werner@suse.de
|
Wed Jun 1 11:23:03 CEST 2011 - werner@suse.de
|
||||||
|
|
||||||
|
64
ksh.spec
64
ksh.spec
@ -75,6 +75,8 @@ Patch20: ksh93-argv0.dif
|
|||||||
Patch21: ksh93-export.dif
|
Patch21: ksh93-export.dif
|
||||||
Patch22: ksh93-eintr.dif
|
Patch22: ksh93-eintr.dif
|
||||||
Patch23: ksh93-array.dif
|
Patch23: ksh93-array.dif
|
||||||
|
Patch24: ksh93-pipe.dif
|
||||||
|
Patch25: ksh93-argv.dif
|
||||||
%global use_suid_exe 0
|
%global use_suid_exe 0
|
||||||
%global use_locale 1
|
%global use_locale 1
|
||||||
%global debug_memleak 0
|
%global debug_memleak 0
|
||||||
@ -149,11 +151,11 @@ find share/ -type d -a -empty | xargs -r rm -vrf
|
|||||||
%patch21
|
%patch21
|
||||||
%patch22
|
%patch22
|
||||||
%patch23
|
%patch23
|
||||||
|
%patch24
|
||||||
|
%patch25
|
||||||
|
|
||||||
%build
|
%build
|
||||||
TMPDIR=$(mktemp -d /tmp/ksh-build.XXXXXX) || exit 1
|
TMPDIR=$(mktemp -d /tmp/ksh-build.XXXXXX) || exit 1
|
||||||
mkdir ${TMPDIR}/bin || exit 1
|
|
||||||
PATH=${TMPDIR}/bin:$PATH
|
|
||||||
typeset -i IGNORED=0x$(ps --no-headers -o ignored $$)
|
typeset -i IGNORED=0x$(ps --no-headers -o ignored $$)
|
||||||
typeset -i SIGPIPE=0x1000
|
typeset -i SIGPIPE=0x1000
|
||||||
if ((IGNORED & SIGPIPE)) ; then
|
if ((IGNORED & SIGPIPE)) ; then
|
||||||
@ -243,6 +245,7 @@ find share/ -type d -a -empty | xargs -r rm -vrf
|
|||||||
feature=${TMPDIR:-/tmp}/feature.h
|
feature=${TMPDIR:-/tmp}/feature.h
|
||||||
set -C
|
set -C
|
||||||
(cat > $feature)<<-'EOF'
|
(cat > $feature)<<-'EOF'
|
||||||
|
#define SHOPT_FS_3D 0
|
||||||
#define SHOPT_SYSRC 1
|
#define SHOPT_SYSRC 1
|
||||||
#define SHOPT_REMOTE 1
|
#define SHOPT_REMOTE 1
|
||||||
#define SHOPT_CMDLIB_BLTIN 1
|
#define SHOPT_CMDLIB_BLTIN 1
|
||||||
@ -257,32 +260,40 @@ find share/ -type d -a -empty | xargs -r rm -vrf
|
|||||||
cat $feature
|
cat $feature
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
echo 'int main () { return !(sizeof(void*) >= 8); }' | $CC -x c -o test64 -
|
LARGEFILE="$(getconf LFS_CFLAGS)"
|
||||||
if ./test64 ; then
|
|
||||||
LARGEFILE=""
|
|
||||||
else
|
|
||||||
LARGEFILE="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
|
|
||||||
fi
|
|
||||||
rm -f ./test64
|
|
||||||
case "$RPM_ARCH" in
|
|
||||||
ia64) RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O}" ;;
|
|
||||||
s390*) RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O}" ;;
|
|
||||||
ppc*|powerpc*)
|
|
||||||
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O}" ;;
|
|
||||||
esac
|
|
||||||
case "$RPM_ARCH" in
|
case "$RPM_ARCH" in
|
||||||
|
i[3456]86)
|
||||||
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O2} -m32"
|
||||||
|
HOSTTYPE=linux.i386
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O2} -m64"
|
||||||
|
HOSTTYPE=linux.i386-64
|
||||||
|
;;
|
||||||
|
ia64)
|
||||||
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O}"
|
||||||
|
HOSTTYPE=linux.ia64
|
||||||
|
;;
|
||||||
|
s390)
|
||||||
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O} -m31"
|
||||||
|
HOSTTYPE=linux.s390
|
||||||
|
;;
|
||||||
|
s390*)
|
||||||
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O} -m64"
|
||||||
|
HOSTTYPE=linux.s390-64
|
||||||
|
;;
|
||||||
ppc|powerpc)
|
ppc|powerpc)
|
||||||
set -C
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O} -mno-powerpc64"
|
||||||
(cat > ${TMPDIR:-/tmp}/gcc)<<-EOF
|
HOSTTYPE=linux.powerpc
|
||||||
#!/bin/sh
|
;;
|
||||||
case "$@" in
|
ppc64|powerpc64)
|
||||||
*-dumpmachine*)
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O} -mpowerpc64"
|
||||||
echo powerpc-suse-linux ;;
|
HOSTTYPE=linux.powerpc64
|
||||||
*) exec -a gcc gcc ${1+"$@"}
|
;;
|
||||||
esac
|
*)
|
||||||
EOF
|
RPM_OPT_FLAGS="${RPM_OPT_FLAGS//-O[s0-9]/-O}"
|
||||||
set +C
|
HOSTTYPE=linux.$RPM_ARCH
|
||||||
chmod +x ${TMPDIR:-/tmp}/gcc
|
;;
|
||||||
esac
|
esac
|
||||||
RPM_OPT_FLAGS=$(echo "${RPM_OPT_FLAGS}"|sed -r 's/[[:blank:]]+-g[0-9]?/ -g2/g')
|
RPM_OPT_FLAGS=$(echo "${RPM_OPT_FLAGS}"|sed -r 's/[[:blank:]]+-g[0-9]?/ -g2/g')
|
||||||
UNIVERSE=att
|
UNIVERSE=att
|
||||||
@ -305,7 +316,6 @@ find share/ -type d -a -empty | xargs -r rm -vrf
|
|||||||
cflags -Wl,-rpath,/%{_lib}/ast LDSOFLG
|
cflags -Wl,-rpath,/%{_lib}/ast LDSOFLG
|
||||||
RPM_OPT_FLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE $LARGEFILE"
|
RPM_OPT_FLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE $LARGEFILE"
|
||||||
RPM_OPT_FLAGS="$RPM_OPT_FLAGS $IGNORE $FEATURE"
|
RPM_OPT_FLAGS="$RPM_OPT_FLAGS $IGNORE $FEATURE"
|
||||||
HOSTTYPE=linux.${RPM_ARCH}
|
|
||||||
mam_cc_L=use
|
mam_cc_L=use
|
||||||
mam_cc_OPTIMIZE=-pipe
|
mam_cc_OPTIMIZE=-pipe
|
||||||
export mam_cc_L mam_cc_OPTIMIZE HOSTTYPE LDFLAGS RPM_OPT_FLAGS UNIVERSE
|
export mam_cc_L mam_cc_OPTIMIZE HOSTTYPE LDFLAGS RPM_OPT_FLAGS UNIVERSE
|
||||||
|
20
ksh93-argv.dif
Normal file
20
ksh93-argv.dif
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
--- src/cmd/ksh93/sh/xec.c
|
||||||
|
+++ src/cmd/ksh93/sh/xec.c 2011-06-14 13:31:32.471925963 +0200
|
||||||
|
@@ -2914,7 +2914,7 @@ int sh_fun(Namval_t *np, Namval_t *nq, c
|
||||||
|
long mode;
|
||||||
|
char *prefix = shp->prefix;
|
||||||
|
int n=0;
|
||||||
|
- char *av[2];
|
||||||
|
+ char *av[3];
|
||||||
|
Fcin_t save;
|
||||||
|
fcsave(&save);
|
||||||
|
if((offset=staktell())>0)
|
||||||
|
@@ -2922,7 +2922,7 @@ int sh_fun(Namval_t *np, Namval_t *nq, c
|
||||||
|
shp->prefix = 0;
|
||||||
|
if(!argv)
|
||||||
|
{
|
||||||
|
- argv = av;
|
||||||
|
+ argv = av+1;
|
||||||
|
argv[1]=0;
|
||||||
|
}
|
||||||
|
argv[0] = nv_name(np);
|
@ -49,3 +49,14 @@
|
|||||||
{
|
{
|
||||||
if((ap->header.nelem&ARRAY_NOCHILD) && nv_isattr(ap->cur,NV_CHILD))
|
if((ap->header.nelem&ARRAY_NOCHILD) && nv_isattr(ap->cur,NV_CHILD))
|
||||||
continue;
|
continue;
|
||||||
|
--- src/cmd/ksh93/sh/xec.c
|
||||||
|
+++ src/cmd/ksh93/sh/xec.c 2011-06-14 13:31:32.471925963 +0200
|
||||||
|
@@ -680,7 +680,7 @@ static int set_instance(Shell_t *shp,Nam
|
||||||
|
char *sp=0,*cp;
|
||||||
|
Namarr_t *ap;
|
||||||
|
Namval_t *np;
|
||||||
|
- if(!nv_isattr(nq,NV_MINIMAL|NV_EXPORT) && (np=(Namval_t*)nq->nvenv) && nv_isarray(np))
|
||||||
|
+ if(!nv_isattr(nq,NV_MINIMAL|NV_EXPORT|NV_ARRAY) && (np=(Namval_t*)nq->nvenv) && nv_isarray(np))
|
||||||
|
nq = np;
|
||||||
|
cp = nv_name(nq);
|
||||||
|
memset(nr,0,sizeof(*nr));
|
||||||
|
@ -47,17 +47,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
--- src/cmd/ksh93/sh/subshell.c
|
|
||||||
+++ src/cmd/ksh93/sh/subshell.c 2011-04-29 15:34:13.747926082 +0200
|
|
||||||
@@ -235,7 +235,7 @@
|
|
||||||
if(!sp->shpwd || np==SH_LEVELNOD || np==L_ARGNOD || np==SH_SUBSCRNOD || np==SH_NAMENOD)
|
|
||||||
return(np);
|
|
||||||
/* don't bother to save if in newer scope */
|
|
||||||
- if(sp->var!=shp->var_tree && sp->var!=shp->var_base && shp->last_root==shp->var_tree)
|
|
||||||
+ if(sp->var!=shp->var_tree && shp->last_root==shp->var_tree)
|
|
||||||
return(np);
|
|
||||||
if((ap=nv_arrayptr(np)) && (mp=nv_opensub(np)))
|
|
||||||
{
|
|
||||||
--- src/cmd/ksh93/sh/xec.c
|
--- src/cmd/ksh93/sh/xec.c
|
||||||
+++ src/cmd/ksh93/sh/xec.c 2011-05-03 15:02:23.411926136 +0200
|
+++ src/cmd/ksh93/sh/xec.c 2011-05-03 15:02:23.411926136 +0200
|
||||||
@@ -53,6 +53,7 @@
|
@@ -53,6 +53,7 @@
|
||||||
|
188
ksh93-pipe.dif
Normal file
188
ksh93-pipe.dif
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
--- src/cmd/ksh93/include/defs.h
|
||||||
|
+++ src/cmd/ksh93/include/defs.h 2011-06-10 17:37:22.852426230 +0200
|
||||||
|
@@ -154,7 +154,7 @@ struct limits
|
||||||
|
pid_t bckpid; /* background process id */ \
|
||||||
|
pid_t cpid; \
|
||||||
|
pid_t pipepid; \
|
||||||
|
- int32_t ppid; /* parent process id of shell */ \
|
||||||
|
+ pid_t ppid; /* parent process id of shell */ \
|
||||||
|
int topfd; \
|
||||||
|
int sigmax; /* maximum number of signals */ \
|
||||||
|
int savesig; \
|
||||||
|
--- src/cmd/ksh93/sh/io.c
|
||||||
|
+++ src/cmd/ksh93/sh/io.c 2011-06-10 18:13:02.511926423 +0200
|
||||||
|
@@ -1076,15 +1076,18 @@ int sh_redirect(Shell_t *shp,struct iono
|
||||||
|
message = e_file;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
- if(shp->subshell && dupfd==1 && (sfset(sfstdout,0,0)&SF_STRING))
|
||||||
|
+ if(shp->subshell && dupfd==1)
|
||||||
|
{
|
||||||
|
if(sfset(sfstdout,0,0)&SF_STRING)
|
||||||
|
sh_subtmpfile(shp);
|
||||||
|
- shp->subdup |= 1<< fn;
|
||||||
|
+ if(shp->comsub==1)
|
||||||
|
+ shp->subdup |= 1<< fn;
|
||||||
|
dupfd = sffileno(sfstdout);
|
||||||
|
}
|
||||||
|
else if(shp->sftable[dupfd])
|
||||||
|
sfsync(shp->sftable[dupfd]);
|
||||||
|
+ if(dupfd!=1 && fn < 10)
|
||||||
|
+ shp->subdup &= ~(1<<fn);
|
||||||
|
}
|
||||||
|
else if(fd=='-' && fname[1]==0)
|
||||||
|
{
|
||||||
|
--- src/cmd/ksh93/sh/xec.c
|
||||||
|
+++ src/cmd/ksh93/sh/xec.c 2011-06-10 18:09:32.396425650 +0200
|
||||||
|
@@ -86,10 +86,11 @@ struct funenv
|
||||||
|
* temp file.
|
||||||
|
*/
|
||||||
|
static int subpipe[3] = {-1};
|
||||||
|
-static int subdup;
|
||||||
|
+static int subdup,tsetio,usepipe;
|
||||||
|
static void iousepipe(Shell_t *shp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
+ usepipe++;
|
||||||
|
fcntl(subpipe[0],F_SETFD,FD_CLOEXEC);
|
||||||
|
subpipe[2] = fcntl(1,F_DUPFD,10);
|
||||||
|
shp->fdstatus[subpipe[2]] = shp->fdstatus[1];
|
||||||
|
@@ -112,6 +113,7 @@ static void iounpipe(Shell_t *shp)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
char buff[SF_BUFSIZE];
|
||||||
|
+ usepipe = 0;
|
||||||
|
close(1);
|
||||||
|
fcntl(subpipe[2], F_DUPFD, 1);
|
||||||
|
shp->fdstatus[1] = shp->fdstatus[subpipe[2]];
|
||||||
|
@@ -135,6 +137,7 @@ static void iounpipe(Shell_t *shp)
|
||||||
|
}
|
||||||
|
sh_close(subpipe[0]);
|
||||||
|
subpipe[0] = -1;
|
||||||
|
+ tsetio = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -533,8 +536,10 @@ int sh_eval(register Sfio_t *iop, int mo
|
||||||
|
static Sfio_t *io_save;
|
||||||
|
volatile int traceon=0, lineno=0;
|
||||||
|
int binscript=shp->binscript;
|
||||||
|
+ char comsub = shp->comsub;
|
||||||
|
io_save = iop; /* preserve correct value across longjmp */
|
||||||
|
shp->binscript = 0;
|
||||||
|
+ shp->comsub = 0;
|
||||||
|
#define SH_TOPFUN 0x8000 /* this is a temporary tksh hack */
|
||||||
|
if (mode & SH_TOPFUN)
|
||||||
|
{
|
||||||
|
@@ -573,6 +578,7 @@ int sh_eval(register Sfio_t *iop, int mo
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sh_popcontext(&buff);
|
||||||
|
+ shp->comsub = comsub;
|
||||||
|
shp->binscript = binscript;
|
||||||
|
if(traceon)
|
||||||
|
sh_onoption(SH_XTRACE);
|
||||||
|
@@ -1245,13 +1251,16 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
{
|
||||||
|
register pid_t parent;
|
||||||
|
int no_fork,jobid;
|
||||||
|
- int pipes[2];
|
||||||
|
+ int pipes[3];
|
||||||
|
if(shp->subshell)
|
||||||
|
{
|
||||||
|
sh_subtmpfile(shp);
|
||||||
|
- subpipe[0] = -1;
|
||||||
|
- if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK) && sh_pipe(subpipe)>=0)
|
||||||
|
- iousepipe(shp);
|
||||||
|
+ if(!usepipe)
|
||||||
|
+ {
|
||||||
|
+ subpipe[0] = -1;
|
||||||
|
+ if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK) && sh_pipe(subpipe)>=0)
|
||||||
|
+ iousepipe(shp);
|
||||||
|
+ }
|
||||||
|
if((type&(FAMP|TFORK))==(FAMP|TFORK))
|
||||||
|
sh_subfork();
|
||||||
|
}
|
||||||
|
@@ -1291,7 +1300,10 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
#endif /* SHOPT_BGX */
|
||||||
|
nv_getval(RANDNOD);
|
||||||
|
if(type&FCOOP)
|
||||||
|
+ {
|
||||||
|
+ pipes[2] = 0;
|
||||||
|
coproc_init(shp,pipes);
|
||||||
|
+ }
|
||||||
|
#if SHOPT_AMP
|
||||||
|
if((type&(FAMP|FINT)) == (FAMP|FINT))
|
||||||
|
parent = sh_ntfork(shp,t,com,&jobid,ntflag);
|
||||||
|
@@ -1353,6 +1365,8 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
shp->pipepid = parent;
|
||||||
|
else
|
||||||
|
job_wait(parent);
|
||||||
|
+ if(usepipe && tsetio && subdup)
|
||||||
|
+ iounpipe(shp);
|
||||||
|
if(!sh_isoption(SH_MONITOR))
|
||||||
|
{
|
||||||
|
shp->trapnote &= ~SH_SIGIGNORE;
|
||||||
|
@@ -1496,6 +1510,8 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
jmpval = sigsetjmp(buff.buff,0);
|
||||||
|
if(jmpval==0)
|
||||||
|
{
|
||||||
|
+ if(shp->comsub==1)
|
||||||
|
+ tsetio = 1;
|
||||||
|
sh_redirect(shp,t->fork.forkio,execflg);
|
||||||
|
(t->fork.forktre)->tre.tretyp |= t->tre.tretyp&FSHOWME;
|
||||||
|
sh_exec(t->fork.forktre,flags&~simple);
|
||||||
|
@@ -1523,6 +1539,8 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
if(type || !sh_isoption(SH_PIPEFAIL))
|
||||||
|
shp->exitval = type;
|
||||||
|
}
|
||||||
|
+ if(shp->comsub==1 && subpipe[0]>=0)
|
||||||
|
+ iounpipe(shp);
|
||||||
|
shp->pipepid = 0;
|
||||||
|
shp->st.ioset = 0;
|
||||||
|
if(simple && was_errexit)
|
||||||
|
@@ -1580,14 +1598,22 @@ int sh_exec(register const Shnode_t *t,
|
||||||
|
* All elements of the pipe are started by the parent.
|
||||||
|
* The last element executes in current environment
|
||||||
|
*/
|
||||||
|
- int pvo[2]; /* old pipe for multi-stage */
|
||||||
|
- int pvn[2]; /* current set up pipe */
|
||||||
|
+ int pvo[3]; /* old pipe for multi-stage */
|
||||||
|
+ int pvn[3]; /* current set up pipe */
|
||||||
|
int savepipe = pipejob;
|
||||||
|
int showme = t->tre.tretyp&FSHOWME;
|
||||||
|
pid_t savepgid = job.curpgid;
|
||||||
|
job.curpgid = 0;
|
||||||
|
if(shp->subshell)
|
||||||
|
+ {
|
||||||
|
sh_subtmpfile(shp);
|
||||||
|
+ if(!usepipe)
|
||||||
|
+ {
|
||||||
|
+ subpipe[0] = -1;
|
||||||
|
+ if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK) && sh_pipe(subpipe)>=0)
|
||||||
|
+ iousepipe(shp);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
shp->inpipe = pvo;
|
||||||
|
shp->outpipe = pvn;
|
||||||
|
pvo[1] = -1;
|
||||||
|
@@ -2543,7 +2569,10 @@ pid_t _sh_fork(register pid_t parent,int
|
||||||
|
if(jobid)
|
||||||
|
*jobid = myjob;
|
||||||
|
if(shp->comsub==1 && subpipe[0]>=0)
|
||||||
|
- iounpipe(shp);
|
||||||
|
+ {
|
||||||
|
+ if(!tsetio || !subdup)
|
||||||
|
+ iounpipe(shp);
|
||||||
|
+ }
|
||||||
|
return(parent);
|
||||||
|
}
|
||||||
|
#if !_std_malloc
|
||||||
|
@@ -2602,6 +2631,7 @@ pid_t _sh_fork(register pid_t parent,int
|
||||||
|
if(sig>0)
|
||||||
|
sh_fault(sig);
|
||||||
|
sh_sigcheck();
|
||||||
|
+ usepipe=0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
@ -116,17 +116,110 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
--- src/cmd/ksh93/sh/macro.c
|
--- src/cmd/ksh93/sh/macro.c
|
||||||
+++ src/cmd/ksh93/sh/macro.c 2007-12-20 17:50:28.000000000 +0000
|
+++ src/cmd/ksh93/sh/macro.c 2011-06-10 08:20:29.451926367 +0000
|
||||||
@@ -2079,7 +2079,7 @@
|
@@ -51,6 +51,8 @@
|
||||||
|
|
||||||
|
#if !SHOPT_MULTIBYTE
|
||||||
|
#define mbchar(p) (*(unsigned char*)p++)
|
||||||
|
+#else
|
||||||
|
+#define mb2wc(w,p,n) (*ast.mb_towc)(&w,(char*)p,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int _c_;
|
||||||
|
@@ -494,7 +496,7 @@ static void copyto(register Mac_t *mp,in
|
||||||
|
int i;
|
||||||
|
unsigned char mb[8];
|
||||||
|
|
||||||
|
- n = wctomb((char*)mb, c);
|
||||||
|
+ n = mbconv((char*)mb, c);
|
||||||
|
for(i=0;i<n;i++)
|
||||||
|
sfputc(stkp,mb[i]);
|
||||||
|
}
|
||||||
|
@@ -1908,6 +1910,9 @@ static void comsubst(Mac_t *mp,register
|
||||||
|
struct _mac_ savemac;
|
||||||
|
int savtop = stktell(stkp);
|
||||||
|
char lastc, *savptr = stkfreeze(stkp,0);
|
||||||
|
+#if SHOPT_MULTIBYTE
|
||||||
|
+ wchar_t lastw;
|
||||||
|
+#endif
|
||||||
|
int was_history = sh_isstate(SH_HISTORY);
|
||||||
|
int was_verbose = sh_isstate(SH_VERBOSE);
|
||||||
|
int was_interactive = sh_isstate(SH_INTERACTIVE);
|
||||||
|
@@ -2025,6 +2030,9 @@ static void comsubst(Mac_t *mp,register
|
||||||
|
stkset(stkp,savptr,savtop);
|
||||||
|
newlines = 0;
|
||||||
|
lastc = 0;
|
||||||
|
+#if SHOPT_MULTIBYTE
|
||||||
|
+ lastw = 0;
|
||||||
|
+#endif
|
||||||
|
sfsetbuf(sp,(void*)sp,0);
|
||||||
|
bufsize = sfvalue(sp);
|
||||||
|
/* read command substitution output and put on stack or here-doc */
|
||||||
|
@@ -2075,6 +2083,17 @@ static void comsubst(Mac_t *mp,register
|
||||||
|
}
|
||||||
|
else if(lastc)
|
||||||
|
{
|
||||||
|
+#if SHOPT_MULTIBYTE
|
||||||
|
+ if(lastw)
|
||||||
|
+ {
|
||||||
|
+ int n;
|
||||||
|
+ char mb[8];
|
||||||
|
+ n = mbconv(mb, lastw);
|
||||||
|
+ mac_copy(mp,mb,n);
|
||||||
|
+ lastw = 0;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+#endif
|
||||||
|
mac_copy(mp,&lastc,1);
|
||||||
lastc = 0;
|
lastc = 0;
|
||||||
}
|
}
|
||||||
newlines = nextnewlines;
|
@@ -2083,8 +2102,22 @@ static void comsubst(Mac_t *mp,register
|
||||||
- if(++c < bufsize)
|
|
||||||
+ if(c++ < bufsize)
|
|
||||||
str[c] = 0;
|
str[c] = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2167,13 +2167,13 @@ static void mac_copy(register Mac_t *mp,
|
+ ssize_t len = 1;
|
||||||
|
+
|
||||||
|
/* can't write past buffer so save last character */
|
||||||
|
- lastc = str[--c];
|
||||||
|
+#if SHOPT_MULTIBYTE
|
||||||
|
+ if ((len = mbsize(str))>1)
|
||||||
|
+ {
|
||||||
|
+ len = mb2wc(lastw,str,len);
|
||||||
|
+ if (len < 0)
|
||||||
|
+ {
|
||||||
|
+ lastw = 0;
|
||||||
|
+ len = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+ c -= len;
|
||||||
|
+ lastc = str[c];
|
||||||
|
str[c] = 0;
|
||||||
|
}
|
||||||
|
mac_copy(mp,str,c);
|
||||||
|
@@ -2102,7 +2135,21 @@ static void comsubst(Mac_t *mp,register
|
||||||
|
sfnputc(stkp,'\n',newlines);
|
||||||
|
}
|
||||||
|
if(lastc)
|
||||||
|
+ {
|
||||||
|
+#if SHOPT_MULTIBYTE
|
||||||
|
+ if(lastw)
|
||||||
|
+ {
|
||||||
|
+ int n;
|
||||||
|
+ char mb[8];
|
||||||
|
+ n = mbconv(mb, lastw);
|
||||||
|
+ mac_copy(mp,mb,n);
|
||||||
|
+ lastw = 0;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+#endif
|
||||||
|
mac_copy(mp,&lastc,1);
|
||||||
|
+ lastc = 0;
|
||||||
|
+ }
|
||||||
|
sfclose(sp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -2173,13 +2220,13 @@ static void mac_copy(register Mac_t *mp,
|
||||||
if(mp->pattern)
|
if(mp->pattern)
|
||||||
{
|
{
|
||||||
char *sp = "&|()";
|
char *sp = "&|()";
|
||||||
@ -163,8 +256,8 @@
|
|||||||
#if SHOPT_MULTIBYTE
|
#if SHOPT_MULTIBYTE
|
||||||
int len;
|
int len;
|
||||||
--- src/cmd/ksh93/tests/sjis.sh
|
--- src/cmd/ksh93/tests/sjis.sh
|
||||||
+++ src/cmd/ksh93/tests/sjis.sh 2007-12-20 17:50:28.000000000 +0000
|
+++ src/cmd/ksh93/tests/sjis.sh 2011-05-20 17:11:28.623926368 +0200
|
||||||
@@ -0,0 +1,63 @@
|
@@ -0,0 +1,67 @@
|
||||||
+########################################################################
|
+########################################################################
|
||||||
+# #
|
+# #
|
||||||
+# Copyright (c) 2007 SuSE Linux Products GmbH, Nuernberg, Germany #
|
+# Copyright (c) 2007 SuSE Linux Products GmbH, Nuernberg, Germany #
|
||||||
@ -207,11 +300,15 @@
|
|||||||
+ mbchar="$(printf "\x81\x${second}")"
|
+ mbchar="$(printf "\x81\x${second}")"
|
||||||
+ if test -z "${mbchar}" ; then
|
+ if test -z "${mbchar}" ; then
|
||||||
+ let err++ # ERROR in builtin printf
|
+ let err++ # ERROR in builtin printf
|
||||||
|
+ echo ' builtin printf with \\x81\\x'${second} failed as result is empty
|
||||||
+ continue
|
+ continue
|
||||||
+ fi
|
+ fi
|
||||||
+ if test -x "${printf}" ; then
|
+ if test -x "${printf}" ; then
|
||||||
+ if test $(${printf} "\x81\x${second}") != ${mbchar} ; then
|
+ if test $(${printf} "\x81\x${second}") != ${mbchar} ; then
|
||||||
+ let err++ # ERROR in builtin printf
|
+ let err++ # ERROR in builtin printf
|
||||||
|
+ echo -n ' \\x81\\x'${second} 'failed with '
|
||||||
|
+ echo -n $(${printf} "\x81\x${second}") '!= '
|
||||||
|
+ echo ${mbchar}
|
||||||
+ continue
|
+ continue
|
||||||
+ fi
|
+ fi
|
||||||
+ fi
|
+ fi
|
||||||
|
@ -239,7 +239,7 @@
|
|||||||
foo() { return 0; }
|
foo() { return 0; }
|
||||||
trap foo EXIT
|
trap foo EXIT
|
||||||
- { sleep 2; kill -$exp \$\$; sleep 3; kill -0 \$\$ && kill -KILL \$\$; } &
|
- { sleep 2; kill -$exp \$\$; sleep 3; kill -0 \$\$ && kill -KILL \$\$; } &
|
||||||
+ { sleep 2; kill -$exp \$\$; sleep 4; kill -0 \$\$ && kill -KILL \$\$; } &
|
+ { sleep 2; kill -$exp \$\$; sleep 6; kill -0 \$\$ && kill -KILL \$\$; } &
|
||||||
$yes | while read yes; do
|
$yes | while read yes; do
|
||||||
- (/bin/date; sleep .1)
|
- (/bin/date; sleep .1)
|
||||||
+ (/bin/date; sleep .05)
|
+ (/bin/date; sleep .05)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user