static void knh_Actor_mainLoop(CTX ctx, knh_sfp_t *sfp, knh_Actor_t *a) { const char *name = DP(a)->actor_name; const char *path = DP(a)->path; int port = DP(a)->port; fprintf(stderr, "======== <<< Actor Information >>> ========\n"); fprintf(stderr, "name : %s\n", name); fprintf(stderr, "path : %s\n", path); fprintf(stderr, "port : %d\n", port); fprintf(stderr, "===========================================\n"); //int prev_pid = 0; int status; knh_io_t fd = knh_ServerSocket_open(ctx, sfp, port, 3); while (true) { knh_io_t sd = knh_ServerSocket_accept(ctx, sfp, fd); int pid = fork(); //fprintf(stderr, "==================\n"); //fprintf(stderr, "pid = [%d]\n", pid); if (pid == 0) { //child //fprintf(stderr, "child\n"); knh_InputStream_t *ins = knh_Socket_getInputStream(ctx, sd); knh_class_t cid = knh_getcid(ctx, new_bytes("ConnectionObject")); const knh_ClassTBL_t *ct = ClassTBL(cid); knh_Object_t *o = (knh_Object_t *)knh_InputStream_readObject(ctx, ins, ct); //fprintf(stderr, "mtd_name = %s\n", c->mtd_name); //knh_Object_t *msg = c->msg; knh_Actor_readMessage(ctx, a, o); knh_InputStream_close(ctx, ins); exit(0); } else if (pid < 0) { fprintf(stderr, "fork error\n"); } else { //fprintf(stderr, "PARENT: pid = [%d]\n", pid); waitpid(pid, &status, 0); //prev_pid = pid; } close(sd); } }
static void load_codegenerator(CTX ctx) { KONOHA_BEGIN(ctx); CompilerAPI_disable(ctx); if (codegenerator_file[compile_mode]) { kbytes_t t = new_bytes((char*)codegenerator_file[compile_mode]); knh_loadPackage(ctx, t); CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); kString *s = (kString *) knh_DictMap_getNULL(ctx, ctx->share->props, STEXT("konoha.package.path")); CWB_clear(cwb, 0); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, S_tobytes(s)); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("konoha.compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, STEXT(K_OSDLLEXT)); void *p = knh_dlopen(ctx, CWB_totext(ctx, cwb)); typedef void (*knh_Fpkgcomplete)(CTX); knh_Fpkgcomplete pkgcomplete = (knh_Fpkgcomplete) knh_dlsym(ctx, p, "reset_compiler_api", NULL, 1); if (pkgcomplete) pkgcomplete(ctx); CWB_close(ctx, cwb); } CompilerAPI_enable(ctx); KONOHA_END(ctx); }
hook(address_t inject_addr, address_t handle_addr, hook::type h_type = hook::type::jmp, size_t length = 5) { bytearray_t new_bytes(length, 0x90); switch (h_type) { case type::jmp: { new_bytes[0] = 0xE9; _original_addr = inject_addr; break; } case type::call: { new_bytes[0] = 0xE8; _original_addr = pointer(inject_addr).field<address_t>(1) + (inject_addr + 5); break; } } *reinterpret_cast<address_t *>(new_bytes.data() + 1) = handle_addr - (inject_addr + 5); _patch = std::make_shared<patch>(inject_addr, new_bytes); }