Esempio n. 1
0
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);
        });
Esempio n. 2
0
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);
}
Esempio n. 3
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, {