#include <linux/kernel.h>
#include <linux/ktime.h>
#include <linux/init.h>
#include <linux/connector.h>
#include <linux/gfp.h>
#include <linux/ptrace.h>
#include <linux/atomic.h>
#include <linux/pid_namespace.h>
#include <linux/cn_proc.h>
#include <linux/local_lock.h>
#define CN_PROC_MSG_SIZE …
static inline struct cn_msg *buffer_to_cn_msg(__u8 *buffer)
{ … }
static atomic_t proc_event_num_listeners = …;
static struct cb_id cn_proc_event_id = …;
struct local_event { … };
static DEFINE_PER_CPU(struct local_event, local_event) = …;
static int cn_filter(struct sock *dsk, struct sk_buff *skb, void *data)
{ … }
static inline void send_msg(struct cn_msg *msg)
{ … }
void proc_fork_connector(struct task_struct *task)
{ … }
void proc_exec_connector(struct task_struct *task)
{ … }
void proc_id_connector(struct task_struct *task, int which_id)
{ … }
void proc_sid_connector(struct task_struct *task)
{ … }
void proc_ptrace_connector(struct task_struct *task, int ptrace_id)
{ … }
void proc_comm_connector(struct task_struct *task)
{ … }
void proc_coredump_connector(struct task_struct *task)
{ … }
void proc_exit_connector(struct task_struct *task)
{ … }
static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
{ … }
static void cn_proc_mcast_ctl(struct cn_msg *msg,
struct netlink_skb_parms *nsp)
{ … }
static int __init cn_proc_init(void)
{ … }
device_initcall(cn_proc_init);