1111#define get_module_inst (exec_env ) \
1212 wasm_runtime_get_module_inst(exec_env)
1313
14+ #define validate_app_addr (offset , size ) \
15+ wasm_runtime_validate_app_addr(module_inst, offset, size)
16+
17+ #define validate_app_str_addr (offset ) \
18+ wasm_runtime_validate_app_str_addr(module_inst, offset)
19+
1420#define validate_native_addr (addr , size ) \
1521 wasm_runtime_validate_native_addr(module_inst, addr, size)
1622
23+ #define addr_app_to_native (offset ) \
24+ wasm_runtime_addr_app_to_native(module_inst, offset)
25+
26+ #define addr_native_to_app (ptr ) \
27+ wasm_runtime_addr_native_to_app(module_inst, ptr)
28+
1729#define module_malloc (size , p_native_addr ) \
1830 wasm_runtime_module_malloc(module_inst, size, p_native_addr)
1931
2032#define module_free (offset ) \
2133 wasm_runtime_module_free(module_inst, offset)
2234
23- #define REG_NATIVE_FUNC (func_name , signature ) \
24- { #func_name, func_name##_wrapper, signature, NULL }
25-
2635extern bool
2736wasm_runtime_call_indirect (wasm_exec_env_t exec_env ,
2837 uint32 element_idx ,
@@ -282,12 +291,15 @@ fopen_wrapper(wasm_exec_env_t exec_env,
282291 int file_id ;
283292
284293 if (pathname == NULL || mode == NULL )
285- return -1 ;
294+ return 0 ;
286295
287296 if ((file_id = get_free_file_slot ()) == -1 )
288- return -1 ;
297+ return 0 ;
289298
290299 file = fopen (pathname , mode );
300+ if (!file )
301+ return 0 ;
302+
291303 file_list [file_id ] = file ;
292304 return file_id + 1 ;
293305}
@@ -308,6 +320,22 @@ fread_wrapper(wasm_exec_env_t exec_env,
308320 return (uint32 )fread (ptr , size , nmemb , file );
309321}
310322
323+ static int
324+ fseeko_wrapper (wasm_exec_env_t exec_env ,
325+ int file_id , int64 offset , int whence )
326+ {
327+ FILE * file ;
328+
329+ file_id = file_id - 1 ;
330+ if ((unsigned )file_id >= sizeof (file_list ) / sizeof (FILE * )) {
331+ return -1 ;
332+ }
333+ if ((file = file_list [file_id ]) == NULL ) {
334+ return -1 ;
335+ }
336+ return (uint32 )fseek (file , offset , whence );
337+ }
338+
311339static uint32
312340emcc_fwrite_wrapper (wasm_exec_env_t exec_env ,
313341 const void * ptr , uint32 size , uint32 nmemb ,
@@ -351,6 +379,113 @@ fclose_wrapper(wasm_exec_env_t exec_env, int file_id)
351379 file_list [file_id ] = NULL ;
352380 return fclose (file );
353381}
382+
383+ static int
384+ __sys_mkdir_wrapper (wasm_exec_env_t exec_env ,
385+ const char * pathname , int mode )
386+ {
387+ if (!pathname )
388+ return -1 ;
389+ return mkdir (pathname , mode );
390+ }
391+
392+ static int
393+ __sys_rmdir_wrapper (wasm_exec_env_t exec_env , const char * pathname )
394+ {
395+ if (!pathname )
396+ return -1 ;
397+ return rmdir (pathname );
398+ }
399+
400+ static int
401+ __sys_unlink_wrapper (wasm_exec_env_t exec_env , const char * pathname )
402+ {
403+ if (!pathname )
404+ return -1 ;
405+ return unlink (pathname );
406+ }
407+
408+ static uint32
409+ __sys_getcwd_wrapper (wasm_exec_env_t exec_env , char * buf , uint32 size )
410+ {
411+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
412+ char * ret ;
413+
414+ if (!buf )
415+ return -1 ;
416+
417+ ret = getcwd (buf , size );
418+ return ret ? addr_native_to_app (ret ) : 0 ;
419+ }
420+
421+ #include <sys/utsname.h>
422+
423+ struct utsname_app {
424+ char sysname [64 ];
425+ char nodename [64 ];
426+ char release [64 ];
427+ char version [64 ];
428+ char machine [64 ];
429+ char domainname [64 ];
430+ };
431+
432+ static int
433+ __sys_uname_wrapper (wasm_exec_env_t exec_env , struct utsname_app * uname_app )
434+ {
435+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
436+ struct utsname uname_native = { 0 };
437+ uint32 length ;
438+
439+ if (!validate_native_addr (uname_app , sizeof (struct utsname_app )))
440+ return -1 ;
441+
442+ if (uname (& uname_native ) != 0 ) {
443+ return -1 ;
444+ }
445+
446+ memset (uname_app , 0 , sizeof (struct utsname_app ));
447+
448+ length = strlen (uname_native .sysname );
449+ if (length > sizeof (uname_app -> sysname ) - 1 )
450+ length = sizeof (uname_app -> sysname ) - 1 ;
451+ bh_memcpy_s (uname_app -> sysname , sizeof (uname_app -> sysname ),
452+ uname_native .sysname , length );
453+
454+ length = strlen (uname_native .nodename );
455+ if (length > sizeof (uname_app -> nodename ) - 1 )
456+ length = sizeof (uname_app -> nodename ) - 1 ;
457+ bh_memcpy_s (uname_app -> nodename , sizeof (uname_app -> nodename ),
458+ uname_native .nodename , length );
459+
460+ length = strlen (uname_native .release );
461+ if (length > sizeof (uname_app -> release ) - 1 )
462+ length = sizeof (uname_app -> release ) - 1 ;
463+ bh_memcpy_s (uname_app -> release , sizeof (uname_app -> release ),
464+ uname_native .release , length );
465+
466+ length = strlen (uname_native .version );
467+ if (length > sizeof (uname_app -> version ) - 1 )
468+ length = sizeof (uname_app -> version ) - 1 ;
469+ bh_memcpy_s (uname_app -> version , sizeof (uname_app -> version ),
470+ uname_native .version , length );
471+
472+ #ifdef _GNU_SOURCE
473+ length = strlen (uname_native .domainname );
474+ if (length > sizeof (uname_app -> domainname ) - 1 )
475+ length = sizeof (uname_app -> domainname ) - 1 ;
476+ bh_memcpy_s (uname_app -> domainname , sizeof (uname_app -> domainname ),
477+ uname_native .domainname , length );
478+ #endif
479+
480+ return 0 ;
481+ }
482+
483+ static void
484+ emscripten_notify_memory_growth_wrapper (wasm_exec_env_t exec_env , int i )
485+ {
486+ (void )i ;
487+ }
488+
354489#endif /* end of BH_PLATFORM_LINUX_SGX */
355490
356491#define REG_NATIVE_FUNC (func_name , signature ) \
@@ -374,9 +509,16 @@ static NativeSymbol native_symbols_libc_emcc[] = {
374509#if !defined (BH_PLATFORM_LINUX_SGX )
375510 REG_NATIVE_FUNC (fopen , "($$)i" ),
376511 REG_NATIVE_FUNC (fread , "(*iii)i" ),
512+ REG_NATIVE_FUNC (fseeko , "(iIi)i" ),
377513 REG_NATIVE_FUNC (emcc_fwrite , "(*iii)i" ),
378514 REG_NATIVE_FUNC (feof , "(i)i" ),
379515 REG_NATIVE_FUNC (fclose , "(i)i" ),
516+ REG_NATIVE_FUNC (__sys_mkdir , "($i)i" ),
517+ REG_NATIVE_FUNC (__sys_rmdir , "($)i" ),
518+ REG_NATIVE_FUNC (__sys_unlink , "($)i" ),
519+ REG_NATIVE_FUNC (__sys_getcwd , "(*~)i" ),
520+ REG_NATIVE_FUNC (__sys_uname , "(*)i" ),
521+ REG_NATIVE_FUNC (emscripten_notify_memory_growth , "(i)" ),
380522#endif /* end of BH_PLATFORM_LINUX_SGX */
381523};
382524
0 commit comments