wasi_wrapper.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "wasm_native.h"
  6. #include "wasm_export.h"
  7. #include "wasm_log.h"
  8. #include "wasm_platform_log.h"
  9. #if WASM_ENABLE_WASI != 0
  10. #include "wasi_wrapper.h"
  11. #endif
  12. #include "bh_common.h"
  13. void
  14. wasm_runtime_set_exception(wasm_module_inst_t module, const char *exception);
  15. #define get_wasi_ctx(module_inst) \
  16. wasm_runtime_get_wasi_ctx(module_inst)
  17. #define validate_app_addr(offset, size) \
  18. wasm_runtime_validate_app_addr(module_inst, offset, size)
  19. #define addr_app_to_native(offset) \
  20. wasm_runtime_addr_app_to_native(module_inst, offset)
  21. #define addr_native_to_app(ptr) \
  22. wasm_runtime_addr_native_to_app(module_inst, ptr)
  23. #define module_malloc(size) \
  24. wasm_runtime_module_malloc(module_inst, size)
  25. #define module_free(offset) \
  26. wasm_runtime_module_free(module_inst, offset)
  27. #if WASM_ENABLE_WASI != 0
  28. #define WASI_CHECK_ERR() do { \
  29. if (err) { \
  30. return err; \
  31. } \
  32. } while (0)
  33. typedef struct wasi_prestat_app {
  34. wasi_preopentype_t pr_type;
  35. uint32 pr_name_len;
  36. } wasi_prestat_app_t;
  37. typedef struct iovec_app {
  38. int32 buf_offset;
  39. uint32 buf_len;
  40. } iovec_app_t;
  41. typedef struct WASIContext {
  42. void *curfds;
  43. void *prestats;
  44. void *argv_environ;
  45. } *wasi_ctx_t;
  46. wasi_ctx_t
  47. wasm_runtime_get_wasi_ctx(wasm_module_inst_t module_inst);
  48. static wasi_errno_t
  49. wasi_args_get(wasm_module_inst_t module_inst,
  50. int32 argv_offset /* char ** */,
  51. int32 argv_buf_offset /* char * */)
  52. {
  53. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  54. size_t argc, argv_buf_size, i;
  55. uint64 total_size1, total_size2;
  56. int32 *argv_app;
  57. char *argv_buf_app;
  58. wasi_errno_t err;
  59. char **argv;
  60. err = wasmtime_ssp_args_sizes_get(wasi_ctx->argv_environ,
  61. &argc, &argv_buf_size);
  62. WASI_CHECK_ERR();
  63. total_size1 = sizeof(char *) * ((uint64)argc + 1);
  64. total_size2 = sizeof(char) * (uint64)argv_buf_size;
  65. if (total_size1 >= UINT32_MAX
  66. || !validate_app_addr(argv_offset, (uint32)total_size1)
  67. || total_size2 >= UINT32_MAX
  68. || !validate_app_addr(argv_buf_offset, (uint32)total_size2))
  69. return (wasi_errno_t)-1;
  70. argv = bh_malloc((uint32)total_size1);
  71. if (!argv)
  72. return (wasi_errno_t)-1;
  73. argv_app = (int32*)addr_app_to_native(argv_offset);
  74. argv_buf_app= (char*)addr_app_to_native(argv_buf_offset);
  75. err = wasmtime_ssp_args_get(wasi_ctx->argv_environ,
  76. argv, argv_buf_app);
  77. if (err)
  78. goto fail;
  79. for (i = 0; i < argc; i++)
  80. argv_app[i] = addr_native_to_app(argv[i]);
  81. argv_app[argc] = 0;
  82. /* success */
  83. err = 0;
  84. fail:
  85. bh_free(argv);
  86. return err;
  87. }
  88. static wasi_errno_t
  89. wasi_args_sizes_get(wasm_module_inst_t module_inst,
  90. int32 argc_offset /* size_t * */,
  91. int32 argv_buf_size_offset /* size_t * */)
  92. {
  93. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  94. size_t argc, argv_buf_size;
  95. uint32 *argc_app, *argv_buf_size_app;
  96. wasi_errno_t err;
  97. if (!validate_app_addr(argc_offset, sizeof(uint32))
  98. || !validate_app_addr(argv_buf_size_offset, sizeof(uint32)))
  99. return (wasi_errno_t)-1;
  100. argc_app = (uint32*)addr_app_to_native(argc_offset);
  101. argv_buf_size_app = (uint32*)addr_app_to_native(argv_buf_size_offset);
  102. err = wasmtime_ssp_args_sizes_get(wasi_ctx->argv_environ,
  103. &argc, &argv_buf_size);
  104. WASI_CHECK_ERR();
  105. *(uint32*)argc_app = (uint32)argc;
  106. *(uint32*)argv_buf_size_app = (uint32)argv_buf_size;
  107. return 0;
  108. }
  109. static wasi_errno_t
  110. wasi_clock_res_get(wasm_module_inst_t module_inst,
  111. wasi_clockid_t clock_id,
  112. int32 resolution_offset /* wasi_timestamp_t * */)
  113. {
  114. wasi_timestamp_t resolution;
  115. uint32 *resolution_app;
  116. wasi_errno_t err;
  117. if (!validate_app_addr(resolution_offset, sizeof(wasi_timestamp_t)))
  118. return (wasi_errno_t)-1;
  119. err = wasmtime_ssp_clock_res_get(clock_id, &resolution);
  120. WASI_CHECK_ERR();
  121. resolution_app = addr_app_to_native(resolution_offset);
  122. memcpy(resolution_app, &resolution, sizeof(wasi_timestamp_t));
  123. return 0;
  124. }
  125. static wasi_errno_t
  126. wasi_clock_time_get(wasm_module_inst_t module_inst,
  127. wasi_clockid_t clock_id,
  128. wasi_timestamp_t precision,
  129. int32 time_offset /*wasi_timestamp_t * */)
  130. {
  131. wasi_timestamp_t time;
  132. uint32 *time_app;
  133. wasi_errno_t err;
  134. if (!validate_app_addr(time_offset, sizeof(wasi_timestamp_t)))
  135. return (wasi_errno_t)-1;
  136. err = wasmtime_ssp_clock_time_get(clock_id, precision, &time);
  137. WASI_CHECK_ERR();
  138. time_app = addr_app_to_native(time_offset);
  139. memcpy(time_app, &time, sizeof(wasi_timestamp_t));
  140. return 0;
  141. }
  142. static wasi_errno_t
  143. wasi_environ_get(wasm_module_inst_t module_inst,
  144. int32 environ_offset /* char ** */,
  145. int32 environ_buf_offset /* char */)
  146. {
  147. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  148. size_t environ_count, environ_buf_size, i;
  149. uint64 total_size;
  150. int32 *environ_app;
  151. char *environ_buff_app;
  152. char **environ;
  153. wasi_errno_t err;
  154. err = wasmtime_ssp_environ_sizes_get(wasi_ctx->argv_environ,
  155. &environ_count, &environ_buf_size);
  156. WASI_CHECK_ERR();
  157. total_size = sizeof(uint32) * ((uint64)environ_count + 1);
  158. if (total_size >= UINT32_MAX
  159. || !validate_app_addr(environ_offset, (uint32)total_size)
  160. || environ_buf_size >= UINT32_MAX
  161. || !validate_app_addr(environ_buf_offset, (uint32)environ_buf_size))
  162. return (wasi_errno_t)-1;
  163. environ_app = (int32*)addr_app_to_native(environ_offset);
  164. environ_buff_app = (char*)addr_app_to_native(environ_buf_offset);
  165. environ = bh_malloc((uint32)total_size);
  166. if (!environ)
  167. return (wasi_errno_t)-1;
  168. err = wasmtime_ssp_environ_get(wasi_ctx->argv_environ,
  169. environ, environ_buff_app);
  170. if (err)
  171. goto fail;
  172. for (i = 0; i < environ_count; i++)
  173. environ_app[i] = addr_native_to_app(environ[i]);
  174. environ_app[environ_count] = 0;
  175. /* success */
  176. err = 0;
  177. fail:
  178. bh_free(environ);
  179. return err;
  180. }
  181. static wasi_errno_t
  182. wasi_environ_sizes_get(wasm_module_inst_t module_inst,
  183. int32 environ_count_offset /* size_t * */,
  184. int32 environ_buf_size_offset /* size_t * */)
  185. {
  186. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  187. size_t environ_count, environ_buf_size;
  188. uint32 *environ_count_app, *environ_buf_size_app;
  189. wasi_errno_t err;
  190. if (!validate_app_addr(environ_count_offset, sizeof(uint32))
  191. || !validate_app_addr(environ_buf_size_offset, sizeof(uint32)))
  192. return (wasi_errno_t)-1;
  193. err = wasmtime_ssp_environ_sizes_get(wasi_ctx->argv_environ,
  194. &environ_count, &environ_buf_size);
  195. WASI_CHECK_ERR();
  196. environ_count_app = (uint32*)addr_app_to_native(environ_count_offset);
  197. environ_buf_size_app = (uint32*)addr_app_to_native(environ_buf_size_offset);
  198. *(uint32*)environ_count_app = (uint32)environ_count;
  199. *(uint32*)environ_buf_size_app = (uint32)environ_buf_size;
  200. return 0;
  201. }
  202. static wasi_errno_t
  203. wasi_fd_prestat_get(wasm_module_inst_t module_inst,
  204. wasi_fd_t fd,
  205. int32 buf_offset /* wasi_prestat_t * */)
  206. {
  207. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  208. wasi_prestat_app_t *prestat_app;
  209. wasi_prestat_t prestat;
  210. wasi_errno_t err;
  211. if (!validate_app_addr(buf_offset, sizeof(wasi_prestat_app_t)))
  212. return (wasi_errno_t)-1;
  213. err = wasmtime_ssp_fd_prestat_get(wasi_ctx->prestats, fd, &prestat);
  214. WASI_CHECK_ERR();
  215. prestat_app = (wasi_prestat_app_t*)addr_app_to_native(buf_offset);
  216. prestat_app->pr_type = prestat.pr_type;
  217. prestat_app->pr_name_len = (uint32)prestat.u.dir.pr_name_len;
  218. return 0;
  219. }
  220. static wasi_errno_t
  221. wasi_fd_prestat_dir_name(wasm_module_inst_t module_inst,
  222. wasi_fd_t fd,
  223. int32 path_offset /* char * */,
  224. uint32 path_len)
  225. {
  226. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  227. char *path_app;
  228. if (!validate_app_addr(path_offset, path_len))
  229. return (wasi_errno_t)-1;
  230. path_app = (char*)addr_app_to_native(path_offset);
  231. return wasmtime_ssp_fd_prestat_dir_name(wasi_ctx->prestats, fd,
  232. path_app, path_len);
  233. }
  234. static wasi_errno_t
  235. wasi_fd_close(wasm_module_inst_t module_inst, wasi_fd_t fd)
  236. {
  237. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  238. return wasmtime_ssp_fd_close(wasi_ctx->curfds, wasi_ctx->prestats, fd);
  239. }
  240. static wasi_errno_t
  241. wasi_fd_datasync(wasm_module_inst_t module_inst, wasi_fd_t fd)
  242. {
  243. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  244. return wasmtime_ssp_fd_datasync(wasi_ctx->curfds, fd);
  245. }
  246. static wasi_errno_t
  247. wasi_fd_pread(wasm_module_inst_t module_inst,
  248. wasi_fd_t fd,
  249. int32 iovs_offset /* const wasi_iovec_t * */,
  250. uint32 iovs_len,
  251. wasi_filesize_t offset,
  252. int32 nread_offset /* size_t * */)
  253. {
  254. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  255. int32 mem;
  256. wasi_iovec_t *iovec, *iovec_begin;
  257. iovec_app_t *iovec_app;
  258. uint32 i;
  259. size_t nread;
  260. uint32 *nread_app;
  261. uint64 total_size;
  262. wasi_errno_t err;
  263. total_size = sizeof(iovec_app_t) * (uint64)iovs_len;
  264. if (!validate_app_addr(nread_offset, (uint32)sizeof(uint32))
  265. || total_size >= UINT32_MAX
  266. || !validate_app_addr(iovs_offset, (uint32)total_size))
  267. return (wasi_errno_t)-1;
  268. iovec_app = (iovec_app_t*)addr_app_to_native(iovs_offset);
  269. if (!iovec_app)
  270. return (wasi_errno_t)-1;
  271. total_size = sizeof(wasi_iovec_t) * (uint64)iovs_len;
  272. if (total_size >= UINT32_MAX
  273. || !(mem = module_malloc((uint32)total_size)))
  274. return (wasi_errno_t)-1;
  275. iovec = iovec_begin = (wasi_iovec_t*)addr_app_to_native(mem);
  276. for (i = 0; i < iovs_len; i++, iovec_app++, iovec++) {
  277. if (!validate_app_addr(iovec_app->buf_offset, iovec_app->buf_len)) {
  278. err = (wasi_errno_t)-1;
  279. goto fail;
  280. }
  281. iovec->buf = (void*)addr_app_to_native(iovec_app->buf_offset);
  282. iovec->buf_len = iovec_app->buf_len;
  283. }
  284. err = wasmtime_ssp_fd_pread(wasi_ctx->curfds, fd, iovec_begin,
  285. iovs_len, offset, &nread);
  286. if (err)
  287. goto fail;
  288. nread_app = (uint32*)addr_app_to_native(nread_offset);
  289. *(uint32*)nread_app = (uint32)nread;
  290. /* success */
  291. err = 0;
  292. fail:
  293. module_free(mem);
  294. return err;
  295. }
  296. static wasi_errno_t
  297. wasi_fd_pwrite(wasm_module_inst_t module_inst,
  298. wasi_fd_t fd,
  299. int32 iovs_offset /* const wasi_ciovec_t * */,
  300. uint32 iovs_len,
  301. wasi_filesize_t offset,
  302. int32 nwritten_offset /* size_t * */)
  303. {
  304. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  305. int32 mem;
  306. wasi_ciovec_t *ciovec, *ciovec_begin;
  307. iovec_app_t *ciovec_app;
  308. uint32 i;
  309. size_t nwritten;
  310. uint32 *nwritten_app;
  311. uint64 total_size;
  312. wasi_errno_t err;
  313. total_size = sizeof(iovec_app_t) * (uint64)iovs_len;
  314. if (!validate_app_addr(nwritten_offset, (uint32)sizeof(uint32))
  315. || total_size >= UINT32_MAX
  316. || !validate_app_addr(iovs_offset, (uint32)total_size))
  317. return (wasi_errno_t)-1;
  318. ciovec_app = (iovec_app_t*)addr_app_to_native(iovs_offset);
  319. total_size = sizeof(wasi_ciovec_t) * (uint64)iovs_len;
  320. if (total_size >= UINT32_MAX
  321. || !(mem = module_malloc((uint32)total_size)))
  322. return (wasi_errno_t)-1;
  323. ciovec_begin = ciovec = (wasi_ciovec_t*)addr_app_to_native(mem);
  324. for (i = 0; i < iovs_len; i++, ciovec_app++, ciovec++) {
  325. if (!validate_app_addr(ciovec_app->buf_offset, ciovec_app->buf_len)) {
  326. err = (wasi_errno_t)-1;
  327. goto fail;
  328. }
  329. ciovec->buf = (char*)addr_app_to_native(ciovec_app->buf_offset);
  330. ciovec->buf_len = ciovec_app->buf_len;
  331. }
  332. err = wasmtime_ssp_fd_pwrite(wasi_ctx->curfds, fd, ciovec_begin,
  333. iovs_len, offset, &nwritten);
  334. if (err)
  335. goto fail;
  336. nwritten_app = (uint32*)addr_app_to_native(nwritten_offset);
  337. *(uint32*)nwritten_app = (uint32)nwritten;
  338. /* success */
  339. err = 0;
  340. fail:
  341. module_free(mem);
  342. return err;
  343. }
  344. static wasi_errno_t
  345. wasi_fd_read(wasm_module_inst_t module_inst,
  346. wasi_fd_t fd,
  347. int32 iovs_offset /* const wasi_iovec_t * */,
  348. uint32 iovs_len,
  349. int32 nread_offset /* size_t * */)
  350. {
  351. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  352. int32 mem;
  353. wasi_iovec_t *iovec, *iovec_begin;
  354. iovec_app_t *iovec_app;
  355. uint32 i;
  356. size_t nread;
  357. uint32 *nread_app;
  358. uint64 total_size;
  359. wasi_errno_t err;
  360. total_size = sizeof(iovec_app_t) * (uint64)iovs_len;
  361. if (!validate_app_addr(nread_offset, (uint32)sizeof(uint32))
  362. || total_size >= UINT32_MAX
  363. || !validate_app_addr(iovs_offset, (uint32)total_size))
  364. return (wasi_errno_t)-1;
  365. iovec_app = (iovec_app_t*)addr_app_to_native(iovs_offset);
  366. total_size = sizeof(wasi_iovec_t) * (uint64)iovs_len;
  367. if (total_size >= UINT32_MAX
  368. || !(mem = module_malloc((uint32)total_size)))
  369. return (wasi_errno_t)-1;
  370. iovec = iovec_begin = (wasi_iovec_t*)addr_app_to_native(mem);
  371. for (i = 0; i < iovs_len; i++, iovec_app++, iovec++) {
  372. if (!validate_app_addr(iovec_app->buf_offset, iovec_app->buf_len)) {
  373. err = (wasi_errno_t)-1;
  374. goto fail;
  375. }
  376. iovec->buf = (void*)addr_app_to_native(iovec_app->buf_offset);
  377. iovec->buf_len = iovec_app->buf_len;
  378. }
  379. err = wasmtime_ssp_fd_read(wasi_ctx->curfds, fd,
  380. iovec_begin, iovs_len, &nread);
  381. if (err)
  382. goto fail;
  383. nread_app = (uint32*)addr_app_to_native(nread_offset);
  384. *(uint32*)nread_app = (uint32)nread;
  385. /* success */
  386. err = 0;
  387. fail:
  388. module_free(mem);
  389. return err;
  390. }
  391. static wasi_errno_t
  392. wasi_fd_renumber(wasm_module_inst_t module_inst,
  393. wasi_fd_t from, wasi_fd_t to)
  394. {
  395. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  396. return wasmtime_ssp_fd_renumber(wasi_ctx->curfds,
  397. wasi_ctx->prestats, from, to);
  398. }
  399. static wasi_errno_t
  400. wasi_fd_seek(wasm_module_inst_t module_inst,
  401. wasi_fd_t fd,
  402. wasi_filedelta_t offset,
  403. wasi_whence_t whence,
  404. int32 newoffset_offset /* wasi_filesize_t * */)
  405. {
  406. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  407. size_t newoffset;
  408. uint64 *newoffset_app;
  409. wasi_errno_t err;
  410. if (!validate_app_addr(newoffset_offset, sizeof(uint64)))
  411. return (wasi_errno_t)-1;
  412. err = wasmtime_ssp_fd_seek(wasi_ctx->curfds, fd,
  413. offset, whence, &newoffset);
  414. WASI_CHECK_ERR();
  415. newoffset_app = (uint64*)addr_app_to_native(newoffset_offset);
  416. *(uint64*)newoffset_app = (uint64)newoffset;
  417. return 0;
  418. }
  419. static wasi_errno_t
  420. wasi_fd_tell(wasm_module_inst_t module_inst,
  421. wasi_fd_t fd,
  422. int32 newoffset_offset /* wasi_filesize_t * */)
  423. {
  424. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  425. size_t newoffset;
  426. uint64 *newoffset_app;
  427. wasi_errno_t err;
  428. if (!validate_app_addr(newoffset_offset, sizeof(uint64)))
  429. return (wasi_errno_t)-1;
  430. err = wasmtime_ssp_fd_tell(wasi_ctx->curfds, fd, &newoffset);
  431. WASI_CHECK_ERR();
  432. newoffset_app = (uint64*)addr_app_to_native(newoffset_offset);
  433. *(uint64*)newoffset_app = (uint64)newoffset;
  434. return 0;
  435. }
  436. static wasi_errno_t
  437. wasi_fd_fdstat_get(wasm_module_inst_t module_inst,
  438. wasi_fd_t fd,
  439. int32 buf_offset /* wasi_fdstat_t * */)
  440. {
  441. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  442. wasi_fdstat_t fdstat, *fdstat_app;
  443. wasi_errno_t err;
  444. if (!validate_app_addr(buf_offset, sizeof(wasi_fdstat_t)))
  445. return (wasi_errno_t)-1;
  446. err = wasmtime_ssp_fd_fdstat_get(wasi_ctx->curfds, fd, &fdstat);
  447. WASI_CHECK_ERR();
  448. fdstat_app = (wasi_fdstat_t*)addr_app_to_native(buf_offset);
  449. memcpy(fdstat_app, &fdstat, sizeof(wasi_fdstat_t));
  450. return 0;
  451. }
  452. static wasi_errno_t
  453. wasi_fd_fdstat_set_flags(wasm_module_inst_t module_inst,
  454. wasi_fd_t fd,
  455. wasi_fdflags_t flags)
  456. {
  457. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  458. return wasmtime_ssp_fd_fdstat_set_flags(wasi_ctx->curfds, fd, flags);
  459. }
  460. static wasi_errno_t
  461. wasi_fd_fdstat_set_rights(wasm_module_inst_t module_inst,
  462. wasi_fd_t fd,
  463. wasi_rights_t fs_rights_base,
  464. wasi_rights_t fs_rights_inheriting)
  465. {
  466. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  467. return wasmtime_ssp_fd_fdstat_set_rights(wasi_ctx->curfds, fd,
  468. fs_rights_base, fs_rights_inheriting);
  469. }
  470. static wasi_errno_t
  471. wasi_fd_sync(wasm_module_inst_t module_inst, wasi_fd_t fd)
  472. {
  473. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  474. return wasmtime_ssp_fd_sync(wasi_ctx->curfds, fd);
  475. }
  476. static wasi_errno_t
  477. wasi_fd_write(wasm_module_inst_t module_inst,
  478. wasi_fd_t fd,
  479. int32 iovs_offset /* const wasi_ciovec_t * */,
  480. uint32 iovs_len,
  481. int32 nwritten_offset /* size_t * */)
  482. {
  483. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  484. int32 mem;
  485. wasi_ciovec_t *ciovec, *ciovec_begin;
  486. iovec_app_t *ciovec_app;
  487. uint32 i;
  488. size_t nwritten;
  489. uint32 *nwritten_app;
  490. uint64 total_size;
  491. wasi_errno_t err;
  492. total_size = sizeof(iovec_app_t) * (uint64)iovs_len;
  493. if (!validate_app_addr(nwritten_offset, (uint32)sizeof(uint32))
  494. || total_size >= UINT32_MAX
  495. || !validate_app_addr(iovs_offset, (uint32)total_size))
  496. return (wasi_errno_t)-1;
  497. ciovec_app = (iovec_app_t*)addr_app_to_native(iovs_offset);
  498. total_size = sizeof(wasi_ciovec_t) * (uint64)iovs_len;
  499. if (total_size >= UINT32_MAX
  500. || !(mem = module_malloc((uint32)total_size)))
  501. return (wasi_errno_t)-1;
  502. ciovec_begin = ciovec = (wasi_ciovec_t*)addr_app_to_native(mem);
  503. for (i = 0; i < iovs_len; i++, ciovec_app++, ciovec++) {
  504. if (!validate_app_addr(ciovec_app->buf_offset, ciovec_app->buf_len)) {
  505. err = (wasi_errno_t)-1;
  506. goto fail;
  507. }
  508. ciovec->buf = (char*)addr_app_to_native(ciovec_app->buf_offset);
  509. ciovec->buf_len = ciovec_app->buf_len;
  510. }
  511. err = wasmtime_ssp_fd_write(wasi_ctx->curfds, fd,
  512. ciovec_begin, iovs_len, &nwritten);
  513. if (err)
  514. goto fail;
  515. nwritten_app = (uint32*)addr_app_to_native(nwritten_offset);
  516. *(uint32*)nwritten_app = (uint32)nwritten;
  517. /* success */
  518. err = 0;
  519. fail:
  520. module_free(mem);
  521. return err;
  522. }
  523. static wasi_errno_t
  524. wasi_fd_advise(wasm_module_inst_t module_inst,
  525. wasi_fd_t fd,
  526. wasi_filesize_t offset,
  527. wasi_filesize_t len,
  528. wasi_advice_t advice)
  529. {
  530. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  531. return wasmtime_ssp_fd_advise(wasi_ctx->curfds, fd, offset, len, advice);
  532. }
  533. static wasi_errno_t
  534. wasi_fd_allocate(wasm_module_inst_t module_inst,
  535. wasi_fd_t fd,
  536. wasi_filesize_t offset,
  537. wasi_filesize_t len)
  538. {
  539. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  540. return wasmtime_ssp_fd_allocate(wasi_ctx->curfds, fd, offset, len);
  541. }
  542. static wasi_errno_t
  543. wasi_path_create_directory(wasm_module_inst_t module_inst,
  544. wasi_fd_t fd,
  545. int32 path_offset /* const char * */,
  546. uint32 path_len)
  547. {
  548. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  549. char *path;
  550. if (!validate_app_addr(path_offset, path_len))
  551. return (wasi_errno_t)-1;
  552. path = (char*)addr_app_to_native(path_offset);
  553. return wasmtime_ssp_path_create_directory(wasi_ctx->curfds, fd,
  554. path, path_len);
  555. }
  556. static wasi_errno_t
  557. wasi_path_link(wasm_module_inst_t module_inst,
  558. wasi_fd_t old_fd,
  559. wasi_lookupflags_t old_flags,
  560. int32 old_path_offset /* const char * */,
  561. uint32 old_path_len,
  562. wasi_fd_t new_fd,
  563. int32 new_path_offset /* const char * */,
  564. uint32 new_path_len)
  565. {
  566. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  567. char *old_path, *new_path;
  568. if (!validate_app_addr(old_path_offset, old_path_len)
  569. || !validate_app_addr(new_path_offset, new_path_len))
  570. return (wasi_errno_t)-1;
  571. old_path = (char*)addr_app_to_native(old_path_offset);
  572. new_path = (char*)addr_app_to_native(new_path_offset);
  573. return wasmtime_ssp_path_link(wasi_ctx->curfds, old_fd,
  574. old_flags, old_path, old_path_len,
  575. new_fd, new_path, new_path_len);
  576. }
  577. static wasi_errno_t
  578. wasi_path_open(wasm_module_inst_t module_inst,
  579. wasi_fd_t dirfd,
  580. wasi_lookupflags_t dirflags,
  581. int32 path_offset /* const char * */,
  582. uint32 path_len,
  583. wasi_oflags_t oflags,
  584. wasi_rights_t fs_rights_base,
  585. wasi_rights_t fs_rights_inheriting,
  586. wasi_fdflags_t fs_flags,
  587. int32 fd_offset /* wasi_fd_t * */)
  588. {
  589. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  590. char *path;
  591. wasi_fd_t fd = (wasi_fd_t)-1;
  592. uint32 *fd_app;
  593. wasi_errno_t err;
  594. if (!validate_app_addr(path_offset, path_len)
  595. || !validate_app_addr(fd_offset, 1))
  596. return (wasi_errno_t)-1;
  597. path = (char*)addr_app_to_native(path_offset);
  598. err = wasmtime_ssp_path_open(wasi_ctx->curfds,
  599. dirfd, dirflags,
  600. path, path_len,
  601. oflags,
  602. fs_rights_base,
  603. fs_rights_inheriting,
  604. fs_flags,
  605. &fd);
  606. fd_app = (wasi_fd_t*)addr_app_to_native(fd_offset);
  607. *fd_app = (uint32)fd;
  608. WASI_CHECK_ERR();
  609. return 0;
  610. }
  611. static wasi_errno_t
  612. wasi_fd_readdir(wasm_module_inst_t module_inst,
  613. wasi_fd_t fd,
  614. int32 buf_offset /* void *buf */,
  615. uint32 buf_len,
  616. wasi_dircookie_t cookie,
  617. int32 bufused_offset /* size_t * */)
  618. {
  619. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  620. void *buf;
  621. size_t bufused;
  622. uint32 *bufused_app;
  623. wasi_errno_t err;
  624. if (!validate_app_addr(buf_offset, buf_len)
  625. || !validate_app_addr(bufused_offset, sizeof(uint32)))
  626. return (wasi_errno_t)-1;
  627. buf = (void*)addr_app_to_native(buf_offset);
  628. err = wasmtime_ssp_fd_readdir(wasi_ctx->curfds, fd,
  629. buf, buf_len, cookie, &bufused);
  630. WASI_CHECK_ERR();
  631. bufused_app = (uint32*)addr_app_to_native(bufused_offset);
  632. *(uint32*)bufused_app = (uint32)bufused;
  633. return 0;
  634. }
  635. static wasi_errno_t
  636. wasi_path_readlink(wasm_module_inst_t module_inst,
  637. wasi_fd_t fd,
  638. int32 path_offset /* const char * */,
  639. uint32 path_len,
  640. int32 buf_offset /* char * */,
  641. uint32 buf_len,
  642. int32 bufused_offset /* size_t * */)
  643. {
  644. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  645. char *path, *buf;
  646. size_t bufused;
  647. uint32 *bufused_app;
  648. wasi_errno_t err;
  649. if (!validate_app_addr(path_offset, path_len)
  650. || !validate_app_addr(buf_offset, buf_len)
  651. || !validate_app_addr(bufused_offset, sizeof(uint32)))
  652. return (wasi_errno_t)-1;
  653. path = (char*)addr_app_to_native(path_offset);
  654. buf = (char*)addr_app_to_native(buf_offset);
  655. err = wasmtime_ssp_path_readlink(wasi_ctx->curfds, fd,
  656. path, path_len, buf,
  657. buf_len, &bufused);
  658. WASI_CHECK_ERR();
  659. bufused_app = (uint32*)addr_app_to_native(bufused_offset);
  660. *(uint32*)bufused_app = (uint32)bufused;
  661. return 0;
  662. }
  663. static wasi_errno_t
  664. wasi_path_rename(wasm_module_inst_t module_inst,
  665. wasi_fd_t old_fd,
  666. int32 old_path_offset /* const char * */,
  667. uint32 old_path_len,
  668. wasi_fd_t new_fd,
  669. int32 new_path_offset /* const char * */,
  670. uint32 new_path_len)
  671. {
  672. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  673. char *old_path, *new_path;
  674. if (!validate_app_addr(old_path_offset, old_path_len)
  675. || !validate_app_addr(new_path_offset, new_path_len))
  676. return (wasi_errno_t)-1;
  677. old_path = (char*)addr_app_to_native(old_path_offset);
  678. new_path = (char*)addr_app_to_native(new_path_offset);
  679. return wasmtime_ssp_path_rename(wasi_ctx->curfds, old_fd,
  680. old_path, old_path_len,
  681. new_fd, new_path,
  682. new_path_len);
  683. }
  684. static wasi_errno_t
  685. wasi_fd_filestat_get(wasm_module_inst_t module_inst,
  686. wasi_fd_t fd,
  687. int32 buf_offset /* wasi_filestat_t * */)
  688. {
  689. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  690. wasi_filestat_t filestat, *filestat_app;
  691. wasi_errno_t err;
  692. if (!validate_app_addr(buf_offset, sizeof(wasi_filestat_t)))
  693. return (wasi_errno_t)-1;
  694. err = wasmtime_ssp_fd_filestat_get(wasi_ctx->curfds, fd, &filestat);
  695. WASI_CHECK_ERR();
  696. filestat_app = (wasi_filestat_t*)addr_app_to_native(buf_offset);
  697. memcpy(filestat_app, &filestat, sizeof(wasi_filestat_t));
  698. return 0;
  699. }
  700. static wasi_errno_t
  701. wasi_fd_filestat_set_times(wasm_module_inst_t module_inst,
  702. wasi_fd_t fd,
  703. wasi_timestamp_t st_atim,
  704. wasi_timestamp_t st_mtim,
  705. wasi_fstflags_t fstflags)
  706. {
  707. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  708. return wasmtime_ssp_fd_filestat_set_times(wasi_ctx->curfds, fd,
  709. st_atim, st_mtim, fstflags);
  710. }
  711. static wasi_errno_t
  712. wasi_fd_filestat_set_size(wasm_module_inst_t module_inst,
  713. wasi_fd_t fd,
  714. wasi_filesize_t st_size)
  715. {
  716. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  717. return wasmtime_ssp_fd_filestat_set_size(wasi_ctx->curfds, fd, st_size);
  718. }
  719. static wasi_errno_t
  720. wasi_path_filestat_get(wasm_module_inst_t module_inst,
  721. wasi_fd_t fd,
  722. wasi_lookupflags_t flags,
  723. int32 path_offset /* const char * */,
  724. uint32 path_len,
  725. int32 buf_offset /* wasi_filestat_t * */)
  726. {
  727. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  728. char *path;
  729. wasi_filestat_t filestat, *filestat_app;
  730. wasi_errno_t err;
  731. if (!validate_app_addr(path_offset, path_len)
  732. || !validate_app_addr(buf_offset, sizeof(wasi_filestat_t)))
  733. return (wasi_errno_t)-1;
  734. path = (char*)addr_app_to_native(path_offset);
  735. err = wasmtime_ssp_path_filestat_get(wasi_ctx->curfds, fd,
  736. flags, path, path_len, &filestat);
  737. WASI_CHECK_ERR();
  738. filestat_app = (wasi_filestat_t*)addr_app_to_native(buf_offset);
  739. memcpy(filestat_app, &filestat, sizeof(wasi_filestat_t));
  740. return 0;
  741. }
  742. static wasi_errno_t
  743. wasi_path_filestat_set_times(wasm_module_inst_t module_inst,
  744. wasi_fd_t fd,
  745. wasi_lookupflags_t flags,
  746. int32 path_offset /* const char * */,
  747. uint32 path_len,
  748. wasi_timestamp_t st_atim,
  749. wasi_timestamp_t st_mtim,
  750. wasi_fstflags_t fstflags)
  751. {
  752. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  753. char *path;
  754. if (!validate_app_addr(path_offset, path_len))
  755. return (wasi_errno_t)-1;
  756. path = (char*)addr_app_to_native(path_offset);
  757. return wasmtime_ssp_path_filestat_set_times(wasi_ctx->curfds, fd,
  758. flags, path, path_len,
  759. st_atim, st_mtim, fstflags);
  760. }
  761. static wasi_errno_t
  762. wasi_path_symlink(wasm_module_inst_t module_inst,
  763. int32 old_path_offset /* const char * */,
  764. uint32 old_path_len,
  765. wasi_fd_t fd,
  766. int32 new_path_offset /* const char * */,
  767. uint32 new_path_len)
  768. {
  769. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  770. char *old_path, *new_path;
  771. if (!validate_app_addr(old_path_offset, old_path_len)
  772. || !validate_app_addr(new_path_offset, new_path_len))
  773. return (wasi_errno_t)-1;
  774. old_path = (char*)addr_app_to_native(old_path_offset);
  775. new_path = (char*)addr_app_to_native(new_path_offset);
  776. return wasmtime_ssp_path_symlink(wasi_ctx->curfds, old_path,
  777. old_path_len, fd, new_path,
  778. new_path_len);
  779. }
  780. static wasi_errno_t
  781. wasi_path_unlink_file(wasm_module_inst_t module_inst,
  782. wasi_fd_t fd,
  783. int32 path_offset /* const char * */,
  784. uint32 path_len)
  785. {
  786. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  787. char *path;
  788. if (!validate_app_addr(path_offset, path_len))
  789. return (wasi_errno_t)-1;
  790. path = (char*)addr_app_to_native(path_offset);
  791. return wasmtime_ssp_path_unlink_file(wasi_ctx->curfds, fd, path, path_len);
  792. }
  793. static wasi_errno_t
  794. wasi_path_remove_directory(wasm_module_inst_t module_inst,
  795. wasi_fd_t fd,
  796. int32 path_offset /* const char * */,
  797. uint32 path_len)
  798. {
  799. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  800. char *path;
  801. if (!validate_app_addr(path_offset, path_len))
  802. return (wasi_errno_t)-1;
  803. path = (char*)addr_app_to_native(path_offset);
  804. return wasmtime_ssp_path_remove_directory(wasi_ctx->curfds, fd, path, path_len);
  805. }
  806. static wasi_errno_t
  807. wasi_poll_oneoff(wasm_module_inst_t module_inst,
  808. int32 in_offset /* const wasi_subscription_t * */,
  809. int32 out_offset /* wasi_event_t * */,
  810. uint32 nsubscriptions,
  811. int32 nevents_offset /* size_t * */)
  812. {
  813. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  814. wasi_subscription_t *in;
  815. wasi_event_t *out;
  816. size_t nevents;
  817. uint32 *nevents_app;
  818. wasi_errno_t err;
  819. if (!validate_app_addr(in_offset, sizeof(wasi_subscription_t))
  820. || !validate_app_addr(out_offset, sizeof(wasi_event_t))
  821. || !validate_app_addr(nevents_offset, sizeof(uint32)))
  822. return (wasi_errno_t)-1;
  823. in = (wasi_subscription_t*)addr_app_to_native(in_offset);
  824. out = (wasi_event_t*)addr_app_to_native(out_offset);
  825. err = wasmtime_ssp_poll_oneoff(wasi_ctx->curfds, in, out, nsubscriptions, &nevents);
  826. WASI_CHECK_ERR();
  827. nevents_app = (uint32*)addr_app_to_native(nevents_offset);
  828. *(uint32*)nevents_app = (uint32)nevents;
  829. return 0;
  830. }
  831. void wasi_proc_exit(wasm_module_inst_t module_inst,
  832. wasi_exitcode_t rval)
  833. {
  834. wasm_runtime_set_exception(module_inst, "wasi proc exit");
  835. }
  836. static wasi_errno_t
  837. wasi_proc_raise(wasm_module_inst_t module_inst,
  838. wasi_signal_t sig)
  839. {
  840. char buf[32];
  841. snprintf(buf, sizeof(buf), "%s%d", "wasi proc raise ", sig);
  842. wasm_runtime_set_exception(module_inst, buf);
  843. return 0;
  844. }
  845. static wasi_errno_t
  846. wasi_random_get(wasm_module_inst_t module_inst,
  847. int32 buf_offset /* void * */,
  848. uint32 buf_len)
  849. {
  850. void *buf;
  851. if (!validate_app_addr(buf_offset, buf_len))
  852. return (wasi_errno_t)-1;
  853. buf = (void*)addr_app_to_native(buf_offset);
  854. return wasmtime_ssp_random_get(buf, buf_len);
  855. }
  856. static wasi_errno_t
  857. wasi_sock_recv(wasm_module_inst_t module_inst,
  858. wasi_fd_t sock,
  859. int32 ri_data_offset /* const wasi_iovec_t * */,
  860. uint32 ri_data_len,
  861. wasi_riflags_t ri_flags,
  862. int32 ro_datalen_offset /* size_t * */,
  863. int32 ro_flags_offset /* wasi_roflags_t * */)
  864. {
  865. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  866. wasi_iovec_t *iovec, *iovec_begin;
  867. int32 mem;
  868. iovec_app_t *ri_data_app;
  869. uint32 i;
  870. size_t ro_datalen;
  871. wasi_roflags_t ro_flags;
  872. uint32 *ro_datalen_app, *ro_flags_app;
  873. uint64 total_size;
  874. wasi_errno_t err;
  875. total_size = sizeof(iovec_app_t) * (uint64)ri_data_len;
  876. if (!validate_app_addr(ro_datalen_offset, (uint32)sizeof(uint32))
  877. || !validate_app_addr(ro_flags_offset, (uint32)sizeof(uint32))
  878. || total_size >= UINT32_MAX
  879. || !validate_app_addr(ri_data_offset, (uint32)total_size))
  880. return (wasi_errno_t)-1;
  881. ri_data_app = (iovec_app_t*)addr_app_to_native(ri_data_offset);
  882. total_size = sizeof(wasi_iovec_t) * (uint64)ri_data_len;
  883. if (total_size >= UINT32_MAX
  884. || !(mem = module_malloc((uint32)total_size)))
  885. return (wasi_errno_t)-1;
  886. iovec = iovec_begin = (wasi_iovec_t*)addr_app_to_native(mem);
  887. for (i = 0; i < ri_data_len; i++, ri_data_app++, iovec++) {
  888. if (!validate_app_addr(ri_data_app->buf_offset, ri_data_app->buf_len)) {
  889. err = (wasi_errno_t)-1;
  890. goto fail;
  891. }
  892. iovec->buf = (void*)addr_app_to_native(ri_data_app->buf_offset);
  893. iovec->buf_len = ri_data_app->buf_len;
  894. }
  895. err = wasmtime_ssp_sock_recv(wasi_ctx->curfds, sock,
  896. iovec_begin, ri_data_len,
  897. ri_flags, &ro_datalen,
  898. &ro_flags);
  899. if (err)
  900. goto fail;
  901. ro_datalen_app = (uint32*)addr_app_to_native(ro_datalen_offset);
  902. ro_flags_app = (uint32*)addr_app_to_native(ro_flags_offset);
  903. *(uint32*)ro_datalen_app = (uint32)ro_datalen;
  904. *(uint32*)ro_flags_app = (uint32)ro_flags;
  905. /* success */
  906. err = 0;
  907. fail:
  908. module_free(mem);
  909. return err;
  910. }
  911. static wasi_errno_t
  912. wasi_sock_send(wasm_module_inst_t module_inst,
  913. wasi_fd_t sock,
  914. int32 si_data_offset /* const wasi_ciovec_t * */,
  915. uint32 si_data_len,
  916. wasi_siflags_t si_flags,
  917. int32 so_datalen_offset /* size_t * */)
  918. {
  919. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  920. int32 mem;
  921. wasi_ciovec_t *ciovec, *ciovec_begin;
  922. iovec_app_t *si_data_app;
  923. uint32 i;
  924. size_t so_datalen;
  925. uint32 *so_datalen_app;
  926. uint64 total_size;
  927. wasi_errno_t err;
  928. total_size = sizeof(iovec_app_t) * (uint64)si_data_len;
  929. if (!validate_app_addr(so_datalen_offset, sizeof(uint32))
  930. || total_size >= UINT32_MAX
  931. || !validate_app_addr(si_data_offset, (uint32)total_size))
  932. return (wasi_errno_t)-1;
  933. si_data_app = (iovec_app_t*)addr_app_to_native(si_data_offset);
  934. total_size = sizeof(wasi_ciovec_t) * (uint64)si_data_len;
  935. if (total_size >= UINT32_MAX
  936. || !(mem = module_malloc((uint32)total_size)))
  937. return (wasi_errno_t)-1;
  938. ciovec_begin = ciovec = (wasi_ciovec_t*)addr_app_to_native(mem);
  939. for (i = 0; i < si_data_len; i++, si_data_app++, ciovec++) {
  940. if (!validate_app_addr(si_data_app->buf_offset, si_data_app->buf_len)) {
  941. err = (wasi_errno_t)-1;
  942. goto fail;
  943. }
  944. ciovec->buf = (char*)addr_app_to_native(si_data_app->buf_offset);
  945. ciovec->buf_len = si_data_app->buf_len;
  946. }
  947. err = wasmtime_ssp_sock_send(wasi_ctx->curfds, sock,
  948. ciovec_begin, si_data_len,
  949. si_flags, &so_datalen);
  950. if (err)
  951. goto fail;
  952. so_datalen_app = (uint32*)addr_app_to_native(so_datalen_offset);
  953. *(uint32*)so_datalen_app = (uint32)so_datalen;
  954. /* success */
  955. err = 0;
  956. fail:
  957. module_free(mem);
  958. return err;
  959. }
  960. static wasi_errno_t
  961. wasi_sock_shutdown(wasm_module_inst_t module_inst,
  962. wasi_fd_t sock, wasi_sdflags_t how)
  963. {
  964. wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
  965. return wasmtime_ssp_sock_shutdown(wasi_ctx->curfds, sock, how);
  966. }
  967. static wasi_errno_t
  968. wasi_sched_yield(wasm_module_inst_t module_inst)
  969. {
  970. return wasmtime_ssp_sched_yield();
  971. }
  972. #define REG_NATIVE_FUNC(func_name) \
  973. { "wasi_unstable", #func_name, wasi_##func_name }
  974. typedef struct WASMNativeFuncDef {
  975. const char *module_name;
  976. const char *func_name;
  977. void *func_ptr;
  978. } WASMNativeFuncDef;
  979. static WASMNativeFuncDef native_func_defs[] = {
  980. REG_NATIVE_FUNC(args_get),
  981. REG_NATIVE_FUNC(args_sizes_get),
  982. REG_NATIVE_FUNC(clock_res_get),
  983. REG_NATIVE_FUNC(clock_time_get),
  984. REG_NATIVE_FUNC(environ_get),
  985. REG_NATIVE_FUNC(environ_sizes_get),
  986. REG_NATIVE_FUNC(fd_prestat_get),
  987. REG_NATIVE_FUNC(fd_prestat_dir_name),
  988. REG_NATIVE_FUNC(fd_close),
  989. REG_NATIVE_FUNC(fd_datasync),
  990. REG_NATIVE_FUNC(fd_pread),
  991. REG_NATIVE_FUNC(fd_pwrite),
  992. REG_NATIVE_FUNC(fd_read),
  993. REG_NATIVE_FUNC(fd_renumber),
  994. REG_NATIVE_FUNC(fd_seek),
  995. REG_NATIVE_FUNC(fd_tell),
  996. REG_NATIVE_FUNC(fd_fdstat_get),
  997. REG_NATIVE_FUNC(fd_fdstat_set_flags),
  998. REG_NATIVE_FUNC(fd_fdstat_set_rights),
  999. REG_NATIVE_FUNC(fd_sync),
  1000. REG_NATIVE_FUNC(fd_write),
  1001. REG_NATIVE_FUNC(fd_advise),
  1002. REG_NATIVE_FUNC(fd_allocate),
  1003. REG_NATIVE_FUNC(path_create_directory),
  1004. REG_NATIVE_FUNC(path_link),
  1005. REG_NATIVE_FUNC(path_open),
  1006. REG_NATIVE_FUNC(fd_readdir),
  1007. REG_NATIVE_FUNC(path_readlink),
  1008. REG_NATIVE_FUNC(path_rename),
  1009. REG_NATIVE_FUNC(fd_filestat_get),
  1010. REG_NATIVE_FUNC(fd_filestat_set_times),
  1011. REG_NATIVE_FUNC(fd_filestat_set_size),
  1012. REG_NATIVE_FUNC(path_filestat_get),
  1013. REG_NATIVE_FUNC(path_filestat_set_times),
  1014. REG_NATIVE_FUNC(path_symlink),
  1015. REG_NATIVE_FUNC(path_unlink_file),
  1016. REG_NATIVE_FUNC(path_remove_directory),
  1017. REG_NATIVE_FUNC(poll_oneoff),
  1018. REG_NATIVE_FUNC(proc_exit),
  1019. REG_NATIVE_FUNC(proc_raise),
  1020. REG_NATIVE_FUNC(random_get),
  1021. REG_NATIVE_FUNC(sock_recv),
  1022. REG_NATIVE_FUNC(sock_send),
  1023. REG_NATIVE_FUNC(sock_shutdown),
  1024. REG_NATIVE_FUNC(sched_yield),
  1025. };
  1026. void*
  1027. wasi_native_func_lookup(const char *module_name, const char *func_name)
  1028. {
  1029. uint32 size = sizeof(native_func_defs) / sizeof(WASMNativeFuncDef);
  1030. WASMNativeFuncDef *func_def = native_func_defs;
  1031. WASMNativeFuncDef *func_def_end = func_def + size;
  1032. if (!module_name || !func_name)
  1033. return NULL;
  1034. while (func_def < func_def_end) {
  1035. if (!strcmp(func_def->module_name, module_name)
  1036. && !strcmp(func_def->func_name, func_name))
  1037. return (void*) (uintptr_t) func_def->func_ptr;
  1038. func_def++;
  1039. }
  1040. return NULL;
  1041. }
  1042. #else
  1043. void*
  1044. wasi_native_func_lookup(const char *module_name, const char *func_name)
  1045. {
  1046. return NULL;
  1047. }
  1048. #endif