diff -urN net-ref/include/linux/socket.h net/include/linux/socket.h --- net-ref/include/linux/socket.h Wed Mar 6 18:33:02 2002 +++ net/include/linux/socket.h Tue Mar 26 19:56:32 2002 @@ -260,6 +260,11 @@ extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen); extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr); extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); +struct socket; +struct file * sock_map_file(struct socket *sock); +extern int sock_map_fd(struct socket *sock); +extern struct socket *sockfd_lookup(int fd, int *err); + #endif #endif /* not kernel and not glibc */ #endif /* _LINUX_SOCKET_H */ diff -urN net-ref/include/net/tcp.h net/include/net/tcp.h --- net-ref/include/net/tcp.h Thu Mar 21 00:11:04 2002 +++ net/include/net/tcp.h Tue Mar 26 19:56:32 2002 @@ -810,6 +810,7 @@ extern void tcp_push_one(struct sock *, unsigned mss_now); extern void tcp_send_ack(struct sock *sk); extern void tcp_send_delayed_ack(struct sock *sk); +extern void cleanup_rbuf(struct sock *sk, int copied); /* tcp_timer.c */ extern void tcp_init_xmit_timers(struct sock *); diff -urN net-ref/net/ipv4/tcp.c net/net/ipv4/tcp.c --- net-ref/net/ipv4/tcp.c Tue Jan 22 18:56:30 2002 +++ net/net/ipv4/tcp.c Tue Mar 26 19:56:32 2002 @@ -1275,7 +1275,7 @@ * calculation of whether or not we must ACK for the sake of * a window update. */ -static void cleanup_rbuf(struct sock *sk, int copied) +void cleanup_rbuf(struct sock *sk, int copied) { struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); int time_to_ack = 0; diff -urN net-ref/net/netsyms.c net/net/netsyms.c --- net-ref/net/netsyms.c Mon Feb 25 22:05:09 2002 +++ net/net/netsyms.c Tue Mar 26 19:56:32 2002 @@ -108,6 +108,8 @@ EXPORT_SYMBOL(sock_create); EXPORT_SYMBOL(sock_alloc); EXPORT_SYMBOL(sock_release); +EXPORT_SYMBOL(sock_map_fd); +EXPORT_SYMBOL(sockfd_lookup); EXPORT_SYMBOL(sock_setsockopt); EXPORT_SYMBOL(sock_getsockopt); EXPORT_SYMBOL(sock_sendmsg); @@ -324,6 +326,7 @@ EXPORT_SYMBOL(memcpy_fromiovecend); EXPORT_SYMBOL(csum_partial_copy_fromiovecend); EXPORT_SYMBOL(tcp_v4_lookup_listener); +EXPORT_SYMBOL(cleanup_rbuf); /* UDP/TCP exported functions for TCPv6 */ EXPORT_SYMBOL(udp_ioctl); EXPORT_SYMBOL(udp_connect); @@ -341,6 +344,7 @@ EXPORT_SYMBOL(tcp_getsockopt); EXPORT_SYMBOL(tcp_recvmsg); EXPORT_SYMBOL(tcp_send_synack); +EXPORT_SYMBOL(tcp_send_skb); EXPORT_SYMBOL(tcp_check_req); EXPORT_SYMBOL(tcp_child_process); EXPORT_SYMBOL(tcp_parse_options); diff -urN net-ref/net/socket.c net/net/socket.c --- net-ref/net/socket.c Tue Mar 26 19:56:05 2002 +++ net/net/socket.c Tue Mar 26 19:58:57 2002 @@ -326,51 +326,62 @@ * but we take care of internal coherence yet. */ -static int sock_map_fd(struct socket *sock) +struct file * sock_map_file(struct socket *sock) { - int fd; + struct file *file; struct qstr this; char name[32]; + file = get_empty_filp(); + + if (!file) + return ERR_PTR(-ENFILE); + + sprintf(name, "[%lu]", sock->inode->i_ino); + this.name = name; + this.len = strlen(name); + this.hash = sock->inode->i_ino; + + file->f_dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this); + if (!file->f_dentry) { + put_filp(file); + return ERR_PTR(-ENOMEM); + } + file->f_dentry->d_op = &sockfs_dentry_operations; + d_add(file->f_dentry, sock->inode); + file->f_vfsmnt = mntget(sock_mnt); + + if (sock->file) + BUG(); + sock->file = file; + file->f_op = sock->inode->i_fop = &socket_file_ops; + file->f_mode = 3; + file->f_flags = O_RDWR; + file->f_pos = 0; + + return file; +} + +int sock_map_fd(struct socket *sock) +{ + int fd; + struct file *file; + /* * Find a file descriptor suitable for return to the user. */ fd = get_unused_fd(); - if (fd >= 0) { - struct file *file = get_empty_filp(); - - if (!file) { - put_unused_fd(fd); - fd = -ENFILE; - goto out; - } + if (fd < 0) + return fd; - sprintf(name, "[%lu]", sock->inode->i_ino); - this.name = name; - this.len = strlen(name); - this.hash = sock->inode->i_ino; - - file->f_dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this); - if (!file->f_dentry) { - put_filp(file); - put_unused_fd(fd); - fd = -ENOMEM; - goto out; - } - file->f_dentry->d_op = &sockfs_dentry_operations; - d_add(file->f_dentry, sock->inode); - file->f_vfsmnt = mntget(sock_mnt); - - sock->file = file; - file->f_op = sock->inode->i_fop = &socket_file_ops; - file->f_mode = 3; - file->f_flags = O_RDWR; - file->f_pos = 0; - fd_install(fd, file); + file = sock_map_file(sock); + if (IS_ERR(file)) { + put_unused_fd(fd); + return PTR_ERR(file); } + fd_install(fd, file); -out: return fd; } @@ -789,6 +800,8 @@ } out: + if (sock->sk != sk) + BUG(); release_sock(sock->sk); return 0; }