fix error when UTF-8 •SH output is split between reads
This commit is contained in:
parent
7676d7112c
commit
3f7261c812
@ -871,7 +871,10 @@ B sh_c2(B t, B w, B x) {
|
|||||||
|
|
||||||
// polling mess
|
// polling mess
|
||||||
const u64 bufsz = 1024;
|
const u64 bufsz = 1024;
|
||||||
TALLOC(char, oBuf, bufsz);
|
// TALLOC(char, oBuf, bufsz);
|
||||||
|
u8* oBuf;
|
||||||
|
B oBufObj = m_c8arrv(&oBuf, bufsz);
|
||||||
|
usz* oBufIA = &a(oBufObj)->ia;
|
||||||
|
|
||||||
pollfd ps[3];
|
pollfd ps[3];
|
||||||
i32 plen = 0;
|
i32 plen = 0;
|
||||||
@ -883,8 +886,8 @@ B sh_c2(B t, B w, B x) {
|
|||||||
while (poll(&ps[0], plen - iDone, -1) > 0) {
|
while (poll(&ps[0], plen - iDone, -1) > 0) {
|
||||||
shDbg("next poll; revents: out:%d err:%d in:%d\n", ps[0].revents, ps[1].revents, ps[2].revents);
|
shDbg("next poll; revents: out:%d err:%d in:%d\n", ps[0].revents, ps[1].revents, ps[2].revents);
|
||||||
bool any = false;
|
bool any = false;
|
||||||
if (ps[out_i].revents & POLLIN) while(true) { i64 len = read(p_out[0], &oBuf[0], bufsz); shDbg("read stdout "N64d"\n",len); if(len<=0) break; else any=true; s_out = vec_join(s_out, fromUTF8(oBuf, len)); }
|
if (ps[out_i].revents & POLLIN) while(true) { i64 len = read(p_out[0], &oBuf[0], bufsz); shDbg("read stdout "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_out = vec_join(s_out, inc(oBufObj)); }
|
||||||
if (ps[err_i].revents & POLLIN) while(true) { i64 len = read(p_err[0], &oBuf[0], bufsz); shDbg("read stderr "N64d"\n",len); if(len<=0) break; else any=true; s_err = vec_join(s_err, fromUTF8(oBuf, len)); }
|
if (ps[err_i].revents & POLLIN) while(true) { i64 len = read(p_err[0], &oBuf[0], bufsz); shDbg("read stderr "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_err = vec_join(s_err, inc(oBufObj)); }
|
||||||
if (!iDone && ps[in_i].revents & POLLOUT) {
|
if (!iDone && ps[in_i].revents & POLLOUT) {
|
||||||
shDbg("writing "N64u"\n", iLen-iOff);
|
shDbg("writing "N64u"\n", iLen-iOff);
|
||||||
ssize_t ww = write(p_in[1], iBuf+iOff, iLen-iOff);
|
ssize_t ww = write(p_in[1], iBuf+iOff, iLen-iOff);
|
||||||
@ -904,7 +907,8 @@ B sh_c2(B t, B w, B x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// free output buffer
|
// free output buffer
|
||||||
TFREE(oBuf);
|
assert(reusable(oBufObj));
|
||||||
|
mm_free(v(oBufObj));
|
||||||
// free our ends of pipes
|
// free our ends of pipes
|
||||||
if (!iDone) { shClose(p_in[1]); TFREE(iBuf); shDbg("only got to write "N64u"/"N64u"\n", iOff, iLen); }
|
if (!iDone) { shClose(p_in[1]); TFREE(iBuf); shDbg("only got to write "N64u"/"N64u"\n", iOff, iLen); }
|
||||||
shClose(p_out[0]);
|
shClose(p_out[0]);
|
||||||
@ -914,7 +918,11 @@ B sh_c2(B t, B w, B x) {
|
|||||||
waitpid(pid, &status, 0);
|
waitpid(pid, &status, 0);
|
||||||
|
|
||||||
dec(w); dec(x);
|
dec(w); dec(x);
|
||||||
return m_hVec3(m_i32(WEXITSTATUS(status)), s_out, s_err);
|
B s_outRaw = toC8Any(s_out);
|
||||||
|
B s_errRaw = toC8Any(s_err);
|
||||||
|
B s_outObj = fromUTF8((char*)c8any_ptr(s_outRaw), a(s_outRaw)->ia); dec(s_outRaw);
|
||||||
|
B s_errObj = fromUTF8((char*)c8any_ptr(s_errRaw), a(s_errRaw)->ia); dec(s_errRaw);
|
||||||
|
return m_hVec3(m_i32(WEXITSTATUS(status)), s_outObj, s_errObj);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
B sh_c2(B t, B w, B x) { thrM("•SH: CBQN was compiled without <spawn.h>"); }
|
B sh_c2(B t, B w, B x) { thrM("•SH: CBQN was compiled without <spawn.h>"); }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user