#define __KERNEL__ #include #undef __KERNEL__ #include #include #include #include #include "language.h" #include "lex.h" #include "runtime.h" #include "constable.h" #include "events.h" void event_add(struct ev_prg_s **event, udata * prog) { struct ev_prg_s *new; if ((new = malloc(sizeof(struct ev_prg_s))) == NULL) fatal(OUTMEM); new->prog = prog; new->next = *event; *event = new; } void event_execute(struct ev_prg_s *event, struct med_s *med) { int default_answer; med->answer = MED_NONE; default_answer = MED_ERR; while (event != NULL) { med->apply_mode = 0; runtime_cmd = 0; exec_program(event->prog, med); if (runtime_cmd) { default_answer = MED_OK; if (med->apply_mode != 0) apply(med->apply_mode, med, event->prog); } event = event->next; } if (med->answer == MED_NONE) med->answer = default_answer; } EVENT(init) /* process actions */ EVENT(exec) /* vo fs.c - because it relates to file (MED_IACT) */ EVENT(fsact) /* vo fs.c - because it relates to file (MED_IACT) */ EVENT(sexec) EVENT(fork) EVENT(exit) EVENT(setuid) EVENT(kill) /*EVENT(socket) */ /*EVENT(perm) */ /*EVENT(change) */ EVENT(capable) EVENT(ptrace) /* EVENT(module) */ /* syscalls */ EVENT(syscall) static int proc_act(struct medusa_packet *msg, char *data, struct medusa_packet *ans, char **outdata) { struct med_s med; void (*evfunc) (struct med_s *); evfunc = NULL; switch (msg->cmd) { case MED_PACT: switch (msg->u.r_pact.act) { case MPACT_SEXEC: evfunc = evdo_sexec; break; case MPACT_FORK: evfunc = evdo_fork; break; case MPACT_EXIT: evfunc = evdo_exit; break; case MPACT_SETUID: evfunc = evdo_setuid; break; case MPACT_KILL: evfunc = evdo_kill; break; case MPACT_CAP: evfunc = evdo_capable; break; case MPACT_PTRACE: evfunc = evdo_ptrace; break; } med.inode = NULL; med.proc = msg->u.r_pact.proc; med.target = &(msg->u.r_pact.target); med.info1 = msg->u.r_pact.info1; med.info2 = msg->u.r_pact.info2; med.action = (__u32) (msg->u.r_pact.act); break; #ifdef CONFIG_MEDUSA_SYSCALL case MED_TRACE: evfunc = evdo_syscall; med.inode = NULL; med.proc = msg->u.r_trace.proc; med.target = NULL; memcpy(med.trace_arg, msg->u.r_trace.arg, 5 * sizeof(__u32)); med.action = (__u32) (msg->u.r_trace.syscall); break; #endif } if (evfunc) { med.data = data; med.redirect = NULL; evfunc(&med); switch (msg->cmd) { case MED_PACT: ans->u.a_pact.proc = med.proc; break; case MED_TRACE: memcpy(ans->u.a_trace.arg, med.trace_arg, 5 * sizeof(__u32)); ans->u.a_trace.proc = med.proc; break; } ans->answer = med.answer; *outdata = med.redirect; return 1; /* OK */ } return 0; } int proc_init(void) { add_module(proc_act); return 0; }