From 1ad580a6183f2fb6f5f1d6e03a5cf831dd71c653 Mon Sep 17 00:00:00 2001 From: Syrus Date: Fri, 21 Dec 2018 17:16:40 -0800 Subject: [PATCH] Improved emscripten env(get,set,unset,put) integration --- build/emtests.rs | 6 +--- emtests/env.c | 20 ++++++++++--- emtests/env.output | 12 ++++++-- emtests/env.wasm | Bin 45738 -> 46214 bytes emtests/printf.wasm | Bin 46179 -> 47042 bytes src/apis/emscripten/env.rs | 57 ++++++++++++++++++++++++++++++------- src/apis/emscripten/mod.rs | 3 ++ src/emtests/env.rs | 7 ++++- 8 files changed, 82 insertions(+), 23 deletions(-) diff --git a/build/emtests.rs b/build/emtests.rs index 24032ace7..2d5306994 100644 --- a/build/emtests.rs +++ b/build/emtests.rs @@ -11,11 +11,7 @@ use std::process::Command; static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 3] = [ - "emtests/env.c", - "emtests/puts.c", - "emtests/printf.c" -]; +const TESTS: [&str; 3] = ["emtests/env.c", "emtests/puts.c", "emtests/printf.c"]; pub fn compile(file: &str) -> String { let mut output_path = PathBuf::from(file); diff --git a/emtests/env.c b/emtests/env.c index 62e0ee6ee..72350ed40 100644 --- a/emtests/env.c +++ b/emtests/env.c @@ -4,10 +4,22 @@ int main() { printf("INIT\n"); const char* UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); - printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); - printf("set UNEXISTENT_ENVVAR = SET\n"); - putenv("UNEXISTENT_ENVVAR=SET"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SET (via putenv)\n"); + putenv("UNEXISTENT_ENVVAR=PUTENV"); UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); - printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SETENV (via setenv, overwrite)\n"); + setenv("UNEXISTENT_ENVVAR", "SETENV", 1); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SETENV_NEW (via setenv, NO overwrite)\n"); + setenv("UNEXISTENT_ENVVAR", "SETENV_NEW", 0); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Unsetting UNEXISTENT_ENVVAR\n"); + unsetenv("UNEXISTENT_ENVVAR"); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); printf("END\n"); } diff --git a/emtests/env.output b/emtests/env.output index d546fd4d8..70b84738c 100644 --- a/emtests/env.output +++ b/emtests/env.output @@ -1,5 +1,11 @@ INIT -get UNEXISTENT_ENVVAR: [NULL] -set UNEXISTENT_ENVVAR = SET -get UNEXISTENT_ENVVAR: SET +UNEXISTENT_ENVVAR = [NULL] +Setting UNEXISTENT_ENVVAR=SET (via putenv) +UNEXISTENT_ENVVAR = PUTENV +Setting UNEXISTENT_ENVVAR=SETENV (via setenv, overwrite) +UNEXISTENT_ENVVAR = SETENV +Setting UNEXISTENT_ENVVAR=SETENV_NEW (via setenv, NO overwrite) +UNEXISTENT_ENVVAR = SETENV +Unsetting UNEXISTENT_ENVVAR +UNEXISTENT_ENVVAR = [NULL] END diff --git a/emtests/env.wasm b/emtests/env.wasm index d31a64c33115446274f95d98c078109cb4941d69..338ca49b145d1a93a12224a347ee3cbe76cbb4e3 100644 GIT binary patch delta 4593 zcma)A4OEm>8vgG0Gc(Mfd?+A_Fz@9@W`wbpX{+2b0T1-5SLw(tFB#?GEjd-j}rzWdzg zzW2HBeeeC=@6H^(C_eHJaYuu6OpfhpUP>a2E>BfURsDKFknkDeT37F>^1VlXOT78v zE|;sSxw*cpW|O35siVb5)fvCd^e= zw|=c_rDsD$qpK!;l2D+y)>hQi3(-cb>rhG#Kx_5S0iC#A2QwQ&K`>$Ci|o zm@kt*v$^s@?-vrWdlSsmmSEQU1$Ux3!JJ?zmS`UE#kz`6(Pc&txiO|i~$ zQ@|?CO|4kj+%yg=aMN*EMZ0MdR;rsOVr6pESg_Htnm`4uClzlH=!AO$p%_}K0^80U9E`?ohvBWid+Nd{S0Qb6HK22?VF0hNq?B@@Jf zDWDX`6}DQz8c_PcstI?5LLfvJGJ}~5Sx{&gSWsw~UuZZ04A+J3jRoKepICwVmDCXd zZ^9r<7g0gwBH<`90>V*bgkNMN#KXvdH}QPzRVyT54FZh-TcQ~vSc_6Ep0u&Alzj1$ zjU^eD^43F!En<(&XEbIJ&T1x|-EVq6_O#6=3Urqd&Wf6}p6)loexpWOXopclLsv)! zAHFBV6W?QlHw=90(>C~$1L#-K*B%qjO2RB!w~aZ?Z;RI)z5(-U5o=a9tW@l_`Cb}! zh=`|ctSD?WpSwCtmpl;WF{7j&TI?LF-otGh)QN;k91cIlC43DLQwVqbg~)c!v!YSD z-83zxnkzmXV-$;e^hI8g082;#y(+;~ zDNmlMH*4v)60V6y;hF@9!wTtl5_~6NKN2Bs`aSQ5@AdQ4V`BrcCFr>(_+!EHSP_zNs8DKx(SMCrwpC4=FO*FGIYr}NT68?QuMftZn5jMQbd`h@fqTc z6t*iq7YBYG-zDPA+Y`#L@wbFXd|ppTj<}_JaZZMFvL-jv^Rk8$rzK{ais(i3OD$q8 zi6>@U)2#+&z*6L>{^GN8+Qi52|HrW zydDJIcEp@H83es{#GL5~g41@yoaqaKvv$OsITHjI?1(wj9|Yb3J2p6VDF}w_h&gjD z2yWRCbLK`6Y;hpwOluH4=0MDuZ9&lHK+KsPLGY{tF=zG$LA%$14Ne^lf|nhLInxmY zuQ?ENrZWgmI1qE@^&seWAm+@;An0`<=1flzoOU4QOkWV3b);c~Q)e6jaKV9?GyOp@ z;6TioOB}Fd+X~AW8$6Qlg{;JFK)FQoCL{+^5bUUBRpalN|z zR|;VHLUGft74!(c)@Q;aTIo#4@Mn^93Sjw*l26YoaGq=WQ_uwku<)T56{O&zJ{0rc z3Fn8ACw2876~OW@rHS5DFs=FajX$jCv%6ADBD-~q=L~>lzoCg9FkssC9ZB7;XT!G) zdNzF9z_VfYL_HfePTZ`IzCI}jvmu+DK9MKI>hymS%m=;|Q|1vKtJjQy;J%)bZSlwI zO(O=E{ge?irPXN{g-p!%FB$Q(j?`lQT>AX+_q< zx=$CTPUb$1nWp*|v zd~XuK@*`T@B0RqBGq)3-MAK$PdHoI^76A*+dqm_e9T9o>Fpk_cY-yyKwu@lWWPVYy zLc8AYKN$cffPB17QB2hM**qQik_5geI>XOuJbvl7i1~O8OSp4-5+OX1&zi)KP7w%?cx5DlK~kprHN+pRW;3CrmyPb+`Gd4r)DWEg(XdN8UIkn=3R;OyVHd3H09G~ zXx3+8*8GZLxNQ&UyS9;U+T;1j{ImLp{PnuvggMjrrn%>&^MiC?PA`e**H2|1fj**n z-SiWp_1le%9{{xE9Xo{`S!E|bW+6o zmY{%S;U0!r!imT)%S0P;sz&XWGt4slXNIj@m}8#6C!nzw)yZC3IE##90}C@qDoa=t zPm);vqBJs|ZCI4xNX5%DP!cLyKv2i=Bfvk}N!Uom?M}jT9#4sa%_LvV*Sff zQBA$~1mchGZN+Et@;uaRTYidIeJk$kBqW`MuP7w(zU3>vAy^fxyh+Gpmbc1-&o@@3 zA$56GyGW+^o~*tsl1%o1dxnxYY!2|EbQf+ci%=y1UzSj3sCm39;8COpFL6L_DfQ(0Qw1o5_&t*C1t(^y|! zt~Hwu5EvjdJX8tAPc|P1#|X9Kb;F^d2kC3GNd{|Nn-)HZFA8zf=L!5BcYybGtt}>5 zyXvQtG?rao%KhD0znDyCm+SYU`sN0X&o*R{bYEm+G(l=YQ&Y(_5FiB{YC2?Tt*x?$ z4iY>IX^;xn2n-Sx`>}OdgsTMaCfwSN&~JWH@X#S{4u10?G-uy7Jw&Fkrsg*ZW-yP9 z#Itfw4aW5y&thZrEPh?rPN3f+h&&Jy3QFp1mb!5RDP%8hOvD}P-8dDWhE3zhOg4T~ zO-c?OkYGTXC6wY#Y!mJ~*+(Ch;Za%5q2EYY)0+}TJW|^N?A=Y1BDUghlkH%^A17^m zhYX7LC@|xL8w`7};~8LE9<&(_AUp!>_=A%&`I@325|<>v2u;FT)>`?}j*9xyL}(M? zsEBKC6RAsqn-X+N>RrB=-y9_*%lCnIr8tpmoRMH(U^I{88a;3#RKpq^dLR5rs--n( z_D2b7)O5DwVX*R1J_+1EPgx(Bu^Q^tX}-M=_l4pNHBSyFA$PoFtvg2H-tFD7fMl_6 zb}YxR73^Gq0eg05vEfC)-)iaX+Rj|;oU$tgJ1cfA#?Ci)Rp6kp?03j_uv}!Wu=t>P zWZPskoZD83^eb(v;-*0@-7P^neM$nXpF+>~@Qq4`J-9%YwmTZN3U=R3X83mQZZwe@ zOnmM`qOsoR=Hq)d_Q2Z&^U+@q((nW-fDmR0BN9&uqMG0vcE~~^bLnsx9%dQor)5+o zs-2BLJUwY5<`4t^Lc%<9Cu_8hR}Ep7&|ng29q)VmaJy{oj3#)$Gg&&KebZlT4H2_c z-&>tHXmJz^@5*4(@o1(UkMJgW%)+wb@}i>U0{%D9Qd3_I<;8i63rfrKipyMi#S0f| z3vx>H%D}e1rUDw*@jpWBX5p7MCFM9`;r|vv1HTUb|A0D9Xz;GDYTnRX(^7?+ILrT| k;402r^xrDQ^P%AvI^0Ys$G>WRWl?4!uQ=DtT8?M@2T88<-2eap delta 4212 zcmZu!4Nw$E7M`A+*f|-9lW21^HW|$pr%m z#CXP}I2)BRG5(RnGj~@L(!}KMUeE4ct}0j6 zHU0J1uV26S`pui3O<#(Ku8N)YmKUWlhntoW<2q?2t@*J&pU>aaR9Ek-t*@+TuCA{W zl1BJ^YyHhWf8F}(CL9;od~4R!J|3(R9*})&n*4qt(dnzLUBAw^D!8Gd!B;(LqA*wX zt*fZ66B2CL*P<%nK1BX?l?_h{51T0HZx)JVUvO1ZjWEx#`pLREDA($%t`_D;hetTT z;et4Su(@JYZFR7!w7H_PrnI4=(l3lsnjWt!sSh@n`kRA7p&iwgRWU#Y3o@+Mzy*f zG|uhNGXtp(x5KRzOSAM$)uKS04gngAU1ET$*r@^P#Lga|F%U;b=mHh=Q%NvFoikd0 zKS^~`8DvU;P%Btkw$r*+Y}2;c3dMsOd)T%N z2du}|A#T@aiE)72A04{QWPuX!(;#BkwjV)5%7JJhTXY?8od$u8_RP4}<;h23y?9y1h zdOzQLi)yNTM-4hqr9GsP&5V77%WjL!B3#AEkwaXCu`PZI;fBAP(8GCFpJ=K)kvK%0 z2Q}DX(Z%Kf-D%O$$X7>CL|csyMz@-xrDNA}jRRwCB5GhKUCG>tFI+AK9r&jiL!_O_ zC1{2&gw3cr!>61*%Gp#EMjE1NtiBHHpMb%}#sHbi^LJl2xZ zg3oVLlEm{~mgue&QGBC2TRi4vN8R~2^_}~$h&%i`wd}rm^nwHzB)zqeelEf1-2D$F zbskGh(?$)LyI+#vlB7#b^s=PmhNWrK?epkWv=Ayk3FrXpk%&`bKp&{nXU<3?nh&gkL1M`H=YB=E3=?FNl zA?D1v2)Lpl=FG(ixS=8D%(V!(ts&;j%?S8jL(G}G5zyg5%$YV5v?AK-!2zc>M?jYc zF=sj>;1v&I&U8mWj|VYl_C~<3Jcv1SFar8Kh&j_60RtYyoH-T(t%82Sg9AKK zF=tLiz*!Gs&YX^b^B%;UITry}Jcv1SF#>LQ5Od~Q1l;x@=FH77V9DCkY+?EerCWnd zGN0M1v7_nJqQOgiLdFbXR_~`G3S9E8;S1i3EGW&$!`F;OMbwbNkj?B1r5)0k!AH4r<4nd*;tCar&t$;%i5#F8WL^_4m^)m)0z>GSdL#5R<(-ElK2i&;#DhP+ih*6d#qS|jX!2?F>B&mR7r?-rR~$6H7&K} zPUe>8<(if@y1dU0*sv}iu)_g67A8Kbp*?nf20eD}L8vajW(RComtVK@y4;yp zMv~aoylEm<6_~M!e+&-JsO6uAgqcr;qy8}gY#)(E`WM2Z{`$<{o7Pn8Md7I5BY^EY zl=zELn&_+UG zC;&}O$NQPU?{!fS#aX<2ahAm{*-z7{3r6cCK$Ag$WYcv3;8J)>rqtObt4Ru*wzQF? zvp1I}<8x@~mdv?mzKGW~K?aM$ZFefMMC6xDqW5K}Hhmz&sl@!qu;(7lb3DMerb&wG zWy6ooCaKI>o=wKH!txa2X4U1HB!lfLcYDWEG=Y+6Q2{|s<%aM`rr}^brbZgR3n`Sy zICL9-D<30~OlDc}AZnYmVgT{Y6>a!zTv>oRf3tFkBpL0#UP7|ic;Y|mex%tlNqbajO}+p51!0x1irvf>o|9|u9##qcYQ9I zz>kSoqDqa-{R)YnjlY;N zP9-ixOSl~im6jD0m-z~cmoC*8KLlw(hp@bO$$|wd a1pM9psRZOfX+fDo_{q{dq}lww-2VV)A9bGq diff --git a/emtests/printf.wasm b/emtests/printf.wasm index 69cc16f2b7743d206fabe9cad0fb1a9891f35518..c3f19ab96f8195cbf12286b3e19df425e3d495f7 100644 GIT binary patch literal 47042 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 P&Uu}%<1N+~z5D+IvixPX literal 46179 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 i3&f!*7&rZ12U6~ZE%AgFyG`oP7 u32 { unsafe { copy_cstr_into_wasm(instance, c_str) } } +/// emscripten: _setenv // (name: *const char, name: *const value, overwrite: int); +pub extern "C" fn _setenv(name: c_int, value: c_int, overwrite: c_int, instance: &mut Instance) { + debug!("emscripten::_setenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + let value_addr = instance.memory_offset_addr(0, value as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + debug!("=> value({:?})", unsafe { CStr::from_ptr(value_addr) }); + + unsafe { setenv(name_addr, value_addr, overwrite) }; +} + +/// emscripten: _putenv // (name: *const char); +pub extern "C" fn _putenv(name: c_int, instance: &mut Instance) { + debug!("emscripten::_putenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + + unsafe { putenv(name_addr as _) }; +} + +/// emscripten: _unsetenv // (name: *const char); +pub extern "C" fn _unsetenv(name: c_int, instance: &mut Instance) { + debug!("emscripten::_unsetenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + + unsafe { unsetenv(name_addr) }; +} + pub extern "C" fn _getpwnam(name_ptr: c_int, instance: &mut Instance) -> c_int { debug!("emscripten::_getpwnam {}", name_ptr); @@ -108,15 +146,14 @@ pub extern "C" fn ___build_environment(environ: c_int, instance: &mut Instance) debug!("emscripten::___build_environment {}", environ); const MAX_ENV_VALUES: u32 = 64; const TOTAL_ENV_SIZE: u32 = 1024; - let mut environment = - instance.memory_offset_addr(0, environ as _) as *mut c_int; + let mut environment = instance.memory_offset_addr(0, environ as _) as *mut c_int; unsafe { - let (pool_offset, pool_slice): (u32, &mut [u8]) = allocate_on_stack(TOTAL_ENV_SIZE as u32, instance); - let (env_offset, env_slice): (u32, &mut [u8]) = allocate_on_stack((MAX_ENV_VALUES*4) as u32, instance); - let mut env_ptr = - instance.memory_offset_addr(0, env_offset as _) as *mut c_int; - let mut pool_ptr = - instance.memory_offset_addr(0, pool_offset as _) as *mut c_int; + let (pool_offset, pool_slice): (u32, &mut [u8]) = + allocate_on_stack(TOTAL_ENV_SIZE as u32, instance); + let (env_offset, env_slice): (u32, &mut [u8]) = + allocate_on_stack((MAX_ENV_VALUES * 4) as u32, instance); + let mut env_ptr = instance.memory_offset_addr(0, env_offset as _) as *mut c_int; + let mut pool_ptr = instance.memory_offset_addr(0, pool_offset as _) as *mut c_int; *env_ptr = pool_offset as i32; *environment = env_offset as i32; diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 413171e63..44743d812 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -114,6 +114,9 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { import_object.set("env", "___wait", ImportValue::Func(lock::___wait as _)); // Env import_object.set("env", "_getenv", ImportValue::Func(env::_getenv as _)); + import_object.set("env", "_setenv", ImportValue::Func(env::_setenv as _)); + import_object.set("env", "_putenv", ImportValue::Func(env::_putenv as _)); + import_object.set("env", "_unsetenv", ImportValue::Func(env::_unsetenv as _)); import_object.set("env", "_getpwnam", ImportValue::Func(env::_getpwnam as _)); import_object.set("env", "_getgrnam", ImportValue::Func(env::_getgrnam as _)); import_object.set( diff --git a/src/emtests/env.rs b/src/emtests/env.rs index 3c53a539d..58b674a3f 100644 --- a/src/emtests/env.rs +++ b/src/emtests/env.rs @@ -1,4 +1,9 @@ #[test] fn test_env() { - assert_emscripten_output!("../../emtests/env.wasm", "env", vec![], "../../emtests/env.output"); + assert_emscripten_output!( + "../../emtests/env.wasm", + "env", + vec![], + "../../emtests/env.output" + ); }