#ifndef SFRT_CURRENT_SANDBOX_H #define SFRT_CURRENT_SANDBOX_H #include "sandbox.h" #include "types.h" extern http_parser_settings runtime__http_parser_settings; /** * Getter for the current sandbox executing on this thread * @returns the current sandbox executing on this thread **/ static inline struct sandbox * current_sandbox__get(void) { return worker_thread__current_sandbox; } /** * Setter for the current sandbox executing on this thread * @param sandbox the sandbox we are setting this thread to run **/ static inline void current_sandbox__set(struct sandbox *sandbox) { // FIXME: critical-section. worker_thread__current_sandbox = sandbox; if (sandbox == NULL) return; // Thread Local State about the Current Sandbox sandbox_lmbase = sandbox->linear_memory_start; sandbox_lmbound = sandbox->linear_memory_size; module_indirect_table = sandbox->module->indirect_table; } /** * Getter for the arguments of the current sandbox * @return the arguments of the current sandbox */ static inline char * current_sandbox__get_arguments(void) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__get_arguments(sandbox); } /** * Initializes and returns an IO handle on the current sandbox ready for use * @return index of handle we preopened or -1 if all io_handles are exhausted **/ static inline int current_sandbox__initialize_io_handle(void) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__initialize_io_handle(sandbox); } /** * Initializes and returns an IO handle on the current sandbox ready for use * @param file_descriptor what we'll set on the IO handle after initialization * @return index of handle we preopened or -1 if all io_handles are exhausted **/ static inline int current_sandbox__initialize_io_handle_and_set_file_descriptor(int file_descriptor) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__initialize_io_handle_and_set_file_descriptor(sandbox, file_descriptor); } int sandbox__parse_http_request(struct sandbox *sandbox, size_t l); /** * Parse the current sandbox's request_response_data up to length * @param length * @returns 0 **/ static inline int current_sandbox__parse_http_request(size_t length) { return sandbox__parse_http_request(current_sandbox__get(), length); } /** * Sets the file descriptor of the sandbox's ith io_handle * Returns error condition if the file_descriptor to set does not contain sandbox preopen magin * @param io_handle_index index of the sandbox io_handle we want to set * @param file_descriptor the file descripter we want to set it to * @returns the index that was set or -1 in case of error **/ static inline int current_sandbox__set_file_descriptor(int io_handle_index, int file_descriptor) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__set_file_descriptor(sandbox, io_handle_index, file_descriptor); } /** * Get the file descriptor of the sandbox's ith io_handle * @param io_handle_index index into the sandbox's io_handles table * @returns file descriptor **/ static inline int current_sandbox__get_file_descriptor(int io_handle_index) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__get_file_descriptor(sandbox, io_handle_index); } /** * Close the sandbox's ith io_handle * @param io_handle_index index of the handle to close **/ static inline void current_sandbox__close_file_descriptor(int io_handle_index) { struct sandbox *sandbox = current_sandbox__get(); sandbox__close_file_descriptor(sandbox, io_handle_index); } /** * Get the Libuv handle located at idx of the sandbox ith io_handle * @param io_handle_index index of the handle containing libuv_handle??? * @returns any libuv handle **/ static inline union uv_any_handle * current_sandbox__get_libuv_handle(int io_handle_index) { struct sandbox *sandbox = current_sandbox__get(); return sandbox__get_libuv_handle(sandbox, io_handle_index); } /** * Gets the HTTP Request body from the current sandbox * @param body pointer that we'll assign to the http_request body * @returns the length of the http_request's body **/ static inline int current_sandbox__get_http_request_body(char **body) { return http_request__get_body(¤t_sandbox__get()->http_request, body); } /** * Set an HTTP Response Header on the current sandbox * @param header string of the header that we want to set * @param length the length of the header string * @returns 0 (abends program in case of error) **/ static inline int current_sandbox__set_http_response_header(char *header, int length) { return http_response__set_header(¤t_sandbox__get()->http_response, header, length); } /** * Set an HTTP Response Body on the current sandbox * @param body string of the body that we want to set * @param length the length of the body string * @returns 0 (abends program in case of error) **/ static inline int current_sandbox__set_http_response_body(char *body, int length) { return http_response__set_body(¤t_sandbox__get()->http_response, body, length); } /** * Set an HTTP Response Status on the current sandbox * @param status string of the status we want to set * @param length the length of the status * @returns 0 (abends program in case of error) **/ static inline int current_sandbox__set_http_response_status(char *status, int length) { return http_response__set_status(¤t_sandbox__get()->http_response, status, length); } /** * Encode the current sandbox's HTTP Response as an array of buffers * @returns the number of buffers used to store the HTTP Response **/ static inline int current_sandbox__vectorize_http_response(void) { return http_response__encode_as_vector(¤t_sandbox__get()->http_response); } #endif /* SFRT_CURRENT_SANDBOX_H */