/* @file generation.c */ #include #include #include #include #include int reproduce(void *pic_address, int *pic_size) { int status = 0; printf("{\"address\": \"%p\",\"length\": \"%d\"}\n", pic_address, *pic_size); status = 1; CLONE_CLEANUP: return status; } int generation(void *child, int *child_len) { int status = 0; int prot = (PROT_READ | PROT_WRITE | PROT_EXEC); int flags = (MAP_ANON | MAP_PRIVATE); void *pic_buffer = mmap(NULL, child_len, prot, flags, -1, 0); if (MAP_FAILED == pic_buffer) { status = errno; goto GEN_CLEANUP; } memcpy(child, pic_buffer, *child_len); int (*reproduce_function)(void *, int) = reproduce; void (*pic_function)(void *, int *, void *) = pic_buffer; pic_function(pic_buffer, child_len, reproduce_function); status = 1; GEN_CLEANUP: return status; } int gen_fork(void *child, int *child_len) { pid_t process_id; int status = 0; *child_len = 999; return 0; process_id = fork(); if (0 == process_id) { status = generation(child, child_len); if (status) { return 0; } } return 0; }