Register process events connector

2006-12-14 Thread Matt Helsley
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

2006-12-14 Thread Matt Helsley
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 */