module: fixed receiving size
authorRăzvan Crainea <razvan.crainea@gmail.com>
Sat, 2 Jun 2012 14:18:52 +0000 (17:18 +0300)
committerRăzvan Crainea <razvan.crainea@gmail.com>
Sat, 2 Jun 2012 14:18:52 +0000 (17:18 +0300)
module/p2pkp_file.c
module/p2pkp_sock.c
module/p2pkp_sock.h
test/server/server.c
test/test.sh

index 2d206a4..213b8de 100644 (file)
@@ -1,5 +1,6 @@
 #include <asm/uaccess.h>
 #include <linux/fs.h>
+#include <linux/buffer_head.h>
 
 #include "p2pkp_file.h"
 #include "p2pkp_debug.h"
@@ -20,6 +21,7 @@ struct file* p2pkp_open_file_write(const char *filename, mode_t mode)
 
 void p2pkp_close_file(struct file *file)
 {
+       file_fsync(file, 0);
        filp_close(file,NULL);
 }
 
@@ -50,9 +52,7 @@ int p2pkp_write_in_file(struct file *file, char *buffer, int len)
                len -= ret;
                bytes_written += ret;
        } while (len > 0);
-
        set_fs(fs);
-
        return ret < 0 ? ret : bytes_written;
 }
 
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;
 }
index 152d029..1d95bfa 100644 (file)
@@ -16,6 +16,7 @@ struct p2pkp_sock {
        spinlock_t conn_lock;
        struct list_head conn_list;
        struct socket *net_sock;
+       struct file * file;
        unsigned int buffer_len;
        unsigned char buffer[P2PKP_DEFAULT_BUF_LEN];
        int bind_ifindex;       /* bound interface index; 0 for any interface */
index 317c9a1..cf7b245 100644 (file)
@@ -47,14 +47,12 @@ int main(int argc, char **argv)
        printf("Bound to: %s:%s\n", argv[0], argv[1]);
        argv += 2;
        
-       do {
-               err = read(sock, argv[0], sizeof(argv[0]));
-               if (err < 0) {
-                       printf("Error while receiving file %s: %s(%d)\n", argv[0],
-                                       strerror(errno), errno);
-                       return err;
-               }
-       } while (err > 0);
+       err = read(sock, argv[0], sizeof(argv[0]));
+       if (err < 0) {
+               printf("Error while receiving file %s: %s(%d)\n", argv[0],
+                               strerror(errno), errno);
+               return err;
+       }
 
        printf("Successfully read file %s\n", argv[0]);
 
index 90a5458..5808baf 100755 (executable)
@@ -6,10 +6,10 @@ CLIENT=client/client
 SERVER=server/server
 FILE=/root/Dropbox/school/p2pkp/test/client/test_file
 IP="127.0.0.1"
+WAIT_TIME=2
 
 LISTENERS_PORTS=(
        60000
-       60001
 )
 
 
@@ -36,10 +36,14 @@ sleep 1
 
 $CLIENT $FILE $ARGUMENTS
 
+sleep $WAIT_TIME
 # kill netcat
 for pid in $pids; do
-       wait $pid &> /dev/null
+       kill -9 $pid &> /dev/null
 done
+#for pid in $pids; do
+#      wait $pid &> /dev/null
+#done
 
 # remove module
 rmmod $MODULE_NAME