From fcab1c75f412a517a02e89bf0b0790a2c2eae13a Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 23 Jan 2024 09:45:10 -0800 Subject: [PATCH 01/11] Update most of wasi-cli. --- lib/virtual_adapter.debug.wasm | Bin 258561 -> 265048 bytes lib/virtual_adapter.wasm | Bin 226946 -> 232649 bytes src/virt_deny/sockets.rs | 203 +++++---- src/virt_io/sockets.rs | 282 ++++++------ virtual-adapter/src/io.rs | 192 ++++---- virtual-adapter/src/lib.rs | 2 + wit/deps/cli/imports.wit | 2 +- wit/deps/cli/terminal.wit | 18 +- wit/deps/io/poll.wit | 2 +- wit/deps/io/streams.wit | 21 +- wit/deps/sockets/instance-network.wit | 6 +- wit/deps/sockets/ip-name-lookup.wit | 98 ++--- wit/deps/sockets/network.wit | 271 ++++++------ wit/deps/sockets/tcp-create-socket.wit | 45 +- wit/deps/sockets/tcp.wit | 577 ++++++++++++++----------- wit/deps/sockets/udp-create-socket.wit | 45 +- wit/deps/sockets/udp.wit | 473 +++++++++++--------- wit/deps/sockets/world.wit | 2 +- wit/virt.wit | 66 +-- 19 files changed, 1266 insertions(+), 1039 deletions(-) diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index 5daea843d0c5cfad9fa475e669af35d76285a313..dd559ea6f95597bc4eb85de8aa86f1823328000d 100755 GIT binary patch delta 68779 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 delta 62515 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 diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 61cc257e53f16ca9c6859cea2f15a635e248e227..0b1296d11b0eecc677a741d3f958a49c1dfdbcc3 100755 GIT binary patch delta 43018 zcmeFad3+Q_{y*GRHMy_JOcFvul9>?hg!J4q+ygYC+^#nw%+VtWkOUGzSJ!~Lo~weT z)arVGy50wfiZ`h1eL%c#VAmTJZ(UZ`=Uv@1lS$C;?(g+`Uf<`B2Qf3%b$sempZeU@ z-E+q0MbBJbylDWj{4KVbaI3wM&tN5dhCPq}n@lHOz9*-OuO`#^#d)=STulK#oY?vA z3*G!=I)c~QYx(Md1>DZ6&_04cOKtqwypf!Px|&>m zzQ#GPI$17Vp?9_~U8y%k;&Bu^^-d+1f9`ap`wpo;G+jQaesZcTw(kaZU)PVyO#&J& zmPgodK5MWe)rEHr9+NI_99Aao+)DEKNu#WM$1rPZSgn|MAF1M7N0sp}hgwtJ1u3Rw zqNI%$@km22K-bVRF}IBt^O=p-%}a$ znWIM;qYHZ*l`J_vh0)OT+<8qcZC(0`m64^H!$%s!3({@o=+pxFo+Hi4vzub=C$)9S zk*PKT%qqo>61gg)u^-}V+G$zd;`R;@Z&^#1K0mFVdyQ4&$}WC31^X zl_qV!u!6Sj%?1ahG3oh`H1HZ!W-<`a8_x68zC9&U>sQb`e%r|2g=}OX@tlW9F5lN% z%PU5WNliVBFRQ35iATC3C$5MrYwGM;p+}Z+byRu_hw=8J|FJ_2FP&e@SB|Pn8lpBw8h$&fg_vx zp{3A1qf<*5%E#LWlpfHRe>F1ADh^H-IC;U)68_7`UO9AqO3L`$rqOA{Q6YKW+NW2~ zr(_849^FgRN##&aJ2EOtx07Mmquw5C_L5Q9$=-_1t*lI}J%?H|yYW5E)6-KsPr^p+ zT4`*bF~2*ddgd?FyB4>{f0HVsSLiXlWu*@G#)_TEVIzNY7#}y-DHrHV_8gV!*?v;j ziS55a_R+D$dTdEkr`{G`erQEY&HyFlqxh&$+IX-A$cUvPI7B)3ZR|h z8pr;)_z`}etAU+QgJRw!7PKg9>0~i6%shO9*CI}z#0sc#DPQOgvCHVBbOXQ0ozK=& zFL!!;M2PWWHp!y=nKp{e$IyDQdLql>t3BE5aynY9y`Bs8zxur<=!deYJ3h5v**(R#t4x&g_T&8Yp6%eo5Iwrw)R!Z2Cn+XvyC)t zRPhZy8@X2OoWiDBll$+=jd6gT9uWaemm7C?L=|mBcX>5|%FrMaGlv}ALHcw|0_(j27a+~Zh zQK%DW9#wAVdxBHh9drhtIAJ{hGE{6)?xd3?JZ=qSS(Ht5hKL-7?#0)TLcVd#MLDw5BXj{edH87)Mv-lN{DfAvolZo}NdC%%3i2r5J7FSwj84NMtN70on#kY8 zj#DsKGtl_yRrlCltQcrQ_PzOzTP%DhrN`%5FMjvHdS60 zbLL5;Uy)LPK4OQHV((rBWAsd!N?sF1hqE~r<#jp}*W>xNMOOBP(KeocUYbMRC%$}}6j_vA zG>n=d{PRO{#LgpFIaPLJOi0un31L?D@GqxLCx6H1B;nXVa{&F9BjMOBI>ah&ZJ?0Q z_tziACR61DbQ#TGoNg7?^^!S1oW3@c;P5E!=ij_Obs#}&1x*lC&nTSMEIgZ zOUS3_KbhSq>;)G*ZxkdS$9xiqq#l|Nuzo4_zJ@|`<4PyJK zPwW{+NAnYANpmn%8$Hf=5X>)zJI2h z{fqiV&wOy?v9pTEPh!V>7P2Tm)A4-y+(y20mW}-z`-JlP1*}5s_DI?L#cUPZkC&{v znx)#SEXo=-S$399#bVn{G?yx8h(!z7A^g2L6NLI50h^q~4o9CcT&){O{>XRFnM}?W zYffN?QRN)oK6e^B*8n(1_AaE#d6&#Po}JGoVaQniZ$~z{fNz{Pll_U!6k&MlDbvd9 z4zFbwvanHElQctv4~z^hVlksj%B>hI9^FkmRJmA8jIfa@Xrd#+MnJcNZtDiuRHeYp zk9W1NSkM*gXzFZ_ErF=496pR0rfe`Y`*woAxa}Z|B5^L{+)OQ@|JYY7ln@DjLTs<<4rRfpBPqJZv z`l4a9$Y8>vTz&u+gV_~*=a;>$eIkp$954u>&Nd3vuVi!jpuR_El}3nqC+xH29nYo*9?+dL$tX;yOvhL~MP$vG}MT?<{moH^~!v)@bf{kru zvksiYv6sMn+$Z<9@ATEYV?+_VUv6*T1_Zi$iG_D8EMpJI9q!*MBNM7T$a@y{rGao% z&@y;B+_|VCoqKR%qCJ1kFpAw#Srr*irn>sfS31iTs)G zT=YBgXVY0-bd@wJcfpTa_dIRnS4IY~E8zgcu?X<)$=L;ZTi1#fo)Qj`5SqHJWd`V zPm&kdGwfOR9Q&5O!Cql+vbR|NSz9a*AW|wgl&`(6oIBzLaL*g#E6F{V=;ht3@t;yK zP@$6?#GzO}U4zSdMJrMqN=bpD6f_Xh9nK9~toIl#)It2z;-C)2PZbBXq7uVvWG50P z$xc9Pi~<1GGmO^%2?P)5HgXR?Os~%G?FPK8e>8@w60kL#YrTiJ>(0?<_s-Uf63`9+ z7h*l9-)sPrb*`-A@BhBF$iURPU9Q6VD4&1oDu;nxsz%m3iGzl%tqmBn8UVK}=vYN6 zUO5vNAV*fXur>Sw-@aN2Q|l}I)8$9-)hD0Fzd3b?;~6=)q`;vJH}H72@8xrA_>z zqnz8)+h5BlpOI1CmQntx#hu2%*V;RFMMn9~jPhq0+L@yqkL{g`H5w{{aIUY|4D7V^`~dlKbTSeF{A8j?;X1$qkLz( zt0=j5Nv`_5eOCQ{VusbLw~Sjc%0gb}i&r*~xA}!DhvM_@m0t4tmQPj+Vp)xB3g2*T z1s{A$LyjQ^)~ERFQ=B;l_gkOZvhtL6k~@LUW*6yaV%wC29Al6;{$L>SP zCw%hik>o|bY;_&FUbuQx!%h=mzLfFvB=;5!kg&~B4kcWOIc4_>qoad_yIY+Q({N*} zQz=vmcYo&Y!%Xmb3Fl^Iy*40g|o?%+;@?)Vn0-( z;$#l$%qk=W4vVCp^+~?;qTd4}t)OwK6IJ0mzrA(g4G`7fGmS^1X`S~mSa5!vzq{@J2hoeZxF*9{*)SCHa_FZX9mZ9;u#hY(fqe0lHYM z=gCV48&0jxEcsRD$U*JLawDC&jvUD7lN+}J?CIAYPoCWJ_O&4jPAvcHRI-a7_t#dk zjz96&r@>zr-LSUe3rTOtA2=ag*@};yN~?80_ue=R8HVF;oIx((H{IA)wL^BJljOD@ zQE!pt&xbIuF37Zc)0yO5UURd`-@hqH-b3lo0#jrQ9a+|$eEH4Os*G721x`zHreN<( zJvY~q{rtkP7)liO;r;=0>h_?&m!AWYMC+oHxxB=J&~SqWPV9b;5tj@+c? zF*K0%62AYoCXj3R?T3L}owpwgQF`I_BS4e-J4RvR*>`k6`)#{p2sGgbcN~I=o9>)n z@#_=ttM6+T`sEZ%vyFFAPI-L`b8g#U2&09=*a(})Si-7}h;!lFjUhj8x#GSr2rgP5ckr7Z z7yz+<^nqdIXa30pbD*U{4~|c&F^eItDLnx-_NNE^=O;B2o80EqN{bXM z)d6K|8oe+y*jV!A&D+5n#%IAH5}&0H*Ci#)=*e$=w2E(fST6hNhh0Es|HDJc{oMJ; zl$jS8iXyv7DJz02?gThT_HbHh{aEgf^?v#3B!yW8j%=x=b4>QPn))pp`daqRl^;?E zZ+c{2T?Rk^I{+YeY#RZp9=0t3WHxVW1~PlL1(MWY;Re`MC@n)}0pRHEBgmilG218M z^YZP7W8i1oXJf0zKB{5(nnzQsM1TQ3a_gft4Zlh*3yiL*aLkUMJz9<7xsRQV&x;>> z3!klzdw|K+j~`1eIK4YqGZZ+?I*b+YasADY4vYUb4Vc{dx05h%$P=nm`bR(U ztZEX4NSzBiFUf^+Sv^ZCV_f7qF~772(mVK=&wKJTtmVZg&q%S|EV*~{pOU0`?5U+t zD9umD$oHH-Js%2X-_xfIcvbF)Bi~d>_%@UgR^I*0;2OgdE2IUEEX)9ti?3W*Wqc`^ zYuhuvs>hAJRve{%XijX7pAN^@@K)!`u9D4e>7pn33(F+qQlA{eh4hn@yD~Pw7kA1O$yw4ZC7^?nAVpyN+ z$nw+spl75xf-yrs^t$`SJ01TpR&c$P24}hSMY3QZl<*r$tHTC~d7q!TV?L<5Ye%BW z+$^XME9{}v>QcbU>T_T|7Vebh#osAjV5xuii*L$TK~obM-n3`@fqU{NT%$6`$k7mdh#YIaLeCp z$Tze@!C3QhAiwX;k`WmSLk=(4U?KS_3hh*u)RPp6P@vE9cL@t%7immXnH{ z2j#wjqE+uCX<4yl-aA_m#PIohMsfAM8W3UjdvzwAEBIOONl$0~o)NrymsE9ipI2^~ zv&$y?M|Vr_B%|-=yUo6h$+`H|d$Q>RYk1pUj5OEw#-3X8FyFR!Y~E8@l%8&Z*RW;m z-jPLGi;VoGP6Q__xtV?@DU%>lDj2ve&z?# zf4S;|>&ZoY@`qzeFEVHY1y&}tCc->^;fIweEFb!?I9ben)+A0Jl&e2VqRdbF2zJk0 z$8{ey!%f<@cR2soM*zgjJ`Tg4AN6r9I=G5R<**(DlIghYvQW}ZPER^s+cS4u(vv^` z@f`91AN0v85cSee7UT10<1_K8EbsXAcPXttU2;{^-VsLXj4$0=lR{_1UUTJ#rz(bj z<{D*2Ov5mfu@Js#UpBdy zZ{3Hv_^bPV#PAot?8d;^U&Ziwm+@Kg^&*s4eZ3I;@cP${b*AWijzq$*vN^B+<~Rf% zfB41;ANQJXnlX0AH~s-n8^K{Y_FdY^w71L$eLJeqggC}X1MJ49e9HGT3XNJLw6wm&ulRmGxtM?d z{Sss>qCX75=ea*j9Ql$dLgpJ9s`#AZV&B{A5~fBErf^gsHa%iTsyTn|%#s1l5hm{I;6TAhrn zP=_3e)Pq!p570q-`2K%N*{s~(1cf|pe-lGHU-Yjk5MbT@TKJxu_Djw7ul?Q0nsd`N zi}|ddB)MMvImkEuv;_H{qMzp=+*|N-hf#Z7M$M6y36jgIf2kR0aIcYt4MQ(Wzh$q< z)qLJBP#%26FV~Z|FB?FvBkL}Ekeo^05fcf4rz?&jU5F z@B;E40thM1wd7tg7aT`+iRDFP5LvhNq9TILGL+iD^(90{5mm2>u~u@HSzRt(wGw~H zgAxNL#XOQV?-Ny}WLa{Y*jP&9sdAmo03vO)xWY!fnCO#6r#&7YxACOm&?{mYaPqF#B$(AVD#+Dh-KR|0I5PlWMWPiX3l_NkPBx zw?O;*lJTgDxJe!1y%Y6a%%#7D+GW2rV*PK85WOQTX`7JqXSo~Jd&R|r zBomp~T;AJL46Grx{3~Q9ne;RL(ZBS)yfS^6WJQDT$W`kdKO*BH7>1J!re2G9symGN1e!T zBD$mw5W5jyun5D!05A;(^XAe?3@{zJe%h@%awNwxM|LZ~6t*@K#hHg4w6r?&jqR7Q zCw2joD&bPYe1MIR6+)e}5Tz2MRD@EoQ7XnnC5}9&RmQh@;nn|U%fq=Vow7rN!9ArY z)f@BJ97;EGqH;<*Dr=2W8A^kUQaMUhMyUd&N~1IYr3#}|iBg$S8iRX94pSHTzsOLG*C zQLtD?(HI4*cNC9NkREne$CBc1e3y(RAfzMDk3^N?s5az7ULjDCM@&+_hqq$$B#y`> zICG5@G%_dQ;Y+P%+LxkHX_8Z-gx*q66~(U%kUZ7s#G;XtuFnm_(62suT9NDo9?Na5 z@0MVd0e%HtWT!H};*{AkQ>)3T%_DIK#L!`~%pfQaoS9V1?hfS7ERse0q~6+U*or)mKgW^pROAL2vTrpv zAq(f5=xz`^$wP+}K|y0-#^I;TV;QS(nwkX&ViT}EAdh)CVS1XmlAW>s)QKr}vD;*v zd`ETiJU5J7CM-bG7-T2yLZNh7rM`j~CwC4aBhOi&SDMLCXR-Whfbiq1-U&HuCJrZL zt(nw1p&y#bASa{}j;j+I1a`y;l>%;ec0pZ)5?R8L59C{xYFiyuW(iDHYL=?H zTcyH~&Bzr(gUC`vt5hkn1U`h0ktH0Om7Ac!r3Gdk+<$pTirku9sAh*v-kxG~wVS09 zbcOCUFN$$tmH+{IOm@v}^+;|3-nogLE76ZzFjh6(pp}W>CobM4hl|O`6d@5t3;grCi7jplPE>C0A#qjAB+Fqliq8UncM!)K8^n1O;dsMFu4%S*#53 zasZA<+YAvimm*iE6;TYxgS1sj+)HB`>3j?X7vZR25Jb!3ECfs_ zLYW$u=gf18VAzocFz-tO_rP(?aul?Jo0+L0vmhhg;A-Z`mm1Q5SAr`!wW%m`l8O@c zPAW>)t9{bNq@t7=hWhN3hLFyKsVJ=|nToO$B~ww_99dFP+M%`bx|5m`HPDpc7YD>q zvJDu>ZYo7EsLd=%o;FL60wYtHC&gUy5)@?)Ccu?Ef0w>zT2ZEp!=>NpfM8`wMJef4 zpW6+Z^lHi?M^>hyWNAf-Eh&;)CilF=RC6U(Q_U4g%A!5jQRvJ|X*EM)OB}h9YS>i^ zW|qg&(7Sg^mXrbZa3>U*qgz6A6qy+lDP!=qq1aehZH4T^!2#13IbcMy9C=9+SnF2Nh6ri#J$hg%?N*hWL=R!F$8%`74A1RGlVH>hPrekGx>bA=Y!{;(9K<#Yw zf-IWXE-4#0^cPxqG+L+8~Xq5;lw~@@B@ynrbu2<1oc3w+zRVUr0&_QdP^HksfcJ(P$)OBqqI{axuCX6oLJL4l{`5EJx8GBMeto(tRF)lIcBHqGWo{ z15q-)=PHy;@3|T!(|aC-lCk^Fnxv;(>!@?)nP`<8bk8@s$Q_WV+FQG2QKDqY`unOgu)Ni?x)`g}nf`&+W*r>F^!Nylvrh}d3D3cC$mh`2E;tO`J0bekD z_4tA%bl?l7vAY)Eu$w^LQ7t{}EXN?}VP`pNq`RBt$d?{Al&AEtv!rVcW#*`r9yY`h z9yY!V2RqAADBXuFGekA6q%)Uvu(5wQ(F2ZY2OE|zZLD%OnZ`<#`p8i7gb4abJ^5J7 z_mQjdOv`>BnNPkGNBN19JhAm;Ke>;P9^nd-Dtyfhk~@>f4XGPxtbY>)A+nA|f$d4!xHewu{T-m9WIOs3%`A`uId$K?00$v9%3by{V?M-sB;gx;}i z-GYZ`2zh$zn5pDQGRnAJ%t<9*!H&XZV^;GfENDzxq!>;`fpMe9ds`pSNLwEHP>h&E z{(!F==a2?`JwJymz}LvR2<$%;)8~@k6?`bCL%g9_Kiqo5TykSE*}Zl4LUM05c~4{| z$TQ^cTX!VLI9Bp^gI2gf224q;?}@5bq86C977;|qySEmvDWK7;K4-yil zBz)r53)hif>eILQ^SenSBa}^w%$z~$Zsrv2v2HO-9$>pP)6k=80r2@$(B_P zi;|j-DY>%7X;JcxC&2JvNnB@2zS#B4K38DcH&jN0Rn6#Rf6b|lf?UwUY z49t9B35=e`roIW=G0z2T938Ybk&q$8$eH8*3 zCGoB@UU5*HewK+eV(L>er*5(+>1Up*%qNz}=zjB_0wMrG6WG9Hr)EI(Ey`itoadBn~5!r%L&sAin*?*KqR494iHIeADP6y zi*+B9zCtM;`IywJ5S3CxT4?1!(6Y)Wn?l7~>E-J|)BL&h);RQX_YILOE@;)f@YpF<`JL z*-l2KU!Q6)n%bhBL)sITAq!Gjj z8Z|k%Nf`{O{2yMF&~3bNBjaHs2v|o+iULh}DfBv6{-0uwJ zU1IZ7I0H$^$Z*l~85u9)k3u7l5Odsgm6-iC^yA2_Lmwl5Vo)Tot4E1bkEe~KajWB2 z`eT6@{Ss*+P2%{M$WqH_GC50{vjJk#b5KKf97BhSQ(h*c#jKY>CsjCJmOYQfXqRw3 zj~>??OPg^tyyI9rf4}1uk}J0Ul?23wS4gv%^eP!AwjW1*#3#b9k`9ZXOfHcEY!_EA zpl6HOuMv+WKqjAV*w3x7pY6F~*e)^*r+;KKxl-)iMckIq|BltS7*;>6YsQet2hI9H zv!3CV95m}G+wy;B)}bA?m*RvprLo2ywCcU?`a!F1KCOMws=MG8rDbHC1 z1j;PS2yn^d;WDVr-5R-(p2aMA(g^@=h7)kVn7ot@tISHr%NRy7;_I^$RL0lcOX)Nx zy!dptWLVAmgw>+dM$5AE?Bf7G!7gf+jGjne^$_P5ugF$EJS?0V{%l_QQgxnHkxam{&js`%n$Iy!CME4KE0PyS5B!>7`Qbi_O0|GS8{@?gY! z@b;;Lw@)SP%Ky9PtOE~5ya!G1LDTyirdLM1Y13PkX?jPBW6q^bX>(aE7Q%WSXnUuM zn)5QO>YxL=8OC=-+QinR&ve!E>62Btcbnn$9C5Lqc8S?;x?!vB2KuEveXyJN09}^8 z_`?I#kvioaAm%(yhly|T+dKaoN4;vw6)A<2LDNUF(l6;fxlP^DV0bG%|0HGRUDDIW z+73L$#ldds{^jJ&(Ix$Fj+Ty)J>yKb?BJR1!86^1XS&Hdq|?f&Tr7Hwjwhycn1Mls z5g4Sk4jg;q)Ys4%Q_P+Rk9!Xu_Z~d%?M--BinpHXCq)B)C2+11^P+UT`0Qys;!rI% zETX59L1NA#iYKk)P1a{r*24H@<;QjT^LQQjy&*CgcSTWBC$71U#PQ2c6R*e5K%Dj* z%@rp-gxjHT!}U1v+H?5jxLcmX{ndlbd#z_4g>r+u*IFY(#I~d8A$ag%+w-)F3=?(7 z;U}N0FW?4j{J_==v>JDO|NA&RiG+Kuv&1_`Q#EfSnQYwFVKfBAtYfG;Zxo*5>FgvO zjbxId;E9pKF1@p>3BMPHM_N|O$3=*xBht0FQ|YuQ#YS7A1;6$Q8Htl-j3J7AAW4qF z@7lGr6Lss^FXAno*4JOA#*EB?s4lLZ!DAu#r+AtMy{44hKS$4L|g1ZUoeq~#QZU@9(21^pGNO8;Z^p~)pnOZ z?uz@>xH}Y#sX?EvvA@dJ(c-k7^hA5y>kEZ~ac?x{Pk0k*RI?<E(O$W>6jTUXYX+fR!iB=m^e6Z3gpUM=_6$TG_o ziFl*FXu|FB#Y3@BJfP)?9UlW|%Scu$x?iI{dngf$suE5js=9-|h?c)d?0Jh06uV!e zetRtL_WNR9S0Enp1${oRR|SinHFJm8Egj=l5eL zgI-nld3;()Mu#uQvpn&|8?@LS_rwCexatXoqIyL2yEJP&1HEZ)(n0o+->>U2pYDyg z;vNt}D{aZ>a@(8KX_t7rqV9lOj|F0ZfLpU2CzgMM2Nb@Xz{*ASTbRfX`uP&7*Aw@t zE^oxG*{8|n3=+qHR90^+;0pP?370qI392z&ta*#hvU%NJ-G{$GM0F*CFV8i&qQ*m7#nBSCQR2k6X|+8T2}MF47ygU8q6x1{8!$_@ z)`+{_rghe6D4+-Ysyh--xZQz(SL}J4PPXeFzZz6^PsEe(2Ha7XHgK*v=6CPVdO(at zV{zT9>pqv?7xZgYn@r}v$d;^KGd9BVKT4f#D_X;&Z=@kN5-i+AZ!_MqPtMCXXhpNIzB37=N0OF(XM z-g|U#i5vXp_XdM;EG?i$#e?tBGp*i$KN5*WB0%5m(i46$dlwaUmk;ZRcp!3qw;yP0 z&ZH08E+z@s(LV_ zyVXEE5)u>l&|~chuRrGUcw7;`3zSr2TEoL8O(4`4K$$>TJ#Lpf81m?WfL|MOdyrvNFW~f>#8>v#}v9~{s%qA9`nXx z370Dtf*3^H*xBK$(ok*UiGR?s)}Zc7fN`-KesH8aDy;9*c~&S9Z#)j(b?U<7W(R|pJqiY0^bsu*$9_P^+2USTDDDbHL(wQi zCK%Nk#pn+~sbwG0e6a^TO4L{g?BmAXgP;8Y(fA=e+8}m+ih<%&YO|}pKqv&@ka~|t*S(s*w@Z~hp$0u6zblY%`C&~GF)h&Bnkzzk zsm+#<8y5(M{E(VRJnGScV)I_wB+lPU%dG*QBumH#?Fy>;J>t&2bgDh#aYOWcQC~=f zb_|5HF~3Wrl_OlA(E;{QAfbB#A+Os91l^ISHg;Y{m$N^k<#re#U%(%emP!xl!GJdI zc-dvBxZ-na74LsWD@y$lJrMP}A%Kx+Ag*iUh3g;CO?98q0-=6RUDi+lyX_CTgRz*; z7tj-8`R8=D)#Y*dA$H(07nGik-}U?)Z0VI+L3M{BdN2|7`usxu0?Hu@0gb@|gF9RS zaEQ1VwKhHGSAD){JfXUw`gB#BEVbfLQTruO8@dk$JmS_vQCARJGZgfpk2d8NQz8wM z|NDJ(sa=K92?b!wiBL1!1X&84{N{`nU zR1;uCZPu^(0aI#v7mZniF*ig8K8_v&Z_K_qgSv32W{U|wLjuP3B^ZKM1&^jlQ1k;G z0awfC@nVlbB)`|42x*5OBe!sfX#0WITXiTmKTN8WZ`G%(V#5z~rY#hYBw`VNC!F;~JJ33^oNibl0#rIUDW1`uz=mxu@5QK-FOK#%*i?Q7`z0$0@%t3G{^B2FROQw}>Tc`-G#hPDKooAjv*#fyv$w82jbU>6gx zYmtagO=wF^zqvVw4HS(QHpm`VRd{W#Xb^TrjRw5hvSTC=x46*4%I#_dt_1u%n9~IQ z`LwpBX6r{5Ho}S!!3!N2O!z%u@5ve*opE9j2LRae9v*ZmQM2pv(eJO@AdyeW&- zS|O@B^pY35?hXdL5%FFYn{AKA5-@)7relbFLXo((Vv#v!MK-G`2|@UwIAQ+WSWZG* zoy~Nc-xY;t>r(yT9#3~`JpnzaM&Nyi z{1I*Cdg)%cTwcS!Xf8k)L37!0cEk?|Q{3(tqz+zdOj{Kf%PW~vtj%R^yFVWBx;(1i zx>^9tycr>7$y1Z|f3SrM?1FgUz2t6EwwSn)TM@2yaTW(ha zu$E9%sEI)oBHAD3%hC0C+kyOz`)@!DP)Lef*u6FFy3)D z^ctevHAJj?7jA{4oK=W%MXbgaiA(p}6~M;F!4(PZ47@2B%yM-R8&no^dm^waFoywP z>Gx=7lA}yCzbs;d%i?M*4ucR1K>(tOXhb`U++^;=p~Y-fNfZus6!PKm1t5UB*ip>p zS$%MJ^=Lr#Ai{vp1J|U49d3t18IK3`h#rG06@}|~P6ndQE_X}k!lf;pU3yzf+lel9 zRZG{xmSr97E4tt`xRFwDsa^;X_&uOTv~x44@Kgz_DT{mHoj`vnhQT?_vskcb-*4jjcqz^lfBFsgqddM~;mx0(T=CB9T& z*wwO3?}vyQLhzh`MhrpL!93c9q@@?ec(=D7Ccgy--UW1UtdU37nLewl0&P;>9wS?fwrS+%DL0j|%?-Ry^(rXqOOE z+d+^9i1Bt-iLev-shAq`!I@Aau7Ji3L86_y7;9%$W$p;P=a5TB01jjlaqZGfQi{v% z5GW+U&=P`UslwZbb-%1Xv4-2A*`TKb5m(3!hsc%C*7uS^EGc77L_$bY1Ot(n?nQJE z*F^v24zVLx2?hMoIP`ryjue>o=ic=++aRt;Js^<)(MGn(qg^f{H$V$cZZ= z%Y>D(an*1gLWwwZPh3YzE)>zO{FR||PUWCQNmtAA3w&sz3^U36XOaw>A z-P+gZNduHOa+5s6u=(hz%?QDHds34FbRqEVKUNfFv$`@bvH&VHC7g6<3%{=2VXECBn%muf3(eVF zYHYC{Te498E_FYSOGJH86!1Wh(?BxIrQIpFVOZ5~f%0~WJ$tF$hO7#d2;$;EEEYtt zy{Rwe{qZm`AL>Hj1wRI1hF3+NGNElIr3)9XigYeph}VoQT^Pf$M(16ksfL|tgIn&2 zf-^jrA_#%dwur}SSk$VksweLDCXiYP_@M5^t~xf_29dzZ!1Gc_Vb`>KL{}|XMGwIt zM)C}43*>9`h<2~oQ^y(+6Up46jF#dquMR!B)vR}`$UvxI4rG9WK4kLmGwZzw{zCx- zcmc32qAcxxv)&hkcL5I+f`+g*sA~@->#;<5OOY5d0m#@!wFk}mAUG%iKgAdFz*&JX zJ!IC$RInMiUiBb*(L`z#s=VIyL zATtk&AlsqqZscFI$3$o_n*~C-WAOi^>juvWgnHaS05TXu`c1`w32G60YJZdcCpua@ z?uJ8-Xz(PKNw-Olhg8th6@jEjbY!ibFh?VYfD;*+%YjCQw%4AN^`TO?Oi&}!9@E_c zr0=z-#DaR}w}I8vh!5L@_zS7{xc0PI*?`@J+4si~SSAt(3=`3~_Kdi_fjMnP${HR{ z6doheR&MQCvAcndvcZi;x*I8Q#Ne?+#IHSP)(3n@Fhrx^8~F3EiQ4nxxFP6|%((|S zYsB<%FLolLy&x_c%GTH-(U1y%){h_~fRe7gD25GXM}jEG0U!=fAcZCqO4<(L9LCPJ zC6G{#Ba4JcCLs?lw4LJqVeI$@KXe!@Y{DZ6ES<0(vR9fkZ>)WV?&;`S;Z{`<8qO}a z_16RqQ^Xw}Rxt>qmgEMhp$Cy*M_3Yo8}30c@scPW0dpGj;IKu7$OVG|KU9?VvS=BB z_zmv7%ZtbksVEl~64YK1PmW;6+Fa2nGV38XqGb5>-iY?9aE)Zg+hTA8yvX;(VCGbB zG^D*ItfSb%dT>kkJP$<0M}^wE#bO2}w|# zvO&8^QGG+K8O4w{i69J1=WGifOzYC$iJZM59F9Jm0THnOnrGBXE zIAR5`Gjf(L?QPV$Z1I>I${QyO5o`cbliE8*HPj0-A0b3Aa6El_PpBUU~qz+@MwuelS!v>3AnpsJi%L5@+^|%`>0w*%2{XMhU2Jag9 z_yY2b2`L`G_K&R&mF1Fh9Cn6O2sXkZZxDN?y-%*760TF6;9?(_B_Lx+)JNTM#KK<0 z=pT@|X7j0TR%?S~C!%oRWBwqt0#afhid)_AX%JJyeF=8}hfh(LJTdqPcUu`y_q$oW zEd<{Tx*2&|qyllUqJ1nzdsw|S7>grQpu3=Q!OC%6O!G2V8FnE2eu9+9M+pfqNRk(P9kAXb;}-3VB3$2v;nq zdSWu|9MQGU#Z`Vb-sXnh2i@TuL(<$nm-dC2?PDWwP7%{pFb7~G?+kZppHXiGry`l* zfI^4aq#aw!JxRp&nDS$asihX zTjIvipfBjrzA-0^hvEn>kxoLU$%n*+_N{@S(;G*=7{^>#DGY5qsC`EY7cN|JQfC(; zJ-pBFdvhH~UIuV1j662ZPUASl{y|I+u)#J&Xg+yv3PtL5sfnoeV{+X%NcDLTQ3pLP zI1*9qpGJLI6kWXmnRbZcAOqphelk{Ue3h1o)j?KK1~!EpMbxMZr&ummRQng1VK#S+ zfuz0?WLBFSc?Q2ndIpHxkv`OZ65j_AJRn&CKMI@yR>X0Gs{KqRr^l98c{^Kv4?VpY zC*lDWnhh}>6m%q_{abW|n7=FrM?8oFPOovIs(Z9w$nVmJV6}CD&aMbZB2955R%=a0p9WhT{E0)-c*F;%I*vf+ z3~|F4WYln+g(N(V2q3447|g?&R9rroEh@tn=}-j7_TbbA%%Gixb46p$AIHGlNE!3! zE*y{egKivRYkw5YW0|iSX*C=c;hY)XKC)sl?QD9h5t+EeOsK4WkW%bL* zaNaSN>1FV4!I6lH;K{;oNNDF!E*=@jPOb9FTO&XKWR`GD54*uAwcj2ad@O%gcF6-Y5IV&5VDF$rAc=c>w(~2jH6N`%Nm%7eT2gWLj-n;`=dyY zM76avDCSLKLHvZzx{1U3`meAG)^@!*T?Ea z?IgrNSQVTJ__sLs_TnH{yA*fGObjy*-{7@~(E#Bbg22~HG?uELM7ZQ*mq z9FCvllogvMQVY9>PL&gcElrWGd$~Gx2HQ%fN;vsTTiTYO@;>uYbkCwW?0!1kfXio( z%Oek%=v;jm%VQ7HLkv6%Pg#~6_YhE%3!QTMcIJ7jV?eB z4?k_fNV1)epU}b{r4vyzlD{&coIJ+&PMDDUIGqni#jlE;O`zuSvsh&r(omsL94CX` z7~BUW!v996fe2On=LwB?zxa+>%*~zz>-NlIBl+4%1$_6!EW9s#;%qjKJx#|N_2Q=4 ztdu>Iyh5*1_ACvghUDc$+vBG^M?ecR-0 z_HyzW%^tE_NjB&+aL?t#oXIS9(jka)h3GVoaT^sQJf|=9>H)2*%53I+XcSqnbOFw zJ~U5!`8FwHyJ;8|L-^;1?2!87M%W0E@V*{YQzy2sT zj4wLGDsF9{1>^%B{uW#P!aL zSo9ZDR-Hlh}uN4y`Y-9?S=!mcpY#sCQb%SdLrh3kgBgwF!_YLTmaP{cA^pKtp z@e_obwvs%?*%Uc0)ndE|TfT-oC)&~$zm#d2jlvj)SDP2I%dqNS8CJ~Jv#FU4<`B%3 zCDz_YvYF@$F+H7p>v=Z$GgpsHBWbib-p8QJe`U~|_aSCi9DqeV`%7O0B$SfO*PdT_ zz?d?D_nsHCtJs`AnD5b9r8vEW+S%3Yu*?<{F}$d}AoV))YuN0}4gy2#(~TS0%*@90 z=%U`&oNr`vGrJh$Gn%huGcudg5b*eX@|@th197kKZM~jN|JCt%=6lTl+804%_GHry zEZl!&VfxkOH}>5YIj*v|^`--mt`HY~C@uDZxK@fUtf2EPeesmM)4*;$5W7n8-h;%- zZtIJj$!e3bAjG%x?fsd3?n8Lh_Z@umadrJf1c~M*GwFOMSLfFa>nlJl$wYfo>J8P& z7h!LbeMj`|3*X4dtoQG`8A@hdV_L+_mwPYjr1|hF03{`QMm^s&s(@{Qv(kS+o|#C$ zThhEgtbL#0rvUEZ+xx<*5NnsPLj25izxp!q?=GwpH~*oz-| zxLNa*XpL6`M|KoAn&2{-o~JM}JgGbYqRb z|H$9sk&IWPKPI(JV@>LTvBCetYt@Y$`)HZ&e*8Bu{muE(nEs7TGh>O{+YmG3MiXBg zsXd% zDW_+|%k6CZKpi=7++d0c5QxW-+jy2O003W5y0eX9LKjYFDmz)x!2hSJvsq~vh{7mx z)w*aAs#`(Cf(XU5sY$wU8GHrNMM;{eicM{kR&eEG41x_;#XH*>GId=uCn6?+ZFVDB$wG;VX&q##q76(}uuVIbxe2sn91oyv z;+Q0S)w_->Db|fYczDyaMVG*H9KvzDKjTMDrl z4n}eTs~l>}Y8KK8UgjexJ3x(+;oj)54XCaWTNioXKm+J_V7fhh*p}QL0=*4<4hS_! z5m?+?N%u?5L6LVSqhY_=yO*(`{yTh-;aa5Bql^aiWbh=Z!R%+r1e-Bcs;X2sI*qLt zVS@{D^oCcjgo>*-*Bh^r=^s@9ELfn9e3KE+M}Bx`0}4Od`rwW#tcK0c-$8TtOH!N( gw|CUHjyvK{q5=_un#!6kLfi62Azv``S4Z}L0Fo#9i2wiq delta 37053 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 I*RY%a4=c%vfdBvi diff --git a/src/virt_deny/sockets.rs b/src/virt_deny/sockets.rs index 87053ea..bd4e83f 100644 --- a/src/virt_deny/sockets.rs +++ b/src/virt_deny/sockets.rs @@ -15,49 +15,42 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes WASI_SOCKETS_FNS.get_or_init(|| { Vec::from([ ( - "wasi:sockets/network@0.2.0-rc-2023-10-18#drop-network", + "wasi:sockets/network@0.2.0-rc-2024-01-16#drop-network", vec![ValType::I32], vec![], ), ( - "wasi:sockets/instance-network@0.2.0-rc-2023-10-18#instance-network", + "wasi:sockets/instance-network@0.2.0-rc-2024-01-16#instance-network", vec![], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#resolve-addresses", - vec![ - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ], + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-addresses", + vec![ValType::I32, ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#resolve-next-address", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-next-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#drop-resolve-address-stream", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#drop-resolve-address-stream", vec![ValType::I32], vec![], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#subscribe", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp-create-socket@0.2.0-rc-2023-10-18#create-tcp-socket", + "wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16#create-tcp-socket", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#start-bind", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-bind", vec![ ValType::I32, ValType::I32, @@ -77,12 +70,12 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#finish-bind", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-bind", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#start-connect", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-connect", vec![ ValType::I32, ValType::I32, @@ -102,127 +95,142 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#finish-connect", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-connect", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#start-listen", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-listen", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#finish-listen", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-listen", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#accept", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#accept", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#local-address", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#local-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#remote-address", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#remote-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#address-family", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.is-listening", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#ipv6-only", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#address-family", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-ipv6-only", - vec![ValType::I32, ValType::I32], + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-listen-backlog-size", + vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-listen-backlog-size", - vec![ValType::I32, ValType::I64], + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-enabled", + vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#keep-alive", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-enabled", + vec![ValType::I32, ValType::I32], vec![ValType::I32], + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-idle-time", + vec![ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-keep-alive", - vec![ValType::I32, ValType::I32], + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-idle-time", + vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#no-delay", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-interval", + vec![ValType::I32], // fixme vec![ValType::I32], + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-interval", + vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-no-delay", - vec![ValType::I32, ValType::I32], + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-count", + vec![ValType::I32], // fixme + vec![ValType::I32], + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-count", + vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#unicast-hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#hop-limit", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-unicast-hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-hop-limit", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#receive-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#receive-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-receive-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-receive-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#send-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#send-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#set-send-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-send-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#subscribe", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#shutdown", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#shutdown", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#drop-tcp-socket", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#drop-tcp-socket", vec![ValType::I32], vec![], ), ( - "wasi:sockets/udp-create-socket@0.2.0-rc-2023-10-18#create-udp-socket", + "wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16#create-udp-socket", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#start-bind", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#start-bind", vec![ ValType::I32, ValType::I32, @@ -242,107 +250,118 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#finish-bind", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#finish-bind", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#start-connect", - vec![ - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#local-address", + vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#finish-connect", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#remote-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#receive", - vec![ValType::I32, ValType::I64], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#address-family", + vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#send", - vec![ValType::I32, ValType::I32, ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#unicast-hop-limit", + vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#local-address", - vec![ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-unicast-hop-limit", + vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#remote-address", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#receive-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#address-family", - vec![ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-receive-buffer-size", + vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#ipv6-only", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#send-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#set-ipv6-only", - vec![ValType::I32, ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-send-buffer-size", + vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#unicast-hop-limit", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#set-unicast-hop-limit", - vec![ValType::I32, ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#drop-udp-socket", vec![ValType::I32], + vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#receive-buffer-size", - vec![ValType::I32], - vec![ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.stream", + vec![ + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ], + vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#set-receive-buffer-size", - vec![ValType::I32, ValType::I64], - vec![ValType::I32], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.receive", + vec![ValType::I32, ValType::I64, ValType::I32], + vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#send-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#set-send-buffer-size", - vec![ValType::I32, ValType::I64], + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[resource-drop]incoming-datagram-stream", vec![ValType::I32], + vec![], + ), + ( + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.check-send", + vec![ValType::I32, ValType::I32], + vec![], + ), + ( + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.send", + vec![ValType::I32, ValType::I32, ValType::I32, ValType::I32], + vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#subscribe", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18#drop-udp-socket", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[resource-drop]outgoing-datagram-stream", vec![ValType::I32], vec![], ), diff --git a/src/virt_io/sockets.rs b/src/virt_io/sockets.rs index 55c5372..4a56cdb 100644 --- a/src/virt_io/sockets.rs +++ b/src/virt_io/sockets.rs @@ -4,250 +4,275 @@ use walrus::Module; use super::StubRequirement; /// Imports exposed by WASI for sockets functionality which are allowed to be missing -const WASI_SOCKETS_IMPORTS: [(&str, &str, &StubRequirement); 49] = [ +const WASI_SOCKETS_IMPORTS: [(&str, &str, &StubRequirement); 54] = [ ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", "resolve-addresses", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", "[method]resolve-address-stream.resolve-next-address", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", "[resource-drop]resolve-address-stream", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", "[method]resolve-address-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.start-bind", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.finish-bind", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.start-connect", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.finish-connect", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.start-listen", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.finish-listen", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.accept", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.local-address", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.remote-address", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.is-listening", + &StubRequirement::Required, + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.address-family", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.ipv6-only", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-listen-backlog-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.set-ipv6-only", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.keep-alive-enabled", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.set-listen-backlog-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-keep-alive-enabled", + &StubRequirement::Required, + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.keep-alive-idle-time", + &StubRequirement::Required, + ), + ( + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-keep-alive-idle-time", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.keep-alive", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.keep-alive-interval", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.set-keep-alive", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-keep-alive-interval", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.no-delay", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.keep-alive-count", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.set-no-delay", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-keep-alive-count", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.unicast-hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", - "[method]tcp-socket.set-unicast-hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "[method]tcp-socket.set-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.set-receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.set-send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[method]tcp-socket.shutdown", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2023-10-18", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16", "[resource-drop]tcp-socket", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", "[method]udp-socket.start-bind", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", "[method]udp-socket.finish-bind", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.start-connect", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.local-address", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.finish-connect", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.remote-address", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.receive", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.address-family", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.send", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.unicast-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.local-address", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.set-unicast-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.remote-address", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.address-family", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.set-receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.ipv6-only", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.set-ipv6-only", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.set-send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.unicast-hop-limit", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.set-unicast-hop-limit", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]udp-socket.stream", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.receive-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[resource-drop]udp-socket", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.set-receive-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]incoming-datagram-stream.receive", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.send-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]incoming-datagram-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.set-send-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[resource-drop]incoming-datagram-stream", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[method]udp-socket.subscribe", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]outgoing-datagram-stream.check-send", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2023-10-18", - "[resource-drop]udp-socket", + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]outgoing-datagram-stream.send", + &StubRequirement::Required, + ), + ( + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[method]outgoing-datagram-stream.subscribe", + &StubRequirement::Required, + ), + ( + "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "[resource-drop]outgoing-datagram-stream", &StubRequirement::Required, ), ]; @@ -281,56 +306,61 @@ pub(crate) fn stub_sockets_virt(module: &mut Module) -> Result<()> { } /// Exported functions related to sockets -const WASI_SOCKETS_EXPORTS: [&str; 49] = [ - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#resolve-addresses", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#[method]resolve-address-stream.resolve-next-address", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#[dtor]resolve-address-stream", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18#[method]resolve-address-stream.subscribe", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.start-bind", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.finish-bind", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.start-connect", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.finish-connect", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.start-listen", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.finish-listen", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.accept", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.local-address", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.remote-address", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.address-family", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.ipv6-only", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-ipv6-only", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-listen-backlog-size", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.keep-alive", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-keep-alive", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.no-delay", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-no-delay", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.unicast-hop-limit", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-unicast-hop-limit", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.receive-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-receive-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.send-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.set-send-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.subscribe", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[method]tcp-socket.shutdown", - "wasi:sockets/tcp@0.2.0-rc-2023-10-18#[dtor]tcp-socket", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.start-bind", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.finish-bind", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.start-connect", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.finish-connect", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.receive", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.send", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.local-address", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.remote-address", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.address-family", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.ipv6-only", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.set-ipv6-only", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.unicast-hop-limit", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.set-unicast-hop-limit", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.receive-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.set-receive-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.send-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.set-send-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[method]udp-socket.subscribe", - "wasi:sockets/udp@0.2.0-rc-2023-10-18#[dtor]udp-socket", +const WASI_SOCKETS_EXPORTS: [&str; 54] = [ + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-addresses", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[method]resolve-address-stream.resolve-next-address", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[dtor]resolve-address-stream", + "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[method]resolve-address-stream.subscribe", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-bind", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-bind", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-connect", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-connect", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-listen", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-listen", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.accept", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.local-address", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.remote-address", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.is-listening", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.address-family", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-listen-backlog-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-enabled", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-enabled", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-interval", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-interval", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-count", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-count", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-hop-limit", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.receive-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-receive-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.send-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-send-buffer-size", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.subscribe", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.shutdown", + "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[dtor]tcp-socket", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.start-bind", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.finish-bind", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.local-address", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.remote-address", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.address-family", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.unicast-hop-limit", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-unicast-hop-limit", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.receive-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-receive-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.send-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-send-buffer-size", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.subscribe", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.stream", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]udp-socket", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.receive", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]incoming-datagram-stream", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.check-send", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.send", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]outgoing-datagram-stream", ]; /// Strip exported WASI functions that implement sockets access diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 540b3cd..9672eb1 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -28,13 +28,16 @@ use crate::exports::wasi::io::streams::{ StreamError, }; use crate::exports::wasi::sockets::ip_name_lookup::{ - Guest as IpNameLookup, GuestResolveAddressStream, IpAddress, IpAddressFamily, Network, - ResolveAddressStream, + Guest as IpNameLookup, GuestResolveAddressStream, IpAddress, Network, ResolveAddressStream, }; use crate::exports::wasi::sockets::tcp::{ - ErrorCode as NetworkErrorCode, GuestTcpSocket, IpSocketAddress, ShutdownType, TcpSocket, + Duration, ErrorCode as NetworkErrorCode, GuestTcpSocket, IpSocketAddress, ShutdownType, + TcpSocket, +}; +use crate::exports::wasi::sockets::udp::{ + GuestIncomingDatagramStream, GuestOutgoingDatagramStream, GuestUdpSocket, IncomingDatagram, + OutgoingDatagram, UdpSocket, }; -use crate::exports::wasi::sockets::udp::{Datagram, GuestUdpSocket, UdpSocket}; use crate::wasi::cli::stderr; use crate::wasi::cli::stdin; @@ -42,6 +45,7 @@ use crate::wasi::cli::stdout; use crate::wasi::filesystem::preopens; use crate::wasi::filesystem::types as filesystem_types; use crate::wasi::io::streams; +use crate::wasi::sockets::network::IpAddressFamily; // these are all the subsystems which touch streams + poll use crate::wasi::clocks::monotonic_clock; @@ -422,6 +426,8 @@ pub struct HttpResponseOutparam(http_types::ResponseOutparam); pub struct SocketsResolveAddressStream(ip_name_lookup::ResolveAddressStream); pub struct SocketsTcpSocket(tcp::TcpSocket); pub struct SocketsUdpSocket(udp::UdpSocket); +pub struct SocketsIncomingDatagramStream(udp::IncomingDatagramStream); +pub struct SocketsOutgoingDatagramStream(udp::OutgoingDatagramStream); pub struct IoState { initialized: bool, @@ -684,12 +690,10 @@ impl IpNameLookup for VirtAdapter { fn resolve_addresses( network: &Network, name: String, - address_family: Option, - include_unavailable: bool, ) -> Result, NetworkErrorCode> { debug!("CALL wasi:sockets/ip-name-lookup#resolve-addresses"); Ok(Resource::new(SocketsResolveAddressStream( - ip_name_lookup::resolve_addresses(network, &name, address_family, include_unavailable)?, + ip_name_lookup::resolve_addresses(network, &name)?, ))) } } @@ -1453,45 +1457,57 @@ impl GuestTcpSocket for TcpSocket { debug!("CALL wasi:sockets/tcp#tcp-socket.remote-address"); self.0.remote_address() } + fn is_listening(&self) -> bool { + debug!("CALL wasi:sockets/tcp#tcp-socket.is-listening"); + self.0.is_listening() + } fn address_family(&self) -> IpAddressFamily { debug!("CALL wasi:sockets/tcp#tcp-socket.address-family"); self.0.address_family() } - fn ipv6_only(&self) -> Result { - debug!("CALL wasi:sockets/tcp#tcp-socket.ipv6-only"); - self.0.ipv6_only() - } - fn set_ipv6_only(&self, value: bool) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/tcp#tcp-socket.set-ipv6-only"); - self.0.set_ipv6_only(value) - } fn set_listen_backlog_size(&self, value: u64) -> Result<(), NetworkErrorCode> { debug!("CALL wasi:sockets/tcp#tcp-socket.set-listen-backlog-size"); self.0.set_listen_backlog_size(value) } - fn keep_alive(&self) -> Result { - debug!("CALL wasi:sockets/tcp#tcp-socket.keep-alive"); - self.0.keep_alive() + fn keep_alive_enabled(&self) -> Result { + debug!("CALL wasi:sockets/tcp#tcp-socket.keep-alive-enabled"); + self.0.keep_alive_enabled() } - fn set_keep_alive(&self, value: bool) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/tcp#tcp-socket.set-keep-alive"); - self.0.set_keep_alive(value) + fn set_keep_alive_enabled(&self, value: bool) -> Result<(), NetworkErrorCode> { + debug!("CALL wasi:sockets/tcp#tcp-socket.set-keep-alive-enabled"); + self.0.set_keep_alive_enabled(value) } - fn no_delay(&self) -> Result { - debug!("CALL wasi:sockets/tcp#tcp-socket.no-delay"); - self.0.no_delay() + fn keep_alive_idle_time(&self) -> Result { + debug!("CALL wasi:sockets/tcp#tcp-socket.keep-alive-idle-time"); + self.0.keep_alive_idle_time() } - fn set_no_delay(&self, value: bool) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/tcp#tcp-socket.set-no-delay"); - self.0.set_no_delay(value) + fn set_keep_alive_idle_time(&self, value: Duration) -> Result<(), NetworkErrorCode> { + debug!("CALL wasi:sockets/tcp#tcp-socket.set-keep-alive-idle-time"); + self.0.set_keep_alive_idle_time(value) } - fn unicast_hop_limit(&self) -> Result { - debug!("CALL wasi:sockets/tcp#tcp-socket.unicast-hop-limit"); - self.0.unicast_hop_limit() + fn keep_alive_interval(&self) -> Result { + debug!("CALL wasi:sockets/tcp#tcp-socket.keep-alive-interval-time"); + self.0.keep_alive_interval() } - fn set_unicast_hop_limit(&self, value: u8) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/tcp#tcp-socket.set-unicast-hop-limit"); - self.0.set_unicast_hop_limit(value) + fn set_keep_alive_interval(&self, value: Duration) -> Result<(), NetworkErrorCode> { + debug!("CALL wasi:sockets/tcp#tcp-socket.set-keep-alive-interval-time"); + self.0.set_keep_alive_interval(value) + } + fn keep_alive_count(&self) -> Result { + debug!("CALL wasi:sockets/tcp#tcp-socket.keep-alive-count-time"); + self.0.keep_alive_count() + } + fn set_keep_alive_count(&self, value: u32) -> Result<(), NetworkErrorCode> { + debug!("CALL wasi:sockets/tcp#tcp-socket.set-keep-alive-count-time"); + self.0.set_keep_alive_count(value) + } + fn hop_limit(&self) -> Result { + debug!("CALL wasi:sockets/tcp#tcp-socket.hop-limit"); + self.0.hop_limit() + } + fn set_hop_limit(&self, value: u8) -> Result<(), NetworkErrorCode> { + debug!("CALL wasi:sockets/tcp#tcp-socket.set-hop-limit"); + self.0.set_hop_limit(value) } fn receive_buffer_size(&self) -> Result { debug!("CALL wasi:sockets/tcp#tcp-socket.receive-buffer-size"); @@ -1536,44 +1552,6 @@ impl GuestUdpSocket for UdpSocket { debug!("CALL wasi:sockets/udp#udp-socket.finish-bind"); self.0.finish_bind() } - fn start_connect( - &self, - network: &Network, - remote_address: IpSocketAddress, - ) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/udp#udp-socket.start-connect"); - self.0.start_connect(network, remote_address) - } - fn finish_connect(&self) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/udp#udp-socket.finish-connect"); - self.0.finish_connect() - } - fn receive(&self, max_results: u64) -> Result, NetworkErrorCode> { - debug!("CALL wasi:sockets/udp#udp-socket.receive"); - match self.0.receive(max_results) { - Ok(mut datagrams) => Ok(datagrams - .drain(..) - .map(|d| Datagram { - data: d.data, - remote_address: d.remote_address, - }) - .collect::>()), - Err(err) => Err(err), - } - } - fn send(&self, mut datagrams: Vec) -> Result { - debug!("CALL wasi:sockets/udp#udp-socket.send"); - self.0.send( - datagrams - .drain(..) - .map(|d| udp::Datagram { - data: d.data, - remote_address: d.remote_address, - }) - .collect::>() - .as_slice(), - ) - } fn local_address(&self) -> Result { debug!("CALL wasi:sockets/udp#udp-socket.local-address"); self.0.local_address() @@ -1586,14 +1564,6 @@ impl GuestUdpSocket for UdpSocket { debug!("CALL wasi:sockets/udp#udp-socket.address-family"); self.0.address_family() } - fn ipv6_only(&self) -> Result { - debug!("CALL wasi:sockets/udp#udp-socket.ipv6-only"); - self.0.ipv6_only() - } - fn set_ipv6_only(&self, value: bool) -> Result<(), NetworkErrorCode> { - debug!("CALL wasi:sockets/udp#udp-socket.set-ipv6-only"); - self.0.set_ipv6_only(value) - } fn unicast_hop_limit(&self) -> Result { debug!("CALL wasi:sockets/udp#udp-socket.unicast-hop-limit"); self.0.unicast_hop_limit() @@ -1622,6 +1592,70 @@ impl GuestUdpSocket for UdpSocket { debug!("CALL wasi:sockets/udp#udp-socket.subscribe"); Resource::new(Pollable::Host(self.0.subscribe())) } + fn stream( + &self, + remote_addr: Option, + ) -> Result< + ( + Resource, + Resource, + ), + NetworkErrorCode, + > { + debug!("CALL wasi:sockets/udp#udp-socket.stream"); + let (in_, out) = self.0.stream(remote_addr)?; + Ok(( + Resource::new(SocketsIncomingDatagramStream(in_)), + Resource::new(SocketsOutgoingDatagramStream(out)), + )) + } +} + +impl GuestIncomingDatagramStream for SocketsIncomingDatagramStream { + fn receive(&self, max_results: u64) -> Result, NetworkErrorCode> { + debug!("CALL wasi:sockets/udp#incoming-datagram-stream.receive"); + match self.0.receive(max_results) { + Ok(mut datagrams) => Ok(datagrams + .drain(..) + .map(|d| IncomingDatagram { + data: d.data, + remote_address: d.remote_address, + }) + .collect::>()), + Err(err) => Err(err), + } + } + + fn subscribe(&self) -> Resource { + debug!("CALL wasi:sockets/udp#incoming-datagram-stream.subscribe"); + Resource::new(Pollable::Host(self.0.subscribe())) + } +} + +impl GuestOutgoingDatagramStream for SocketsOutgoingDatagramStream { + fn check_send(&self) -> Result { + debug!("CALL wasi:sockets/udp#outgoing-datagram-stream.check-send"); + self.0.check_send() + } + + fn send(&self, mut datagrams: Vec) -> Result { + debug!("CALL wasi:sockets/udp#outgoing-datagram-stream.send"); + self.0.send( + datagrams + .drain(..) + .map(|d| udp::OutgoingDatagram { + data: d.data, + remote_address: d.remote_address, + }) + .collect::>() + .as_slice(), + ) + } + + fn subscribe(&self) -> Resource { + debug!("CALL wasi:sockets/udp#outgoing-datagram-stream.subscribe"); + Resource::new(Pollable::Host(self.0.subscribe())) + } } fn descriptor_ty_map(d: filesystem_types::DescriptorType) -> DescriptorType { diff --git a/virtual-adapter/src/lib.rs b/virtual-adapter/src/lib.rs index 7f57d3d..e3032e7 100644 --- a/virtual-adapter/src/lib.rs +++ b/virtual-adapter/src/lib.rs @@ -44,5 +44,7 @@ wit_bindgen::generate!({ "wasi:sockets/ip-name-lookup/resolve-address-stream": io::SocketsResolveAddressStream, "wasi:sockets/tcp/tcp-socket": io::SocketsTcpSocket, "wasi:sockets/udp/udp-socket": io::SocketsUdpSocket, + "wasi:sockets/udp/incoming-datagram-stream": io::SocketsIncomingDatagramStream, + "wasi:sockets/udp/outgoing-datagram-stream": io::SocketsOutgoingDatagramStream, } }); diff --git a/wit/deps/cli/imports.wit b/wit/deps/cli/imports.wit index 36b1c59..3606a99 100644 --- a/wit/deps/cli/imports.wit +++ b/wit/deps/cli/imports.wit @@ -3,7 +3,7 @@ package wasi:cli@0.2.0-rc-2023-12-05; world imports { include wasi:clocks/imports@0.2.0-rc-2023-11-10; include wasi:filesystem/imports@0.2.0-rc-2023-11-10; - include wasi:sockets/imports@0.2.0-rc-2023-10-18; + include wasi:sockets/imports@0.2.0-rc-2024-01-16; include wasi:random/imports@0.2.0-rc-2023-11-10; include wasi:io/imports@0.2.0-rc-2023-11-10; diff --git a/wit/deps/cli/terminal.wit b/wit/deps/cli/terminal.wit index 4749576..38c724e 100644 --- a/wit/deps/cli/terminal.wit +++ b/wit/deps/cli/terminal.wit @@ -1,19 +1,21 @@ +/// Terminal input. +/// +/// In the future, this may include functions for disabling echoing, +/// disabling input buffering so that keyboard events are sent through +/// immediately, querying supported features, and so on. interface terminal-input { /// The input side of a terminal. resource terminal-input; - - // In the future, this may include functions for disabling echoing, - // disabling input buffering so that keyboard events are sent through - // immediately, querying supported features, and so on. } +/// Terminal output. +/// +/// In the future, this may include functions for querying the terminal +/// size, being notified of terminal size changes, querying supported +/// features, and so on. interface terminal-output { /// The output side of a terminal. resource terminal-output; - - // In the future, this may include functions for querying the terminal - // size, being notified of terminal size changes, querying supported - // features, and so on. } /// An interface providing an optional `terminal-input` for stdin as a diff --git a/wit/deps/io/poll.wit b/wit/deps/io/poll.wit index bddde3c..81b1cab 100644 --- a/wit/deps/io/poll.wit +++ b/wit/deps/io/poll.wit @@ -3,7 +3,7 @@ package wasi:io@0.2.0-rc-2023-11-10; /// A poll API intended to let users wait for I/O events on multiple handles /// at once. interface poll { - /// `pollable` epresents a single I/O event which may be ready, or not. + /// `pollable` represents a single I/O event which may be ready, or not. resource pollable { /// Return the readiness of a pollable. This function never blocks. diff --git a/wit/deps/io/streams.wit b/wit/deps/io/streams.wit index e7e1b68..82e6e07 100644 --- a/wit/deps/io/streams.wit +++ b/wit/deps/io/streams.wit @@ -32,6 +32,11 @@ interface streams { resource input-stream { /// Perform a non-blocking read from the stream. /// + /// When the source of a `read` is binary data, the bytes from the source + /// are returned verbatim. When the source of a `read` is known to the + /// implementation to be text, bytes containing the UTF-8 encoding of the + /// text are returned. + /// /// This function returns a list of bytes containing the read data, /// when successful. The returned list will contain up to `len` bytes; /// it may return fewer than requested, but not more. The list is @@ -111,6 +116,12 @@ interface streams { /// Perform a write. This function never blocks. /// + /// When the destination of a `write` is binary data, the bytes from + /// `contents` are written verbatim. When the destination of a `write` is + /// known to the implementation to be text, the bytes of `contents` are + /// transcoded from UTF-8 into the encoding of the destination and then + /// written. + /// /// Precondition: check-write gave permit of Ok(n) and contents has a /// length of less than or equal to n. Otherwise, this function will trap. /// @@ -131,7 +142,7 @@ interface streams { /// let pollable = this.subscribe(); /// while !contents.is_empty() { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, contents.len()); /// let (chunk, rest) = contents.split_at(len); @@ -140,7 +151,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` @@ -178,7 +189,7 @@ interface streams { /// Write zeroes to a stream. /// - /// this should be used precisely like `write` with the exact same + /// This should be used precisely like `write` with the exact same /// preconditions (must use check-write first), but instead of /// passing a list of bytes, you simply pass the number of zero-bytes /// that should be written. @@ -199,7 +210,7 @@ interface streams { /// let pollable = this.subscribe(); /// while num_zeroes != 0 { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, num_zeroes); /// this.write-zeroes(len); // eliding error handling @@ -207,7 +218,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` diff --git a/wit/deps/sockets/instance-network.wit b/wit/deps/sockets/instance-network.wit index 14e4479..e455d0f 100644 --- a/wit/deps/sockets/instance-network.wit +++ b/wit/deps/sockets/instance-network.wit @@ -1,9 +1,9 @@ /// This interface provides a value-export of the default network handle.. interface instance-network { - use network.{network}; + use network.{network}; - /// Get a handle to the default network. - instance-network: func() -> network; + /// Get a handle to the default network. + instance-network: func() -> network; } diff --git a/wit/deps/sockets/ip-name-lookup.wit b/wit/deps/sockets/ip-name-lookup.wit index 5e8bd27..931ccf7 100644 --- a/wit/deps/sockets/ip-name-lookup.wit +++ b/wit/deps/sockets/ip-name-lookup.wit @@ -1,61 +1,51 @@ interface ip-name-lookup { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use network.{network, error-code, ip-address, ip-address-family}; + use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use network.{network, error-code, ip-address}; - /// Resolve an internet host name to a list of IP addresses. - /// - /// See the wasi-socket proposal README.md for a comparison with getaddrinfo. - /// - /// # Parameters - /// - `name`: The name to look up. IP addresses are not allowed. Unicode domain names are automatically converted - /// to ASCII using IDNA encoding. - /// - `address-family`: If provided, limit the results to addresses of this specific address family. - /// - `include-unavailable`: When set to true, this function will also return addresses of which the runtime - /// thinks (or knows) can't be connected to at the moment. For example, this will return IPv6 addresses on - /// systems without an active IPv6 interface. Notes: - /// - Even when no public IPv6 interfaces are present or active, names like "localhost" can still resolve to an IPv6 address. - /// - Whatever is "available" or "unavailable" is volatile and can change everytime a network cable is unplugged. - /// - /// This function never blocks. It either immediately fails or immediately returns successfully with a `resolve-address-stream` - /// that can be used to (asynchronously) fetch the results. - /// - /// At the moment, the stream never completes successfully with 0 items. Ie. the first call - /// to `resolve-next-address` never returns `ok(none)`. This may change in the future. - /// - /// # Typical errors - /// - `invalid-argument`: `name` is a syntactically invalid domain name. - /// - `invalid-argument`: `name` is an IP address. - /// - `not-supported`: The specified `address-family` is not supported. (EAI_FAMILY) - /// - /// # References: - /// - - /// - - /// - - /// - - resolve-addresses: func(network: borrow, name: string, address-family: option, include-unavailable: bool) -> result; + /// Resolve an internet host name to a list of IP addresses. + /// + /// Unicode domain names are automatically converted to ASCII using IDNA encoding. + /// If the input is an IP address string, the address is parsed and returned + /// as-is without making any external requests. + /// + /// See the wasi-socket proposal README.md for a comparison with getaddrinfo. + /// + /// This function never blocks. It either immediately fails or immediately + /// returns successfully with a `resolve-address-stream` that can be used + /// to (asynchronously) fetch the results. + /// + /// # Typical errors + /// - `invalid-argument`: `name` is a syntactically invalid domain name or IP address. + /// + /// # References: + /// - + /// - + /// - + /// - + resolve-addresses: func(network: borrow, name: string) -> result; - resource resolve-address-stream { - /// Returns the next address from the resolver. - /// - /// This function should be called multiple times. On each call, it will - /// return the next address in connection order preference. If all - /// addresses have been exhausted, this function returns `none`. - /// - /// This function never returns IPv4-mapped IPv6 addresses. - /// - /// # Typical errors - /// - `name-unresolvable`: Name does not exist or has no suitable associated IP addresses. (EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY) - /// - `temporary-resolver-failure`: A temporary failure in name resolution occurred. (EAI_AGAIN) - /// - `permanent-resolver-failure`: A permanent failure in name resolution occurred. (EAI_FAIL) - /// - `would-block`: A result is not available yet. (EWOULDBLOCK, EAGAIN) - resolve-next-address: func() -> result, error-code>; + resource resolve-address-stream { + /// Returns the next address from the resolver. + /// + /// This function should be called multiple times. On each call, it will + /// return the next address in connection order preference. If all + /// addresses have been exhausted, this function returns `none`. + /// + /// This function never returns IPv4-mapped IPv6 addresses. + /// + /// # Typical errors + /// - `name-unresolvable`: Name does not exist or has no suitable associated IP addresses. (EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY) + /// - `temporary-resolver-failure`: A temporary failure in name resolution occurred. (EAI_AGAIN) + /// - `permanent-resolver-failure`: A permanent failure in name resolution occurred. (EAI_FAIL) + /// - `would-block`: A result is not available yet. (EWOULDBLOCK, EAGAIN) + resolve-next-address: func() -> result, error-code>; - /// Create a `pollable` which will resolve once the stream is ready for I/O. - /// - /// Note: this function is here for WASI Preview2 only. - /// It's planned to be removed when `future` is natively supported in Preview3. - subscribe: func() -> pollable; - } + /// Create a `pollable` which will resolve once the stream is ready for I/O. + /// + /// Note: this function is here for WASI Preview2 only. + /// It's planned to be removed when `future` is natively supported in Preview3. + subscribe: func() -> pollable; + } } diff --git a/wit/deps/sockets/network.wit b/wit/deps/sockets/network.wit index fc51604..9cadf06 100644 --- a/wit/deps/sockets/network.wit +++ b/wit/deps/sockets/network.wit @@ -1,146 +1,145 @@ interface network { - /// An opaque resource that represents access to (a subset of) the network. - /// This enables context-based security for networking. - /// There is no need for this to map 1:1 to a physical network interface. - resource network; + /// An opaque resource that represents access to (a subset of) the network. + /// This enables context-based security for networking. + /// There is no need for this to map 1:1 to a physical network interface. + resource network; - /// Error codes. - /// - /// In theory, every API can return any error code. - /// In practice, API's typically only return the errors documented per API - /// combined with a couple of errors that are always possible: - /// - `unknown` - /// - `access-denied` - /// - `not-supported` - /// - `out-of-memory` - /// - `concurrency-conflict` - /// - /// See each individual API for what the POSIX equivalents are. They sometimes differ per API. - enum error-code { - // ### GENERAL ERRORS ### + /// Error codes. + /// + /// In theory, every API can return any error code. + /// In practice, API's typically only return the errors documented per API + /// combined with a couple of errors that are always possible: + /// - `unknown` + /// - `access-denied` + /// - `not-supported` + /// - `out-of-memory` + /// - `concurrency-conflict` + /// + /// See each individual API for what the POSIX equivalents are. They sometimes differ per API. + enum error-code { + /// Unknown error + unknown, - /// Unknown error - unknown, + /// Access denied. + /// + /// POSIX equivalent: EACCES, EPERM + access-denied, - /// Access denied. - /// - /// POSIX equivalent: EACCES, EPERM - access-denied, + /// The operation is not supported. + /// + /// POSIX equivalent: EOPNOTSUPP + not-supported, + + /// One of the arguments is invalid. + /// + /// POSIX equivalent: EINVAL + invalid-argument, + + /// Not enough memory to complete the operation. + /// + /// POSIX equivalent: ENOMEM, ENOBUFS, EAI_MEMORY + out-of-memory, + + /// The operation timed out before it could finish completely. + timeout, + + /// This operation is incompatible with another asynchronous operation that is already in progress. + /// + /// POSIX equivalent: EALREADY + concurrency-conflict, + + /// Trying to finish an asynchronous operation that: + /// - has not been started yet, or: + /// - was already finished by a previous `finish-*` call. + /// + /// Note: this is scheduled to be removed when `future`s are natively supported. + not-in-progress, + + /// The operation has been aborted because it could not be completed immediately. + /// + /// Note: this is scheduled to be removed when `future`s are natively supported. + would-block, + + + /// The operation is not valid in the socket's current state. + invalid-state, + + /// A new socket resource could not be created because of a system limit. + new-socket-limit, + + /// A bind operation failed because the provided address is not an address that the `network` can bind to. + address-not-bindable, + + /// A bind operation failed because the provided address is already in use or because there are no ephemeral ports available. + address-in-use, + + /// The remote address is not reachable + remote-unreachable, + + + /// The TCP connection was forcefully rejected + connection-refused, + + /// The TCP connection was reset. + connection-reset, + + /// A TCP connection was aborted. + connection-aborted, + + + /// The size of a datagram sent to a UDP socket exceeded the maximum + /// supported size. + datagram-too-large, + + + /// Name does not exist or has no suitable associated IP addresses. + name-unresolvable, + + /// A temporary failure in name resolution occurred. + temporary-resolver-failure, + + /// A permanent failure in name resolution occurred. + permanent-resolver-failure, + } + + enum ip-address-family { + /// Similar to `AF_INET` in POSIX. + ipv4, + + /// Similar to `AF_INET6` in POSIX. + ipv6, + } + + type ipv4-address = tuple; + type ipv6-address = tuple; + + variant ip-address { + ipv4(ipv4-address), + ipv6(ipv6-address), + } - /// The operation is not supported. - /// - /// POSIX equivalent: EOPNOTSUPP - not-supported, + record ipv4-socket-address { + /// sin_port + port: u16, + /// sin_addr + address: ipv4-address, + } - /// One of the arguments is invalid. - /// - /// POSIX equivalent: EINVAL - invalid-argument, + record ipv6-socket-address { + /// sin6_port + port: u16, + /// sin6_flowinfo + flow-info: u32, + /// sin6_addr + address: ipv6-address, + /// sin6_scope_id + scope-id: u32, + } - /// Not enough memory to complete the operation. - /// - /// POSIX equivalent: ENOMEM, ENOBUFS, EAI_MEMORY - out-of-memory, - - /// The operation timed out before it could finish completely. - timeout, - - /// This operation is incompatible with another asynchronous operation that is already in progress. - /// - /// POSIX equivalent: EALREADY - concurrency-conflict, - - /// Trying to finish an asynchronous operation that: - /// - has not been started yet, or: - /// - was already finished by a previous `finish-*` call. - /// - /// Note: this is scheduled to be removed when `future`s are natively supported. - not-in-progress, - - /// The operation has been aborted because it could not be completed immediately. - /// - /// Note: this is scheduled to be removed when `future`s are natively supported. - would-block, - - - - // ### TCP & UDP SOCKET ERRORS ### - - /// The operation is not valid in the socket's current state. - invalid-state, - - /// A new socket resource could not be created because of a system limit. - new-socket-limit, - - /// A bind operation failed because the provided address is not an address that the `network` can bind to. - address-not-bindable, - - /// A bind operation failed because the provided address is already in use or because there are no ephemeral ports available. - address-in-use, - - /// The remote address is not reachable - remote-unreachable, - - - // ### TCP SOCKET ERRORS ### - - /// The connection was forcefully rejected - connection-refused, - - /// The connection was reset. - connection-reset, - - /// A connection was aborted. - connection-aborted, - - // ### UDP SOCKET ERRORS ### - datagram-too-large, - - - // ### NAME LOOKUP ERRORS ### - - /// Name does not exist or has no suitable associated IP addresses. - name-unresolvable, - - /// A temporary failure in name resolution occurred. - temporary-resolver-failure, - - /// A permanent failure in name resolution occurred. - permanent-resolver-failure, - } - - enum ip-address-family { - /// Similar to `AF_INET` in POSIX. - ipv4, - - /// Similar to `AF_INET6` in POSIX. - ipv6, - } - - type ipv4-address = tuple; - type ipv6-address = tuple; - - variant ip-address { - ipv4(ipv4-address), - ipv6(ipv6-address), - } - - record ipv4-socket-address { - port: u16, // sin_port - address: ipv4-address, // sin_addr - } - - record ipv6-socket-address { - port: u16, // sin6_port - flow-info: u32, // sin6_flowinfo - address: ipv6-address, // sin6_addr - scope-id: u32, // sin6_scope_id - } - - variant ip-socket-address { - ipv4(ipv4-socket-address), - ipv6(ipv6-socket-address), - } + variant ip-socket-address { + ipv4(ipv4-socket-address), + ipv6(ipv6-socket-address), + } } diff --git a/wit/deps/sockets/tcp-create-socket.wit b/wit/deps/sockets/tcp-create-socket.wit index a9a3373..c7ddf1f 100644 --- a/wit/deps/sockets/tcp-create-socket.wit +++ b/wit/deps/sockets/tcp-create-socket.wit @@ -1,26 +1,27 @@ interface tcp-create-socket { - use network.{network, error-code, ip-address-family}; - use tcp.{tcp-socket}; + use network.{network, error-code, ip-address-family}; + use tcp.{tcp-socket}; - /// Create a new TCP socket. - /// - /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. - /// - /// This function does not require a network capability handle. This is considered to be safe because - /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`listen`/`connect` - /// is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. - /// - /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. - /// - /// # Typical errors - /// - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) - /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) - /// - /// # References - /// - - /// - - /// - - /// - - create-tcp-socket: func(address-family: ip-address-family) -> result; + /// Create a new TCP socket. + /// + /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. + /// + /// This function does not require a network capability handle. This is considered to be safe because + /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` + /// is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. + /// + /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. + /// + /// # Typical errors + /// - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) + /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + /// + /// # References + /// - + /// - + /// - + /// - + create-tcp-socket: func(address-family: ip-address-family) -> result; } diff --git a/wit/deps/sockets/tcp.wit b/wit/deps/sockets/tcp.wit index 76caf88..9f12b82 100644 --- a/wit/deps/sockets/tcp.wit +++ b/wit/deps/sockets/tcp.wit @@ -1,268 +1,353 @@ interface tcp { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use network.{network, error-code, ip-socket-address, ip-address-family}; + use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; + use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; + use network.{network, error-code, ip-socket-address, ip-address-family}; - enum shutdown-type { - /// Similar to `SHUT_RD` in POSIX. - receive, + enum shutdown-type { + /// Similar to `SHUT_RD` in POSIX. + receive, - /// Similar to `SHUT_WR` in POSIX. - send, + /// Similar to `SHUT_WR` in POSIX. + send, - /// Similar to `SHUT_RDWR` in POSIX. - both, - } + /// Similar to `SHUT_RDWR` in POSIX. + both, + } + + /// A TCP socket resource. + /// + /// The socket can be in one of the following states: + /// - `unbound` + /// - `bind-in-progress` + /// - `bound` (See note below) + /// - `listen-in-progress` + /// - `listening` + /// - `connect-in-progress` + /// - `connected` + /// - `closed` + /// See + /// for a more information. + /// + /// Note: Except where explicitly mentioned, whenever this documentation uses + /// the term "bound" without backticks it actually means: in the `bound` state *or higher*. + /// (i.e. `bound`, `listen-in-progress`, `listening`, `connect-in-progress` or `connected`) + /// + /// In addition to the general error codes documented on the + /// `network::error-code` type, TCP socket methods may always return + /// `error(invalid-state)` when in the `closed` state. + resource tcp-socket { + /// Bind the socket to a specific network on the provided IP address and port. + /// + /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which + /// network interface(s) to bind to. + /// If the TCP/UDP port is zero, the socket will be bound to a random free port. + /// + /// Bind can be attempted multiple times on the same socket, even with + /// different arguments on each iteration. But never concurrently and + /// only as long as the previous bind failed. Once a bind succeeds, the + /// binding can't be changed anymore. + /// + /// # Typical errors + /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + /// - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) + /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address. (EINVAL) + /// - `invalid-state`: The socket is already bound. (EINVAL) + /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + /// - `address-in-use`: Address is already in use. (EADDRINUSE) + /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) + /// - `not-in-progress`: A `bind` operation is not in progress. + /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// When binding to a non-zero port, this bind operation shouldn't be affected by the TIME_WAIT + /// state of a recently closed socket on the same local address. In practice this means that the SO_REUSEADDR + /// socket option should be set implicitly on all platforms, except on Windows where this is the default behavior + /// and SO_REUSEADDR performs something different entirely. + /// + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. + /// + /// # References + /// - + /// - + /// - + /// - + start-bind: func(network: borrow, local-address: ip-socket-address) -> result<_, error-code>; + finish-bind: func() -> result<_, error-code>; + /// Connect to a remote endpoint. + /// + /// On success: + /// - the socket is transitioned into the `connection` state. + /// - a pair of streams is returned that can be used to read & write to the connection + /// + /// After a failed connection attempt, the socket will be in the `closed` + /// state and the only valid action left is to `drop` the socket. A single + /// socket can not be used to connect more than once. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) + /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address. (EINVAL, EADDRNOTAVAIL on Illumos) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) + /// - `invalid-argument`: The socket is already attached to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN) + /// - `invalid-state`: The socket is already in the `listening` state. (EOPNOTSUPP, EINVAL on Windows) + /// - `timeout`: Connection timed out. (ETIMEDOUT) + /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) + /// - `connection-reset`: The connection was reset. (ECONNRESET) + /// - `connection-aborted`: The connection was aborted. (ECONNABORTED) + /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + /// - `not-in-progress`: A connect operation is not in progress. + /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// The POSIX equivalent of `start-connect` is the regular `connect` syscall. + /// Because all WASI sockets are non-blocking this is expected to return + /// EINPROGRESS, which should be translated to `ok()` in WASI. + /// + /// The POSIX equivalent of `finish-connect` is a `poll` for event `POLLOUT` + /// with a timeout of 0 on the socket descriptor. Followed by a check for + /// the `SO_ERROR` socket option, in case the poll signaled readiness. + /// + /// # References + /// - + /// - + /// - + /// - + start-connect: func(network: borrow, remote-address: ip-socket-address) -> result<_, error-code>; + finish-connect: func() -> result, error-code>; - /// A TCP socket handle. - resource tcp-socket { - /// Bind the socket to a specific network on the provided IP address and port. - /// - /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which - /// network interface(s) to bind to. - /// If the TCP/UDP port is zero, the socket will be bound to a random free port. - /// - /// When a socket is not explicitly bound, the first invocation to a listen or connect operation will - /// implicitly bind the socket. - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - /// # Typical `start` errors - /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) - /// - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) - /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL) - /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors - /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) - /// - `address-in-use`: Address is already in use. (EADDRINUSE) - /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) - /// - `not-in-progress`: A `bind` operation is not in progress. - /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - start-bind: func(network: borrow, local-address: ip-socket-address) -> result<_, error-code>; - finish-bind: func() -> result<_, error-code>; + /// Start listening for new connections. + /// + /// Transitions the socket into the `listening` state. + /// + /// Unlike POSIX, the socket must already be explicitly bound. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not bound to any local address. (EDESTADDRREQ) + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN, EINVAL on BSD) + /// - `invalid-state`: The socket is already in the `listening` state. + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) + /// - `not-in-progress`: A listen operation is not in progress. + /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// Unlike in POSIX, in WASI the listen operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `listen` as part of either `start-listen` or `finish-listen`. + /// + /// # References + /// - + /// - + /// - + /// - + start-listen: func() -> result<_, error-code>; + finish-listen: func() -> result<_, error-code>; - /// Connect to a remote endpoint. - /// - /// On success: - /// - the socket is transitioned into the Connection state - /// - a pair of streams is returned that can be used to read & write to the connection - /// - /// POSIX mentions: - /// > If connect() fails, the state of the socket is unspecified. Conforming applications should - /// > close the file descriptor and create a new socket before attempting to reconnect. - /// - /// WASI prescribes the following behavior: - /// - If `connect` fails because an input/state validation error, the socket should remain usable. - /// - If a connection was actually attempted but failed, the socket should become unusable for further network communication. - /// Besides `drop`, any method after such a failure may return an error. - /// - /// # Typical `start` errors - /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) - /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL, EADDRNOTAVAIL on Illumos) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) - /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) - /// - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) - /// - `invalid-argument`: The socket is already attached to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN) - /// - `invalid-state`: The socket is already in the Listener state. (EOPNOTSUPP, EINVAL on Windows) - /// - /// # Typical `finish` errors - /// - `timeout`: Connection timed out. (ETIMEDOUT) - /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) - /// - `connection-reset`: The connection was reset. (ECONNRESET) - /// - `connection-aborted`: The connection was aborted. (ECONNABORTED) - /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN) - /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) - /// - `not-in-progress`: A `connect` operation is not in progress. - /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - start-connect: func(network: borrow, remote-address: ip-socket-address) -> result<_, error-code>; - finish-connect: func() -> result, error-code>; + /// Accept a new client socket. + /// + /// The returned socket is bound and in the `connected` state. The following properties are inherited from the listener socket: + /// - `address-family` + /// - `keep-alive-enabled` + /// - `keep-alive-idle-time` + /// - `keep-alive-interval` + /// - `keep-alive-count` + /// - `hop-limit` + /// - `receive-buffer-size` + /// - `send-buffer-size` + /// + /// On success, this function returns the newly accepted client socket along with + /// a pair of streams that can be used to read & write to the connection. + /// + /// # Typical errors + /// - `invalid-state`: Socket is not in the `listening` state. (EINVAL) + /// - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) + /// - `connection-aborted`: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED) + /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + /// + /// # References + /// - + /// - + /// - + /// - + accept: func() -> result, error-code>; - /// Start listening for new connections. - /// - /// Transitions the socket into the Listener state. - /// - /// Unlike POSIX: - /// - this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - the socket must already be explicitly bound. - /// - /// # Typical `start` errors - /// - `invalid-state`: The socket is not bound to any local address. (EDESTADDRREQ) - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN, EINVAL on BSD) - /// - `invalid-state`: The socket is already in the Listener state. - /// - /// # Typical `finish` errors - /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) - /// - `not-in-progress`: A `listen` operation is not in progress. - /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - start-listen: func() -> result<_, error-code>; - finish-listen: func() -> result<_, error-code>; + /// Get the bound local address. + /// + /// POSIX mentions: + /// > If the socket has not been bound to a local name, the value + /// > stored in the object pointed to by `address` is unspecified. + /// + /// WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not bound to any local address. + /// + /// # References + /// - + /// - + /// - + /// - + local-address: func() -> result; - /// Accept a new client socket. - /// - /// The returned socket is bound and in the Connection state. The following properties are inherited from the listener socket: - /// - `address-family` - /// - `ipv6-only` - /// - `keep-alive` - /// - `no-delay` - /// - `unicast-hop-limit` - /// - `receive-buffer-size` - /// - `send-buffer-size` - /// - /// On success, this function returns the newly accepted client socket along with - /// a pair of streams that can be used to read & write to the connection. - /// - /// # Typical errors - /// - `invalid-state`: Socket is not in the Listener state. (EINVAL) - /// - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) - /// - `connection-aborted`: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED) - /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) - /// - /// # References - /// - - /// - - /// - - /// - - accept: func() -> result, error-code>; + /// Get the remote address. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not connected to a remote address. (ENOTCONN) + /// + /// # References + /// - + /// - + /// - + /// - + remote-address: func() -> result; - /// Get the bound local address. - /// - /// POSIX mentions: - /// > If the socket has not been bound to a local name, the value - /// > stored in the object pointed to by `address` is unspecified. - /// - /// WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not bound to any local address. - /// - /// # References - /// - - /// - - /// - - /// - - local-address: func() -> result; + /// Whether the socket is in the `listening` state. + /// + /// Equivalent to the SO_ACCEPTCONN socket option. + is-listening: func() -> bool; - /// Get the remote address. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not connected to a remote address. (ENOTCONN) - /// - /// # References - /// - - /// - - /// - - /// - - remote-address: func() -> result; + /// Whether this is a IPv4 or IPv6 socket. + /// + /// Equivalent to the SO_DOMAIN socket option. + address-family: func() -> ip-address-family; - /// Whether this is a IPv4 or IPv6 socket. - /// - /// Equivalent to the SO_DOMAIN socket option. - address-family: func() -> ip-address-family; + /// Hints the desired listen queue size. Implementations are free to ignore this. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// + /// # Typical errors + /// - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. + /// - `invalid-argument`: (set) The provided value was 0. + /// - `invalid-state`: (set) The socket is in the `connect-in-progress` or `connected` state. + set-listen-backlog-size: func(value: u64) -> result<_, error-code>; - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; + /// Enables or disables keepalive. + /// + /// The keepalive behavior can be adjusted using: + /// - `keep-alive-idle-time` + /// - `keep-alive-interval` + /// - `keep-alive-count` + /// These properties can be configured while `keep-alive-enabled` is false, but only come into effect when `keep-alive-enabled` is true. + /// + /// Equivalent to the SO_KEEPALIVE socket option. + keep-alive-enabled: func() -> result; + set-keep-alive-enabled: func(value: bool) -> result<_, error-code>; - /// Hints the desired listen queue size. Implementations are free to ignore this. - /// - /// # Typical errors - /// - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. - /// - `invalid-state`: (set) The socket is already in the Connection state. - set-listen-backlog-size: func(value: u64) -> result<_, error-code>; + /// Amount of time the connection has to be idle before TCP starts sending keepalive packets. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// I.e. after setting a value, reading the same setting back may return a different value. + /// + /// Equivalent to the TCP_KEEPIDLE socket option. (TCP_KEEPALIVE on MacOS) + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + keep-alive-idle-time: func() -> result; + set-keep-alive-idle-time: func(value: duration) -> result<_, error-code>; - /// Equivalent to the SO_KEEPALIVE socket option. - keep-alive: func() -> result; - set-keep-alive: func(value: bool) -> result<_, error-code>; + /// The time between keepalive packets. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// I.e. after setting a value, reading the same setting back may return a different value. + /// + /// Equivalent to the TCP_KEEPINTVL socket option. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + keep-alive-interval: func() -> result; + set-keep-alive-interval: func(value: duration) -> result<_, error-code>; - /// Equivalent to the TCP_NODELAY socket option. - /// - /// The default value is `false`. - no-delay: func() -> result; - set-no-delay: func(value: bool) -> result<_, error-code>; + /// The maximum amount of keepalive packets TCP should send before aborting the connection. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// I.e. after setting a value, reading the same setting back may return a different value. + /// + /// Equivalent to the TCP_KEEPCNT socket option. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + keep-alive-count: func() -> result; + set-keep-alive-count: func(value: u32) -> result<_, error-code>; - /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. - /// - /// # Typical errors - /// - `invalid-argument`: (set) The TTL value must be 1 or higher. - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. - unicast-hop-limit: func() -> result; - set-unicast-hop-limit: func(value: u8) -> result<_, error-code>; + /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The TTL value must be 1 or higher. + hop-limit: func() -> result; + set-hop-limit: func(value: u8) -> result<_, error-code>; - /// The kernel buffer space reserved for sends/receives on this socket. - /// - /// Note #1: an implementation may choose to cap or round the buffer size when setting the value. - /// In other words, after setting a value, reading the same setting back may return a different value. - /// - /// Note #2: there is not necessarily a direct relationship between the kernel buffer size and the bytes of - /// actual data to be sent/received by the application, because the kernel might also use the buffer space - /// for internal metadata structures. - /// - /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. - /// - /// # Typical errors - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. - receive-buffer-size: func() -> result; - set-receive-buffer-size: func(value: u64) -> result<_, error-code>; - send-buffer-size: func() -> result; - set-send-buffer-size: func(value: u64) -> result<_, error-code>; + /// The kernel buffer space reserved for sends/receives on this socket. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// I.e. after setting a value, reading the same setting back may return a different value. + /// + /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + receive-buffer-size: func() -> result; + set-receive-buffer-size: func(value: u64) -> result<_, error-code>; + send-buffer-size: func() -> result; + set-send-buffer-size: func(value: u64) -> result<_, error-code>; - /// Create a `pollable` which will resolve once the socket is ready for I/O. - /// - /// Note: this function is here for WASI Preview2 only. - /// It's planned to be removed when `future` is natively supported in Preview3. - subscribe: func() -> pollable; + /// Create a `pollable` which can be used to poll for, or block on, + /// completion of any of the asynchronous operations of this socket. + /// + /// When `finish-bind`, `finish-listen`, `finish-connect` or `accept` + /// return `error(would-block)`, this pollable can be used to wait for + /// their success or failure, after which the method can be retried. + /// + /// The pollable is not limited to the async operation that happens to be + /// in progress at the time of calling `subscribe` (if any). Theoretically, + /// `subscribe` only has to be called once per socket and can then be + /// (re)used for the remainder of the socket's lifetime. + /// + /// See + /// for a more information. + /// + /// Note: this function is here for WASI Preview2 only. + /// It's planned to be removed when `future` is natively supported in Preview3. + subscribe: func() -> pollable; - /// Initiate a graceful shutdown. - /// - /// - receive: the socket is not expecting to receive any more data from the peer. All subsequent read - /// operations on the `input-stream` associated with this socket will return an End Of Stream indication. - /// Any data still in the receive queue at time of calling `shutdown` will be discarded. - /// - send: the socket is not expecting to send any more data to the peer. All subsequent write - /// operations on the `output-stream` associated with this socket will return an error. - /// - both: same effect as receive & send combined. - /// - /// The shutdown function does not close (drop) the socket. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not in the Connection state. (ENOTCONN) - /// - /// # References - /// - - /// - - /// - - /// - - shutdown: func(shutdown-type: shutdown-type) -> result<_, error-code>; - } + /// Initiate a graceful shutdown. + /// + /// - `receive`: The socket is not expecting to receive any data from + /// the peer. The `input-stream` associated with this socket will be + /// closed. Any data still in the receive queue at time of calling + /// this method will be discarded. + /// - `send`: The socket has no more data to send to the peer. The `output-stream` + /// associated with this socket will be closed and a FIN packet will be sent. + /// - `both`: Same effect as `receive` & `send` combined. + /// + /// This function is idempotent. Shutting a down a direction more than once + /// has no effect and returns `ok`. + /// + /// The shutdown function does not close (drop) the socket. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) + /// + /// # References + /// - + /// - + /// - + /// - + shutdown: func(shutdown-type: shutdown-type) -> result<_, error-code>; + } } diff --git a/wit/deps/sockets/udp-create-socket.wit b/wit/deps/sockets/udp-create-socket.wit index e026359..0482d1f 100644 --- a/wit/deps/sockets/udp-create-socket.wit +++ b/wit/deps/sockets/udp-create-socket.wit @@ -1,26 +1,27 @@ interface udp-create-socket { - use network.{network, error-code, ip-address-family}; - use udp.{udp-socket}; + use network.{network, error-code, ip-address-family}; + use udp.{udp-socket}; - /// Create a new UDP socket. - /// - /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. - /// - /// This function does not require a network capability handle. This is considered to be safe because - /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` is called, - /// the socket is effectively an in-memory configuration object, unable to communicate with the outside world. - /// - /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. - /// - /// # Typical errors - /// - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) - /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) - /// - /// # References: - /// - - /// - - /// - - /// - - create-udp-socket: func(address-family: ip-address-family) -> result; + /// Create a new UDP socket. + /// + /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. + /// + /// This function does not require a network capability handle. This is considered to be safe because + /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind` is called, + /// the socket is effectively an in-memory configuration object, unable to communicate with the outside world. + /// + /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. + /// + /// # Typical errors + /// - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) + /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + /// + /// # References: + /// - + /// - + /// - + /// - + create-udp-socket: func(address-family: ip-address-family) -> result; } diff --git a/wit/deps/sockets/udp.wit b/wit/deps/sockets/udp.wit index 4c1a9f2..6ba380f 100644 --- a/wit/deps/sockets/udp.wit +++ b/wit/deps/sockets/udp.wit @@ -1,213 +1,266 @@ interface udp { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use network.{network, error-code, ip-socket-address, ip-address-family}; - - - record datagram { - data: list, // Theoretical max size: ~64 KiB. In practice, typically less than 1500 bytes. - remote-address: ip-socket-address, - - /// Possible future additions: - /// local-address: ip-socket-address, // IP_PKTINFO / IP_RECVDSTADDR / IPV6_PKTINFO - /// local-interface: u32, // IP_PKTINFO / IP_RECVIF - /// ttl: u8, // IP_RECVTTL - /// dscp: u6, // IP_RECVTOS - /// ecn: u2, // IP_RECVTOS - } - - - - /// A UDP socket handle. - resource udp-socket { - /// Bind the socket to a specific network on the provided IP address and port. - /// - /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which - /// network interface(s) to bind to. - /// If the TCP/UDP port is zero, the socket will be bound to a random free port. - /// - /// When a socket is not explicitly bound, the first invocation to connect will implicitly bind the socket. - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - /// # Typical `start` errors - /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) - /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors - /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) - /// - `address-in-use`: Address is already in use. (EADDRINUSE) - /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) - /// - `not-in-progress`: A `bind` operation is not in progress. - /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - start-bind: func(network: borrow, local-address: ip-socket-address) -> result<_, error-code>; - finish-bind: func() -> result<_, error-code>; - - /// Set the destination address. - /// - /// The local-address is updated based on the best network path to `remote-address`. - /// - /// When a destination address is set: - /// - all receive operations will only return datagrams sent from the provided `remote-address`. - /// - the `send` function can only be used to send to this destination. - /// - /// Note that this function does not generate any network traffic and the peer is not aware of this "connection". - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - /// # Typical `start` errors - /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) - /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) - /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) - /// - `invalid-argument`: The socket is already bound to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. - /// - /// # Typical `finish` errors - /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) - /// - `not-in-progress`: A `connect` operation is not in progress. - /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - start-connect: func(network: borrow, remote-address: ip-socket-address) -> result<_, error-code>; - finish-connect: func() -> result<_, error-code>; - - /// Receive messages on the socket. - /// - /// This function attempts to receive up to `max-results` datagrams on the socket without blocking. - /// The returned list may contain fewer elements than requested, but never more. - /// If `max-results` is 0, this function returns successfully with an empty list. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not bound to any local address. (EINVAL) - /// - `remote-unreachable`: The remote address is not reachable. (ECONNREFUSED, ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN) - /// - `would-block`: There is no pending data available to be read at the moment. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - /// - - /// - - /// - - /// - - receive: func(max-results: u64) -> result, error-code>; - - /// Send messages on the socket. - /// - /// This function attempts to send all provided `datagrams` on the socket without blocking and - /// returns how many messages were actually sent (or queued for sending). - /// - /// This function semantically behaves the same as iterating the `datagrams` list and sequentially - /// sending each individual datagram until either the end of the list has been reached or the first error occurred. - /// If at least one datagram has been sent successfully, this function never returns an error. - /// - /// If the input list is empty, the function returns `ok(0)`. - /// - /// The remote address option is required. To send a message to the "connected" peer, - /// call `remote-address` to get their address. - /// - /// # Typical errors - /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) - /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) - /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) - /// - `invalid-argument`: The socket is in "connected" mode and the `datagram.remote-address` does not match the address passed to `connect`. (EISCONN) - /// - `invalid-state`: The socket is not bound to any local address. Unlike POSIX, this function does not perform an implicit bind. - /// - `remote-unreachable`: The remote address is not reachable. (ECONNREFUSED, ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN) - /// - `datagram-too-large`: The datagram is too large. (EMSGSIZE) - /// - `would-block`: The send buffer is currently full. (EWOULDBLOCK, EAGAIN) - /// - /// # References - /// - - /// - - /// - - /// - - /// - - /// - - /// - - /// - - send: func(datagrams: list) -> result; - - /// Get the current bound address. - /// - /// POSIX mentions: - /// > If the socket has not been bound to a local name, the value - /// > stored in the object pointed to by `address` is unspecified. - /// - /// WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not bound to any local address. - /// - /// # References - /// - - /// - - /// - - /// - - local-address: func() -> result; - - /// Get the address set with `connect`. - /// - /// # Typical errors - /// - `invalid-state`: The socket is not connected to a remote address. (ENOTCONN) - /// - /// # References - /// - - /// - - /// - - /// - - remote-address: func() -> result; - - /// Whether this is a IPv4 or IPv6 socket. - /// - /// Equivalent to the SO_DOMAIN socket option. - address-family: func() -> ip-address-family; - - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; - - /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. - unicast-hop-limit: func() -> result; - set-unicast-hop-limit: func(value: u8) -> result<_, error-code>; - - /// The kernel buffer space reserved for sends/receives on this socket. - /// - /// Note #1: an implementation may choose to cap or round the buffer size when setting the value. - /// In other words, after setting a value, reading the same setting back may return a different value. - /// - /// Note #2: there is not necessarily a direct relationship between the kernel buffer size and the bytes of - /// actual data to be sent/received by the application, because the kernel might also use the buffer space - /// for internal metadata structures. - /// - /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. - receive-buffer-size: func() -> result; - set-receive-buffer-size: func(value: u64) -> result<_, error-code>; - send-buffer-size: func() -> result; - set-send-buffer-size: func(value: u64) -> result<_, error-code>; - - /// Create a `pollable` which will resolve once the socket is ready for I/O. - /// - /// Note: this function is here for WASI Preview2 only. - /// It's planned to be removed when `future` is natively supported in Preview3. - subscribe: func() -> pollable; - } + use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use network.{network, error-code, ip-socket-address, ip-address-family}; + + /// A received datagram. + record incoming-datagram { + /// The payload. + /// + /// Theoretical max size: ~64 KiB. In practice, typically less than 1500 bytes. + data: list, + + /// The source address. + /// + /// This field is guaranteed to match the remote address the stream was initialized with, if any. + /// + /// Equivalent to the `src_addr` out parameter of `recvfrom`. + remote-address: ip-socket-address, + } + + /// A datagram to be sent out. + record outgoing-datagram { + /// The payload. + data: list, + + /// The destination address. + /// + /// The requirements on this field depend on how the stream was initialized: + /// - with a remote address: this field must be None or match the stream's remote address exactly. + /// - without a remote address: this field is required. + /// + /// If this value is None, the send operation is equivalent to `send` in POSIX. Otherwise it is equivalent to `sendto`. + remote-address: option, + } + + + + /// A UDP socket handle. + resource udp-socket { + /// Bind the socket to a specific network on the provided IP address and port. + /// + /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which + /// network interface(s) to bind to. + /// If the port is zero, the socket will be bound to a random free port. + /// + /// # Typical errors + /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + /// - `invalid-state`: The socket is already bound. (EINVAL) + /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + /// - `address-in-use`: Address is already in use. (EADDRINUSE) + /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) + /// - `not-in-progress`: A `bind` operation is not in progress. + /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. + /// + /// # References + /// - + /// - + /// - + /// - + start-bind: func(network: borrow, local-address: ip-socket-address) -> result<_, error-code>; + finish-bind: func() -> result<_, error-code>; + + /// Set up inbound & outbound communication channels, optionally to a specific peer. + /// + /// This function only changes the local socket configuration and does not generate any network traffic. + /// On success, the `remote-address` of the socket is updated. The `local-address` may be updated as well, + /// based on the best network path to `remote-address`. + /// + /// When a `remote-address` is provided, the returned streams are limited to communicating with that specific peer: + /// - `send` can only be used to send to this destination. + /// - `receive` will only return datagrams sent from the provided `remote-address`. + /// + /// This method may be called multiple times on the same socket to change its association, but + /// only the most recently returned pair of streams will be operational. Implementations may trap if + /// the streams returned by a previous invocation haven't been dropped yet before calling `stream` again. + /// + /// The POSIX equivalent in pseudo-code is: + /// ```text + /// if (was previously connected) { + /// connect(s, AF_UNSPEC) + /// } + /// if (remote_address is Some) { + /// connect(s, remote_address) + /// } + /// ``` + /// + /// Unlike in POSIX, the socket must already be explicitly bound. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-state`: The socket is not bound. + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + /// - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `connection-refused`: The connection was refused. (ECONNREFUSED) + /// + /// # References + /// - + /// - + /// - + /// - + %stream: func(remote-address: option) -> result, error-code>; + + /// Get the current bound address. + /// + /// POSIX mentions: + /// > If the socket has not been bound to a local name, the value + /// > stored in the object pointed to by `address` is unspecified. + /// + /// WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not bound to any local address. + /// + /// # References + /// - + /// - + /// - + /// - + local-address: func() -> result; + + /// Get the address the socket is currently streaming to. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not streaming to a specific remote address. (ENOTCONN) + /// + /// # References + /// - + /// - + /// - + /// - + remote-address: func() -> result; + + /// Whether this is a IPv4 or IPv6 socket. + /// + /// Equivalent to the SO_DOMAIN socket option. + address-family: func() -> ip-address-family; + + /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The TTL value must be 1 or higher. + unicast-hop-limit: func() -> result; + set-unicast-hop-limit: func(value: u8) -> result<_, error-code>; + + /// The kernel buffer space reserved for sends/receives on this socket. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently clamped and/or rounded. + /// I.e. after setting a value, reading the same setting back may return a different value. + /// + /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + receive-buffer-size: func() -> result; + set-receive-buffer-size: func(value: u64) -> result<_, error-code>; + send-buffer-size: func() -> result; + set-send-buffer-size: func(value: u64) -> result<_, error-code>; + + /// Create a `pollable` which will resolve once the socket is ready for I/O. + /// + /// Note: this function is here for WASI Preview2 only. + /// It's planned to be removed when `future` is natively supported in Preview3. + subscribe: func() -> pollable; + } + + resource incoming-datagram-stream { + /// Receive messages on the socket. + /// + /// This function attempts to receive up to `max-results` datagrams on the socket without blocking. + /// The returned list may contain fewer elements than requested, but never more. + /// + /// This function returns successfully with an empty list when either: + /// - `max-results` is 0, or: + /// - `max-results` is greater than 0, but no results are immediately available. + /// This function never returns `error(would-block)`. + /// + /// # Typical errors + /// - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `connection-refused`: The connection was refused. (ECONNREFUSED) + /// + /// # References + /// - + /// - + /// - + /// - + /// - + /// - + /// - + /// - + receive: func(max-results: u64) -> result, error-code>; + + /// Create a `pollable` which will resolve once the stream is ready to receive again. + /// + /// Note: this function is here for WASI Preview2 only. + /// It's planned to be removed when `future` is natively supported in Preview3. + subscribe: func() -> pollable; + } + + resource outgoing-datagram-stream { + /// Check readiness for sending. This function never blocks. + /// + /// Returns the number of datagrams permitted for the next call to `send`, + /// or an error. Calling `send` with more datagrams than this function has + /// permitted will trap. + /// + /// When this function returns ok(0), the `subscribe` pollable will + /// become ready when this function will report at least ok(1), or an + /// error. + /// + /// Never returns `would-block`. + check-send: func() -> result; + + /// Send messages on the socket. + /// + /// This function attempts to send all provided `datagrams` on the socket without blocking and + /// returns how many messages were actually sent (or queued for sending). This function never + /// returns `error(would-block)`. If none of the datagrams were able to be sent, `ok(0)` is returned. + /// + /// This function semantically behaves the same as iterating the `datagrams` list and sequentially + /// sending each individual datagram until either the end of the list has been reached or the first error occurred. + /// If at least one datagram has been sent successfully, this function never returns an error. + /// + /// If the input list is empty, the function returns `ok(0)`. + /// + /// Each call to `send` must be permitted by a preceding `check-send`. Implementations must trap if + /// either `check-send` was not called or `datagrams` contains more items than `check-send` permitted. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The socket is in "connected" mode and `remote-address` is `some` value that does not match the address passed to `stream`. (EISCONN) + /// - `invalid-argument`: The socket is not "connected" and no value for `remote-address` was provided. (EDESTADDRREQ) + /// - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `connection-refused`: The connection was refused. (ECONNREFUSED) + /// - `datagram-too-large`: The datagram is too large. (EMSGSIZE) + /// + /// # References + /// - + /// - + /// - + /// - + /// - + /// - + /// - + /// - + send: func(datagrams: list) -> result; + + /// Create a `pollable` which will resolve once the stream is ready to send again. + /// + /// Note: this function is here for WASI Preview2 only. + /// It's planned to be removed when `future` is natively supported in Preview3. + subscribe: func() -> pollable; + } } diff --git a/wit/deps/sockets/world.wit b/wit/deps/sockets/world.wit index d16530c..8588cc6 100644 --- a/wit/deps/sockets/world.wit +++ b/wit/deps/sockets/world.wit @@ -1,4 +1,4 @@ -package wasi:sockets@0.2.0-rc-2023-10-18; +package wasi:sockets@0.2.0-rc-2024-01-16; world imports { import instance-network; diff --git a/wit/virt.wit b/wit/virt.wit index 64cbca0..5a7611c 100644 --- a/wit/virt.wit +++ b/wit/virt.wit @@ -37,12 +37,12 @@ world virtual-adapter { export wasi:http/types@0.2.0-rc-2023-10-18; import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp@0.2.0-rc-2023-10-18; - export wasi:sockets/tcp@0.2.0-rc-2023-10-18; - import wasi:sockets/udp@0.2.0-rc-2023-10-18; - export wasi:sockets/udp@0.2.0-rc-2023-10-18; + import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp@0.2.0-rc-2024-01-16; + export wasi:sockets/tcp@0.2.0-rc-2024-01-16; + import wasi:sockets/udp@0.2.0-rc-2024-01-16; + export wasi:sockets/udp@0.2.0-rc-2024-01-16; } world virtual-base { @@ -61,12 +61,12 @@ world virtual-io { // where there is an intersection of // streams + poll world virtual-io-sockets { - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp@0.2.0-rc-2023-10-18; - export wasi:sockets/tcp@0.2.0-rc-2023-10-18; - import wasi:sockets/udp@0.2.0-rc-2023-10-18; - export wasi:sockets/udp@0.2.0-rc-2023-10-18; + import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp@0.2.0-rc-2024-01-16; + export wasi:sockets/tcp@0.2.0-rc-2024-01-16; + import wasi:sockets/udp@0.2.0-rc-2024-01-16; + export wasi:sockets/udp@0.2.0-rc-2024-01-16; } world virtual-io-clocks { @@ -130,20 +130,20 @@ world virtual-random { } world virtual-sockets { - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp@0.2.0-rc-2023-10-18; - export wasi:sockets/tcp@0.2.0-rc-2023-10-18; - import wasi:sockets/udp@0.2.0-rc-2023-10-18; - export wasi:sockets/udp@0.2.0-rc-2023-10-18; - import wasi:sockets/instance-network@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2023-10-18; - import wasi:sockets/udp-create-socket@0.2.0-rc-2023-10-18; - export wasi:sockets/instance-network@0.2.0-rc-2023-10-18; - export wasi:sockets/tcp-create-socket@0.2.0-rc-2023-10-18; - export wasi:sockets/udp-create-socket@0.2.0-rc-2023-10-18; - import wasi:sockets/network@0.2.0-rc-2023-10-18; - export wasi:sockets/network@0.2.0-rc-2023-10-18; + import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp@0.2.0-rc-2024-01-16; + export wasi:sockets/tcp@0.2.0-rc-2024-01-16; + import wasi:sockets/udp@0.2.0-rc-2024-01-16; + export wasi:sockets/udp@0.2.0-rc-2024-01-16; + import wasi:sockets/instance-network@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; + import wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; + export wasi:sockets/instance-network@0.2.0-rc-2024-01-16; + export wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; + export wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; + import wasi:sockets/network@0.2.0-rc-2024-01-16; + export wasi:sockets/network@0.2.0-rc-2024-01-16; } world virtual-http { @@ -164,13 +164,13 @@ world virt-test { import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; import wasi:filesystem/types@0.2.0-rc-2023-11-10; - import wasi:sockets/instance-network@0.2.0-rc-2023-10-18; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; - import wasi:sockets/network@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2023-10-18; - import wasi:sockets/tcp@0.2.0-rc-2023-10-18; - import wasi:sockets/udp-create-socket@0.2.0-rc-2023-10-18; - import wasi:sockets/udp@0.2.0-rc-2023-10-18; + import wasi:sockets/instance-network@0.2.0-rc-2024-01-16; + import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; + import wasi:sockets/network@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; + import wasi:sockets/tcp@0.2.0-rc-2024-01-16; + import wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; + import wasi:sockets/udp@0.2.0-rc-2024-01-16; import wasi:random/random@0.2.0-rc-2023-11-10; import wasi:random/insecure@0.2.0-rc-2023-11-10; import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; From a0dfc288206405ac8e2476ec0e8fbc7ae0c81776 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 23 Jan 2024 21:27:43 -0800 Subject: [PATCH 02/11] Update to wasi:cli@0.2.0-rc-2024-01-16. --- lib/virtual_adapter.debug.wasm | Bin 265048 -> 265048 bytes lib/virtual_adapter.wasm | Bin 232649 -> 232649 bytes src/virt_deny/exit.rs | 2 +- src/virt_env.rs | 4 +- src/virt_io/stdio.rs | 32 +++++------ wit/deps/cli/command.wit | 2 +- wit/deps/cli/imports.wit | 2 +- wit/deps/http/proxy.wit | 6 +-- wit/virt.wit | 96 ++++++++++++++++----------------- 9 files changed, 72 insertions(+), 72 deletions(-) diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index dd559ea6f95597bc4eb85de8aa86f1823328000d..353e5fe905fc003bb04be26d143de2e80e8e9d3a 100755 GIT binary patch delta 984 zcmZ8gOGs2<6!xAo>K%t_hEYdIuNCF^NXu~^`AE%08+GQ6i!vg@2%#bZ7lAOjun1cu z;U!NCqo5WojUn&GMYL+ufHUJbYNd%`52Gb#?Xoz?@RrRsQMVY)JDdeY6Ig_wZoWhvd1^oM3d3dpc)JQ zZpLlDpYc?ni!m1PNj}iQm0Jul#(J=xla5d)V>raa;xnPp z39IUEa@0(YDhFSX_7zm6hz{R|E9P(+Y`Qo?z11)zxdY_VF)G|iH*`EL+(oZ-?2+op z8W?9*Tn<>|pou7Ys8)j!Nl$5TjrRWmhqCq|_QzD9T zHTsw-T!RKzAR^;?a-h;y8tUln034Or&PqX&hO^MkF{S)JpGpONTh1qst%6r7D(O=O zIxWp+{>HSC$>;w$wN=@aDjInVZW>&JXVOzdS{Tn!tVg8nXj3Y=#++Vfr;f5WbX`aBK=V5GN>5Hl*%KO%;vI?YL{WZ{ zd20x#C#-d);wAjaWM>K6n6xL6H<@BdY~{$CB(^izN+Q1m@}`itp3bKVk*O3H^P}L` VL$)*uIh&S&#!Sd<&ZTiN_!lTsMPdK| delta 1267 zcmY*ZO-NKx7_dJKm^D9evvvshx>g7LLOX8Z_?k9%*dnp1 zUX0`EmA?vBFsAk%!7CttYs2k*Lnj%m;RVb*H%eMtOAqSSpgIa}rTBN3o z5g%%
    =uJyxKVc3Y+NKBF?}SfL3>bHv@rJ#sffwUFBEwu=8!^YJP@Z-YOdhjDMs zn;!Oh(30LYyv4}ok(S>4DRXZVR~ z+2{F((#qgi4Li;86iGT6vusUR%bHVwl=k((#o(*w^ny%A^&$NkW6iNy;#|W0f&HUc1LANiT_ulut_xrOjQ!eQ=3`zsSQq!+Q{OIdeF%BD#k|b0E0%2!Jy`hGkZoho@tuM z`mQ-;zF@Nr=v@xI>G9y0kBhC`Yo&3sG!8?4n}JyNMdh?#}=QY&#F>UFfyly_D3k zira2kZ#$>w+pg(OTTQyVRD+fAm?Q_?S1mqHT%K6)OKnwb3#N&NE37nb;o(NI{b t5%2v`SQ2+H(^4K`L=taZHmuiA?GZ^8nWK?>@!N>hwEkJlvR)~z{srW;a0LJW delta 1289 zcmZ8hT}YE*6yAG2=cd@yR?dq`Lql6`xu5S7)cMmz1cfE)x~RxDx3PWBn#c0OYMG-+43JQw|x^O?xUC|Fg*X6+P`M$b)&Uwx`&w0;#-gkA;wz_D` zd=wU+%j0!*%GnL^r9w02*DL+NR*M&S(BiajB~-;C)2^xMiTI?cn#V)58$pjPPT&ug zZtGUUuKB!hWIL?k4zLUUe&7wi4BRLOfKSUl;03t{_>+79xLVN_dlcP&NzrqkD0-7b7JgeKdv>;K#;wseZBf-06<0k~TccQA}C{M#$ zCU+*q2)H^fg$NCBE-3~P*q9R6VJxOZ0>+-SIIkJ%Tv|MBhSj$&KG&f9!LqcMCnMAZ zUuW6p;h-y?=5 z{81W&?oOTw(|lCVsu9uY$TQPMM=fd$&xz=ulJ$2fvSz zU2S?nb!`YzHs~eF?d6$gVhG%^Jn8$`g5_w{0v3!jK3pJuLGKg{1FtQTzM%Ju`dL(S ziLOj()i^OC{ep3ARKkbC&qpOZKmI)`;d^2CnADA&%VQE=H7|`x`@!Ulj0hSEbO#Nk VZv-WL7yM?E`S+cx4JW0n{1+?gM?nAp diff --git a/src/virt_deny/exit.rs b/src/virt_deny/exit.rs index a79c6f5..4396c4b 100644 --- a/src/virt_deny/exit.rs +++ b/src/virt_deny/exit.rs @@ -12,7 +12,7 @@ static WASI_EXIT_FNS: OnceLock> = OnceLock: fn get_wasi_exit_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> { WASI_EXIT_FNS.get_or_init(|| { Vec::from([( - "wasi:cli/exit@0.2.0-rc-2023-12-05#exit", + "wasi:cli/exit@0.2.0-rc-2024-01-16#exit", vec![ValType::I32], vec![], )]) diff --git a/src/virt_env.rs b/src/virt_env.rs index 491b784..0776b70 100644 --- a/src/virt_env.rs +++ b/src/virt_env.rs @@ -222,7 +222,7 @@ pub(crate) fn stub_env_virt(module: &mut Module) -> Result<()> { module.replace_imported_func( module .imports - .get_func("wasi:cli/environment@0.2.0-rc-2023-12-05", fn_name)?, + .get_func("wasi:cli/environment@0.2.0-rc-2024-01-16", fn_name)?, |(body, _)| { body.unreachable(); }, @@ -240,7 +240,7 @@ pub(crate) fn strip_env_virt(module: &mut Module) -> Result<()> { for fn_name in WASI_ENV_FNS { if let Ok(fid) = module.exports.get_func(format!( - "wasi:cli/environment@0.2.0-rc-2023-12-05#{fn_name}" + "wasi:cli/environment@0.2.0-rc-2024-01-16#{fn_name}" )) { module.replace_exported_func(fid, |(body, _)| { body.unreachable(); diff --git a/src/virt_io/stdio.rs b/src/virt_io/stdio.rs index 4a9bfc7..6a1b08a 100644 --- a/src/virt_io/stdio.rs +++ b/src/virt_io/stdio.rs @@ -6,42 +6,42 @@ use super::StubRequirement; /// Imports exposed by WASI for STDIO functionality which are allowed to be missing const WASI_STDIO_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ ( - "wasi:cli/stdin@0.2.0-rc-2023-12-05", + "wasi:cli/stdin@0.2.0-rc-2024-01-16", "get-stdin", &StubRequirement::Optional, ), ( - "wasi:cli/stdout@0.2.0-rc-2023-12-05", + "wasi:cli/stdout@0.2.0-rc-2024-01-16", "get-stdout", &StubRequirement::Optional, ), ( - "wasi:cli/stderr@0.2.0-rc-2023-12-05", + "wasi:cli/stderr@0.2.0-rc-2024-01-16", "get-stderr", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05", + "wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16", "get-terminal-stdin", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05", + "wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16", "get-terminal-stdout", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05", + "wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16", "get-terminal-stderr", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-input@0.2.0-rc-2023-12-05", + "wasi:cli/terminal-input@0.2.0-rc-2024-01-16", "drop-terminal-input", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-output@0.2.0-rc-2023-12-05", + "wasi:cli/terminal-output@0.2.0-rc-2024-01-16", "drop-terminal-output", &StubRequirement::Optional, ), @@ -72,14 +72,14 @@ pub(crate) fn stub_stdio_virt(module: &mut Module) -> Result<()> { /// Exported functions related to STDIO const WASI_STDIO_EXPORTS: [&str; 8] = [ - "wasi:cli/stdin@0.2.0-rc-2023-12-05#get-stdin", - "wasi:cli/stdout@0.2.0-rc-2023-12-05#get-stdout", - "wasi:cli/stderr@0.2.0-rc-2023-12-05#get-stderr", - "wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05#get-terminal-stdin", - "wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05#get-terminal-stdout", - "wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05#get-terminal-stderr", - "wasi:cli/terminal-input@0.2.0-rc-2023-12-05#[dtor]terminal-input", - "wasi:cli/terminal-output@0.2.0-rc-2023-12-05#[dtor]terminal-output", + "wasi:cli/stdin@0.2.0-rc-2024-01-16#get-stdin", + "wasi:cli/stdout@0.2.0-rc-2024-01-16#get-stdout", + "wasi:cli/stderr@0.2.0-rc-2024-01-16#get-stderr", + "wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16#get-terminal-stdin", + "wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16#get-terminal-stdout", + "wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16#get-terminal-stderr", + "wasi:cli/terminal-input@0.2.0-rc-2024-01-16#[dtor]terminal-input", + "wasi:cli/terminal-output@0.2.0-rc-2024-01-16#[dtor]terminal-output", ]; /// Strip exported WASI functions that implement standard I/O (stdin, stdout, etc) access diff --git a/wit/deps/cli/command.wit b/wit/deps/cli/command.wit index cc82ae5..a988916 100644 --- a/wit/deps/cli/command.wit +++ b/wit/deps/cli/command.wit @@ -1,4 +1,4 @@ -package wasi:cli@0.2.0-rc-2023-12-05; +package wasi:cli@0.2.0-rc-2024-01-16; world command { include imports; diff --git a/wit/deps/cli/imports.wit b/wit/deps/cli/imports.wit index 3606a99..8ce1abe 100644 --- a/wit/deps/cli/imports.wit +++ b/wit/deps/cli/imports.wit @@ -1,4 +1,4 @@ -package wasi:cli@0.2.0-rc-2023-12-05; +package wasi:cli@0.2.0-rc-2024-01-16; world imports { include wasi:clocks/imports@0.2.0-rc-2023-11-10; diff --git a/wit/deps/http/proxy.wit b/wit/deps/http/proxy.wit index 20d4a43..8906da1 100644 --- a/wit/deps/http/proxy.wit +++ b/wit/deps/http/proxy.wit @@ -12,14 +12,14 @@ world proxy { // Proxies have standard output and error streams which are expected to // terminate in a developer-facing console provided by the host. - import wasi:cli/stdout@0.2.0-rc-2023-12-05; - import wasi:cli/stderr@0.2.0-rc-2023-12-05; + import wasi:cli/stdout@0.2.0-rc-2024-01-16; + import wasi:cli/stderr@0.2.0-rc-2024-01-16; // TODO: this is a temporary workaround until component tooling is able to // gracefully handle the absence of stdin. Hosts must return an eof stream // for this import, which is what wasi-libc + tooling will do automatically // when this import is properly removed. - import wasi:cli/stdin@0.2.0-rc-2023-12-05; + import wasi:cli/stdin@0.2.0-rc-2024-01-16; // This is the default handler to use when user code simply wants to make an // HTTP request (e.g., via `fetch()`). diff --git a/wit/virt.wit b/wit/virt.wit index 5a7611c..81de6bc 100644 --- a/wit/virt.wit +++ b/wit/virt.wit @@ -3,7 +3,7 @@ package local:virt; // in future this should be defined as a union world of the various // virtual subsystems, when union syntax lands world virtual-adapter { - import wasi:cli/environment@0.2.0-rc-2023-12-05; + import wasi:cli/environment@0.2.0-rc-2024-01-16; import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; import wasi:filesystem/types@0.2.0-rc-2023-11-10; import wasi:io/error@0.2.0-rc-2023-11-10; @@ -12,25 +12,25 @@ world virtual-adapter { export wasi:io/streams@0.2.0-rc-2023-11-10; import wasi:io/poll@0.2.0-rc-2023-11-10; export wasi:io/poll@0.2.0-rc-2023-11-10; - export wasi:cli/environment@0.2.0-rc-2023-12-05; + export wasi:cli/environment@0.2.0-rc-2024-01-16; export wasi:filesystem/types@0.2.0-rc-2023-11-10; export wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:cli/stdin@0.2.0-rc-2023-12-05; - import wasi:cli/stdout@0.2.0-rc-2023-12-05; - import wasi:cli/stderr@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-input@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-output@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05; - export wasi:cli/stdin@0.2.0-rc-2023-12-05; - export wasi:cli/stdout@0.2.0-rc-2023-12-05; - export wasi:cli/stderr@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-input@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-output@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05; + import wasi:cli/stdin@0.2.0-rc-2024-01-16; + import wasi:cli/stdout@0.2.0-rc-2024-01-16; + import wasi:cli/stderr@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; + export wasi:cli/stdin@0.2.0-rc-2024-01-16; + export wasi:cli/stdout@0.2.0-rc-2024-01-16; + export wasi:cli/stderr@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-input@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-output@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; export wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; import wasi:http/types@0.2.0-rc-2023-10-18; @@ -89,28 +89,28 @@ world virtual-fs { } world virtual-stdio { - import wasi:cli/stdin@0.2.0-rc-2023-12-05; - import wasi:cli/stdout@0.2.0-rc-2023-12-05; - import wasi:cli/stderr@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-input@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-output@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05; - export wasi:cli/stdin@0.2.0-rc-2023-12-05; - export wasi:cli/stdout@0.2.0-rc-2023-12-05; - export wasi:cli/stderr@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-input@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-output@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05; - export wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05; + import wasi:cli/stdin@0.2.0-rc-2024-01-16; + import wasi:cli/stdout@0.2.0-rc-2024-01-16; + import wasi:cli/stderr@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; + export wasi:cli/stdin@0.2.0-rc-2024-01-16; + export wasi:cli/stdout@0.2.0-rc-2024-01-16; + export wasi:cli/stderr@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-input@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-output@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; + export wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; } // remaining subsystems world virtual-env { - import wasi:cli/environment@0.2.0-rc-2023-12-05; - export wasi:cli/environment@0.2.0-rc-2023-12-05; + import wasi:cli/environment@0.2.0-rc-2024-01-16; + export wasi:cli/environment@0.2.0-rc-2024-01-16; } world virtual-clocks { @@ -156,8 +156,8 @@ world virtual-http { } world virtual-exit { - import wasi:cli/exit@0.2.0-rc-2023-12-05; - export wasi:cli/exit@0.2.0-rc-2023-12-05; + import wasi:cli/exit@0.2.0-rc-2024-01-16; + export wasi:cli/exit@0.2.0-rc-2024-01-16; } world virt-test { @@ -176,17 +176,17 @@ world virt-test { import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; import wasi:io/poll@0.2.0-rc-2023-11-10; import wasi:io/streams@0.2.0-rc-2023-11-10; - import wasi:cli/environment@0.2.0-rc-2023-12-05; + import wasi:cli/environment@0.2.0-rc-2024-01-16; import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:cli/exit@0.2.0-rc-2023-12-05; - import wasi:cli/stdin@0.2.0-rc-2023-12-05; - import wasi:cli/stdout@0.2.0-rc-2023-12-05; - import wasi:cli/stderr@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-input@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-output@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdin@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stdout@0.2.0-rc-2023-12-05; - import wasi:cli/terminal-stderr@0.2.0-rc-2023-12-05; + import wasi:cli/exit@0.2.0-rc-2024-01-16; + import wasi:cli/stdin@0.2.0-rc-2024-01-16; + import wasi:cli/stdout@0.2.0-rc-2024-01-16; + import wasi:cli/stderr@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; + import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; export test-get-env: func() -> list>; export test-file-read: func(path: string) -> string; From 5d1272b296889ca84c61e76fa92d753804aa1370 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 31 Jan 2024 16:45:16 -0500 Subject: [PATCH 03/11] latest wit updates --- Cargo.lock | 70 +-- Cargo.toml | 4 +- lib/virtual_adapter.debug.wasm | Bin 265048 -> 234119 bytes lib/virtual_adapter.wasm | Bin 232649 -> 199068 bytes lib/wasi_snapshot_preview1.reactor.wasm | Bin 97330 -> 96731 bytes src/lib.rs | 1 + src/virt_deny/clocks.rs | 12 +- src/virt_deny/exit.rs | 9 +- src/virt_deny/http.rs | 84 ++-- src/virt_deny/random.rs | 14 +- src/virt_deny/sockets.rs | 116 ++--- src/virt_env.rs | 9 +- src/virt_io/clocks.rs | 16 +- src/virt_io/filesystem.rs | 124 ++--- src/virt_io/http.rs | 80 ++-- src/virt_io/io.rs | 94 ++-- src/virt_io/sockets.rs | 216 ++++----- src/virt_io/stdio.rs | 32 +- tests/cases/fs-nested-dir-read.toml | 4 +- virtual-adapter/src/io.rs | 417 +++++++++++++--- virtual-adapter/src/lib.rs | 28 +- wit/deps/cli/command.wit | 2 +- wit/deps/cli/imports.wit | 12 +- wit/deps/cli/stdio.wit | 6 +- wit/deps/clocks/monotonic-clock.wit | 4 +- wit/deps/clocks/wall-clock.wit | 2 +- wit/deps/clocks/world.wit | 2 +- wit/deps/filesystem/preopens.wit | 2 +- wit/deps/filesystem/types.wit | 6 +- wit/deps/filesystem/world.wit | 2 +- wit/deps/http/handler.wit | 43 ++ wit/deps/http/incoming-handler.wit | 24 - wit/deps/http/outgoing-handler.wit | 20 - wit/deps/http/proxy.wit | 47 +- wit/deps/http/types.wit | 610 +++++++++++++++++++----- wit/deps/io/error.wit | 2 +- wit/deps/io/poll.wit | 2 +- wit/deps/io/streams.wit | 2 +- wit/deps/io/world.wit | 2 +- wit/deps/random/insecure-seed.wit | 2 +- wit/deps/random/insecure.wit | 2 +- wit/deps/random/random.wit | 2 +- wit/deps/random/world.wit | 2 +- wit/deps/sockets/ip-name-lookup.wit | 2 +- wit/deps/sockets/tcp.wit | 6 +- wit/deps/sockets/udp.wit | 2 +- wit/deps/sockets/world.wit | 2 +- wit/virt.wit | 276 +++++------ 48 files changed, 1530 insertions(+), 886 deletions(-) create mode 100644 wit/deps/http/handler.wit delete mode 100644 wit/deps/http/incoming-handler.wit delete mode 100644 wit/deps/http/outgoing-handler.wit diff --git a/Cargo.lock b/Cargo.lock index 371dded..3e17b50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2054,11 +2054,20 @@ dependencies = [ "wasmparser 0.119.0", ] +[[package]] +name = "wasm-encoder" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e09bca7d6388637d27fb5edbeab11f56bfabcef8743c55ae34370e1e5030a071" +dependencies = [ + "leb128", +] + [[package]] name = "wasm-metadata" -version = "0.10.15" +version = "0.10.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818931c85b1d197909699d36c509fa89550ccfa0d66932ba3c1726faddb4d0c7" +checksum = "c853d3809fc9fccf3bc0ad63f4f51d8eefad0bacf88f957aa991c1d9b88b016e" dependencies = [ "anyhow", "indexmap 2.0.0", @@ -2066,8 +2075,8 @@ dependencies = [ "serde_derive", "serde_json", "spdx", - "wasm-encoder 0.39.0", - "wasmparser 0.119.0", + "wasm-encoder 0.41.0", + "wasmparser 0.121.0", ] [[package]] @@ -2137,6 +2146,17 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.121.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953cf6a7606ab31382cb1caa5ae403e77ba70c7f8e12eeda167e7040d42bfda8" +dependencies = [ + "bitflags 2.4.2", + "indexmap 2.0.0", + "semver", +] + [[package]] name = "wasmprinter" version = "0.2.76" @@ -2772,9 +2792,8 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b76f1d099678b4f69402a421e888bbe71bf20320c2f3f3565d0e7484dbe5bc20" +version = "0.17.0" +source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" dependencies = [ "bitflags 2.4.2", "wit-bindgen-rust-macro", @@ -2782,33 +2801,30 @@ dependencies = [ [[package]] name = "wit-bindgen-core" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75d55e1a488af2981fb0edac80d8d20a51ac36897a1bdef4abde33c29c1b6d0d" +version = "0.17.0" +source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" dependencies = [ "anyhow", - "wit-component 0.18.2", + "wit-component 0.20.1", "wit-parser", ] [[package]] name = "wit-bindgen-rust" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01ff9cae7bf5736750d94d91eb8a49f5e3a04aff1d1a3218287d9b2964510f8" +version = "0.17.0" +source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" dependencies = [ "anyhow", "heck 0.4.1", "wasm-metadata", "wit-bindgen-core", - "wit-component 0.18.2", + "wit-component 0.20.1", ] [[package]] name = "wit-bindgen-rust-macro" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804a98e2538393d47aa7da65a7348116d6ff403b426665152b70a168c0146d49" +version = "0.17.0" +source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" dependencies = [ "anyhow", "proc-macro2", @@ -2816,14 +2832,14 @@ dependencies = [ "syn 2.0.37", "wit-bindgen-core", "wit-bindgen-rust", - "wit-component 0.18.2", + "wit-component 0.20.1", ] [[package]] name = "wit-component" -version = "0.18.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a35a2a9992898c9d27f1664001860595a4bc99d32dd3599d547412e17d7e2" +checksum = "429e3c06fba3a7566aab724ae3ffff3152ede5399d44789e7dd11f5421292859" dependencies = [ "anyhow", "bitflags 2.4.2", @@ -2832,17 +2848,17 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder 0.38.1", + "wasm-encoder 0.39.0", "wasm-metadata", - "wasmparser 0.118.1", + "wasmparser 0.119.0", "wit-parser", ] [[package]] name = "wit-component" -version = "0.19.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "429e3c06fba3a7566aab724ae3ffff3152ede5399d44789e7dd11f5421292859" +checksum = "331de496d439010797c17637d8002712b9b69110f1669164c09dfa226ad277bb" dependencies = [ "anyhow", "bitflags 2.4.2", @@ -2851,9 +2867,9 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder 0.39.0", + "wasm-encoder 0.41.0", "wasm-metadata", - "wasmparser 0.119.0", + "wasmparser 0.121.0", "wit-parser", ] diff --git a/Cargo.toml b/Cargo.toml index 78eae1e..0452aff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ walrus = "0.20.3" wasm-compose = "0.5.0" wasm-metadata = "0.10.15" wasm-opt = "0.114.1" -wit-component = "0.19.1" +wit-component = "0.19.0" [build-dependencies] anyhow = "1" @@ -53,4 +53,4 @@ wasmparser = "0.119.0" [workspace.dependencies] anyhow = "1" -wit-bindgen = "0.16.0" +wit-bindgen = { git = "https://github.com/guybedford/wit-bindgen", rev = "9d72cad91230c456c12286d0f49476caa1b5659c" } diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index 353e5fe905fc003bb04be26d143de2e80e8e9d3a..e30c053a18246acd405d69e0bd06ebdea2eca90d 100755 GIT binary patch literal 234119 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%0DrIxUH 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 IItP0Czi!829RL6T literal 265048 zcmeFa3%p%dRqwwZd!N@nCs}FIav%ZL-VK^+P8+o*v5nWP+)7))3xDO~#lQHGkOZ2O zH19&WSDUn?rC@>bPzw~PSZ#$?c@(TrAz;CR6$%tASfxURil9|di&Xmm{>Geht+n^r z=VYG;sQ3PxCVTC*)*N%pF~@t3Id`=E@WpWyMe*?@e{Op8=+XG-a})bF)@6J&dT!)y zMLfQYuT5S$%IC0s>Z;*xsI}g{?78t}G+E}K`w#AnmUpa;fGsa?xeMBd9%x{I`5Xyv zah+af*bTW`x^eXAWf3^5&&JWqE)&||#%p#7((Vc0c`|10!ox5I4<KXl~hU$p)3?sInUKkM+3L%X(Le0b}IGk@^R4O549O#R@7AN--IANYZ(AK37O zpF6bc@cv5&S}_?3#hdhN&Oeyt*60{!5O$VE^uYFPM7X{+%z5lC!%o*|B%`Sx0sqx_I}#?R%$q z6P&w{I(upZW83(|Zje1K=7-*@ZdlLXy=(8z!%?!X3ol50VE^8|UATBUpVr-8uWf(c z-d(*&%sp8%X;h!BMNoV9z8(9aW}x;DbdBoyyZ7!o{Nlq$c3s?m_QXb$-NW0t>+p_4 zyAK@Me<(^$AAk$jRLyrD+JE5Z-JAwKOwTY7gW&P_9zZojQiq6m=kSr8aA?;wd6pS_ z!7j1C9!HIKziS14<yD}1A6`?M=m+EYwF0M?F0db;FUoY*1825xqw4)3^V*TqD5gAA<}Qh9myI_k{rmk>MRau0}3X{lz==pup` ziT6OHo*j(D1225AVLh=+no8jg`gfw+37VT@Yidhw#tdKsjjN3AdYhkVVNKMW4@NaB zB?ob)VVGBPtXHGX1lQxe&P}c!*})uI|TH4xKaQ;9W8xcb3jwjmbTj zd2#t1aOTD4Yi6hvnJo?Ubr1_u+MyYu z8C2UKP)gF2P;AB*pd5P`xeMO>Sf`hfyFtxMDb`|fNmt15&qwJmCafvtscQ&ldU^8M zxw)BTZBR9ycT33(=ED5Wg_<$(-wcR@3Dx(V6tS9=&WGSNyRSJbNf(@md8whARkZMF z2DJ1{i?eMK%7+(`?IbknO}A-DYsfu|md$5K-&2JwqWEl686_vp>prf6WaBB-o5u z#%S)*ltvA1t0-|MvBQo%Q(o^n%{@1qy5_FIaS(hQx*!NH%kRzN+z?9T)IFAR>0ln9 z>gKFAoSF_9geYZL)s2u5W$J(JI<%jtb)Y4$9}e2B8&Em2I>g%A$Uv}5@39;9;RAbj z@7NVBA7q?QISG0JmdnZ?X6azpk;7;0J}|XU`Ov-l_wTvnK$mv&OQpSOb&SmZy)R_- zXXj2XNvApwH=Qrs6+M8MhS5!3YbS%_*pq(lfgDgw+)`5jyKmQ#7wtdPy@2A!TwBFA z1?69j<~_(V&)Xj*)U6}tzFn8Hw&f@qHRnspGMy2?bza zj;_J+*aSd>AyjI$8X$+z-rW>m?285i({EfJpLxM4Eolv%?K^htIzSk-zOOj)Vn036 zQyNl%i;@LT6bqaz+m>=M5S)G!b!gYc`?X*l1Z*Hc{U(a#BS&3|90nX$KYW6GK7aeg zyZ7R54TMkWU00;l%D+cw>UrCD?Ag2j1yhH2|F2!q&_EDNlTm}XXV&NjdOAP$CKS$xuees}D@gk}1{sMl{YdZ_2X4K}x>zf;5PqWuTp<%@R@ zic&ufD3mHVgW=L|7O5QAB@uYuCC`8Uu0u|y1|!sLv)B*f!e{X?3pEQsZnjyR0d6qN z`psg^J0D0a%b2Cc35PGb1|%&nf{BLqx=&I$Y^t{ zIX2uJ9bGxL@^O!QTojLt4mZadD*)2apN9QywZ_NObaFCze3B%SPgtF62-~NBuyG);1K?cqv5e(UQX@*WFpZQ{g=i`GREyyX`1N&cqL6H`45N@&nG9J z{N$92bb?0yzsV#{Ciw$B+$T-^V|QbcZlYu?8f!*r1aacgmGS5)(df!%96u>u3AB`( z@d~<#l14K=5T9{IGmWDaLyu37#>KH?C!*HTsJQm4?(;5v4qtiE`{SXDi4+gLIEhkf zltF#>{xq35u>J61oWWn%z8Cc$-I{Fn<+vv;c0OHo#Pwq5+mdZNwm)z8FC5r^_{c9T z7|QL*#(A}^YNr1n*}A~~D;V!h&K|h;dg1l^lK-}VzUvU~NL&G=-`df?cH3xfmEF-F zCT=0ezmGun%Ugs7JdWPq-C~x_BcX*hk9;86T2iCCY`bq?KetmQW!*1ECzAg*6UMB? z>DGG*!Hx8T{jlKCTtlvd(AYmT3yislP=_IE{892lek6mIs-Lb>^*fVu=G)9Novv2> z!$~pU)}_%Yi`74pY+E>xvReI*{Xl9Zx_vjosXq5~#|u>%c63+rRKsCDt^1Y_M;}d| zJ`YGUwAdD( zCgl#lc;AjG#d*=k7YRwWUNWbn>(w)3PXV_j+BhP#|u-^)t!S7By=j?X3MEebJJ4hosiCl@XbPGC#{`}0L26}AiBzeqS?2jgEP z7c6RU;;4YrUoMgpl)xZA+QkW9Sfo}s#DW7$(NO+@4g>wGMT+4i`wWtF zfiU~xBEj|SKl)Pg6N?%s3bEQs8a=p3Gu;JEqy6i|oh>jwP1x5b>A$7v%gGBCrMc(P z)mM@q8=TbDfT!?l_aBg7vH{ngLCxv^J!i~-51Y3oNOAr z_p-TdKl+E{M+R@&Q%fBE<9yJr(afX$PxC>$Y;I_O!@Dp8&GoFchyOev0xFd6*)H`j zK1Xpf1iVLA+b{L63u=i+89g%KTy^*9cT9bAL5=;Esec<#IJ$cdd#1kSGfMNLmD@D+ zs1JJvY+EvS*jnT;ivB(M$sWzLNPyq=5$Hm}^zOrYY?0&i8?lb1OEpdp@bc8f>=c)}jpk6@Q!t=`X!i6cce!yNeAQ#Uf3f`Pwo4O3u zfTOC(f@d6;S9taOh*N^GnQ|arGr!612H_|BwW$k62OQ08K89^od0qNbi<+#G8-wR) zP=6(LImX3eSSE|3Urm3wat2GP%&{}%biXs?*U}&BH^BLTxGtTtzNx;qh@@+I!Jqr$ z{e62Lz25W5+zq_qwI*jC**~>&*Yhr+hLFwN6ga+Nh7c_R*c*NEG$3X>p~&MOHlsw> zr_OJmvxy%;XykXWylEj#-4>Q#PoEMfJu9Mm5WP7)t7lf{Le!f4M(URCc+n}|zDIX> zI@Gt6L~p4Ebn=!kR<&Uw`pxu5!+_>&>M2?8)~FfX=$)LCVcicvxjn)%wZF9pRBThu zZ!ZNZ2I(fR)E6?SN+sOvZQg)Tx+bP;gU|0&;yTDAbpvv0{jKRw&1aswL6q}kuxk5P z-nJOT+-{#+yscOekxIlItXsVmT@b8l-hOv}eAG=VM==ai}T{5aWkTv4J-COE~ zjn?fRdPnMV;tPUNQr~YMdS~iZ7Q+sblkXq$%B=s^l;~aFwVwyP9!TWXZcBIA6wCui zsNC)W<_kShdwurhygPmN5_ePa<9obo5r#lDY?p=i8He3K00t>bW;X&J;ocDV1TmT@CPk{73ANDN(l0(VwrnzI`L-QDU zK!2FJYL5jVZyeNQ2LB6VVzZ=`p5-~ zfNrw7H`V-6>K1DjFmts%9AQ_@ojyES05mP1_ksA~9^E{TA=jW)`)WRty4B*vV_3ob zepdKUt=L?6_W1R2zAxU7{dEhj2U&&vjt~hZ4 zz@*P+0{qJ!y*3Z*`YE9=^ysyDfD?ZGKt9l;*X9MXXRpd%_2{*E!RoVF<%>OfZ9eeI zoe^J}=bX-_TnOacc9jRy|JjqP8?@fAFWvZ&E*?%FV+#gpJwp$W8 z)Z^WooZmCT0rOHb)6)0On8t;GDl=S`puRU5{h2r_;?}wk#~+ISIDUV8XZ(ryp7=BI z$Ky9855ymfKNVk>+!z08{K@zY$=&fkrhgNEA$~Ca%lISlUGcxhznk0}e>DDle0k%8 z@!zKpr~i;%mHb=!?ewv9?3JHwKESr6)`f9=^z>u=7Zur_PGhZI=8a-xI*;=tPqTMj z&a=F+E*Wp9xm}EGOd_t*jY)$SvuW3+bzYQg&C?&B;DZaAK5Zh>$N3ZNCu;#Mon9YB z#Rrc5#6;YRq81={x<^nVdkWar2GA+8VkCRFy6wcmBjTSk(r8nv*P?Kh8K$krM|8&R z?CLAjAfo>~S}yoc6sVD+5kTe9Ch(3k03VB5YiB$aB5@IGaB&7OUNR8e^B|asb0WZJ zFBt^H@qRBQIUO_@c%*)k?8-r2x~ktxjJXTrm-c(9x4WzDrOQ{vNtpC}Pbcw{9<58F zHiKW6tSUbLsS|L-CtCc>S>RgeEbtu zuX*B=o}9Nkr>}+Ml459MvWk!EPk_(HBx8KneSphCcxKbZBNd)cDBkc#JZVS8hITss z6g6(S#%~#<@yC4QFF>*JwQ4==THiWI>)*N4b^T*BK3$EMxyH8*()c0Ycs-3fYTR&* zKQu_=*L~Ra{KGVEt1;3pihX2|#vk>Kf0V|#8aG|zj}OxLs*hAXKe^WU(}OgApKttq z^!y|>_5{0ckj8)Q8;f91RO3?}+Fu@|@vHyXp?x-u*Ql}Ql5Y*t_`|;OkI;B^t?^YK z1n9~5^V`1h57PJvYV0}e)q^yC`(1|i_@o*pZoJnG((nteVeu4twZ`MF@f!wdeEg%1 zSW`59oO<@G`P+jueur-?p*T&A{T#n_kj4+!dOlT+J=(Vq()djub7+gwtJHYHjrq<& z8h^q!-bmw>YCP&1e{zt-sezrb8Nb3*YJ4oXjX=Uhi=NXWBQ+!AKA$E8nvAwD_EXo%u$d z<|7u3tYBEjqNqJI9=AZyx~}8(=LUecXX2o4*R)4lhD%dU{p!3~oIPFKt~PSaoB7BY z$*N8GvQ3_>o|Y!Cdn22YwR#q{$G8F0ZPxvDNwzUrudAsjKPTG4)z~H`M~%m6yum&- z;_TmE0@hGg55geJn<=-~OxK5}H`gT_iof*a;LF(+!P>|TQ*lnz%%gnhoTx$j6H%Du zsP$3~@i=O8DX-gR6M(U1sff;BE&?Rnw;PJv+%zXs(HfiNJkbRImG7D_wYh31(A~Z8 zfW5%rdS0*yPe>)LD};z=Hp0w)5yvgZpnWj{GP6V+6Jq&uBEkzr90VSOg~e^wY6vRa zp(__+)L1@5r?7l?q#IC3Y|L;s&=kAG#j8w^#w486*&mtk5UG`MZXUH>)Hh~EL{=G7 zM>9r{5GNBeP2|u*BOv0{2oz#$OcS^ z`wRJ8V3v_Xaq%W-i#L_naCr)G>2YhUIbpW1 zIT@F}Y6-CE6Pv@}Wn^9mBpY(0HdUSd ziIXMM8!}!JwmaYND68oyu8>9#ugN-=(i^qzOX6nGAbrdg{Mi|xcHLSUFC}mAV=)Hb@_3ZyBaPY^h&UN&l$4WjEDSyW{$fp1448qD}gQb zwgJ}i_98kXF^j@eY)UX0!QKSp5zK-|Y9gM?CXif{gs&=Y^h4uIU2kJD>PBLy^)}9N z3Y4vMv*;CQMp_5{S(cJ!A&FwT;4VLJGbO?$`-H&V_DT@z*6yw8MQRU>8Zg#Puc6FP(c8cOpG z!hm?khVNVqDDNA5W%R`)pD-pFvk?>z+ZV699?_TV)26%T=3C3adiB*iOtffS$VS#e zl4E9yXZIOKoX-FQ$Y&UFKEsHt$ma~fW}X%g7$CoM8mKh`QOaxU`dhw=O3JkI{ynk>TL%fp@Pq%pk zHl$G#0(6=aks`1Zf(}>V*m9PCtV_Yij?zCtT6~0mq6=0la!G(eS68YlzQ9KcXOlBh zOrn@;6-!XrReB1RykQX;lcr{R$|v~1nF1AJTU+`$MRRORL2-5^DnDwq@T=+q=ow#x zs`Q-Jj-(W1mFhlBRJ`=WiDMBltxztm(HE}~=C&a(t0_LivgXh{o{=!VYlWWKD)`8p z$JTSe6ts+Elfbcz&^VS6ccNQC^624Pw#C1wi=XHazY3Od@$!=K?iVLjU;jd1Tc6}K zLIVFX8r!g^lR70(d@mfYj-zd_`grs+CMVHNu>O~#pM)@JF-l}wTsGZ7Y;~W>f9$dJ zVDVtIkCz^d_U>`t<0Hja#n#hjMbWu1y3x3a)bs+udFp=EIMQ_kThR?-CpnX(i@S;3@(Zb2_jX|&$bh)05XAqW_9D#1iIh5-@P={Dq3 z-fXy-YL6hQ#rGG-j@=0)SynXr!A`uojoQqcyy~QW*o9h=PZlA@>2&rDWx#U5b1%u@ zTH%H_DZ0SulizTa6AY)v`A+rfESyhKrGdQvWp0 zNbRxcE3ZZ&TU%K&peoIlJK*E`nCwh+V`#6*F2ZG?vxl;Qf3~4wHAjd#MXaa7gM1xt z$GNgV&3vL7506lD+@Hw)#g944Th?hl1~#(6BD=7`*_hFXswG?>_#m?BhUO|rW7u}n zQ_a;sj{-fVXXu^RUH@_hhAQWAcpiFgK}uydw`dMs*ZMxMQ@}mBbz6Sbw)lAV9+Pj$ zhbvKGSn?70|8bGnMbjKJpObsDFYDD-%iM+7ra!m~FS5ib#1VxW9cFWKpK_(r=QuOw zZ6Tr!c_7{!^{yCqv)bK6N<-#r5{8$x5DH=l*B{OGtVHEG_^|Gc%-(R<;~jIVM>?rm zHlE4|xWco;Lag75oy-&ajQKZv)o}*(1a*=jVx%*W962;}9ks@zoDLnvJ@iP91bS?M zP7D+bp_4F_OH>~yLlOnYr=0<8jqyrm&Q9wIwB?b)n@fdf)th_k<#LI7dLA!_KWNYE zL(fm08&%=x22h`qSaYHQFehfgTU+5HP}N|0))B)n3~4^iRrdGd6Zc&9TF*%a>S^GY zpN-R+`V1abB8Qy$O>D-b8j$hqO9qVz9B&iC0l&>66gpNwu{#R2uv*h=MZ>7|OQ3eT zU8+E41UH1OJ=j`3h zuOOrZtMK<6T`96_i|F#+8M}rFb1>*47N6QR_*8u#j2lNSf|2|%7P(3KU=T7nQM;LJ z1zy7`?qcMS$O%gEHVAy|hL|8$WoONzaY&&B&3r7@4mGaS4g~&N51XJlhvJ+l@#WSn5Oj$C=JL!V5_7kq;AURjeUkRF8=rQ zvLuOxRPkaMuweD27-A(*v627U)Y2XuI$kie+;nPU_838m+p(Qsb5{JG80Q5t@OQ{0 z7Bej`2j}Eze59!FgcI>1keg2E-cDn->ztNiS8sn!5a-PO~N${tlFr z7Yc6{<7gXAl0H#whq2>ad!1u2^a%2#o*9kv(vlfl+xo)=PlKz^02hVibeV&zMTt(dvz@3NZ6bGyStM&&*g2pVu_uMijy|x2+@G# zt$SmUSn4j11QxFyz(Y)SfEgJ~-3c(&Hyj$dc}ccP-ls`MH}x?h!m$>riQqG_PY~V1 zMLD`~-$WnO3`KcA{C(PL%{6c5(R6W#ye6Azn#h-sSZKgDxi|%4V_Bs(2pd|O+143G z^P&NU+2vP=eQ~%V_%JFWM-BzwOmOQo?o35DeEozhNQ`=WtzNGHJajSu9l9#U>qVCq zN}EJxR)5L#mBA+p&8tczNP5911DsNnZX^rD-B(KH7?TNxrp*-aOkFwM1-hmyH7n*G zO4y*#(WgT^rxao0;>j;WH+;>UHL0l%Rjj6wV7CyJ^L9{*7Ga$Nxr%EP=hF1=)U@@} zMrPkt!+c(SDc<^-w|*v4F)SX!-VWUTbWmZb$d{}p-i3$sjwikFn;1?;0%5KR{n+GD z0l-ZC)GVFR*Y~-;Cgxs@nE$M{GG zi-1%`Pg~s)Mfq!2tMt~FtGF?OgX2C>GSUG!z zLDhpcnKr3aw`Rc|Er3dq(m{W#-uhTKwQ9^x=TNKkFR@Ti3LP#B2z}5Gydg@7A7xF8 zw~0fIRG8Fct69-R>}aIIp1B-u%KN_N#Pp?=!a*k7P?0f^Ng^aN$;um<>`GJOtPfKr zxk@S$J%3gby=ra}P4*{INiw)ltmwYCKDrbnn{*`mEOIso#U{Tq6f0(>*sJHJnCy^g zmL=gI2^SQWpeBP*BRTS4nSahTq9Y$D2h*`RnNisj{=nM@I>{b%KteKhI(xZHmJ(Un zOLVm~;+j_Ejt3!k`kf*7x4TOM8kM3p?O~e7%v|iW3CaT14c$`b2X>k$z_7){+g;mW zf+CSJwAwg~KQ1|xO|lzgUeO;(yD8NT$8pn{Yb`F|$@0MqEp_2+rL)}9;e=IK4Xm*R zSe9ZT5O8LJA$LRl#blLwpIdfKh~Hlm+fI z4>=xf8Uy)dH7&8i9_!@?Y^3s!k37L)S?4mMSj%)Pms$jq#Y@R3@Xy-m?4Qh;gooFl z9Pg9^WlMsJ>w8{UWiOB*FpOxCb(B*EJN$a$M|f8ejNE-d*f%1)X>Fz2dVy)5HkoW* z$eXJPLnJX=SZ35JI7z7rX?VJ~cByGeWF|$Cliu;U*-itk29^kkB(Q-}bD2!!!6hsR zyj-S{I8SK|A`fM5y9;o*Ri+kMMg>K(s6MsW)Y78b%!-<%aE|9%;we{rnyoLU)#_-^ zy7q`XKzt7=3K#^K#k+lF%*^5yJkiIgd!`5Hx?T8dM!{o@mfh{)|p zh#=rrE$bfPv|=5Hi!b}`l=uzxNKm}q#sDh~l(=ftMDZ!B>aK(c>Zyb%3H7OG^B|sb z)kKyWv1%f&d^M3>Sv8SX;9WJ5u3Raq{LD4e*(WbYJSI@8_3~1_)XPg7C`|^TksApj z8)EU5K)>$FA_$QbC(82E)apx7)*`v95;kOO#YhvTUSo$#yP-q~B$NIngvCwNG8+Pj z+9!;C27)X;mCT|-rtxc;)axx&!JBk>4y7J=xW6;BM?pMvETW%SE&a`exo8fj9tnd)7fCHB*y!#M=K#xE zi#F@0w<#&b6~<>RA9o+4*~TR2((|;bcJqT3Og|rycW`33q6i@wT9>a_bx09Y=S&ZGT(Kcvv>{#9&v5Txd3TMCbvnP&4dX3fQWhuXs z$bJ=+_?{v?II+yk3cCCm6R|;q)hz)pZ5tgbj$MAm@k^EH6CEHi!jW!eD!_#5TzZ#r zh%Vp@>cqcbmyEH&is8111-!AAKHTjw-A>p&G80n_fq~Pu-BC7qbTxX$gjD{RUTBXw z8Zfj6VwdjzI-fE6@5$3va6V2Ke7o#mvG4o|3gl(JhO~KOta$Fh;)bJ7ooLEO8!O&S zSGF<3UNL8|rxUn3Ev|)d{ElQ4Da|`vEO)&mPn&26_Wzh@$i|En50f`jz59k|02He- zR=f)MJVFXJ=@8AbdF3cmhDZf1)9;>Yh=B%ApJ+M~Js=YHc$6q<$j*E~r7+{*;K7B? z-h z#?KG>v$3q1M8v`dM9WsJzLUW>o4n1gWPOo<@I-D$S8{(Od-D}e_V8yAJ1={0(M=|Y zJDHMbB1a5KGs=o zOS$!R$sN+{E?;$$ zcw@v!qcszA!bVU#$Rbh9?btt;jhEjUiN%KWkj*wQWkXVisE_7j%1$H7`51)k5MF8P z2eOV_okgPGy=#C*b=&aEo1imhW;P$AzJ*kP<*YTkLS-DtEd%Fn;NvlZB&l~)!}>;usw;hcbfKw+-uvg`?@4=k4rwy zhgRF9dSi`yW3oLiTp1`!;4uo1*8=DW>{|57>MTzB6bkSxX&)i1ak3BqzFOH=;8#l_ zk1-NQXaK0&$2`h61xBesRN`(1#MF!tEEao4g15q=8rmj+&kFm{LEV;j#2B1Z8_a|>oMesEb?u%3%WmV>SLkd+Qvrg}u^%-`m zCfSr;U{X`+#e^oVM&d#S7V(Je!Z@o6=|Uu?$@K zz)ji8M{85MnUA4O=>|U7Gr5kB(M@U2$MB|fl8^CCDFr0?1jIu-*G-k5-IGYdTWgXQ{Nb9kOo15@P8^u|2 zUmL|1^bPXJ+M{VD)*CPEpzc6nD5xCn?dgmb!%vgK!-fs7mfCEO@pmNEOpfLw8uuvX z)bckJ-j#BJoR2BI8Zi}S+N=R96lVcwH2ZA{sC4EUr#dIw?42DeV$K@@>k)A1@Qu|w zl^rXj#=r7sl8mu1SBS6TEQmS!Eg$10eTcpi^i(l78hAwh)CX9$0T-o#L}Ln9%ac)7 zp`O4aGX=)TTE4_~JWqvFgMW#uzq|zU~zc!di)BNi?qgG?f(4-$MJ*I`j_=Qje zN0K@1u=_9amY4R{Y#e09vTsV4ino^idpBVCh=KYe1K#ZaP>P|EJmU1ZY0E^TNmf^^frnu_T{u*q7A3U2(hC&|$cbW$Mx5v48*8i>421uO^Iem>0M^;_n8Rnh1pf<*~sK zCVLzbLI6yj>QF&h!1!WJsY4f>>J7>{j5y22qGj?%&mlt(~`Xy-G#7|`sRWL67aWZ9z;+PUMf-DzseEQkyGxkP<57z@xTpy^@U0BgC$i> z)!3Z-EP-U+Slzd@A{P^VY?Fd4*HHW<9I07aE4dR5vVYbLh~gnR*!qWNcfq@iUd7WO zB|gaORG;L=osR0Oxb#$ajJh7GLvC)1WyRfRi}0*{x=k!_;$}zqEfwL;GlMfD1?9N zL;@;kPODTx2Xl$*mnS!M@W%2HDdJmy5g*2MFszLnRYe-;5)DHdbC{KuTAc>MR&%m7 zX%;OTig!kRaWwN!g^{^AmLDDIm_qNOfZ>6GGdy8CZA3sJgJ&bVRUCw3LV3f6E|xEOoSDA1&f}{*kFPPbVW%y|9Twm! zb!R+&cE#h9@@`Nw6^~oXipRIqd7Sov$Io^=ezxav30_4QaeQfpRcIOK5pK$K>qod$ z$W5e*RzA{+ibu2~P{_hC50=+6QsJ%c%D>^Y5;eiC2Lsq(b1V+xWe^y=rXlxS?DltQ5W|y0-HY z+`V$}rb~TfkOvF#Gqu1#HjG*gf*?WQZ^~aAktqOQ%*pbG4-a_9CD7%?XpXVk*{=xM z)`#P2A*|cqNVYPm@CI}Qx|UcA4)*hvVp`Wy-U25~?kVpMgA)qEq%8YY!RFFvFVVxe zwqxGXimz0~arK=uyIl%_Z)z1LoJhr1PsF8qGNd81UZniLd_56BUMouM&hg}w>fn-V z+2y%0-akNq)KJXo9xxC_*dZGvc6X&( z!(36SMP2dJC-CwiygSJd0%|v&aK8xpp`>>50pXsT597F7CMl=RCe=fu8=JvODL@fj z6Wez$23PAFcaOWf4iUZ|^Y<^s8Foo1W~JSr;|I_ns0)VkO0)Ee8nlSWKe#j58y&e_ z_{C5sZQ6~N&r(FknJ`j8+3Ui4&qfRL-gD%ls$e}Opds3m)@6=0?fl`nVm3U-=P(u! za@jDnJpoYmo&f8)3SIQ}&JL)qOD=+h(;bdu*~@J}dWt<)&z{{L(@Z7sWIpO54$=v@ zx|)h{rwtS{wm1=n)&POf8h!Q^ITN%4$g`AVQ%u+ZZ(k>``>>4}Hm>ARGks{=HV1tu z99*W4@%D0kjI=X-z&Mg%HNBv{B2O7dD#AII1Vai&<9r1?Pu#~Em-Yr&^k*7dS{AG! zUzR;0_)q*=(Por{EgT6wgPud&AokM*0-Vd6SWMG)(5tk#{)iuxFqT~|j{ zY&l>@&Lp^#6BKr`Qqjtn=gYjaPR`I@wVWy=N#ePcqm+zKIeE+Yly%KxF>``V7IRZ* zcPUeY1J1uCV={3eWx9C=b8bd|KEUt)**h$Y(v3}wTh6l- zt#T(T5`0Ib!7BU;^t{*9D@;>c=SDO%2GnAX$*At_IH7{7%Ahdn6)yh*EGyT6HKR^e z2}847VGyF=t8p03O(+Vq_r~M_DLpP3-u=4djcdb}<-+cu*c)fS^r!F$iGqFUf0Z-L zysn4j$)3yADVr?Y21%a9yBJf`AKCBQbTB&#AC0a)1km}vFB(6Ea5n!0C zX*;vUDq}k`LzK|5{D7b)mHm?(`-VYxdJWg}uewC>y zk&DESY%I6oWX{s!RdWm&6w^sDMbsXlPm_*S&f>62-l(c-Cmo5_SX~A4uXWnj1aLENH3WNMAK+I)@nTvcV&p89@$$v%@VE2^$nMwP%;g{2`fE0mteVu zk8!EV$&i+Sr^z*lwO9GH1effsaIE79lx$_VXejx)_eq^Yp^<~DQ7Q4k)&B6G?2RI5 z8%R09|A%Lp@2*p1fp^F;W;#UmVL zw~HS(Cf}&Ad$<=nyD@L6L`MCXE=`fEnrQT#C_F=**fX>{_S84v3Q{^sS z%5^b@n|Ex~VO@+nn19bz=DygN95HO{v@e&V+<;pjs0|hs5ceg$A8V{ZqMpITRkNBH zP{>`}c(sj32ZZ`{zV&&`7k300R~oC5dHhp9^=pI?NEp0l!X-ZaoFk}Y!w=xP?g2FV z4#09h4*N!lJ;ikLZ5ze?0sBUUJrRP(o-1Lm2hdn*ty(C!Q`yIjh7`vTkLHjE;w6)H6a%ziNLs_;lGK-|e zwJ$enONo0%-eQdG%Cg1MlFQ9}5^%=&_|*w^I=2P}UQ_WhL4xCD-XwRy!>og*#NG1I z+s)Eqa(GNVUG7wuzEP49#)(R(Yp7nXI*D>JftBhA<>$uol%KnCs!X^PSm~Pb%s!`_ zV0o!XKS&geSYC?O50c9+feq7>^m0{?EDZORQmGQ3tAE+c!f=JP zlIRX=u7ow|Vh-`DuqK-+toaC7TYj^qW&+m3y;$E@+d)(-h;Ye}5IS`ks8qP;c}jtl zqj)OZ&*sJnhdXP@0e8~Ie4%d5Ef%J5la)fa1^o?y>a44*1Aji&d#ZD}wq&i;UdI^V zPG0JKv8;TKqn`PK|YXgTJ@RB0pgyC@KY>alnvRx6k zu_RWwWhL6FtJlkJ6inBKOxFZqIi&)0`xLuE`O(;xgf^2_5xh3GvXT9knvpNC&ZLwn zrjjFNWMlDNDKXMOrS%3^1jiQHE%$(|zzhe^iLUXo;>s<}xH(IY-JfaZYgHIt%XK2g zsc77s63e9^mCiZw!T3jO8U@SP->`U=MF_;QeQe7kfn}G(w)n#@nLE3JQo)yTM7vsK z0gWD={%dI!b3u!yre>+Vub>uZ zxCm?lF5UG$YSEnjLN%>&kXeS7^0s0K>TUFGoDT@8Vw--YWLA|WaY{oO*&VMi-c#9+ z=e-$aWO9-(0Iq7tXDuT$l^EP*v{LCVOGSYdoKy)`82(JiT@^#|fGfb(yOfQqQhRutl`x3mSiMpB&>pqs zoHwfCZDF7+ZLH-e3GWz}th%c$)$%IB9MLstZ+#3&8q-bbb>3J|vwf|a^ZeM4}^C-JiYMt>V=!D7p#{S zx~r*Cs^5F`(Al&xQuV$S)#vwBt?V673h>^^B#M%|!$)v;xLh0DoxsQLQ*RLjGX(5_0WrqbZAKtp{I`s= z8`O7Bu>QF&IZtnMu5c zjt=T$guiudVo~eg_BpBIdMly?oU3DwqGi96I=;?rOo{dTNxV@wC(4SVgDc{;S~>7w zZ>4zSneDYwCtGzej&udmQGkia>M=oZZM^P|_iSdvM#L+zX|}c{2ssSB3U=3Zi!V~; z;D2qb{YC3on@7m_eyKKR{4m8Xtg@bwK9f}-J}zKGn_hx_m{vlVHwj;=Bjya<_RyUesUN9?J9CJo3E%lUzhm#idl^SVy1{pYZO{uow;?6*ZGG;uF9;|`Lpi4&v zT{$u+^5jcN2I57uj3UTD1}-ZyP&wT5k;3{`x=ae!(dg6Pr_L|2X=Ln4UadmYV! zwFtsTAPAQwK|I#nA|>Ke?~jT z4N@__i?UgmXU{5+#C!bXJy=tmT5ERtF~r0;7N(Az>cTS#4}v2Dpk7XG{Z@@jA0W4u zc5|sF*833V-mi7ee(s!oAKc4#-(0y6=2XLHmEJOEp9<>Y9><@mfA)IoS?1T{K$>IE zeQkhvw%t_b=b7ADuPnjlz@ISE2KbYYv#XTJ`k6k2-e3|PkE*@nQSO4gnA`DaIu&ik zGnAWuDO@>@BtF#ynWTq4FHJe@{2w)*4;6J@Fa@{1)+!+0+^Jk6i#1i_EJd6J{!X~ zMm~qvXR>Ij*ugPj&Ef5}u>INe{E29(!qOXF?KNr1splC}dQGYs{%(e)y%u(8RxvgE zAv0pJrG2yL*Guux{0z#2feha%gOcM_dJEg5#)GSNo=4@iOzOP0UQEi-2r{bC>$!$XA)yW^watJX17-`Z^B~)^jfJb1k`-e@49$A94PUhLp{u0`Ha4Xp)a!DjYFT(|JEbj7_NJWH?qs}arGIUZn<>eu9O?kM8D(Q&FE$gn zc+he)hol@_hL^pd4!w(!#3j`-wW0!OX~kXz*5YFDyVBxJZJwWJkqynaEiGBZ+3 zFjG)VT$XA{ly`qD>JMI(+B>g`mu(+J@cc=6;8p46Eqb~1{8@+To;Mx(p>rFClqe}< z0O9FD+jI($hyM<9pA5cSa(^;JQwI(~vo06SV9?Tr6%~sW>#LgP(i1!|R;^XLWuLI5N${j4O@6`idXwi3T-xSe?Y@#2`6W$V zD#>>NpCtJt2%eKruFCQ85psN7_RaC>9hi;@lFv*NfUp#Eqh>hSs;3*=196bf%E0Bn z5RE2hR3|Evv@RDDHUA`WS&EbrPy>h4+nf>rGDAgl+dvlVsc6H5I!F#j8x$)=XLO0JO;5)4e< z*wV+Xk7uy!l+m9#Vd}+*T!{<(76v}uZ+rL^+n@B?6r38;%<=xRG>N0QWx;YeMzeo) zt<9T^=W=tDyubAM)6!L}?v&?}Ka8kEbx}c@V|At7Bqvm2DQ?jhE1@n<$kGZ|{JLA9 zD3`E(8+&i3D(XHX5);|}GExVRJ@#Wyli}75A4>W;bc9U>O}{CST@~7mFV(-54{DOO zfB>Fx8~bOez(X6M(sN7D$1hDMgu z)q%3NMFk_kJOvzJP%WXIqTM#9z!$DDzh**TXjJVlUE$kReF%aSwMs;u1+56fp2;_g ze4frXBZ!QP$-;Sjc*$TN*_OnHo*ffuJ58g_aM4nlM%zi_Y5VC5U20>H_R_FCo?jX{Ts%C zZ|jns%o!i{YX$6KZ8tow9Fu6+jxte44}+Uw3Q}5T(oHyPWKTYHK3}Pa;u~?QW~f$SHq^Oi@V@xpR{lE@#%E zIr3GT*!XLkaFyC)gfOeoVufgkRx%n6*J)@9XRq6>c~N_1c7@G1hRxFuQGkXcHV6j( z3_!Y5kvfe%I($mvAR3+q;XDl=$1P~6^@W)Q*cK$qhHhu}<)^qC zrK*s7A>K2^iVCqGzM=aI+NVlUJNA$r!Jzf9q1g_YwueNm{M7tZ6g%USVUzHB>fGhD zEzp9Jl(@0r; zYZ6;A@9w-dV>;dy{WwR>u<+Ilqa$b1HpZ%zB!?_ma1KEuL#->S(cEwnceO=X=SFgG zTyyByNpE@uDw{6l3EibU(Xm^Bf`o4g$cU28I*BYiHV>S|$Z|iSJSg*gc$#b#N#1UR zOCeRm?eONfK67hSc8FWU0QvnLy?KjK3}FMe^4J576V;1}Vp$ocE%!{C<<$fjavHu{ z7t*g$hFge&j`)(G7&Ea05~*Q#wtrQ-DgBw1d^*q3S!MZ3uIKPGHBbclY!T0R!_X{N zP1_9Ng6Kz(nW!NqN;57+;C@`m?fld&#yZL<-~h6$G{CV>p^@2k%&(jpZ{N(DsqOxR zE6gRr0Rvz2Yn*q-9(D8)K>aHDV$9Ggry@nTfLsb zN3_)o=8)q(X1}W;(zraOr1yp2JJ}0wKiLcKIN1yDJlPBHI@t@io$Q5opX`PAoa}|) z?|$LW(|9=S4p;7=D~Sr>75il`)1)#>_LuGI*lz#((kO;pcf(F~rQ*ihk!9qhDy7U| zi-L0=+(xTJjxs+dUwp&m8gwA~jrX271|z}^TJ}qbvVB^C<{LVM;MKApmt?uB)hZgP zb4f0eX}_sjZQGW7DZ#|g{Gc$~4X{p)>r{BkIVIWcqJ>x5Q_G~R*xR={K7h3XFzpT!O&ND+S6kb{{Hdpr3O|Q{(sh{7j{SvS; zM_9rU(7%>Nu}|(+SOqI`PxPLSerH(ilCFXSFIzeV7j^kWUgaAe%C+ z*&m43dUrj1;UTRL0rODyQe!cE7c{X>M39ezkf&R9`Vh9pa5dCW5RMc$E#M^UM;zwlR6wt8=X1 zH%y(Ugrz~9+e6sTD()GC3>$eH)#9d*At-R2npof4kFV<}6?7@g`1>^_AUM?Co;ej^l`c+&bHxj^ozR zpXWFh*OamDT}U&-6*AUBO>Od(5=55r^8x9=mK)ycabjDS$^2j zdy-2}@0?45W$7uefDw=k1tAQq=cYHg`yljzLzM%0Q}01SSz3?E+aH|S)p=XHG6j$nvBOktPs{=)sE>~ z-)vMz&-clum#nR9Ft|9XS_++=WyM_%Wo;-c&6>8Q@x3%_ov96PKEbNMPAPrAW@4#)mtxdC$AG+o zQPo}9X76}mVbDnBI7$m+a$g#M4GezOXvkU-EAe+k(9pA--HV;>QKkBAK?%#Kjx|aZ zBoNW&Lp4=OwA8Cg{i%OCScQ3?mQ}4(>Eu3dxpC>8$YC zw20|b%6zv?os$c3aQ1$2g7ZLH4>VF8mQwE6m}T)+u5nz-lriWUZaf-fs$|fdyU3KS zpSqJznXfrExC=L}v@pC62rW~)F}nmhQ88*~kK#^9mD$g@^Wqw}mf|+=I6HWV>LYh0 zj-B}jDgpY~rH46Zi27vUu3k1aO42fIG>3*qMq6%G2Fi`J3T(XUxL8drUg9s=DRA6h zHe1D&{*vY2tNbO4A20QnU~;v;gc%c=Gntds_@C36LxjEA!-=yPw$Af;(s49o=if$<(oxDA6`o8e6XU9RI#H^uk10xHCl{Ymc$W^b-9xV`*|nn5J_|7TquBo6u!zaR#D+DWNP zAr3d+u!Q39p=!dzbThpFKyi3ex0f0_N2@Ceb*8S5xq4t}D3kq>h~h(d*~Oss@~CzH z$Q|77A#j9){C)hwHIuqS)8@iq3&LZ#Cn(yFXQm?Qnc;N_fb<5BY?~D z(Y9^@C!b(MZn~G1-pMirfot+*#od9T%Yyrya~JPqncNNMoh*}g!mqeg9zU1kgy(Jx zHDr`G;4tp~7o%-Y4-<}S$@IJDRV?3@UwsofhUGUA$jQaP|1(tbROvK-bZtJinhdie z@Q_h8cHhheb`8#NCwSE>_F3Di8hslBR*&0+W1io+Zmmt5Fc;n+XPSFE-Ut#dI*W}{lcsbnkjRqazsj#0Z& zkQlwN6R*bOAlIf3ZmlLXbRBk7$%Q1Yh7$HM!eZtr9G9!#Ns9E#%j50?eraSMrV+M- zp$$17?*bI@P`=8|x!5WyUZx@IJ{|h|q*q$m-(5~y1uE{UV09{cx9-727zbsI;69pV zAF*Cwt))>9$KGRQ9J~(w!pRS`1NTMJdi@0DoJcz{vu5E6C^y;L99Cc9%x3A4nj5E1qGlm~XcP z0&ghomwmLN4h)cFAG0>ZF;QD|Qk$IE(}M0sJLZi)(Hr7Dmv1rs0~S&md0@e``SkG6$YgrLw}C}HPQj47gqAdB)PDl|gL8f!_boLqH zDQOCSGzN5oxU1`L;|bE=>L-f?5bpP=H`jt<_!v#v~_1j90ck6M6fF)Llw&@3z+aY^3|J}8tbF5!~p zIOha->#A-V*=L=`sOgkAhp&`XHCL45pzMv9{z{z^FCtRC{N~>->}rng+ZSnL9(5#G8XNNkH^kX2%!G72OM3p7>j-n&kV%R` zX28r&Gm0@ZF-r}Y52ASLp`A@}N#)sWinfaw5Rr3MM*^!6We*6)jZW|Nw@R)eLaE8RvzGhOw4;ms3<^c0) zi-aNlyBL4(M3D3aYv&?%{@!1SfBO4--)eSOdX3cek7INKeVr6UK&PDZCa!QW-jm@?p}LRglG z^HD4J;ezxR9LL4b>NY=D&L)!4w#q8CBs|f|TlunlA|F@LMULvCu8K1NA5=f;Km5r@ zrlMT4H-Z^AvDK=fet9_eOXuKI&jDd^Lk@_psrM2@e)UIO?S$cKV{luj!(+2=l;DoA z91bDm5T0#c*Xb);rd%Uyulr}D8#b{Sj!IpXa#@wMVQ#LDDqP1IBp)NBNKF(%AHdf8)%)1$`qYx+QQh~Q7*(G!J>=%28iEbrv9Wk0lVjzU#uUPXR_JV;wtyqc3o{qREk%{<2o%>Y7y$8;@iy}H!$7GO$uMeA$b$o&>XX? z#VY>tM9P)lHdl2ldtSm;D_SI~gG+Pnhwa9RVjNCSD2`uc456bEUgH?z>1q(R8|%_- zH%{E|58_*Tt{|{_cE`$#pX0fLJI|tc(zrq)*jgSdW!%x$8ypsi3jHODe)p46({3#4XiNJ(m3X;~BX zs%-=;kZ_PQH9?}UQq3U5H5(t?FINGVB)l>Eu(347g6$acWLUH!%HHJ@*7TtM{CuLk zFyr(wY?G(aiXc?*At@}$@Ev2T&EObQbqO}qd)Y1sgUu_$4mJd#IQDO~&S2)lI!BhD znJ3$rxnufq&I@S6t>@HkJqtA1SVOJ&)|{w;VZcdR%SxC^&C=65aFOdmUpEM@e&vxh zGX1)w1=E{5`psXyQ$prv(0)IRY1D9rev<80j8P7S?V58Gq;5?V)TmT#2@=qPg&!LO zTt-P4FaOjI2 zP3S8}JZ%QGeHWk}=rELBtNGI^fz3N-bUU`>7gOD@A=({VBB93JUhC*r)l@v{*iG%k zBqGxVj=*^MkoMJrth-OA{FaYrVmh(2l3c1NMJl9>+jQAMDw$6cHIGtGFQOhVQDv=4 zbyhuAxo??9Let#scIIj=^oIGqEH2@pdz?8jo$NH8rty*+ahpK3$I(seDq{?hm1;iM z8n&^WqS|DlVST)*W#KxHOJA!gh#5eo_ z?14^mkFaL-lMPtMH4>}PB+bm6DZ9v$n%~gHJ?CTO2?HRa&R(hpcF;g;GU~G9B8=NA zKjnQFjh77(=DQSjnl?JEk^PM`9>IIrU~hx66dv!V!W*7Ym6Yx^vaj1D22@%P#g)5* z^-tDH=*wb78@)iej5yZW6t56psGeWO+c|c+(n&PzY%#50 z`F8Nd*%$ymHdj`B158)?c22GkIkQ?Fauo3pNf;y)CPi$dh_kP%PxmH23n&ib{-n

    Vv{8W3Qfy+t32iFVPzeqTQc81M{ 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 WiQN6oQxf}ieA#(pl;v+ibpJoqCzt2| diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index ee512c432c26e11a1736b71845c4cf642303e413..8ceb217c135f890f624805d952fa66e5c9f344cc 100755 GIT binary patch literal 199068 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 delta 20579 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 &'static Vec<(&'static str, FuncParams, FuncResults)> WASI_CLOCK_FNS.get_or_init(|| { Vec::from([ ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#now", + "wasi:clocks/monotonic-clock@0.2.0#now", vec![], vec![ValType::I64], ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#resolution", + "wasi:clocks/monotonic-clock@0.2.0#resolution", vec![], vec![ValType::I64], ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#subscribe-instant", + "wasi:clocks/monotonic-clock@0.2.0#subscribe-instant", vec![ValType::I64], vec![ValType::I32], ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#subscribe-duration", + "wasi:clocks/monotonic-clock@0.2.0#subscribe-duration", vec![ValType::I64], vec![ValType::I32], ), ( - "wasi:clocks/wall-clock@0.2.0-rc-2023-11-10#now", + "wasi:clocks/wall-clock@0.2.0#now", vec![], vec![ValType::I32], ), ( - "wasi:clocks/wall-clock@0.2.0-rc-2023-11-10#resolution", + "wasi:clocks/wall-clock@0.2.0#resolution", vec![], vec![ValType::I32], ), diff --git a/src/virt_deny/exit.rs b/src/virt_deny/exit.rs index 4396c4b..a135c5e 100644 --- a/src/virt_deny/exit.rs +++ b/src/virt_deny/exit.rs @@ -10,13 +10,8 @@ static WASI_EXIT_FNS: OnceLock> = OnceLock: /// Retrieve or initialize the static list of functions related to exiting in WASI fn get_wasi_exit_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> { - WASI_EXIT_FNS.get_or_init(|| { - Vec::from([( - "wasi:cli/exit@0.2.0-rc-2024-01-16#exit", - vec![ValType::I32], - vec![], - )]) - }) + WASI_EXIT_FNS + .get_or_init(|| Vec::from([("wasi:cli/exit@0.2.0#exit", vec![ValType::I32], vec![])])) } /// Replace exports related to exiting in WASI to deny access diff --git a/src/virt_deny/http.rs b/src/virt_deny/http.rs index 7ca8bb4..deab50e 100644 --- a/src/virt_deny/http.rs +++ b/src/virt_deny/http.rs @@ -15,12 +15,12 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> WASI_HTTP_FNS.get_or_init(|| { Vec::from([ ( - "wasi:http/incoming-handler@0.2.0-rc-2023-10-18#handle", + "wasi:http/incoming-handler@0.2.0#handle", vec![ValType::I32, ValType::I32], vec![], ), ( - "wasi:http/outgoing-handler@0.2.0-rc-2023-10-18#handle", + "wasi:http/outgoing-handler@0.2.0#handle", vec![ ValType::I32, ValType::I32, @@ -34,22 +34,22 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]fields", + "wasi:http/types@0.2.0#[dtor]fields", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]fields", + "wasi:http/types@0.2.0#[constructor]fields", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.get", + "wasi:http/types@0.2.0#[method]fields.get", vec![ValType::I32, ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.set", + "wasi:http/types@0.2.0#[method]fields.set", vec![ ValType::I32, ValType::I32, @@ -60,12 +60,12 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.delete", + "wasi:http/types@0.2.0#[method]fields.delete", vec![ValType::I32, ValType::I32, ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.append", + "wasi:http/types@0.2.0#[method]fields.append", vec![ ValType::I32, ValType::I32, @@ -76,87 +76,87 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.entries", + "wasi:http/types@0.2.0#[method]fields.entries", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.clone", + "wasi:http/types@0.2.0#[method]fields.clone", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-body", + "wasi:http/types@0.2.0#[dtor]incoming-body", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-body.stream", + "wasi:http/types@0.2.0#[method]incoming-body.stream", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[static]incoming-body.finish", + "wasi:http/types@0.2.0#[static]incoming-body.finish", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-body", + "wasi:http/types@0.2.0#[dtor]outgoing-body", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-body.write", + "wasi:http/types@0.2.0#[method]outgoing-body.write", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[static]outgoing-body.finish", + "wasi:http/types@0.2.0#[static]outgoing-body.finish", vec![ValType::I32, ValType::I32, ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-request", + "wasi:http/types@0.2.0#[dtor]incoming-request", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-request", + "wasi:http/types@0.2.0#[dtor]outgoing-request", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.method", + "wasi:http/types@0.2.0#[method]incoming-request.method", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.path-with-query", + "wasi:http/types@0.2.0#[method]incoming-request.path-with-query", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.scheme", + "wasi:http/types@0.2.0#[method]incoming-request.scheme", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.authority", + "wasi:http/types@0.2.0#[method]incoming-request.authority", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.headers", + "wasi:http/types@0.2.0#[method]incoming-request.headers", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.consume", + "wasi:http/types@0.2.0#[method]incoming-request.consume", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]outgoing-request", + "wasi:http/types@0.2.0#[constructor]outgoing-request", vec![ ValType::I32, ValType::I32, @@ -176,17 +176,17 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-request.write", + "wasi:http/types@0.2.0#[method]outgoing-request.write", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]response-outparam", + "wasi:http/types@0.2.0#[dtor]response-outparam", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[static]response-outparam.set", + "wasi:http/types@0.2.0#[static]response-outparam.set", vec![ ValType::I32, ValType::I32, @@ -197,72 +197,72 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-response", + "wasi:http/types@0.2.0#[dtor]incoming-response", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-response", + "wasi:http/types@0.2.0#[dtor]outgoing-response", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.status", + "wasi:http/types@0.2.0#[method]incoming-response.status", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.headers", + "wasi:http/types@0.2.0#[method]incoming-response.headers", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.consume", + "wasi:http/types@0.2.0#[method]incoming-response.consume", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]outgoing-response", + "wasi:http/types@0.2.0#[constructor]outgoing-response", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-response.write", + "wasi:http/types@0.2.0#[method]outgoing-response.write", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]future-incoming-response", + "wasi:http/types@0.2.0#[dtor]future-incoming-response", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.get", + "wasi:http/types@0.2.0#[method]future-incoming-response.get", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.subscribe", + "wasi:http/types@0.2.0#[method]future-incoming-response.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]future-trailers", + "wasi:http/types@0.2.0#[dtor]future-trailers", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-trailers.subscribe", + "wasi:http/types@0.2.0#[method]future-trailers.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-trailers.get", + "wasi:http/types@0.2.0#[method]future-trailers.get", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/outgoing-handler@0.2.0-rc-2023-10-18#handle", + "wasi:http/outgoing-handler@0.2.0#handle", vec![ValType::I32; 8], vec![ValType::I32], ), diff --git a/src/virt_deny/random.rs b/src/virt_deny/random.rs index c4bdcf8..c73ea4b 100644 --- a/src/virt_deny/random.rs +++ b/src/virt_deny/random.rs @@ -13,37 +13,37 @@ fn get_wasi_random_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults) WASI_RANDOM_FNS.get_or_init(|| { Vec::from([ ( - "wasi:random/random@0.2.0-rc-2023-11-10#get-random-bytes", + "wasi:random/random@0.2.0#get-random-bytes", vec![ValType::I64], vec![ValType::I32], ), ( - "cabi_post_wasi:random/random@0.2.0-rc-2023-11-10#get-random-bytes", + "cabi_post_wasi:random/random@0.2.0#get-random-bytes", vec![ValType::I32], vec![], ), ( - "wasi:random/random@0.2.0-rc-2023-11-10#get-random-u64", + "wasi:random/random@0.2.0#get-random-u64", vec![], vec![ValType::I64], ), ( - "wasi:random/insecure@0.2.0-rc-2023-11-10#get-insecure-random-bytes", + "wasi:random/insecure@0.2.0#get-insecure-random-bytes", vec![ValType::I64], vec![ValType::I32], ), ( - "cabi_post_wasi:random/insecure@0.2.0-rc-2023-11-10#get-insecure-random-bytes", + "cabi_post_wasi:random/insecure@0.2.0#get-insecure-random-bytes", vec![ValType::I32], vec![], ), ( - "wasi:random/insecure@0.2.0-rc-2023-11-10#get-insecure-random-u64", + "wasi:random/insecure@0.2.0#get-insecure-random-u64", vec![], vec![ValType::I64], ), ( - "wasi:random/insecure-seed@0.2.0-rc-2023-11-10#insecure-seed", + "wasi:random/insecure-seed@0.2.0#insecure-seed", vec![], vec![ValType::I32], ), diff --git a/src/virt_deny/sockets.rs b/src/virt_deny/sockets.rs index bd4e83f..ee8ee20 100644 --- a/src/virt_deny/sockets.rs +++ b/src/virt_deny/sockets.rs @@ -15,42 +15,42 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes WASI_SOCKETS_FNS.get_or_init(|| { Vec::from([ ( - "wasi:sockets/network@0.2.0-rc-2024-01-16#drop-network", + "wasi:sockets/network@0.2.0#drop-network", vec![ValType::I32], vec![], ), ( - "wasi:sockets/instance-network@0.2.0-rc-2024-01-16#instance-network", + "wasi:sockets/instance-network@0.2.0#instance-network", vec![], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-addresses", + "wasi:sockets/ip-name-lookup@0.2.0#resolve-addresses", vec![ValType::I32, ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-next-address", + "wasi:sockets/ip-name-lookup@0.2.0#resolve-next-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#drop-resolve-address-stream", + "wasi:sockets/ip-name-lookup@0.2.0#drop-resolve-address-stream", vec![ValType::I32], vec![], ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#subscribe", + "wasi:sockets/ip-name-lookup@0.2.0#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16#create-tcp-socket", + "wasi:sockets/tcp-create-socket@0.2.0#create-tcp-socket", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-bind", + "wasi:sockets/tcp@0.2.0#start-bind", vec![ ValType::I32, ValType::I32, @@ -70,12 +70,12 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-bind", + "wasi:sockets/tcp@0.2.0#finish-bind", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-connect", + "wasi:sockets/tcp@0.2.0#start-connect", vec![ ValType::I32, ValType::I32, @@ -95,142 +95,142 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-connect", + "wasi:sockets/tcp@0.2.0#finish-connect", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#start-listen", + "wasi:sockets/tcp@0.2.0#start-listen", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#finish-listen", + "wasi:sockets/tcp@0.2.0#finish-listen", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#accept", + "wasi:sockets/tcp@0.2.0#accept", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#local-address", + "wasi:sockets/tcp@0.2.0#local-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#remote-address", + "wasi:sockets/tcp@0.2.0#remote-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.is-listening", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.is-listening", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#address-family", + "wasi:sockets/tcp@0.2.0#address-family", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-listen-backlog-size", + "wasi:sockets/tcp@0.2.0#set-listen-backlog-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-enabled", + "wasi:sockets/tcp@0.2.0#keep-alive-enabled", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-enabled", + "wasi:sockets/tcp@0.2.0#set-keep-alive-enabled", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0#keep-alive-idle-time", vec![ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0#set-keep-alive-idle-time", vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-interval", + "wasi:sockets/tcp@0.2.0#keep-alive-interval", vec![ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-interval", + "wasi:sockets/tcp@0.2.0#set-keep-alive-interval", vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#keep-alive-count", + "wasi:sockets/tcp@0.2.0#keep-alive-count", vec![ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-keep-alive-count", + "wasi:sockets/tcp@0.2.0#set-keep-alive-count", vec![ValType::I32, ValType::I32], // fixme vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#hop-limit", + "wasi:sockets/tcp@0.2.0#hop-limit", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-hop-limit", + "wasi:sockets/tcp@0.2.0#set-hop-limit", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#receive-buffer-size", + "wasi:sockets/tcp@0.2.0#receive-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-receive-buffer-size", + "wasi:sockets/tcp@0.2.0#set-receive-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#send-buffer-size", + "wasi:sockets/tcp@0.2.0#send-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#set-send-buffer-size", + "wasi:sockets/tcp@0.2.0#set-send-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#subscribe", + "wasi:sockets/tcp@0.2.0#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#shutdown", + "wasi:sockets/tcp@0.2.0#shutdown", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#drop-tcp-socket", + "wasi:sockets/tcp@0.2.0#drop-tcp-socket", vec![ValType::I32], vec![], ), ( - "wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16#create-udp-socket", + "wasi:sockets/udp-create-socket@0.2.0#create-udp-socket", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#start-bind", + "wasi:sockets/udp@0.2.0#start-bind", vec![ ValType::I32, ValType::I32, @@ -250,67 +250,67 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#finish-bind", + "wasi:sockets/udp@0.2.0#finish-bind", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#local-address", + "wasi:sockets/udp@0.2.0#local-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#remote-address", + "wasi:sockets/udp@0.2.0#remote-address", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#address-family", + "wasi:sockets/udp@0.2.0#address-family", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#unicast-hop-limit", + "wasi:sockets/udp@0.2.0#unicast-hop-limit", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-unicast-hop-limit", + "wasi:sockets/udp@0.2.0#set-unicast-hop-limit", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#receive-buffer-size", + "wasi:sockets/udp@0.2.0#receive-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-receive-buffer-size", + "wasi:sockets/udp@0.2.0#set-receive-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#send-buffer-size", + "wasi:sockets/udp@0.2.0#send-buffer-size", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#set-send-buffer-size", + "wasi:sockets/udp@0.2.0#set-send-buffer-size", vec![ValType::I32, ValType::I64], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#subscribe", + "wasi:sockets/udp@0.2.0#subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#drop-udp-socket", + "wasi:sockets/udp@0.2.0#drop-udp-socket", vec![ValType::I32], vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.stream", + "wasi:sockets/udp@0.2.0#[method]udp-socket.stream", vec![ ValType::I32, ValType::I32, @@ -331,37 +331,37 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.receive", + "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.receive", vec![ValType::I32, ValType::I64, ValType::I32], vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[resource-drop]incoming-datagram-stream", + "wasi:sockets/udp@0.2.0#[resource-drop]incoming-datagram-stream", vec![ValType::I32], vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.check-send", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.check-send", vec![ValType::I32, ValType::I32], vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.send", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.send", vec![ValType::I32, ValType::I32, ValType::I32, ValType::I32], vec![], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.subscribe", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[resource-drop]outgoing-datagram-stream", + "wasi:sockets/udp@0.2.0#[resource-drop]outgoing-datagram-stream", vec![ValType::I32], vec![], ), diff --git a/src/virt_env.rs b/src/virt_env.rs index 0776b70..ab9e1c5 100644 --- a/src/virt_env.rs +++ b/src/virt_env.rs @@ -222,7 +222,7 @@ pub(crate) fn stub_env_virt(module: &mut Module) -> Result<()> { module.replace_imported_func( module .imports - .get_func("wasi:cli/environment@0.2.0-rc-2024-01-16", fn_name)?, + .get_func("wasi:cli/environment@0.2.0", fn_name)?, |(body, _)| { body.unreachable(); }, @@ -239,9 +239,10 @@ pub(crate) fn strip_env_virt(module: &mut Module) -> Result<()> { stub_env_virt(module)?; for fn_name in WASI_ENV_FNS { - if let Ok(fid) = module.exports.get_func(format!( - "wasi:cli/environment@0.2.0-rc-2024-01-16#{fn_name}" - )) { + if let Ok(fid) = module + .exports + .get_func(format!("wasi:cli/environment@0.2.0#{fn_name}")) + { module.replace_exported_func(fid, |(body, _)| { body.unreachable(); })?; diff --git a/src/virt_io/clocks.rs b/src/virt_io/clocks.rs index 3a6b0d6..1cd64c2 100644 --- a/src/virt_io/clocks.rs +++ b/src/virt_io/clocks.rs @@ -6,22 +6,22 @@ use super::StubRequirement; /// Imports exposed by WASI for clocks functionality which are allowed to be const WASI_CLOCKS_IMPORTS: [(&str, &str, &StubRequirement); 4] = [ ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10", + "wasi:clocks/monotonic-clock@0.2.0", "now", &StubRequirement::Required, ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10", + "wasi:clocks/monotonic-clock@0.2.0", "resolution", &StubRequirement::Required, ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10", + "wasi:clocks/monotonic-clock@0.2.0", "subscribe-instant", &StubRequirement::Required, ), ( - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10", + "wasi:clocks/monotonic-clock@0.2.0", "subscribe-duration", &StubRequirement::Required, ), @@ -56,10 +56,10 @@ pub(crate) fn stub_clocks_virt(module: &mut Module) -> Result<()> { /// Exported functions related to WASI clocks const WASI_CLOCK_EXPORTS: [&str; 4] = [ - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#now", - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#resolution", - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#subscribe-instant", - "wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10#subscribe-duration", + "wasi:clocks/monotonic-clock@0.2.0#now", + "wasi:clocks/monotonic-clock@0.2.0#resolution", + "wasi:clocks/monotonic-clock@0.2.0#subscribe-instant", + "wasi:clocks/monotonic-clock@0.2.0#subscribe-duration", ]; /// Strip exported WASI functions that implement clock access diff --git a/src/virt_io/filesystem.rs b/src/virt_io/filesystem.rs index 379edc3..cfd4899 100644 --- a/src/virt_io/filesystem.rs +++ b/src/virt_io/filesystem.rs @@ -9,157 +9,157 @@ use super::StubRequirement; /// whether the FS is used or not (`fs_used` in `stub_fs_virt`) const WASI_FS_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.advise", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.append-via-stream", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.create-directory-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.get-flags", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.link-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.metadata-hash", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.metadata-hash-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.read-directory", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.readlink-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.remove-directory-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.rename-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.set-size", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.set-times", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.set-times-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.symlink-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.sync", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.sync-data", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.unlink-file-at", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.write", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.write-via-stream", &StubRequirement::Optional, ), ( - "wasi:filesystem/preopens@0.2.0-rc-2023-11-10", + "wasi:filesystem/preopens@0.2.0", "get-directories", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[resource-drop]descriptor", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[resource-drop]directory-entry-stream", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.get-type", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.is-same-object", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.open-at", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.read", &StubRequirement::Optional, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]directory-entry-stream.read-directory-entry", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.read-via-stream", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.stat", &StubRequirement::DependsOnFsUsage, ), ( - "wasi:filesystem/types@0.2.0-rc-2023-11-10", + "wasi:filesystem/types@0.2.0", "[method]descriptor.stat-at", &StubRequirement::DependsOnFsUsage, ), @@ -207,37 +207,37 @@ pub(crate) fn stub_fs_virt(module: &mut Module, uses_fs: bool) -> Result<()> { } const WASI_FILESYSTEM_EXPORTS: &[&str] = &[ - "wasi:filesystem/preopens@0.2.0-rc-2023-11-10#get-directories", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.read-via-stream", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.write-via-stream", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.append-via-stream", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.advise", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.sync-data", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.get-flags", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.get-type", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.set-size", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.set-times", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.read", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.write", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.read-directory", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.sync", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.create-directory-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.stat", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.stat-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.set-times-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.link-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.open-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.readlink-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.remove-directory-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.rename-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.symlink-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.unlink-file-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.metadata-hash", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.metadata-hash-at", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]descriptor.is-same-object", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[dtor]descriptor", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[method]directory-entry-stream.read-directory-entry", - "wasi:filesystem/types@0.2.0-rc-2023-11-10#[dtor]directory-entry-stream", + "wasi:filesystem/preopens@0.2.0#get-directories", + "wasi:filesystem/types@0.2.0#[method]descriptor.read-via-stream", + "wasi:filesystem/types@0.2.0#[method]descriptor.write-via-stream", + "wasi:filesystem/types@0.2.0#[method]descriptor.append-via-stream", + "wasi:filesystem/types@0.2.0#[method]descriptor.advise", + "wasi:filesystem/types@0.2.0#[method]descriptor.sync-data", + "wasi:filesystem/types@0.2.0#[method]descriptor.get-flags", + "wasi:filesystem/types@0.2.0#[method]descriptor.get-type", + "wasi:filesystem/types@0.2.0#[method]descriptor.set-size", + "wasi:filesystem/types@0.2.0#[method]descriptor.set-times", + "wasi:filesystem/types@0.2.0#[method]descriptor.read", + "wasi:filesystem/types@0.2.0#[method]descriptor.write", + "wasi:filesystem/types@0.2.0#[method]descriptor.read-directory", + "wasi:filesystem/types@0.2.0#[method]descriptor.sync", + "wasi:filesystem/types@0.2.0#[method]descriptor.create-directory-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.stat", + "wasi:filesystem/types@0.2.0#[method]descriptor.stat-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.set-times-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.link-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.open-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.readlink-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.remove-directory-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.rename-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.symlink-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.unlink-file-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.metadata-hash", + "wasi:filesystem/types@0.2.0#[method]descriptor.metadata-hash-at", + "wasi:filesystem/types@0.2.0#[method]descriptor.is-same-object", + "wasi:filesystem/types@0.2.0#[dtor]descriptor", + "wasi:filesystem/types@0.2.0#[method]directory-entry-stream.read-directory-entry", + "wasi:filesystem/types@0.2.0#[dtor]directory-entry-stream", ]; /// Strip exported WASI functions that implement filesystem access diff --git a/src/virt_io/http.rs b/src/virt_io/http.rs index cf63823..4bfd08c 100644 --- a/src/virt_io/http.rs +++ b/src/virt_io/http.rs @@ -5,46 +5,46 @@ use super::StubRequirement; /// Exported functions related to WASI http const WASI_HTTP_EXPORTS: &[&str] = &[ - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]fields", - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]fields", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.get", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.set", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.delete", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.append", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.entries", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]fields.clone", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-body.stream", - "wasi:http/types@0.2.0-rc-2023-10-18#[static]incoming-body.finish", - "wasi:http/types@0.2.0-rc-2023-10-18#[static]outgoing-body.finish", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-request", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-body", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-request", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-body", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.method", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.path-with-query", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.scheme", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.authority", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.headers", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-request.consume", - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]outgoing-request", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-request.write", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]response-outparam", - "wasi:http/types@0.2.0-rc-2023-10-18#[static]response-outparam.set", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]incoming-response", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]outgoing-response", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.status", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.headers", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]incoming-response.consume", - "wasi:http/types@0.2.0-rc-2023-10-18#[constructor]outgoing-response", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-response.write", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]outgoing-body.write", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]future-trailers", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-trailers.get", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-trailers.subscribe", - "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]future-incoming-response", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.get", - "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.subscribe", - "wasi:http/outgoing-handler@0.2.0-rc-2023-10-18#handle", + "wasi:http/types@0.2.0#[dtor]fields", + "wasi:http/types@0.2.0#[constructor]fields", + "wasi:http/types@0.2.0#[method]fields.get", + "wasi:http/types@0.2.0#[method]fields.set", + "wasi:http/types@0.2.0#[method]fields.delete", + "wasi:http/types@0.2.0#[method]fields.append", + "wasi:http/types@0.2.0#[method]fields.entries", + "wasi:http/types@0.2.0#[method]fields.clone", + "wasi:http/types@0.2.0#[method]incoming-body.stream", + "wasi:http/types@0.2.0#[static]incoming-body.finish", + "wasi:http/types@0.2.0#[static]outgoing-body.finish", + "wasi:http/types@0.2.0#[dtor]incoming-request", + "wasi:http/types@0.2.0#[dtor]incoming-body", + "wasi:http/types@0.2.0#[dtor]outgoing-request", + "wasi:http/types@0.2.0#[dtor]outgoing-body", + "wasi:http/types@0.2.0#[method]incoming-request.method", + "wasi:http/types@0.2.0#[method]incoming-request.path-with-query", + "wasi:http/types@0.2.0#[method]incoming-request.scheme", + "wasi:http/types@0.2.0#[method]incoming-request.authority", + "wasi:http/types@0.2.0#[method]incoming-request.headers", + "wasi:http/types@0.2.0#[method]incoming-request.consume", + "wasi:http/types@0.2.0#[constructor]outgoing-request", + "wasi:http/types@0.2.0#[method]outgoing-request.write", + "wasi:http/types@0.2.0#[dtor]response-outparam", + "wasi:http/types@0.2.0#[static]response-outparam.set", + "wasi:http/types@0.2.0#[dtor]incoming-response", + "wasi:http/types@0.2.0#[dtor]outgoing-response", + "wasi:http/types@0.2.0#[method]incoming-response.status", + "wasi:http/types@0.2.0#[method]incoming-response.headers", + "wasi:http/types@0.2.0#[method]incoming-response.consume", + "wasi:http/types@0.2.0#[constructor]outgoing-response", + "wasi:http/types@0.2.0#[method]outgoing-response.write", + "wasi:http/types@0.2.0#[method]outgoing-body.write", + "wasi:http/types@0.2.0#[dtor]future-trailers", + "wasi:http/types@0.2.0#[method]future-trailers.get", + "wasi:http/types@0.2.0#[method]future-trailers.subscribe", + "wasi:http/types@0.2.0#[dtor]future-incoming-response", + "wasi:http/types@0.2.0#[method]future-incoming-response.get", + "wasi:http/types@0.2.0#[method]future-incoming-response.subscribe", + "wasi:http/outgoing-handler@0.2.0#handle", ]; /// Strip exported WASI functions that implement HTTP access diff --git a/src/virt_io/io.rs b/src/virt_io/io.rs index 44ccf9f..7b72c36 100644 --- a/src/virt_io/io.rs +++ b/src/virt_io/io.rs @@ -8,115 +8,111 @@ use super::StubRequirement; /// Some imports are required, and others are optional. const WASI_IO_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.blocking-flush", &StubRequirement::Optional, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]input-stream.blocking-read", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]input-stream.blocking-skip", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.blocking-splice", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.blocking-write-and-flush", &StubRequirement::Optional, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.check-write", &StubRequirement::Optional, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[resource-drop]input-stream", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[resource-drop]output-stream", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.flush", &StubRequirement::Optional, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]input-stream.read", &StubRequirement::Optional, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]input-stream.skip", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.splice", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]input-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.write", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.write-zeroes", &StubRequirement::Required, ), ( - "wasi:io/streams@0.2.0-rc-2023-11-10", + "wasi:io/streams@0.2.0", "[method]output-stream.blocking-write-zeroes-and-flush", &StubRequirement::Required, ), ( - "wasi:io/error@0.2.0-rc-2023-11-10", + "wasi:io/error@0.2.0", "[resource-drop]error", &StubRequirement::Required, ), ( - "wasi:io/poll@0.2.0-rc-2023-11-10", + "wasi:io/poll@0.2.0", "[method]pollable.ready", &StubRequirement::Required, ), ( - "wasi:io/poll@0.2.0-rc-2023-11-10", + "wasi:io/poll@0.2.0", "[method]pollable.block", &StubRequirement::Required, ), ( - "wasi:io/poll@0.2.0-rc-2023-11-10", + "wasi:io/poll@0.2.0", "[resource-drop]pollable", &StubRequirement::Required, ), - ( - "wasi:io/poll@0.2.0-rc-2023-11-10", - "poll", - &StubRequirement::Required, - ), + ("wasi:io/poll@0.2.0", "poll", &StubRequirement::Required), ]; /// Replace imported WASI functions that implement general I/O access with no-ops @@ -158,29 +154,29 @@ pub(crate) fn stub_io_virt(module: &mut Module) -> Result<()> { /// Exported functions related to IO const WASI_IO_EXPORTS: &[&str] = &[ - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.blocking-flush", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]input-stream.blocking-read", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]input-stream.blocking-skip", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.blocking-splice", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.blocking-write-and-flush", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.check-write", - "wasi:io/streams@0.2.0-rc-2023-11-10#[dtor]input-stream", - "wasi:io/streams@0.2.0-rc-2023-11-10#[dtor]output-stream", - "wasi:io/error@0.2.0-rc-2023-11-10#[dtor]error", - "wasi:io/error@0.2.0-rc-2023-11-10#[method]error.to-debug-string", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.flush", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]input-stream.read", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]input-stream.skip", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.splice", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]input-stream.subscribe", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.subscribe", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.write", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.write-zeroes", - "wasi:io/streams@0.2.0-rc-2023-11-10#[method]output-stream.blocking-write-zeroes-and-flush", - "wasi:io/poll@0.2.0-rc-2023-11-10#[method]pollable.ready", - "wasi:io/poll@0.2.0-rc-2023-11-10#[method]pollable.block", - "wasi:io/poll@0.2.0-rc-2023-11-10#[dtor]pollable", - "wasi:io/poll@0.2.0-rc-2023-11-10#poll", + "wasi:io/streams@0.2.0#[method]output-stream.blocking-flush", + "wasi:io/streams@0.2.0#[method]input-stream.blocking-read", + "wasi:io/streams@0.2.0#[method]input-stream.blocking-skip", + "wasi:io/streams@0.2.0#[method]output-stream.blocking-splice", + "wasi:io/streams@0.2.0#[method]output-stream.blocking-write-and-flush", + "wasi:io/streams@0.2.0#[method]output-stream.check-write", + "wasi:io/streams@0.2.0#[dtor]input-stream", + "wasi:io/streams@0.2.0#[dtor]output-stream", + "wasi:io/error@0.2.0#[dtor]error", + "wasi:io/error@0.2.0#[method]error.to-debug-string", + "wasi:io/streams@0.2.0#[method]output-stream.flush", + "wasi:io/streams@0.2.0#[method]input-stream.read", + "wasi:io/streams@0.2.0#[method]input-stream.skip", + "wasi:io/streams@0.2.0#[method]output-stream.splice", + "wasi:io/streams@0.2.0#[method]input-stream.subscribe", + "wasi:io/streams@0.2.0#[method]output-stream.subscribe", + "wasi:io/streams@0.2.0#[method]output-stream.write", + "wasi:io/streams@0.2.0#[method]output-stream.write-zeroes", + "wasi:io/streams@0.2.0#[method]output-stream.blocking-write-zeroes-and-flush", + "wasi:io/poll@0.2.0#[method]pollable.ready", + "wasi:io/poll@0.2.0#[method]pollable.block", + "wasi:io/poll@0.2.0#[dtor]pollable", + "wasi:io/poll@0.2.0#poll", ]; /// Strip exported WASI functions that implement IO (streams, polling) access diff --git a/src/virt_io/sockets.rs b/src/virt_io/sockets.rs index 4a56cdb..c9e1044 100644 --- a/src/virt_io/sockets.rs +++ b/src/virt_io/sockets.rs @@ -6,272 +6,272 @@ use super::StubRequirement; /// Imports exposed by WASI for sockets functionality which are allowed to be missing const WASI_SOCKETS_IMPORTS: [(&str, &str, &StubRequirement); 54] = [ ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", + "wasi:sockets/ip-name-lookup@0.2.0", "resolve-addresses", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", + "wasi:sockets/ip-name-lookup@0.2.0", "[method]resolve-address-stream.resolve-next-address", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", + "wasi:sockets/ip-name-lookup@0.2.0", "[resource-drop]resolve-address-stream", &StubRequirement::Required, ), ( - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16", + "wasi:sockets/ip-name-lookup@0.2.0", "[method]resolve-address-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.start-bind", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.finish-bind", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.start-connect", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.finish-connect", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.start-listen", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.finish-listen", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.accept", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.local-address", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.remote-address", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.is-listening", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.address-family", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-listen-backlog-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.keep-alive-enabled", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-keep-alive-enabled", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.keep-alive-idle-time", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-keep-alive-idle-time", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.keep-alive-interval", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-keep-alive-interval", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.keep-alive-count", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-keep-alive-count", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.set-send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[method]tcp-socket.shutdown", &StubRequirement::Required, ), ( - "wasi:sockets/tcp@0.2.0-rc-2024-01-16", + "wasi:sockets/tcp@0.2.0", "[resource-drop]tcp-socket", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.start-bind", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.finish-bind", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.local-address", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.remote-address", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.address-family", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.unicast-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.set-unicast-hop-limit", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.set-receive-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.set-send-buffer-size", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]udp-socket.stream", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[resource-drop]udp-socket", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]incoming-datagram-stream.receive", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]incoming-datagram-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[resource-drop]incoming-datagram-stream", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]outgoing-datagram-stream.check-send", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]outgoing-datagram-stream.send", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[method]outgoing-datagram-stream.subscribe", &StubRequirement::Required, ), ( - "wasi:sockets/udp@0.2.0-rc-2024-01-16", + "wasi:sockets/udp@0.2.0", "[resource-drop]outgoing-datagram-stream", &StubRequirement::Required, ), @@ -307,60 +307,60 @@ pub(crate) fn stub_sockets_virt(module: &mut Module) -> Result<()> { /// Exported functions related to sockets const WASI_SOCKETS_EXPORTS: [&str; 54] = [ - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#resolve-addresses", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[method]resolve-address-stream.resolve-next-address", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[dtor]resolve-address-stream", - "wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16#[method]resolve-address-stream.subscribe", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-bind", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-bind", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-connect", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-connect", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.start-listen", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.finish-listen", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.accept", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.local-address", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.remote-address", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.is-listening", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.address-family", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-listen-backlog-size", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-enabled", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-enabled", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-idle-time", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-idle-time", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-interval", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-interval", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.keep-alive-count", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-keep-alive-count", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.hop-limit", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-hop-limit", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.receive-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-receive-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.send-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.set-send-buffer-size", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.subscribe", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[method]tcp-socket.shutdown", - "wasi:sockets/tcp@0.2.0-rc-2024-01-16#[dtor]tcp-socket", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.start-bind", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.finish-bind", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.local-address", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.remote-address", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.address-family", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.unicast-hop-limit", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-unicast-hop-limit", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.receive-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-receive-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.send-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.set-send-buffer-size", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.subscribe", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]udp-socket.stream", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]udp-socket", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.receive", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]incoming-datagram-stream.subscribe", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]incoming-datagram-stream", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.check-send", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.send", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[method]outgoing-datagram-stream.subscribe", - "wasi:sockets/udp@0.2.0-rc-2024-01-16#[dtor]outgoing-datagram-stream", + "wasi:sockets/ip-name-lookup@0.2.0#resolve-addresses", + "wasi:sockets/ip-name-lookup@0.2.0#[method]resolve-address-stream.resolve-next-address", + "wasi:sockets/ip-name-lookup@0.2.0#[dtor]resolve-address-stream", + "wasi:sockets/ip-name-lookup@0.2.0#[method]resolve-address-stream.subscribe", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-bind", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-bind", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-connect", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-connect", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-listen", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-listen", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.accept", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.local-address", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.remote-address", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.is-listening", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.address-family", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-listen-backlog-size", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-enabled", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-enabled", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-idle-time", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-interval", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-interval", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-count", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-count", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.hop-limit", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-hop-limit", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.receive-buffer-size", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-receive-buffer-size", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.send-buffer-size", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-send-buffer-size", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.subscribe", + "wasi:sockets/tcp@0.2.0#[method]tcp-socket.shutdown", + "wasi:sockets/tcp@0.2.0#[dtor]tcp-socket", + "wasi:sockets/udp@0.2.0#[method]udp-socket.start-bind", + "wasi:sockets/udp@0.2.0#[method]udp-socket.finish-bind", + "wasi:sockets/udp@0.2.0#[method]udp-socket.local-address", + "wasi:sockets/udp@0.2.0#[method]udp-socket.remote-address", + "wasi:sockets/udp@0.2.0#[method]udp-socket.address-family", + "wasi:sockets/udp@0.2.0#[method]udp-socket.unicast-hop-limit", + "wasi:sockets/udp@0.2.0#[method]udp-socket.set-unicast-hop-limit", + "wasi:sockets/udp@0.2.0#[method]udp-socket.receive-buffer-size", + "wasi:sockets/udp@0.2.0#[method]udp-socket.set-receive-buffer-size", + "wasi:sockets/udp@0.2.0#[method]udp-socket.send-buffer-size", + "wasi:sockets/udp@0.2.0#[method]udp-socket.set-send-buffer-size", + "wasi:sockets/udp@0.2.0#[method]udp-socket.subscribe", + "wasi:sockets/udp@0.2.0#[method]udp-socket.stream", + "wasi:sockets/udp@0.2.0#[dtor]udp-socket", + "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.receive", + "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0#[dtor]incoming-datagram-stream", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.check-send", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.send", + "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.subscribe", + "wasi:sockets/udp@0.2.0#[dtor]outgoing-datagram-stream", ]; /// Strip exported WASI functions that implement sockets access diff --git a/src/virt_io/stdio.rs b/src/virt_io/stdio.rs index 6a1b08a..36e0e46 100644 --- a/src/virt_io/stdio.rs +++ b/src/virt_io/stdio.rs @@ -6,42 +6,42 @@ use super::StubRequirement; /// Imports exposed by WASI for STDIO functionality which are allowed to be missing const WASI_STDIO_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ ( - "wasi:cli/stdin@0.2.0-rc-2024-01-16", + "wasi:cli/stdin@0.2.0", "get-stdin", &StubRequirement::Optional, ), ( - "wasi:cli/stdout@0.2.0-rc-2024-01-16", + "wasi:cli/stdout@0.2.0", "get-stdout", &StubRequirement::Optional, ), ( - "wasi:cli/stderr@0.2.0-rc-2024-01-16", + "wasi:cli/stderr@0.2.0", "get-stderr", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16", + "wasi:cli/terminal-stdin@0.2.0", "get-terminal-stdin", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16", + "wasi:cli/terminal-stdout@0.2.0", "get-terminal-stdout", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16", + "wasi:cli/terminal-stderr@0.2.0", "get-terminal-stderr", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-input@0.2.0-rc-2024-01-16", + "wasi:cli/terminal-input@0.2.0", "drop-terminal-input", &StubRequirement::Optional, ), ( - "wasi:cli/terminal-output@0.2.0-rc-2024-01-16", + "wasi:cli/terminal-output@0.2.0", "drop-terminal-output", &StubRequirement::Optional, ), @@ -72,14 +72,14 @@ pub(crate) fn stub_stdio_virt(module: &mut Module) -> Result<()> { /// Exported functions related to STDIO const WASI_STDIO_EXPORTS: [&str; 8] = [ - "wasi:cli/stdin@0.2.0-rc-2024-01-16#get-stdin", - "wasi:cli/stdout@0.2.0-rc-2024-01-16#get-stdout", - "wasi:cli/stderr@0.2.0-rc-2024-01-16#get-stderr", - "wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16#get-terminal-stdin", - "wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16#get-terminal-stdout", - "wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16#get-terminal-stderr", - "wasi:cli/terminal-input@0.2.0-rc-2024-01-16#[dtor]terminal-input", - "wasi:cli/terminal-output@0.2.0-rc-2024-01-16#[dtor]terminal-output", + "wasi:cli/stdin@0.2.0#get-stdin", + "wasi:cli/stdout@0.2.0#get-stdout", + "wasi:cli/stderr@0.2.0#get-stderr", + "wasi:cli/terminal-stdin@0.2.0#get-terminal-stdin", + "wasi:cli/terminal-stdout@0.2.0#get-terminal-stdout", + "wasi:cli/terminal-stderr@0.2.0#get-terminal-stderr", + "wasi:cli/terminal-input@0.2.0#[dtor]terminal-input", + "wasi:cli/terminal-output@0.2.0#[dtor]terminal-output", ]; /// Strip exported WASI functions that implement standard I/O (stdin, stdout, etc) access diff --git a/tests/cases/fs-nested-dir-read.toml b/tests/cases/fs-nested-dir-read.toml index a52ce39..faca022 100644 --- a/tests/cases/fs-nested-dir-read.toml +++ b/tests/cases/fs-nested-dir-read.toml @@ -11,7 +11,7 @@ stderr = "allow" virtualize = "./wit/deps" [expect] -file-read = '''package wasi:clocks@0.2.0-rc-2023-11-10; +file-read = '''package wasi:clocks@0.2.0; /// WASI Monotonic Clock is a clock API intended to let users measure elapsed /// time. /// @@ -23,7 +23,7 @@ file-read = '''package wasi:clocks@0.2.0-rc-2023-11-10; /// /// It is intended for measuring elapsed time. interface monotonic-clock { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; /// An instant in time, in nanoseconds. An instant is relative to an /// unspecified initial value, and can only be compared to instances from diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 9672eb1..5d71e4e 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -15,11 +15,13 @@ use crate::exports::wasi::filesystem::types::{ }; use crate::exports::wasi::http::outgoing_handler::Guest as OutgoingHandler; use crate::exports::wasi::http::types::{ - Error as HttpError, Fields, FutureIncomingResponse, FutureTrailers, GuestFields, - GuestFutureIncomingResponse, GuestFutureTrailers, GuestIncomingBody, GuestIncomingRequest, - GuestIncomingResponse, GuestOutgoingBody, GuestOutgoingRequest, GuestOutgoingResponse, - GuestResponseOutparam, IncomingBody, IncomingRequest, IncomingResponse, Method, OutgoingBody, - OutgoingRequest, OutgoingResponse, RequestOptions, ResponseOutparam, Scheme, StatusCode, + DnsErrorPayload, ErrorCode as HttpErrorCode, FieldSizePayload, Fields, FutureIncomingResponse, + FutureTrailers, Guest as GuestHttpTypes, GuestFields, GuestFutureIncomingResponse, + GuestFutureTrailers, GuestIncomingBody, GuestIncomingRequest, GuestIncomingResponse, + GuestOutgoingBody, GuestOutgoingRequest, GuestOutgoingResponse, GuestRequestOptions, + GuestResponseOutparam, HeaderError, Headers, IncomingBody, IncomingRequest, IncomingResponse, + Method, OutgoingBody, OutgoingRequest, OutgoingResponse, RequestOptions, ResponseOutparam, + Scheme, StatusCode, TlsAlertReceivedPayload, }; use crate::exports::wasi::io::error::GuestError as GuestStreamsError; use crate::exports::wasi::io::poll::{Guest as Poll, GuestPollable, Pollable}; @@ -109,7 +111,7 @@ fn log(msg: &str) { #[derive(Debug)] pub enum IoError { - Code(ErrorCode), + FsCode(ErrorCode), Host(streams::Error), } @@ -303,7 +305,7 @@ impl StaticIndexEntry { } if offset.get() as usize > unsafe { self.data.active.1 } { return Err(StreamError::LastOperationFailed(Resource::new( - StreamsError::Code(ErrorCode::InvalidSeek), + StreamsError::FsCode(ErrorCode::InvalidSeek), ))); } let read_ptr = unsafe { self.data.active.0.add(offset.get() as usize) }; @@ -321,7 +323,7 @@ impl StaticIndexEntry { } if offset.get() as usize > unsafe { self.data.passive.1 } { return Err(StreamError::LastOperationFailed(Resource::new( - StreamsError::Code(ErrorCode::InvalidSeek), + StreamsError::FsCode(ErrorCode::InvalidSeek), ))); } let read_len = cmp::min( @@ -341,7 +343,7 @@ impl StaticIndexEntry { } StaticIndexType::RuntimeDir | StaticIndexType::Dir => { Err(StreamError::LastOperationFailed(Resource::new( - StreamsError::Code(ErrorCode::IsDirectory), + StreamsError::FsCode(ErrorCode::IsDirectory), ))) } StaticIndexType::RuntimeFile => { @@ -413,6 +415,8 @@ pub enum FilesystemDirectoryEntryStream { pub struct CliTerminalInput; pub struct CliTerminalOutput; +pub struct HttpTypes; + pub struct HttpFields(http_types::Fields); pub struct HttpFutureIncomingResponse(http_types::FutureIncomingResponse); pub struct HttpFutureTrailers(http_types::FutureTrailers); @@ -423,6 +427,8 @@ pub struct HttpOutgoingBody(http_types::OutgoingBody); pub struct HttpOutgoingRequest(http_types::OutgoingRequest); pub struct HttpOutgoingResponse(http_types::OutgoingResponse); pub struct HttpResponseOutparam(http_types::ResponseOutparam); + +pub struct HttpRequestOptions(http_types::RequestOptions); pub struct SocketsResolveAddressStream(ip_name_lookup::ResolveAddressStream); pub struct SocketsTcpSocket(tcp::TcpSocket); pub struct SocketsUdpSocket(udp::UdpSocket); @@ -593,7 +599,7 @@ impl MonotonicClock for VirtAdapter { impl FilesystemTypes for VirtAdapter { fn filesystem_error_code(err: &StreamsError) -> Option { - if let StreamsError::Code(code) = err { + if let StreamsError::FsCode(code) = err { Some(*code) } else { None @@ -614,17 +620,48 @@ impl Preopens for VirtAdapter { impl OutgoingHandler for VirtAdapter { fn handle( request: Resource, - options: Option, - ) -> Result, HttpError> { + options: Option>, + ) -> Result, HttpErrorCode> { outgoing_handler::handle( Resource::into_inner(request).0, - options.map(request_options_map), + options.map(|o| Resource::into_inner(o).0), ) .map(|response| Resource::new(HttpFutureIncomingResponse(response))) .map_err(http_err_map_rev) } } +impl GuestRequestOptions for RequestOptions { + fn new() -> Self { + debug!("CALL wasi:http/types#request-options.new"); + Self(http_types::RequestOptions::new()) + } + fn connect_timeout(&self) -> Option { + debug!("CALL wasi:http/types#request-options.connect-timeout"); + self.0.connect_timeout() + } + fn set_connect_timeout(&self, duration: Option) -> Result<(), ()> { + debug!("CALL wasi:http/types#request-options.set-connect-timeout"); + self.0.set_connect_timeout(duration) + } + fn first_byte_timeout(&self) -> Option { + debug!("CALL wasi:http/types#request-options.first-byte-timeout"); + self.0.first_byte_timeout() + } + fn set_first_byte_timeout(&self, duration: Option) -> Result<(), ()> { + debug!("CALL wasi:http/types#request-options.set-first-byte-timeout"); + self.0.set_first_byte_timeout(duration) + } + fn between_bytes_timeout(&self) -> Option { + debug!("CALL wasi:http/types#request-options.between-bytes-timeout"); + self.0.between_bytes_timeout() + } + fn set_between_bytes_timeout(&self, duration: Option) -> Result<(), ()> { + debug!("CALL wasi:http/types#request-options.set-between-bytes-timeout"); + self.0.set_between_bytes_timeout(duration) + } +} + impl GuestPollable for IoPollable { fn ready(&self) -> bool { debug!("CALL wasi:io/poll#pollable.ready PID={self:?}",); @@ -1024,7 +1061,7 @@ impl GuestInputStream for InputStream { Self::Null => Ok(0), Self::Err => Err(StreamError::Closed), Self::StaticFile { .. } => Err(StreamError::LastOperationFailed(Resource::new( - StreamsError::Code(ErrorCode::Io), + StreamsError::FsCode(ErrorCode::Io), ))), Self::Host(descriptor) => descriptor.skip(offset).map_err(stream_err_map), } @@ -1035,7 +1072,7 @@ impl GuestInputStream for InputStream { Self::Null => Ok(0), Self::Err => Err(StreamError::Closed), Self::StaticFile { .. } => Err(StreamError::LastOperationFailed(Resource::new( - StreamsError::Code(ErrorCode::Io), + StreamsError::FsCode(ErrorCode::Io), ))), Self::Host(descriptor) => descriptor.blocking_skip(offset).map_err(stream_err_map), } @@ -1169,6 +1206,7 @@ impl GuestOutputStream for OutputStream { impl GuestStreamsError for StreamsError { fn to_debug_string(&self) -> String { + debug!("CALL wasi:io/error#to-debug-string"); format!("{self:?}") } } @@ -1186,30 +1224,40 @@ impl GuestDirectoryEntryStream for DirectoryEntryStream { } } +impl GuestHttpTypes for HttpTypes { + fn http_error_code(err: &IoError) -> Option { + debug!("CALL wasi:http/types#http-error-code"); + match err { + IoError::FsCode(_) => None, + IoError::Host(h) => http_types::http_error_code(h).map(|e| http_err_map_rev(e)), + } + } +} + impl GuestFields for Fields { - fn new(entries: Vec<(String, Vec)>) -> Self { + fn new() -> Self { debug!("CALL wasi:http/types#fields.constructor"); - Self(http_types::Fields::new(&entries)) + Self(http_types::Fields::new()) } fn get(&self, name: String) -> Vec> { - debug!("CALL wasi:http/types#fields.get"); + debug!("CALL wasi:http/types#fields.get NAME={name}"); self.0.get(&name) } - fn set(&self, name: String, values: Vec>) { - debug!("CALL wasi:http/types#fields.set"); - self.0.set(&name, &values) + fn set(&self, name: String, values: Vec>) -> Result<(), HeaderError> { + debug!("CALL wasi:http/types#fields.set NAME={name}"); + self.0.set(&name, &values).map_err(header_err_map_rev) } - fn delete(&self, name: String) { - debug!("CALL wasi:http/types#fields.delete"); - self.0.delete(&name) + fn delete(&self, name: String) -> Result<(), HeaderError> { + debug!("CALL wasi:http/types#fields.delete NAME={name}"); + self.0.delete(&name).map_err(header_err_map_rev) } - fn append(&self, name: String, value: Vec) { - debug!("CALL wasi:http/types#fields.append"); - self.0.append(&name, &value) + fn append(&self, name: String, value: Vec) -> Result<(), HeaderError> { + debug!("CALL wasi:http/types#fields.append NAME={name}"); + self.0.append(&name, &value).map_err(header_err_map_rev) } fn entries(&self) -> Vec<(String, Vec)> { @@ -1218,8 +1266,21 @@ impl GuestFields for Fields { } fn clone(&self) -> Resource { + debug!("CALL wasi:http/types#fields.clone"); Resource::new(Self(self.0.clone())) } + + fn from_list(list: Vec<(String, Vec)>) -> Result, HeaderError> { + debug!("CALL wasi:http/types#fields.from-list"); + http_types::Fields::from_list(&list) + .map(|fields| Resource::new(Self(fields))) + .map_err(header_err_map_rev) + } + + fn has(&self, name: String) -> bool { + debug!("CALL wasi:http/types#fields.has NAME={name}"); + self.0.has(&name) + } } impl GuestIncomingRequest for IncomingRequest { @@ -1250,31 +1311,57 @@ impl GuestIncomingRequest for IncomingRequest { } impl GuestOutgoingRequest for OutgoingRequest { - fn new( - method: Method, - path_with_query: Option, - scheme: Option, - authority: Option, - headers: &Fields, - ) -> Self { + fn new(headers: Resource) -> Self { debug!("CALL wasi:http/types#outgoing-request.new"); Self(http_types::OutgoingRequest::new( - &method_map(method), - path_with_query.as_deref(), - scheme.map(|s| scheme_map(s)).as_ref(), - authority.as_deref(), - &headers.0, + Resource::into_inner(headers).0, )) } - fn write(&self) -> Result, ()> { + fn body(&self) -> Result, ()> { debug!("CALL wasi:http/types#outgoing-request.write"); - Ok(Resource::new(HttpOutgoingBody(self.0.write()?))) + Ok(Resource::new(HttpOutgoingBody(self.0.body()?))) + } + + fn method(&self) -> Method { + method_map_rev(self.0.method()) + } + + fn set_method(&self, method: Method) -> Result<(), ()> { + self.0.set_method(&method_map(method)) + } + + fn path_with_query(&self) -> Option { + self.0.path_with_query() + } + + fn set_path_with_query(&self, path_with_query: Option) -> Result<(), ()> { + self.0.set_path_with_query(path_with_query.as_deref()) + } + + fn scheme(&self) -> Option { + self.0.scheme().map(scheme_map_rev) + } + + fn set_scheme(&self, scheme: Option) -> Result<(), ()> { + self.0.set_scheme(scheme.map(scheme_map).as_ref()) + } + + fn authority(&self) -> Option { + self.0.authority() + } + + fn set_authority(&self, authority: Option) -> Result<(), ()> { + self.0.set_authority(authority.as_deref()) + } + + fn headers(&self) -> Resource { + Resource::new(HttpFields(self.0.headers())) } } impl GuestResponseOutparam for ResponseOutparam { - fn set(param: Resource, response: Result, HttpError>) { + fn set(param: Resource, response: Result, HttpErrorCode>) { debug!("CALL wasi:http/types#response-outparam.set"); let param = Resource::into_inner(param).0; match response { @@ -1319,24 +1406,44 @@ impl GuestFutureTrailers for FutureTrailers { Resource::new(Pollable::Host(self.0.subscribe())) } - fn get(&self) -> Option, HttpError>> { + fn get(&self) -> Option>, HttpErrorCode>, ()>> { debug!("CALL wasi:http/types#future-trailers.get"); self.0.get().map(|r| { - r.map(|fields| Resource::new(HttpFields(fields))) - .map_err(|e| http_err_map_rev(e)) + r.map(|fields| { + fields + .map(|fields| fields.map(|fields| Resource::new(HttpFields(fields)))) + .map_err(http_err_map_rev) + }) }) } } impl GuestOutgoingResponse for OutgoingResponse { - fn new(status_code: StatusCode, headers: &Fields) -> Self { + fn new(headers: Resource) -> Self { debug!("CALL wasi:http/types#outgoing-response.constructor"); - Self(http_types::OutgoingResponse::new(status_code, &headers.0)) + Self(http_types::OutgoingResponse::new( + Resource::into_inner(headers).0, + )) + } + + fn status_code(&self) -> StatusCode { + debug!("CALL wasi:http/types#outgoing-response.status-code"); + self.0.status_code() + } + + fn set_status_code(&self, status_code: StatusCode) -> Result<(), ()> { + debug!("CALL wasi:http/types#outgoing-response.set-status-code"); + self.0.set_status_code(status_code) } - fn write(&self) -> Result, ()> { + fn headers(&self) -> Resource { + debug!("CALL wasi:http/types#outgoing-response.headers"); + Resource::new(HttpFields(self.0.headers())) + } + + fn body(&self) -> Result, ()> { debug!("CALL wasi:http/types#outgoing-response.body"); - Ok(Resource::new(HttpOutgoingBody(self.0.write()?))) + Ok(Resource::new(HttpOutgoingBody(self.0.body()?))) } } @@ -1353,12 +1460,16 @@ impl GuestOutgoingBody for OutgoingBody { Ok(Resource::new(OutputStream::Host(self.0.write()?))) } - fn finish(body: Resource, trailers: Option>) { + fn finish( + body: Resource, + trailers: Option>, + ) -> Result<(), HttpErrorCode> { debug!("CALL wasi:http/types#outgoing-body.finish"); http_types::OutgoingBody::finish( Resource::into_inner(body).0, trailers.map(|fields| Resource::into_inner(fields).0), ) + .map_err(http_err_map_rev) } } @@ -1368,7 +1479,7 @@ impl GuestFutureIncomingResponse for FutureIncomingResponse { Resource::new(Pollable::Host(self.0.subscribe())) } - fn get(&self) -> Option, HttpError>, ()>> { + fn get(&self) -> Option, HttpErrorCode>, ()>> { debug!("CALL wasi:http/types#future-incoming-response.get"); self.0.get().map(|r| { r.map(|r| { @@ -1756,6 +1867,14 @@ fn scheme_map_rev(scheme: http_types::Scheme) -> Scheme { } } +fn header_err_map_rev(err: http_types::HeaderError) -> HeaderError { + match err { + http_types::HeaderError::InvalidSyntax => HeaderError::InvalidSyntax, + http_types::HeaderError::Forbidden => HeaderError::Forbidden, + http_types::HeaderError::Immutable => HeaderError::Immutable, + } +} + fn method_map_rev(method: http_types::Method) -> Method { match method { http_types::Method::Get => Method::Get, @@ -1786,29 +1905,189 @@ fn method_map(method: Method) -> http_types::Method { } } -fn http_err_map(err: HttpError) -> http_types::Error { +fn http_err_map(err: HttpErrorCode) -> http_types::ErrorCode { match err { - HttpError::InvalidUrl(s) => http_types::Error::InvalidUrl(s), - HttpError::TimeoutError(s) => http_types::Error::TimeoutError(s), - HttpError::ProtocolError(s) => http_types::Error::ProtocolError(s), - HttpError::UnexpectedError(s) => http_types::Error::UnexpectedError(s), + HttpErrorCode::DnsTimeout => http_types::ErrorCode::DnsTimeout, + HttpErrorCode::DnsError(DnsErrorPayload { rcode, info_code }) => { + http_types::ErrorCode::DnsError(http_types::DnsErrorPayload { rcode, info_code }) + } + HttpErrorCode::DestinationNotFound => http_types::ErrorCode::DestinationNotFound, + HttpErrorCode::DestinationUnavailable => http_types::ErrorCode::DestinationUnavailable, + HttpErrorCode::DestinationIpProhibited => http_types::ErrorCode::DestinationIpProhibited, + HttpErrorCode::DestinationIpUnroutable => http_types::ErrorCode::DestinationIpUnroutable, + HttpErrorCode::ConnectionRefused => http_types::ErrorCode::ConnectionRefused, + HttpErrorCode::ConnectionTerminated => http_types::ErrorCode::ConnectionTerminated, + HttpErrorCode::ConnectionTimeout => http_types::ErrorCode::ConnectionTimeout, + HttpErrorCode::ConnectionReadTimeout => http_types::ErrorCode::ConnectionReadTimeout, + HttpErrorCode::ConnectionWriteTimeout => http_types::ErrorCode::ConnectionWriteTimeout, + HttpErrorCode::ConnectionLimitReached => http_types::ErrorCode::ConnectionLimitReached, + HttpErrorCode::TlsProtocolError => http_types::ErrorCode::TlsProtocolError, + HttpErrorCode::TlsCertificateError => http_types::ErrorCode::TlsCertificateError, + HttpErrorCode::TlsAlertReceived(TlsAlertReceivedPayload { + alert_id, + alert_message, + }) => http_types::ErrorCode::TlsAlertReceived(http_types::TlsAlertReceivedPayload { + alert_id, + alert_message, + }), + HttpErrorCode::HttpRequestDenied => http_types::ErrorCode::HttpRequestDenied, + HttpErrorCode::HttpRequestLengthRequired => { + http_types::ErrorCode::HttpRequestLengthRequired + } + HttpErrorCode::HttpRequestBodySize(s) => http_types::ErrorCode::HttpRequestBodySize(s), + HttpErrorCode::HttpRequestMethodInvalid => http_types::ErrorCode::HttpRequestMethodInvalid, + HttpErrorCode::HttpRequestUriInvalid => http_types::ErrorCode::HttpRequestUriInvalid, + HttpErrorCode::HttpRequestUriTooLong => http_types::ErrorCode::HttpRequestUriTooLong, + HttpErrorCode::HttpRequestHeaderSectionSize(s) => { + http_types::ErrorCode::HttpRequestHeaderSectionSize(s) + } + HttpErrorCode::HttpRequestHeaderSize(Some(FieldSizePayload { + field_name, + field_size, + })) => http_types::ErrorCode::HttpRequestHeaderSize(Some(http_types::FieldSizePayload { + field_name, + field_size, + })), + HttpErrorCode::HttpRequestHeaderSize(None) => { + http_types::ErrorCode::HttpRequestHeaderSize(None) + } + HttpErrorCode::HttpRequestTrailerSectionSize(s) => { + http_types::ErrorCode::HttpRequestTrailerSectionSize(s) + } + HttpErrorCode::HttpRequestTrailerSize(FieldSizePayload { + field_name, + field_size, + }) => http_types::ErrorCode::HttpRequestTrailerSize(http_types::FieldSizePayload { + field_name, + field_size, + }), + HttpErrorCode::HttpResponseIncomplete => http_types::ErrorCode::HttpResponseIncomplete, + HttpErrorCode::HttpResponseHeaderSectionSize(s) => { + http_types::ErrorCode::HttpResponseHeaderSectionSize(s) + } + HttpErrorCode::HttpResponseHeaderSize(FieldSizePayload { + field_name, + field_size, + }) => http_types::ErrorCode::HttpResponseHeaderSize(http_types::FieldSizePayload { + field_name, + field_size, + }), + HttpErrorCode::HttpResponseBodySize(s) => http_types::ErrorCode::HttpResponseBodySize(s), + HttpErrorCode::HttpResponseTrailerSectionSize(s) => { + http_types::ErrorCode::HttpResponseTrailerSectionSize(s) + } + HttpErrorCode::HttpResponseTrailerSize(FieldSizePayload { + field_name, + field_size, + }) => http_types::ErrorCode::HttpResponseTrailerSize(http_types::FieldSizePayload { + field_name, + field_size, + }), + HttpErrorCode::HttpResponseTransferCoding(e) => { + http_types::ErrorCode::HttpResponseTransferCoding(e) + } + HttpErrorCode::HttpResponseContentCoding(e) => { + http_types::ErrorCode::HttpResponseContentCoding(e) + } + HttpErrorCode::HttpResponseTimeout => http_types::ErrorCode::HttpResponseTimeout, + HttpErrorCode::HttpUpgradeFailed => http_types::ErrorCode::HttpUpgradeFailed, + HttpErrorCode::HttpProtocolError => http_types::ErrorCode::HttpProtocolError, + HttpErrorCode::LoopDetected => http_types::ErrorCode::LoopDetected, + HttpErrorCode::ConfigurationError => http_types::ErrorCode::ConfigurationError, + HttpErrorCode::InternalError(e) => http_types::ErrorCode::InternalError(e), } } -fn http_err_map_rev(err: http_types::Error) -> HttpError { +fn http_err_map_rev(err: http_types::ErrorCode) -> HttpErrorCode { match err { - http_types::Error::InvalidUrl(s) => HttpError::InvalidUrl(s), - http_types::Error::TimeoutError(s) => HttpError::TimeoutError(s), - http_types::Error::ProtocolError(s) => HttpError::ProtocolError(s), - http_types::Error::UnexpectedError(s) => HttpError::UnexpectedError(s), - } -} - -fn request_options_map(options: RequestOptions) -> http_types::RequestOptions { - http_types::RequestOptions { - connect_timeout_ms: options.connect_timeout_ms, - first_byte_timeout_ms: options.first_byte_timeout_ms, - between_bytes_timeout_ms: options.between_bytes_timeout_ms, + http_types::ErrorCode::DnsTimeout => HttpErrorCode::DnsTimeout, + http_types::ErrorCode::DnsError(http_types::DnsErrorPayload { rcode, info_code }) => { + HttpErrorCode::DnsError(DnsErrorPayload { rcode, info_code }) + } + http_types::ErrorCode::DestinationNotFound => HttpErrorCode::DestinationNotFound, + http_types::ErrorCode::DestinationUnavailable => HttpErrorCode::DestinationUnavailable, + http_types::ErrorCode::DestinationIpProhibited => HttpErrorCode::DestinationIpProhibited, + http_types::ErrorCode::DestinationIpUnroutable => HttpErrorCode::DestinationIpUnroutable, + http_types::ErrorCode::ConnectionRefused => HttpErrorCode::ConnectionRefused, + http_types::ErrorCode::ConnectionTerminated => HttpErrorCode::ConnectionTerminated, + http_types::ErrorCode::ConnectionTimeout => HttpErrorCode::ConnectionTimeout, + http_types::ErrorCode::ConnectionReadTimeout => HttpErrorCode::ConnectionReadTimeout, + http_types::ErrorCode::ConnectionWriteTimeout => HttpErrorCode::ConnectionWriteTimeout, + http_types::ErrorCode::ConnectionLimitReached => HttpErrorCode::ConnectionLimitReached, + http_types::ErrorCode::TlsProtocolError => HttpErrorCode::TlsProtocolError, + http_types::ErrorCode::TlsCertificateError => HttpErrorCode::TlsCertificateError, + http_types::ErrorCode::TlsAlertReceived(http_types::TlsAlertReceivedPayload { + alert_id, + alert_message, + }) => HttpErrorCode::TlsAlertReceived(TlsAlertReceivedPayload { + alert_id, + alert_message, + }), + http_types::ErrorCode::HttpRequestDenied => HttpErrorCode::HttpRequestDenied, + http_types::ErrorCode::HttpRequestLengthRequired => { + HttpErrorCode::HttpRequestLengthRequired + } + http_types::ErrorCode::HttpRequestBodySize(s) => HttpErrorCode::HttpRequestBodySize(s), + http_types::ErrorCode::HttpRequestMethodInvalid => HttpErrorCode::HttpRequestMethodInvalid, + http_types::ErrorCode::HttpRequestUriInvalid => HttpErrorCode::HttpRequestUriInvalid, + http_types::ErrorCode::HttpRequestUriTooLong => HttpErrorCode::HttpRequestUriTooLong, + http_types::ErrorCode::HttpRequestHeaderSectionSize(s) => { + HttpErrorCode::HttpRequestHeaderSectionSize(s) + } + http_types::ErrorCode::HttpRequestHeaderSize(Some(http_types::FieldSizePayload { + field_name, + field_size, + })) => HttpErrorCode::HttpRequestHeaderSize(Some(FieldSizePayload { + field_name, + field_size, + })), + http_types::ErrorCode::HttpRequestHeaderSize(None) => { + HttpErrorCode::HttpRequestHeaderSize(None) + } + http_types::ErrorCode::HttpRequestTrailerSectionSize(s) => { + HttpErrorCode::HttpRequestTrailerSectionSize(s) + } + http_types::ErrorCode::HttpRequestTrailerSize(http_types::FieldSizePayload { + field_name, + field_size, + }) => HttpErrorCode::HttpRequestTrailerSize(FieldSizePayload { + field_name, + field_size, + }), + http_types::ErrorCode::HttpResponseIncomplete => HttpErrorCode::HttpResponseIncomplete, + http_types::ErrorCode::HttpResponseHeaderSectionSize(s) => { + HttpErrorCode::HttpResponseHeaderSectionSize(s) + } + http_types::ErrorCode::HttpResponseHeaderSize(http_types::FieldSizePayload { + field_name, + field_size, + }) => HttpErrorCode::HttpResponseHeaderSize(FieldSizePayload { + field_name, + field_size, + }), + http_types::ErrorCode::HttpResponseBodySize(s) => HttpErrorCode::HttpResponseBodySize(s), + http_types::ErrorCode::HttpResponseTrailerSectionSize(s) => { + HttpErrorCode::HttpResponseTrailerSectionSize(s) + } + http_types::ErrorCode::HttpResponseTrailerSize(http_types::FieldSizePayload { + field_name, + field_size, + }) => HttpErrorCode::HttpResponseTrailerSize(FieldSizePayload { + field_name, + field_size, + }), + http_types::ErrorCode::HttpResponseTransferCoding(e) => { + HttpErrorCode::HttpResponseTransferCoding(e) + } + http_types::ErrorCode::HttpResponseContentCoding(e) => { + HttpErrorCode::HttpResponseContentCoding(e) + } + http_types::ErrorCode::HttpResponseTimeout => HttpErrorCode::HttpResponseTimeout, + http_types::ErrorCode::HttpUpgradeFailed => HttpErrorCode::HttpUpgradeFailed, + http_types::ErrorCode::HttpProtocolError => HttpErrorCode::HttpProtocolError, + http_types::ErrorCode::LoopDetected => HttpErrorCode::LoopDetected, + http_types::ErrorCode::ConfigurationError => HttpErrorCode::ConfigurationError, + http_types::ErrorCode::InternalError(e) => HttpErrorCode::InternalError(e), } } diff --git a/virtual-adapter/src/lib.rs b/virtual-adapter/src/lib.rs index e3032e7..3b69025 100644 --- a/virtual-adapter/src/lib.rs +++ b/virtual-adapter/src/lib.rs @@ -10,25 +10,22 @@ wit_bindgen::generate!({ path: "../wit", world: "virtual-adapter", exports: { - "wasi:io/poll": VirtAdapter, - "wasi:io/poll/pollable": io::IoPollable, - "wasi:io/error/error": io::IoError, - "wasi:io/streams/input-stream": io::IoInputStream, - "wasi:io/streams/output-stream": io::IoOutputStream, - "wasi:filesystem/preopens": VirtAdapter, - "wasi:filesystem/types": VirtAdapter, - "wasi:filesystem/types/descriptor": io::FilesystemDescriptor, - "wasi:filesystem/types/directory-entry-stream": io::FilesystemDirectoryEntryStream, "wasi:cli/environment": VirtAdapter, + "wasi:cli/stderr": VirtAdapter, "wasi:cli/stdin": VirtAdapter, "wasi:cli/stdout": VirtAdapter, - "wasi:cli/stderr": VirtAdapter, "wasi:cli/terminal-input/terminal-input": io::CliTerminalInput, "wasi:cli/terminal-output/terminal-output": io::CliTerminalOutput, + "wasi:cli/terminal-stderr": VirtAdapter, "wasi:cli/terminal-stdin": VirtAdapter, "wasi:cli/terminal-stdout": VirtAdapter, - "wasi:cli/terminal-stderr": VirtAdapter, "wasi:clocks/monotonic-clock": VirtAdapter, + "wasi:filesystem/preopens": VirtAdapter, + "wasi:filesystem/types": VirtAdapter, + "wasi:filesystem/types/descriptor": io::FilesystemDescriptor, + "wasi:filesystem/types/directory-entry-stream": io::FilesystemDirectoryEntryStream, + "wasi:http/outgoing-handler": VirtAdapter, + "wasi:http/types": io::HttpTypes, "wasi:http/types/fields": io::HttpFields, "wasi:http/types/future-incoming-response": io::HttpFutureIncomingResponse, "wasi:http/types/future-trailers": io::HttpFutureTrailers, @@ -38,13 +35,18 @@ wit_bindgen::generate!({ "wasi:http/types/outgoing-body": io::HttpOutgoingBody, "wasi:http/types/outgoing-request": io::HttpOutgoingRequest, "wasi:http/types/outgoing-response": io::HttpOutgoingResponse, + "wasi:http/types/request-options": io::HttpRequestOptions, "wasi:http/types/response-outparam": io::HttpResponseOutparam, - "wasi:http/outgoing-handler": VirtAdapter, + "wasi:io/error/error": io::IoError, + "wasi:io/poll": VirtAdapter, + "wasi:io/poll/pollable": io::IoPollable, + "wasi:io/streams/input-stream": io::IoInputStream, + "wasi:io/streams/output-stream": io::IoOutputStream, "wasi:sockets/ip-name-lookup": VirtAdapter, "wasi:sockets/ip-name-lookup/resolve-address-stream": io::SocketsResolveAddressStream, "wasi:sockets/tcp/tcp-socket": io::SocketsTcpSocket, - "wasi:sockets/udp/udp-socket": io::SocketsUdpSocket, "wasi:sockets/udp/incoming-datagram-stream": io::SocketsIncomingDatagramStream, "wasi:sockets/udp/outgoing-datagram-stream": io::SocketsOutgoingDatagramStream, + "wasi:sockets/udp/udp-socket": io::SocketsUdpSocket, } }); diff --git a/wit/deps/cli/command.wit b/wit/deps/cli/command.wit index a988916..d8005bd 100644 --- a/wit/deps/cli/command.wit +++ b/wit/deps/cli/command.wit @@ -1,4 +1,4 @@ -package wasi:cli@0.2.0-rc-2024-01-16; +package wasi:cli@0.2.0; world command { include imports; diff --git a/wit/deps/cli/imports.wit b/wit/deps/cli/imports.wit index 8ce1abe..083b84a 100644 --- a/wit/deps/cli/imports.wit +++ b/wit/deps/cli/imports.wit @@ -1,11 +1,11 @@ -package wasi:cli@0.2.0-rc-2024-01-16; +package wasi:cli@0.2.0; world imports { - include wasi:clocks/imports@0.2.0-rc-2023-11-10; - include wasi:filesystem/imports@0.2.0-rc-2023-11-10; - include wasi:sockets/imports@0.2.0-rc-2024-01-16; - include wasi:random/imports@0.2.0-rc-2023-11-10; - include wasi:io/imports@0.2.0-rc-2023-11-10; + include wasi:clocks/imports@0.2.0; + include wasi:filesystem/imports@0.2.0; + include wasi:sockets/imports@0.2.0; + include wasi:random/imports@0.2.0; + include wasi:io/imports@0.2.0; import environment; import exit; diff --git a/wit/deps/cli/stdio.wit b/wit/deps/cli/stdio.wit index 1b653b6..31ef35b 100644 --- a/wit/deps/cli/stdio.wit +++ b/wit/deps/cli/stdio.wit @@ -1,17 +1,17 @@ interface stdin { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream}; + use wasi:io/streams@0.2.0.{input-stream}; get-stdin: func() -> input-stream; } interface stdout { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stdout: func() -> output-stream; } interface stderr { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stderr: func() -> output-stream; } diff --git a/wit/deps/clocks/monotonic-clock.wit b/wit/deps/clocks/monotonic-clock.wit index 09ef32c..4e4dc3a 100644 --- a/wit/deps/clocks/monotonic-clock.wit +++ b/wit/deps/clocks/monotonic-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Monotonic Clock is a clock API intended to let users measure elapsed /// time. /// @@ -10,7 +10,7 @@ package wasi:clocks@0.2.0-rc-2023-11-10; /// /// It is intended for measuring elapsed time. interface monotonic-clock { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; /// An instant in time, in nanoseconds. An instant is relative to an /// unspecified initial value, and can only be compared to instances from diff --git a/wit/deps/clocks/wall-clock.wit b/wit/deps/clocks/wall-clock.wit index 8abb9a0..440ca0f 100644 --- a/wit/deps/clocks/wall-clock.wit +++ b/wit/deps/clocks/wall-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Wall Clock is a clock API intended to let users query the current /// time. The name "wall" makes an analogy to a "clock on the wall", which /// is not necessarily monotonic as it may be reset. diff --git a/wit/deps/clocks/world.wit b/wit/deps/clocks/world.wit index 8fa080f..c022457 100644 --- a/wit/deps/clocks/world.wit +++ b/wit/deps/clocks/world.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; world imports { import monotonic-clock; diff --git a/wit/deps/filesystem/preopens.wit b/wit/deps/filesystem/preopens.wit index 95ec678..da801f6 100644 --- a/wit/deps/filesystem/preopens.wit +++ b/wit/deps/filesystem/preopens.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; interface preopens { use types.{descriptor}; diff --git a/wit/deps/filesystem/types.wit b/wit/deps/filesystem/types.wit index 059722a..11108fc 100644 --- a/wit/deps/filesystem/types.wit +++ b/wit/deps/filesystem/types.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; /// WASI filesystem is a filesystem API primarily intended to let users run WASI /// programs that access their files on their existing filesystems, without /// significant overhead. @@ -24,8 +24,8 @@ package wasi:filesystem@0.2.0-rc-2023-11-10; /// /// [WASI filesystem path resolution]: https://github.com/WebAssembly/wasi-filesystem/blob/main/path-resolution.md interface types { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream, error}; - use wasi:clocks/wall-clock@0.2.0-rc-2023-11-10.{datetime}; + use wasi:io/streams@0.2.0.{input-stream, output-stream, error}; + use wasi:clocks/wall-clock@0.2.0.{datetime}; /// File size or length of a region within a file. type filesize = u64; diff --git a/wit/deps/filesystem/world.wit b/wit/deps/filesystem/world.wit index 285e0ba..663f579 100644 --- a/wit/deps/filesystem/world.wit +++ b/wit/deps/filesystem/world.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; world imports { import types; diff --git a/wit/deps/http/handler.wit b/wit/deps/http/handler.wit new file mode 100644 index 0000000..a34a064 --- /dev/null +++ b/wit/deps/http/handler.wit @@ -0,0 +1,43 @@ +/// This interface defines a handler of incoming HTTP Requests. It should +/// be exported by components which can respond to HTTP Requests. +interface incoming-handler { + use types.{incoming-request, response-outparam}; + + /// This function is invoked with an incoming HTTP Request, and a resource + /// `response-outparam` which provides the capability to reply with an HTTP + /// Response. The response is sent by calling the `response-outparam.set` + /// method, which allows execution to continue after the response has been + /// sent. This enables both streaming to the response body, and performing other + /// work. + /// + /// The implementor of this function must write a response to the + /// `response-outparam` before returning, or else the caller will respond + /// with an error on its behalf. + handle: func( + request: incoming-request, + response-out: response-outparam + ); +} + +/// This interface defines a handler of outgoing HTTP Requests. It should be +/// imported by components which wish to make HTTP Requests. +interface outgoing-handler { + use types.{ + outgoing-request, request-options, future-incoming-response, error-code + }; + + /// This function is invoked with an outgoing HTTP Request, and it returns + /// a resource `future-incoming-response` which represents an HTTP Response + /// which may arrive in the future. + /// + /// The `options` argument accepts optional parameters for the HTTP + /// protocol's transport layer. + /// + /// This function may return an error if the `outgoing-request` is invalid + /// or not allowed to be made. Otherwise, protocol errors are reported + /// through the `future-incoming-response`. + handle: func( + request: outgoing-request, + options: option + ) -> result; +} diff --git a/wit/deps/http/incoming-handler.wit b/wit/deps/http/incoming-handler.wit deleted file mode 100644 index 6968d63..0000000 --- a/wit/deps/http/incoming-handler.wit +++ /dev/null @@ -1,24 +0,0 @@ -// The `wasi:http/incoming-handler` interface is meant to be exported by -// components and called by the host in response to a new incoming HTTP -// response. -// -// NOTE: in Preview3, this interface will be merged with -// `wasi:http/outgoing-handler` into a single `wasi:http/handler` interface -// that takes a `request` parameter and returns a `response` result. -// -interface incoming-handler { - use types.{incoming-request, response-outparam}; - - // The `handle` function takes an outparam instead of returning its response - // so that the component may stream its response while streaming any other - // request or response bodies. The callee MUST write a response to the - // `response-outparam` and then finish the response before returning. The `handle` - // function is allowed to continue execution after finishing the response's - // output stream. While this post-response execution is taken off the - // critical path, since there is no return value, there is no way to report - // its success or failure. - handle: func( - request: incoming-request, - response-out: response-outparam - ); -} diff --git a/wit/deps/http/outgoing-handler.wit b/wit/deps/http/outgoing-handler.wit deleted file mode 100644 index 286e283..0000000 --- a/wit/deps/http/outgoing-handler.wit +++ /dev/null @@ -1,20 +0,0 @@ -// The `wasi:http/outgoing-handler` interface is meant to be imported by -// components and implemented by the host. -// -// NOTE: in Preview3, this interface will be merged with -// `wasi:http/outgoing-handler` into a single `wasi:http/handler` interface -// that takes a `request` parameter and returns a `response` result. -// -interface outgoing-handler { - use types.{outgoing-request, request-options, future-incoming-response, error}; - - // The parameter and result types of the `handle` function allow the caller - // to concurrently stream the bodies of the outgoing request and the incoming - // response. - // Consumes the outgoing-request. Gives an error if the outgoing-request - // is invalid or cannot be satisfied by this handler. - handle: func( - request: outgoing-request, - options: option - ) -> result; -} diff --git a/wit/deps/http/proxy.wit b/wit/deps/http/proxy.wit index 8906da1..687c24d 100644 --- a/wit/deps/http/proxy.wit +++ b/wit/deps/http/proxy.wit @@ -1,33 +1,32 @@ -package wasi:http@0.2.0-rc-2023-10-18; +package wasi:http@0.2.0; -// The `wasi:http/proxy` world captures a widely-implementable intersection of -// hosts that includes HTTP forward and reverse proxies. Components targeting -// this world may concurrently stream in and out any number of incoming and -// outgoing HTTP requests. +/// The `wasi:http/proxy` world captures a widely-implementable intersection of +/// hosts that includes HTTP forward and reverse proxies. Components targeting +/// this world may concurrently stream in and out any number of incoming and +/// outgoing HTTP requests. world proxy { - // HTTP proxies have access to time and randomness. - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; + /// HTTP proxies have access to time and randomness. + include wasi:clocks/imports@0.2.0; + import wasi:random/random@0.2.0; - // Proxies have standard output and error streams which are expected to - // terminate in a developer-facing console provided by the host. - import wasi:cli/stdout@0.2.0-rc-2024-01-16; - import wasi:cli/stderr@0.2.0-rc-2024-01-16; + /// Proxies have standard output and error streams which are expected to + /// terminate in a developer-facing console provided by the host. + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; - // TODO: this is a temporary workaround until component tooling is able to - // gracefully handle the absence of stdin. Hosts must return an eof stream - // for this import, which is what wasi-libc + tooling will do automatically - // when this import is properly removed. - import wasi:cli/stdin@0.2.0-rc-2024-01-16; + /// TODO: this is a temporary workaround until component tooling is able to + /// gracefully handle the absence of stdin. Hosts must return an eof stream + /// for this import, which is what wasi-libc + tooling will do automatically + /// when this import is properly removed. + import wasi:cli/stdin@0.2.0; - // This is the default handler to use when user code simply wants to make an - // HTTP request (e.g., via `fetch()`). + /// This is the default handler to use when user code simply wants to make an + /// HTTP request (e.g., via `fetch()`). import outgoing-handler; - // The host delivers incoming HTTP requests to a component by calling the - // `handle` function of this exported interface. A host may arbitrarily reuse - // or not reuse component instance when delivering incoming HTTP requests and - // thus a component must be able to handle 0..N calls to `handle`. + /// The host delivers incoming HTTP requests to a component by calling the + /// `handle` function of this exported interface. A host may arbitrarily reuse + /// or not reuse component instance when delivering incoming HTTP requests and + /// thus a component must be able to handle 0..N calls to `handle`. export incoming-handler; } diff --git a/wit/deps/http/types.wit b/wit/deps/http/types.wit index 5f604a6..755ac6a 100644 --- a/wit/deps/http/types.wit +++ b/wit/deps/http/types.wit @@ -1,11 +1,13 @@ -// The `wasi:http/types` interface is meant to be imported by components to -// define the HTTP resource types and operations used by the component's -// imported and exported interfaces. +/// This interface defines all of the types and methods for implementing +/// HTTP Requests and Responses, both incoming and outgoing, as well as +/// their headers, trailers, and bodies. interface types { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/error@0.2.0.{error as io-error}; + use wasi:io/poll@0.2.0.{pollable}; - // This type corresponds to HTTP standard Methods. + /// This type corresponds to HTTP standard Methods. variant method { get, head, @@ -19,196 +21,550 @@ interface types { other(string) } - // This type corresponds to HTTP standard Related Schemes. + /// This type corresponds to HTTP standard Related Schemes. variant scheme { HTTP, HTTPS, other(string) } - // TODO: perhaps better align with HTTP semantics? - // This type enumerates the different kinds of errors that may occur when - // initially returning a response. - variant error { - invalid-url(string), - timeout-error(string), - protocol-error(string), - unexpected-error(string) + /// These cases are inspired by the IANA HTTP Proxy Error Types: + /// https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types + variant error-code { + DNS-timeout, + DNS-error(DNS-error-payload), + destination-not-found, + destination-unavailable, + destination-IP-prohibited, + destination-IP-unroutable, + connection-refused, + connection-terminated, + connection-timeout, + connection-read-timeout, + connection-write-timeout, + connection-limit-reached, + TLS-protocol-error, + TLS-certificate-error, + TLS-alert-received(TLS-alert-received-payload), + HTTP-request-denied, + HTTP-request-length-required, + HTTP-request-body-size(option), + HTTP-request-method-invalid, + HTTP-request-URI-invalid, + HTTP-request-URI-too-long, + HTTP-request-header-section-size(option), + HTTP-request-header-size(option), + HTTP-request-trailer-section-size(option), + HTTP-request-trailer-size(field-size-payload), + HTTP-response-incomplete, + HTTP-response-header-section-size(option), + HTTP-response-header-size(field-size-payload), + HTTP-response-body-size(option), + HTTP-response-trailer-section-size(option), + HTTP-response-trailer-size(field-size-payload), + HTTP-response-transfer-coding(option), + HTTP-response-content-coding(option), + HTTP-response-timeout, + HTTP-upgrade-failed, + HTTP-protocol-error, + loop-detected, + configuration-error, + /// This is a catch-all error for anything that doesn't fit cleanly into a + /// more specific case. It also includes an optional string for an + /// unstructured description of the error. Users should not depend on the + /// string for diagnosing errors, as it's not required to be consistent + /// between implementations. + internal-error(option) } - // This following block defines the `fields` resource which corresponds to - // HTTP standard Fields. Soon, when resource types are added, the `type - // fields = u32` type alias can be replaced by a proper `resource fields` - // definition containing all the functions using the method syntactic sugar. - resource fields { - // Multiple values for a header are multiple entries in the list with the - // same key. - constructor(entries: list>>); + /// Defines the case payload type for `DNS-error` above: + record DNS-error-payload { + rcode: option, + info-code: option + } + + /// Defines the case payload type for `TLS-alert-received` above: + record TLS-alert-received-payload { + alert-id: option, + alert-message: option + } - // Values off wire are not necessarily well formed, so they are given by - // list instead of string. - get: func(name: string) -> list>; + /// Defines the case payload type for `HTTP-response-{header,trailer}-size` above: + record field-size-payload { + field-name: option, + field-size: option + } - // Values off wire are not necessarily well formed, so they are given by - // list instead of string. - set: func(name: string, value: list>); - delete: func(name: string); - append: func(name: string, value: list); + /// Attempts to extract a http-related `error` from the wasi:io `error` + /// provided. + /// + /// Stream operations which return + /// `wasi:io/stream/stream-error::last-operation-failed` have a payload of + /// type `wasi:io/error/error` with more information about the operation + /// that failed. This payload can be passed through to this function to see + /// if there's http-related information about the error to return. + /// + /// Note that this function is fallible because not all io-errors are + /// http-related errors. + http-error-code: func(err: borrow) -> option; + + /// This type enumerates the different kinds of errors that may occur when + /// setting or appending to a `fields` resource. + variant header-error { + /// This error indicates that a `field-key` or `field-value` was + /// syntactically invalid when used with an operation that sets headers in a + /// `fields`. + invalid-syntax, + + /// This error indicates that a forbidden `field-key` was used when trying + /// to set a header in a `fields`. + forbidden, + + /// This error indicates that the operation on the `fields` was not + /// permitted because the fields are immutable. + immutable, + } - // Values off wire are not necessarily well formed, so they are given by - // list instead of string. - entries: func() -> list>>; + /// Field keys are always strings. + type field-key = string; + + /// Field values should always be ASCII strings. However, in + /// reality, HTTP implementations often have to interpret malformed values, + /// so they are provided as a list of bytes. + type field-value = list; + + /// This following block defines the `fields` resource which corresponds to + /// HTTP standard Fields. Fields are a common representation used for both + /// Headers and Trailers. + /// + /// A `fields` may be mutable or immutable. A `fields` created using the + /// constructor, `from-list`, or `clone` will be mutable, but a `fields` + /// resource given by other means (including, but not limited to, + /// `incoming-request.headers`, `outgoing-request.headers`) might be be + /// immutable. In an immutable fields, the `set`, `append`, and `delete` + /// operations will fail with `header-error.immutable`. + resource fields { - // Deep copy of all contents in a fields. + /// Construct an empty HTTP Fields. + /// + /// The resulting `fields` is mutable. + constructor(); + + /// Construct an HTTP Fields. + /// + /// The resulting `fields` is mutable. + /// + /// The list represents each key-value pair in the Fields. Keys + /// which have multiple values are represented by multiple entries in this + /// list with the same key. + /// + /// The tuple is a pair of the field key, represented as a string, and + /// Value, represented as a list of bytes. In a valid Fields, all keys + /// and values are valid UTF-8 strings. However, values are not always + /// well-formed, so they are represented as a raw list of bytes. + /// + /// An error result will be returned if any header or value was + /// syntactically invalid, or if a header was forbidden. + from-list: static func( + entries: list> + ) -> result; + + /// Get all of the values corresponding to a key. If the key is not present + /// in this `fields`, an empty list is returned. However, if the key is + /// present but empty, this is represented by a list with one or more + /// empty field-values present. + get: func(name: field-key) -> list; + + /// Returns `true` when the key is present in this `fields`. If the key is + /// syntactically invalid, `false` is returned. + has: func(name: field-key) -> bool; + + /// Set all of the values for a key. Clears any existing values for that + /// key, if they have been set. + /// + /// Fails with `header-error.immutable` if the `fields` are immutable. + set: func(name: field-key, value: list) -> result<_, header-error>; + + /// Delete all values for a key. Does nothing if no values for the key + /// exist. + /// + /// Fails with `header-error.immutable` if the `fields` are immutable. + delete: func(name: field-key) -> result<_, header-error>; + + /// Append a value for a key. Does not change or delete any existing + /// values for that key. + /// + /// Fails with `header-error.immutable` if the `fields` are immutable. + append: func(name: field-key, value: field-value) -> result<_, header-error>; + + /// Retrieve the full set of keys and values in the Fields. Like the + /// constructor, the list represents each key-value pair. + /// + /// The outer list represents each key-value pair in the Fields. Keys + /// which have multiple values are represented by multiple entries in this + /// list with the same key. + entries: func() -> list>; + + /// Make a deep copy of the Fields. Equivelant in behavior to calling the + /// `fields` constructor on the return value of `entries`. The resulting + /// `fields` is mutable. clone: func() -> fields; } + /// Headers is an alias for Fields. type headers = fields; + + /// Trailers is an alias for Fields. type trailers = fields; - // The following block defines the `incoming-request` and `outgoing-request` - // resource types that correspond to HTTP standard Requests. Soon, when - // resource types are added, the `u32` type aliases can be replaced by - // proper `resource` type definitions containing all the functions as - // methods. Later, Preview2 will allow both types to be merged together into - // a single `request` type (that uses the single `stream` type mentioned - // above). The `consume` and `write` methods may only be called once (and - // return failure thereafter). + /// Represents an incoming HTTP Request. resource incoming-request { + + /// Returns the method of the incoming request. method: func() -> method; + /// Returns the path with query parameters from the request, as a string. path-with-query: func() -> option; + /// Returns the protocol scheme from the request. scheme: func() -> option; + /// Returns the authority from the request, if it was present. authority: func() -> option; - headers: func() -> /* child */ headers; - // Will return the input-stream child at most once. If called more than - // once, subsequent calls will return error. - + /// Get the `headers` associated with the request. + /// + /// The returned `headers` resource is immutable: `set`, `append`, and + /// `delete` operations will fail with `header-error.immutable`. + /// + /// The `headers` returned are a child resource: it must be dropped before + /// the parent `incoming-request` is dropped. Dropping this + /// `incoming-request` before all children are dropped will trap. + headers: func() -> headers; + + /// Gives the `incoming-body` associated with this request. Will only + /// return success at most once, and subsequent calls will return error. consume: func() -> result; } + /// Represents an outgoing HTTP Request. resource outgoing-request { + + /// Construct a new `outgoing-request` with a default `method` of `GET`, and + /// `none` values for `path-with-query`, `scheme`, and `authority`. + /// + /// * `headers` is the HTTP Headers for the Request. + /// + /// It is possible to construct, or manipulate with the accessor functions + /// below, an `outgoing-request` with an invalid combination of `scheme` + /// and `authority`, or `headers` which are not permitted to be sent. + /// It is the obligation of the `outgoing-handler.handle` implementation + /// to reject invalid constructions of `outgoing-request`. constructor( - method: method, - path-with-query: option, - scheme: option, - authority: option, - headers: borrow + headers: headers ); - // Will return the outgoing-body child at most once. If called more than - // once, subsequent calls will return error. - write: func() -> result< /* child */ outgoing-body>; - } + /// Returns the resource corresponding to the outgoing Body for this + /// Request. + /// + /// Returns success on the first call: the `outgoing-body` resource for + /// this `outgoing-request` can be retrieved at most once. Subsequent + /// calls will return error. + body: func() -> result; - // Additional optional parameters that can be set when making a request. - record request-options { - // The following timeouts are specific to the HTTP protocol and work - // independently of the overall timeouts passed to `io.poll.poll-list`. + /// Get the Method for the Request. + method: func() -> method; + /// Set the Method for the Request. Fails if the string present in a + /// `method.other` argument is not a syntactically valid method. + set-method: func(method: method) -> result; - // The timeout for the initial connect. - connect-timeout-ms: option, + /// Get the combination of the HTTP Path and Query for the Request. + /// When `none`, this represents an empty Path and empty Query. + path-with-query: func() -> option; + /// Set the combination of the HTTP Path and Query for the Request. + /// When `none`, this represents an empty Path and empty Query. Fails is the + /// string given is not a syntactically valid path and query uri component. + set-path-with-query: func(path-with-query: option) -> result; - // The timeout for receiving the first byte of the response body. - first-byte-timeout-ms: option, + /// Get the HTTP Related Scheme for the Request. When `none`, the + /// implementation may choose an appropriate default scheme. + scheme: func() -> option; + /// Set the HTTP Related Scheme for the Request. When `none`, the + /// implementation may choose an appropriate default scheme. Fails if the + /// string given is not a syntactically valid uri scheme. + set-scheme: func(scheme: option) -> result; + + /// Get the HTTP Authority for the Request. A value of `none` may be used + /// with Related Schemes which do not require an Authority. The HTTP and + /// HTTPS schemes always require an authority. + authority: func() -> option; + /// Set the HTTP Authority for the Request. A value of `none` may be used + /// with Related Schemes which do not require an Authority. The HTTP and + /// HTTPS schemes always require an authority. Fails if the string given is + /// not a syntactically valid uri authority. + set-authority: func(authority: option) -> result; + + /// Get the headers associated with the Request. + /// + /// The returned `headers` resource is immutable: `set`, `append`, and + /// `delete` operations will fail with `header-error.immutable`. + /// + /// This headers resource is a child: it must be dropped before the parent + /// `outgoing-request` is dropped, or its ownership is transfered to + /// another component by e.g. `outgoing-handler.handle`. + headers: func() -> headers; + } - // The timeout for receiving the next chunk of bytes in the response body - // stream. - between-bytes-timeout-ms: option + /// Parameters for making an HTTP Request. Each of these parameters is + /// currently an optional timeout applicable to the transport layer of the + /// HTTP protocol. + /// + /// These timeouts are separate from any the user may use to bound a + /// blocking call to `wasi:io/poll.poll`. + resource request-options { + /// Construct a default `request-options` value. + constructor(); + + /// The timeout for the initial connect to the HTTP Server. + connect-timeout: func() -> option; + + /// Set the timeout for the initial connect to the HTTP Server. An error + /// return value indicates that this timeout is not supported. + set-connect-timeout: func(duration: option) -> result; + + /// The timeout for receiving the first byte of the Response body. + first-byte-timeout: func() -> option; + + /// Set the timeout for receiving the first byte of the Response body. An + /// error return value indicates that this timeout is not supported. + set-first-byte-timeout: func(duration: option) -> result; + + /// The timeout for receiving subsequent chunks of bytes in the Response + /// body stream. + between-bytes-timeout: func() -> option; + + /// Set the timeout for receiving subsequent chunks of bytes in the Response + /// body stream. An error return value indicates that this timeout is not + /// supported. + set-between-bytes-timeout: func(duration: option) -> result; } - // The following block defines a special resource type used by the - // `wasi:http/incoming-handler` interface. When resource types are added, this - // block can be replaced by a proper `resource response-outparam { ... }` - // definition. Later, with Preview3, the need for an outparam goes away entirely - // (the `wasi:http/handler` interface used for both incoming and outgoing can - // simply return a `stream`). + /// Represents the ability to send an HTTP Response. + /// + /// This resource is used by the `wasi:http/incoming-handler` interface to + /// allow a Response to be sent corresponding to the Request provided as the + /// other argument to `incoming-handler.handle`. resource response-outparam { - set: static func(param: response-outparam, response: result); + + /// Set the value of the `response-outparam` to either send a response, + /// or indicate an error. + /// + /// This method consumes the `response-outparam` to ensure that it is + /// called at most once. If it is never called, the implementation + /// will respond with an error. + /// + /// The user may provide an `error` to `response` to allow the + /// implementation determine how to respond with an HTTP error response. + set: static func( + param: response-outparam, + response: result, + ); } - // This type corresponds to the HTTP standard Status Code. + /// This type corresponds to the HTTP standard Status Code. type status-code = u16; - // The following block defines the `incoming-response` and `outgoing-response` - // resource types that correspond to HTTP standard Responses. Soon, when - // resource types are added, the `u32` type aliases can be replaced by proper - // `resource` type definitions containing all the functions as methods. Later, - // Preview2 will allow both types to be merged together into a single `response` - // type (that uses the single `stream` type mentioned above). The `consume` and - // `write` methods may only be called once (and return failure thereafter). + /// Represents an incoming HTTP Response. resource incoming-response { - status: func() -> status-code; - headers: func() -> /* child */ headers; + /// Returns the status code from the incoming response. + status: func() -> status-code; - // May be called at most once. returns error if called additional times. - // TODO: make incoming-request-consume work the same way, giving a child - // incoming-body. + /// Returns the headers from the incoming response. + /// + /// The returned `headers` resource is immutable: `set`, `append`, and + /// `delete` operations will fail with `header-error.immutable`. + /// + /// This headers resource is a child: it must be dropped before the parent + /// `incoming-response` is dropped. + headers: func() -> headers; + + /// Returns the incoming body. May be called at most once. Returns error + /// if called additional times. consume: func() -> result; } + /// Represents an incoming HTTP Request or Response's Body. + /// + /// A body has both its contents - a stream of bytes - and a (possibly + /// empty) set of trailers, indicating that the full contents of the + /// body have been received. This resource represents the contents as + /// an `input-stream` and the delivery of trailers as a `future-trailers`, + /// and ensures that the user of this interface may only be consuming either + /// the body contents or waiting on trailers at any given time. resource incoming-body { - // returned input-stream is a child - the implementation may trap if - // incoming-body is dropped (or consumed by call to - // incoming-body-finish) before the input-stream is dropped. - // May be called at most once. returns error if called additional times. - %stream: func() -> result; - // takes ownership of incoming-body. this will trap if the - // incoming-body-stream child is still alive! - finish: static func(this: incoming-body) -> - /* transitive child of the incoming-response of incoming-body */ future-trailers; + /// Returns the contents of the body, as a stream of bytes. + /// + /// Returns success on first call: the stream representing the contents + /// can be retrieved at most once. Subsequent calls will return error. + /// + /// The returned `input-stream` resource is a child: it must be dropped + /// before the parent `incoming-body` is dropped, or consumed by + /// `incoming-body.finish`. + /// + /// This invariant ensures that the implementation can determine whether + /// the user is consuming the contents of the body, waiting on the + /// `future-trailers` to be ready, or neither. This allows for network + /// backpressure is to be applied when the user is consuming the body, + /// and for that backpressure to not inhibit delivery of the trailers if + /// the user does not read the entire body. + %stream: func() -> result; + + /// Takes ownership of `incoming-body`, and returns a `future-trailers`. + /// This function will trap if the `input-stream` child is still alive. + finish: static func(this: incoming-body) -> future-trailers; } + /// Represents a future which may eventaully return trailers, or an error. + /// + /// In the case that the incoming HTTP Request or Response did not have any + /// trailers, this future will resolve to the empty set of trailers once the + /// complete Request or Response body has been received. resource future-trailers { - /// Pollable that resolves when the body has been fully read, and the trailers - /// are ready to be consumed. - subscribe: func() -> /* child */ pollable; - /// Retrieve reference to trailers, if they are ready. - get: func() -> option>; + /// Returns a pollable which becomes ready when either the trailers have + /// been received, or an error has occured. When this pollable is ready, + /// the `get` method will return `some`. + subscribe: func() -> pollable; + + /// Returns the contents of the trailers, or an error which occured, + /// once the future is ready. + /// + /// The outer `option` represents future readiness. Users can wait on this + /// `option` to become `some` using the `subscribe` method. + /// + /// The outer `result` is used to retrieve the trailers or error at most + /// once. It will be success on the first call in which the outer option + /// is `some`, and error on subsequent calls. + /// + /// The inner `result` represents that either the HTTP Request or Response + /// body, as well as any trailers, were received successfully, or that an + /// error occured receiving them. The optional `trailers` indicates whether + /// or not trailers were present in the body. + /// + /// When some `trailers` are returned by this method, the `trailers` + /// resource is immutable, and a child. Use of the `set`, `append`, or + /// `delete` methods will return an error, and the resource must be + /// dropped before the parent `future-trailers` is dropped. + get: func() -> option, error-code>>>; } + /// Represents an outgoing HTTP Response. resource outgoing-response { - constructor(status-code: status-code, headers: borrow); - /// Will give the child outgoing-response at most once. subsequent calls will - /// return an error. - write: func() -> result; + /// Construct an `outgoing-response`, with a default `status-code` of `200`. + /// If a different `status-code` is needed, it must be set via the + /// `set-status-code` method. + /// + /// * `headers` is the HTTP Headers for the Response. + constructor(headers: headers); + + /// Get the HTTP Status Code for the Response. + status-code: func() -> status-code; + + /// Set the HTTP Status Code for the Response. Fails if the status-code + /// given is not a valid http status code. + set-status-code: func(status-code: status-code) -> result; + + /// Get the headers associated with the Request. + /// + /// The returned `headers` resource is immutable: `set`, `append`, and + /// `delete` operations will fail with `header-error.immutable`. + /// + /// This headers resource is a child: it must be dropped before the parent + /// `outgoing-request` is dropped, or its ownership is transfered to + /// another component by e.g. `outgoing-handler.handle`. + headers: func() -> headers; + + /// Returns the resource corresponding to the outgoing Body for this Response. + /// + /// Returns success on the first call: the `outgoing-body` resource for + /// this `outgoing-response` can be retrieved at most once. Subsequent + /// calls will return error. + body: func() -> result; } + /// Represents an outgoing HTTP Request or Response's Body. + /// + /// A body has both its contents - a stream of bytes - and a (possibly + /// empty) set of trailers, inducating the full contents of the body + /// have been sent. This resource represents the contents as an + /// `output-stream` child resource, and the completion of the body (with + /// optional trailers) with a static function that consumes the + /// `outgoing-body` resource, and ensures that the user of this interface + /// may not write to the body contents after the body has been finished. + /// + /// If the user code drops this resource, as opposed to calling the static + /// method `finish`, the implementation should treat the body as incomplete, + /// and that an error has occured. The implementation should propogate this + /// error to the HTTP protocol by whatever means it has available, + /// including: corrupting the body on the wire, aborting the associated + /// Request, or sending a late status code for the Response. resource outgoing-body { - /// Will give the child output-stream at most once. subsequent calls will - /// return an error. - write: func() -> result; + + /// Returns a stream for writing the body contents. + /// + /// The returned `output-stream` is a child resource: it must be dropped + /// before the parent `outgoing-body` resource is dropped (or finished), + /// otherwise the `outgoing-body` drop or `finish` will trap. + /// + /// Returns success on the first call: the `output-stream` resource for + /// this `outgoing-body` may be retrieved at most once. Subsequent calls + /// will return error. + write: func() -> result; /// Finalize an outgoing body, optionally providing trailers. This must be - /// called to signal that the response is complete. If the `outgoing-body` is - /// dropped without calling `outgoing-body-finalize`, the implementation + /// called to signal that the response is complete. If the `outgoing-body` + /// is dropped without calling `outgoing-body.finalize`, the implementation /// should treat the body as corrupted. - finish: static func(this: outgoing-body, trailers: option); + /// + /// Fails if the body's `outgoing-request` or `outgoing-response` was + /// constructed with a Content-Length header, and the contents written + /// to the body (via `write`) does not match the value given in the + /// Content-Length. + finish: static func( + this: outgoing-body, + trailers: option + ) -> result<_, error-code>; } - /// The following block defines a special resource type used by the - /// `wasi:http/outgoing-handler` interface to emulate - /// `future>` in advance of Preview3. Given a - /// `future-incoming-response`, the client can call the non-blocking `get` - /// method to get the result if it is available. If the result is not available, - /// the client can call `listen` to get a `pollable` that can be passed to - /// `wasi:io/poll.poll-list`. + /// Represents a future which may eventaully return an incoming HTTP + /// Response, or an error. + /// + /// This resource is returned by the `wasi:http/outgoing-handler` interface to + /// provide the HTTP Response corresponding to the sent Request. resource future-incoming-response { - /// option indicates readiness. - /// outer result indicates you are allowed to get the - /// incoming-response-or-error at most once. subsequent calls after ready - /// will return an error here. - /// inner result indicates whether the incoming-response was available, or an - /// error occured. - get: func() -> option>>; - - subscribe: func() -> /* child */ pollable; + /// Returns a pollable which becomes ready when either the Response has + /// been received, or an error has occured. When this pollable is ready, + /// the `get` method will return `some`. + subscribe: func() -> pollable; + + /// Returns the incoming HTTP Response, or an error, once one is ready. + /// + /// The outer `option` represents future readiness. Users can wait on this + /// `option` to become `some` using the `subscribe` method. + /// + /// The outer `result` is used to retrieve the response or error at most + /// once. It will be success on the first call in which the outer option + /// is `some`, and error on subsequent calls. + /// + /// The inner `result` represents that either the incoming HTTP Response + /// status and headers have recieved successfully, or that an error + /// occured. Errors may also occur while consuming the response body, + /// but those will be reported by the `incoming-body` and its + /// `output-stream` child. + get: func() -> option>>; + } } diff --git a/wit/deps/io/error.wit b/wit/deps/io/error.wit index 31918ac..22e5b64 100644 --- a/wit/deps/io/error.wit +++ b/wit/deps/io/error.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; interface error { diff --git a/wit/deps/io/poll.wit b/wit/deps/io/poll.wit index 81b1cab..ddc67f8 100644 --- a/wit/deps/io/poll.wit +++ b/wit/deps/io/poll.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// A poll API intended to let users wait for I/O events on multiple handles /// at once. diff --git a/wit/deps/io/streams.wit b/wit/deps/io/streams.wit index 82e6e07..6d2f871 100644 --- a/wit/deps/io/streams.wit +++ b/wit/deps/io/streams.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// WASI I/O is an I/O abstraction API which is currently focused on providing /// stream types. diff --git a/wit/deps/io/world.wit b/wit/deps/io/world.wit index 8243da2..5f0b43f 100644 --- a/wit/deps/io/world.wit +++ b/wit/deps/io/world.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; world imports { import streams; diff --git a/wit/deps/random/insecure-seed.wit b/wit/deps/random/insecure-seed.wit index f76e87d..47210ac 100644 --- a/wit/deps/random/insecure-seed.wit +++ b/wit/deps/random/insecure-seed.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure-seed interface for seeding hash-map DoS resistance. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/wit/deps/random/insecure.wit b/wit/deps/random/insecure.wit index ec7b997..c58f4ee 100644 --- a/wit/deps/random/insecure.wit +++ b/wit/deps/random/insecure.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure interface for insecure pseudo-random numbers. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/wit/deps/random/random.wit b/wit/deps/random/random.wit index 7a7dfa2..0c017f0 100644 --- a/wit/deps/random/random.wit +++ b/wit/deps/random/random.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// WASI Random is a random data API. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/wit/deps/random/world.wit b/wit/deps/random/world.wit index 49e5743..3da3491 100644 --- a/wit/deps/random/world.wit +++ b/wit/deps/random/world.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; world imports { import random; diff --git a/wit/deps/sockets/ip-name-lookup.wit b/wit/deps/sockets/ip-name-lookup.wit index 931ccf7..8e639ec 100644 --- a/wit/deps/sockets/ip-name-lookup.wit +++ b/wit/deps/sockets/ip-name-lookup.wit @@ -1,6 +1,6 @@ interface ip-name-lookup { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-address}; diff --git a/wit/deps/sockets/tcp.wit b/wit/deps/sockets/tcp.wit index 9f12b82..5902b9e 100644 --- a/wit/deps/sockets/tcp.wit +++ b/wit/deps/sockets/tcp.wit @@ -1,8 +1,8 @@ interface tcp { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/poll@0.2.0.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; use network.{network, error-code, ip-socket-address, ip-address-family}; enum shutdown-type { diff --git a/wit/deps/sockets/udp.wit b/wit/deps/sockets/udp.wit index 6ba380f..d987a0a 100644 --- a/wit/deps/sockets/udp.wit +++ b/wit/deps/sockets/udp.wit @@ -1,6 +1,6 @@ interface udp { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-socket-address, ip-address-family}; /// A received datagram. diff --git a/wit/deps/sockets/world.wit b/wit/deps/sockets/world.wit index 8588cc6..f8bb92a 100644 --- a/wit/deps/sockets/world.wit +++ b/wit/deps/sockets/world.wit @@ -1,4 +1,4 @@ -package wasi:sockets@0.2.0-rc-2024-01-16; +package wasi:sockets@0.2.0; world imports { import instance-network; diff --git a/wit/virt.wit b/wit/virt.wit index 81de6bc..7ed1cfb 100644 --- a/wit/virt.wit +++ b/wit/virt.wit @@ -3,190 +3,190 @@ package local:virt; // in future this should be defined as a union world of the various // virtual subsystems, when union syntax lands world virtual-adapter { - import wasi:cli/environment@0.2.0-rc-2024-01-16; - import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; - import wasi:io/error@0.2.0-rc-2023-11-10; - export wasi:io/error@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - export wasi:io/streams@0.2.0-rc-2023-11-10; - import wasi:io/poll@0.2.0-rc-2023-11-10; - export wasi:io/poll@0.2.0-rc-2023-11-10; - export wasi:cli/environment@0.2.0-rc-2024-01-16; - export wasi:filesystem/types@0.2.0-rc-2023-11-10; - export wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:cli/stdin@0.2.0-rc-2024-01-16; - import wasi:cli/stdout@0.2.0-rc-2024-01-16; - import wasi:cli/stderr@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; - export wasi:cli/stdin@0.2.0-rc-2024-01-16; - export wasi:cli/stdout@0.2.0-rc-2024-01-16; - export wasi:cli/stderr@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-input@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-output@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - export wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:http/types@0.2.0-rc-2023-10-18; - export wasi:http/types@0.2.0-rc-2023-10-18; - import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; - export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp@0.2.0-rc-2024-01-16; - export wasi:sockets/tcp@0.2.0-rc-2024-01-16; - import wasi:sockets/udp@0.2.0-rc-2024-01-16; - export wasi:sockets/udp@0.2.0-rc-2024-01-16; + import wasi:cli/environment@0.2.0; + import wasi:filesystem/preopens@0.2.0; + import wasi:filesystem/types@0.2.0; + import wasi:io/error@0.2.0; + export wasi:io/error@0.2.0; + import wasi:io/streams@0.2.0; + export wasi:io/streams@0.2.0; + import wasi:io/poll@0.2.0; + export wasi:io/poll@0.2.0; + export wasi:cli/environment@0.2.0; + export wasi:filesystem/types@0.2.0; + export wasi:filesystem/preopens@0.2.0; + import wasi:cli/stdin@0.2.0; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; + import wasi:cli/terminal-input@0.2.0; + import wasi:cli/terminal-output@0.2.0; + import wasi:cli/terminal-stdin@0.2.0; + import wasi:cli/terminal-stdout@0.2.0; + import wasi:cli/terminal-stderr@0.2.0; + export wasi:cli/stdin@0.2.0; + export wasi:cli/stdout@0.2.0; + export wasi:cli/stderr@0.2.0; + export wasi:cli/terminal-input@0.2.0; + export wasi:cli/terminal-output@0.2.0; + export wasi:cli/terminal-stdin@0.2.0; + export wasi:cli/terminal-stdout@0.2.0; + export wasi:cli/terminal-stderr@0.2.0; + import wasi:clocks/monotonic-clock@0.2.0; + export wasi:clocks/monotonic-clock@0.2.0; + import wasi:http/types@0.2.0; + export wasi:http/types@0.2.0; + import wasi:http/outgoing-handler@0.2.0; + export wasi:http/outgoing-handler@0.2.0; + import wasi:sockets/ip-name-lookup@0.2.0; + export wasi:sockets/ip-name-lookup@0.2.0; + import wasi:sockets/tcp@0.2.0; + export wasi:sockets/tcp@0.2.0; + import wasi:sockets/udp@0.2.0; + export wasi:sockets/udp@0.2.0; } world virtual-base { } world virtual-io { - import wasi:io/error@0.2.0-rc-2023-11-10; - export wasi:io/error@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - export wasi:io/streams@0.2.0-rc-2023-11-10; - import wasi:io/poll@0.2.0-rc-2023-11-10; - export wasi:io/poll@0.2.0-rc-2023-11-10; + import wasi:io/error@0.2.0; + export wasi:io/error@0.2.0; + import wasi:io/streams@0.2.0; + export wasi:io/streams@0.2.0; + import wasi:io/poll@0.2.0; + export wasi:io/poll@0.2.0; } // io components of subsystems // where there is an intersection of // streams + poll world virtual-io-sockets { - import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp@0.2.0-rc-2024-01-16; - export wasi:sockets/tcp@0.2.0-rc-2024-01-16; - import wasi:sockets/udp@0.2.0-rc-2024-01-16; - export wasi:sockets/udp@0.2.0-rc-2024-01-16; + import wasi:sockets/ip-name-lookup@0.2.0; + export wasi:sockets/ip-name-lookup@0.2.0; + import wasi:sockets/tcp@0.2.0; + export wasi:sockets/tcp@0.2.0; + import wasi:sockets/udp@0.2.0; + export wasi:sockets/udp@0.2.0; } world virtual-io-clocks { - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - export wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; + import wasi:clocks/monotonic-clock@0.2.0; + export wasi:clocks/monotonic-clock@0.2.0; } world virtual-io-http { - import wasi:http/types@0.2.0-rc-2023-10-18; - export wasi:http/types@0.2.0-rc-2023-10-18; - import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; - export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; + import wasi:http/types@0.2.0; + export wasi:http/types@0.2.0; + import wasi:http/outgoing-handler@0.2.0; + export wasi:http/outgoing-handler@0.2.0; } world virtual-fs { - import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; - export wasi:filesystem/types@0.2.0-rc-2023-11-10; - export wasi:filesystem/preopens@0.2.0-rc-2023-11-10; + import wasi:filesystem/preopens@0.2.0; + import wasi:filesystem/types@0.2.0; + export wasi:filesystem/types@0.2.0; + export wasi:filesystem/preopens@0.2.0; } world virtual-stdio { - import wasi:cli/stdin@0.2.0-rc-2024-01-16; - import wasi:cli/stdout@0.2.0-rc-2024-01-16; - import wasi:cli/stderr@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; - export wasi:cli/stdin@0.2.0-rc-2024-01-16; - export wasi:cli/stdout@0.2.0-rc-2024-01-16; - export wasi:cli/stderr@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-input@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-output@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; - export wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; + import wasi:cli/stdin@0.2.0; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; + import wasi:cli/terminal-input@0.2.0; + import wasi:cli/terminal-output@0.2.0; + import wasi:cli/terminal-stdin@0.2.0; + import wasi:cli/terminal-stdout@0.2.0; + import wasi:cli/terminal-stderr@0.2.0; + export wasi:cli/stdin@0.2.0; + export wasi:cli/stdout@0.2.0; + export wasi:cli/stderr@0.2.0; + export wasi:cli/terminal-input@0.2.0; + export wasi:cli/terminal-output@0.2.0; + export wasi:cli/terminal-stdin@0.2.0; + export wasi:cli/terminal-stdout@0.2.0; + export wasi:cli/terminal-stderr@0.2.0; } // remaining subsystems world virtual-env { - import wasi:cli/environment@0.2.0-rc-2024-01-16; - export wasi:cli/environment@0.2.0-rc-2024-01-16; + import wasi:cli/environment@0.2.0; + export wasi:cli/environment@0.2.0; } world virtual-clocks { - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - export wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - export wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; + import wasi:clocks/monotonic-clock@0.2.0; + export wasi:clocks/monotonic-clock@0.2.0; + import wasi:clocks/wall-clock@0.2.0; + export wasi:clocks/wall-clock@0.2.0; } world virtual-random { - import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; - import wasi:random/insecure@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; - export wasi:random/insecure-seed@0.2.0-rc-2023-11-10; - export wasi:random/insecure@0.2.0-rc-2023-11-10; - export wasi:random/random@0.2.0-rc-2023-11-10; + import wasi:random/insecure-seed@0.2.0; + import wasi:random/insecure@0.2.0; + import wasi:random/random@0.2.0; + export wasi:random/insecure-seed@0.2.0; + export wasi:random/insecure@0.2.0; + export wasi:random/random@0.2.0; } world virtual-sockets { - import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - export wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp@0.2.0-rc-2024-01-16; - export wasi:sockets/tcp@0.2.0-rc-2024-01-16; - import wasi:sockets/udp@0.2.0-rc-2024-01-16; - export wasi:sockets/udp@0.2.0-rc-2024-01-16; - import wasi:sockets/instance-network@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; - import wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; - export wasi:sockets/instance-network@0.2.0-rc-2024-01-16; - export wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; - export wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; - import wasi:sockets/network@0.2.0-rc-2024-01-16; - export wasi:sockets/network@0.2.0-rc-2024-01-16; + import wasi:sockets/ip-name-lookup@0.2.0; + export wasi:sockets/ip-name-lookup@0.2.0; + import wasi:sockets/tcp@0.2.0; + export wasi:sockets/tcp@0.2.0; + import wasi:sockets/udp@0.2.0; + export wasi:sockets/udp@0.2.0; + import wasi:sockets/instance-network@0.2.0; + import wasi:sockets/tcp-create-socket@0.2.0; + import wasi:sockets/udp-create-socket@0.2.0; + export wasi:sockets/instance-network@0.2.0; + export wasi:sockets/tcp-create-socket@0.2.0; + export wasi:sockets/udp-create-socket@0.2.0; + import wasi:sockets/network@0.2.0; + export wasi:sockets/network@0.2.0; } world virtual-http { - import wasi:http/types@0.2.0-rc-2023-10-18; - export wasi:http/types@0.2.0-rc-2023-10-18; - import wasi:http/incoming-handler@0.2.0-rc-2023-10-18; - import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; - export wasi:http/incoming-handler@0.2.0-rc-2023-10-18; - export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; + import wasi:http/types@0.2.0; + export wasi:http/types@0.2.0; + import wasi:http/incoming-handler@0.2.0; + import wasi:http/outgoing-handler@0.2.0; + export wasi:http/incoming-handler@0.2.0; + export wasi:http/outgoing-handler@0.2.0; } world virtual-exit { - import wasi:cli/exit@0.2.0-rc-2024-01-16; - export wasi:cli/exit@0.2.0-rc-2024-01-16; + import wasi:cli/exit@0.2.0; + export wasi:cli/exit@0.2.0; } world virt-test { - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; - import wasi:sockets/instance-network@0.2.0-rc-2024-01-16; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2024-01-16; - import wasi:sockets/network@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2024-01-16; - import wasi:sockets/tcp@0.2.0-rc-2024-01-16; - import wasi:sockets/udp-create-socket@0.2.0-rc-2024-01-16; - import wasi:sockets/udp@0.2.0-rc-2024-01-16; - import wasi:random/random@0.2.0-rc-2023-11-10; - import wasi:random/insecure@0.2.0-rc-2023-11-10; - import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; - import wasi:io/poll@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - import wasi:cli/environment@0.2.0-rc-2024-01-16; - import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:cli/exit@0.2.0-rc-2024-01-16; - import wasi:cli/stdin@0.2.0-rc-2024-01-16; - import wasi:cli/stdout@0.2.0-rc-2024-01-16; - import wasi:cli/stderr@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-input@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-output@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdin@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stdout@0.2.0-rc-2024-01-16; - import wasi:cli/terminal-stderr@0.2.0-rc-2024-01-16; + import wasi:clocks/wall-clock@0.2.0; + import wasi:clocks/monotonic-clock@0.2.0; + import wasi:filesystem/types@0.2.0; + import wasi:sockets/instance-network@0.2.0; + import wasi:sockets/ip-name-lookup@0.2.0; + import wasi:sockets/network@0.2.0; + import wasi:sockets/tcp-create-socket@0.2.0; + import wasi:sockets/tcp@0.2.0; + import wasi:sockets/udp-create-socket@0.2.0; + import wasi:sockets/udp@0.2.0; + import wasi:random/random@0.2.0; + import wasi:random/insecure@0.2.0; + import wasi:random/insecure-seed@0.2.0; + import wasi:io/poll@0.2.0; + import wasi:io/streams@0.2.0; + import wasi:cli/environment@0.2.0; + import wasi:filesystem/preopens@0.2.0; + import wasi:cli/exit@0.2.0; + import wasi:cli/stdin@0.2.0; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; + import wasi:cli/terminal-input@0.2.0; + import wasi:cli/terminal-output@0.2.0; + import wasi:cli/terminal-stdin@0.2.0; + import wasi:cli/terminal-stdout@0.2.0; + import wasi:cli/terminal-stderr@0.2.0; export test-get-env: func() -> list>; export test-file-read: func(path: string) -> string; From e7a602a0032cdf25714166933626a011a2cae090 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 6 Feb 2024 14:09:06 -0800 Subject: [PATCH 04/11] build inline metadata --- .gitignore | 1 + build-adapter.sh | 9 +++++++-- lib/virtual_adapter.debug.wasm | Bin 234119 -> 234119 bytes lib/virtual_adapter.wasm | Bin 199068 -> 199068 bytes src/lib.rs | 7 ++----- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index d14bda9..277d36f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target /tests/generated +/lib/package.wasm \ No newline at end of file diff --git a/build-adapter.sh b/build-adapter.sh index 362ae42..3f23a4a 100755 --- a/build-adapter.sh +++ b/build-adapter.sh @@ -1,2 +1,7 @@ -cargo +nightly build -p virtual-adapter --target wasm32-wasi --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && cp target/wasm32-wasi/release/virtual_adapter.wasm lib/ -cargo +nightly build -p virtual-adapter --target wasm32-wasi --release --features debug -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && cp target/wasm32-wasi/release/virtual_adapter.wasm lib/virtual_adapter.debug.wasm +wasm-tools component wit --wasm wit -o lib/package.wasm + +cargo +nightly build -p virtual-adapter --target wasm32-wasi --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && + cp target/wasm32-wasi/release/virtual_adapter.wasm lib/virtual_adapter.wasm + +cargo +nightly build -p virtual-adapter --target wasm32-wasi --release --features debug -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && + cp target/wasm32-wasi/release/virtual_adapter.wasm lib/virtual_adapter.debug.wasm diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index e30c053a18246acd405d69e0bd06ebdea2eca90d..a18cbf68da5bcd8fd9e47341d6d1704c39a1e854 100755 GIT binary patch delta 26658 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

    9oY7veXAl#kxjtaB= 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 S_{Xzrm(%`L2UgH3;r{{JXNfHU diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 8ceb217c135f890f624805d952fa66e5c9f344cc..a0fc49f0ad114be0b7e6e8adb8b275db2e86f380 100755 GIT binary patch delta 20142 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

    NyF;P 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 diff --git a/src/lib.rs b/src/lib.rs index 11e5c54..873e7b4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub use virt_io::{FsEntry, StdioCfg, VirtFs, VirtualFiles}; const VIRT_ADAPTER: &[u8] = include_bytes!("../lib/virtual_adapter.wasm"); const VIRT_ADAPTER_DEBUG: &[u8] = include_bytes!("../lib/virtual_adapter.debug.wasm"); +const VIRT_WIT_METADATA: &[u8] = include_bytes!("../lib/package.wasm"); /// Virtualization options /// @@ -164,11 +165,7 @@ impl WasiVirt { .remove_raw("component-type:virtual-adapter") .context("Unable to find component section")?; - let (_, mut bindgen) = if self.debug { - metadata::decode(VIRT_ADAPTER_DEBUG) - } else { - metadata::decode(VIRT_ADAPTER) - }?; + let (_, mut bindgen) = metadata::decode(VIRT_WIT_METADATA)?; let (_, pkg_id) = bindgen .resolve From cbff36a9e99e35ce471e69b77d162bb0ca1d4a89 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 6 Feb 2024 14:54:46 -0800 Subject: [PATCH 05/11] Update the ahash dependency to fix the build on nightly Rust. --- Cargo.lock | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e17b50..530e9b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,13 +19,14 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -2902,6 +2903,26 @@ dependencies = [ "wast 35.0.2", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "zstd" version = "0.11.2+zstd.1.5.2" From 3432c527a050ebdc530ad4a135d9bbe2fc8c2d42 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 6 Feb 2024 15:33:24 -0800 Subject: [PATCH 06/11] Install wasm-tools in CI, before running build-adapter.sh. --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 423ff59..e6da62e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -37,6 +37,9 @@ jobs: - name: Install wasm32-wasi target run: rustup target add wasm32-wasi + - name: Install wasm-tools + run: cargo install wasm-tools + - name: Build adapter run: ./build-adapter.sh From 9370e89b60413b7ca2c21034208b4d7f004b30ee Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 9 Feb 2024 04:11:42 -0800 Subject: [PATCH 07/11] Update decoding of encoded WIT --- src/lib.rs | 96 +++++++++++++++++++++--------------------------------- 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 873e7b4..5a15498 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ use virt_io::{ }; use wasm_metadata::Producers; use wasm_opt::{Feature, OptimizationOptions}; -use wit_component::{metadata, ComponentEncoder, StringEncoding}; +use wit_component::{metadata, ComponentEncoder, DecodedWasm, StringEncoding}; mod data; mod stub_preview1; @@ -165,67 +165,45 @@ impl WasiVirt { .remove_raw("component-type:virtual-adapter") .context("Unable to find component section")?; - let (_, mut bindgen) = metadata::decode(VIRT_WIT_METADATA)?; - - let (_, pkg_id) = bindgen - .resolve - .package_names - .iter() - .find(|(name, _)| name.namespace == "local") - .unwrap(); - - let base_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-base"))?; - - let env_world = bindgen.resolve.select_world(*pkg_id, Some("virtual-env"))?; - - let io_world = bindgen.resolve.select_world(*pkg_id, Some("virtual-io"))?; - let io_clocks_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-io-clocks"))?; - let io_http_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-io-http"))?; - let io_sockets_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-io-sockets"))?; - - let exit_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-exit"))?; - let fs_world = bindgen.resolve.select_world(*pkg_id, Some("virtual-fs"))?; - let random_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-random"))?; - let stdio_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-stdio"))?; - let clocks_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-clocks"))?; - let http_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-http"))?; - let sockets_world = bindgen - .resolve - .select_world(*pkg_id, Some("virtual-sockets"))?; + let (mut resolve, pkg_id) = match wit_component::decode(VIRT_WIT_METADATA)? { + DecodedWasm::WitPackage(resolve, pkg_id) => (resolve, pkg_id), + DecodedWasm::Component(..) => { + anyhow::bail!("expected a WIT package, found a component") + } + }; + + let base_world = resolve.select_world(pkg_id, Some("virtual-base"))?; + + let env_world = resolve.select_world(pkg_id, Some("virtual-env"))?; + + let io_world = resolve.select_world(pkg_id, Some("virtual-io"))?; + let io_clocks_world = resolve.select_world(pkg_id, Some("virtual-io-clocks"))?; + let io_http_world = resolve.select_world(pkg_id, Some("virtual-io-http"))?; + let io_sockets_world = resolve.select_world(pkg_id, Some("virtual-io-sockets"))?; + + let exit_world = resolve.select_world(pkg_id, Some("virtual-exit"))?; + let fs_world = resolve.select_world(pkg_id, Some("virtual-fs"))?; + let random_world = resolve.select_world(pkg_id, Some("virtual-random"))?; + let stdio_world = resolve.select_world(pkg_id, Some("virtual-stdio"))?; + let clocks_world = resolve.select_world(pkg_id, Some("virtual-clocks"))?; + let http_world = resolve.select_world(pkg_id, Some("virtual-http"))?; + let sockets_world = resolve.select_world(pkg_id, Some("virtual-sockets"))?; // env, exit & random subsystems are fully independent if self.env.is_some() { - bindgen.resolve.merge_worlds(env_world, base_world)?; + resolve.merge_worlds(env_world, base_world)?; } else { strip_env_virt(&mut module)?; } if let Some(exit) = self.exit { if !exit { - bindgen.resolve.merge_worlds(exit_world, base_world)?; + resolve.merge_worlds(exit_world, base_world)?; deny_exit_virt(&mut module)?; } } if let Some(random) = self.random { if !random { - bindgen.resolve.merge_worlds(random_world, base_world)?; + resolve.merge_worlds(random_world, base_world)?; deny_random_virt(&mut module)?; } } @@ -233,7 +211,7 @@ impl WasiVirt { // io subsystems have io dependence due to streams + poll // therefore we need to strip just their io dependence portion if has_io { - bindgen.resolve.merge_worlds(io_world, base_world)?; + resolve.merge_worlds(io_world, base_world)?; } else { strip_io_virt(&mut module)?; } @@ -242,11 +220,11 @@ impl WasiVirt { // deny is effectively virtualization // in future with fine-grained virtualization options, they // also would extend here (ie !clocks is deceiving) - bindgen.resolve.merge_worlds(clocks_world, base_world)?; + resolve.merge_worlds(clocks_world, base_world)?; deny_clocks_virt(&mut module)?; } else { // passthrough can be simplified to just rewrapping io interfaces - bindgen.resolve.merge_worlds(io_clocks_world, base_world)?; + resolve.merge_worlds(io_clocks_world, base_world)?; } } else { strip_clocks_virt(&mut module)?; @@ -254,20 +232,20 @@ impl WasiVirt { // sockets and http are identical to clocks above if let Some(sockets) = self.sockets { if !sockets { - bindgen.resolve.merge_worlds(sockets_world, base_world)?; + resolve.merge_worlds(sockets_world, base_world)?; deny_sockets_virt(&mut module)?; } else { - bindgen.resolve.merge_worlds(io_sockets_world, base_world)?; + resolve.merge_worlds(io_sockets_world, base_world)?; } } else { strip_sockets_virt(&mut module)?; } if let Some(http) = self.http { if !http { - bindgen.resolve.merge_worlds(http_world, base_world)?; + resolve.merge_worlds(http_world, base_world)?; deny_http_virt(&mut module)?; } else { - bindgen.resolve.merge_worlds(io_http_world, base_world)?; + resolve.merge_worlds(io_http_world, base_world)?; } } else { strip_http_virt(&mut module)?; @@ -276,12 +254,12 @@ impl WasiVirt { // stdio and fs are fully implemented in io world // (all their interfaces use streams) if self.stdio.is_some() { - bindgen.resolve.merge_worlds(stdio_world, base_world)?; + resolve.merge_worlds(stdio_world, base_world)?; } else { strip_stdio_virt(&mut module)?; } if self.fs.is_some() || self.stdio.is_some() { - bindgen.resolve.merge_worlds(fs_world, base_world)?; + resolve.merge_worlds(fs_world, base_world)?; } else { strip_fs_virt(&mut module)?; } @@ -290,7 +268,7 @@ impl WasiVirt { producers.add("processed-by", "wasi-virt", env!("CARGO_PKG_VERSION")); component_section.data = metadata::encode( - &bindgen.resolve, + &resolve, base_world, StringEncoding::UTF8, Some(&producers), From f88dca8f20998a8a813b6fa0bd61ac092d592d2d Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 12 Feb 2024 15:18:57 -0800 Subject: [PATCH 08/11] something kinda almost working --- Cargo.lock | 158 +++++----- Cargo.toml | 4 +- lib/virtual_adapter.debug.wasm | Bin 234119 -> 234714 bytes lib/virtual_adapter.wasm | Bin 199068 -> 199068 bytes lib/wasi_snapshot_preview1.reactor.wasm | Bin 96731 -> 96733 bytes src/lib.rs | 26 +- src/virt_deny/clocks.rs | 4 +- src/virt_deny/http.rs | 180 +++++++++--- src/virt_deny/mod.rs | 2 - src/virt_deny/sockets.rs | 4 +- src/virt_env.rs | 13 +- src/{virt_io/mod.rs => virt_io.rs} | 40 +-- src/virt_io/clocks.rs | 75 ----- src/virt_io/filesystem.rs | 255 ---------------- src/virt_io/http.rs | 229 --------------- src/virt_io/io.rs | 191 ------------ src/virt_io/sockets.rs | 375 ------------------------ src/virt_io/stdio.rs | 95 ------ src/walrus_ops.rs | 83 ++++++ tests/virt.rs | 33 ++- virtual-adapter/src/io.rs | 7 +- 21 files changed, 350 insertions(+), 1424 deletions(-) rename src/{virt_io/mod.rs => virt_io.rs} (93%) delete mode 100644 src/virt_io/clocks.rs delete mode 100644 src/virt_io/filesystem.rs delete mode 100644 src/virt_io/http.rs delete mode 100644 src/virt_io/io.rs delete mode 100644 src/virt_io/sockets.rs delete mode 100644 src/virt_io/stdio.rs diff --git a/Cargo.lock b/Cargo.lock index 530e9b1..a979b33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -386,18 +386,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c22542c0b95bd3302f7ed6839869c561f2324bac2fd5e7e99f5cfa65fdc8b92" +checksum = "7e7c0d51205b863591dd1e7aaa0fb69c2ea7bed48ffa63d6c4a848b07a35a732" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3db903ef2e9c8a4de2ea6db5db052c7857282952f9df604aa55d169e6000d8" +checksum = "9ffb467cbc25543e4c20d2ad669bf8275598047b03c89652ad5fe2a0f47fc0e1" dependencies = [ "bumpalo", "cranelift-bforest", @@ -416,33 +416,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6590feb5a1d6438f974bf6a5ac4dddf69fca14e1f07f3265d880f69e61a94463" +checksum = "bc7e74aed5c2b91e38d090653506afbd2cd3be1ff70593e2aa6bb82b3c6b77ff" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7239038c56fafe77fddc8788fc8533dd6c474dc5bdc5637216404f41ba807330" +checksum = "9ff2dd24cce0775566da85770cb48aa58fef901cf2bff30275b42e7dbe62cbd5" [[package]] name = "cranelift-control" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7dc9c595341404d381d27a3d950160856b35b402275f0c3990cd1ad683c8053" +checksum = "e8bcf4d5c73bbca309edf3af2839b5218e5c74cfbf22b0ac492af8a1d11120d9" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44e3ee532fc4776c69bcedf7e62f9632cbb3f35776fa9a525cdade3195baa3f7" +checksum = "286754159b1a685475d6a0b4710832f950d6f4846a817002e2c23ff001321a65" dependencies = [ "serde", "serde_derive", @@ -450,9 +450,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a612c94d09e653662ec37681dc2d6fd2b9856e6df7147be0afc9aabb0abf19df" +checksum = "67150a1fef9857caba710f8c0c8223d640f02c0e5d1ebbfc75ed62912599cb6b" dependencies = [ "cranelift-codegen", "log", @@ -462,15 +462,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85db9830abeb1170b7d29b536ffd55af1d4d26ac8a77570b5d1aca003bf225cc" +checksum = "eb7ceea70d3e0d7f69df7657f99de902e32016731c5a8d2788c1df0215f00952" [[package]] name = "cranelift-native" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301ef0edafeaeda5771a5d2db64ac53e1818ae3111220a185677025fe91db4a1" +checksum = "707e5d9384ce4fa3c40af1abf4c3ec49857745cced5187593385f4a2c0b95445" dependencies = [ "cranelift-codegen", "libc", @@ -479,9 +479,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.103.0" +version = "0.104.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380f0abe8264e4570ac615fc31cef32a3b90a77f7eb97b08331f9dd357b1f500" +checksum = "d4d957e3ff2a14c2f974a66c22bfcedcd2bd0272af8dce4236869c3942f5a471" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1944,9 +1944,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154528979a211aa28d969846e883df75705809ed9bcc70aba61460683ea7355b" +checksum = "025e842ba390587e523785ff58bd54fbbf1781b8d3072bc9aba4dc0b809f69da" dependencies = [ "anyhow", "async-trait", @@ -1962,14 +1962,14 @@ dependencies = [ "system-interface", "tracing", "wasi-common", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasi-common" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d888b611fee7d273dd057dc009d2dd3132736f36710ffd65657ac83628d1e3b" +checksum = "da4d4023cc65b3615590d38db0afb79234de09b3bb89cb0d8f83bdee9f5c28a8" dependencies = [ "anyhow", "bitflags 2.4.2", @@ -1982,7 +1982,7 @@ dependencies = [ "tracing", "wasmtime", "wiggle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2170,9 +2170,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e539fded2495422ea3c4dfa7beeddba45904eece182cf315294009e1a323bf" +checksum = "8acb6aa966be38f613954c3debe7ba6c7a02ffd0537432be438da0b038955cdf" dependencies = [ "anyhow", "async-trait", @@ -2204,23 +2204,23 @@ dependencies = [ "wasmtime-runtime", "wasmtime-winch", "wat", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-asm-macros" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660ba9143e15a2acd921820df221b73aee256bd3ca2d208d73d8adc9587ccbb9" +checksum = "c1495ef4d46aec14f967b672e946e391dd8a14a443cda3d5e0779ff67fb6e28d" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ce373743892002f9391c6741ef0cb0335b55ec899d874f311222b7e36f4594" +checksum = "e2de1b065bdbaca3df9e7e9f70eb129e326a99d971b16d666acd798d98d47635" dependencies = [ "anyhow", "base64", @@ -2232,15 +2232,15 @@ dependencies = [ "serde_derive", "sha2", "toml 0.5.11", - "windows-sys 0.48.0", + "windows-sys 0.52.0", "zstd", ] [[package]] name = "wasmtime-component-macro" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ef32643324e564e1c359e9044daa06cbf90d7e2d6c99a738d17a12959f01a5" +checksum = "2f19bcff82f81ba0273c0b68f3909977b0dd54489bc86c630d8aad43dca92f3f" dependencies = [ "anyhow", "proc-macro2", @@ -2253,15 +2253,15 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c87d06c18d21a4818f354c00a85f4ebc62b2270961cd022968452b0e4dbed9d" +checksum = "8af072b7ad5ac5583e1f9e4737ebf88923de564fb5d4ace0ca9b4b720bdf95a1" [[package]] name = "wasmtime-cranelift" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d648c8b4064a7911093b02237cd5569f71ca171d3a0a486bf80600b19e1cba2" +checksum = "df08a8bd9a68732577bee05ac685e4c247238b5e79ad9c062e2dfb4d04dca132" dependencies = [ "anyhow", "cfg-if", @@ -2284,9 +2284,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290a89027688782da8ff60b12bb95695494b1874e0d0ba2ba387d23dace6d70c" +checksum = "404201c9e669083f189f01337b3ed0aa0eb081157fb4e170bbfe193df9497771" dependencies = [ "anyhow", "cranelift-codegen", @@ -2300,9 +2300,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61eb64fb3e0da883e2df4a13a81d6282e072336e6cb6295021d0f7ab2e352754" +checksum = "7e696b4911c9a69c3c2892ec05eb41bb15436d1a46d8830a755c40f5df47546a" dependencies = [ "anyhow", "cranelift-entity", @@ -2323,9 +2323,9 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecf1d3a838b0956b71ad3f8cb80069a228339775bf02dd35d86a5a68bbe443" +checksum = "4a39681c1f6f54d1bf7efe5dc829f8d7fc0e2ca12c346fd7a3efbf726e9681d2" dependencies = [ "anyhow", "cc", @@ -2333,14 +2333,14 @@ dependencies = [ "rustix 0.38.30", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-jit" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f485336add49267d8859e8f8084d2d4b9a4b1564496b6f30ba5b168d50c10ceb" +checksum = "2c56519882d936c680bd191d58ac04cff071a470eca2dcc664adcd60f986a731" dependencies = [ "addr2line", "anyhow", @@ -2360,14 +2360,14 @@ dependencies = [ "wasmtime-jit-debug", "wasmtime-jit-icache-coherence", "wasmtime-runtime", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-jit-debug" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e119affec40edb2fab9044f188759a00c2df9c3017278d047012a2de1efb4f" +checksum = "babc65e64ab0dd4e1ce65624db64e24ed0fbdebb16148729173fa0da9f70e53c" dependencies = [ "object", "once_cell", @@ -2377,20 +2377,20 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b6d197fcc34ad32ed440e1f9552fd57d1f377d9699d31dee1b5b457322c1f8a" +checksum = "d7ec5b11c12d9acb09612e7ce04c4c8aea3e8dc79b2591ffdead986a5ce8ec49" dependencies = [ "cfg-if", "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-runtime" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794b2bb19b99ef8322ff0dd9fe1ba7e19c41036dfb260b3f99ecce128c42ff92" +checksum = "28e1c31bbdf67cb86f149bcead5193749f23f77c93c5244ec9ac8d192f90966c" dependencies = [ "anyhow", "cc", @@ -2413,14 +2413,14 @@ dependencies = [ "wasmtime-jit-debug", "wasmtime-versioned-export-macros", "wasmtime-wmemcheck", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-types" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d995db8bb56f2cd8d2dc0ed5ffab94ffb435283b0fe6747f80f7aab40b2d06a1" +checksum = "52e799cff634d30fd042db96b417d515e54f903b95f8c1e0ec60e8f604479485" dependencies = [ "cranelift-entity", "serde", @@ -2431,9 +2431,9 @@ dependencies = [ [[package]] name = "wasmtime-versioned-export-macros" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c5565959287c21dd0f4277ae3518dd2ae62679f655ee2dbc4396e19d210db" +checksum = "e10fe166d4e4c95d5d80c5b47e1e12256af2099ac525ddb9a19b1aeb8896e5e1" dependencies = [ "proc-macro2", "quote", @@ -2442,9 +2442,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd8370078149d49a3a47e93741553fd79b700421464b6a27ca32718192ab130" +checksum = "494f99111a165dcddc69aaa5fa23604f49dcfab479a869edd84581abd6ac569b" dependencies = [ "anyhow", "async-trait", @@ -2472,14 +2472,14 @@ dependencies = [ "wasi-common", "wasmtime", "wiggle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-winch" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6f945ff9bad96e0a69973d74f193c19f627c8adbf250e7cb73ae7564b6cc8a" +checksum = "d3f5d76d399cb4423e6f178bc154a0e1c314711e28dabaa6e757e56628a083ec" dependencies = [ "anyhow", "cranelift-codegen", @@ -2494,9 +2494,9 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f328b2d4a690270324756e886ed5be3a4da4c00be0eea48253f4595ad068062b" +checksum = "6bb3bc92c031cf4961135bffe055a69c1bd67c253dca20631478189bb05ec27b" dependencies = [ "anyhow", "heck 0.4.1", @@ -2506,9 +2506,9 @@ dependencies = [ [[package]] name = "wasmtime-wmemcheck" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67761d8f8c0b3c13a5d34356274b10a40baba67fe9cfabbfc379a8b414e45de2" +checksum = "5da08ab734954e16f57be38423b90c25a0b13420e51cbd0a2e37b86a468a988c" [[package]] name = "wast" @@ -2542,9 +2542,9 @@ dependencies = [ [[package]] name = "wiggle" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0afb26cd3269289bb314a361ff0a6685e5ce793b62181a9fe3f81ace15051697" +checksum = "cd5b200b5dd3d5d7cc4093166f4f916d2d2839296cf1b1757b9726635f6425c3" dependencies = [ "anyhow", "async-trait", @@ -2557,9 +2557,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef2868fed7584d2b552fa317104858ded80021d23b073b2d682d3c932a027bd" +checksum = "a4dc34a2bc1091599de005e9b854cd1a9ea35b16ca51cac2797274c1a2666e06" dependencies = [ "anyhow", "heck 0.4.1", @@ -2572,9 +2572,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "16.0.0" +version = "17.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ae1ec11a17ea481539ee9a5719a278c9790d974060fbf71db4b2c05378780b" +checksum = "37ba3b37f402a7513b9ed7973a6e907074987b3afdcede98d3d79939b3e76f1b" dependencies = [ "proc-macro2", "quote", @@ -2615,9 +2615,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e58c236a6abdd9ab454552b4f29e16cfa837a86897c1503313b2e62e7609ec" +checksum = "8d921185084e134e897e0e202e129a422306d0f1391954ecf4928d36defa897d" dependencies = [ "anyhow", "cranelift-codegen", diff --git a/Cargo.toml b/Cargo.toml index 0452aff..8a5429a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,8 +47,8 @@ anyhow = "1" cap-std = "1.0.12" heck = { version = "0.4" } tokio = { version = "1.30.0", features = ["macros"] } -wasmtime = { version = "16.0.0", features = ["component-model"] } -wasmtime-wasi = "16.0.0" +wasmtime = { version = "17.0.1", features = ["component-model"] } +wasmtime-wasi = "17.0.1" wasmparser = "0.119.0" [workspace.dependencies] diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index a18cbf68da5bcd8fd9e47341d6d1704c39a1e854..1f5f3237398980fb89a09d1f040d24169d9451e8 100755 GIT binary patch delta 44372 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 delta 44163 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 diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index a0fc49f0ad114be0b7e6e8adb8b275db2e86f380..bc0a1baf632b528ad0cc0fec28a77bdedef0940a 100755 GIT binary patch delta 286 zcmXwzJ5Izf5QgoE<2VmX5kiP^>OHCA#n+dl71Jq-~cY!L$DPW-~vcV zYHkw#AfYK{^gl-5J~jK)e7p}Q%8H;IHL_+E=6SxpwUSjj47{NZrwCsn1{Gb#)b5tDm*B3MAgO0xMppq% ivqXW?Vf2#HFg_U7fgYiBF`Y`a>!-JVlArxVkC(rY0XRJX delta 286 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 Q-;q-Adepv8cfeclU-I@u!vFvP delta 3677 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 QA`xiJl(PSmo$x077r!Y(WdHyG diff --git a/src/lib.rs b/src/lib.rs index 5a15498..c92ff9d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,10 @@ use anyhow::{Context, Result}; use serde::Deserialize; use std::{env, fs, time::SystemTime}; -use virt_deny::{ - deny_clocks_virt, deny_exit_virt, deny_http_virt, deny_random_virt, deny_sockets_virt, -}; +use virt_deny::{deny_clocks_virt, deny_exit_virt, deny_random_virt}; use virt_env::{create_env_virt, strip_env_virt}; -use virt_io::{ - create_io_virt, strip_clocks_virt, strip_fs_virt, strip_http_virt, strip_io_virt, - strip_sockets_virt, strip_stdio_virt, VirtStdio, -}; +use virt_io::{create_io_virt, VirtStdio}; +use walrus_ops::{deny_virt, strip_virt}; use wasm_metadata::Producers; use wasm_opt::{Feature, OptimizationOptions}; use wit_component::{metadata, ComponentEncoder, DecodedWasm, StringEncoding}; @@ -213,7 +209,7 @@ impl WasiVirt { if has_io { resolve.merge_worlds(io_world, base_world)?; } else { - strip_io_virt(&mut module)?; + strip_virt(&mut module, &["wasi:io/"])?; } if let Some(clocks) = self.clocks { if !clocks { @@ -227,28 +223,28 @@ impl WasiVirt { resolve.merge_worlds(io_clocks_world, base_world)?; } } else { - strip_clocks_virt(&mut module)?; + strip_virt(&mut module, &["wasi:clocks/"])?; } // sockets and http are identical to clocks above if let Some(sockets) = self.sockets { if !sockets { resolve.merge_worlds(sockets_world, base_world)?; - deny_sockets_virt(&mut module)?; + deny_virt(&mut module, &["wasi:sockets/"])?; } else { resolve.merge_worlds(io_sockets_world, base_world)?; } } else { - strip_sockets_virt(&mut module)?; + strip_virt(&mut module, &["wasi:sockets/"])?; } if let Some(http) = self.http { if !http { resolve.merge_worlds(http_world, base_world)?; - deny_http_virt(&mut module)?; + deny_virt(&mut module, &["wasi:http/"])?; } else { resolve.merge_worlds(io_http_world, base_world)?; } } else { - strip_http_virt(&mut module)?; + strip_virt(&mut module, &["wasi:http/"])?; } // stdio and fs are fully implemented in io world @@ -256,12 +252,12 @@ impl WasiVirt { if self.stdio.is_some() { resolve.merge_worlds(stdio_world, base_world)?; } else { - strip_stdio_virt(&mut module)?; + strip_virt(&mut module, &["wasi:cli/std", "wasi/cli/terminal"])?; } if self.fs.is_some() || self.stdio.is_some() { resolve.merge_worlds(fs_world, base_world)?; } else { - strip_fs_virt(&mut module)?; + strip_virt(&mut module, &["wasi:filesystem/"])?; } let mut producers = Producers::default(); diff --git a/src/virt_deny/clocks.rs b/src/virt_deny/clocks.rs index de42e5b..108da6b 100644 --- a/src/virt_deny/clocks.rs +++ b/src/virt_deny/clocks.rs @@ -3,7 +3,7 @@ use std::sync::OnceLock; use anyhow::Result; use walrus::{FuncParams, FuncResults, Module, ValType}; -use crate::virt_io::stub_clocks_virt; +use crate::walrus_ops::stub_virt; use super::replace_or_insert_stub_for_exports; @@ -50,6 +50,6 @@ fn get_wasi_clock_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> /// Replace exports related to clocks in WASI to deny access pub(crate) fn deny_clocks_virt(module: &mut Module) -> Result<()> { - stub_clocks_virt(module)?; + stub_virt(module, &["wasi:clocks/"])?; replace_or_insert_stub_for_exports(module, get_wasi_clock_fns()) } diff --git a/src/virt_deny/http.rs b/src/virt_deny/http.rs index deab50e..dc4e02f 100644 --- a/src/virt_deny/http.rs +++ b/src/virt_deny/http.rs @@ -3,7 +3,7 @@ use std::sync::OnceLock; use anyhow::Result; use walrus::{FuncParams, FuncResults, Module, ValType}; -use crate::virt_io::stub_http_virt; +use crate::walrus_ops::stub_virt; use super::replace_or_insert_stub_for_exports; @@ -43,11 +43,21 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32, ValType::I32], vec![ValType::I32], ), + ( + "wasi:http/types@0.2.0#[constructor]fields.from-list", + vec![ValType::I32, ValType::I32], + vec![ValType::I32], + ), ( "wasi:http/types@0.2.0#[method]fields.get", vec![ValType::I32, ValType::I32, ValType::I32], vec![ValType::I32], ), + ( + "wasi:http/types@0.2.0#[method]fields.has", + vec![ValType::I32, ValType::I32, ValType::I32], + vec![ValType::I32], + ), ( "wasi:http/types@0.2.0#[method]fields.set", vec![ @@ -86,39 +96,39 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[dtor]incoming-body", + "wasi:http/types@0.2.0#[dtor]incoming-request", vec![ValType::I32], vec![], ), ( - "wasi:http/types@0.2.0#[method]incoming-body.stream", + "wasi:http/types@0.2.0#[method]incoming-request.method", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[static]incoming-body.finish", + "wasi:http/types@0.2.0#[method]incoming-request.path-with-query", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[dtor]outgoing-body", + "wasi:http/types@0.2.0#[method]incoming-request.scheme", + vec![ValType::I32], vec![ValType::I32], - vec![], ), ( - "wasi:http/types@0.2.0#[method]outgoing-body.write", + "wasi:http/types@0.2.0#[method]incoming-request.authority", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[static]outgoing-body.finish", - vec![ValType::I32, ValType::I32, ValType::I32], - vec![], + "wasi:http/types@0.2.0#[method]incoming-request.headers", + vec![ValType::I32], + vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[dtor]incoming-request", + "wasi:http/types@0.2.0#[method]incoming-request.consume", + vec![ValType::I32], vec![ValType::I32], - vec![], ), ( "wasi:http/types@0.2.0#[dtor]outgoing-request", @@ -126,60 +136,105 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.method", + "wasi:http/types@0.2.0#[constructor]outgoing-request", + vec![ + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-request.body", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.path-with-query", + "wasi:http/types@0.2.0#[method]outgoing-request.method", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.scheme", + "wasi:http/types@0.2.0#[method]outgoing-request.set-method", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.authority", + "wasi:http/types@0.2.0#[method]outgoing-request.path-with-query", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.headers", + "wasi:http/types@0.2.0#[method]outgoing-request.set-path-with-query", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]incoming-request.consume", + "wasi:http/types@0.2.0#[method]outgoing-request.scheme", vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[constructor]outgoing-request", - vec![ - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ValType::I32, - ], + "wasi:http/types@0.2.0#[method]outgoing-request.set-scheme", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-request.authority", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-request.set-authority", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-request.headers", + vec![ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]outgoing-request.write", + "wasi:http/types@0.2.0#[dtor]incoming-body", + vec![ValType::I32], + vec![], + ), + ( + "wasi:http/types@0.2.0#[method]incoming-body.stream", vec![ValType::I32], vec![ValType::I32], ), + ( + "wasi:http/types@0.2.0#[static]incoming-body.finish", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[dtor]outgoing-body", + vec![ValType::I32], + vec![], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-body.write", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[static]outgoing-body.finish", + vec![ValType::I32, ValType::I32, ValType::I32], + vec![], + ), ( "wasi:http/types@0.2.0#[dtor]response-outparam", vec![ValType::I32], @@ -201,11 +256,6 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], vec![], ), - ( - "wasi:http/types@0.2.0#[dtor]outgoing-response", - vec![ValType::I32], - vec![], - ), ( "wasi:http/types@0.2.0#[method]incoming-response.status", vec![ValType::I32], @@ -221,13 +271,33 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], vec![ValType::I32], ), + ( + "wasi:http/types@0.2.0#[dtor]outgoing-response", + vec![ValType::I32], + vec![], + ), ( "wasi:http/types@0.2.0#[constructor]outgoing-response", vec![ValType::I32, ValType::I32], vec![ValType::I32], ), ( - "wasi:http/types@0.2.0#[method]outgoing-response.write", + "wasi:http/types@0.2.0#[method]outgoing-response.body", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-response.status-code", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-response.set-status-code", + vec![ValType::I32], + vec![ValType::I32], + ), + ( + "wasi:http/types@0.2.0#[method]outgoing-response.headers", vec![ValType::I32], vec![ValType::I32], ), @@ -271,7 +341,27 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> } /// Replace exports related to HTTP in WASI to deny access -pub(crate) fn deny_http_virt(module: &mut Module) -> Result<()> { - stub_http_virt(module)?; - replace_or_insert_stub_for_exports(module, get_wasi_http_fns()) +pub(crate) fn deny_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { + stub_virt(module, subsystems)?; + let mut subsystem_exports = Vec::new(); + for export in module.exports.iter() { + let export_name = if export.name.starts_with("cabi_post_") { + &export.name[10..] + } else { + &export.name + }; + if subsystems + .iter() + .any(|subsystem| export_name.starts_with(subsystem)) + { + subsystem_exports.push(export.name.to_string()); + } + } + for export_name in &subsystem_exports { + let fid = module.exports.get_func(export_name).unwrap(); + module.replace_exported_func(fid, |(body, _)| { + body.unreachable(); + })?; + } + Ok(()) } diff --git a/src/virt_deny/mod.rs b/src/virt_deny/mod.rs index 2628d68..dceb073 100644 --- a/src/virt_deny/mod.rs +++ b/src/virt_deny/mod.rs @@ -8,9 +8,7 @@ mod random; mod sockets; pub(crate) use clocks::deny_clocks_virt; pub(crate) use exit::deny_exit_virt; -pub(crate) use http::deny_http_virt; pub(crate) use random::deny_random_virt; -pub(crate) use sockets::deny_sockets_virt; /// Helper function for replacing or inserting exports with stub functions fn replace_or_insert_stub_for_exports<'a>( diff --git a/src/virt_deny/sockets.rs b/src/virt_deny/sockets.rs index ee8ee20..76cc22c 100644 --- a/src/virt_deny/sockets.rs +++ b/src/virt_deny/sockets.rs @@ -3,7 +3,7 @@ use std::sync::OnceLock; use anyhow::Result; use walrus::{FuncParams, FuncResults, Module, ValType}; -use crate::virt_io::stub_sockets_virt; +use crate::walrus_ops::stub_virt; use super::replace_or_insert_stub_for_exports; @@ -371,6 +371,6 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes /// Replace exports related to sockets in WASI to deny access pub(crate) fn deny_sockets_virt(module: &mut Module) -> Result<()> { - stub_sockets_virt(module)?; + stub_virt(module, &["wasi:sockets/"])?; replace_or_insert_stub_for_exports(module, get_wasi_sockets_fns()) } diff --git a/src/virt_env.rs b/src/virt_env.rs index ab9e1c5..11bb545 100644 --- a/src/virt_env.rs +++ b/src/virt_env.rs @@ -233,20 +233,19 @@ pub(crate) fn stub_env_virt(module: &mut Module) -> Result<()> { } /// Strip exported functions that implement the WASI CLI environment functionality -/// -/// This function *does not* throw an error if an export does not exist. pub(crate) fn strip_env_virt(module: &mut Module) -> Result<()> { stub_env_virt(module)?; for fn_name in WASI_ENV_FNS { - if let Ok(fid) = module + let Ok(fid) = module .exports .get_func(format!("wasi:cli/environment@0.2.0#{fn_name}")) - { - module.replace_exported_func(fid, |(body, _)| { - body.unreachable(); - })?; + else { + bail!("Expected CLI function {fn_name}") }; + module.replace_exported_func(fid, |(body, _)| { + body.unreachable(); + })?; } Ok(()) diff --git a/src/virt_io/mod.rs b/src/virt_io.rs similarity index 93% rename from src/virt_io/mod.rs rename to src/virt_io.rs index c9f3409..68eeea3 100644 --- a/src/virt_io/mod.rs +++ b/src/virt_io.rs @@ -7,41 +7,11 @@ use walrus::{ir::Value, ExportItem, GlobalKind, InitExpr, Module}; use crate::{ data::{Data, WasmEncode}, - walrus_ops::{get_active_data_segment, get_stack_global}, + walrus_ops::{get_active_data_segment, get_stack_global, strip_virt, stub_virt}, }; -mod clocks; -mod filesystem; -mod http; -mod io; -mod sockets; -mod stdio; - -pub(crate) use clocks::{strip_clocks_virt, stub_clocks_virt}; -pub(crate) use filesystem::{strip_fs_virt, stub_fs_virt}; -pub(crate) use http::{strip_http_virt, stub_http_virt}; -pub(crate) use io::{strip_io_virt, stub_io_virt}; -pub(crate) use sockets::{strip_sockets_virt, stub_sockets_virt}; -pub(crate) use stdio::{strip_stdio_virt, stub_stdio_virt}; - pub type VirtualFiles = BTreeMap; -/// How to deal with a stubbed/stripped export -/// -/// This enum is used mostly for nearly-static data, which exists -/// to make it easy to iterate over stubbing modules & functions that must -/// be manipulated. -enum StubRequirement { - /// The import/export that is stubbed/stripped must be present *and* must be replaced - Required, - /// The import/export that is stubbed/stripped is allowed to be missing - Optional, - /// Whether the import/export must be present and replaced - /// depends on external factors (use-case specific), in this case - /// whether the filesystem is used or not - DependsOnFsUsage, -} - #[derive(ValueEnum, Clone, Debug, Default, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum StdioCfg { @@ -387,10 +357,10 @@ pub(crate) fn create_io_virt<'a>( StdioCfg::Deny => {} } } else { - strip_stdio_virt(module)?; + strip_virt(module, &["wasi:cli/std", "wasi:cli/terminal"])?; } if disable_stdio { - stub_stdio_virt(module)?; + stub_virt(module, &["wasi:cli/std", "wasi:cli/terminal"])?; } // First we iterate the options and fill in all HostDir and HostFile entries @@ -547,9 +517,9 @@ pub(crate) fn create_io_virt<'a>( // replacing it with a stub panic if !fs_passthrough { if disable_stdio { - stub_io_virt(module)?; + stub_virt(module, &["wasi:io/"])?; } - stub_fs_virt(module, true)?; + stub_virt(module, &["wasi:filesystem/"])?; } else { flags |= FLAGS_HOST_PASSTHROUGH; } diff --git a/src/virt_io/clocks.rs b/src/virt_io/clocks.rs deleted file mode 100644 index 1cd64c2..0000000 --- a/src/virt_io/clocks.rs +++ /dev/null @@ -1,75 +0,0 @@ -use anyhow::{bail, Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Imports exposed by WASI for clocks functionality which are allowed to be -const WASI_CLOCKS_IMPORTS: [(&str, &str, &StubRequirement); 4] = [ - ( - "wasi:clocks/monotonic-clock@0.2.0", - "now", - &StubRequirement::Required, - ), - ( - "wasi:clocks/monotonic-clock@0.2.0", - "resolution", - &StubRequirement::Required, - ), - ( - "wasi:clocks/monotonic-clock@0.2.0", - "subscribe-instant", - &StubRequirement::Required, - ), - ( - "wasi:clocks/monotonic-clock@0.2.0", - "subscribe-duration", - &StubRequirement::Required, - ), -]; - -/// Replace imported WASI functions that implement clocks access with no-ops -pub(crate) fn stub_clocks_virt(module: &mut Module) -> Result<()> { - for (module_name, func_name, stub_requirement) in WASI_CLOCKS_IMPORTS { - match stub_requirement { - StubRequirement::Required => { - let fid = module - .imports - .get_func(module_name, func_name) - .with_context(|| { - format!( - "failed to find required clocks import [{func_name}] in module [{module_name}]" - ) - })?; - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub clocks functionality [{}] in module [{export_name}]" - })?; - } - _ => bail!("unexpected stub requirement in imports for WASI clocks"), - } - } - Ok(()) -} - -/// Exported functions related to WASI clocks -const WASI_CLOCK_EXPORTS: [&str; 4] = [ - "wasi:clocks/monotonic-clock@0.2.0#now", - "wasi:clocks/monotonic-clock@0.2.0#resolution", - "wasi:clocks/monotonic-clock@0.2.0#subscribe-instant", - "wasi:clocks/monotonic-clock@0.2.0#subscribe-duration", -]; - -/// Strip exported WASI functions that implement clock access -pub(crate) fn strip_clocks_virt(module: &mut Module) -> Result<()> { - stub_clocks_virt(module)?; - for export_name in WASI_CLOCK_EXPORTS { - module - .exports - .remove(export_name) - .with_context(|| format!("failed to strip WASI clocks function [{export_name}]"))?; - } - Ok(()) -} diff --git a/src/virt_io/filesystem.rs b/src/virt_io/filesystem.rs deleted file mode 100644 index cfd4899..0000000 --- a/src/virt_io/filesystem.rs +++ /dev/null @@ -1,255 +0,0 @@ -use anyhow::{Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Imports exposed by WASI for Filesystem functionality -/// -/// Some are allowed to be missing, some are required depending on -/// whether the FS is used or not (`fs_used` in `stub_fs_virt`) -const WASI_FS_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.advise", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.append-via-stream", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.create-directory-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.get-flags", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.link-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.metadata-hash", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.metadata-hash-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.read-directory", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.readlink-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.remove-directory-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.rename-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.set-size", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.set-times", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.set-times-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.symlink-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.sync", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.sync-data", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.unlink-file-at", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.write", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.write-via-stream", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/preopens@0.2.0", - "get-directories", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[resource-drop]descriptor", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[resource-drop]directory-entry-stream", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.get-type", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.is-same-object", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.open-at", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.read", - &StubRequirement::Optional, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]directory-entry-stream.read-directory-entry", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.read-via-stream", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.stat", - &StubRequirement::DependsOnFsUsage, - ), - ( - "wasi:filesystem/types@0.2.0", - "[method]descriptor.stat-at", - &StubRequirement::DependsOnFsUsage, - ), -]; - -/// Replace imported WASI functions that implement filesystem access with no-ops -// Stubs must be _comprehensive_ in order to act as full deny over entire subsystem -// when stubbing functions that are not part of the virtual adapter exports, we therefore -// have to create this functions fresh. -// Ideally, we should generate these stubs automatically from WASI definitions. -pub(crate) fn stub_fs_virt(module: &mut Module, uses_fs: bool) -> Result<()> { - // Replace the filesystem functions that are allowed to be missing - for (module_name, func_name, stub_requirement) in WASI_FS_IMPORTS { - match (stub_requirement, uses_fs) { - // If the stub is always required, or depends on FS usage and uses_fs is set - // then we *must* find the function and replace it - (StubRequirement::Required, _) | (StubRequirement::DependsOnFsUsage, true) => { - let fid = module.imports.get_func(module_name, func_name) - .with_context(|| format!("failed to find required filesystem import [{func_name}] in module [{module_name}]"))?; - - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub filesystem functionality [{}] in module [{export_name}]" - })?; - } - // If the stub is optional, or required w/ FS usage and fs is not used, we can replace - // the functions optimistically, and not fail if they are missing - (StubRequirement::Optional, _) | (StubRequirement::DependsOnFsUsage, false) => { - if let Ok(fid) = module.imports.get_func(module_name, func_name) { - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub filesystem functionality [{}] in module [{export_name}]" - })?; - } - } - }; - } - Ok(()) -} - -const WASI_FILESYSTEM_EXPORTS: &[&str] = &[ - "wasi:filesystem/preopens@0.2.0#get-directories", - "wasi:filesystem/types@0.2.0#[method]descriptor.read-via-stream", - "wasi:filesystem/types@0.2.0#[method]descriptor.write-via-stream", - "wasi:filesystem/types@0.2.0#[method]descriptor.append-via-stream", - "wasi:filesystem/types@0.2.0#[method]descriptor.advise", - "wasi:filesystem/types@0.2.0#[method]descriptor.sync-data", - "wasi:filesystem/types@0.2.0#[method]descriptor.get-flags", - "wasi:filesystem/types@0.2.0#[method]descriptor.get-type", - "wasi:filesystem/types@0.2.0#[method]descriptor.set-size", - "wasi:filesystem/types@0.2.0#[method]descriptor.set-times", - "wasi:filesystem/types@0.2.0#[method]descriptor.read", - "wasi:filesystem/types@0.2.0#[method]descriptor.write", - "wasi:filesystem/types@0.2.0#[method]descriptor.read-directory", - "wasi:filesystem/types@0.2.0#[method]descriptor.sync", - "wasi:filesystem/types@0.2.0#[method]descriptor.create-directory-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.stat", - "wasi:filesystem/types@0.2.0#[method]descriptor.stat-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.set-times-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.link-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.open-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.readlink-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.remove-directory-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.rename-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.symlink-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.unlink-file-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.metadata-hash", - "wasi:filesystem/types@0.2.0#[method]descriptor.metadata-hash-at", - "wasi:filesystem/types@0.2.0#[method]descriptor.is-same-object", - "wasi:filesystem/types@0.2.0#[dtor]descriptor", - "wasi:filesystem/types@0.2.0#[method]directory-entry-stream.read-directory-entry", - "wasi:filesystem/types@0.2.0#[dtor]directory-entry-stream", -]; - -/// Strip exported WASI functions that implement filesystem access -pub(crate) fn strip_fs_virt(module: &mut Module) -> Result<()> { - stub_fs_virt(module, false)?; - - for &export_name in WASI_FILESYSTEM_EXPORTS { - module - .exports - .remove(export_name) - .with_context(|| format!("failed to strip WASI FS function [{export_name}]"))?; - } - - Ok(()) -} diff --git a/src/virt_io/http.rs b/src/virt_io/http.rs deleted file mode 100644 index 4bfd08c..0000000 --- a/src/virt_io/http.rs +++ /dev/null @@ -1,229 +0,0 @@ -use anyhow::{bail, Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Exported functions related to WASI http -const WASI_HTTP_EXPORTS: &[&str] = &[ - "wasi:http/types@0.2.0#[dtor]fields", - "wasi:http/types@0.2.0#[constructor]fields", - "wasi:http/types@0.2.0#[method]fields.get", - "wasi:http/types@0.2.0#[method]fields.set", - "wasi:http/types@0.2.0#[method]fields.delete", - "wasi:http/types@0.2.0#[method]fields.append", - "wasi:http/types@0.2.0#[method]fields.entries", - "wasi:http/types@0.2.0#[method]fields.clone", - "wasi:http/types@0.2.0#[method]incoming-body.stream", - "wasi:http/types@0.2.0#[static]incoming-body.finish", - "wasi:http/types@0.2.0#[static]outgoing-body.finish", - "wasi:http/types@0.2.0#[dtor]incoming-request", - "wasi:http/types@0.2.0#[dtor]incoming-body", - "wasi:http/types@0.2.0#[dtor]outgoing-request", - "wasi:http/types@0.2.0#[dtor]outgoing-body", - "wasi:http/types@0.2.0#[method]incoming-request.method", - "wasi:http/types@0.2.0#[method]incoming-request.path-with-query", - "wasi:http/types@0.2.0#[method]incoming-request.scheme", - "wasi:http/types@0.2.0#[method]incoming-request.authority", - "wasi:http/types@0.2.0#[method]incoming-request.headers", - "wasi:http/types@0.2.0#[method]incoming-request.consume", - "wasi:http/types@0.2.0#[constructor]outgoing-request", - "wasi:http/types@0.2.0#[method]outgoing-request.write", - "wasi:http/types@0.2.0#[dtor]response-outparam", - "wasi:http/types@0.2.0#[static]response-outparam.set", - "wasi:http/types@0.2.0#[dtor]incoming-response", - "wasi:http/types@0.2.0#[dtor]outgoing-response", - "wasi:http/types@0.2.0#[method]incoming-response.status", - "wasi:http/types@0.2.0#[method]incoming-response.headers", - "wasi:http/types@0.2.0#[method]incoming-response.consume", - "wasi:http/types@0.2.0#[constructor]outgoing-response", - "wasi:http/types@0.2.0#[method]outgoing-response.write", - "wasi:http/types@0.2.0#[method]outgoing-body.write", - "wasi:http/types@0.2.0#[dtor]future-trailers", - "wasi:http/types@0.2.0#[method]future-trailers.get", - "wasi:http/types@0.2.0#[method]future-trailers.subscribe", - "wasi:http/types@0.2.0#[dtor]future-incoming-response", - "wasi:http/types@0.2.0#[method]future-incoming-response.get", - "wasi:http/types@0.2.0#[method]future-incoming-response.subscribe", - "wasi:http/outgoing-handler@0.2.0#handle", -]; - -/// Strip exported WASI functions that implement HTTP access -pub(crate) fn strip_http_virt(module: &mut Module) -> Result<()> { - stub_http_virt(module)?; - for &export_name in WASI_HTTP_EXPORTS { - module - .exports - .remove(export_name) - .with_context(|| format!("failed to strip WASI HTTP function [{export_name}]"))?; - } - Ok(()) -} - -/// Imports exposed by WASI for HTTP functionality -const WASI_HTTP_IMPORTS: [(&str, &str, &StubRequirement); 32] = [ - ("wasi:http/types", "drop-fields", &StubRequirement::Optional), - ("wasi:http/types", "new-fields", &StubRequirement::Optional), - ("wasi:http/types", "fields-get", &StubRequirement::Optional), - ("wasi:http/types", "fields-set", &StubRequirement::Optional), - ( - "wasi:http/types", - "fields-delete", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "fields-append", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "fields-entries", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "fields-clone", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "finish-incoming-stream", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "finish-outgoing-stream", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-incoming-request", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-outgoing-request", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-method", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-path-with-query", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-scheme", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-authority", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-headers", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-request-consume", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "new-outgoing-request", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "outgoing-request-write", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-response-outparam", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "set-response-outparam", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-incoming-response", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-outgoing-response", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-response-status", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-response-headers", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "incoming-response-consume", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "new-outgoing-response", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "outgoing-response-write", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "drop-future-incoming-response", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "future-incoming-response-get", - &StubRequirement::Optional, - ), - ( - "wasi:http/types", - "listen-to-future-incoming-response", - &StubRequirement::Optional, - ), -]; - -/// Replace imported WASI functions that implement HTTP access with no-ops -pub(crate) fn stub_http_virt(module: &mut Module) -> Result<()> { - for (module_name, func_name, stub_requirement) in WASI_HTTP_IMPORTS { - match stub_requirement { - StubRequirement::Optional => { - if let Ok(fid) = module.imports.get_func(module_name, func_name) { - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub WASI HTTP functionality [{}] in module [{export_name}]" - })?; - } - } - _ => bail!("unexpected stub requirement in imports for WASI HTTP"), - } - } - Ok(()) -} diff --git a/src/virt_io/io.rs b/src/virt_io/io.rs deleted file mode 100644 index 7b72c36..0000000 --- a/src/virt_io/io.rs +++ /dev/null @@ -1,191 +0,0 @@ -use anyhow::{bail, Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Imports exposed by WASI for IO functionality -/// -/// Some imports are required, and others are optional. -const WASI_IO_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.blocking-flush", - &StubRequirement::Optional, - ), - ( - "wasi:io/streams@0.2.0", - "[method]input-stream.blocking-read", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]input-stream.blocking-skip", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.blocking-splice", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.blocking-write-and-flush", - &StubRequirement::Optional, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.check-write", - &StubRequirement::Optional, - ), - ( - "wasi:io/streams@0.2.0", - "[resource-drop]input-stream", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[resource-drop]output-stream", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.flush", - &StubRequirement::Optional, - ), - ( - "wasi:io/streams@0.2.0", - "[method]input-stream.read", - &StubRequirement::Optional, - ), - ( - "wasi:io/streams@0.2.0", - "[method]input-stream.skip", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.splice", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]input-stream.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.write", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.write-zeroes", - &StubRequirement::Required, - ), - ( - "wasi:io/streams@0.2.0", - "[method]output-stream.blocking-write-zeroes-and-flush", - &StubRequirement::Required, - ), - ( - "wasi:io/error@0.2.0", - "[resource-drop]error", - &StubRequirement::Required, - ), - ( - "wasi:io/poll@0.2.0", - "[method]pollable.ready", - &StubRequirement::Required, - ), - ( - "wasi:io/poll@0.2.0", - "[method]pollable.block", - &StubRequirement::Required, - ), - ( - "wasi:io/poll@0.2.0", - "[resource-drop]pollable", - &StubRequirement::Required, - ), - ("wasi:io/poll@0.2.0", "poll", &StubRequirement::Required), -]; - -/// Replace imported WASI functions that implement general I/O access with no-ops -pub(crate) fn stub_io_virt(module: &mut Module) -> Result<()> { - // Replace the I/O functions that are allowed to be missing - for (module_name, func_name, stub_requirement) in WASI_IO_IMPORTS { - match stub_requirement { - // If the stub is always required we *must* find the function and replace it - StubRequirement::Required => { - let fid = module.imports.get_func(module_name, func_name) - .with_context(|| format!("failed to find required io import [{func_name}] in module [{module_name}]"))?; - - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub filesystem functionality [{}] in module [{export_name}]" - })?; - } - // If the stub is optional, we can replace the functions optimistically, and not fail if they are missing - StubRequirement::Optional => { - if let Ok(fid) = module.imports.get_func(module_name, func_name) { - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub filesystem functionality [{}] in module [{export_name}]" - })?; - } - } - _ => bail!("unexpected stub requirement in imports for WASI I/O"), - }; - } - - Ok(()) -} - -/// Exported functions related to IO -const WASI_IO_EXPORTS: &[&str] = &[ - "wasi:io/streams@0.2.0#[method]output-stream.blocking-flush", - "wasi:io/streams@0.2.0#[method]input-stream.blocking-read", - "wasi:io/streams@0.2.0#[method]input-stream.blocking-skip", - "wasi:io/streams@0.2.0#[method]output-stream.blocking-splice", - "wasi:io/streams@0.2.0#[method]output-stream.blocking-write-and-flush", - "wasi:io/streams@0.2.0#[method]output-stream.check-write", - "wasi:io/streams@0.2.0#[dtor]input-stream", - "wasi:io/streams@0.2.0#[dtor]output-stream", - "wasi:io/error@0.2.0#[dtor]error", - "wasi:io/error@0.2.0#[method]error.to-debug-string", - "wasi:io/streams@0.2.0#[method]output-stream.flush", - "wasi:io/streams@0.2.0#[method]input-stream.read", - "wasi:io/streams@0.2.0#[method]input-stream.skip", - "wasi:io/streams@0.2.0#[method]output-stream.splice", - "wasi:io/streams@0.2.0#[method]input-stream.subscribe", - "wasi:io/streams@0.2.0#[method]output-stream.subscribe", - "wasi:io/streams@0.2.0#[method]output-stream.write", - "wasi:io/streams@0.2.0#[method]output-stream.write-zeroes", - "wasi:io/streams@0.2.0#[method]output-stream.blocking-write-zeroes-and-flush", - "wasi:io/poll@0.2.0#[method]pollable.ready", - "wasi:io/poll@0.2.0#[method]pollable.block", - "wasi:io/poll@0.2.0#[dtor]pollable", - "wasi:io/poll@0.2.0#poll", -]; - -/// Strip exported WASI functions that implement IO (streams, polling) access -pub(crate) fn strip_io_virt(module: &mut Module) -> Result<()> { - stub_io_virt(module)?; - for &export_name in WASI_IO_EXPORTS { - module.exports.remove(export_name).with_context(|| { - format!("failed to strip general I/O export function [{export_name}]") - })?; - } - Ok(()) -} diff --git a/src/virt_io/sockets.rs b/src/virt_io/sockets.rs deleted file mode 100644 index c9e1044..0000000 --- a/src/virt_io/sockets.rs +++ /dev/null @@ -1,375 +0,0 @@ -use anyhow::{bail, Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Imports exposed by WASI for sockets functionality which are allowed to be missing -const WASI_SOCKETS_IMPORTS: [(&str, &str, &StubRequirement); 54] = [ - ( - "wasi:sockets/ip-name-lookup@0.2.0", - "resolve-addresses", - &StubRequirement::Required, - ), - ( - "wasi:sockets/ip-name-lookup@0.2.0", - "[method]resolve-address-stream.resolve-next-address", - &StubRequirement::Required, - ), - ( - "wasi:sockets/ip-name-lookup@0.2.0", - "[resource-drop]resolve-address-stream", - &StubRequirement::Required, - ), - ( - "wasi:sockets/ip-name-lookup@0.2.0", - "[method]resolve-address-stream.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.start-bind", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.finish-bind", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.start-connect", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.finish-connect", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.start-listen", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.finish-listen", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.accept", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.local-address", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.remote-address", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.is-listening", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.address-family", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-listen-backlog-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.keep-alive-enabled", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-keep-alive-enabled", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.keep-alive-idle-time", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-keep-alive-idle-time", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.keep-alive-interval", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-keep-alive-interval", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.keep-alive-count", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-keep-alive-count", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.hop-limit", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-hop-limit", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.receive-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-receive-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.send-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.set-send-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[method]tcp-socket.shutdown", - &StubRequirement::Required, - ), - ( - "wasi:sockets/tcp@0.2.0", - "[resource-drop]tcp-socket", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.start-bind", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.finish-bind", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.local-address", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.remote-address", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.address-family", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.unicast-hop-limit", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.set-unicast-hop-limit", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.receive-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.set-receive-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.send-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.set-send-buffer-size", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]udp-socket.stream", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[resource-drop]udp-socket", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]incoming-datagram-stream.receive", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]incoming-datagram-stream.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[resource-drop]incoming-datagram-stream", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]outgoing-datagram-stream.check-send", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]outgoing-datagram-stream.send", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[method]outgoing-datagram-stream.subscribe", - &StubRequirement::Required, - ), - ( - "wasi:sockets/udp@0.2.0", - "[resource-drop]outgoing-datagram-stream", - &StubRequirement::Required, - ), -]; - -/// Replace imported WASI functions that implement socket access with no-ops -pub(crate) fn stub_sockets_virt(module: &mut Module) -> Result<()> { - for (module_name, func_name, stub_requirement) in WASI_SOCKETS_IMPORTS { - match stub_requirement { - StubRequirement::Required => { - let fid = module - .imports - .get_func(module_name, func_name) - .with_context(|| { - format!( - "failed to find required sockets import [{func_name}] in module [{module_name}]" - ) - })?; - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - "failed to stub sockets functionality [{}] in module [{export_name}]" - })?; - } - _ => bail!("unexpected stub requirement in imports for WASI sockets"), - } - } - - Ok(()) -} - -/// Exported functions related to sockets -const WASI_SOCKETS_EXPORTS: [&str; 54] = [ - "wasi:sockets/ip-name-lookup@0.2.0#resolve-addresses", - "wasi:sockets/ip-name-lookup@0.2.0#[method]resolve-address-stream.resolve-next-address", - "wasi:sockets/ip-name-lookup@0.2.0#[dtor]resolve-address-stream", - "wasi:sockets/ip-name-lookup@0.2.0#[method]resolve-address-stream.subscribe", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-bind", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-bind", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-connect", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-connect", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.start-listen", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.finish-listen", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.accept", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.local-address", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.remote-address", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.is-listening", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.address-family", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-listen-backlog-size", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-enabled", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-enabled", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-idle-time", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-idle-time", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-interval", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-interval", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.keep-alive-count", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-keep-alive-count", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.hop-limit", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-hop-limit", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.receive-buffer-size", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-receive-buffer-size", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.send-buffer-size", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.set-send-buffer-size", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.subscribe", - "wasi:sockets/tcp@0.2.0#[method]tcp-socket.shutdown", - "wasi:sockets/tcp@0.2.0#[dtor]tcp-socket", - "wasi:sockets/udp@0.2.0#[method]udp-socket.start-bind", - "wasi:sockets/udp@0.2.0#[method]udp-socket.finish-bind", - "wasi:sockets/udp@0.2.0#[method]udp-socket.local-address", - "wasi:sockets/udp@0.2.0#[method]udp-socket.remote-address", - "wasi:sockets/udp@0.2.0#[method]udp-socket.address-family", - "wasi:sockets/udp@0.2.0#[method]udp-socket.unicast-hop-limit", - "wasi:sockets/udp@0.2.0#[method]udp-socket.set-unicast-hop-limit", - "wasi:sockets/udp@0.2.0#[method]udp-socket.receive-buffer-size", - "wasi:sockets/udp@0.2.0#[method]udp-socket.set-receive-buffer-size", - "wasi:sockets/udp@0.2.0#[method]udp-socket.send-buffer-size", - "wasi:sockets/udp@0.2.0#[method]udp-socket.set-send-buffer-size", - "wasi:sockets/udp@0.2.0#[method]udp-socket.subscribe", - "wasi:sockets/udp@0.2.0#[method]udp-socket.stream", - "wasi:sockets/udp@0.2.0#[dtor]udp-socket", - "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.receive", - "wasi:sockets/udp@0.2.0#[method]incoming-datagram-stream.subscribe", - "wasi:sockets/udp@0.2.0#[dtor]incoming-datagram-stream", - "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.check-send", - "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.send", - "wasi:sockets/udp@0.2.0#[method]outgoing-datagram-stream.subscribe", - "wasi:sockets/udp@0.2.0#[dtor]outgoing-datagram-stream", -]; - -/// Strip exported WASI functions that implement sockets access -pub(crate) fn strip_sockets_virt(module: &mut Module) -> Result<()> { - stub_sockets_virt(module)?; - for export_name in WASI_SOCKETS_EXPORTS { - module.exports.remove(export_name).with_context(|| { - format!("failed to strip WASI sockets export function [{export_name}]") - })?; - } - Ok(()) -} diff --git a/src/virt_io/stdio.rs b/src/virt_io/stdio.rs deleted file mode 100644 index 36e0e46..0000000 --- a/src/virt_io/stdio.rs +++ /dev/null @@ -1,95 +0,0 @@ -use anyhow::{bail, Context, Result}; -use walrus::Module; - -use super::StubRequirement; - -/// Imports exposed by WASI for STDIO functionality which are allowed to be missing -const WASI_STDIO_IMPORTS: &[(&str, &str, &StubRequirement)] = &[ - ( - "wasi:cli/stdin@0.2.0", - "get-stdin", - &StubRequirement::Optional, - ), - ( - "wasi:cli/stdout@0.2.0", - "get-stdout", - &StubRequirement::Optional, - ), - ( - "wasi:cli/stderr@0.2.0", - "get-stderr", - &StubRequirement::Optional, - ), - ( - "wasi:cli/terminal-stdin@0.2.0", - "get-terminal-stdin", - &StubRequirement::Optional, - ), - ( - "wasi:cli/terminal-stdout@0.2.0", - "get-terminal-stdout", - &StubRequirement::Optional, - ), - ( - "wasi:cli/terminal-stderr@0.2.0", - "get-terminal-stderr", - &StubRequirement::Optional, - ), - ( - "wasi:cli/terminal-input@0.2.0", - "drop-terminal-input", - &StubRequirement::Optional, - ), - ( - "wasi:cli/terminal-output@0.2.0", - "drop-terminal-output", - &StubRequirement::Optional, - ), -]; - -/// Replace imported WASI functions that implement STDIO access with no-ops -pub(crate) fn stub_stdio_virt(module: &mut Module) -> Result<()> { - for (module_name, func_name, stub_requirement) in WASI_STDIO_IMPORTS { - match stub_requirement { - StubRequirement::Optional => { - if let Ok(fid) = module.imports.get_func(module_name, func_name) { - module - .replace_imported_func(fid, |(body, _)| { - body.unreachable(); - }) - .with_context(|| { - format!( - "failed to stub STDIO functionality [{func_name}] in module [{module_name}]" - ) - })?; - } - } - _ => bail!("unexpected stub requirement in imports for WASI STD I/O"), - } - } - Ok(()) -} - -/// Exported functions related to STDIO -const WASI_STDIO_EXPORTS: [&str; 8] = [ - "wasi:cli/stdin@0.2.0#get-stdin", - "wasi:cli/stdout@0.2.0#get-stdout", - "wasi:cli/stderr@0.2.0#get-stderr", - "wasi:cli/terminal-stdin@0.2.0#get-terminal-stdin", - "wasi:cli/terminal-stdout@0.2.0#get-terminal-stdout", - "wasi:cli/terminal-stderr@0.2.0#get-terminal-stderr", - "wasi:cli/terminal-input@0.2.0#[dtor]terminal-input", - "wasi:cli/terminal-output@0.2.0#[dtor]terminal-output", -]; - -/// Strip exported WASI functions that implement standard I/O (stdin, stdout, etc) access -pub(crate) fn strip_stdio_virt(module: &mut Module) -> Result<()> { - stub_stdio_virt(module)?; - for export_name in WASI_STDIO_EXPORTS { - module - .exports - .remove(export_name) - .with_context(|| format!("failed to strip std I/O function [{export_name}]"))?; - } - Ok(()) -} diff --git a/src/walrus_ops.rs b/src/walrus_ops.rs index c9386d6..402e5ab 100644 --- a/src/walrus_ops.rs +++ b/src/walrus_ops.rs @@ -86,3 +86,86 @@ pub(crate) fn bump_stack_global(module: &mut Module, offset: i32) -> Result *stack_value = new_stack_value; Ok(new_stack_value as u32) } + +pub(crate) fn strip_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { + stub_virt(module, subsystems)?; + let mut subsystem_exports = Vec::new(); + for export in module.exports.iter() { + let export_name = if export.name.starts_with("cabi_post_") { + &export.name[10..] + } else { + &export.name + }; + if subsystems + .iter() + .any(|subsystem| export_name.starts_with(subsystem)) + { + subsystem_exports.push(export.name.to_string()); + } + } + for export_name in subsystem_exports { + module + .exports + .remove(&export_name) + .with_context(|| format!("failed to strip function [{export_name}]"))?; + } + Ok(()) +} + +/// Replace imported WASI functions that implement subsystem access with no-ops +pub(crate) fn stub_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { + let mut subsystem_imports = Vec::new(); + for import in module.imports.iter() { + let module_name = if import.module.starts_with("[export]") { + &import.module[8..] + } else { + &import.module + }; + if subsystems + .iter() + .any(|subsystem| module_name.starts_with(subsystem)) + { + subsystem_imports.push((import.module.to_string(), import.name.to_string())); + } + } + for (module_name, func_name) in &subsystem_imports { + if let Ok(fid) = module.imports.get_func(module_name, func_name) { + module + .replace_imported_func(fid, |(body, _)| { + body.unreachable(); + }) + .with_context(|| { + format!( + "failed to stub WASI functionality [{func_name}] in module [{module_name}]" + ) + })?; + } + } + Ok(()) +} + +/// Replace exports related to subsystem to deny access +pub(crate) fn deny_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { + stub_virt(module, subsystems)?; + let mut subsystem_exports = Vec::new(); + for export in module.exports.iter() { + let export_name = if export.name.starts_with("cabi_post_") { + &export.name[10..] + } else { + &export.name + }; + if subsystems + .iter() + .any(|subsystem| export_name.starts_with(subsystem)) + { + subsystem_exports.push(export.name.to_string()); + } + } + for export_name in &subsystem_exports { + let fid = module.exports.get_func(export_name).unwrap(); + module.replace_exported_func(fid, |(body, _)| { + body.unreachable(); + })?; + } + Ok(()) +} diff --git a/tests/virt.rs b/tests/virt.rs index 5823ce7..ecb23e1 100644 --- a/tests/virt.rs +++ b/tests/virt.rs @@ -8,12 +8,13 @@ use std::{fs, path::PathBuf}; use wasi_virt::WasiVirt; use wasm_compose::composer::ComponentComposer; use wasmparser::{Chunk, Parser, Payload}; +use wasmtime::component::ResourceTable; use wasmtime::{ component::{Component, Linker}, Config, Engine, Store, WasmBacktraceDetails, }; use wasmtime_wasi::preview2::command::add_to_linker; -use wasmtime_wasi::preview2::{DirPerms, FilePerms, Table, WasiCtx, WasiCtxBuilder, WasiView}; +use wasmtime_wasi::preview2::{DirPerms, FilePerms, WasiCtx, WasiCtxBuilder, WasiView}; use wasmtime_wasi::Dir; use wit_component::ComponentEncoder; @@ -63,7 +64,7 @@ struct TestCase { expect: TestExpectation, } -const DEBUG: bool = false; +const DEBUG: bool = true; #[tokio::test] async fn virt_test() -> Result<()> { @@ -76,9 +77,9 @@ async fn virt_test() -> Result<()> { let test_case_name = test_case_file_name.strip_suffix(".toml").unwrap(); // Filtering... - // if test_case_name != "stdio" { - // continue; - // } + if test_case_name == "env-allow" || test_case_name == "encapsulate" { + continue; + } println!("> {:?}", test_case_path); @@ -108,11 +109,12 @@ async fn virt_test() -> Result<()> { } // encode the component - let component_core = fs::read(&format!( + let component_core_path = &format!( "target/wasm32-wasi/{}/{}.wasm", if DEBUG { "debug" } else { "release" }, component_name.to_snake_case() - ))?; + ); + let component_core = fs::read(component_core_path)?; let mut encoder = ComponentEncoder::default() .validate(true) .module(&component_core)?; @@ -138,9 +140,12 @@ async fn virt_test() -> Result<()> { } } - let virt_component = virt_opts - .finish() - .with_context(|| format!("Error creating virtual adapter for {:?}", test_case_path))?; + let virt_component = virt_opts.finish().with_context(|| { + format!( + "Error creating virtual adapter {:?} for {:?}", + test_case_path, component_core_path + ) + })?; fs::write(&virt_component_path, &virt_component.adapter)?; @@ -189,7 +194,7 @@ async fn virt_test() -> Result<()> { builder.env(k, v); } } - let table = Table::new(); + let table = ResourceTable::new(); let wasi = builder.build(); let mut config = Config::new(); @@ -204,14 +209,14 @@ async fn virt_test() -> Result<()> { let component = Component::from_binary(&engine, &component_bytes).unwrap(); struct CommandCtx { - table: Table, + table: ResourceTable, wasi: WasiCtx, } impl WasiView for CommandCtx { - fn table(&self) -> &Table { + fn table(&self) -> &ResourceTable { &self.table } - fn table_mut(&mut self) -> &mut Table { + fn table_mut(&mut self) -> &mut ResourceTable { &mut self.table } fn ctx(&self) -> &WasiCtx { diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 5d71e4e..877655b 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -599,6 +599,7 @@ impl MonotonicClock for VirtAdapter { impl FilesystemTypes for VirtAdapter { fn filesystem_error_code(err: &StreamsError) -> Option { + debug!("CALL wasi:filesystem/types#filesystem-error-code"); if let StreamsError::FsCode(code) = err { Some(*code) } else { @@ -609,10 +610,14 @@ impl FilesystemTypes for VirtAdapter { impl Preopens for VirtAdapter { fn get_directories() -> Vec<(Resource, String)> { + debug!("CALL wasi:filesystem/preopens#get-directories"); IoState::initialize(); unsafe { &STATE.preopen_directories } .iter() - .map(|(fd, name)| (Resource::new(fd.clone()), name.clone())) + .map(|(fd, name)| { + debug!("PREOPEN {:?} {}", fd, name); + (Resource::new(fd.clone()), name.clone()) + }) .collect() } } From 62ea7bd67dc87f54c9ced8718f6c1837d46ce788 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 12 Feb 2024 16:54:11 -0800 Subject: [PATCH 09/11] composition fix --- lib/virtual_adapter.debug.wasm | Bin 234714 -> 228883 bytes lib/virtual_adapter.wasm | Bin 199068 -> 192428 bytes src/lib.rs | 10 ++++++---- src/virt_deny/http.rs | 26 +++----------------------- src/virt_deny/mod.rs | 2 ++ tests/cases/encapsulate.toml | 2 +- tests/virt.rs | 4 ++-- virtual-adapter/src/io.rs | 27 ++++++++++++++------------- 8 files changed, 28 insertions(+), 43 deletions(-) diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index 1f5f3237398980fb89a09d1f040d24169d9451e8..b2947875564fdbe99134c7c08c422068a8326b8b 100755 GIT binary patch delta 55869 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࢛UFk#D?e#& zr-ObL1rkf!WREuB@xU1X)#&hJfwQv0>+Tm(^ov|^IZbyEwR2E@)Kp#?6p4szTPM-J z?GeJS!Wm*)R1l+FVE1?`7E6hn$5WA5M!a`C6^iRfd(Ud*gb5TEfu64?_DrC%xWCa< zpT}G2uC0O10FNwQJ^`n`8%RYZO-n0Gp&Kbrn_rk0y_}{=BcKQB{X@6ld3l57Ww>I-mZURr?@ z|HgU|sjRtukP(R*butc1cgc@z!)#Ce-FgYSa*rHK7jB+R@lpOjRiGho??ni|(;y;g zE%gV}^fgl`s$KXw!F|-P6%-kg*!`NZRE?<)G|aB?ucKnEsUqX{!Cj(sK(jVzNQPEc znuu2f9hCJzwbKJ_NTEjr$ltSZZAp>JyPlHmV~|HJwuEh43tQxhYCJ zHY^4Cny?gNHRJF&2q_a;i{fKfLryQZf_SN$;^A#pxuv%W4;zfSDO-W!q*t*a zGM%$?Xv+v8z&x$1aCl)7Mi4MJrP+kl5P%$J{BH)FBhoY3% zLmHV;kraZ37U2zEQ^KjbNXx{N-eK3bEKqHPDlD(C(GoPCZqrXdQ8JEYkvnYagO9|*~v2%lz3Rl!J&P;nDr8f8pO~h!m z84cLq}lmlnJTY^W!_vQG&~xVARUW4a&FLh4FSc zqxExO2v^@A;^-I#rc6+|Vh*(Bxc1Zp2iy>voph3nXz8bwT@i_#ONhe#GAMosQS{SZ zy&_&YrM-KFgMQQ@9KRfodroWPrWiTnA8<%N(ZCP~W1m>3BW(YCj69poH zZZIHjn2^J{14T65XfVl2yYOq4<%VpnsXSG?Ff~GJp4yIXGGL|kIzKs)VzjRL9q8sZ zV0XI3U;#pZ9&{_1tq3*r;~w+z#}~I6wAJM*t;8^!%KK@@%j4)a1C+PCAIGo6dxurw zO0lf0HWY+flC7{h(onJX|^2a&Qrxw}`T%|88*q9)8;*>MI^H@G_P9@qtB%-5=&37ttb|imI=q zI$TKXy%IU;$2es%qNc}r)M6?@_J8GKq}4YVI8SCp&ln+zy^9gvKgr@Mq|!EW)l~?@ zp5lkELS}3eCoZA6NbO&<1kvTwylDxd@@M!kKE$&I-rgSx$jMhzLgRCW_MzY>93N7mkjbrk+ftl8{+(x2pZ}GZr|($^XC4;kl306 za#sgHT{&ysD~7nxXTYzA`&$hW9xvV?ylODid+XBYZbOfOY9!LO>xJ6I|1`jLS6A08 N47|3*a1C`({s*2x@3Q~^ diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index bc0a1baf632b528ad0cc0fec28a77bdedef0940a..9280e55a064a38c56b7f321bf7e187af28e3777d 100755 GIT binary patch delta 42006 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 C0uRps delta 47753 zcmeFacYKsp_CNmI`%LO2WCCflFcU&2$xM2v86*NyZL4d8kc1Kt0*Sp$C<3bpfs0&J zkRl2SQUnDRBz9dwZdAoE`$Qs2OUL}(F0`YTdx_Cd;DeBEA5ojGLI+zV&d`Fi! z7TtB*X7fiL)9Lc6>uaV?ue(yX^V*A>qB@90(HWw1^wZng#Z+>ZF6#TFw@escRhLyc zae7rn-PGw5t7;8XWXEO_pxDZ)+KTBDYfvwI@o8cbOWU@|IW#k{pZ|#`MMrbSn3Lmw z@py32Khz{7IFcEQbvR7?M}O&GtOM1t(b3V7PK3f^Ck*;0b#f?YAE?*JbDm}Y+cWyi?+_?p8o1C$Wcjd-*QJb+7Y^n-ofD_j)|F4GGxqR&yE2J2 z%EUc9n;Xx_(mlKvH=Y$^3jF4Cyua|3kHD{nBq7Bl)4ncwhEfS4kVk9L{g>V7itCmtuVT12tGiiG|?_MPze@4=4XZKO9qfBTA&VP7&}SF9M1ty@o{OA?lDXL=f)G1ZQ-^7g4 zV)l2r`j6c2Fn;3wgx{Ydvi&ah548A1jX#S0Os&1?(flXaNFC~3vFy0;4e-gVERx$V zcrIbT${BlkYr-{EZ-a4Q!9-brbrx^Zr))Y0`nXy ziJQ(%VGCvXK0d@@G?;lJv46Vw1$B#PR%rHO;T`N2qy0|NKQ(~~yCef|@)izb36Syo zyT~cI9BcC~lxTdL!O3hXdiFA<=_5&W5c3DOV#~y;!A0iXW^dr%O*9UP5{<3n%zMoK z!Sb)IUF=>pg?FG+^(bu<&6Z-pC?z1K=8k20UG)whVE6z)k z-u*nrVXQKH*;Vb#)gXW5m~LXldF|L5`SgC?jT`ritfBelTC;=P`W8_(PCJF`HcJbZtBJ(k`NPIM+r~L2$HWTA??K1CXa=Y|mxa!X56>s@m5yL>ndHt7{w#(1L4r_J7yy~_*4 zeV!<`N7np>mvW;~Zv6{s`ZMOm(*GX!i*GZM*|W0$dwiI~c+Tu1Sl2Z9;CrNk&zt$8 z{Nf&RO9_vV?oWuE7t8`#{yz6f_xs!dgDp!xzz(swgh$E|C4|RIa`gMWm&173EVRdh z%2#y1-`?l(4&#re7n5`sqc4mSAN?*%PX2&u_ktwU%7zHi$k#BO`ovxoZ@#Wugu8Qs z`36=+`Ni2{bmt^0f73=4*?FW6r(PU zVFzW0k9j^f4vB_KyPF?DtmRjx$$cM#$tynQX%6G#P!-n7CnSX{JII7jc(TJdtlBz= zJ->I#;Z9nvpMsreM@>uinQZukmpF{i!7^Rvlt-Mz&@aMj+I+}caN|o^dYEIk{0b|V z;IBN)-Q4(EHXi2vx$(`?Px(0x<6ELcH^$5U@igwQa>l2;)M0!_B&m7h#H#EV^N5B6 zBNHQ!4B#$t>lM-LsOo4qm_7VG-eZW3s@3MNwaq}1RS96{D2gh8; z?T$Mfv5O8z{E2hJIfSu5$9nwF@Vh2uI5O3v+u@I{b~873o37Vppv~>*%HuqyTRlV< zasy9hA$Opot6Gn74m3ng;2cpuwjbLk_KeMJJ9j2VW*BAh=$+s+3}+_h@<;m}E^1G{ za2Cz#Y)_TU&s_Uxq6}c)%fJBFY}FbXqFR~TpjpwKaA2<6R3|TiaQUMFcW{NrHRptp z;=YPZp!A&j`$a{2g&FcBhU-0=$YaDYC&)Maj_N`lhY8oH zo(}YktM-F1>M0gi7PG_R)k=TTw~Gmo)vO3}9Te`WKXiVO#uaiGKpYMBaaH>jd9H&r zSsVXa@kUi@=Z$C6b-#!kmloJ@HeI*P#?&6e-```#bp$p37KJJ0Cckt_`B!_|(7$XVdkCIU1$z zKq)Z$WFx*d&n>e08&K>e8pzhMn7!Qi%G zgByZ_+nq+U=835jQUmt}`<|xjlk*goacMLO*BGujn}J{If&NawPz{dLgV)-FFFT#? zFZhFIP8LR|($tosZLvq6ZtzoL^u*M__Ot2wbJ#q|G>?Vlvu87S-R&C5Tp*c5gX1-c zuhZZ&%Ku$!bRkB!qR}yW^m}JB^};(s{Ao#pt)+B0IQVq(-z6HVQ#*eX?0Xvd9}}-t zrv`pFo30PcS2)GBAbeVCV&=?5-ISe*fr(0%^iP2NqxA{?R@KL}!t;q)OIwY1(nZ(``d}5liW zmxNhQfBiE0e4hEAzndPOHC=ZqtQbi<-alsr)pqs2tv*+B|BoxFVlziKaqsnceE#fh z`>tQg;$7r_YWMW;3~}e;c1d>=oH7r}cZMHc7rh(|O^rj5_ed4D2z^WMx9xkg^y++&|IAu$k`1$4} z#DEF6bV>S}WaD(UG|Uh22h06#FUS_u)JGd^A4iY2#XH9zRBTZSMP z(&5(b>}zq}tsU66qWacOnF@^484D_1chu8dsiCO|{AAbHV*Rb1(fy5Ez3kh?f#gf= zsRPv>xX@5fIJm&kSqje?tR$`S2dXp3t0t_;WADnNUEeE=Rl#Ak!}+FG*CJxLQ%nn# zu`k7rKn4D`t-lq2@2SrSgvsZhiW^w~k9oM8xlQ^vq^(OyEJM{ya`Uzsrr#I@$ryv% zI!7}e@Eabu0v?ml@kb27oQw*pcvE!?&Y9sv%MBpN&(Jjz>y|k&3dI1*5gwQT%t+ya zidBHL3Ti;2a}sj|FnA}cMohzU*yGIOz|aW%i{zzdDJ0LP#WQ!L+c6X$raRKl>quG| z5$?#|Y&&yDxK#v#4kJCNqn<;mJ(0vzw-K$}*gnG!G(fvIaq)HV8=n-ar@(w1LScGF`}#qZi^j6MsMp z0ltixU<487K&0b#5Gx2zkO%o^ATV)v4PU$9tyjZXm}}v#H%x+AP;;*6YETO zl;(@YI$$~}oNp#^f_Q47191V#Xs90k4Q)&EMt8SS?car|n36WeoC`54K7eE;;7B(y z2%R0YWJq`(u9i$UB@4d;D7t3Ngs?JTRShVk;Wsox{1>R9hBF0KS;os78zE5;X}A_s ze`gTF7pH_^0m#5y{x}sdzgRzn&z&g}XH3!`o3687q{$GA;s1Q^-FZVG9FIf6;6#NV zoJgZs9D=|TxX6KfA#dltMA570fy+f5fU|?li$AH_C5U*X#ARBtac!Isk{=pcsF{RE z2pkTE%@TLDB0#K|(T>d*<+Ibpff*~1?jAL_NF1EihAmKaX|uCM(k#(T{b05TJ@#2G z^|$qOE~Rxyo3?AA*m2v1IBRgu@uWO53$-Aadm@N1m;@|{e{35t2WN>i+s#e~SO7A> z&PMU=?6%#Neb#=ZVglB)-%$r9ke>poBLD>ig8A9-MrO<(;n)_*Vi(_)1mgh63+fvo zV(wZ^qi9Dn{asah2z5F=WOn5}v2O9vRVf;o)2@6ADVtWF^-4t}+Ik|fmW@H4C~DtG zm7ZvlHmyVY>y89`_29rfQGs}HD5@+zf_$cK-j+UXu? zo;X4lqFb{*r364w-eLyvUseZEW_~UkVy;>%0wxwKQQ*hy3s|Od+cqrv&KRJ zHLn4IkY1#eg}FW<{76~CK$2lP38G0V40J%JRwn3IH#543zz4$MyP@rb6Fx@9li%R1 zR(KMBn}Z77CL)~>LO5WT0vv=3y*ddasF$MAzq~DZf=vl!PS_E!*(*BS*_$37;?UUi7Jh#n@)C(Fo>L!5)*?;qdpw7ED$a#;TC#)7mZMUEPiWU|9W; zh$3E$J~@Rv6CZt`ln_~@s9kt1TPeO;n8Bh%d_(G>C~Sv*xFKMg&1mQtEftbv6g(_U zg%2={mO*q+NOVtNSUlDXrEI|$I5n=<#H5BcS1PyI6X!NPQPi3VzPVP=Qs<@mKU!Ov z8L@y(x=y9888MznD15X#hGe1A#j#jy>{@p;_IOw)XgL(dwM-mpNDf4~lpE;(jZMoi z{fyKg(i5ZA^*0n9G!*O1>5g$nPqN%7N0!kQvqAq=Lf9SM%V1;%4F3$Aw@`u>lsbu} z2x^or-$zIjRN$${M35um784g;#^=ozFD#lxALlI|#HNXT^Hapni@U?rcM{%Am1j0+ z=Yi5F<`IXWiLS$>$11Q87m0J&ono2TowC-R30nx{2X%n;T_7ecxd}%8^Cfc;3QWCg z40}NAyDN>|Bfh+=D{5LUJ>UBv4aD*@NeB+t15~8dn*`&74;N(SaNR@u21t)W;2@S3 zv4!H*r3848yn_8>+gkY>$5ylUo{4O+XmM|ViERt+UG88@M2}UMv%AFHRUOd0Zq=y3 zt8r#RfZfV%ZERqZGK@^MOS?9ynU$swa~lI3MSLK!t&orM!!plPmYI?GmC1$A57EOh z>&l0DO!8`Q--MPo`Dz$+g$8jEjh(N?!k-k^u68Bdrb_Up{6~yx*HUrU>b~T_>|ebw zWuaoC@|ekJ8UB6fA;k@Ay5Q(|^_rn+Ua$hk=1ELP=b%pJ#|MYukyIYtM7Ipp+>1 zTrJ%3E*&66xD(bPAX~lGJ@Uj#Lc;CT<{#F%kk4ms!;SRSJo-f1W;T5$6!Dw!0kyjx z^gM46RX>5Mg~Ihf8k3^i1L>DY&H1j}3z>tce5K^rP;GTUT~CjTn!1LmLli*4_(xkh zgVsz>B6V_uuxQsk;=TvEF_(DxfpqB0=MP+q=c^t}4=C=z*MX_oN20)EVjoD_E>Q`crObbVHwt>ST{RkPRkC%t=N{iRqO=?`6m z@wE@#g%~;J;ZEIj$PU(EQ&WtWBhLl^m*zD9?WVym7Td^Sn6EtpU&o+q< zH>9+AnWP3kKYChQxQA?7+ZLw55XHIf7A-cOo1(Cwsd*{p0k3E^zAUOYwh`}aO!FKd zzB?~KY^@jn$vt;(Y!kSb@JA5MJ!DBC0&I5Ri%XAINe3PJ_eJ=j0b!!1r*}k@YdHZb zxBWWK{kLs_pt6_~bTz?|G3i)BxiW_X`c}P90zs>agCIs>e^{DS|MNcgv=wzs-zP1A$*xHI=?MKBg^X$1xIZ%t`ckJwiY)zdhqF)q&EMy(%j z>C|f#5d+!6Jp`6VH3d|HCo;`K0(#jLRV6POyZ}?D63N3zO@}@S+}*P*J7F5 z#P$zck4>>>Muck(F*yV5N6bi0py_W1n*+VPUzm^PvHL~QqlL&mPIZ0Uf7x% zwc>wLGaV6ww-I4g+d8mS;-tv>qp8aw1oi0@zG! z!r5F4x74P%1?4K9-QI<5TD-?2oR77JYtrel-fW#He{4-)-owyC@F}v$thXM)6-|dC zNi)_l3cJ46we`9i8Mp>|q-czk12%(9KxnY7$#CD$0C#t%H9=I7xy1r91)VH_)MHhs z$1B7a9J zyH5<;(FN?N+c6Rm@Q9r$;x9Y8SYfhqnBiF{&zHjF)SZQ@)8v4Xy;|Q<1Nixb6S2?c zWXx$fsfI?5Y<%(@oIf0SGBxTpGES~HMT@6WEwM$yb8$zK*zkwM*88dR z(fQ7&LY+4})oo}^R9Mlcnc-;8Mnr}->?5MXE?Vq;cI5!U$-DCCy5p`S zr0^fx)r~zQ4({rOzioC8hSyQCyF2c+F4)~ZV7mb)nWSc?3pYu`RK+S{tlns7gTmH- zt~Q+36S5nYf7`@dY2mmm5h_4^EaTA=v5(`_V{EBUSH6U};b{`W?xzQkUFm^XxaXes zAoRRFod?%j>(NnU+IrN4r?lByMpNw^2V{ny{w+iy3$rwn{A#hnYB7pk^_112en9Mv_!Ngp<A=#o%fZ)duhNpn|XCN>@6oGUg_e4=(i)t9bVU%-ZI9567Iq7x(KXhMY>Xqrq;zVWJ9d)aajhppu^@tIkHxaF4*Oy?@hU%t z+JI#Rz+ROfRlpRg@f7^isjUN%IC;b>Mca)>BXm`%A7zmdqPi#!r_729M@ZHXR->V$ zo#;*^gM~CH1OaJKDmFnGpF^6x0g6`hK`5-USJCVG1GNNU5!YSoJS{cl{(7ZF5VT4# zuUE4n0jWZvja2fqg504~L=9KRQc2)Ax(D>pA7mW`<|QEsgrSbhorv$RT+vm8x=M1dpggo=%4p$Sy}9 zSqFfvfB|$A{#3x-ia6g2`>Gy|+%nCs&Z69j*1*st1cDM^bSQ_U4CQ7hPLI-Yy5a{? zJgC947={mA-mzB)SCqSE5_>Zu6l=g0=Sa$qg8{5soo>-1<*u9brb(L6_Np z6JLMa$oNP%wL>YRCk5P*gHVp51b9XgYJoWM9|9o;w8TLGrl4Vyb=s~C8tAAr2`%WW zq-M83;MNHt94JDxr8@?|NCog;H_TsT*5DDgY8f<^NQ8%12r5wt)ZLD@g9h==vxf3H$OR9Ihe9i%Cld21uLo|r zk-80MzOq+fev-xfWY=t(7b}F819+ZdsRw0*t!Z%Lqu{2ZiFh7u@f^t{&2zADBxa{} zFxfH5jjfNs5z7NqYw#Nr$L;ZK7?KLqw}wmsPPi~7k&ep(Bss+}1awrPM5#p8iYhpvNgw)71uz+2n!&b(f$OEKRDJTb`5+xrj+!Z6dd;%a4o?^N;(4GCn;zh z9fzsKfWE}e4D2U_hPC0sMW6%*UBXeL6cGGz=`&g2kp|xCoGPwTw9AMJWqgyc>!5>+ zWUBR#x?0wqoD8z;U_M!PYyhzAWIhJk*eJH?{gbwEUP@bS+&bl)p_P~V zjevc-0LQW5oXW-8o)_JXg69Pqhv^M=x#Ak^0I<_cqpcT6(8horm(ILl#5~a^U}JXL zM=?Jc4m^1x!6P~p@-wx$s>%QujPMP3Rc9#g31Wa-hZX61la?CR6Zu?Lf*;-qaZ>vZ zD z0aILC!3Z4UYhpkSkRrd!+JZrx1F#sWcQt{BenLx>>!rO<9M<6kj}YFd{9TI=HaW^| z2tc~z0AK|w7?#|W2dwc4ijD%;19rTH#4A05{#C&gziLE^KSDcc0ExLtS&_#tQf>fL zhfaZPz9Dtihinql+eyT(33q@xAN)WkdM|Zf;uK5-QGk-i<^)4S6(FNyTkV zisGNo$LM~d-3#_p-{8|#>gm-NIw80``ht(`+}82M*CLP*JNjyB!Xe@y>7!Z|heYb$ z2U>kWbzCnTU4KNpvA08CJBmkeHMoc$QzN_3NQ%c)sWX+_y^Q7|B#YA5V#A@7+ECQE zAe2r7rNgPAEPpMge;6*sHWW232qlxCqz9pZ9y&Ni9mSGj#=hi$7l**=JT45F*9N9o zVgrMraO0{D2BYSkK* z?Ls4I0bmjn(K}5U8foC$D&Ye?RB9U>*bJ%IzE2{x>)Db@;F~4YP4l)1&Z{h~?s@{L zSq9yjP~6j`cA!#PaAY$WV^co~WB1u&OyHZvIGyHA4bFRNj7J#w0!=u^?WvR!HquWS zDAbWUk$5;+du)SxkX{}3x;h4ZOAltjuzu1knKn@@rAlgA!hLo~v2=sNz}857#|9H6 zhvB1@4g|U805)q>6E2Xx4v3!D$2h81 zN%$&iZ#1D+b4bAi3y;CVB#SrRjPZpnMwi8)PJz*U&1{ZD}-ZCu>@KaR;SLyOctuj&>=KOvMblm_#Ly zU1~+8)^@2Sm6GgIB9&U%B^Q-i+NA_4x$II4Dka#Zcq+x)rMLhUPpGD(0RPte4I&EX4mzEIP&L=1bxn|B2VU;GgEl>=iq?&{QXy?K1sVCoga2pcUZ`r z<5IvP@%;Wl-G0>3GcsdesVDevxZMmtmpsP9mSCX^heZBcJ1@SIJRaK6fhg2U;o&x0 zm?meY6PvuoUk%e4M|9F9n;KQ3L(5=l@sRMpO^4W?_mgAb519x{Tu+Hx-cIN9W{MSW zU+inJCxs6kL3cZJ28<5>;Nju}WYLEgo*_9H--?d!Ov^i>$pN81&=UxP3#1SZqYbk) z29JFXiI?7?FJFB1P8RL>KP0zQ;C2!BJlc2pR`fsMu{cd084}?@a_Rx%^vVNQr|wpq zj>t07Db{w=ttechTO>NZ>+PZuGHrx3stU;{zlnS;E zgHjT(RhMkGsuJb%f+=XNBkwTWWlEwG=kgC*YxcINc0Da-{v|t8pR_>#29bxZCbwqL zk|Y6(r`~Iwa~2cRVQMCb2cr*(cJI+i2PTXsc`B)4(mi7Id)e7~QY9uu`kG-U*9sQ#Y)|fqTDP#eSdbIUJ6l&9@J8R zn!x2fNn_OJYR@H>f6yNq^Zo~|@%L{Zc$MCyuxCWS59vsv{KNL_S&?}7{D1<3FM(O| zRD4zz19#cIs1r zuQ}uf;6;bp;*{o%&$U!h<9V={Y1 zjQE5WA|@73f1G~N+yB9YZ^FRahc}_?{K~AfXRrQWQt_T=B_iikeLR`}X<5o%#W^TA zcpXEjWp(&07Jk|_v;TXXh@mXkYq9Cvy}MP6%xp-BHwaUEc(o2t&%tXC#xi< z36oB_N|XlPOlX#W*h)P0dE4{$Xqwl$hC<&%p%Yfk@l!1BY+El{d=-zI z!R@|Ew?QBHuY!Iz9Q0rQtDxT#*M1ER-nQ&(w}~&cKJnLXEk7VmVvTWs7nKNeeJGCo z)zj`ERUPU^_a_Ov}(F z93oIEQVEI`?>TE?d_UI4H~-%;zGBBQ+PYv(9ck6BPsI1fa?i1MA9CDC#G!}-XO)C)qI&y7a*_GJKvG;M2G*&w1YAy^fG_rSgY!o|gK|Be zJ>D%}jYcxFtJQ$bS3^-dF1o1_I&=wz@uI^o8v-iV64%R$0d%Q^N^m}OshCP|YILcH zN^oj)sgO!=YILc9N^oj)DW6JkYIG@&N(jVsDVItJ(tZjk{`;ti2u?S8sf6fGmvX3t z&`+1Lsf4glm$ImYkWrU%$d?8&!8uj4WU6co61qW5 z@U0e~0xv5|b^^kKn~aBB_-QnNrjbmsmY95Fe=c5@E|8y?qE$)he$Z8WeRUF zj0gp!N$OCePCE%QFO)i55L&#t&EAZx)Np9gD+N^hD^ZO+qo1r=&`i=67dp*So0zki zDCw({HrTJ#1{-uDzM-OaBDz_Am|PjbqT|0+4Ph=LUPIc%xA;!`7X4iRNt`uLEc!Ub z@-pB89gz)@tX-b^e#O5QD$0YAtYeJz-4oYQ>5O81I(<(xU`?qvPjDSLdhiksy2L}b z6lhKTuw!x*do7}i_7ad*n~-6U%VrBku{PxA$T9IObn+FJU6%V=uw^8u*un1IEh_cO-aP|bc(Zq6G$Ym&60THnb&DZw2r(o zEfSSy(d5i49MdmO!1UB-T_<3w{Dm}Pdw|wjiZp0OyW>p zP^7ICVH|~BJtqH{*p%tvhh0JB_4Ys$6GqB3YxU3#r$6jE4b#=Rn9*y9MaqeXU8m8j zQyg~T{jn^iuUg-vkf%7@QfFI1;xtEsXIt8aw8&+l(=9Bw)0}Q;ENN3XA}?qawnt%D z^r=<2$sVOwq&nWhmplId<1Hgjc@6*8@m7DRCc?k40P?~KNv$F}F z&E|q&&MG!33{2>h=E&)8RxGBb<#WPITA z<^;IHr;4QmM1fi*_9he-Oarqs1k<2_g6ZZ+Xc|n1$I{{W1#AS}&BTqT2(mFL1=-C_ zdg>rMd{TQ(T;`E`+${1e;%-Ql;_l|8+BEJ4aujzrhukUS?qMW^lSK9}gyERfv^Ra( z;9>2d5rp_a8o;I4-D&0w+NT>NiD-?;4wn&6-6Ku|^B zVCxCdcPRJ{Xou$v(f0{ZRrK8))H6iiCxD^gJ3vA|3A_JV^c|eBY4oj1(4B}Pxy-}j zmps&ER2`3So_j2Jg`zV3^ghULnVWeud`r) z8hsz#qUISda-}d9CxycZLp3-%R97gGu@Cy!+ZCa97`l^6+K%W3I}B}#J;fOcuHc>ByufB*0o!J$Vyl${#Q;m^*5i^KU8QG?0_#bu=Q;)P` zQ+woTl+BJ!^+5X~rZo^NBQpFVrs@O~B2}#V5TUOVU6!_{Hw{)bkL+L-Jo?$k+UJI? zZ`fkRqu@2n(7d5Q74~UJZkS`LBh@he+e<}px=Ey}7j0Oi`gn-ry3M|bsU{9y#MCAG zBBm|{FJkJVeGyZa?2DMXWM9P8CHo?#F4-3`b;-VnsY~`nOkGmv95{{BrQk(OU9>M^ z>XN!Pg)=@~Qadcp|8&W|h^b3%o@DH3cl2 zJs{sKU>@vcKNPT>5w@ZrfHaDDBZ&?>AyS;yYZr z7PIr&Mp;_ICb942#uAo}k5@}r{~q5_MDE7@Pkgb=r3!cvIMyM3+XVlo%Qyafe96pp z$4pt!i(SI!&y)*#!I+@@VlUPiaK7!uyzFb4-kYW7sMlrEd%x)1f&8(T^$MWxj_p+( z8mKXgd?P{4!1!EYGf&i~2HLWsw{Eg3kNpt9@C1={{@nXnOgsJCwENDi5`vTJ>28tgF=* z-|Y&z==){=ek>*ZfTo6=Vl|}6z1e+oVPCji*1T)~AI^KAKm1SS=82paQ{<+8pnH~l ztskq#uc)mkWv$zUA+D%{khSx$Pwp#a?aqIP*ypi)57mR@2WRvB5XA~c@D{P%iJTzS zLc9oGuGlA=!)f-vf>YqXjuVmM?1w`nS~9e~LeELb{kK@Js3wy2i>9y^6Ai3MbzjPL z8*v8-ubWW;`L6J@5;jM^gRi*-{!UHwZdw<<9!BTmc#}22AWl7r<;ubZ)eA$CC;(Ks z0U*%~s|gaZ_as(h6ExIKM7N9^#G>JvzcPR{Z|OkRpUst}1KBx&pA=#^E{daX-QkOt z^p!SdzX6F>xS!+R4`zTeYn^B^AAP;wicj_GuSjzi5w1NEV2C;lLUv3P_3VNgg{7d*1?i z?oee7w+>~kF9{>Y7JWF;SS@;K((8Hug{3Jy!>~u34LS?|pP`eX(QzA=tt-QhPS-S+Rlsei&=l(#jH$iGW9iqwYm=?l9IdRj2In-BC)}Kg)Z`s@Z6G}S?Y_)5N96y}x4X6P` zfo-rpR-kQzrAlbl$B=F~ieG9h+;rAqJ;JyA+$9UQaz#Pnw0 zTaU2;ynV@fcJ^j}wI1Vovu~`&_}=U*>k(gMuES0UzixVOX3q_V*1FysId)jSO8%&`koE9PB{3M?l#qc!*`OzrW+Pf?WnKcg?)!~q3&2*d( z{UrOJuj~+EciG)R82<(Ahy>+Bzr=!XLd18Nxa%JI4-ZOR>yANJ{K!_d>w$j{y?e(ig;h4-L3!uz zS=+w0<^?rHq z>7BQS<(A9AI(s3VhIMhLHkK!{Zo|LFx_MXF8dsz>ZevK}Li(!oFQk1a`bH_4J)I~!gIfa7E3IU0 zVZJRdVVB-eZTLYi;o;CMCrxO33DzK*+v$CLD>GOmqkL3=}5L~lH3R>8xZ3cy%C-ri-o>ltOm`q`>*N~NUl@hPQL zJ)3OXfY@_FQ+Mat{{m*u{ZBA^UK`kdm1mHo+PQ-U_5~6h4D9C<@eW26+SB*aQt{hS z>dy9yvS&3LiZg^AH&i2skModKli2gftyfKEccXgg)$H;(^-D8_yeGyim*cNSzkB3@ ztJ#}P8zxO*Ip-at=_mo*wc7PpdZzP)b{Xm;)1_Jwfzla6MsyivAn@|8p7`ZMJuD&k zj&jKA@Dz3r`&I^~vW(WjUwXhVSJ);1>BsdO<&#s{T()J$fEpIT+$S$y9`@A(z#Kn~ z`Sp)a&}%{|O2K5bE#-I~qkVSqlnCZHLk7 zJtSlf@S^l)*P|Or9=joAN6jXpXsq9{|2o#4H14@Ve81x!h1$xP!-e>9ToUYN>z@0kzX0$N_^v;$$*^YnS%D!iO z)@=D*Jxjsoj;I-Iu&OwJCd=h>X3Ia$WF6$%nJm*PT%IzAD8^|+BvDE)1dN*GnlW4U zo`ua&==*qXK4Vh&0-m--*I#nyMTFCs_&XY&~YC8h7=tOIN{fTf4EYCU)Gs7 zTUOr2hVf5k$VYEu_3UMtH-`~l|owChb)&+F~=CYEQE%y1RoIRHnox6gH+6K2E zIpL+n{)B1%uxfhw2<-HU)p4piPFG7dkENuA4T@E*NmgslJmzb;b`56gZ4hI5HNBGh z!5!1*vFll(r6hQ9q5kbg{Q^XUo`8WLq9IXxu>NtU!XRU%f0VUBx^HJify1O=8EE3A z^mfU$Tc~JKzHC6Ch;N~ydPy#LU*Cx1;q|(P2&(qiO!FUj_^pQ{YBP{;QA3f!gIl#z zccRC6^yu{0*FO(Hja0x-+WCQxt_tY7N&a_HkFoTVe7Xw1U1UK~qi{@QIX0N;h~?4X z$Ckgb9>XS>gxhd5)Wm%w|GY==L_ZL8oI2v=r%E$XKBme6{Yqztzh3uKuljWO8|+cD z)r0lkXL{u=RNTMJZk?}NEtuBWCA!t>>&Clc{q=O>n?X^9=M9h+6z`l#MQdva{EH|Dn9BP*jV86NdpY#`?AF%R+Fe;0_!NHC4|AkMQprB zRRb>AqYwa9c=xpfzmU#LY5D^)busG{r=NOr0o`a-Lp&RNy+#Uq+* zBM`RK0b7YLWCzf18DV1*YNuZDzb9q1UgG}WUGegcrEEz0sTV2~@38!SDVEs**-Ns_ z6T4#7*lQZJ9F{jr);d#j3qM^*EVjAi#@lD%%0VFb*)j0-3CT*pBza7-yV5K@SDH_> z;!V&bwgYnYGS<4YS|Kn*fQHNY)`F$JY86?1_sc`e*!ew=X;vBMwt=|mmr3xWxDjeB z4cJSq{#)HK*G?thU*7vaV7HYwxDT12z$+COcnnVpu|1h>1E`PcQ`H#Ia z`Ce9=aC{RELk?sa3!AR!D=-&a5v1y_43sv!Zk3%dt2 z(CSCR!3-7ysDXyWfKWBXetGYMYyjx{@IltTMN|4@%sN(zo$I`HY{n^Q`)M7!F~ORN zF2fK;a>jaAU~3z1s%`XIqbAyhY?jit!|U1fL`&O(lHVuCKcp7XyocDXzTc?Tig!jc z{JcHG%lTD>)A?mIbJB0V8_-AQY9Pa}xWN3SYM1qUadlSCc$i&CJIUJ*v#ZjVP$#$U zraS>903{CEY%kcrx+PjNfr|4<8Ca$V&|SIJMc?y-{)b*NuwH^^b&UkY#-~KEhr|2*(*@%KA;r>kI}i z(AuXqL2D1msLe`Wdu(QHPn73Hn^`x=^VZEY)6y+r6IrU-a|>Gb%S~I@z;F$PR8P`S zydoU*Y7GV7Ee%!lSuBDUlIPs4hVm0M6#XnNhH0ptV!ym`tJ2WjTTj-|FSaV)fuc6@ zoJZOC=E-{J(WY9e1T|(`NK4I=wUjBFsBd@DS1Od2KDUicw+%hClyHT~+fF*VqiQ=d z87$hw$H4yvdFNy7O+?9~A7@wLv&5w-K3^>$;0^Jjh4!7@(0x0x?Ob%PM6$K zw1aJm@w|ewQ@GEKhI3Z83#w|TUNgO-YC`#x%E?vPIoUaev3v)AhSelR&3*`7@|pDP z#pNgmeYD&0hqu@}Q(S94=8h@lS68v`KjJGK#%k%S;aNLY4CK=}dz1y%-iy)bySlrzrBHvkO%9yOMX6>x8u>F>d`v}oyRMf z{N`dlm&c8fzTvz`zWO+imER2I9eDf%T{CbP_wg3Lqe5%hFpT%*397Fuq%9rJb7aGC z-b+p#&bzQgxo9{a!&_GBvE4`TEY?bvU(MUdxDmXAy!c7pQr?dzo^+Y?Rq#yt#Rx3a zovI*Rw?t%vKH z#iMvWZ!=04J{rY~cw4KGcRmX3wgg$Zkhi~BK64TG$$Ky2nJis4Uc|5B9V)3VS6*;2 z&*knaUD$as&x`gnu+f)|@OkCY$9bv@Tm?iEe#evK#^3SFct%JDvv|k*^dxi6jjPBl_m%bBuCcr2T!=S>e%ub8 z+-1;3nfaB|r`D)H80@R`jmyt3Dy+&MmsgQnkz1B^6PQ#SyDO(DNMTl~YEeYW9`?n_10anFc#V=vGVHJz1B2T_P)9%q`G{2DL)9~A5 z`BjkLFIPZsv&Ueb!eF;#xqS>D%8Hhj^98*4Vy$o6%ejx0NN)wtlC8$_j=Yy@=pie{ z^6sp+Zg>g}tdD+ zLE$xDqlOLEE8)ll3_5Q-&*VcMCW&Rs`^NKI_<7diYN*D97fj%t*if3ViySkNC&*0` zco#mbTu*{7sj}rn-kA@#utZHuSu+t@H$twS$S1LpVPns!#@JDzv3=S38hwQc&~Gi< zPvVLE0$2bdSpge2iD&Z*EgBR~uTBCD7s+Ry0O6yi@V2tsWYBQ&Lz;&40H`Xx5Y&vh zg*#;9t-O`|a59YA@2WJ^4p(zOyM*jYHNO;gie^GxqU2L}9{>I1V2w*on!=0uWs|~c z-kpLw{+G+dsl0|=ArIB?TjXz3LG6{&Tf;ZAtElP`HkwMe$SbE|d3TtO^*F}DzhXKs z;pJCpfGD(-`=>)hW5a9mYe8Ox77^qcCuh~dBvpoNuVs>l-pJ!xdUMOi7LUy>^7^p& zDhtc1EH1!uw+pVlPGrNg*|;#6`PTsE_>)*xQ%@HB8lW`6LaEoayce4oWOlquUM3gU<3kkqW*FlJrD>Rkp(w|=qqeFZ~p_RP$dRU$*7JLQa!|Orv zRBf;o$-e=D>~{lnuSQR;YHz;*0-6?L#EpDz+m}%=@ zHotL0P&aSoH(~Fo;OTN#0J?Cq+M2UuW<5;WEplT$zai?@8_5I~$@6D&w;Vo$U(5s6 z7KAO1eoiS=YAHL;1e0dSAv5_bHdDSflg~D1vCxLwTF#lpGtJqo>9*^XU!t1bCQI+e z`oYGWCadni^1Ey{BsYiYRf+02IqEjp)K#;w70;D^sXJS>{5Ia%oX4V1O*_WRE_0v=cfgss3@bS_+x$7ayE#7$V{5*z=kRPK`)W@FGh!|l^a9y1 zmtSr!#L8)cPP}x_nfG!07z$K0}z|~AWV&Luk5_1UzrAF+zonK+z#ir>}|2tshm&%4a_zWhAv6<2( zcndjjKJS4fR?U2V6}wx$F`tjYVTt!nUT)qCvjIR}`TU*O5ni9q^JS+6Jj+}G0ir%f z&R)Q~nD?>uL6qjoqj#d$9Sb3kRRknYezOo`x0`YbM7!R{@ z4e^NJK68T&W7ASh`THd>j~hukZI?=H7rU15Zn($;KIF?bck!O)CL8(o2Ttje(seJNCEvXV?0AZvpD=g9 z%%g)>9={h>bvH3vjql5z4n8Ny#^q?-BfneDE6qmOUIp^D6e#SrDw+ zF20YKu;=8$`*?-? z$M{6^Q@Emswqaq2b-X?MOm1C==)t`n)F-UR^j}ENdhAeN%B$$(D|zpFz8K%$%YKND zW8cWT9)f}TR%SiSuV#Oh_dd-3iZA%xz5#3Di2QT|zk(f=12*#N^zYduh%ld|mRD0Z zy(o`-@X-^ejINnnUQs3YT@H0YFp{1IkwHkH&|5OD*yk%Q8JnLEm;ML&$VPZP$7K2= zh!B31@)3S>%fI0$Bphl<`Dr9ncxr{uS21<+WW+8Lr%tIY7+W{Jsw#iV)XFNKx3*^T z#JZZP6Q@uVlUG=gmtR=#_HI5Uu3-w43EplTdxy_zpOyCM*pFgsh# zn4L{iW@lerK7CTvbkK3#l&Z?ib25kG-|z6x9(l%rL#EVKO`lRenYaL#56f-zl&b3> zNnK5ZcuNBL-jd3yqC8(oVY#=U>{oWqSrAe?d16Hs0M%BhsLq?8U+MFD^DD|LbIYrW z3d?>wdnkbrn3D2>!XmG?s+=p)$&YZZo{~2wNg$9NCh}8A zVE8q4{|^6$Rh5rZHtlpW3!EVBvdZzw82Y@Ly`#rXB$X>K7+2*juNqg8Us*gZH?OK} z2EXTQc$0r7-UOiIw#J>roc|qfg1Q-?6@NMgogIG)O2(Cs%d5=8&QyUNV{F+>KI$w~ zXINGD@^M5qDUV)YWHPW!z;m#k`*5FaSxw($0Ro@(k3k2$cFcWdP> z8t2VN5+uK}ATO_?U|iYlT>7^1J}t|u@=7X8a;vHeO7e=wR_2%8p$5n$Ti~wG*PY}i zDB#WqAa$1=wsIHp7BqS|TS#@ikfWqYA| zkDh)_ZQW>Pl7tLAituTP?%t{*zoaOy&|8&Pl}p*0in6=xhT@`v+=9Hy;(~EweR;Xw zvZcB~mTm*l5}wDjfry1CY=cLIW8H1Q>TdbrHn>0c@BzB5^a&mzv$x|5-uLn{T{UGp zvK`Cis_pz@a|IvLw4Y0Q9>YD6`%bRE8ue_YT<{q0ZLZ?y>0ysP&I<>x<^v&Vy$#mZ zP0#g>CLKX0YjWl_x!z1vDZA>ctt+2iS34SMt_fsOv1b){3v&x9tHu?N^^GlCBfor{ zZ!+)a_>TKdev?ez$y>9vGG`}Wg?AL}+sTKtdXUH0l-JfyytYa+avl6M#R8Do4GukM z>Lu4c!P~NjWaAV3GV@`M6al5|8b%;Q9{(h7Wo|(7RmG@CbEe9jRJ9SKRCr@2J6oHN zK-|8!kq>w6!q&M-7Cr?x60b9O3J&uYaB{|0q)wlE3b~@KVwaEHX3s7ptF{SuZazHb z8N1*-J|^mObIr#Ql)ArQN#c*WvG9(6-NiHD9eZ};;|bB2mn3SUoT6`DGJN7KyLm2q z3YGb67yhQooTqtvb2slKr*%XqRr54=m`}rnp;C*E(~;1gd<|{Dd$8S8oj929jD<0* zE1y!=h(N%qYsH?CiF@ETKPyZ3KxLm3V+u;m=XrnOE6I_EK4uYe_aWvqU*M&xCZ`c9 z|DyCaA}RBdaQE`XAyt_*ZgTnf+Lw6|brEkAMw_pw=e!7VO8-dR#F&y8{OXFo*e8#q z0oA>{uh=uDulX9!56;A1UtHXuy@5^z<~}|^)gNrjTd_A$mFuW0ulti^&+%gRXOUCV z7pEvF_{7SRDE5}zihA>H-b)Rl8Dxj&c@%z&!riNvd4QLo-YXXLiec|AF7}Cou`SHM z@IKU8ba2L-?^*P|@fmZ$6&?KoKObJ`))x@oeuyc2CGA9yKFRPp{V#HF^dWvZbh^;1 zyris($y2Am_Mbx^q{{`WLMd@^Wo2HW&pQtOS8iTG*+;w>G`A5AebU*-VoRS)_K9RK zK?RPy2t7JX&)IUzE4+<3)Hgzoc!?*NpYbg5QDUm9xcMb4?9YQ0EyV7=(dHMto7JHu zJl3tR@Yd8(XY__mUjZY z6mfiXg85h7O$PqNV6;uvf#7g zql?_~1HL!)BT>~_)Qm|s|AuAr(JQ=Dq+-zD#f;J-_@Jx*$o=L&ct7Fy=ZI{70{a;a zK2hV3WdEeb-t=f52kWRqy(@{S}YJ>^C`MFES}WGgajDjWFxYJkXF6 zMO4i&3+Ore>Z-a4|6f(t9u#F2#pk={!U8LcE1;m0fH?@Mv>1ylva#rDs4Utfqs_D} zAM6^8APlH8PBXq=`9!aBeSliiI95|=Ha)DAnqKB)SVAC(3aAL8Qdv!t+VA@owEo(A z&OP^>d(Yl`&bjA&`)!$b4GFU|WdK-9V(zp|T1Qhs@r*o^1bwg9$t}Y2asb<)5vS8e zO4B%q70zI`iKKdt+2K8|Hn3P>ahgSaxPdm)B#@xO07c0MPlL}EvWqXKCrP^nz*frA zfh!iqMO{P~+eV^(dKPUb=OBJK?VxEIAYPpj3BRE>u$io8}I7WaYLrAbUvgs^1C z3Qv|%WR5T?y9Xh;@;o!q9!w)EYn)s>i5aOHfHrt!c7!59XQRE8tm!{SY|S2~>=TEx zQ)xdG$^$g7cI+whV3~>$smTf6c$2< z2E4TV2^ahqaCqGft&KiZE)t$Nk>-?seI2(Bpijl_~ zS!AdemteQAqN1$g2<8k_GV&t%eK2#P5$5NpI62!+Z&937n^?Fo<(TMgO7sKyIp&}W zpXy!y&ST7QBttw+EPB|xWEya_Akl6r@5#+g>`AJl1kvvrA-`?H2|GrK8X)fH41@hP zyOQaB?0|mPcyYxQ9H8+&0qn$TGpyJLk9tC3(eJoY=|h?|p?IUb9ms-V@hz8`lN!k` z``cNnxRht0CY?>X-u{Ks!6sd4#xRR)$Y4XM1!oA-LyF4ECzceK7B9J|PhG5<$ECxL zt=Wo`s?D_~2+qE3U{2fThtnl6Q}ZA_(WJD4p@S}i7gQ(aE(k*AA*O?+;Lm!h79>&! zzCYC+B^x@R)7lOeMV*f^Pf(Ypa(9dj>tvC1P49^jr(ZNmmk|f`I`oHLAk4}QS=9;s zbwf>llu_O_LWej1gBaP)Ovp+&x|p4Mab7jfhq@4d-IDcPNQU%PUqe>)wl;fzPpHfc z#gIF4^)=?8yV@djaYMx6q#)||vw%$rmUpMJp<=~L2IW_oejTN_-@qzvuqT>+how~A zY0^H8g(&xg$NjAGhfY!N9z%c941eHr;szqlzhvtTmV>lHLN~0|-%{;nxv=NQx)J*P zBU?1+zD&5uJjw&P=_XU3e@HoxZUk2SVm!(A|4?!4Qft9jO=P3M5WDi2`)m$d@ppLPIOLq@q>$O~p9z2h*j?2a# z6eiYlsq~^Uuz|~rUiKW@$mRN8R>U@Od8ZfUsMolxxy9zQ&0OBQg%Z{lF4aC%*|&1J zyN_AfHZITNbLDnEq);s=_6!)89Xzm9w=z{c$XnuX?&N$Su8O;OptnS82yPgl-pxb3 z#g*k{l|D~l(bC0>_HgrHiosLr!|38y7FY97{nO|5hq#gls0Anq@8!I*pknl*eURuY bMW$xIzfr#Y057N-0Qs_Aql diff --git a/src/lib.rs b/src/lib.rs index c92ff9d..d430a7e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,9 @@ use anyhow::{Context, Result}; use serde::Deserialize; use std::{env, fs, time::SystemTime}; -use virt_deny::{deny_clocks_virt, deny_exit_virt, deny_random_virt}; +use virt_deny::{ + deny_clocks_virt, deny_exit_virt, deny_http_virt, deny_random_virt, deny_sockets_virt, +}; use virt_env::{create_env_virt, strip_env_virt}; use virt_io::{create_io_virt, VirtStdio}; use walrus_ops::{deny_virt, strip_virt}; @@ -229,7 +231,7 @@ impl WasiVirt { if let Some(sockets) = self.sockets { if !sockets { resolve.merge_worlds(sockets_world, base_world)?; - deny_virt(&mut module, &["wasi:sockets/"])?; + deny_sockets_virt(&mut module)?; } else { resolve.merge_worlds(io_sockets_world, base_world)?; } @@ -239,7 +241,7 @@ impl WasiVirt { if let Some(http) = self.http { if !http { resolve.merge_worlds(http_world, base_world)?; - deny_virt(&mut module, &["wasi:http/"])?; + deny_http_virt(&mut module)?; } else { resolve.merge_worlds(io_http_world, base_world)?; } @@ -252,7 +254,7 @@ impl WasiVirt { if self.stdio.is_some() { resolve.merge_worlds(stdio_world, base_world)?; } else { - strip_virt(&mut module, &["wasi:cli/std", "wasi/cli/terminal"])?; + strip_virt(&mut module, &["wasi:cli/std", "wasi:cli/terminal"])?; } if self.fs.is_some() || self.stdio.is_some() { resolve.merge_worlds(fs_world, base_world)?; diff --git a/src/virt_deny/http.rs b/src/virt_deny/http.rs index dc4e02f..80d866d 100644 --- a/src/virt_deny/http.rs +++ b/src/virt_deny/http.rs @@ -341,27 +341,7 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> } /// Replace exports related to HTTP in WASI to deny access -pub(crate) fn deny_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { - stub_virt(module, subsystems)?; - let mut subsystem_exports = Vec::new(); - for export in module.exports.iter() { - let export_name = if export.name.starts_with("cabi_post_") { - &export.name[10..] - } else { - &export.name - }; - if subsystems - .iter() - .any(|subsystem| export_name.starts_with(subsystem)) - { - subsystem_exports.push(export.name.to_string()); - } - } - for export_name in &subsystem_exports { - let fid = module.exports.get_func(export_name).unwrap(); - module.replace_exported_func(fid, |(body, _)| { - body.unreachable(); - })?; - } - Ok(()) +pub(crate) fn deny_http_virt(module: &mut Module) -> Result<()> { + stub_virt(module, &["wasi:http/"])?; + replace_or_insert_stub_for_exports(module, get_wasi_http_fns()) } diff --git a/src/virt_deny/mod.rs b/src/virt_deny/mod.rs index dceb073..2628d68 100644 --- a/src/virt_deny/mod.rs +++ b/src/virt_deny/mod.rs @@ -8,7 +8,9 @@ mod random; mod sockets; pub(crate) use clocks::deny_clocks_virt; pub(crate) use exit::deny_exit_virt; +pub(crate) use http::deny_http_virt; pub(crate) use random::deny_random_virt; +pub(crate) use sockets::deny_sockets_virt; /// Helper function for replacing or inserting exports with stub functions fn replace_or_insert_stub_for_exports<'a>( diff --git a/tests/cases/encapsulate.toml b/tests/cases/encapsulate.toml index fbfd176..f09d554 100644 --- a/tests/cases/encapsulate.toml +++ b/tests/cases/encapsulate.toml @@ -6,7 +6,7 @@ host-fs-path = "/LICENSE" exit = false fs.host-preopens = false stdio.stdin = "ignore" -stdio.stdout = "ignore" +stdio.stdout = "allow" stdio.stderr = "ignore" clocks = true http = false diff --git a/tests/virt.rs b/tests/virt.rs index ecb23e1..9e3b95d 100644 --- a/tests/virt.rs +++ b/tests/virt.rs @@ -64,7 +64,7 @@ struct TestCase { expect: TestExpectation, } -const DEBUG: bool = true; +const DEBUG: bool = false; #[tokio::test] async fn virt_test() -> Result<()> { @@ -77,7 +77,7 @@ async fn virt_test() -> Result<()> { let test_case_name = test_case_file_name.strip_suffix(".toml").unwrap(); // Filtering... - if test_case_name == "env-allow" || test_case_name == "encapsulate" { + if test_case_name == "encapsulate" { continue; } diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 877655b..2672089 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -33,21 +33,22 @@ use crate::exports::wasi::sockets::ip_name_lookup::{ Guest as IpNameLookup, GuestResolveAddressStream, IpAddress, Network, ResolveAddressStream, }; use crate::exports::wasi::sockets::tcp::{ - Duration, ErrorCode as NetworkErrorCode, GuestTcpSocket, IpSocketAddress, ShutdownType, - TcpSocket, + Duration, ErrorCode as NetworkErrorCode, GuestTcpSocket, IpAddressFamily, IpSocketAddress, + ShutdownType, TcpSocket, }; use crate::exports::wasi::sockets::udp::{ GuestIncomingDatagramStream, GuestOutgoingDatagramStream, GuestUdpSocket, IncomingDatagram, OutgoingDatagram, UdpSocket, }; -use crate::wasi::cli::stderr; use crate::wasi::cli::stdin; use crate::wasi::cli::stdout; +use crate::wasi::cli::terminal_input; +use crate::wasi::cli::terminal_output; +use crate::wasi::cli::{stderr, terminal_stderr, terminal_stdin, terminal_stdout}; use crate::wasi::filesystem::preopens; use crate::wasi::filesystem::types as filesystem_types; use crate::wasi::io::streams; -use crate::wasi::sockets::network::IpAddressFamily; // these are all the subsystems which touch streams + poll use crate::wasi::clocks::monotonic_clock; @@ -412,8 +413,8 @@ pub enum FilesystemDirectoryEntryStream { Host(filesystem_types::DirectoryEntryStream), } -pub struct CliTerminalInput; -pub struct CliTerminalOutput; +pub struct CliTerminalInput(terminal_input::TerminalInput); +pub struct CliTerminalOutput(terminal_output::TerminalOutput); pub struct HttpTypes; @@ -558,21 +559,24 @@ impl Stderr for VirtAdapter { impl TerminalStdin for VirtAdapter { fn get_terminal_stdin() -> Option> { debug!("CALL wasi:cli/terminal-stdin#get-terminal-stdin"); - Some(Resource::new(TerminalInput)) + terminal_stdin::get_terminal_stdin() + .map(|terminal_input| Resource::new(CliTerminalInput(terminal_input))) } } impl TerminalStdout for VirtAdapter { fn get_terminal_stdout() -> Option> { debug!("CALL wasi:cli/terminal-stdout#get-terminal-stdout"); - Some(Resource::new(TerminalOutput)) + terminal_stdout::get_terminal_stdout() + .map(|terminal_output| Resource::new(CliTerminalOutput(terminal_output))) } } impl TerminalStderr for VirtAdapter { fn get_terminal_stderr() -> Option> { debug!("CALL wasi:cli/terminal-stderr#get-terminal-stderr"); - Some(Resource::new(TerminalOutput)) + terminal_stderr::get_terminal_stderr() + .map(|terminal_output| Resource::new(CliTerminalOutput(terminal_output))) } } @@ -614,10 +618,7 @@ impl Preopens for VirtAdapter { IoState::initialize(); unsafe { &STATE.preopen_directories } .iter() - .map(|(fd, name)| { - debug!("PREOPEN {:?} {}", fd, name); - (Resource::new(fd.clone()), name.clone()) - }) + .map(|(fd, name)| (Resource::new(fd.clone()), name.clone())) .collect() } } From 1918c1aab13b16e0b2cd89b2ec1a10d08039b42a Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 13 Feb 2024 14:27:00 -0800 Subject: [PATCH 10/11] finalllyyyyy --- Cargo.lock | 921 ++++++++++++++++++--------------- Cargo.toml | 14 +- build-adapter.sh | 12 +- lib/virtual_adapter.debug.wasm | Bin 228883 -> 230108 bytes lib/virtual_adapter.wasm | Bin 192428 -> 194283 bytes src/lib.rs | 18 +- src/virt_deny/clocks.rs | 2 +- src/virt_deny/http.rs | 2 +- src/virt_deny/sockets.rs | 2 +- src/virt_io.rs | 6 +- src/walrus_ops.rs | 36 +- tests/virt.rs | 6 +- virtual-adapter/src/io.rs | 6 + 13 files changed, 545 insertions(+), 480 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a979b33..b4bcb1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.28.0", + "gimli 0.28.1", ] [[package]] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "once_cell", @@ -35,11 +35,20 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" -version = "0.5.0" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -51,43 +60,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "2.1.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arbitrary" @@ -97,13 +106,13 @@ checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -129,9 +138,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bincode" @@ -180,9 +189,9 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -192,25 +201,25 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cap-fs-ext" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b779b2d0a001c125b4584ad586268fb4b92d957bff8d26d7fe0dd78283faa814" +checksum = "88e341d15ac1029aadce600be764a1a1edafe40e03cde23285bc1d261b3a4866" dependencies = [ - "cap-primitives 2.0.0", - "cap-std 2.0.0", - "io-lifetimes 2.0.2", - "windows-sys 0.48.0", + "cap-primitives 2.0.1", + "cap-std 2.0.1", + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", ] [[package]] name = "cap-net-ext" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffc30dee200c20b4dcb80572226f42658e1d9c4b668656d7cc59c33d50e396e" +checksum = "434168fe6533055f0f4204039abe3ff6d7db338ef46872a5fa39e9d5ad5ab7a9" dependencies = [ - "cap-primitives 2.0.0", - "cap-std 2.0.0", - "rustix 0.38.30", + "cap-primitives 2.0.1", + "cap-std 2.0.1", + "rustix 0.38.31", "smallvec", ] @@ -226,33 +235,33 @@ dependencies = [ "io-lifetimes 1.0.11", "ipnet", "maybe-owned", - "rustix 0.37.23", + "rustix 0.37.27", "windows-sys 0.48.0", "winx 0.35.1", ] [[package]] name = "cap-primitives" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf30c373a3bee22c292b1b6a7a26736a38376840f1af3d2d806455edf8c3899" +checksum = "fe16767ed8eee6d3f1f00d6a7576b81c226ab917eb54b96e5f77a5216ef67abb" dependencies = [ "ambient-authority", - "fs-set-times 0.20.0", - "io-extras 0.18.0", - "io-lifetimes 2.0.2", + "fs-set-times 0.20.1", + "io-extras 0.18.1", + "io-lifetimes 2.0.3", "ipnet", "maybe-owned", - "rustix 0.38.30", - "windows-sys 0.48.0", - "winx 0.36.2", + "rustix 0.38.31", + "windows-sys 0.52.0", + "winx 0.36.3", ] [[package]] name = "cap-rand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577de6cff7c2a47d6b13efe5dd28bf116bd7f8f7db164ea95b7cc2640711f522" +checksum = "20e5695565f0cd7106bc3c7170323597540e772bb73e0be2cd2c662a0f8fa4ca" dependencies = [ "ambient-authority", "rand", @@ -267,31 +276,33 @@ dependencies = [ "cap-primitives 1.0.15", "io-extras 0.17.4", "io-lifetimes 1.0.11", - "rustix 0.37.23", + "rustix 0.37.27", ] [[package]] name = "cap-std" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84bade423fa6403efeebeafe568fdb230e8c590a275fba2ba978dd112efcf6e9" +checksum = "593db20e4c51f62d3284bae7ee718849c3214f93a3b94ea1899ad85ba119d330" dependencies = [ - "cap-primitives 2.0.0", - "io-extras 0.18.0", - "io-lifetimes 2.0.2", - "rustix 0.38.30", + "cap-primitives 2.0.1", + "io-extras 0.18.1", + "io-lifetimes 2.0.3", + "rustix 0.38.31", ] [[package]] name = "cap-time-ext" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f52b3c8f4abfe3252fd0a071f3004aaa3b18936ec97bdbd8763ce03aff6247" +checksum = "03261630f291f425430a36f38c847828265bc928f517cdd2004c56f4b02f002b" dependencies = [ - "cap-primitives 2.0.0", + "ambient-authority", + "cap-primitives 2.0.1", + "iana-time-zone", "once_cell", - "rustix 0.38.30", - "winx 0.36.2", + "rustix 0.38.31", + "winx 0.36.3", ] [[package]] @@ -312,9 +323,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.4" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d7b8d5ec32af0fadc644bf1fd509a688c2103b185644bb1e29d164e0703136" +checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" dependencies = [ "clap_builder", "clap_derive", @@ -322,9 +333,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.4" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56" +checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" dependencies = [ "anstream", "anstyle", @@ -334,21 +345,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "codespan-reporting" @@ -366,6 +377,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpp_demangle" version = "0.3.5" @@ -377,9 +394,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -406,8 +423,8 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", - "gimli 0.28.0", - "hashbrown 0.14.0", + "gimli 0.28.1", + "hashbrown 0.14.3", "log", "regalloc2", "smallvec", @@ -489,51 +506,43 @@ dependencies = [ "itertools", "log", "smallvec", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmtime-types", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -547,9 +556,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.107" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe98ba1789d56fb3db3bee5e032774d4f421b685de7ba703643584ba24effbe" +checksum = "8aff472b83efd22bfc0176aa8ba34617dd5c17364670eb201a5f06d339b8abf7" dependencies = [ "cc", "cxxbridge-flags", @@ -559,9 +568,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.107" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ce20f6b8433da4841b1dadfb9468709868022d829d5ca1f2ffbda928455ea3" +checksum = "bcf6e7a52c19013a9a0ec421c7d9c2d1125faf333551227e0a017288d71b47c3" dependencies = [ "cc", "codespan-reporting", @@ -569,24 +578,24 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "cxxbridge-flags" -version = "1.0.107" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20888d9e1d2298e2ff473cee30efe7d5036e437857ab68bbfea84c74dba91da2" +checksum = "589e83d02fc1d4fb78f5ad56ca08835341e23499d086d2821315869426d618dc" [[package]] name = "cxxbridge-macro" -version = "1.0.107" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa16a70dd58129e4dfffdff535fb1bce66673f7bbeec4a5a1765a504e1ccd84" +checksum = "e2cb1fd8ffae4230c7cfbbaf3698dbeaf750fa8c5dadf7ed897df581b9b572a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -660,9 +669,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "encoding_rs" @@ -703,19 +712,19 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-lock" -version = "4.0.0" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0377f1edc77dbd1118507bc7a66e4ab64d2b90c66f90726dc801e73a8c68f9" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" dependencies = [ "cfg-if", - "rustix 0.38.30", - "windows-sys 0.48.0", + "rustix 0.38.31", + "windows-sys 0.52.0", ] [[package]] @@ -734,9 +743,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -748,26 +757,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d167b646a876ba8fda6b50ac645cfd96242553cbaf0ca4fccaa39afcbf0801f" dependencies = [ "io-lifetimes 1.0.11", - "rustix 0.38.30", + "rustix 0.38.31", "windows-sys 0.48.0", ] [[package]] name = "fs-set-times" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd738b84894214045e8414eaded76359b4a5773f0a0a56b16575110739cdcf39" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" dependencies = [ - "io-lifetimes 2.0.2", - "rustix 0.38.30", - "windows-sys 0.48.0", + "io-lifetimes 2.0.3", + "rustix 0.38.31", + "windows-sys 0.52.0", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -779,9 +788,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -789,33 +798,33 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-sink", @@ -866,9 +875,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -888,12 +897,12 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator 0.3.0", - "indexmap 2.0.0", + "indexmap 2.2.3", "stable_deref_trait", ] @@ -914,9 +923,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", ] @@ -941,9 +950,32 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] [[package]] name = "id-arena" @@ -953,9 +985,9 @@ checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -987,12 +1019,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "serde", ] @@ -1008,12 +1040,12 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3c230ee517ee76b1cc593b52939ff68deda3fae9e41eca426c6b4993df51c4" +checksum = "c301e73fb90e8a29e600a9f402d095765f74310d582916a952f618836a1bd1ed" dependencies = [ - "io-lifetimes 2.0.2", - "windows-sys 0.48.0", + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", ] [[package]] @@ -1029,15 +1061,15 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb4def18c48926ccac55c1223e02865ce1a821751a95920448662696e7472c" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" @@ -1050,9 +1082,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "ittapi" @@ -1076,13 +1108,22 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "leb128" version = "0.2.5" @@ -1091,9 +1132,20 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall", +] [[package]] name = "link-cplusplus" @@ -1139,9 +1191,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" [[package]] name = "memchr" -version = "2.6.3" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memfd" @@ -1149,7 +1201,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.30", + "rustix 0.38.31", ] [[package]] @@ -1163,18 +1215,18 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", @@ -1193,21 +1245,21 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "crc32fast", - "hashbrown 0.14.0", - "indexmap 2.0.0", + "hashbrown 0.14.3", + "indexmap 2.2.3", "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "paste" @@ -1217,9 +1269,9 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" @@ -1228,7 +1280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.0", + "indexmap 2.2.3", ] [[package]] @@ -1245,9 +1297,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "ppv-lite86" @@ -1257,9 +1309,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -1275,9 +1327,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1323,9 +1375,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -1333,9 +1385,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1343,30 +1395,21 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] @@ -1397,9 +1440,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.23" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", @@ -1413,9 +1456,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", @@ -1434,15 +1477,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "scratch" @@ -1452,35 +1489,35 @@ checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -1489,20 +1526,20 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "serde_yaml" -version = "0.9.25" +version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -1511,9 +1548,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1547,15 +1584,15 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallvec" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -1563,9 +1600,9 @@ dependencies = [ [[package]] name = "spdx" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19b32ed6d899ab23174302ff105c1577e45a06b08d4fe0a9dd13ce804bbbf71" +checksum = "62bde1398b09b9f93fc2fc9b9da86e362693e999d3a54a8ac47a99a5a73f638b" dependencies = [ "smallvec", ] @@ -1592,9 +1629,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "strum" @@ -1628,9 +1665,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -1639,18 +1676,18 @@ dependencies = [ [[package]] name = "system-interface" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ce32341b2c0b70c144bbf35627fdc1ef18c76ced5e5e7b3ee8b5ba6b2ab6a0" +checksum = "0682e006dd35771e392a6623ac180999a9a854b1d4a6c12fb2e804941c2b1f58" dependencies = [ "bitflags 2.4.2", "cap-fs-ext", - "cap-std 2.0.0", + "cap-std 2.0.1", "fd-lock", - "io-lifetimes 2.0.2", - "rustix 0.38.30", - "windows-sys 0.48.0", - "winx 0.36.2", + "io-lifetimes 2.0.3", + "rustix 0.38.31", + "windows-sys 0.52.0", + "winx 0.36.3", ] [[package]] @@ -1661,44 +1698,43 @@ checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tempfile" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", - "rustix 0.38.30", - "windows-sys 0.48.0", + "rustix 0.38.31", + "windows-sys 0.52.0", ] [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -1718,9 +1754,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -1735,13 +1771,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -1755,9 +1791,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", @@ -1767,20 +1803,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "99e68c159e8f5ba8a28c4eb7b0c0c190d77bb479047ca713270048145a9ad28a" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", @@ -1789,11 +1825,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -1802,20 +1837,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -1828,9 +1863,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -1849,9 +1884,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" @@ -1867,15 +1902,15 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -1890,9 +1925,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" [[package]] name = "version_check" @@ -1952,13 +1987,13 @@ dependencies = [ "async-trait", "cap-fs-ext", "cap-rand", - "cap-std 2.0.0", + "cap-std 2.0.1", "cap-time-ext", - "fs-set-times 0.20.0", - "io-extras 0.18.0", - "io-lifetimes 2.0.2", + "fs-set-times 0.20.1", + "io-extras 0.18.1", + "io-lifetimes 2.0.3", "once_cell", - "rustix 0.38.30", + "rustix 0.38.31", "system-interface", "tracing", "wasi-common", @@ -1974,10 +2009,10 @@ dependencies = [ "anyhow", "bitflags 2.4.2", "cap-rand", - "cap-std 2.0.0", - "io-extras 0.18.0", + "cap-std 2.0.1", + "io-extras 0.18.1", "log", - "rustix 0.38.30", + "rustix 0.38.31", "thiserror", "tracing", "wasmtime", @@ -1995,35 +2030,89 @@ dependencies = [ "heck 0.4.1", "serde", "tokio", - "toml 0.7.8", + "toml 0.8.10", "walrus", "wasm-compose", "wasm-metadata", "wasm-opt", - "wasmparser 0.119.0", + "wasmparser 0.121.2", "wasmtime", "wasmtime-wasi", - "wit-component 0.19.1", + "wit-component", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" + [[package]] name = "wasm-compose" -version = "0.5.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9941776e288d53b544a50d295554497c499516095634d92d63f0aa099685372a" +checksum = "fd324927af875ebedb1b820c00e3c585992d33c2c787c5021fe6d8982527359b" dependencies = [ "anyhow", "heck 0.4.1", "im-rc", - "indexmap 2.0.0", + "indexmap 2.2.3", "log", "petgraph", "serde", "serde_derive", "serde_yaml", "smallvec", - "wasm-encoder 0.39.0", - "wasmparser 0.119.0", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", "wat", ] @@ -2047,44 +2136,35 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111495d6204760238512f57a9af162f45086504da332af210f2f75dd80b34f1d" -dependencies = [ - "leb128", - "wasmparser 0.119.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.41.0" +version = "0.41.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e09bca7d6388637d27fb5edbeab11f56bfabcef8743c55ae34370e1e5030a071" +checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" dependencies = [ "leb128", + "wasmparser 0.121.2", ] [[package]] name = "wasm-metadata" -version = "0.10.17" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c853d3809fc9fccf3bc0ad63f4f51d8eefad0bacf88f957aa991c1d9b88b016e" +checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" dependencies = [ "anyhow", - "indexmap 2.0.0", + "indexmap 2.2.3", "serde", "serde_derive", "serde_json", "spdx", - "wasm-encoder 0.41.0", - "wasmparser 0.121.0", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", ] [[package]] name = "wasm-opt" -version = "0.114.1" +version = "0.114.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d005a95f934878a1fb446a816d51c3601a0120ff929005ba3bab3c749cfd1c7" +checksum = "effbef3bd1dde18acb401f73e740a6f3d4a1bc651e9773bddc512fe4d8d68f67" dependencies = [ "anyhow", "libc", @@ -2098,9 +2178,9 @@ dependencies = [ [[package]] name = "wasm-opt-cxx-sys" -version = "0.114.1" +version = "0.114.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d04e240598162810fad3b2e96fa0dec6dba1eb65a03f3bd99a9248ab8b56caa" +checksum = "c09e24eb283919ace2ed5733bda4842a59ce4c8de110ef5c6d98859513d17047" dependencies = [ "anyhow", "cxx", @@ -2110,9 +2190,9 @@ dependencies = [ [[package]] name = "wasm-opt-sys" -version = "0.114.1" +version = "0.114.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efd2aaca519d64098c4faefc8b7433a97ed511caf4c9e516384eb6aef1ff4f9" +checksum = "36f2f817bed2e8d65eb779fa37317e74de15585751f903c9118342d1970703a4" dependencies = [ "anyhow", "cc", @@ -2128,44 +2208,33 @@ checksum = "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b" [[package]] name = "wasmparser" -version = "0.118.1" +version = "0.118.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ee9723b928e735d53000dec9eae7b07a60e490c85ab54abb66659fc61bfcd9" +checksum = "77f1154f1ab868e2a01d9834a805faca7bf8b50d041b4ca714d005d0dab1c50c" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "semver", ] [[package]] name = "wasmparser" -version = "0.119.0" +version = "0.121.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c35daf77afb4f9b14016625144a391085ec2ca99ca9cc53ed291bb53ab5278d" +checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ "bitflags 2.4.2", - "indexmap 2.0.0", - "semver", -] - -[[package]] -name = "wasmparser" -version = "0.121.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953cf6a7606ab31382cb1caa5ae403e77ba70c7f8e12eeda167e7040d42bfda8" -dependencies = [ - "bitflags 2.4.2", - "indexmap 2.0.0", + "indexmap 2.2.3", "semver", ] [[package]] name = "wasmprinter" -version = "0.2.76" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac2a7745372074e5573e365e17100f5a26058740576313784ef03fb900ea8d2" +checksum = "60e73986a6b7fdfedb7c5bf9e7eb71135486507c8fbc4c0c42cffcb6532988b7" dependencies = [ "anyhow", - "wasmparser 0.119.0", + "wasmparser 0.121.2", ] [[package]] @@ -2181,7 +2250,7 @@ dependencies = [ "cfg-if", "encoding_rs", "fxprof-processed-profile", - "indexmap 2.0.0", + "indexmap 2.2.3", "libc", "log", "object", @@ -2193,7 +2262,7 @@ dependencies = [ "serde_json", "target-lexicon", "wasm-encoder 0.38.1", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmtime-cache", "wasmtime-component-macro", "wasmtime-component-util", @@ -2227,7 +2296,7 @@ dependencies = [ "bincode", "directories-next", "log", - "rustix 0.38.30", + "rustix 0.38.31", "serde", "serde_derive", "sha2", @@ -2245,10 +2314,10 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", "wasmtime-component-util", "wasmtime-wit-bindgen", - "wit-parser", + "wit-parser 0.13.2", ] [[package]] @@ -2271,12 +2340,12 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.28.0", + "gimli 0.28.1", "log", "object", "target-lexicon", "thiserror", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmtime-cranelift-shared", "wasmtime-environ", "wasmtime-versioned-export-macros", @@ -2292,7 +2361,7 @@ dependencies = [ "cranelift-codegen", "cranelift-control", "cranelift-native", - "gimli 0.28.0", + "gimli 0.28.1", "object", "target-lexicon", "wasmtime-environ", @@ -2306,8 +2375,8 @@ checksum = "7e696b4911c9a69c3c2892ec05eb41bb15436d1a46d8830a755c40f5df47546a" dependencies = [ "anyhow", "cranelift-entity", - "gimli 0.28.0", - "indexmap 2.0.0", + "gimli 0.28.1", + "indexmap 2.2.3", "log", "object", "serde", @@ -2315,7 +2384,7 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-encoder 0.38.1", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmprinter", "wasmtime-component-util", "wasmtime-types", @@ -2330,7 +2399,7 @@ dependencies = [ "anyhow", "cc", "cfg-if", - "rustix 0.38.30", + "rustix 0.38.31", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys 0.52.0", @@ -2347,12 +2416,12 @@ dependencies = [ "bincode", "cfg-if", "cpp_demangle", - "gimli 0.28.0", + "gimli 0.28.1", "ittapi", "log", "object", "rustc-demangle", - "rustix 0.38.30", + "rustix 0.38.31", "serde", "serde_derive", "target-lexicon", @@ -2371,7 +2440,7 @@ checksum = "babc65e64ab0dd4e1ce65624db64e24ed0fbdebb16148729173fa0da9f70e53c" dependencies = [ "object", "once_cell", - "rustix 0.38.30", + "rustix 0.38.31", "wasmtime-versioned-export-macros", ] @@ -2396,7 +2465,7 @@ dependencies = [ "cc", "cfg-if", "encoding_rs", - "indexmap 2.0.0", + "indexmap 2.2.3", "libc", "log", "mach", @@ -2404,7 +2473,7 @@ dependencies = [ "memoffset", "paste", "psm", - "rustix 0.38.30", + "rustix 0.38.31", "sptr", "wasm-encoder 0.38.1", "wasmtime-asm-macros", @@ -2426,7 +2495,7 @@ dependencies = [ "serde", "serde_derive", "thiserror", - "wasmparser 0.118.1", + "wasmparser 0.118.2", ] [[package]] @@ -2437,7 +2506,7 @@ checksum = "e10fe166d4e4c95d5d80c5b47e1e12256af2099ac525ddb9a19b1aeb8896e5e1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -2453,16 +2522,16 @@ dependencies = [ "cap-fs-ext", "cap-net-ext", "cap-rand", - "cap-std 2.0.0", + "cap-std 2.0.1", "cap-time-ext", - "fs-set-times 0.20.0", + "fs-set-times 0.20.1", "futures", - "io-extras 0.18.0", - "io-lifetimes 2.0.2", + "io-extras 0.18.1", + "io-lifetimes 2.0.3", "libc", "log", "once_cell", - "rustix 0.38.30", + "rustix 0.38.31", "system-interface", "thiserror", "tokio", @@ -2483,10 +2552,10 @@ checksum = "d3f5d76d399cb4423e6f178bc154a0e1c314711e28dabaa6e757e56628a083ec" dependencies = [ "anyhow", "cranelift-codegen", - "gimli 0.28.0", + "gimli 0.28.1", "object", "target-lexicon", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmtime-cranelift-shared", "wasmtime-environ", "winch-codegen", @@ -2500,8 +2569,8 @@ checksum = "6bb3bc92c031cf4961135bffe055a69c1bd67c253dca20631478189bb05ec27b" dependencies = [ "anyhow", "heck 0.4.1", - "indexmap 2.0.0", - "wit-parser", + "indexmap 2.2.3", + "wit-parser 0.13.2", ] [[package]] @@ -2521,23 +2590,24 @@ dependencies = [ [[package]] name = "wast" -version = "70.0.0" +version = "71.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee4bc54bbe1c6924160b9f75e374a1d07532e7580eb632c0ee6cdd109bb217e" +checksum = "647c3ac4354da32688537e8fc4d2fe6c578df51896298cb64727d98088a1fd26" dependencies = [ + "bumpalo", "leb128", "memchr", "unicode-width", - "wasm-encoder 0.39.0", + "wasm-encoder 0.41.2", ] [[package]] name = "wat" -version = "1.0.83" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0dce8cdc288c717cf01e461a1e451a7b8445d53451123536ba576e423a101a" +checksum = "b69c36f634411568a2c6d24828b674961e37ea03340fe1d605c337ed8162d901" dependencies = [ - "wast 70.0.0", + "wast 71.0.1", ] [[package]] @@ -2566,7 +2636,7 @@ dependencies = [ "proc-macro2", "quote", "shellexpand", - "syn 2.0.37", + "syn 2.0.48", "witx", ] @@ -2578,7 +2648,7 @@ checksum = "37ba3b37f402a7513b9ed7973a6e907074987b3afdcede98d3d79939b3e76f1b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", "wiggle-generate", ] @@ -2621,14 +2691,23 @@ checksum = "8d921185084e134e897e0e202e129a422306d0f1391954ecf4928d36defa897d" dependencies = [ "anyhow", "cranelift-codegen", - "gimli 0.28.0", + "gimli 0.28.1", "regalloc2", "smallvec", "target-lexicon", - "wasmparser 0.118.1", + "wasmparser 0.118.2", "wasmtime-environ", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2763,9 +2842,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.15" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "6b1dbce9e90e5404c5a52ed82b1d13fc8cfbdad85033b6f57546ffd1265f8451" dependencies = [ "memchr", ] @@ -2783,18 +2862,19 @@ dependencies = [ [[package]] name = "winx" -version = "0.36.2" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357bb8e2932df531f83b052264b050b81ba0df90ee5a59b2d1d3949f344f81e5" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" dependencies = [ "bitflags 2.4.2", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "wit-bindgen" -version = "0.17.0" -source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78a762c4fbc1bc0dedf4aaa280ac5ea87e0d3a7ec83487b7b25999a55ec4b73" dependencies = [ "bitflags 2.4.2", "wit-bindgen-rust-macro", @@ -2802,93 +2882,95 @@ dependencies = [ [[package]] name = "wit-bindgen-core" -version = "0.17.0" -source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cc97e83ffaabab15791f6fe7d7f8c4e1dc670243e460765c2830463d53bcdf" dependencies = [ "anyhow", - "wit-component 0.20.1", - "wit-parser", + "wit-component", + "wit-parser 0.14.0", ] [[package]] name = "wit-bindgen-rust" -version = "0.17.0" -source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67b2ee0578e3e8be67f1d863b86e5d649bb16d56c85752eef5228967db103e2" dependencies = [ "anyhow", "heck 0.4.1", "wasm-metadata", "wit-bindgen-core", - "wit-component 0.20.1", + "wit-component", ] [[package]] name = "wit-bindgen-rust-macro" -version = "0.17.0" -source = "git+https://github.com/guybedford/wit-bindgen?rev=9d72cad91230c456c12286d0f49476caa1b5659c#9d72cad91230c456c12286d0f49476caa1b5659c" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345a07e6740bc71c7da6e95e9547d89c54895b8a93fad9d192b67c1ec8358e32" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", "wit-bindgen-core", "wit-bindgen-rust", - "wit-component 0.20.1", + "wit-component", ] [[package]] name = "wit-component" -version = "0.19.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "429e3c06fba3a7566aab724ae3ffff3152ede5399d44789e7dd11f5421292859" +checksum = "be60cd1b2ff7919305301d0c27528d4867bd793afe890ba3837743da9655d91b" dependencies = [ "anyhow", "bitflags 2.4.2", - "indexmap 2.0.0", + "indexmap 2.2.3", "log", "serde", "serde_derive", "serde_json", - "wasm-encoder 0.39.0", + "wasm-encoder 0.41.2", "wasm-metadata", - "wasmparser 0.119.0", - "wit-parser", + "wasmparser 0.121.2", + "wit-parser 0.14.0", ] [[package]] -name = "wit-component" -version = "0.20.1" +name = "wit-parser" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331de496d439010797c17637d8002712b9b69110f1669164c09dfa226ad277bb" +checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" dependencies = [ "anyhow", - "bitflags 2.4.2", - "indexmap 2.0.0", + "id-arena", + "indexmap 2.2.3", "log", + "semver", "serde", "serde_derive", "serde_json", - "wasm-encoder 0.41.0", - "wasm-metadata", - "wasmparser 0.121.0", - "wit-parser", + "unicode-xid", ] [[package]] name = "wit-parser" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df4913a2219096373fd6512adead1fb77ecdaa59d7fc517972a7d30b12f625be" +checksum = "1ee4ad7310367bf272507c0c8e0c74a80b4ed586b833f7c7ca0b7588f686f11a" dependencies = [ "anyhow", "id-arena", - "indexmap 2.0.0", + "indexmap 2.2.3", "log", "semver", "serde", "serde_derive", "serde_json", "unicode-xid", + "wasmparser 0.121.2", ] [[package]] @@ -2920,7 +3002,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -2944,11 +3026,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 8a5429a..001428b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,12 +32,12 @@ rustflags = ["-Zoom=panic"] anyhow = "1" clap = { version = "4", features = ["derive"] } serde = { version = "1", features = ["derive"] } -toml = "0.7" +toml = "0.8" walrus = "0.20.3" -wasm-compose = "0.5.0" -wasm-metadata = "0.10.15" -wasm-opt = "0.114.1" -wit-component = "0.19.0" +wasm-compose = "0.5.5" +wasm-metadata = "0.10.20" +wasm-opt = "0.114.2" +wit-component = "0.21.0" [build-dependencies] anyhow = "1" @@ -49,8 +49,8 @@ heck = { version = "0.4" } tokio = { version = "1.30.0", features = ["macros"] } wasmtime = { version = "17.0.1", features = ["component-model"] } wasmtime-wasi = "17.0.1" -wasmparser = "0.119.0" +wasmparser = "0.121.2" [workspace.dependencies] anyhow = "1" -wit-bindgen = { git = "https://github.com/guybedford/wit-bindgen", rev = "9d72cad91230c456c12286d0f49476caa1b5659c" } +wit-bindgen = "0.17.1" diff --git a/build-adapter.sh b/build-adapter.sh index 3f23a4a..5ee0c63 100755 --- a/build-adapter.sh +++ b/build-adapter.sh @@ -1,7 +1,11 @@ +# Useful for debugging: +# export CARGO_PROFILE_RELEASE_DEBUG=2 +# export WIT_BINDGEN_DEBUG=1 + wasm-tools component wit --wasm wit -o lib/package.wasm -cargo +nightly build -p virtual-adapter --target wasm32-wasi --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && - cp target/wasm32-wasi/release/virtual_adapter.wasm lib/virtual_adapter.wasm +cargo build -p virtual-adapter --target wasm32-unknown-unknown --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && + cp target/wasm32-unknown-unknown/release/virtual_adapter.wasm lib/virtual_adapter.wasm -cargo +nightly build -p virtual-adapter --target wasm32-wasi --release --features debug -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && - cp target/wasm32-wasi/release/virtual_adapter.wasm lib/virtual_adapter.debug.wasm +cargo build -p virtual-adapter --target wasm32-unknown-unknown --release --features debug -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort && + cp target/wasm32-unknown-unknown/release/virtual_adapter.wasm lib/virtual_adapter.debug.wasm diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index b2947875564fdbe99134c7c08c422068a8326b8b..1e78cf54e5e3c87e94e1f77c7f3405dcd6b77a86 100755 GIT binary patch literal 230108 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

    ^bdU@a`E6k+&Qz4bCZW84>{0OVEzTNw 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 literal 228883 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

    *gzl%M3n_hL#D$ThwnAa4CYppV3S=eRKS2fg@Q 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 a1*dQ9iql^`Bx+$zFF1LMMBG)7?*9WYr&jF% diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 9280e55a064a38c56b7f321bf7e187af28e3777d..6573579a0bc3c0afdbfd735dc301a4bcdd30e409 100755 GIT binary patch delta 58750 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

    @#^RAY$O7@11?v1|&GQfH&ud$A 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 MoP|(J-xoXoAJ7nVPXGV_ delta 58260 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 diff --git a/src/lib.rs b/src/lib.rs index d430a7e..d58f2cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,7 @@ use virt_deny::{ }; use virt_env::{create_env_virt, strip_env_virt}; use virt_io::{create_io_virt, VirtStdio}; -use walrus_ops::{deny_virt, strip_virt}; +use walrus_ops::strip_virt; use wasm_metadata::Producers; use wasm_opt::{Feature, OptimizationOptions}; use wit_component::{metadata, ComponentEncoder, DecodedWasm, StringEncoding}; @@ -130,7 +130,8 @@ impl WasiVirt { } pub fn finish(&mut self) -> Result { - let config = walrus::ModuleConfig::new(); + let mut config = walrus::ModuleConfig::new(); + config.generate_dwarf(true); let mut module = if self.debug { config.parse(VIRT_ADAPTER_DEBUG) } else { @@ -265,13 +266,8 @@ impl WasiVirt { let mut producers = Producers::default(); producers.add("processed-by", "wasi-virt", env!("CARGO_PKG_VERSION")); - component_section.data = metadata::encode( - &resolve, - base_world, - StringEncoding::UTF8, - Some(&producers), - None, - )?; + component_section.data = + metadata::encode(&resolve, base_world, StringEncoding::UTF8, Some(&producers))?; module.customs.add(component_section); @@ -287,14 +283,14 @@ impl WasiVirt { fs::write(&tmp_input, bytes) .with_context(|| "Unable to write temporary file for wasm-opt call on adapter")?; OptimizationOptions::new_optimize_for_size_aggressively() - .enable_feature(Feature::ReferenceTypes) + .enable_feature(Feature::All) .run(&tmp_input, &tmp_output) .with_context(|| "Unable to apply wasm-opt optimization to virt. This can be disabled with wasm_opt: false.") .or_else(|e| { fs::remove_file(&tmp_input)?; Err(e) })?; - bytes = fs::read(&tmp_output)?; + bytes = fs::read(&tmp_input)?; fs::remove_file(&tmp_input)?; fs::remove_file(&tmp_output)?; } diff --git a/src/virt_deny/clocks.rs b/src/virt_deny/clocks.rs index 108da6b..8e7224a 100644 --- a/src/virt_deny/clocks.rs +++ b/src/virt_deny/clocks.rs @@ -50,6 +50,6 @@ fn get_wasi_clock_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> /// Replace exports related to clocks in WASI to deny access pub(crate) fn deny_clocks_virt(module: &mut Module) -> Result<()> { - stub_virt(module, &["wasi:clocks/"])?; + stub_virt(module, &["wasi:clocks/"], false)?; replace_or_insert_stub_for_exports(module, get_wasi_clock_fns()) } diff --git a/src/virt_deny/http.rs b/src/virt_deny/http.rs index 80d866d..f9340ff 100644 --- a/src/virt_deny/http.rs +++ b/src/virt_deny/http.rs @@ -342,6 +342,6 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> /// Replace exports related to HTTP in WASI to deny access pub(crate) fn deny_http_virt(module: &mut Module) -> Result<()> { - stub_virt(module, &["wasi:http/"])?; + stub_virt(module, &["wasi:http/"], false)?; replace_or_insert_stub_for_exports(module, get_wasi_http_fns()) } diff --git a/src/virt_deny/sockets.rs b/src/virt_deny/sockets.rs index 76cc22c..a18bd3e 100644 --- a/src/virt_deny/sockets.rs +++ b/src/virt_deny/sockets.rs @@ -371,6 +371,6 @@ pub fn get_wasi_sockets_fns() -> &'static Vec<(&'static str, FuncParams, FuncRes /// Replace exports related to sockets in WASI to deny access pub(crate) fn deny_sockets_virt(module: &mut Module) -> Result<()> { - stub_virt(module, &["wasi:sockets/"])?; + stub_virt(module, &["wasi:sockets/"], false)?; replace_or_insert_stub_for_exports(module, get_wasi_sockets_fns()) } diff --git a/src/virt_io.rs b/src/virt_io.rs index 68eeea3..53026e8 100644 --- a/src/virt_io.rs +++ b/src/virt_io.rs @@ -360,7 +360,7 @@ pub(crate) fn create_io_virt<'a>( strip_virt(module, &["wasi:cli/std", "wasi:cli/terminal"])?; } if disable_stdio { - stub_virt(module, &["wasi:cli/std", "wasi:cli/terminal"])?; + stub_virt(module, &["wasi:cli/std", "wasi:cli/terminal"], false)?; } // First we iterate the options and fill in all HostDir and HostFile entries @@ -517,9 +517,9 @@ pub(crate) fn create_io_virt<'a>( // replacing it with a stub panic if !fs_passthrough { if disable_stdio { - stub_virt(module, &["wasi:io/"])?; + stub_virt(module, &["wasi:io/"], false)?; } - stub_virt(module, &["wasi:filesystem/"])?; + stub_virt(module, &["wasi:filesystem/"], false)?; } else { flags |= FLAGS_HOST_PASSTHROUGH; } diff --git a/src/walrus_ops.rs b/src/walrus_ops.rs index 402e5ab..7ff3a17 100644 --- a/src/walrus_ops.rs +++ b/src/walrus_ops.rs @@ -88,7 +88,7 @@ pub(crate) fn bump_stack_global(module: &mut Module, offset: i32) -> Result } pub(crate) fn strip_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { - stub_virt(module, subsystems)?; + stub_virt(module, subsystems, true)?; let mut subsystem_exports = Vec::new(); for export in module.exports.iter() { let export_name = if export.name.starts_with("cabi_post_") { @@ -113,10 +113,14 @@ pub(crate) fn strip_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> } /// Replace imported WASI functions that implement subsystem access with no-ops -pub(crate) fn stub_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { +pub(crate) fn stub_virt( + module: &mut Module, + subsystems: &[&str], + with_exports: bool, +) -> Result<()> { let mut subsystem_imports = Vec::new(); for import in module.imports.iter() { - let module_name = if import.module.starts_with("[export]") { + let module_name = if with_exports && import.module.starts_with("[export]") { &import.module[8..] } else { &import.module @@ -143,29 +147,3 @@ pub(crate) fn stub_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> } Ok(()) } - -/// Replace exports related to subsystem to deny access -pub(crate) fn deny_virt(module: &mut Module, subsystems: &[&str]) -> Result<()> { - stub_virt(module, subsystems)?; - let mut subsystem_exports = Vec::new(); - for export in module.exports.iter() { - let export_name = if export.name.starts_with("cabi_post_") { - &export.name[10..] - } else { - &export.name - }; - if subsystems - .iter() - .any(|subsystem| export_name.starts_with(subsystem)) - { - subsystem_exports.push(export.name.to_string()); - } - } - for export_name in &subsystem_exports { - let fid = module.exports.get_func(export_name).unwrap(); - module.replace_exported_func(fid, |(body, _)| { - body.unreachable(); - })?; - } - Ok(()) -} diff --git a/tests/virt.rs b/tests/virt.rs index 9e3b95d..61bbb51 100644 --- a/tests/virt.rs +++ b/tests/virt.rs @@ -77,9 +77,9 @@ async fn virt_test() -> Result<()> { let test_case_name = test_case_file_name.strip_suffix(".toml").unwrap(); // Filtering... - if test_case_name == "encapsulate" { - continue; - } + // if !test_case_name.starts_with("fs") { + // continue; + // } println!("> {:?}", test_case_path); diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 2672089..327b425 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -449,6 +449,12 @@ impl IoState { return; } + if DEBUG { + std::panic::set_hook(Box::new(|invoke| { + debug!("{:?}", invoke); + })); + } + if Io::host_passthrough() || Io::host_preopens() { let host_preopen_directories = unsafe { &mut STATE.host_preopen_directories }; for (fd, name) in preopens::get_directories() { From 465aef852d0b6a0386eb86b408462db125e1e36e Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 13 Feb 2024 14:34:03 -0800 Subject: [PATCH 11/11] fixup optimization --- src/lib.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d58f2cc..2ecc0db 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ use virt_env::{create_env_virt, strip_env_virt}; use virt_io::{create_io_virt, VirtStdio}; use walrus_ops::strip_virt; use wasm_metadata::Producers; -use wasm_opt::{Feature, OptimizationOptions}; +use wasm_opt::{Feature, OptimizationOptions, ShrinkLevel}; use wit_component::{metadata, ComponentEncoder, DecodedWasm, StringEncoding}; mod data; @@ -131,7 +131,9 @@ impl WasiVirt { pub fn finish(&mut self) -> Result { let mut config = walrus::ModuleConfig::new(); - config.generate_dwarf(true); + if self.debug { + config.generate_dwarf(true); + } let mut module = if self.debug { config.parse(VIRT_ADAPTER_DEBUG) } else { @@ -282,7 +284,8 @@ impl WasiVirt { let tmp_output = dir.join(format!("virt.core.output.{}.wasm", timestamp())); fs::write(&tmp_input, bytes) .with_context(|| "Unable to write temporary file for wasm-opt call on adapter")?; - OptimizationOptions::new_optimize_for_size_aggressively() + OptimizationOptions::new_opt_level_2() + .shrink_level(ShrinkLevel::Level1) .enable_feature(Feature::All) .run(&tmp_input, &tmp_output) .with_context(|| "Unable to apply wasm-opt optimization to virt. This can be disabled with wasm_opt: false.") @@ -290,7 +293,7 @@ impl WasiVirt { fs::remove_file(&tmp_input)?; Err(e) })?; - bytes = fs::read(&tmp_input)?; + bytes = fs::read(&tmp_output)?; fs::remove_file(&tmp_input)?; fs::remove_file(&tmp_output)?; }

    F#@YVn`9AF$)L`AFYw2cEU~KW`2z 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 b@|HK-IaGVrKdOM!Mz{Qv5vinoM2G(mG-42w literal 232649 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