--- linux/fs/read_write.c 2006-04-10 08:00:12.426532280 +0000 +++ l2/fs/read_write.c 2006-04-10 07:56:29.406436488 +0000 @@ -269,12 +269,37 @@ EXPORT_SYMBOL(vfs_write); +void net_accounting(int direction, int size) +{ + printk("USER PACKET LOG - uid: %d prog: %s size: %d direction: %s\n", + current->uid, + current->comm, + size, + direction == 0 ? "recv" : "send" + ); +} + +#include +#include +void __net_accounting_fs(unsigned int fd, int direction, const char * buf) +{ + struct socket *sock; + int err; + + sock = sockfd_lookup(fd, &err); + if (sock && sock->sk && sock->sk->sk_family == AF_INET) { + net_accounting(direction, (int)strlen(buf)); + } +} + asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count) { struct file *file; ssize_t ret = -EBADF; int fput_needed; + __net_accounting_fs(fd, 0, buf); + file = fget_light(fd, &fput_needed); if (file) { ret = vfs_read(file, buf, count, &file->f_pos); @@ -291,6 +316,8 @@ ssize_t ret = -EBADF; int fput_needed; + __net_accounting_fs(fd, 1, buf); + file = fget_light(fd, &fput_needed); if (file) { ret = vfs_write(file, buf, count, &file->f_pos); --- linux/net/socket.c 2006-04-10 07:59:20.086489176 +0000 +++ l2/net/socket.c 2006-04-10 07:56:52.400940792 +0000 @@ -1838,12 +1838,26 @@ * This function doesn't need to set the kernel lock because * it is set by the callees. */ +void net_accounting(int, int); + +#include +void __net_accounting_socket(unsigned int fd, int direction, signed short size) +{ + struct socket *sock; + int err; + + sock = sockfd_lookup(fd, &err); + if (size != -1 && sock && sock->sk && sock->sk->sk_family == AF_INET) { + net_accounting(direction, (int)size); + } +} asmlinkage long sys_socketcall(int call, unsigned long __user *args) { unsigned long a[6]; unsigned long a0,a1; int err; + struct msghdr *net_acct; if(call<1||call>SYS_RECVMSG) return -EINVAL; @@ -1883,17 +1897,21 @@ break; case SYS_SEND: err = sys_send(a0, (void __user *)a1, a[2], a[3]); + __net_accounting_socket(a0, 1, (signed short)strlen((char*)a1)); break; case SYS_SENDTO: err = sys_sendto(a0,(void __user *)a1, a[2], a[3], (struct sockaddr __user *)a[4], a[5]); + __net_accounting_socket(a0, 1, (signed short)strlen((char*)a1)); break; case SYS_RECV: err = sys_recv(a0, (void __user *)a1, a[2], a[3]); + __net_accounting_socket(a0, 0, (signed short)strlen((char*)a1)); break; case SYS_RECVFROM: err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3], (struct sockaddr __user *)a[4], (int __user *)a[5]); + __net_accounting_socket(a0, 0, (signed short)strlen((char*)a1)); break; case SYS_SHUTDOWN: err = sys_shutdown(a0,a1); @@ -1906,9 +1924,13 @@ break; case SYS_SENDMSG: err = sys_sendmsg(a0, (struct msghdr __user *) a1, a[2]); + net_acct = (struct msghdr *) a1; + __net_accounting_socket(a0, 1, (signed short)net_acct->msg_iov->iov_len); break; case SYS_RECVMSG: err = sys_recvmsg(a0, (struct msghdr __user *) a1, a[2]); + net_acct = (struct msghdr *) a1; + __net_accounting_socket(a0, 0, (signed short)net_acct->msg_iov->iov_len); break; default: err = -EINVAL;