static ssize_t morph_handler(machine_t *machine, request_t *request){ // {{{ ssize_t ret; hash_t *pipelines; morph_userdata *userdata = (morph_userdata *)machine->userdata; if(userdata->running == 0){ config_t child_config[] = { { 0, DATA_HASHT( hash_inline(request), hash_inline(userdata->machine_config), hash_end )}, hash_end }; if( (ret = pipelines_new(&pipelines, child_config)) < 0) return ret; userdata->running = 1; userdata->machine = pipelines[0].data.ptr; data_set_void(&pipelines[0].data); hash_free(pipelines); if(userdata->pass_first == 0) return 0; } return machine_pass(userdata->machine, request); } // }}}
static ssize_t try_handler(machine_t *machine, request_t *request){ // {{{ ssize_t ret; data_t freeme; request_t *try_request; try_userdata *userdata = (try_userdata *)machine->userdata; try_threaddata *threaddata = thread_data_get(&userdata->thread_data); threaddata->machine = machine; threaddata->request = request; threaddata->ret = 0; data_set_void(&freeme); if(userdata->request == 0){ try_request = request; }else{ if( (ret = get_hash(hash_data_find(request, userdata->request), &freeme, &try_request)) < 0) return ret; } request_t r_next[] = { { userdata->return_to, DATA_MACHINET(userdata->try_end) }, hash_inline(try_request), hash_end }; fastcall_query r_query = { { 3, ACTION_QUERY }, r_next }; if( (ret = data_query(&userdata->machine, &r_query)) < 0){ if(userdata->request == 0){ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_pass); }else{ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(try_request), hash_end }; request_t r_next[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, { userdata->request_out, DATA_PTR_HASHT(r_pass) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_next); } } data_free(&freeme); return threaddata->ret; } // }}}
static ssize_t implode_request(machine_t *machine, request_t *request){ // {{{ implode_userdata *userdata = (implode_userdata *)machine->userdata; request_t r_next[] = { { userdata->buffer, DATA_PTR_HASHT(request) }, hash_inline(request), hash_end }; return machine_pass(machine, r_next); } // }}}
static ssize_t try_end_handler(machine_t *machine, request_t *request){ // {{{ try_userdata *userdata = (try_userdata *)machine->userdata; try_threaddata *threaddata = thread_data_get(&userdata->thread_data); if(userdata->request == 0){ threaddata->ret = machine_pass(threaddata->machine, request); }else{ request_t r_next[] = { { userdata->request_out, DATA_PTR_HASHT(request) }, hash_inline(threaddata->request), hash_end }; threaddata->ret = machine_pass(threaddata->machine, r_next); } return 0; } // }}}