From 78add3cb1778320cb29bd2b171a8ab59a0b86f88 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 17 Jan 2021 10:28:52 -0800 Subject: [PATCH] Fix AR.COM on RHEL7 (#24) Doing this required improving the copyfd() polyfill needed by copy_file_range() so it'll work harder to avoid short writes. --- build/bootstrap/ar.com | Bin 40960 -> 45056 bytes libc/calls/copyfd.c | 68 +++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/build/bootstrap/ar.com b/build/bootstrap/ar.com index 9bad4cd148b7b4fedfb421f212e703f177da3928..1fb0cca74cf24794fef9bbb0339b4e97b74c8754 100755 GIT binary patch literal 45056 zcmeFaeSB2awKskynMo!g;f#`CRFDA!CMuGk(TpTA2WH?5&Ojn>5kb^IMBYp05LA%F zNi5sbLF(1k+WK5um?F~=8e_g_e+@8(N zb;9_c_WlR`{C>p0@oFW1diK7id6j1?b3>@r8)+yie(L@9w)Qq_L+;`2rq|=%A98QW zn&Cfd4m8_0H(w0hnUFGmZR&Q@#pVfvZR6L(=k!QTMO3#W^3H%!`2TZo_MdJ@zW#<$ z$*T%SWoDJGTCw86m5c0S*V;#A=8Vc7mHbGV{XYBHMfP#h>eb61DSgoY$f}j)_5~B{ z{w0f7CNElKf20f*SBFMDKl;V3)(+Vn$twHeHEUL_xzoOK@#01H0kwhoc#bcT=|1}<dg^4?^5u`(S4Y;I>UwDTSN5;geN}pr2UC-UXqy6prK^=k7744C zFDhTQYSnT9pOs~+gvI&ebA*+vRxDnDzspyxd{{^kgvt5Bd#)eOKwU@5i=x24&qlv5 zeh`gEzrX&A5&yTp2yxqAyH*fP!o?ZIC(IUtW)p<%`0cg{nTQvnz)fOJ9NJqdy!2P6 zXb%OtE{dZo?AlskO_J6mXlzp<#v`8mA%B%91VU)S&|X2N53n}SYO#x z@wa7;zV+84j1VQ;%SQH>Ir5l$2CA2-b1uA}zGh6>geeykdrg~vaNu0}nuH#Ann{Tdv}Bak z9QK9F=7lt{-gi($NJMF^eqnR|~r(d5U2#+L<}%zL*VKPqZfJ8z z-rQL)Sn6z+F;82Ho;DYaX|@Q>W_?U$py`*cUzIKU>5Rl@y>j)hE1XtX{lw z(oA$7Ke7BGw;(KfDo$8-<)ZmK1An@O>*EH+4Hjc@`u^(rSj=ezsCoRx`V{-3GEb*M z@q!)Ag4p~g_Kijde2ktL3G1F0gscI1|EGc(Td80F`sWt^;&pz?-hy93DE6ha=+6U! zu=ctj8S+4=*#c;e+h3l~0AUVb_H&-g)}@So_1!UOvm8!ui4f3T4AIViovj{oPm z;%%`n(YqGEG%Ppb_wtYPa`6Af&}&!x&)VHmc8fTonj`jqLs;ei?`ZrV8iVM%G+Sn0 zNV7fcJ871OeK=EQ-xhlv$IEZq3B5tsMM^^*O@BEERm&-8#Rz*?NDc-N6XdEUk~`ic z&BKI9OUZrGd}+agrrB~!BhCBVo_d;gXhC~k*L6zmMzp1wG8fd7XbG=JhG(bHjgKA= z(5*Xf;8ptcee!|6(K_aL;G(WrX#fi(G9PJt;eGL9y4FLLoNIV0x~>T@C+YOl~4r;c%3P9G#4(c6Owd!8@ zg;Nl7;S`w(?P}-}jA`W(j9KN<#HDddO&-<Cj=Ms-vK=pojEE@h|wl zK?-_I_(YN=JrsEp!r3Y8*W_1fUv^ScwRyAYv&*r`DeMq)L$7XXcvUvF%dcE)Q~EEy zuY4&7n&Z4I@1_H=%Ix><`W?#kSY`k{o7R_Vq+Mi`HVbKX?F7<1sv96@&gn^vQ|vv7 zR%L2WqFuSUC(*17^8_Xe{+ls~rn*~x=@cS)2*w$~8<*a&)LgfgQb#P!TWYUMqF~z6 zaZ7D=#S~0hI%BD|?sWurUSH!BO5|5cWK*mB%G~;OP=Vii;0?^2(P)3+{rAnCqpiCK zp0I^GLtmhO#H45JdiwC706yMhuNB&zK;ap*{fsk3P2cfbL10DZokEBT%NZ?BJ8}Ka z1$R(aWM)|fO&ox)NG8B-n17hlbEP@bY-!d^x#~<77(!+{VDIVyJ?@EX*m+rf z!dh3b8E8GQ1`X6)xTx!3jXPwuhDyn*RaOhH22`n5LaAMI@h3M_w~%T~whKZFuK}<^ zxCxqVeHTK3NWAvT5r`0ia!XAP03n%z`4r@nb&uxfMZh{pmt#d(jgy*fsVSlqWNN+v zkTNb8D=~`MW5vdxn9ORjC^?3^(}t7~dL)-N83<({r5h>ir9Mh`yhO0Xr+yBGMj^^k^TJyxlAjyWwm?iu ztU1u9E2(l|pDqVJ(8J9bE-yRDTC^7EmU_tlg->0cnd7PYPXAip_(Wz1qy_ z)Q?VC56KSR^|eD}HE57`Rs%XTtHBmID(gY&O89m@f;(jXsiA=YRCe17Xo`;n+d)XU z*v*te!^YBH(7u2%B&$5f!`_k6wFS`KJ*)-NIzgVmsaZZsR(BIvFZ)W4-%SMcvVJWM zeCIXsjK~NtJGYCNNe=EH29Sfin3m=egzAt|j}|#zflyow=Bwo5s0@hKG#Z&x|U;=WV>FUu%0Q9~tj}y<1TTsL>D^#Z;aI0#Rx4sjD#x zWl~@xO!eyTP)@4cXfcV^XDRsfRC7o(i`8FHL=|O&+JwQCXu-o83C$xktU=j?;mM)) zA%!OJ>Bq^ylh{F!fu@_6?bU*-i3~x?h)nRZw%DNM^Ze(xQ>TK_(!pB9w2hNcL*-$w z$_s!*ze9T&s6xy(p@wE>xg7}dB$dxjHAoYOrEHOPUJ^tiitnN|1Z1ZwXebLGZ8%!s zWY_uNc;F!l??YvpvU-#D8_)=(?na7L4~f;kzCe80tCeCD!t)V{u?EMbh;X?kmSk{C zvycodh^1m!{0Q^?QsP*=6YZHRcv}tO>M8w9#(MncYiP(R)5W+L1wd&^6;U@he^5bWzg%^mq}5tOXwiTqL-TN( zx^vqCd-b|INiIPs{UJjT>KushWLI<=tGlVA8bhYRHD2{4gHv{70dcWaVs5N99!HaZ zyj+_0R1_sO?dR-cY16ElMDdM%4W~02zP3r5yfq2Zru8)zN;d<)NE@ULm;GwqPks&l z`aMXS8yb|i9FakJx8tvN7K~y@XR-SJej3-$K%5Vzp)@){+(@J$mU_U)DM_pb*kbio z0(Lki{i{Vp!2tqFt9g+ZDYCvZgXBM2U^T?>RBNeGj6+eMr%!BvqFg}a0Yzir%}zL9C`wh$Oa))zB1GA(?N!3cVpIIG{JrdJ!dr4iRgV^0JVD zxos|X77z$AbvGfM+k<)LHGp|dU^t$q^`Tc_UuweZ2#Gb%0*p~XJ2e$^?*uYv)ILE3 zRNzEjeJydJt}VeAY3(SY&F5)fYqN|r>X{}RVd{leV1)VFoMVKY7)dSD2-8&1GK?_s zidlqGJ* zNcT$%7c@Z+x&j5m=&LYW4isLC2&U{8q+M~VX{ItVw*!{W(L5*Sn5FNpf>6>99nSiU zMMGH2!ld)6qd!DgRxL;H@dW2*LM1q_`-j4y!2T4&iv zL8xeQpsNo#>v(i48DZ8I%NoQi$ZoN8?=V6D>nO>(8E5^&fiHE z#3`r-UUn8*fF}Jz*MF&%fpf({gift>E0k&*{>a#?$S5iXp)ZxzZTFVQfsi$FoNP|R zj{OJp=?tw53K-UK|6r^c%zZ{11e{d&8EDuUWT3(_6RU3kp=Ya>`+k8Q4$zmkS^W#- z(uEl=@y&_^{8?r8st?<|>cR)SrE^z%Sp~vVv%IAfWwtO&Ru?Yusx#~^wkktbD{^FY z2DGt>vO3o(t5an!dw7_aEzI$~c%D;qE7LWl_3xVrgr}=JT+`#9BL}Br%}x`=x;q2-)sIw46ZyIMnH%ub5#gfh0Z3@g|wIH+jhPb$ni)2hr5=Dx3{cplhS&Kv$q4 z(VNs*9ahQ8X06-F^{uvb3HZQ}d2bFidkgB&7QFz0TIPF`Bb9xJOS4JHlV~GsKoE6#84^$YxI&3nO#}9uL)?O zr^=OT;UE7^5SlG-BgLfcB9XoMD_!T(W7icVfc(kzeB(mWL93?Y2x(LsAeruw!DMlIyO9wM z$D>f7FJ7#<2jXn8tfq~A04eH|8HhG?S;aR)gPt6QaG?(77N5Eq!TKTBgCcPg2=Oy^ zSsnhudW=NRz4`%Yv`hcNzk8Pc9bd1Sw;Xw17M59)q#vY?2KwTZ=^8D_RNKqO{;8gZ zCJp6whQA}i{hTM1B4O8=<4&rrr+@c2jojnNL9}YG7)Nzv6fwq*03E&D02W5Vj2*h1 zq$nQtsn!N&GnySenYZ#9;6|IhktbY0!mbOv*`s>;Q-}fbe>W~dGB$rYdOHHg%!ATT z*I_jG#_Q<>mryGr1*t=ZNLs2d6_(K6(Nd>W(qgeglylpKlkMPRym&sDl)0g$SU?+g zkp~eKR#)&^SO*{ct1;qw`W;c|EtX=W5eYHAa)V}LmfMh^hrGexb&oJ%EVB_+EmP50 zpf!$JZbWpcsf1Z9R4o0MMzb_{yYz_!1(x^U1g8mp8(=DEAA;Oab)ihFDVegV;pr=? zJN&7Y5W4Zrrg5Y%pQPdR1>er3zN|Bi29E;*#Nam-^k&EMYK)8*q{O^ zJ1B~SkM#i!w8W}21v@S4XSvhZB=~|q<0+J5MNZw4>&Tm=J)9pEg>xnL0Sz&9Dt1ts z?PKqg-->;UHsGe%&??bVeub|zfy+e4G4z{M_-W*T=FJS$9dvoKI)jYXaY&AwFEmDXsre~(r}9pwsADK#*M zHm?lL1>VDIwz$*Fjty8BW%VkV9TeY;lLL)$tN|?zDXTgvTqvtLCw%HZL7z^)S!P$k zb3KQ?;+u2gaQeeGR_LVZnH;Q+6EdM4!LJNgtz6p7dIJ|XuC-`iE}$+JSv?bqY~?mN zI1R2`*}5qXOk!0|V%Z9shelH4ty^dDR2hb#)j>X{M%tHZj+f(3qvoY z`7mjjyEU+(Rq$V@ZfM2XhpTu?K)i%XYd0AsBFA6?Q2b%UeKjXAA60j)M}N#|p><^va_*M#7kX$Qc#QSrE%Os4uRG0 zHTfI|)}&o7oyp-e#z#)&c0g&_$!B}-H*!sfBtF*?{tnq3iwoaH1AjyS{RtmOPLvE? zND8~DWMB{ULu~*Ha$RCBbZNug>&`tvyqp2>e&`h!p=!&)c{+SbcM1Nxq@XL)B$u{( z9gXFQGuX|iyro@GykP)Chk&!7Ra=8m@v3fk2pW9B81Z>~Mx`>I|&2nLrp4?5b5ye^=pC z6cNidDy7p%o5w9q{!;yR_y^~NF(>;hTJtL6pPmS5XuD?ccWFV z`Jdx$dDw-h)L5;jza9k-4yv9B-pcLS)kOq^tKzHs0lqKJFJj&F57k@6np;pHlF>3b zqjDs;){Yp3p~{5Q5Qd`kHVK0~AVJ`gkXH94R&5A_dW1=q-82dO>V8|stYVGu{2ns} z`c16y>b8cHR?PFNlR~8+R2{`1q2XBaXu*kC1LU;O&_5!nyXu&*RS=R|liJy2i~@!k zfZAm?S(e$%B5jG05JCbp^qCK6b19((XWt;Rcj6bAoI>Uj)%|H5S%fIGTAke`H+0$M zq;_@o8D!?D?oOG-t8OitEC**pG)%Ut?i2Xfv}IVZAP5p@B1g=!Iypz))dvpOA^Bws z?chN8B*`NQFDJ}YizYpYv;kxQy`jq1(U1_`+21!9K+Q*a8KwV#NvW=%#sCb;cS8$={91s)v*$lK$c2 zz#N-gtW#n~q=uu`(PTqoQwz!6Qc?q&?AnA9Rc)1aAUsm@){JdIf`2rvCN5+jMT~ox zkO>d7$$d4MHgOW%+L4=OHN64(-jSzeaE_665m^>0c{Q|?#E4bGfiha`s*XdKYcGbs zl#tyiJmbXCD)w2`zM-Zo?V1;A$^8py<>Ov#($s*;d_v`VIaqTBRh9w>L?x6PY!24# z5t4|3G$$&S%mYC+Z*)RO&1z#SiT#77b9718LQprT4e}?E>WTjC|0zhpzVa;lG{dVF z9)JUYrh|86w>-h}5%R>EHlSZ;2fA8#u8~Uup6neG3(z(%{sd4}ae&%)I{oj5-2%QSn56K9{H8W^tmgk zM-xakvqW^l|Ad<7K~a>t2Bqp}qXtT#oOT!k=3!H<5KQ{(BpGZNCm}M@g{~s|ZJy0x zq@l>CMiC;Ei!DowIJ7JoG9-v_#wFz~k^CCCPy%8&>K_1Y#?s#et0}H_4?=#-84g zh=pk0QS1%+-u9?Ip@_y+Pyh338sR-Tm{b;su}E5OXfaHQCFn((P0Rcjy~w)Ui|oLLw*@7I9NSHP3n{ui)KluR zo?f)d5Z2IdA;liYl1EI>m#`?ubLSrTotBih?BIpUiQ|-|SSO*NYGY@Um{G2UhI@Vb zr`4!EA^l5y{NoTX*C0?J2g~81IHkoIMH9Ti(i{|y1hy5pD}*1(#EAogEBaQ% zNM@v~mL8;pUjYDO#qSqB{!fJuQQ;@PS6H>AtVCk@4-$1MiB)+3Sk9KcKY$rSYy^N9 zyc9!hIDs7o2)ZKcic?qebtOkvvUJ6+D;c_ClZvGx4{P_ZHtHT^J~hzZ*7RO&-xp4} zCneUgs{r-UFTQoo_K|buA9Z%5Nwd7c#czRA&l9J*nEO@jPjfhN;EL3ik|@Jk#~QVX zAeBVg(U!j24frj7^r8k@mFZ*Z8}j+43Adrlw}g&*=NKr3N34 z4@5{iAM@uQ;9MG{tt@Oj&^DHr1!)@#&Lq2-?XDEFeOtur*;~cz1>42!#UU|!MZ1`- zbcxv;y5*o7CeriyC~llJAe9Ka7Tie@5r0cE^<~fBH zH+Fb=1ok0}k5 z;BY9XmkQ6AnmFn+G3i(@=ABiYVw*6 zVUE2#z49)B;7reekaTV;Fge9HTAISdp*YbIrmApR$0MvxwL*=V-V7a~rss(SmbdlK z1g}+(jy)EUVs$P+Rb;3eQ?v-Ukb12QlS|VT6ooLJke&iT>4)4urD2{4k(=o3hfQ`g zDuW>0GYw3Kderrq8FF@`9K0=2>nMV-$wuBhvVzpS8v!c(2+-3<|NA-!!qNZ9|Gt91 zGK7C{x-HNp`jcch&U-r%gfzsECwQ_$@cL(A1;8c%l!#W7%p|a(<+m@OVvB3273~1R z)EuKbPzL#AF&0M<2AdT>It0cn-)x&FfBOij_tBz zzxZSt&vDv3j`^8(6=2!~*%12$O8}GI9_|3kE39(CbJR zR$bf(60A+kJsh@ynh+LQn50BA&>Ax}&|D-t&Q?(VUIG?;W*tV?!`}C(8?Y19wE_S8{f@ zrx%{l65S*Ii>!KVGQ3n@`q(~hn|awjPd1!0XSJ=PfCp^R zt2hd9*qC~?XOV_US2G)(Aq9D)Cwl?(V+an&5l{ASIB(E7qbxc56Rr0=Evl!q+v$jm zsR^zysM9$f2PBC2)LF8GFnDwj2$#zM4MRseX&AkzPK0xju&VWOL+Rk7FICH897t#$S$CYh)6TruO{~)WWnz zt#Me8tiUmFG+qvzi&sWqW?TeYBaPDA4T%i%lMM|=fTkD4rJhinShIMgi;W|gkBp7V1rWM zqea?P7+Z`U=oFp}Iv^7xb&-hW<#aQKkd!zK87w!>;CFE0styU7lOSG$F6?@rRg#j< zvLRS_$mdpsF!pud`vAP`&dKop^>fP+pWMMSin*62GckS*z@sVLG!95HlO1Y zW$=Mxy&WSDvb?Dr3m?`tA7AG#!oQU-XMZLKE{>>3mvG;~g>4?-B?qPft$TnLb=w3T zw+&YzWbo`a2to$jjo^4}eE4y2rcL5Fx>U=l&8VOj3TTGLDwvie9XN(IKB94P*R(65 zJEtdF-QIt3n`Z;?HzmI}aGw_{@Z{8mX4jW#JPx$>*I8_RNjvyVbSp#P)>+9_t z*(bgoVj)>gc_;q>#$1JJ$y!OMc(OZXwHOn>gN&qU=*rPPIs1^;(NGSt*~;b7{>Y~& zgK5~IAW#IiVo}cYU}ik@Vv;B_@F)fz(`*qpvLR7Qcvohf@>o0Vp$+*UIMPX$2x5pBZH2q`Ne1BxtX=8Of;HZYT-`g(HtY% z{(@3jCw5HQBRJjOUk)7pIW&i1H*u9^)a}Q&ePX<>)f?^+34jcn_KwsKhK8VP0s|R{F zDeJ97cPYazoa-V4(L4cMSwLOe!lA!Fh6jv&3Ape8ja)A@?czB$l^ zY1$}OzYXaJo^6lvY#K)rTOBwRJAgskh(X~-YDX&PADSK@=w39fd;~}S78L_Ty2Nt8 z1J)i`ErACp3?7!%)!^Z@LI2FdF6xRmNV-A?*(C-KLx*u1Jd7C+9+rN{!;?4;&|&zh zNXj!<*a;RcAr|Ic;4FOPdn_!oH9x|_Ev)bZI5Ws9nZm7-Iov9l!%_Ni7Cy&W7)K;7 zv9Jv+T#p?J2v~2>38{9`O1MmSXi(o#X4`B)*NN=FLFc5Jm@1#bi;WpyNDI5ey~J(*}KLPc~(9Ufw-h4 zGOd{HSMxq)v<4RCb1V*=^0YV&yXPW1hp-*61op9V9i~z+?K>{Un3;cB-pi;89I!~j za^Y!U=YCowPaBKmel#l|I8NeOox|A}+~9|qxR+Z!r(yLpqE`h6$@#+1$$ji)W*m-O zo#TVri(gxK4RkitMyDrXG^bFf@w++$$nkYDTucQ5?_%pLJq-xSj!)Jsf(37^a4UN_4FpH^Z`UmdM^dpV-U@Q!`~$$++t}(68&(xwpjMZqM)1{ zm<|dbp>nF_RjTUfTsugHJZFvJmw0mOYz}d+-1|w7MZV6OoE5|C#mPak-#qnM+3#cAy66SG;G@=GC@4{ZcsTlCs6s@kh3EKm>z4w@;24^OBxmI*@JBvE z07(7;mbaU;Zh9SkfQ`8x9FL*WJE(JIOAw_<83qi{gzDzuD2 z$RZS(B?%u7SInK(a2tu?3F#K3DcLA`qJ|g!2R^jqGRpx<;45yCbviQ(;a{SL7xEu+ zjBGR<{HVDG1CDu3l1+uG9ys2|rCL;)WuY|8*mKI2_1x3bGO};KP@K9B6iE;?bPQm`jK^ zRC9%9LNQlp9_0$nqa3q$NTI>9XDBqVYEe-(ec~~J8V^}7^1*E214#xDrYQ|(%+jA? z7$s`q0>J0$XID(*yJ}iUZD}E)Uw9Wa&xJl*U>G99+6S}@!xw=4h=#ANcu@zhxEMko zdW&Hf=}}i#Q=oT5_POl-9|--zQvpczqI^S%BDEuVI1=HRq z!9R_e`Ii-LLv`Q*kJmJ{fTxkzAGH6pw9D{#b+{O0e^X5M&yC7{ZXgYm{a!WYW76ng zAbmgvk{Q42Kni2plE;e-L2_M^al{Qo7)XZTmxEJm;RiW?UhQ)nT9f3Bzt>6u-1IX% zNhhIdjV68&2YG^%{|gd2>U$**Fk-&otRXLZf|8xjV~?YeiwB=LX}{JIh6-r2+)A^j zWs>z)0PzGT*(C9bNjA}zdK1zSCjB>0L>L0ehEI!SDE@MR#4L#jqE0?U^B`2Gv--Hz zQ_<~%LR7toPoje!&Mn!HEZy8{f&ZCn2om(&@$l3c3W8xcr{D4<*u^lO&D?^5{hSK> zIXxX2=#F7Sd!ZP3*)%8!#aJh$jPN;X9GfZsy;~If3_t1?Rny<9A_YOZtRP5PfGE`T zlY$`GDa=~HCwn24q6$Kap&+DJqAGCU3WA|L{IeC^9kZehwd#`0JkVt5c(rf z5K^G|7DGYsKtb?C-J<9%LkhVtQbv_+aAX@+4dZ-_t1KJ$ywNnQIQ>a=_m__bOJugTshwICAOVp zR(O$r;A^*hN}7}!bb=dHU~Vr z#>TgL3@78kn3M4`wda7^=xH=4{XIgO6UozfJ%-N#AmQ~yM;N}`*|<0AY$Sr4 zp)5Ag@X3Wb5U-dN6`AMP{|k|M3>koAh|GU-JMx2%P+!UI_^)j$99#cUn=0yaoSU!a zZA3GeRCmLhVJw~dV@^oJA8DsyhCfod%9Yg2@`_L#8p``Lw78wby^pu?*bfaWIx_z~ z!-_0w$j$FBuI7W^^FAK@pL-u=J+&9-^p(_koVV{=5Wa9s*GsU4Y;1%YXN0f;Y9mDr zYjf}YQVHKL3Cj^WLm1s;(jI>wr*%?s7#D_(lBDg#ZXA3H%Xd-F;nCwB%sKF29_#i5 z*LHKKj-gdgrvk7A@U$vKF|KESt$lTxwtBF$;Zf&6%kt=B2s+NL8NzpvZxcM(eI7@*_|ym#@u>=m&CkCJd(6OB9@&I_ ztm(n^+P@}WhWZEfOni!V zGy*4as@YWt-fx$aaI&Bk4xwfk!f_t90Xl~hJI)^1w;qDv@Zz~mmnR-uYH&CKmiW}y zSa|@#lYP!(KshTX0s3B4pA8#fuOZ-Yavun1`ItA;7EXwQvSU@mfO=Ff9)U3d+&LJ+ z00%D?K@7T5X)Hkpaty8=54fJ77l>X09+mIKXa}heSTFj}2wL)H+QToCU`QgjFEH_8 z^_HzB+R?M3MJRC5J@W8lDCSd(v4zx#Eu>M@I*5*~%qu;x(4M>k2|k9)zxzEZJS^Gg z4T0Rx1@ah=S`2~QsMs!TVVg6`;h*K%rc8p-xf>^PQ$i-8BDXOZ~DKy`Q@O}LuFkTES54dHFD zr{AJKfeE@YzLp3~V>zu!Z88m$gt?Y-^r(TcA$ z!Z(jgHEalf1;EReL2)j{T3kNh?jIeA!v+jL3kmKK;OZ)*dqSj;E>{z&rF?8}uul#g zV{N@1^2l~NaXLs|_DzP@vFHxFaztL%mND`w*>n!xd`QaXWnxS_@cHlaz6{VGH z=)see+5>kuc~@}D&CA9Lg!HqN1LNrH$a9z9m!d;@xI02)g-eu#TkIey{Hqgj>7`Zs z0GN8zyR;S>9o5&0gJkhO^)3%CLip61GyQ|;J(B%jc}-tMuFCDG9f4wX&_V^d_ge@j zvn)>T2C?McD1zPGMkBSKn9rc@*1eIKnxCPWJ^)b{Qj&6S+Da z(4dE^ZYO`%ATFy^Nhum=9Rv-G&S4t*oxeZgOKs!dkBdyH9-1wndZ^Drluab7bCzf!cUG}CY|4F$<-lJ z!WbFj-s+`yh4?L#9wk+~uNgXDXU+#CDf+|+?jle-hNmtrnHMj z8k-yPh9I(=cP!F^Xro(#~SN~6e;+)Nr$S|m=XC*-?vK#k9l^XCBVT*l=jFC z$40>N9}g5#3>2ycpio69>_l-Jzq?7(-02mk?3cwU?Os!d+|UnMd~kiTb}hyO=S?Fk z>8?$~ahr>M<6>~u(U=6WyBY;y?H|fMQZuX6vb-_Z0 z(D;mVkaiRJ2PaM}+V;Qd`Xwm?nTE^yI`|ySi6cD&_)~j%kFGbBK^wAPra0$;0c5w3 z7Gw#JK~Z8~I$QgPC_PWm=~d%`fu`Mr{*sb_=XQH6J8<0AtiY?W0jdr)dlFm2;qEIi zjEK@UF&j`xM!+O&iztv7YEVP4dEJSNj;Wg zYQt{{KZ2<@8#EF1lv59g#!2&Rn-=@i>HaUAQC213G#9#{$ z)wl(?S1!fHEgXwFCkIzs+Y+axhDi-Hs=$;xlwJ*u{>LsP>w^aq*2>U#;8G zhbh%6K11hlaEp?Z%5T6o0Du|R3c*^-n*3Kvjy>g~v6Q$S>l3U`#Od#{PFh*Krf!$x zxH8r4&^A2aay**ygjBWRy-E;QN!A{0gxh!r!Y+2wR|@j?O8WcSyQG6GJCPv;=VI+G z7=y;amv}Oj6fYp-{WGBq_`aGtQ*JUZ^{!l_gE?^ z+dl*xl69F$!>=`91OOQb7Fi|7r)x(?Zo{Wy9G(c^71HIvhLAwUq&vhu0cJo;Z+B%M zH-f>LCT$Kdf|Hb}`?3+8ekmBH;pqOZB}cVLP&> zL#%!h-I9W9ba`11M(dBE%yF18Xk8YD-D7zpt} z+b`+w7z8`&n(zp`>Hmpjuj3~+vF6{YfaB2&vF3Rm@(dGeuy-M-QVKr>0F8uANpayi z0|QQxp8#t4jV{(M1%2RAqFdJl*{a}}%W9i)1%@<38RT-v!xRg2ipZp@{z?E-61D#o zLTx&?3Q)X@sQ^da^DOJn@R%-0Y<{NI&6a1T_?SNvVg@Hz-B4JE{nP5kr2!q#i;bIH z`kCZ7vi?TzvTxyI$F)Jd>F!eRZC1JAs7+75^)5lUTU}54T6^r;#1DYRemS@}b`xci(Ya!o2Ib%u}&Q)vL8T5ur7ggyBtTRJ-YgG1= zY=PPLXUan`H-t6Pz!EAN0kx?M3+VCkB3yq3B=Jog76C9C`vJh9D~1$!#nTI5w9f;u$K4l>}7fp!}J<3bTXE<9U&vx7_DBJs@` zcjASUELr@^eiZbWKBTf_HN?sqeJ<8=Q|QEejsB=5yrj;M-gM2c7!JnIHloLHFlNci znlj+}IfyvU)!-dTC6TWjk>o&MqLReJdV6GQkL6eqP2NOp5THixpvq&Tm46kh92cwn zez52}+=^Rk)>~2I*I4hMBJJ6Yb!@`$Qk15451`%j`#B!Nr_x89GJGPwEt9a=BFcv6 zB1Xf*x>h8F$-pZSMkojGL{JEG5b1IxbE%~ShYU0N(BP#? zbU>F9@Rj*Dc4rjMgylpkIIggE-YTmm`ree=;d6#aVf=5VlXyWivHN z`Q3O;23Nh0$bklHo(L7SD>-zClyWQk<4=htHm#f6Mb zQD#<+1l%EnIK`>H4VxtWqeym-MS%attfZ@jHUyv(u+N~DX?G`q-v?1i_PO>FNP@9j z7xk_i!iBK2WA(wAV)%Zfz&RaWqaLWx@(Ym#kg=LN{4S6iSJ7aKv}397B;mt0oYC9W z4QFIXF!HWoY3_sx(hgayDPwTeAQ^SA^LfArxjmE(KacStvO$ODVkZl{MRAJo!75tP zwHjNybm76cCsVX!D<#b32{c9tS`n~n>ah$3Of$K_E~3^qKJf zP@frB%ndN%g+P~{H@OlCuz>gp>?mw)4rU~@vt!|F;l1K?in`J8Rs~s~coq&1t)eBi zdrvPe@IN2IUwT6gA9=z{^brFWiNVz8DN;-SA^>g2RQ2H0XJqr6JtlJ| z0Y<=$TW`%iN3ZzP$G|XN)3@P&5EwkLMjgNOKpB5y4P<7$H6bi4BAg)ry7^JeZ>jWh%eHFXKuto0^5Svt?>Nr8jB6 zd=um|rWg4OAf~~SSyJEv?WxtYJ({9Dj}r0=VH!TXr~zrqpMWM;0^VrSp2y+&s23q7 z)X%OXp?(@3Sd!~eVGvo+W3f)-v%$zCv3-%o)D@HB1X6QfhBwAjdVx;}%no=x6qxBy z_Tvkm^z#dMH{oI-&RhE6k5jsUQCC!BT%ko# z>#e}`vs?qMLIW-PWe4;BXts|*wE?sJB|!YaY=0I>|D)MH5|g3F@~mvk_VcvR44CbA z1I&-k_CLe;_*b)i$quj!=0Bu>x3t6O*t^z|+cqs|Hp!0Z*0m$??u*Nv7l+w6+@ z+bxl=WHrIXK6%<~{YuswA|H8l9DQhp&o~spnG$;3r8OJ}#ORxhFBgjcA6|a!1nt{! z6)tu3TAD$5WAMRrQ43Qk?l`x0j0_XWyR0!|Qeb^TpP-1)W-zG=zf_RV`XC8EhP&z` z>PIx^0CF_QU4f`Nn`jwx8}6A|>{Z9Ug?z6=TeEDJ;Wq2=-y3wozMDT52o(MY!F>V# z30a&3yAcY1m7WhBMTyJR^$yYsGU*|iWglg{gwjw+gV3^g-OP-52n;{y$ea z@q9NW&?suxCmT*4c>5xwR9;XH?xyUjlLTJ79nu@R&F3nw)7EtPUtloqUe{WLnImtA z%fp4k3^y99^$BhEE>j!gRvu3h-mxDsy@Pn4i}J4!eq}#wdJS=n$FCG#w0~;)Gvb{* z9xo)|^^XL^TX}qni7>#==vp2hBzWu|!Grv5JZ>_5F!EcIWYR~!z~e)Nb@p|_I^=IM z;+N{LakPUC-)wcYlT%`dtlST zxpW#X>~{H)j>=!WfTjCmoLH*I@3Y{gxF*le_un&qKsQwNFx>ubz@cQ5r}rqT#^Y$n zv$84V$%a5^4}@|ifo^aWfutW}ZB43pcM`p*gu3tu4in!s+TwE1V+lr~t# zONNkZYv3i}H2wk_*rVyq31j8n&mn6}8ZEO6sBn|Eih_7w&I}3@AHY$cDvP^6#!=I% zV;6|*e}wC70hDLD3*U$-5jdI{Xvo>*C6vzLOck9lNUS)@QEJ1j%km88(*=W}mJfAp zG7pA~17<^UPcw4dU~{}c)Eo82``A0A61~Tj?87T;hqcF(THIS!KDbhd%sdo2boB7p zQ^N$|P}|{ejvT7UKlIh1z3jl@(?>peEWtnVP+KGpIU8(q<{SzgF33E*p;B9Nr63$$ zQMoYCH&H49z$dOcawrmaq!U2PRz4!U1un&*07$e$ZSaotykqwdmsltKFxi+)6Dx*E zfxf{{T+{5bY{@}SBgaupmuksgizHlXujo+dh_4bGp-Sc9-E^YXs%fqlel$_j1@sgi>GmS@@8p z_gbU>=*-%yj~wD6$xXFB|ND`{YaFtU7uzD^k9>Nl?adRmwNc}*`HhO7e1Qcxo_1Wpq!$&$R7QpWb^9L-3-_P`j??~s7PH87*y}-@~^obP@ z%fAZFFiE(0t+#l3&jlKDHq9FM4BApY_n2C-Ef+X9v0_s2Q4?-v_>-GmsWgfWk(14? z;ahHD=ju76cd5{DG==xC6xY>!w+$c<-BxJLOYsrUbfhe6m%6>UqL{)1fau z@9NnTrzC)4DgJmoSpu3hc^rFi=7Y#K`4Yjxf%6l=Cn$fU6E*xvtdsJ_MuwrPITpPs zl8UI+e}$22*P9{>g5kR0!~1ZV1zn^-5FFDw5$JRI1FhF=eNskNOj$l&JwoFt$} zon5K#r57Bo!n^ykD^W_ut$)iFJUfFjMNIO6{geJxhE9+`X3yJ+a~5RCESQCmtQ!B8!65#KI$jB|%WQWBWw0GK ze3T*Z(FTrwEmfYdOYA-TqlDml+(E~YMXYt$5<74*q$Of&r1#*ann9?*cBJ618%INN zqG*TF#BOTS8{{v<=eF%43c6U(j6`i`Dzv2?bPLp_@)Q^jR2qm<-N-~(22ngI8O`Da zH~xD2^}Hcjd<}QPPFEgv;z8C%{KDft5J2T_LJDsrNN}Mj@C2SFhoi(dEhjZsr#q2* zb0k61TX10*(#SBaLd7c zfPF}Jb&q1+mV%cv-*qv(D8pZ~mreaH2WDTIRQ266=zqna=C~a4roy#w@_WSy#?|mc zmj77MW7}+E^>0xhwx?Nqt^w+x*A4q;DgpOfP)#Y2f{I@Gb{?UNIdN9G2_C=^C~xwc ztK0n7Ae&xki0DhD^NHUm_-L^T_jD?+mtKup5x%lsSlwG zu^xGmjA*ocPAoYO<1rA>*ob|bd0@g#5fN`74*+Th6qh3+iN9>dHQzB*9~v-cM_J{} z2{(B*3<`);+ApGsw9w7Y;H@_Q4fNz3xY{T!*1c_^aiE8zjHloAcGNf+c@Izj`LhXf zW~}T$$U`~g*wl*93xZX9X#QOG>o?)qNNA-4{@oM!d~pjKUUodVjMpcQ;RVR{Oy?$d zi$bw))ws%Y6W8Vh`fjKgOlnui=8d0ZV{v$pN1bHFr5h1vtZ*WS{xy+FxK*9uQ=Qhx z=s@4NXnAY2d$;Q_7)Hk$b{fc@T)-+D)4 z$?v3NQmW5}ojN>0W|HnH=1OCuRP1Jlv>DL;epG%%pBdz5horY}xx$He-f%$@mNZlh zJh}D9Wzfs$}XyNZiiThx1Xk%g6rBb zI7tX#8O7%kS=V84Ss>d6})PDZ3)kzd)ET2N}d(H^Gl{DLyE`cG8; z5&yjK=ajHUtX@Tp3@=#izrElm#(8pSdwjj0z_0R83DeGVf#M%aZSur*{@j9cvHC8g zhkuPfU=wL4wjT&9=Nsc9Afgj%E9Mr2?{*WfRNJ=BNk>w|Y8gg=ue43N$0fe;8D>r5 zTp*2&uVNRTp)K~7!shGeyW;k+4B%j(i3%KS*!B&C@N#$;yq~M#5vZ^p&WdD9YK6J# z;$P5qg$M-=u7dcfV6F-?aTo0rG*Z2t zKT;v7;C(wDRR_1W2O7bx1n{aDJUWmz*QyHKl~aEM8pi%G+~4m-mU0dv<#HCA{W>0@ zf{VG9`QC;%+4nZQ$F;dV>g?C+N1;mOE@M7P>O?&Dj)wXIEzyQ1#u{3OhBo4upkUNU z!9R^aRcn6%vPf^eywQoPPIxu8A2MdHx3p0%Z9|{tzzQ)&Q_>I2yEl>y3DSoIE;7WL zS5Y|Jia(HgKc-h*Ha;MBrCIa{Dmze&)faE=v5WO~v`-78eo#u<6VWbt1)~4L1M6cS z>s{PANKbwlC!HYIip4k18#s_nj%~+?RXKC{C_Jw~r=tF!_OAcAi6hI8j10CQ9v{os zN*0E!xwWbsW0Pe0vN*PEkF7~bme-Oo+3+R88W|n7g_iGx!{eDGoJOBx7$UiZ0o&=oGJc$)Ia>m3D(00)n3loU=Y*?xwzm09* zq2UMT1852T^9=FPiFi8I07y*EO#0y&QY&@Ol4|*q5{)8jRt8oys@jOTfuq!AJP<*I zACN#1YhO;b^F8f5eo3pH*G@;Zh7XT};vfDajB|VsBe48XaO}5WiUcl%F3YdNnC5%6 zl3`1+KOYJH;1dYUk#asltuiLg+0zGpN&ZPMa98l{9T;zIVf|xD2uNKR`PYF1JuHBF z(F4L`F{Z|Xqg=+tc5}D15>aGGP(Kx6-;POTv}o(}W)uRs885P>XFmi2)UP2-ib8c~ zkH&EN7~TR_epLy%m%Nn_@Iz?%MKwIZvxmFDE(%8srzHduf}h6$K`HR(fY$hS6Qv80 zzUKid{itokUtTyuZ>90Tfo?|1RbdtZ##BFnUA}~|If0Q{8J?dgcgcShk2-kzU}`vx!u6_EXg4~L;j35%sf!hb*^O|652Fp z5p#t-Oe`C-SZv#Cco+U_215sg$FkL1r2P6Aj#o#T4+Dr6MI`aO09eAIg-7G$YPf*C zZ8z-6#V`(i`$q(5Srxjd$gY)veBe%;{Z-$kuk^h*lL9&ra6&n%6r(6xUeiyf)f^cH z6$Cx>ozh7Tiw#GmMVjdNe2h+mUlnKGm9aMLLXvQpRyzUWVfO3z zY3^;)uyJLtZ>jPrs2LVQ8?k{nL*0@%Bw(125uy<)c&S$n3Gi=xf2PO~XP{FF>WV_O zgYr^fFC0=_(BUzodIP1D!RGRV238L~cXyITQ;;?F;hsiM$QYb1HU{q$>+cBc&n^j< z#?dP_v-}shFG3UPbm7q9zE<8ubD1Q@Lgvvc-ZX7m2^~d4m{2rE9~VRF8N8*TW!6w| zxaPWP&9I<RZJ6ma3z%f{u`Jik8k@1=T@{9fFIn(dcXpC0Za~uFF1?htncP*Q13v@ zfTI+mkX=N7w<0>KjpCHM%q#M62yI&sCu(u*uP$^fGE-}bRSI9v4~!Qt3SpJ)484ru_Y9e^tQZG%4U}@n1X4VKjmblsFNLz zpn77)?<)K8AkCX<`q^&naxkQ2`oS0;Sv+Rx2mLr9(yphQ{@el-TNyl0MG`l~i$wt~Afwm3;DB5g5+ELH#`zM?imIh(&*BSCn z+Sr_4c2289>x(AzObqQmW`0p*3?ES+mnxIZ`Vn|4Mk;5(Gfj)*q25`(C{426(ZE;$ z>>40NDqo5kLf0^iO7JAZr5gr4WHV#&KH^IY4X4l_NH8WoY>%($r3E*e#-U*!5gY}6 z)O3FoN3f0+XZFfBk-vr_BKW=yr#Qr7+|-YGpnk+;e7^+yP`;(f4L0~5UY&jHaV#4(o{uVU!6*lh?OBntj}LBV z@qPPSWIQ^SkDk3&cjN4hx)Ir|2KV{zu?RYapxG2fFq#dI?OCJuSOgtag5uG!90mRB z8@Na0#a3enmH}>GHe(E7v+VZeGq1<29a->r7-HdkD1U8rc4Rr>@z@z+o$z`rUn8Fo zEC1)wtaetufE5=jQ4d=d)}fDk@!q>TcgY_i-c^WdwJ~ggtaEG%$Nn18`e+7dG3a-b z=VWgslgIvIhLXH&iju6Pb7XQaz8q+%U`HMEE;NSUWHEY|vf_{Kz58(IE(k?ttWMT_ zeJ*7`s_rUb;yIr^A?(R~(%zDWTT{}$ zL5^0}QL}dO-oNhJCU+q>RGO3lRpLW=R)8~I182H)>Ax96|OY=7lNILl|lRhG6nz8F!AHgZq(8Y9)lYh&0_k;LR99akp zt>FYWogT}EhZW6fPuqD7u<3r;c*xBwo@6GBvj@?ruqho zA!I@KAlF_2b~*7D^+RbH)A{IqyoxV zcF5q|o?m=Vf#y`q6U14K;U_w}jUDM*04yXlITw*23Y%T1-KSJd*b(85n5iRugI?)= z9{hesx|ECY{%8iKLCh;7!l6+hd@LM_fUl%|f*wB_05HM<7EMybzcN@<4scTc8Z5f2 zJYj`qgiXiJKiai%Gq7a?L#@|2`41B`FO=vvOs8i7R*R7gvV+2PA-?oFrmp0fUw5R3 z@rF&uN#W0}-5)Mt?#qvWU%95!uYf;jrKL*J|M)Jjh0=F!qx?gI>_pYuSc$;qRtDHy zODCIKcY@8`^&Xqs5MgsYgKTcgD4Tn5s+`STfZLJ{qmF~Is{lqr2@Fp)jFvZG9BhuU zdf?Fmj~;mRz@rBqJ@Dv(M^AY4z@sNTdcvb8JbJ>TCp>z>qbEG8na*|V7;n9=oZ-mi z3^ip&VJpv72qr#1KcA`f*&D>o9JAI(KOK|bytjc_v&HVM-}8!&5xriIcQa@Aa!$Le zQFQ2-Ek(>0W=#=OzelX!tNL!{3R)R1m(f3?W1e~T^;gwkjE%1`GY)^#Zl<%9kr#(^4b`lsbS1`I>?(Um_2s4qfz9FxV4RlQ<=YBk@yNvOls@t zVpq2*_Bw~SZ=EFVXOsuGzp*j#q%TjC00TMLWiRNheCg#MZP>WUzPsKbI+s`1>CECpX73j zoS{){1%=xuWOd@hfhlRTW?C+2bWz>&u_c^ob$Yy?~9 z@p2BAPx88U`z4W+_PBhU&*PL@>|T*`db~Qjdq3Cg_cnWcBG=-Q_HYP5Hi*YLMUeyi z9?>iA-p@67?QThQ6!kwUseU%pOfGxD6(Qemqz)bN~O<*I8eTZMAIoO|A2h5LEVP*u(mkfGLQ zwA66rg0;+K5X@H2U^3|ts>V=d6L>3EC)kW!4PObtAZN262$0Ppt|~LtmJ3yt6p9nf z)h2;2pBvgz!I^nf9w0N63MRq!ni6q^V5{P-)_hK=;;Jkhzm>1DaaJQCL7H@Gno4=j zBp6CfsCP)Aq3SixTFsXU22&oATf>*x@(@1x1PGK%EB}*P-~x=U++a3TA_HpBq_fV5 zKCcBa)*x5bT9b`ZUr}Q*b0&)w&=p**l}7|v&w`*j&<%;T=5cjK9!aaA6dUj_vk8_e zf<~ma8aVT~D!$SrRPt42JjH1tXr0Yc1Hf8PRSA#>P9j(-MpPgQ4L~3Sjw)n_Fe>Dx z?}Ah)@$)svyxE{&t$3RJ`8oz=*WO5_quT3oOHMA=EZ8^`ij3PQ>Yu6zg)hCZzMyau zX9kn(wcBAll^SDYBGL&YW%kA`(G%NV?>pe}_l-9{GWsNA{ zfCZ;PWiRuJc1f%NmowX&n_cdPDu0u`j@ZEL8*-M5jbZ{W;o65J3Z62LTk?7u@t$vW zN!4CYz3B77Rnh48?IEP4ey3CPk{46q6-C~?&*k;Fn?$!{MMZQs_y}92D3y7dkYa}k z)%=N%+vjN%%c?1?0-?Cg9tS0Rj*rDJHT$I}aQ}N01W)M^KoQVJ0;ee5|AYwt$6LNt zjg3Ov_BT`Hz-6-gB%WFc^{rKMJcZ4=-zSMp6dM3Q*{v?I#o{C!d@E5HzBQuVK^}y` zN)(ur-&uDuzq3Ab^9x_z?MNV2@yyBpR=d|_-`%KC6p$2IwFjk4^d@pu>u#ExG9ak) zx)L9mIq^2(OI%kVGg)yW>3Z6({`-V`r)syV_TQ-XG1dMT)$UU5Uez8~?fa^&J(j?? zOtte=yF#@cs@jb_tM-4W_8HZ_qS`l9`@U+=SM&FrYUinTg=+s)wHsACnd?q= zb%35VjAou@z9v(%NW*FtFIlBos$Hd7v3!+g)pM&f&oa#4_Wb)hVO)QyUdHcU#m^`x zohRNo-iB+Bdj0sj*ZKrp=Q{^~keQ`jwsb}Dq5pdk<~K<3~XPU88NDR>&s`vc7UTl0<$FvCno z+F;s+0VYdx@HVo|9i%IOYY`!(hYZCP2xKE6xU_#YCk8d8hw%0o?w{d)4|f~xIq9A= z!p=|jY*K#U*C}eGXaGKuDhDYVP;-$g2Pqo->68O@bqO*{H{_AuPuPkB#-CchGnwy{ mouWXB0x1flD3GE+iUKJLq$rT0K#Bq>3Zy8IqQL)03j7bH<}v&L literal 40960 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 diff --git a/libc/calls/copyfd.c b/libc/calls/copyfd.c index bee566e1..7adee22a 100644 --- a/libc/calls/copyfd.c +++ b/libc/calls/copyfd.c @@ -16,57 +16,51 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/assert.h" -#include "libc/bits/bits.h" -#include "libc/bits/safemacros.h" #include "libc/calls/calls.h" -#include "libc/calls/internal.h" #include "libc/errno.h" -#include "libc/sysv/errfuns.h" +#include "libc/macros.h" /** * Copies data between file descriptors the slow way. * - * @return -1 on error/interrupt, 0 on eof, or [1..uptobytes] on success + * @return -1 on error/interrupt, 0 on eof, or [1..size] on success * @see copy_file_range() for file ↔ file * @see sendfile() for seekable → socket * @see splice() for fd ↔ pipe */ -ssize_t copyfd(int infd, int64_t *inopt_out_inoffset, int to_fd, - int64_t *inopt_out_outoffset, size_t uptobytes, uint32_t flags) { - size_t i; - int64_t offset; - ssize_t got, wrote; - static unsigned char buf[1024 * 64]; - /* unsigned char buf[1024 * 3]; */ - uptobytes = min(sizeof(buf), uptobytes); - if (inopt_out_inoffset) { - got = pread(infd, buf, uptobytes, *inopt_out_inoffset); - } else { - got = read(infd, buf, uptobytes); - } - if (got == -1) return -1; - offset = inopt_out_outoffset ? *inopt_out_outoffset : -1; - for (i = 0; i < got; i += wrote) { - tryagain: - if (inopt_out_outoffset) { - wrote = pwrite(to_fd, buf, got - i, offset + i); +ssize_t copyfd(int infd, int64_t *inoutopt_inoffset, int outfd, + int64_t *inoutopt_outoffset, size_t size, uint32_t flags) { + ssize_t rc; + char buf[2048]; + size_t i, j, n; + for (i = 0; i < size; i += j) { + n = MIN(size - i, sizeof(buf)); + if (inoutopt_inoffset) { + rc = pread(infd, buf, n, *inoutopt_inoffset); } else { - wrote = write(to_fd, buf, got - i); + rc = read(infd, buf, n); } - if (wrote != -1) continue; - if (errno == EINTR) { - if (inopt_out_inoffset != NULL) { + if (!rc) return i; + if (rc == -1) { + if (i) return i; + return -1; + } + n = rc; + for (j = 0; j < n; j += rc) { + TryAgain: + if (inoutopt_outoffset) { + rc = pwrite(outfd, buf + j, n - j, *inoutopt_outoffset); + } else { + rc = write(outfd, buf + j, n - j); + } + if (rc == -1) { + if (errno == EINTR) goto TryAgain; + if (errno == EWOULDBLOCK) goto TryAgain; /* suboptimal */ return -1; } - goto tryagain; + if (inoutopt_inoffset) *inoutopt_inoffset += rc; + if (inoutopt_outoffset) *inoutopt_outoffset += rc; } - if (errno == EWOULDBLOCK) { - assert(inopt_out_inoffset != NULL); /* or caller is nuts */ - } - return -1; } - if (inopt_out_inoffset) *inopt_out_inoffset += got; - if (inopt_out_outoffset) *inopt_out_outoffset += got; - return got; + return i; }