static int run_slash_script(request_rec* r, void* stack_top) { sl_vm_t* vm; slash_context_t ctx; sl_vm_frame_t exit_frame, exception_frame; char* last_slash; SLVAL error; sl_static_init(); vm = sl_init("apache2"); sl_gc_set_stack_top(vm->arena, stack_top); vm->cwd = sl_alloc_buffer(vm->arena, strlen(r->canonical_filename) + 10); strcpy(vm->cwd, r->canonical_filename); last_slash = strrchr(vm->cwd, '/'); if(last_slash) { *last_slash = 0; } SL_TRY(exit_frame, SL_UNWIND_ALL, { SL_TRY(exception_frame, SL_UNWIND_EXCEPTION, { ctx.headers_sent = 0; ctx.vm = vm; ctx.r = r; vm->data = &ctx; setup_request_object(vm, r); setup_response_object(vm); ap_set_content_type(r, "text/html; charset=utf-8"); sl_do_file(vm, r->canonical_filename); }, error, { sl_response_clear(vm); sl_render_error_page(vm, error); });
static SLVAL sl_do_file_hashbang(sl_vm_t* vm, char* filename, int skip_hashbang) { FILE* fh; uint8_t* src; long file_size; size_t real_start = 0; if(!skip_hashbang) { return sl_do_file(vm, filename); } filename = sl_realpath(vm, filename); fh = fopen(filename, "rb"); if(!fh) { sl_error(vm, vm->lib.Error, "Could not load %Qs - %s", filename, strerror(errno)); } fseek(fh, 0, SEEK_END); file_size = ftell(fh); fseek(fh, 0, SEEK_SET); if(file_size < 0) { sl_error(vm, vm->lib.Error, "Could not load %Qs - %s (count not get filesize)", filename, strerror(errno)); } src = sl_alloc(vm->arena, file_size); if(file_size && !fread(src, file_size, 1, fh)) { fclose(fh); sl_error(vm, vm->lib.Error, "Could not load %Qs - %s", filename, strerror(errno)); } fclose(fh); if(skip_hashbang) { real_start = get_hashbang_length(src, file_size); } return sl_do_string(vm, src + real_start, file_size - real_start, filename, 0); }
static void handle_request(slash_context_t* ctx, void* dummy) { sl_catch_frame_t frame; SLVAL err; char* script_filename = ""; sl_vm_t* vm = sl_init(); pthread_t me = ctx->thread; ctx->vm = vm; ctx->vm->data = ctx; ctx->sent_headers = 0; sl_gc_set_stack_top(ctx->vm->arena, dummy); setup_request_object(ctx->vm, &ctx->request, &script_filename); setup_response_object(ctx->vm); SL_TRY(frame, SL_UNWIND_ALL, { sl_do_file(ctx->vm, (uint8_t*)script_filename); }, err, {