Register process events connector
Make the Process events connector use task watchers instead of hooking the paths it's interested in. Signed-off-by: Matt Helsley <[EMAIL PROTECTED]> --- drivers/connector/cn_proc.c | 51 +++- fs/exec.c |1 include/linux/cn_proc.h | 21 -- kernel/exit.c |2 - kernel/fork.c |2 - kernel/sys.c|8 -- 6 files changed, 36 insertions(+), 49 deletions(-) Index: linux-2.6.19/drivers/connector/cn_proc.c === --- linux-2.6.19.orig/drivers/connector/cn_proc.c +++ linux-2.6.19/drivers/connector/cn_proc.c @@ -44,19 +44,20 @@ static inline void get_seq(__u32 *ts, in *ts = get_cpu_var(proc_event_counts)++; *cpu = smp_processor_id(); put_cpu_var(proc_event_counts); } -void proc_fork_connector(struct task_struct *task) +static int proc_fork_connector(unsigned long clone_flags, + struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(_event_num_listeners) < 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg->data; get_seq(>seq, >cpu); ktime_get_ts(); /* get high res monotonic timestamp */ @@ -70,21 +71,24 @@ void proc_fork_connector(struct task_str memcpy(>id, _proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); /* If cn_netlink_send() failed, the data is not sent */ cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; } +DEFINE_TASK_CLONECALL(proc_fork_connector); -void proc_exec_connector(struct task_struct *task) +static int proc_exec_connector(unsigned long ignore, + struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; struct timespec ts; __u8 buffer[CN_PROC_MSG_SIZE]; if (atomic_read(_event_num_listeners) < 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg->data; get_seq(>seq, >cpu); ktime_get_ts(); /* get high res monotonic timestamp */ @@ -95,21 +99,23 @@ void proc_exec_connector(struct task_str memcpy(>id, _proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; } +DEFINE_TASK_EXECCALL(proc_exec_connector); -void proc_id_connector(struct task_struct *task, int which_id) +static int process_change_id(unsigned long which_id, struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(_event_num_listeners) < 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg->data; ev->what = which_id; ev->event_data.id.process_pid = task->pid; @@ -119,47 +125,64 @@ void proc_id_connector(struct task_struc ev->event_data.id.e.euid = task->euid; } else if (which_id == PROC_EVENT_GID) { ev->event_data.id.r.rgid = task->gid; ev->event_data.id.e.egid = task->egid; } else - return; + return 0; get_seq(>seq, >cpu); ktime_get_ts(); /* get high res monotonic timestamp */ ev->timestamp_ns = timespec_to_ns(); memcpy(>id, _proc_event_id, sizeof(msg->id)); msg->ack = 0; /* not used */ msg->len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; +} + +static int proc_change_uid_connector(unsigned long ignore, +struct task_struct *task) +{ + return process_change_id(PROC_EVENT_UID, task); +} +DEFINE_TASK_UIDCALL(proc_change_uid_connector); + +static int proc_change_gid_connector(unsigned long ignore, +struct task_struct *task) +{ + return process_change_id(PROC_EVENT_GID, task); } +DEFINE_TASK_GIDCALL(proc_change_gid_connector); -void proc_exit_connector(struct task_struct *task) +static int proc_exit_connector(unsigned long code, struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(_event_num_listeners) < 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg->data; get_seq(>seq, >cpu); ktime_get_ts(); /* get high res monotonic timestamp */ ev->timestamp_ns =
Register process events connector
Make the Process events connector use task watchers instead of hooking the paths it's interested in. Signed-off-by: Matt Helsley [EMAIL PROTECTED] --- drivers/connector/cn_proc.c | 51 +++- fs/exec.c |1 include/linux/cn_proc.h | 21 -- kernel/exit.c |2 - kernel/fork.c |2 - kernel/sys.c|8 -- 6 files changed, 36 insertions(+), 49 deletions(-) Index: linux-2.6.19/drivers/connector/cn_proc.c === --- linux-2.6.19.orig/drivers/connector/cn_proc.c +++ linux-2.6.19/drivers/connector/cn_proc.c @@ -44,19 +44,20 @@ static inline void get_seq(__u32 *ts, in *ts = get_cpu_var(proc_event_counts)++; *cpu = smp_processor_id(); put_cpu_var(proc_event_counts); } -void proc_fork_connector(struct task_struct *task) +static int proc_fork_connector(unsigned long clone_flags, + struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(proc_event_num_listeners) 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg-data; get_seq(msg-seq, ev-cpu); ktime_get_ts(ts); /* get high res monotonic timestamp */ @@ -70,21 +71,24 @@ void proc_fork_connector(struct task_str memcpy(msg-id, cn_proc_event_id, sizeof(msg-id)); msg-ack = 0; /* not used */ msg-len = sizeof(*ev); /* If cn_netlink_send() failed, the data is not sent */ cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; } +DEFINE_TASK_CLONECALL(proc_fork_connector); -void proc_exec_connector(struct task_struct *task) +static int proc_exec_connector(unsigned long ignore, + struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; struct timespec ts; __u8 buffer[CN_PROC_MSG_SIZE]; if (atomic_read(proc_event_num_listeners) 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg-data; get_seq(msg-seq, ev-cpu); ktime_get_ts(ts); /* get high res monotonic timestamp */ @@ -95,21 +99,23 @@ void proc_exec_connector(struct task_str memcpy(msg-id, cn_proc_event_id, sizeof(msg-id)); msg-ack = 0; /* not used */ msg-len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; } +DEFINE_TASK_EXECCALL(proc_exec_connector); -void proc_id_connector(struct task_struct *task, int which_id) +static int process_change_id(unsigned long which_id, struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(proc_event_num_listeners) 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg-data; ev-what = which_id; ev-event_data.id.process_pid = task-pid; @@ -119,47 +125,64 @@ void proc_id_connector(struct task_struc ev-event_data.id.e.euid = task-euid; } else if (which_id == PROC_EVENT_GID) { ev-event_data.id.r.rgid = task-gid; ev-event_data.id.e.egid = task-egid; } else - return; + return 0; get_seq(msg-seq, ev-cpu); ktime_get_ts(ts); /* get high res monotonic timestamp */ ev-timestamp_ns = timespec_to_ns(ts); memcpy(msg-id, cn_proc_event_id, sizeof(msg-id)); msg-ack = 0; /* not used */ msg-len = sizeof(*ev); cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); + return 0; +} + +static int proc_change_uid_connector(unsigned long ignore, +struct task_struct *task) +{ + return process_change_id(PROC_EVENT_UID, task); +} +DEFINE_TASK_UIDCALL(proc_change_uid_connector); + +static int proc_change_gid_connector(unsigned long ignore, +struct task_struct *task) +{ + return process_change_id(PROC_EVENT_GID, task); } +DEFINE_TASK_GIDCALL(proc_change_gid_connector); -void proc_exit_connector(struct task_struct *task) +static int proc_exit_connector(unsigned long code, struct task_struct *task) { struct cn_msg *msg; struct proc_event *ev; __u8 buffer[CN_PROC_MSG_SIZE]; struct timespec ts; if (atomic_read(proc_event_num_listeners) 1) - return; + return 0; msg = (struct cn_msg*)buffer; ev = (struct proc_event*)msg-data; get_seq(msg-seq, ev-cpu); ktime_get_ts(ts); /* get high res monotonic timestamp */