summaryrefslogtreecommitdiffhomepage
path: root/src/c/include/unit
diff options
context:
space:
mode:
authorAndrew Clayton <a.clayton@nginx.com>2023-09-21 17:14:17 +0100
committerAndrew Clayton <a.clayton@nginx.com>2023-09-25 17:39:43 +0100
commit43c8e44d33572b818cdd0a5945e494c5510ab24f (patch)
tree24369b22c30fb348ffb9765db423588ef5ca6d7f /src/c/include/unit
parent1dd1b34194573661b10015fbc60d6910dbea8fcc (diff)
downloadunit-wasm-43c8e44d33572b818cdd0a5945e494c5510ab24f.tar.gz
unit-wasm-43c8e44d33572b818cdd0a5945e494c5510ab24f.tar.bz2
libunit-wasm: Add a luw_mem_splice_file() function
This is inspired by the likes of splice(2) and sendfile(2) in that it takes data from one place and puts it in another. This function write(2)'s the request data straight from the shared memory to a given file (referenced by its file descriptor). This is an alternative to using luw_req_buf_copy() and avoids an extra copying of the request data. E.g /* In the request_handler */ if (total_bytes_wrote == 0) { luw_init_ctx(&ctx, addr, 0); luw_set_req_buf(&ctx, &request_buf, LUW_SRB_NONE); fd = open("/var/tmp/large-file.dat", O_CREAT|O_TRUNC|O_WRONLY, 0666); } total_bytes_wrote += luw_mem_splice_file(addr, fd); if (total_bytes_wrote == luw_get_http_content_len(&ctx)) { close(fd); total_bytes_wrote = 0; luw_http_response_end(); } NOTE: We include a typedef definition for ssize_t in unit-wasm.h, to avoid having a dependency on the wasi-sysroot when generating the rust bindings. ssize_t is defined in sys/types.h which is provided by libc and not the compiler. Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
Diffstat (limited to 'src/c/include/unit')
-rw-r--r--src/c/include/unit/unit-wasm.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/c/include/unit/unit-wasm.h b/src/c/include/unit/unit-wasm.h
index 48079b1..c7625de 100644
--- a/src/c/include/unit/unit-wasm.h
+++ b/src/c/include/unit/unit-wasm.h
@@ -84,6 +84,15 @@ typedef enum {
LUW_HTTP_GATEWAY_TIMEOUT = 504,
} luw_http_status_t;
+#if !defined(__DEFINED_ssize_t)
+/*
+ * Match the typedef from wasm32-wasi/include/bits/alltypes.h
+ * without requiring the wasi-sysroot for building the rust
+ * stuff.
+ */
+typedef long ssize_t;
+#endif
+
struct luw_hdr_field {
u32 name_off;
u32 name_len;
@@ -239,6 +248,7 @@ extern int luw_mem_writep(luw_ctx_t *ctx, const char *fmt, ...);
extern size_t luw_mem_writep_data(luw_ctx_t *ctx, const u8 *src, size_t size);
extern void luw_req_buf_append(luw_ctx_t *ctx, const u8 *src);
extern void luw_req_buf_copy(luw_ctx_t *ctx, const u8 *src);
+extern ssize_t luw_mem_splice_file(const u8 *src, int fd);
extern size_t luw_mem_fill_buf_from_req(luw_ctx_t *ctx, size_t from);
extern void luw_mem_reset(luw_ctx_t *ctx);
extern void luw_http_set_response_status(luw_http_status_t status);