示例#1
0
文件: actor.cpp 项目: doly/femtoutil
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);
	}
}
示例#2
0
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);
}
示例#3
0
		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);
		}