ksh/ksh93-eintr.dif
2011-06-10 15:31:51 +00:00

92 lines
2.2 KiB
Plaintext

--- src/cmd/ksh93/sh/io.c
+++ src/cmd/ksh93/sh/io.c 2011-05-03 15:15:18.283926707 +0200
@@ -403,6 +403,7 @@
shp->sftable[2] = sfstderr;
sfnotify(sftrack);
sh_iostream(shp,0);
+ sh_iostream(shp,1);
/* all write steams are in the same pool and share outbuff */
shp->outpool = sfopen(NIL(Sfio_t*),NIL(char*),"sw"); /* pool identifier */
shp->outbuff = (char*)malloc(IOBSIZE+4);
@@ -608,7 +609,8 @@
}
if(sp)
shp->sftable[f1] = 0;
- sh_close(f1);
+ if(shp->fdstatus[f1]!=IOCLOSE)
+ sh_close(f1);
}
return(f2);
}
@@ -1022,6 +1024,8 @@
memset(ap, 0, ARGVAL);
if(iof&IOPUT)
ap->argflag = ARG_RAW;
+ else if(shp->subshell)
+ sh_subtmpfile(shp);
ap->argchn.ap = (struct argnod*)fname;
ap = sh_argprocsub(shp,ap);
fname = ap->argval;
@@ -2148,13 +2152,18 @@
static ssize_t subread(Sfio_t* sp,void* buff,register size_t size,Sfdisc_t* handle)
{
register struct subfile *disp = (struct subfile*)handle;
+ ssize_t n;
NOT_USED(sp);
+ sfseek(disp->oldsp,disp->offset,SEEK_SET);
if(disp->left == 0)
return(0);
if(size > disp->left)
size = disp->left;
disp->left -= size;
- return(sfread(disp->oldsp,buff,size));
+ n = sfread(disp->oldsp,buff,size);
+ if(size>0)
+ disp->offset += size;
+ return(n);
}
/*
--- src/cmd/ksh93/sh/xec.c
+++ src/cmd/ksh93/sh/xec.c 2011-05-03 15:02:23.411926136 +0200
@@ -53,6 +53,7 @@
#define SH_NTFORK SH_TIMING
#define NV_BLTPFSH NV_ARRAY
+#define HERE_MEM 0x1000
#if _lib_nice
extern int nice(int);
@@ -2606,6 +2607,7 @@
pid_t sh_fork(int flags, int *jobid)
{
+ Sfio_t* aux_heredocs = NIL(Sfio_t*);
register pid_t parent;
register int sig;
#if SHOPT_FASTPIPE
@@ -2625,7 +2627,23 @@
sh.trapnote &= ~SH_SIGTERM;
job_fork(-1);
sh.savesig = -1;
+ if (sh.heredocs)
+ {
+ aux_heredocs = sftmp(HERE_MEM);
+ if (aux_heredocs)
+ {
+ sfseek(sh.heredocs,(off_t)0,SEEK_SET);
+ sfmove(sh.heredocs,aux_heredocs,(Sfoff_t)(-1),-1);
+ sfsync(aux_heredocs);
+ }
+ }
while(_sh_fork(parent=fork(),flags,jobid) < 0);
+ if (aux_heredocs)
+ {
+ if (!parent)
+ sfswap(aux_heredocs,sh.heredocs);
+ sfclose(aux_heredocs);
+ }
sh_stats(STAT_FORKS);
sig = sh.savesig;
sh.savesig = 0;