Dr. Werner Fink 2013-09-18 11:11:14 +00:00 committed by Git OBS Bridge
parent e48d785121
commit b178404e5a
3 changed files with 111 additions and 36 deletions

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Sep 18 11:09:34 UTC 2013 - werner@suse.de
- Extend patch ksh93-fdstatus.dif to solve bnc#838475
- Modify patch ksh93-builtin.dif to reduce timeouts of pty utility
-------------------------------------------------------------------
Tue Aug 13 09:59:45 UTC 2013 - dmueller@suse.com

View File

@ -1,6 +1,6 @@
--- src/cmd/builtin/pty.c
+++ src/cmd/builtin/pty.c 2013-02-01 15:59:52.697952156 +0000
@@ -216,6 +216,12 @@ mkpty(int* master, int* slave)
@@ -216,13 +216,19 @@ mkpty(int* master, int* slave)
#if !_lib_openpty
char* sname;
#endif
@ -13,6 +13,24 @@
/*
* some systems hang hard during the handshake
* if you know why then please let us know
*/
- alarm(4);
- if (tcgetattr(STDERR_FILENO, &tty) >= 0)
+ alarm(6);
+ if (tcgetattr(sffileno(sfstderr), &tty) >= 0)
ttyp = &tty;
else
{
@@ -230,7 +236,7 @@ mkpty(int* master, int* slave)
error(-1, "unable to get standard error terminal attributes");
}
#ifdef TIOCGWINSZ
- if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) >= 0)
+ if (ioctl(sffileno(sfstderr), TIOCGWINSZ, &win) >= 0)
winp = &win;
else
{
@@ -238,6 +244,12 @@ mkpty(int* master, int* slave)
error(-1, "unable to get standard error window size");
}
@ -36,6 +54,87 @@
alarm(0);
return 0;
}
@@ -317,9 +332,13 @@ process(Sfio_t* mp, Sfio_t* lp, int dela
char* s;
Sfio_t* ip;
Sfio_t* sps[2];
+ struct stat dst;
+ struct stat fst;
ip = sfstdin;
- for (;;)
+ if (!fstat(sffileno(ip), &dst) && !stat("/dev/null", &fst) && dst.st_dev == fst.st_dev && dst.st_ino == fst.st_ino)
+ ip = 0;
+ do
{
i = 0;
t = timeout;
@@ -336,39 +355,39 @@ process(Sfio_t* mp, Sfio_t* lp, int dela
{
if (n < 0)
error(ERROR_SYSTEM|2, "poll failed");
- if (t < 0)
- break;
+ break;
}
- else
- for (i = 0; i < n; i++)
+ for (i = t = 0; i < n; i++)
+ {
+ if (!(sfvalue(sps[i]) & SF_READ))
+ /*skip*/;
+ else if (sps[i] == mp)
{
- if (!(sfvalue(sps[i]) & SF_READ))
- /*skip*/;
- else if (sps[i] == mp)
+ t++;
+ if (!(s = (char*)sfreserve(mp, SF_UNBOUND, -1)))
{
- if (!(s = (char*)sfreserve(mp, SF_UNBOUND, -1)))
- {
- sfclose(mp);
- mp = 0;
- }
- else if ((r = sfvalue(mp)) > 0 && (sfwrite(sfstdout, s, r) != r || sfsync(sfstdout)))
- {
- error(ERROR_SYSTEM|2, "output write failed");
- goto done;
- }
+ sfclose(mp);
+ mp = 0;
}
- else
+ else if ((r = sfvalue(mp)) > 0 && (sfwrite(sfstdout, s, r) != r || sfsync(sfstdout)))
{
- if (!(s = sfgetr(ip, '\n', 1)))
- ip = 0;
- else if (sfputr(mp, s, '\r') < 0 || sfsync(mp))
- {
- error(ERROR_SYSTEM|2, "write failed");
- goto done;
- }
+ error(ERROR_SYSTEM|2, "output write failed");
+ goto done;
}
}
- }
+ else
+ {
+ t++;
+ if (!(s = sfgetr(ip, '\n', 1)))
+ ip = 0;
+ else if (sfputr(mp, s, '\r') < 0 || sfsync(mp))
+ {
+ error(ERROR_SYSTEM|2, "write failed");
+ goto done;
+ }
+ }
+ }
+ } while (t);
done:
if (mp)
sfclose(mp);
--- src/cmd/builtin/what.c
+++ src/cmd/builtin/what.c 2012-02-13 11:02:18.645933606 +0000
@@ -68,7 +68,7 @@ static struct

View File

@ -5,24 +5,7 @@
| This is a backport from the beta version ksh93v-2013-08-29
--- src/cmd/ksh93/bltins/read.c
+++ src/cmd/ksh93/bltins/read.c 2013-09-17 15:01:33.000000000 +0000
@@ -227,6 +227,7 @@ int sh_readline(register Shell_t *shp,ch
char inquote = 0;
struct checkpt buff;
Edit_t *ep = (struct edit*)shp->gd->ed_context;
+ Namval_t *nq = 0;
if(!(iop=shp->sftable[fd]) && !(iop=sh_iostream(shp,fd)))
return(1);
sh_stats(STAT_READS);
@@ -257,6 +258,8 @@ int sh_readline(register Shell_t *shp,ch
else if(flags&C_FLAG)
{
char *sp = np->nvenv;
+ if(strchr(name,'['))
+ nq = np;
delim = -1;
nv_unset(np);
if(!nv_isattr(np,NV_MINIMAL))
@@ -280,24 +283,25 @@ int sh_readline(register Shell_t *shp,ch
@@ -280,24 +280,25 @@ int sh_readline(register Shell_t *shp,ch
if(size || (flags>>D_FLAG)) /* delimiter not new-line or fixed size read */
{
if((shp->fdstatus[fd]&IOTTY) && !keytrap)
@ -54,20 +37,7 @@
}
}
#endif
@@ -331,7 +335,11 @@ int sh_readline(register Shell_t *shp,ch
{
if(nfp->disc && nfp->disc->readf)
{
- Namval_t *mp = nv_open(name,shp->var_tree,oflags|NV_NOREF);
+ Namval_t *mp;
+ if(nq)
+ mp = nq;
+ else
+ mp = nv_open(name,shp->var_tree,oflags|NV_NOREF);
if((c=(*nfp->disc->readf)(mp,iop,delim,nfp))>=0)
return(c);
}
@@ -342,7 +350,7 @@ int sh_readline(register Shell_t *shp,ch
@@ -342,7 +343,7 @@ int sh_readline(register Shell_t *shp,ch
size = nv_size(np);
}
was_write = (sfset(iop,SF_WRITE,0)&SF_WRITE)!=0;
@ -76,7 +46,7 @@
was_share = (sfset(iop,SF_SHARE,shp->redir0!=2)&SF_SHARE)!=0;
if(timeout || (shp->fdstatus[fd]&(IOTTY|IONOSEEK)))
{
@@ -366,7 +374,7 @@ int sh_readline(register Shell_t *shp,ch
@@ -366,7 +367,7 @@ int sh_readline(register Shell_t *shp,ch
else
end = var + sizeof(buf) - 1;
up = cur = var;
@ -85,7 +55,7 @@
was_share = 1;
if(size==0)
{
@@ -473,7 +481,7 @@ int sh_readline(register Shell_t *shp,ch
@@ -473,7 +474,7 @@ int sh_readline(register Shell_t *shp,ch
timerdel(timeslot);
if(binary && !((size=nv_size(np)) && nv_isarray(np) && c!=size))
{
@ -94,7 +64,7 @@
memcpy((char*)np->nvalue.cp,var,c);
else
{
@@ -819,7 +827,7 @@ done:
@@ -819,7 +820,7 @@ done:
sfset(iop,SF_SHARE,0);
nv_close(np);
if((shp->fdstatus[fd]&IOTTY) && !keytrap)