From 71246fb0c8dead16cc33caf83020961c33f8efda Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C4=83zvan=20Crainea?= Date: Sat, 2 Jun 2012 17:18:52 +0300 Subject: [PATCH] module: fixed receiving size --- module/p2pkp_file.c | 4 ++-- module/p2pkp_sock.c | 37 +++++++++++++++++++++++-------------- module/p2pkp_sock.h | 1 + test/server/server.c | 14 ++++++-------- test/test.sh | 8 ++++++-- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/module/p2pkp_file.c b/module/p2pkp_file.c index 2d206a4..213b8de 100644 --- a/module/p2pkp_file.c +++ b/module/p2pkp_file.c @@ -1,5 +1,6 @@ #include #include +#include #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; } diff --git a/module/p2pkp_sock.c b/module/p2pkp_sock.c index 06862e3..19d29d5 100644 --- a/module/p2pkp_sock.c +++ b/module/p2pkp_sock.c @@ -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; } diff --git a/module/p2pkp_sock.h b/module/p2pkp_sock.h index 152d029..1d95bfa 100644 --- a/module/p2pkp_sock.h +++ b/module/p2pkp_sock.h @@ -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 */ diff --git a/test/server/server.c b/test/server/server.c index 317c9a1..cf7b245 100644 --- a/test/server/server.c +++ b/test/server/server.c @@ -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]); diff --git a/test/test.sh b/test/test.sh index 90a5458..5808baf 100755 --- a/test/test.sh +++ b/test/test.sh @@ -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 -- 2.20.1