static int dnsmq_ctrl(struct file *file, const char *buffer, unsigned long length, void *data) { char s[32]; char *ptr; int i, j; // "[dnsmq ip] [dnsmq name] if ((length > 0) && (length < 32)) { memcpy(s, buffer, length); s[length] = 0; for(i=0;i<length;i++) { if (s[i] == ' ') break; } if (i<length) { s[i] = 0; ptr = s + i + 1; dnsmq_ip = simple_strtoul(s, NULL, 16); // ipv6_addr_set_v4mapped(dnsmq_ip, &dnsmq_ipv6); // convert to dnsname format j=0; for(;i<length;i++) { if (s[i] == '.') { s[i]=0; dnsmq_name[j]=strlen(ptr); memcpy(dnsmq_name+j+1, ptr, strlen(ptr)); j += strlen(ptr) + 1; ptr = s + i + 1; } } dnsmq_name[j]=strlen(ptr); memcpy(dnsmq_name+j+1, ptr, strlen(ptr)); dnsmq_name[j+1+strlen(ptr)]=0; } } else dnsmq_ip=0; printk("dnsmq ctrl: %x %s\n", dnsmq_ip, dnsmq_name); if (dnsmq_ip == 0) dnsmq_hit_hook_func (NULL); else dnsmq_hit_hook_func(dnsmq_func); return length; }
static int dnsmq_ctrl_ipv6(struct file *file, const char *buffer, unsigned long length, void *data) { char s[64]; char *ptr; int i, j; // "[dnsmq ipv6] [dnsmq name] if ((length > 0) && (length < 64)) { memcpy(s, buffer, length); s[length] = 0; for(i=0;i<length;i++) { if (s[i] == ' ') break; } if (i<length) { s[i] = 0; ptr = s + i + 1; in6_pton(s, length, (void *)&dnsmq_ipv6, '\n', NULL); // convert to dnsname format j=0; for(;i<length;i++) { if (s[i] == '.') { s[i]=0; dnsmq_name_ipv6[j]=strlen(ptr); memcpy(dnsmq_name_ipv6+j+1, ptr, strlen(ptr)); j += strlen(ptr) + 1; ptr = s + i + 1; } } dnsmq_name_ipv6[j]=strlen(ptr); memcpy(dnsmq_name_ipv6+j+1, ptr, strlen(ptr)); dnsmq_name_ipv6[j+1+strlen(ptr)]=0; } } else memset(&dnsmq_ipv6, 0, sizeof(struct in6_addr)); printk(KERN_DEBUG "dnsmq ctrl ipv6: %pI6 %s\n", &dnsmq_ipv6, dnsmq_name_ipv6); if (ipv6_addr_equal(&dnsmq_ipv6, &in6addr_any)) dnsmq_hit_hook_func (NULL); else dnsmq_hit_hook_func(dnsmq_func); return length; }
static int __init init(void) { #ifdef CONFIG_PROC_FS struct proc_dir_entry *p; p = create_proc_entry("dnsmqctrl", 0200, init_net.proc_net); if (p) { //p->owner = THIS_MODULE; p->write_proc = dnsmq_ctrl; } #endif // it will be enabled later dnsmq_hit_hook_func (NULL); return 0; }
static void __exit fini(void) { dnsmq_hit_hook_func (NULL); }