static int linux_read(int fd) { struct str_message msg; struct intercept_pid *icpid; const char *sysname; u_int16_t seqnr; pid_t pid; int code; if (read(fd, &msg, sizeof(msg)) != sizeof(msg)) return (-1); icpid = linux_getpid(msg.msg_pid); if (icpid == NULL) return (-1); seqnr = msg.msg_seqnr; pid = msg.msg_pid; switch (msg.msg_type) { case SYSTR_MSG_ASK: code = msg.msg_data.msg_ask.code; sysname = linux_syscall_name(pid, code); intercept_syscall(fd, pid, seqnr, msg.msg_policy, sysname, code, "linux", (void *)msg.msg_data.msg_ask.args, msg.msg_data.msg_ask.argsize); break; case SYSTR_MSG_RES: code = msg.msg_data.msg_ask.code; sysname = linux_syscall_name(pid, code); intercept_syscall_result(fd, pid, seqnr, msg.msg_policy, sysname, code, "linux", (void *)msg.msg_data.msg_ask.args, msg.msg_data.msg_ask.argsize, msg.msg_data.msg_ask.result, msg.msg_data.msg_ask.rval); break; case SYSTR_MSG_UGID: { struct str_msg_ugid *msg_ugid = &msg.msg_data.msg_ugid; intercept_ugid(icpid, msg_ugid->uid, msg_ugid->uid); if (linux_answer(fd, pid, seqnr, 0, 0, 0, NULL) == -1) err(1, "%s:%d: answer", __func__, __LINE__); break; } case SYSTR_MSG_CHILD: intercept_child_info(msg.msg_pid, msg.msg_data.msg_child.new_pid); break; #ifdef SYSTR_MSG_POLICYFREE case SYSTR_MSG_POLICYFREE: intercept_policy_free(msg.msg_policy); break; #endif } return (0); }
static int obsd_read(int fd) { struct str_message msg; struct intercept_pid *icpid; struct obsd_data *data; struct emulation *current; char name[SYSTR_EMULEN+1]; const char *sysname; u_int16_t seqnr; pid_t pid; int code; if (read(fd, &msg, sizeof(msg)) != sizeof(msg)) return (-1); icpid = obsd_getpid(msg.msg_pid); if (icpid == NULL) return (-1); data = icpid->data; current = data->current; seqnr = msg.msg_seqnr; pid = msg.msg_pid; switch (msg.msg_type) { case SYSTR_MSG_ASK: code = msg.msg_data.msg_ask.code; sysname = obsd_syscall_name(pid, code); intercept_syscall(fd, pid, seqnr, msg.msg_policy, sysname, code, current->name, (void *)msg.msg_data.msg_ask.args, msg.msg_data.msg_ask.argsize); break; case SYSTR_MSG_RES: code = msg.msg_data.msg_ask.code; sysname = obsd_syscall_name(pid, code); /* Switch emulation around at the right time */ if (data->commit != NULL) { current = obsd_switch_emulation(data); } intercept_syscall_result(fd, pid, seqnr, msg.msg_policy, sysname, code, current->name, (void *)msg.msg_data.msg_ask.args, msg.msg_data.msg_ask.argsize, msg.msg_data.msg_ask.result, msg.msg_data.msg_ask.rval); break; case SYSTR_MSG_EMUL: memcpy(name, msg.msg_data.msg_emul.emul, SYSTR_EMULEN); name[SYSTR_EMULEN] = '\0'; if (obsd_set_emulation(pid, name) == -1) errx(1, "%s:%d: set_emulation(%s)", __func__, __LINE__, name); if (icpid->execve_code == -1) { icpid->execve_code = 0; /* A running attach fake a exec cb */ current = obsd_switch_emulation(data); intercept_syscall_result(fd, pid, seqnr, msg.msg_policy, "execve", 0, current->name, NULL, 0, 0, NULL); break; } if (obsd_answer(fd, pid, seqnr, 0, 0, 0, NULL) == -1) err(1, "%s:%d: answer", __func__, __LINE__); break; case SYSTR_MSG_UGID: { struct str_msg_ugid *msg_ugid; msg_ugid = &msg.msg_data.msg_ugid; intercept_ugid(icpid, msg_ugid->uid, msg_ugid->uid); if (obsd_answer(fd, pid, seqnr, 0, 0, 0, NULL) == -1) err(1, "%s:%d: answer", __func__, __LINE__); break; } case SYSTR_MSG_CHILD: intercept_child_info(msg.msg_pid, msg.msg_data.msg_child.new_pid); break; #ifdef SYSTR_MSG_EXECVE case SYSTR_MSG_EXECVE: { struct str_msg_execve *msg_execve = &msg.msg_data.msg_execve; intercept_newimage(fd, pid, msg.msg_policy, current->name, msg_execve->path, NULL); if (obsd_answer(fd, pid, seqnr, 0, 0, 0, NULL) == -1) err(1, "%s:%d: answer", __func__, __LINE__); break; } #endif #ifdef SYSTR_MSG_POLICYFREE case SYSTR_MSG_POLICYFREE: intercept_policy_free(msg.msg_policy); break; #endif } return (0); }