X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;ds=sidebyside;f=module%2Fp2pkp_sock.c;fp=module%2Fp2pkp_sock.c;h=19d29d54884b872a7b33ded5d868a62866a4a298;hb=71246fb0c8dead16cc33caf83020961c33f8efda;hp=06862e3c3462289af4125f51b302840137b1d147;hpb=38b4c4d6d866c6077233633d3e7c0850a22fd261;p=p2p-kernel-protocol.git 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; }