void outer_function(struct global_ctx *global, const char **args) { /* Set up */ tevent_req *req; /* Fork a child process */ req = fork_child_send(global, args); tevent_req_callback(req, get_child_return_code, global); } struct fork_child_state { const char **args; pid_t pid; struct tevent_timer *te; int return_code; } struct tevent_req *fork_child_send(TALLOC_CTX *mem_ctx, const char **args) { /* Set up the request */ tevent_req *req = tevent_req_create(mem_ctx, &state, struct fork_child_state); state->args = args; /* Fork the child */ pid = fork(args); if (pid == 0) { /* child */ exec(args); } else { /* parent */ state->pid = pid; state->te = set_timeout(10, fork_child_timeout, req); set_sigchld(pid, fork_child_sigchld, req); } return req; } void fork_child_timeout(struct tevent_req *req) { struct fork_child_state *state = tevent_req_data(req, struct fork_child_state); /* Child timed out */ kill_process(state->pid); tevent_req_error(req, ETIMEDOUT); } void fork_child_sigchld(struct tevent_req *req) { struct fork_child_state *state = tevent_req_data(req, struct fork_child_state); /* Child completed successfully */ state->return_code = read_error_code(state->pid); talloc_free(state->te); tevent_req_done(req); } errno_t fork_child_recv(struct tevent_req *req, int *return_code) { struct fork_child_state *state = tevent_req_data(req, struct fork_child_state); RETURN_ON_ERROR(req); *return_code = state->return_code; return 0; } void get_child_return_code(struct tevent_req *req, void *pvt) { errno_t err; int return_code; err = fork_child_recv(req, &return_code); talloc_zfree(req); /* Handle the results */ }