Setting tag transforward-0.1-12
[transforward.git] / transforward.c
index 02d0477..5c517f5 100644 (file)
@@ -8,11 +8,12 @@
 #include <linux/reboot.h>
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
+#include <linux/sched.h>
 #include <asm/uaccess.h>
 #include <linux/sysrq.h>
 #include <linux/timer.h>
 #include <linux/time.h>
-#include <linux/lglock.h>
+/*#include <linux/lglock.h>*/
 #include <linux/init.h>
 #include <linux/idr.h>
 #include <linux/namei.h>
@@ -40,8 +41,9 @@ MODULE_DESCRIPTION("Transparent port forwarding for LXC.");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(VERSION_STR);
 
+struct proc_dir_entry *proc_entry;
+
 static int address_in_root(unsigned int haddr) {
-    //printk(KERN_CRIT "In address_in_root: %u",haddr);
     struct net_device *dev;
     struct net *net = &init_net;
 
@@ -56,6 +58,7 @@ static int address_in_root(unsigned int haddr) {
 static int inet_bind_entry(struct socket *sock, struct sockaddr *uaddr, int addr_len) {
     struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
     unsigned int snum = addr->sin_addr.s_addr;
+       //printk(KERN_CRIT "Checking address %d",snum);
     if (address_in_root(snum)) {
         put_net(sock_net(sock->sk));
         sock_net_set(sock->sk, get_net(&init_net)); 
@@ -65,6 +68,13 @@ static int inet_bind_entry(struct socket *sock, struct sockaddr *uaddr, int addr
     return 0;
 }
 
+static struct file *do_last_probe(struct nameidata *nd, struct path *path,
+                         const struct open_flags *op, const char *pathname) {
+    
+    
+    jprobe_return();
+
+}
 
 static struct jprobe net_probe = {
        .entry = (kprobe_opcode_t *) inet_bind_entry
@@ -77,9 +87,9 @@ static void __exit transforward_exit(void)
        printk("Transforward: Stopped transforward.\n");
 }
 
+int once_only=0;
 
-
-static int __init transforward_init(void)
+static int init_probes(void)
 {
     int ret = 0;
        printk("Transforward: starting transforward version %s.\n",
@@ -95,11 +105,38 @@ static int __init transforward_init(void)
                   printk("register_jprobe failed, returned %u\n", ret);
                   return -1;
           }
-          //printk("Planted jprobe at %p, handler addr %p\n",
-                 net_probe.kp.addr, net_probe.entry);
 
         return ret;
 }
 
+/*  as per http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm
+    the declaration of write in the file_operations struct reads:
+    ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
+*/
+ssize_t procfile_write(struct file *file, const char *buffer, size_t count, loff_t *data) {            
+       if (!once_only) {
+               once_only=1;
+               if (init_probes()==-1)
+                       printk(KERN_CRIT "Could not install procprotect probes. Reload module to retry.");
+               else 
+                       printk(KERN_CRIT "Activated transforward module");
+       }
+    return count;
+}
+static const struct file_operations transforward_fops = {
+    .owner = THIS_MODULE,
+    .write = procfile_write
+};
+
+static int __init transforward_init(void)
+{
+    int ret = 0;
+       printk("Transforward: starting transforward version %s.\n",
+              VERSION_STR);
+
+    proc_entry = proc_create("transforward", 0644, NULL, &transforward_fops);
+       return ret;
+}
+
 module_init(transforward_init);
 module_exit(transforward_exit);