static CK_RV finish_iterating (P11KitIter *iter, CK_RV rv) { finish_object (iter); finish_slot (iter); finish_module (iter); p11_array_clear (iter->modules); iter->iterating = 0; return rv; }
static CK_RV move_next_session (P11KitIter *iter) { CK_ULONG session_flags; CK_ULONG num_slots; CK_INFO minfo; CK_RV rv; finish_slot (iter); /* If we have no more slots, then move to next module */ while (iter->saw_slots >= iter->num_slots) { finish_module (iter); /* Iter is finished */ if (iter->modules->num == 0) return finish_iterating (iter, CKR_CANCEL); iter->module = iter->modules->elem[0]; p11_array_remove (iter->modules, 0); /* Skip module if it doesn't match uri */ assert (iter->module != NULL); rv = (iter->module->C_GetInfo) (&minfo); if (rv != CKR_OK || !p11_match_uri_module_info (&iter->match_module, &minfo)) continue; rv = (iter->module->C_GetSlotList) (CK_TRUE, NULL, &num_slots); if (rv != CKR_OK) return finish_iterating (iter, rv); iter->slots = realloc (iter->slots, sizeof (CK_SLOT_ID) * (num_slots + 1)); return_val_if_fail (iter->slots != NULL, CKR_HOST_MEMORY); rv = (iter->module->C_GetSlotList) (CK_TRUE, iter->slots, &num_slots); if (rv != CKR_OK) return finish_iterating (iter, rv); iter->num_slots = num_slots; assert (iter->saw_slots == 0); } /* Move to the next slot, and open a session on it */ while (iter->saw_slots < iter->num_slots) { iter->slot = iter->slots[iter->saw_slots++]; assert (iter->module != NULL); if (iter->match_slot_id != (CK_SLOT_ID)-1 && iter->slot != iter->match_slot_id) continue; rv = (iter->module->C_GetSlotInfo) (iter->slot, &iter->slot_info); if (rv != CKR_OK || !p11_match_uri_slot_info (&iter->match_slot, &iter->slot_info)) continue; rv = (iter->module->C_GetTokenInfo) (iter->slot, &iter->token_info); if (rv != CKR_OK || !p11_match_uri_token_info (&iter->match_token, &iter->token_info)) continue; session_flags = CKF_SERIAL_SESSION; /* Skip if the read/write on a read-only token */ if (iter->want_writable && (iter->token_info.flags & CKF_WRITE_PROTECTED) == 0) session_flags |= CKF_RW_SESSION; rv = (iter->module->C_OpenSession) (iter->slot, session_flags, NULL, NULL, &iter->session); if (rv != CKR_OK) return finish_iterating (iter, rv); if (iter->session != 0) return CKR_OK; } /* Otherwise try again */ return move_next_session (iter); }
static void before_module_multi(WasmModule* module, void* user_data) { Context* ctx = user_data; finish_module(ctx); before_module(module, user_data); }
int wasm_gen_file(WasmSource* source, int multi_module, WasmParserTypeCheck type_check) { Context ctx = {}; WasmParserCallbacks callbacks = {}; callbacks.user_data = &ctx; callbacks.error = error; callbacks.before_module = before_module; callbacks.after_module = after_module; callbacks.before_function = before_function; callbacks.after_function = after_function; callbacks.before_block = before_block; callbacks.after_block = after_block; callbacks.before_binary = before_binary; callbacks.before_break = before_break; callbacks.after_break = after_break; callbacks.before_call = before_call; callbacks.before_call_import = before_call_import; callbacks.before_compare = before_compare; callbacks.after_const = after_const; callbacks.before_convert = before_convert; callbacks.after_get_local = after_get_local; callbacks.before_if = before_if; callbacks.after_if = after_if; callbacks.before_label = before_label; callbacks.after_label = after_label; callbacks.before_load = before_load; callbacks.after_load_global = after_load_global; callbacks.before_loop = before_loop; callbacks.after_loop = after_loop; callbacks.after_memory_size = after_memory_size; callbacks.after_nop = after_nop; callbacks.after_page_size = after_page_size; callbacks.before_resize_memory = before_resize_memory; callbacks.before_return = before_return; callbacks.before_set_local = before_set_local; callbacks.before_store = before_store; callbacks.before_store_global = before_store_global; callbacks.before_unary = before_unary; callbacks.assert_invalid_error = assert_invalid_error; int result; if (multi_module) { if (g_outfile) { callbacks.before_module = before_module_multi; callbacks.after_module = after_module_multi; callbacks.before_assert_return = before_assert_return; callbacks.after_assert_return = after_assert_return; callbacks.before_assert_return_nan = before_assert_return_nan; callbacks.after_assert_return_nan = after_assert_return_nan; callbacks.before_assert_trap = before_assert_trap; callbacks.after_assert_trap = after_assert_trap; callbacks.before_invoke = before_invoke; callbacks.after_invoke = after_invoke; init_output_buffer(&ctx.js_buf, INITIAL_OUTPUT_BUFFER_CAPACITY); } result = wasm_parse_file(source, &callbacks, type_check); if (g_outfile) { finish_module(&ctx); write_output_buffer(&ctx.js_buf, g_outfile); } } else { result = wasm_parse_module(source, &callbacks, type_check); if (result == 0 && g_outfile) write_output_buffer(&ctx.buf, g_outfile); } destroy_context(&ctx); return result; }