module: fixed receiving size
[p2p-kernel-protocol.git] / module / p2pkp_sock.c
index 06862e3..19d29d5 100644 (file)
@@ -130,6 +130,10 @@ static int p2pkp_release(struct socket *sock)
        sock->sk = NULL;
 
        p2pkp_destroy_udp_sock(ps->net_sock);
+       if (ps->file) {
+               p2pkp_close_file(ps->file);
+               ps->file = 0;
+       }
        
        sock_put(sk);
        DEBUG("Released the socket");
@@ -223,8 +227,8 @@ static int p2pkp_sendmsg(struct kiocb *iocb, struct socket *sock,
        lock_sock(sk);
        if (!(sock->state & SS_CONNECTED)) {
                ERROR("unconnected socket");
-               err = -ECONNREFUSED;
-               goto release;
+               release_sock(sk);
+               return -ECONNREFUSED;
        }
        release_sock(sk);
 
@@ -238,6 +242,7 @@ static int p2pkp_sendmsg(struct kiocb *iocb, struct socket *sock,
                        err = -ENOENT;
                        continue;
                }
+               ps->file = file;
                DEBUG("opened file %s", file_name);
                for (;;) {
                        bytes_read = p2pkp_read_from_file(file, ps->buffer, ps->buffer_len);
@@ -270,11 +275,10 @@ out_conn:
 out_close:
 
                p2pkp_close_file(file);
+               ps->file = 0;
        }
 
        DEBUG("Sending completed successfully");
-release:
-       release_sock(sk);
        return err ? err : files_no;
 }
 
@@ -283,7 +287,7 @@ static int p2pkp_recvmsg(struct kiocb *iocb, struct socket *sock,
                struct msghdr *m, size_t total_len, int flags)
 {
        int err = -ENXIO;
-       int bytes_read, bytes_written;
+       int bytes_read, bytes_written = 0;
        struct sock *sk = sock->sk;
        struct p2pkp_sock *ps = sock2p2pkp(sk);
        struct sockaddr_in *sin = (struct sockaddr_in *)m->msg_name;
@@ -302,20 +306,25 @@ static int p2pkp_recvmsg(struct kiocb *iocb, struct socket *sock,
                ERROR("cannot open file %s\n", file_name);
                return -ENOENT;
        }
+       ps->file = file;
 
        lock_sock(sk);
        /* TODO keep connections */
-       bytes_read = p2pkp_msgrecv(ps->net_sock, sin, ps->buffer, ps->buffer_len);
-       DEBUG("XXX: received %d bytes\n", bytes_read);
-       if (bytes_read > 0) {
-               bytes_written = p2pkp_write_in_file(file, ps->buffer, bytes_read);
-               err = 0;
-       } else if (bytes_read < 0) {
-               ERROR("cannot read data");
-               err = -ENXIO;
-       }
+       do {
+               bytes_read = p2pkp_msgrecv(ps->net_sock, sin, ps->buffer, ps->buffer_len);
+               if (bytes_read > 0) {
+                       bytes_written += p2pkp_write_in_file(file, ps->buffer, bytes_read);
+                       err = 0;
+               } else if (bytes_read != -ERESTARTSYS) {
+                       ERROR("cannot read data: %d", bytes_read);
+                       err = -ENXIO;
+               }
+               DEBUG("wrote %d", bytes_written);
+       } while (bytes_read < ps->buffer_len);
+
        release_sock(sk);
        p2pkp_close_file(file);
+       ps->file = 0;
 
        return err ? err : bytes_written;
 }